diff --git a/.gitignore b/.gitignore index d9ba8ac2b411f21befe040b38e08732c5ead9d28..28885a4830d9b9c6d35ca9885b283d52799b8e6d 100644 --- a/.gitignore +++ b/.gitignore @@ -20,3 +20,4 @@ nohup.out rls*.log *.orig *.rej +**/wip/*.stderr diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 4e896842c6a32253a92783fdf5191a612e2167df..25ccb0912a040037509d742883416659528cbb5d 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -10,15 +10,14 @@ stages: - test - build - publish - - deploy - -image: parity/rust-builder:latest + - kubernetes + - flaming-fir variables: GIT_STRATEGY: fetch CARGO_HOME: "/ci-cache/${CI_PROJECT_NAME}/cargo/${CI_JOB_NAME}" SCCACHE_DIR: "/ci-cache/${CI_PROJECT_NAME}/sccache" - SCCACHE_CACHE_SIZE: 50G + CARGO_INCREMENTAL: 0 CI_SERVER_NAME: "GitLab CI" DOCKER_OS: "debian:stretch" ARCH: "x86_64" @@ -38,6 +37,22 @@ variables: environment: name: parity-build +.docker-env: &docker-env + image: parity/rust-builder:latest + before_script: + - rustup show + - cargo --version + - sccache -s + only: + - tags + - master + - /^v[0-9]+\.[0-9]+.*$/ # i.e. v1.0, v2.1rc1 + - schedules + - web + - /^[0-9]+$/ # PRs + tags: + - linux-docker + #### stage: test @@ -52,58 +67,111 @@ check-runtime: GITHUB_API_PROJECT: "parity%2Finfrastructure%2Fgithub-api" script: - ./scripts/gitlab/check_runtime.sh + allow_failure: true + + +check-line-width: + stage: test + image: parity/tools:latest + <<: *kubernetes-build + only: + - /^[0-9]+$/ + script: + - ./scripts/gitlab/check_line_width.sh + allow_failure: true + + +cargo-audit: + stage: test + <<: *docker-env + except: + - /^[0-9]+$/ + script: + - cargo audit + allow_failure: true + -test-linux-stable: &test +cargo-check-benches: stage: test + <<: *docker-env + script: + - ./scripts/build.sh --locked + - time cargo check --benches + - sccache -s + + +cargo-check-subkey: + stage: test + <<: *docker-env + except: + - /^v[0-9]+\.[0-9]+.*$/ # i.e. v1.0, v2.1rc1 + script: + - cd ./subkey + - time cargo check --release # makes sense to save artifacts for building it + - sccache -s + + +test-linux-stable: &test-linux + stage: test + <<: *docker-env variables: - RUST_TOOLCHAIN: stable # Enable debug assertions since we are running optimized builds for testing # but still want to have debug assertions. RUSTFLAGS: -Cdebug-assertions=y - TARGET: native - tags: - - linux-docker - only: - - tags - - master - - schedules - - web - - /^[0-9]+$/ except: variables: - $DEPLOY_TAG - before_script: - - sccache -s - - ./scripts/build.sh script: + - ./scripts/build.sh --locked - time cargo test --all --release --verbose --locked - sccache -s +test-linux-stable-int: + <<: *test-linux + except: + refs: + - /^v[0-9]+\.[0-9]+.*$/ # i.e. v1.0, v2.1rc1 + variables: + - $DEPLOY_TAG + script: + - ./scripts/build.sh --locked + - time RUST_LOG=sync=trace,consensus=trace,client=trace,state-db=trace,db=trace,forks=trace,state_db=trace,storage_cache=trace + cargo test -p node-cli --release --verbose --locked -- --ignored --test-threads=1 + - sccache -s + allow_failure: true + + check-web-wasm: stage: test - image: tomaka/cargo-web:latest - allow_failure: true - only: - - master - - /^[0-9]+$/ + <<: *docker-env + allow_failure: true + except: + - /^v[0-9]+\.[0-9]+.*$/ # i.e. v1.0, v2.1rc1 script: # WASM support is in progress. As more and more crates support WASM, we # should add entries here. See https://github.com/paritytech/substrate/issues/2416 - time cargo web build -p sr-io - time cargo web build -p sr-primitives - time cargo web build -p sr-std + - time cargo web build -p substrate-client + - time cargo web build -p substrate-consensus-aura + - time cargo web build -p substrate-consensus-babe - time cargo web build -p substrate-consensus-common + - time cargo web build -p substrate-keyring + - time cargo web build -p substrate-keystore - time cargo web build -p substrate-executor - - time cargo web build -p substrate-network-libp2p + - time cargo web build -p substrate-network - time cargo web build -p substrate-panic-handler - time cargo web build -p substrate-peerset - time cargo web build -p substrate-primitives - time cargo web build -p substrate-serializer - time cargo web build -p substrate-state-db - time cargo web build -p substrate-state-machine + - time cargo web build -p substrate-telemetry - time cargo web build -p substrate-trie + - sccache -s -.build-only: &build-only +.build-only: &build-only only: - master - tags @@ -111,19 +179,16 @@ check-web-wasm: #### stage: build -build-linux-release: &build +build-linux-release: stage: build <<: *collect-artifacts + <<: *docker-env <<: *build-only except: variables: - $DEPLOY_TAG - tags: - - linux-docker - before_script: - - sccache -s - - ./scripts/build.sh script: + - ./scripts/build.sh --locked - time cargo build --release --verbose - mkdir -p ./artifacts - mv ./target/release/substrate ./artifacts/. @@ -141,8 +206,9 @@ build-linux-release: &build - cp -r scripts/docker/* ./artifacts - sccache -s -build-rust-doc-release: &build +build-rust-doc-release: stage: build + <<: *docker-env allow_failure: true artifacts: name: "${CI_JOB_NAME}_${CI_COMMIT_REF_NAME}-doc" @@ -151,14 +217,10 @@ build-rust-doc-release: &build paths: - ./crate-docs <<: *build-only - tags: - - linux-docker - before_script: - - sccache -s - - ./scripts/build.sh script: + - ./scripts/build.sh --locked - rm -f ./crate-docs/index.html # use it as an indicator if the job succeeds - - time cargo +nightly doc --release --verbose + - time cargo +nightly doc --release --all --verbose - cp -R ./target/doc ./crate-docs - echo "" > ./crate-docs/index.html - sccache -s @@ -195,7 +257,11 @@ publish-docker-release: - echo "Substrate version = ${VERSION}" - test -z "${VERSION}" && exit 1 - cd ./artifacts - - docker build --tag $CONTAINER_IMAGE:$VERSION --tag $CONTAINER_IMAGE:latest . + - docker build + --build-arg VCS_REF="${CI_COMMIT_SHA}" + --build-arg BUILD_DATE="$(date -u '+%Y-%m-%dT%H:%M:%SZ')" + --tag $CONTAINER_IMAGE:$VERSION + --tag $CONTAINER_IMAGE:latest . - docker push $CONTAINER_IMAGE:$VERSION - docker push $CONTAINER_IMAGE:latest after_script: @@ -247,8 +313,50 @@ publish-s3-doc: - aws s3 ls s3://${BUCKET}/${PREFIX}/ --human-readable --summarize + +publish-gh-doc: + stage: publish + image: parity/tools:latest + allow_failure: true + dependencies: + - build-rust-doc-release + cache: {} + <<: *build-only + <<: *kubernetes-build + variables: + GIT_STRATEGY: none + GITHUB_API: "https://api.github.com" + script: + - test -r ./crate-docs/index.html || ( + echo "./crate-docs/index.html not present, build:rust:doc:release job not complete"; + exit 1 + ) + - test "${GITHUB_USER}" -a "${GITHUB_EMAIL}" -a "${GITHUB_TOKEN}" || ( + echo "environment variables for github insufficient"; + exit 1 + ) + - | + cat > ${HOME}/.gitconfig <&1 | sed -r "s|(${GITHUB_USER}):[a-f0-9]+@|\1:REDACTED@|g" + after_script: + - rm -vrf ${HOME}/.gitconfig + + + .deploy-template: &deploy - stage: deploy + stage: kubernetes when: manual retry: 1 image: parity/kubetools:latest @@ -298,40 +406,46 @@ publish-s3-doc: deploy-ew3: <<: *deploy-cibuild environment: - name: parity-prod-ew3 + name: parity-prod-ew3 deploy-ue1: <<: *deploy-cibuild environment: - name: parity-prod-ue1 + name: parity-prod-ue1 deploy-ew3-tag: <<: *deploy-tag environment: - name: parity-prod-ew3 + name: parity-prod-ew3 deploy-ue1-tag: <<: *deploy-tag environment: - name: parity-prod-ue1 + name: parity-prod-ue1 -.validator-deploy: &validator-deploy - stage: publish +.validator-deploy: &validator-deploy + stage: flaming-fir dependencies: - build-linux-release - image: parity/azure-ansible:v1 - allow_failure: true - when: manual + image: parity/azure-ansible:v1 + allow_failure: true + when: manual tags: - linux-docker -validator1: - <<: *validator-deploy +validator 1 4: + <<: *validator-deploy script: - - ansible-playbook -i scripts/ansible/inventory.ini -u gitlab scripts/ansible/alexander.yml -l validator1 - -validator2: - <<: *validator-deploy + - ./scripts/flamingfir-deploy.sh flamingfir-validator1 +validator 2 4: + <<: *validator-deploy script: - - ansible-playbook -i scripts/ansible/inventory.ini -u gitlab scripts/ansible/alexander.yml -l validator2 - + - ./scripts/flamingfir-deploy.sh flamingfir-validator2 +validator 3 4: + <<: *validator-deploy + script: + - ./scripts/flamingfir-deploy.sh flamingfir-validator3 +validator 4 4: + <<: *validator-deploy + script: + - ./scripts/flamingfir-deploy.sh flamingfir-validator4 diff --git a/Cargo.lock b/Cargo.lock index 4ea2444a57531ef0357d7c95e9760486a8726453..74f38e04c89590cd547cd600cae163a97a056017 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,22 +1,9 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. [[package]] -name = "MacTypes-sys" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "aes" -version = "0.3.2" +name = "adler32" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "aes-soft 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "aesni 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "block-cipher-trait 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", -] [[package]] name = "aes-ctr" @@ -35,7 +22,7 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "block-cipher-trait 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "opaque-debug 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -62,12 +49,12 @@ name = "aio-limited" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -116,7 +103,7 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.32 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.35 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -129,27 +116,26 @@ name = "atty" version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "termion 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "autocfg" -version = "0.1.2" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "backtrace" -version = "0.3.15" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "backtrace-sys 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-demangle 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-demangle 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -157,15 +143,10 @@ name = "backtrace-sys" version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "base-x" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "base58" version = "0.1.0" @@ -176,7 +157,7 @@ name = "base64" version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "safemem 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -185,7 +166,7 @@ name = "base64" version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -193,7 +174,7 @@ name = "bigint" version = "4.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -202,9 +183,9 @@ name = "bindgen" version = "0.47.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "cexpr 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "clang-sys 0.26.4 (registry+https://github.com/rust-lang/crates.io-index)", "clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)", "env_logger 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -212,15 +193,15 @@ dependencies = [ "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "peeking_take_while 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.28 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "which 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "bitflags" -version = "1.0.4" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -257,15 +238,6 @@ dependencies = [ "generic-array 0.8.3 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "block-buffer" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", - "byte-tools 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "block-buffer" version = "0.7.3" @@ -273,7 +245,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "block-padding 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "generic-array 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -285,15 +257,6 @@ dependencies = [ "generic-array 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "block-modes" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "block-cipher-trait 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "block-padding 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "block-padding" version = "0.1.4" @@ -309,15 +272,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "bstr" -version = "0.1.2" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "build_const" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "bumpalo" -version = "2.4.1" +version = "2.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -337,7 +305,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "byteorder" -version = "1.3.1" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -345,7 +313,8 @@ name = "bytes" version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "either 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -361,7 +330,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "cc" -version = "1.0.26" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "rayon 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -377,7 +346,7 @@ dependencies = [ [[package]] name = "cfg-if" -version = "0.1.7" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -395,8 +364,8 @@ name = "chrono" version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "num-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -406,8 +375,8 @@ version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", - "libloading 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", + "libloading 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -417,7 +386,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "strsim 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "textwrap 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -430,7 +399,7 @@ name = "clear_on_drop" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -438,15 +407,15 @@ name = "cloudabi" version = "0.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "cmake" -version = "0.1.35" +version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -456,19 +425,32 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "core-foundation" -version = "0.5.1" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "core-foundation-sys 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", + "core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "core-foundation-sys" -version = "0.5.1" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "crc" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "build_const 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "crc32fast" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -483,18 +465,18 @@ dependencies = [ "csv 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", "itertools 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "rand_xoshiro 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "rayon 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "rayon-core 1.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", - "tinytemplate 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "walkdir 2.2.7 (registry+https://github.com/rust-lang/crates.io-index)", + "tinytemplate 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "walkdir 2.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -502,7 +484,7 @@ name = "criterion-plot" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "cast 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "itertools 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -512,13 +494,13 @@ name = "crossbeam" version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-channel 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-deque 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-epoch 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.10.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -528,7 +510,7 @@ version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -564,7 +546,7 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-utils 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -578,7 +560,7 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -598,7 +580,7 @@ name = "crossbeam-utils" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -606,7 +588,7 @@ name = "crossbeam-utils" version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -617,7 +599,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "crunchy" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -629,15 +611,6 @@ dependencies = [ "generic-array 0.8.3 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "crypto-mac" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "constant_time_eq 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "generic-array 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "crypto-mac" version = "0.7.0" @@ -653,9 +626,9 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "csv-core 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", - "ryu 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", + "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", + "ryu 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -672,7 +645,7 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.32 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.35 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -686,10 +659,10 @@ dependencies = [ [[package]] name = "ctrlc" -version = "3.1.2" +version = "3.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "nix 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)", + "nix 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -704,14 +677,14 @@ dependencies = [ [[package]] name = "curve25519-dalek" -version = "1.1.3" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "digest 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "subtle 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "subtle 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -721,13 +694,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "derive_more" -version = "0.14.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.28 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.32 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.35 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -743,14 +716,6 @@ dependencies = [ "generic-array 0.8.3 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "digest" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "generic-array 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "digest" version = "0.8.0" @@ -759,17 +724,12 @@ dependencies = [ "generic-array 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "discard" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "dns-parser" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -779,7 +739,7 @@ version = "1.0.0-pre.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "curve25519-dalek 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "curve25519-dalek 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -806,8 +766,8 @@ dependencies = [ "atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "humantime 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "termcolor 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "termcolor 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -820,15 +780,16 @@ name = "erased-serde" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "error-chain" -version = "0.12.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "backtrace 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", + "backtrace 0.3.30 (registry+https://github.com/rust-lang/crates.io-index)", + "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -836,7 +797,7 @@ name = "exit-future" version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -845,7 +806,7 @@ name = "failure" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "backtrace 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", + "backtrace 0.3.30 (registry+https://github.com/rust-lang/crates.io-index)", "failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -854,10 +815,10 @@ name = "failure_derive" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.28 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.32 (registry+https://github.com/rust-lang/crates.io-index)", - "synstructure 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.35 (registry+https://github.com/rust-lang/crates.io-index)", + "synstructure 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -870,7 +831,7 @@ name = "fdlimit" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -878,10 +839,10 @@ name = "finality-grandpa" version = "0.8.0" source = "git+https://github.com/paritytech/finality-grandpa/#715c3cbeb73d11fa0f4e6b65098cb3e2854f49ed" dependencies = [ - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "hashmap_core 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec-derive 3.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", @@ -892,14 +853,27 @@ name = "fixed-hash" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "static_assertions 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "flate2" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", + "miniz-sys 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "miniz_oxide_c_api 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "fnv" version = "1.0.6" @@ -931,8 +905,8 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", - "libloading 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", + "libloading 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -946,7 +920,7 @@ name = "fuchsia-zircon" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -957,7 +931,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "futures" -version = "0.1.26" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -965,8 +939,8 @@ name = "futures-cpupool" version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.10.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -983,14 +957,6 @@ dependencies = [ "typenum 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "generic-array" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "typenum 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "generic-array" version = "0.12.0" @@ -1006,7 +972,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "c_linked_list 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "get_if_addrs-sys 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1016,7 +982,7 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "gcc 0.3.55 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1024,32 +990,37 @@ name = "glob" version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "glob" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "globset" version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "aho-corasick 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "bstr 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "bstr 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.1.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "h2" -version = "0.1.18" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.12 (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.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "http 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", "indexmap 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "string 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "string 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1063,7 +1034,7 @@ name = "hash256-std-hasher" version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "crunchy 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "crunchy 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1071,7 +1042,7 @@ name = "hashbrown" version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1093,7 +1064,7 @@ name = "heck" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "unicode-segmentation 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-segmentation 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1116,7 +1087,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "hex-literal-impl 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro-hack 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-hack 0.5.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1132,7 +1103,7 @@ name = "hex-literal-impl" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro-hack 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-hack 0.5.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1145,15 +1116,6 @@ dependencies = [ "generic-array 0.8.3 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "hmac" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "crypto-mac 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "digest 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "hmac" version = "0.7.0" @@ -1180,7 +1142,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "http-body" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "http 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-buf 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1198,7 +1171,7 @@ dependencies = [ [[package]] name = "hyper" -version = "0.10.15" +version = "0.10.16" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "base64 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1206,7 +1179,7 @@ dependencies = [ "language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", "mime 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.10.1 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", "traitobject 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "typeable 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1216,28 +1189,30 @@ dependencies = [ [[package]] name = "hyper" -version = "0.12.27" +version = "0.12.29" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", - "h2 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", + "h2 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)", "http 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", + "http-body 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "httparse 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-buf 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-threadpool 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "want 0.0.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1265,7 +1240,15 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "impl-serde" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1288,10 +1271,15 @@ name = "iovec" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "ipnet" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "itertools" version = "0.8.0" @@ -1302,91 +1290,116 @@ dependencies = [ [[package]] name = "itoa" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "js-sys" -version = "0.3.19" +version = "0.3.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "jsonrpc-client-transports" +version = "12.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "hyper 0.12.29 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-core 12.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", + "websocket 0.22.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "jsonrpc-core" -version = "10.1.0" +version = "12.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "jsonrpc-core-client" +version = "12.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "jsonrpc-client-transports 12.0.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "jsonrpc-derive" -version = "10.1.0" +version = "12.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.28 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.32 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.35 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "jsonrpc-http-server" -version = "10.1.0" +version = "12.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "hyper 0.12.27 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-core 10.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-server-utils 10.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hyper 0.12.29 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-core 12.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-server-utils 12.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", - "unicase 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "unicase 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "jsonrpc-pubsub" -version = "10.1.0" +version = "12.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "jsonrpc-core 10.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-core 12.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "jsonrpc-server-utils" -version = "10.1.0" +version = "12.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "globset 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-core 10.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-core 12.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.10.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "unicase 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "unicase 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "jsonrpc-ws-server" -version = "10.1.0" +version = "12.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-core 10.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-server-utils 10.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-core 12.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-server-utils 12.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-ws 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "ws 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1401,7 +1414,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "hash256-std-hasher 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tiny-keccak 1.4.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1441,9 +1454,9 @@ dependencies = [ "interleaved-ordered 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.10.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "rocksdb 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1464,56 +1477,58 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "libc" -version = "0.2.51" +version = "0.2.58" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "libloading" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p" -version = "0.7.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core-derive 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-dns 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-floodsub 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-identify 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-kad 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-mdns 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-mplex 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-noise 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-ping 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-plaintext 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-ratelimit 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-secio 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-tcp 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-uds 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-websocket 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-yamux 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multihash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", - "stdweb 0.4.16 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core-derive 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-deflate 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-dns 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-floodsub 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-identify 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-kad 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-mdns 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-mplex 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-noise 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-ping 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-plaintext 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-ratelimit 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-secio 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-tcp 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-uds 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-wasm-ext 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-websocket 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-yamux 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multihash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-core" -version = "0.7.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "asn1_der 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1522,66 +1537,76 @@ dependencies = [ "ed25519-dalek 1.0.0-pre.1 (registry+https://github.com/rust-lang/crates.io-index)", "failure 0.1.5 (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.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libsecp256k1 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "multistream-select 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multihash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 2.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multihash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", - "rw-stream-sink 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "secp256k1 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rw-stream-sink 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "zeroize 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-core-derive" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.32 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.35 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "libp2p-deflate" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "flate2 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-dns" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-dns-unofficial 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-floodsub" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bs58 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "cuckoofilter 0.3.2 (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.26 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 2.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1589,28 +1614,28 @@ dependencies = [ [[package]] name = "libp2p-identify" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (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.26 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 2.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-kad" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1619,54 +1644,55 @@ dependencies = [ "bs58 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.12 (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.26 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multihash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 2.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multihash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", + "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-mdns" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "data-encoding 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "dns-parser 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-udp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-mplex" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (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.26 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1674,59 +1700,62 @@ dependencies = [ [[package]] name = "libp2p-noise" -version = "0.5.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "curve25519-dalek 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "curve25519-dalek 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", "snow 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "x25519-dalek 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", - "zeroize 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", + "zeroize 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-ping" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-plaintext" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-ratelimit" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "aio-limited 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1734,44 +1763,44 @@ dependencies = [ [[package]] name = "libp2p-secio" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "aes-ctr 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "asn1_der 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "ctr 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "hmac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "js-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 2.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-send-wrapper 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", - "rw-stream-sink 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "secp256k1 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", - "send_wrapper 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rw-stream-sink 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "twofish 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-futures 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", - "web-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-futures 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", + "web-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-tcp" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "get_if_addrs 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ipnet 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "tk-listen 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1779,53 +1808,68 @@ dependencies = [ [[package]] name = "libp2p-uds" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-uds 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "libp2p-wasm-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-send-wrapper 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-futures 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "libp2p-websocket" -version = "0.7.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rw-stream-sink 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "stdweb 0.4.16 (registry+https://github.com/rust-lang/crates.io-index)", + "rw-stream-sink 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "soketto 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", - "websocket 0.22.3 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-rustls 0.10.0-alpha.3 (registry+https://github.com/rust-lang/crates.io-index)", + "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "webpki-roots 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-yamux" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "yamux 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "yamux 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "librocksdb-sys" -version = "5.17.2" +version = "5.18.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bindgen 0.47.3 (registry+https://github.com/rust-lang/crates.io-index)", - "cc 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", "glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1863,6 +1907,14 @@ dependencies = [ "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "lock_api" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "log" version = "0.3.9" @@ -1876,7 +1928,7 @@ name = "log" version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1897,7 +1949,7 @@ name = "memchr" version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1922,10 +1974,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "merlin" -version = "1.0.3" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "keccak 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1939,17 +1991,44 @@ dependencies = [ "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "miniz-sys" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "miniz_oxide" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "adler32 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "miniz_oxide_c_api" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", + "crc 1.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", + "miniz_oxide 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "mio" -version = "0.6.16" +version = "0.6.19" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1964,7 +2043,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1974,8 +2053,8 @@ version = "0.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1995,9 +2074,9 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2013,19 +2092,19 @@ dependencies = [ [[package]] name = "native-tls" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl 0.10.20 (registry+https://github.com/rust-lang/crates.io-index)", + "openssl 0.10.23 (registry+https://github.com/rust-lang/crates.io-index)", "openssl-probe 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl-sys 0.9.43 (registry+https://github.com/rust-lang/crates.io-index)", + "openssl-sys 0.9.47 (registry+https://github.com/rust-lang/crates.io-index)", "schannel 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", - "security-framework 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "security-framework-sys 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "tempfile 3.0.7 (registry+https://github.com/rust-lang/crates.io-index)", + "security-framework 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "security-framework-sys 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tempfile 3.0.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2033,20 +2112,20 @@ name = "net2" version = "0.2.33" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "nix" -version = "0.13.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "cc 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2055,22 +2134,29 @@ name = "node-cli" version = "2.0.0" dependencies = [ "exit-future 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "node-executor 2.0.0", "node-primitives 2.0.0", "node-runtime 2.0.0", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", - "structopt 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)", + "srml-finality-tracker 2.0.0", + "srml-indices 2.0.0", + "srml-timestamp 2.0.0", + "structopt 0.2.16 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-basic-authorship 2.0.0", "substrate-cli 2.0.0", "substrate-client 2.0.0", "substrate-consensus-aura 2.0.0", + "substrate-consensus-aura-primitives 2.0.0", + "substrate-consensus-common 2.0.0", "substrate-finality-grandpa 2.0.0", "substrate-inherents 2.0.0", + "substrate-keyring 2.0.0", "substrate-keystore 2.0.0", "substrate-network 2.0.0", "substrate-primitives 2.0.0", @@ -2078,7 +2164,8 @@ dependencies = [ "substrate-service-test 2.0.0", "substrate-telemetry 2.0.0", "substrate-transaction-pool 2.0.0", - "tokio 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", + "transaction-factory 0.0.1", ] [[package]] @@ -2091,8 +2178,7 @@ dependencies = [ "sr-io 2.0.0", "sr-primitives 2.0.0", "srml-balances 2.0.0", - "srml-consensus 2.0.0", - "srml-contract 2.0.0", + "srml-contracts 2.0.0", "srml-grandpa 2.0.0", "srml-indices 2.0.0", "srml-session 2.0.0", @@ -2105,6 +2191,7 @@ dependencies = [ "substrate-keyring 2.0.0", "substrate-primitives 2.0.0", "substrate-state-machine 2.0.0", + "substrate-test-client 2.0.0", "substrate-trie 2.0.0", "trie-root 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "wabt 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2116,7 +2203,7 @@ version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "pretty_assertions 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", "substrate-primitives 2.0.0", @@ -2124,22 +2211,34 @@ dependencies = [ ] [[package]] -name = "node-runtime" +name = "node-rpc-client" version = "2.0.0" dependencies = [ - "integer-sqrt 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "env_logger 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "hyper 0.12.29 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-core-client 12.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "node-primitives 2.0.0", - "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", + "substrate-rpc 2.0.0", +] + +[[package]] +name = "node-runtime" +version = "2.0.0" +dependencies = [ + "integer-sqrt 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "node-primitives 2.0.0", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", "sr-version 2.0.0", "srml-aura 2.0.0", "srml-balances 2.0.0", - "srml-consensus 2.0.0", - "srml-contract 2.0.0", + "srml-contracts 2.0.0", "srml-council 2.0.0", "srml-democracy 2.0.0", "srml-executive 2.0.0", @@ -2155,7 +2254,6 @@ dependencies = [ "srml-treasury 2.0.0", "substrate-client 2.0.0", "substrate-consensus-aura-primitives 2.0.0", - "substrate-consensus-authorities 2.0.0", "substrate-keyring 2.0.0", "substrate-offchain-primitives 2.0.0", "substrate-primitives 2.0.0", @@ -2165,14 +2263,14 @@ dependencies = [ name = "node-template" version = "2.0.0" dependencies = [ - "ctrlc 3.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ctrlc 3.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", "exit-future 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "node-template-runtime 2.0.0", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "substrate-basic-authorship 2.0.0", "substrate-cli 2.0.0", @@ -2184,7 +2282,7 @@ dependencies = [ "substrate-primitives 2.0.0", "substrate-service 2.0.0", "substrate-transaction-pool 2.0.0", - "tokio 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", "trie-root 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "vergen 3.0.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2195,14 +2293,13 @@ version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", "sr-version 2.0.0", "srml-aura 2.0.0", "srml-balances 2.0.0", - "srml-consensus 2.0.0", "srml-executive 2.0.0", "srml-indices 2.0.0", "srml-sudo 2.0.0", @@ -2211,7 +2308,6 @@ dependencies = [ "srml-timestamp 2.0.0", "substrate-client 2.0.0", "substrate-consensus-aura-primitives 2.0.0", - "substrate-consensus-authorities 2.0.0", "substrate-offchain-primitives 2.0.0", "substrate-primitives 2.0.0", ] @@ -2237,23 +2333,27 @@ dependencies = [ [[package]] name = "num-integer" -version = "0.1.39" +version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "num-traits" -version = "0.2.6" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] name = "num_cpus" -version = "1.10.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2285,15 +2385,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "openssl" -version = "0.10.20" +version = "0.10.23" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl-sys 0.9.43 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", + "openssl-sys 0.9.47 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2303,13 +2403,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "openssl-sys" -version = "0.9.43" +version = "0.9.47" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "vcpkg 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2349,7 +2449,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec-derive 3.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2357,80 +2457,53 @@ name = "parity-codec-derive" version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro-crate 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.28 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.32 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "parity-crypto" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "aes 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "aes-ctr 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "block-modes 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "digest 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", - "ripemd160 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "scrypt 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.35 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "parity-multiaddr" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", "bs58 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "data-encoding 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multihash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multihash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "parity-multihash" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "blake2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "sha-1 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sha3 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "sha3 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] -name = "parity-wasm" -version = "0.31.3" +name = "parity-send-wrapper" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", -] [[package]] -name = "parity-ws" -version = "0.8.0" +name = "parity-wasm" +version = "0.31.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "httparse 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", - "mio-extras 2.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2460,14 +2533,24 @@ dependencies = [ "parking_lot_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "parking_lot" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "lock_api 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot_core 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "parking_lot_core" version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2476,10 +2559,10 @@ name = "parking_lot_core" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2488,41 +2571,46 @@ name = "parking_lot_core" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] -name = "paste" -version = "0.1.5" +name = "parking_lot_core" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "paste-impl 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro-hack 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.54 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] -name = "paste-impl" +name = "paste" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro-hack 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.28 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.32 (registry+https://github.com/rust-lang/crates.io-index)", + "paste-impl 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-hack 0.5.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] -name = "pbkdf2" -version = "0.2.3" +name = "paste-impl" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "crypto-mac 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "generic-array 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-hack 0.5.7 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.35 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2530,7 +2618,7 @@ name = "pbkdf2" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "crypto-mac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "rayon 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2572,21 +2660,21 @@ dependencies = [ [[package]] name = "primitive-types" -version = "0.2.1" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "fixed-hash 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "impl-codec 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "impl-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "uint 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "impl-serde 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "uint 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "proc-macro-crate" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "toml 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "toml 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2599,12 +2687,12 @@ dependencies = [ [[package]] name = "proc-macro-hack" -version = "0.5.5" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.28 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.32 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.35 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2614,7 +2702,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "proc-macro2" -version = "0.4.28" +version = "0.4.30" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2622,7 +2710,7 @@ dependencies = [ [[package]] name = "protobuf" -version = "2.5.0" +version = "2.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -2630,7 +2718,7 @@ name = "pwasm-utils" version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parity-wasm 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2645,12 +2733,23 @@ name = "quick-error" version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "quickcheck" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "env_logger 0.6.1 (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)", + "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "quote" version = "0.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.28 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2658,7 +2757,7 @@ name = "rand" version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2668,7 +2767,7 @@ version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2681,7 +2780,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2691,13 +2790,13 @@ name = "rand" version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand_isaac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_jitter 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_jitter 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "rand_pcg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "rand_xorshift 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2709,7 +2808,7 @@ name = "rand_chacha" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2744,10 +2843,10 @@ dependencies = [ [[package]] name = "rand_jitter" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2759,7 +2858,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2770,7 +2869,7 @@ name = "rand_pcg" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2787,7 +2886,7 @@ name = "rand_xoshiro" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2808,8 +2907,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crossbeam-deque 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.10.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2840,19 +2939,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "regex" -version = "1.1.6" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "aho-corasick 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "regex-syntax 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", + "regex-syntax 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)", "thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", - "utf8-ranges 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "utf8-ranges 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "regex-syntax" -version = "0.6.6" +version = "0.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "ucd-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2871,8 +2970,8 @@ name = "rhododendron" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "error-chain 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec-derive 3.3.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2883,36 +2982,36 @@ name = "ring" version = "0.14.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "spin 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] -name = "ripemd160" -version = "0.8.0" +name = "rocksdb" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "digest 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "opaque-debug 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", + "librocksdb-sys 5.18.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] -name = "rocksdb" -version = "0.11.0" +name = "rpassword" +version = "3.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", - "librocksdb-sys 5.17.2 (registry+https://github.com/rust-lang/crates.io-index)", + "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "rustc-demangle" -version = "0.1.14" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -2928,19 +3027,32 @@ dependencies = [ "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "rustls" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", + "sct 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "webpki 0.19.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "rw-stream-sink" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "ryu" -version = "0.2.7" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -2979,15 +3091,15 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "curve25519-dalek 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "curve25519-dalek 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "ed25519-dalek 1.0.0-pre.1 (registry+https://github.com/rust-lang/crates.io-index)", "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "merlin 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "merlin 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sha3 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", - "subtle 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "sha3 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", + "subtle 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2996,45 +3108,36 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] -name = "scrypt" -version = "0.1.2" +name = "scopeguard" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "hmac 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", - "pbkdf2 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "sha2 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", -] [[package]] -name = "secp256k1" -version = "0.12.2" +name = "sct" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", + "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "security-framework" -version = "0.2.2" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "core-foundation 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "core-foundation-sys 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", - "security-framework-sys 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "core-foundation 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", + "core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", + "security-framework-sys 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "security-framework-sys" -version = "0.2.3" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "MacTypes-sys 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "core-foundation-sys 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", + "core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3057,20 +3160,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "serde" -version = "1.0.90" +version = "1.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "serde_derive" -version = "1.0.90" +version = "1.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.28 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.32 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.35 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3078,9 +3181,9 @@ name = "serde_json" version = "1.0.39" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", - "ryu 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", + "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", + "ryu 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3111,17 +3214,6 @@ dependencies = [ "generic-array 0.8.3 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "sha2" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "block-buffer 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "byte-tools 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "digest 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)", - "fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "sha2" version = "0.8.0" @@ -3135,7 +3227,7 @@ dependencies = [ [[package]] name = "sha3" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3167,16 +3259,6 @@ dependencies = [ "erased-serde 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "slog-async" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "take_mut 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "slog-json" version = "2.3.0" @@ -3184,7 +3266,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "erased-serde 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", "slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3204,14 +3286,14 @@ name = "slog_derive" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.28 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.32 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.35 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "smallvec" -version = "0.6.9" +version = "0.6.10" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -3220,15 +3302,33 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", - "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", "static_slice 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "subtle 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "subtle 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "soketto" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "http 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", + "httparse 1.3.3 (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)", + "sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3248,8 +3348,8 @@ dependencies = [ "blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", "criterion 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro-crate 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.28 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-version 2.0.0", @@ -3257,8 +3357,9 @@ dependencies = [ "substrate-consensus-common 2.0.0", "substrate-primitives 2.0.0", "substrate-state-machine 2.0.0", - "substrate-test-client 2.0.0", - "syn 0.15.32 (registry+https://github.com/rust-lang/crates.io-index)", + "substrate-test-runtime-client 2.0.0", + "syn 0.15.35 (registry+https://github.com/rust-lang/crates.io-index)", + "trybuild 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3271,10 +3372,11 @@ dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "sr-std 2.0.0", + "substrate-offchain 2.0.0", "substrate-primitives 2.0.0", "substrate-state-machine 2.0.0", "substrate-trie 2.0.0", - "tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tiny-keccak 1.4.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3283,9 +3385,10 @@ version = "2.0.0" dependencies = [ "integer-sqrt 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)", - "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", + "primitive-types 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-std 2.0.0", @@ -3318,7 +3421,7 @@ version = "2.0.0" dependencies = [ "impl-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", ] @@ -3328,7 +3431,7 @@ name = "srml-assets" version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3343,17 +3446,17 @@ version = "2.0.0" dependencies = [ "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", - "srml-consensus 2.0.0", "srml-session 2.0.0", "srml-staking 2.0.0", "srml-support 2.0.0", "srml-system 2.0.0", "srml-timestamp 2.0.0", + "substrate-consensus-aura-primitives 2.0.0", "substrate-inherents 2.0.0", "substrate-primitives 2.0.0", ] @@ -3365,14 +3468,12 @@ dependencies = [ "hex-literal 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", - "srml-consensus 2.0.0", "srml-session 2.0.0", - "srml-staking 2.0.0", "srml-support 2.0.0", "srml-system 2.0.0", "srml-timestamp 2.0.0", @@ -3387,7 +3488,7 @@ version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3398,36 +3499,21 @@ dependencies = [ ] [[package]] -name = "srml-consensus" -version = "2.0.0" -dependencies = [ - "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 2.0.0", - "sr-primitives 2.0.0", - "sr-std 2.0.0", - "srml-support 2.0.0", - "srml-system 2.0.0", - "substrate-inherents 2.0.0", - "substrate-primitives 2.0.0", -] - -[[package]] -name = "srml-contract" +name = "srml-contracts" version = "2.0.0" dependencies = [ "assert_matches 1.3.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.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "parity-wasm 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)", "pwasm-utils 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-sandbox 2.0.0", "sr-std 2.0.0", "srml-balances 2.0.0", - "srml-consensus 2.0.0", "srml-support 2.0.0", "srml-system 2.0.0", "srml-timestamp 2.0.0", @@ -3443,7 +3529,7 @@ dependencies = [ "hex-literal 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3460,7 +3546,7 @@ version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3475,7 +3561,7 @@ name = "srml-example" version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "srml-balances 2.0.0", @@ -3490,7 +3576,7 @@ version = "2.0.0" dependencies = [ "hex-literal 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3507,8 +3593,8 @@ version = "2.0.0" dependencies = [ "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3523,11 +3609,10 @@ name = "srml-grandpa" version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", - "srml-consensus 2.0.0", "srml-finality-tracker 2.0.0", "srml-session 2.0.0", "srml-support 2.0.0", @@ -3543,7 +3628,7 @@ dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "ref_thread_local 0.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3558,7 +3643,7 @@ name = "srml-metadata" version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "sr-std 2.0.0", "substrate-primitives 2.0.0", ] @@ -3570,11 +3655,10 @@ dependencies = [ "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", - "srml-consensus 2.0.0", "srml-support 2.0.0", "srml-system 2.0.0", "srml-timestamp 2.0.0", @@ -3586,13 +3670,13 @@ name = "srml-staking" version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", "srml-balances 2.0.0", - "srml-consensus 2.0.0", "srml-session 2.0.0", "srml-support 2.0.0", "srml-system 2.0.0", @@ -3606,7 +3690,7 @@ name = "srml-sudo" version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3625,7 +3709,7 @@ dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "paste 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "pretty_assertions 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3639,31 +3723,31 @@ dependencies = [ name = "srml-support-procedural" version = "2.0.0" dependencies = [ - "proc-macro2 0.4.28 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", "sr-api-macros 2.0.0", "srml-support-procedural-tools 2.0.0", - "syn 0.15.32 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.35 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "srml-support-procedural-tools" version = "2.0.0" dependencies = [ - "proc-macro-crate 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.28 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", "srml-support-procedural-tools-derive 2.0.0", - "syn 0.15.32 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.35 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "srml-support-procedural-tools-derive" version = "2.0.0" dependencies = [ - "proc-macro2 0.4.28 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.32 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.35 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3671,11 +3755,12 @@ name = "srml-support-test" version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "srml-support 2.0.0", "substrate-inherents 2.0.0", "substrate-primitives 2.0.0", + "trybuild 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3685,7 +3770,7 @@ dependencies = [ "criterion 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3698,7 +3783,7 @@ name = "srml-timestamp" version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3713,7 +3798,7 @@ name = "srml-treasury" version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3738,51 +3823,6 @@ name = "static_slice" version = "0.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "stdweb" -version = "0.4.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "discard 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "stdweb-derive 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "stdweb-internal-macros 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", - "stdweb-internal-runtime 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "stdweb-derive" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "proc-macro2 0.4.28 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.32 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "stdweb-internal-macros" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "base-x 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.28 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", - "sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.32 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "stdweb-internal-runtime" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "stream-cipher" version = "0.3.0" @@ -3793,8 +3833,11 @@ dependencies = [ [[package]] name = "string" -version = "0.1.3" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] name = "strsim" @@ -3803,22 +3846,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "structopt" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)", - "structopt-derive 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)", + "structopt-derive 0.2.16 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "structopt-derive" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.28 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.32 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.35 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3832,9 +3875,9 @@ version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.28 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.32 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.35 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3860,9 +3903,8 @@ dependencies = [ name = "substrate" version = "2.0.0" dependencies = [ - "ctrlc 3.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "ctrlc 3.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "node-cli 2.0.0", "vergen 3.0.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3880,7 +3922,7 @@ dependencies = [ "substrate-inherents 2.0.0", "substrate-primitives 2.0.0", "substrate-telemetry 2.0.0", - "substrate-test-client 2.0.0", + "substrate-test-runtime-client 2.0.0", "substrate-transaction-pool 2.0.0", ] @@ -3903,18 +3945,19 @@ dependencies = [ "app_dirs 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", "env_logger 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "exit-future 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "fdlimit 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "names 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "rpassword 3.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", - "structopt 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)", + "structopt 0.2.16 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-client 2.0.0", "substrate-keyring 2.0.0", "substrate-network 2.0.0", @@ -3923,26 +3966,25 @@ dependencies = [ "substrate-service 2.0.0", "substrate-state-machine 2.0.0", "substrate-telemetry 2.0.0", - "sysinfo 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", "tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-client" version = "2.0.0" dependencies = [ - "derive_more 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.14.1 (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.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.1.4 (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)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-api-macros 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -3954,7 +3996,7 @@ dependencies = [ "substrate-primitives 2.0.0", "substrate-state-machine 2.0.0", "substrate-telemetry 2.0.0", - "substrate-test-client 2.0.0", + "substrate-test-runtime-client 2.0.0", "substrate-trie 2.0.0", ] @@ -3967,10 +4009,10 @@ dependencies = [ "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)", + "linked-hash-map 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "lru-cache 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "substrate-client 2.0.0", "substrate-consensus-common 2.0.0", @@ -3979,7 +4021,7 @@ dependencies = [ "substrate-primitives 2.0.0", "substrate-state-db 2.0.0", "substrate-state-machine 2.0.0", - "substrate-test-client 2.0.0", + "substrate-test-runtime-client 2.0.0", "substrate-trie 2.0.0", ] @@ -3988,20 +4030,17 @@ name = "substrate-consensus-aura" version = "2.0.0" dependencies = [ "env_logger 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-version 2.0.0", "srml-aura 2.0.0", - "srml-consensus 2.0.0", "srml-support 2.0.0", "substrate-client 2.0.0", "substrate-consensus-aura-primitives 2.0.0", - "substrate-consensus-authorities 2.0.0", "substrate-consensus-common 2.0.0", "substrate-consensus-slots 2.0.0", "substrate-executor 2.0.0", @@ -4011,28 +4050,18 @@ dependencies = [ "substrate-primitives 2.0.0", "substrate-service 2.0.0", "substrate-telemetry 2.0.0", - "substrate-test-client 2.0.0", - "tokio 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", + "substrate-test-runtime-client 2.0.0", + "tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-consensus-aura-primitives" version = "2.0.0" -dependencies = [ - "sr-primitives 2.0.0", - "substrate-client 2.0.0", -] - -[[package]] -name = "substrate-consensus-authorities" -version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", - "sr-version 2.0.0", - "srml-support 2.0.0", "substrate-client 2.0.0", "substrate-primitives 2.0.0", ] @@ -4042,23 +4071,20 @@ name = "substrate-consensus-babe" version = "2.0.0" dependencies = [ "env_logger 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "merlin 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "merlin 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec-derive 3.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "schnorrkel 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-version 2.0.0", "srml-babe 2.0.0", - "srml-consensus 2.0.0", "srml-support 2.0.0", "substrate-client 2.0.0", - "substrate-consensus-authorities 2.0.0", "substrate-consensus-babe-primitives 2.0.0", "substrate-consensus-common 2.0.0", "substrate-consensus-slots 2.0.0", @@ -4069,8 +4095,9 @@ dependencies = [ "substrate-primitives 2.0.0", "substrate-service 2.0.0", "substrate-telemetry 2.0.0", - "substrate-test-client 2.0.0", - "tokio 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", + "substrate-test-runtime-client 2.0.0", + "tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4079,43 +4106,46 @@ version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", + "sr-std 2.0.0", "substrate-client 2.0.0", "substrate-consensus-slots 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "substrate-consensus-common" version = "2.0.0" dependencies = [ - "crossbeam-channel 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", + "sr-std 2.0.0", "sr-version 2.0.0", "substrate-inherents 2.0.0", "substrate-primitives 2.0.0", - "substrate-test-client 2.0.0", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", + "substrate-test-runtime-client 2.0.0", + "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-consensus-rhd" version = "2.0.0" dependencies = [ - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", "exit-future 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "rhododendron 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-version 2.0.0", - "srml-consensus 2.0.0", "srml-support 2.0.0", "srml-system 2.0.0", "substrate-client 2.0.0", @@ -4123,24 +4153,24 @@ dependencies = [ "substrate-keyring 2.0.0", "substrate-primitives 2.0.0", "substrate-transaction-pool 2.0.0", - "tokio 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-consensus-slots" version = "2.0.0" dependencies = [ - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "substrate-client 2.0.0", "substrate-consensus-common 2.0.0", "substrate-inherents 2.0.0", "substrate-primitives 2.0.0", - "tokio 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", + "substrate-test-runtime-client 2.0.0", + "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4148,14 +4178,14 @@ name = "substrate-executor" version = "2.0.0" dependencies = [ "assert_matches 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "libsecp256k1 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-version 2.0.0", "substrate-panic-handler 2.0.0", @@ -4163,7 +4193,7 @@ dependencies = [ "substrate-serializer 2.0.0", "substrate-state-machine 2.0.0", "substrate-trie 2.0.0", - "tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tiny-keccak 1.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "wabt 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)", "wasmi 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4175,10 +4205,10 @@ dependencies = [ "env_logger 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "finality-grandpa 0.8.0 (git+https://github.com/paritytech/finality-grandpa/)", "fork-tree 2.0.0", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", @@ -4192,8 +4222,8 @@ dependencies = [ "substrate-primitives 2.0.0", "substrate-service 2.0.0", "substrate-telemetry 2.0.0", - "substrate-test-client 2.0.0", - "tokio 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", + "substrate-test-runtime-client 2.0.0", + "tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4201,6 +4231,7 @@ name = "substrate-finality-grandpa-primitives" version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", "substrate-client 2.0.0", @@ -4212,7 +4243,7 @@ name = "substrate-inherents" version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", ] @@ -4232,13 +4263,12 @@ dependencies = [ name = "substrate-keystore" version = "2.0.0" dependencies = [ - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", "hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-crypto 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-primitives 2.0.0", - "subtle 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "subtle 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4246,59 +4276,45 @@ dependencies = [ name = "substrate-network" version = "2.0.0" dependencies = [ - "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-channel 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", "env_logger 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "erased-serde 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", + "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "fork-tree 2.0.0", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "linked-hash-map 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "linked_hash_set 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)", "lru-cache 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "quickcheck 0.8.5 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", + "slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "slog_derive 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "substrate-client 2.0.0", "substrate-consensus-common 2.0.0", "substrate-keyring 2.0.0", - "substrate-network-libp2p 2.0.0", "substrate-peerset 2.0.0", "substrate-primitives 2.0.0", "substrate-test-client 2.0.0", - "tokio 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", - "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "substrate-network-libp2p" -version = "2.0.0" -dependencies = [ - "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "erased-serde 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "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.26 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", - "slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "slog_derive 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", - "substrate-peerset 2.0.0", + "substrate-test-runtime 2.0.0", + "substrate-test-runtime-client 2.0.0", "tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "zeroize 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4306,18 +4322,18 @@ name = "substrate-offchain" version = "2.0.0" dependencies = [ "env_logger 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "substrate-client 2.0.0", "substrate-consensus-common 2.0.0", - "substrate-inherents 2.0.0", "substrate-offchain-primitives 2.0.0", "substrate-primitives 2.0.0", - "substrate-test-client 2.0.0", + "substrate-test-runtime-client 2.0.0", "substrate-transaction-pool 2.0.0", - "tokio 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4332,7 +4348,7 @@ dependencies = [ name = "substrate-panic-handler" version = "2.0.0" dependencies = [ - "backtrace 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", + "backtrace 0.3.30 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4340,12 +4356,14 @@ dependencies = [ name = "substrate-peerset" version = "2.0.0" dependencies = [ - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "linked-hash-map 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "lru-cache 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4354,7 +4372,7 @@ version = "2.0.0" 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)", + "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "criterion 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "ed25519-dalek 1.0.0-pre.1 (registry+https://github.com/rust-lang/crates.io-index)", "hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4362,20 +4380,21 @@ dependencies = [ "hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "impl-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "pretty_assertions 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "primitive-types 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "primitive-types 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "schnorrkel 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-std 2.0.0", "substrate-bip39 0.2.1 (git+https://github.com/paritytech/substrate-bip39)", "substrate-serializer 2.0.0", "tiny-bip39 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "twox-hash 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "twox-hash 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "wasmi 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4384,41 +4403,40 @@ name = "substrate-rpc" version = "2.0.0" dependencies = [ "assert_matches 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-core 10.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-derive 10.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-pubsub 10.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-core 12.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-core-client 12.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-derive 12.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-pubsub 12.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-version 2.0.0", "substrate-client 2.0.0", - "substrate-consensus-common 2.0.0", "substrate-executor 2.0.0", "substrate-network 2.0.0", "substrate-primitives 2.0.0", "substrate-state-machine 2.0.0", - "substrate-test-client 2.0.0", - "substrate-test-runtime 2.0.0", + "substrate-test-runtime-client 2.0.0", "substrate-transaction-pool 2.0.0", - "tokio 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-rpc-servers" version = "2.0.0" dependencies = [ - "jsonrpc-http-server 10.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-pubsub 10.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "jsonrpc-ws-server 10.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-http-server 12.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-pubsub 12.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonrpc-ws-server 12.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "substrate-rpc 2.0.0", ] @@ -4427,7 +4445,7 @@ dependencies = [ name = "substrate-serializer" version = "2.0.0" dependencies = [ - "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4435,14 +4453,17 @@ dependencies = [ name = "substrate-service" version = "2.0.0" dependencies = [ - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", "exit-future 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "node-executor 2.0.0", + "node-primitives 2.0.0", + "node-runtime 2.0.0", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", "slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", @@ -4451,17 +4472,19 @@ dependencies = [ "substrate-client-db 2.0.0", "substrate-consensus-common 2.0.0", "substrate-executor 2.0.0", - "substrate-inherents 2.0.0", + "substrate-finality-grandpa 2.0.0", "substrate-keystore 2.0.0", "substrate-network 2.0.0", "substrate-offchain 2.0.0", "substrate-primitives 2.0.0", "substrate-rpc-servers 2.0.0", "substrate-telemetry 2.0.0", - "substrate-test-client 2.0.0", + "substrate-test-runtime-client 2.0.0", "substrate-transaction-pool 2.0.0", + "sysinfo 0.8.5 (registry+https://github.com/rust-lang/crates.io-index)", "target_info 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4470,7 +4493,7 @@ version = "2.0.0" dependencies = [ "env_logger 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "fdlimit 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "substrate-client 2.0.0", @@ -4479,7 +4502,7 @@ dependencies = [ "substrate-primitives 2.0.0", "substrate-service 2.0.0", "tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4489,7 +4512,7 @@ dependencies = [ "env_logger 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-primitives 2.0.0", ] @@ -4500,8 +4523,9 @@ dependencies = [ "hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-panic-handler 2.0.0", "substrate-primitives 2.0.0", "substrate-trie 2.0.0", @@ -4513,24 +4537,28 @@ dependencies = [ name = "substrate-telemetry" version = "2.0.0" dependencies = [ - "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "slog-async 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "slog-json 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "slog-scope 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "ws 0.7.9 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-test-client" version = "2.0.0" dependencies = [ - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "substrate-client 2.0.0", @@ -4540,18 +4568,17 @@ dependencies = [ "substrate-keyring 2.0.0", "substrate-primitives 2.0.0", "substrate-state-machine 2.0.0", - "substrate-test-runtime 2.0.0", ] [[package]] name = "substrate-test-runtime" version = "2.0.0" dependencies = [ - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "memory-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -4560,30 +4587,39 @@ dependencies = [ "srml-support 2.0.0", "substrate-client 2.0.0", "substrate-consensus-aura-primitives 2.0.0", - "substrate-consensus-authorities 2.0.0", "substrate-consensus-babe-primitives 2.0.0", "substrate-executor 2.0.0", "substrate-inherents 2.0.0", "substrate-keyring 2.0.0", "substrate-offchain-primitives 2.0.0", "substrate-primitives 2.0.0", - "substrate-test-client 2.0.0", + "substrate-test-runtime-client 2.0.0", "substrate-trie 2.0.0", "trie-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "substrate-test-runtime-client" +version = "2.0.0" +dependencies = [ + "sr-primitives 2.0.0", + "substrate-primitives 2.0.0", + "substrate-test-client 2.0.0", + "substrate-test-runtime 2.0.0", +] + [[package]] name = "substrate-transaction-graph" version = "2.0.0" dependencies = [ "assert_matches 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", "env_logger 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "substrate-primitives 2.0.0", "substrate-test-runtime 2.0.0", @@ -4593,16 +4629,16 @@ dependencies = [ name = "substrate-transaction-pool" version = "2.0.0" dependencies = [ - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "substrate-client 2.0.0", "substrate-keyring 2.0.0", "substrate-primitives 2.0.0", - "substrate-test-client 2.0.0", + "substrate-test-runtime-client 2.0.0", "substrate-transaction-graph 2.0.0", ] @@ -4621,7 +4657,7 @@ dependencies = [ "trie-bench 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "trie-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "trie-root 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", - "trie-standardmap 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-standardmap 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4631,46 +4667,41 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "subtle" -version = "2.0.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "syn" -version = "0.15.32" +version = "0.15.35" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.28 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "synstructure" -version = "0.10.1" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.28 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.32 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.35 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "sysinfo" -version = "0.8.2" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "rayon 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "take_mut" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "target_info" version = "0.1.0" @@ -4687,11 +4718,11 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.0.7" +version = "3.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "redox_syscall 0.1.54 (registry+https://github.com/rust-lang/crates.io-index)", "remove_dir_all 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4700,7 +4731,7 @@ dependencies = [ [[package]] name = "termcolor" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "wincolor 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4711,7 +4742,7 @@ name = "termion" version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "numtoa 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "redox_syscall 0.1.54 (registry+https://github.com/rust-lang/crates.io-index)", "redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4738,7 +4769,7 @@ name = "time" version = "0.1.42" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "redox_syscall 0.1.54 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4759,7 +4790,7 @@ dependencies = [ [[package]] name = "tiny-keccak" -version = "1.4.2" +version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4767,10 +4798,10 @@ dependencies = [ [[package]] name = "tinytemplate" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4779,43 +4810,53 @@ name = "tk-listen" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tokio" -version = "0.1.19" +version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.10.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-current-thread 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-fs 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-sync 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-sync 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-threadpool 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-trace-core 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-trace-core 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-udp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-uds 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "tokio-buf" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "either 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "tokio-codec" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4824,7 +4865,7 @@ name = "tokio-current-thread" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4833,10 +4874,10 @@ name = "tokio-dns-unofficial" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4845,7 +4886,7 @@ version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4853,7 +4894,7 @@ name = "tokio-fs" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-threadpool 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4864,7 +4905,7 @@ version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4874,25 +4915,38 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.10.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-sync 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-sync 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-rustls" +version = "0.10.0-alpha.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rustls 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "webpki 0.19.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tokio-sync" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4901,9 +4955,9 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4916,9 +4970,9 @@ dependencies = [ "crossbeam-deque 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-queue 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.10.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4926,11 +4980,11 @@ dependencies = [ [[package]] name = "tokio-timer" -version = "0.2.10" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4940,14 +4994,14 @@ name = "tokio-tls" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - "native-tls 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "native-tls 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tokio-trace-core" -version = "0.1.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4959,9 +5013,9 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4973,11 +5027,11 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", "mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4986,10 +5040,10 @@ dependencies = [ [[package]] name = "toml" -version = "0.4.10" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4997,6 +5051,20 @@ name = "traitobject" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "transaction-factory" +version = "0.0.1" +dependencies = [ + "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-primitives 2.0.0", + "substrate-cli 2.0.0", + "substrate-client 2.0.0", + "substrate-consensus-common 2.0.0", + "substrate-primitives 2.0.0", + "substrate-service 2.0.0", +] + [[package]] name = "trie-bench" version = "0.12.2" @@ -5009,7 +5077,7 @@ dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "trie-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "trie-root 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", - "trie-standardmap 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", + "trie-standardmap 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -5034,10 +5102,9 @@ dependencies = [ [[package]] name = "trie-standardmap" -version = "0.12.2" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "criterion 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "keccak-hasher 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -5047,19 +5114,32 @@ name = "try-lock" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "trybuild" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "glob 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", + "termcolor 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", + "toml 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "twofish" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "block-cipher-trait 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "opaque-debug 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "twox-hash" -version = "1.2.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5082,11 +5162,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "uint" -version = "0.6.1" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "crunchy 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "crunchy 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -5101,7 +5181,7 @@ dependencies = [ [[package]] name = "unicase" -version = "2.3.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5120,12 +5200,12 @@ name = "unicode-normalization" version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "unicode-segmentation" -version = "1.2.1" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -5164,7 +5244,7 @@ dependencies = [ [[package]] name = "utf8-ranges" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -5182,7 +5262,7 @@ name = "vergen" version = "3.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -5202,8 +5282,8 @@ name = "wabt" version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", "wabt-sys 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -5213,14 +5293,14 @@ name = "wabt-sys" version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)", - "cmake 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", + "cmake 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", "glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "walkdir" -version = "2.2.7" +version = "2.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "same-file 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5233,82 +5313,94 @@ name = "want" version = "0.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "try-lock 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen" -version = "0.2.42" +version = "0.2.45" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "wasm-bindgen-macro 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-macro 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.42" +version = "0.2.45" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bumpalo 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bumpalo 2.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.28 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.32 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-shared 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.35 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-shared 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-futures" -version = "0.3.19" +version = "0.3.22" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - "js-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.42" +version = "0.2.45" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-macro-support 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-macro-support 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.42" +version = "0.2.45" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.28 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.32 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-backend 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-shared 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.35 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-backend 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-shared 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.42" +version = "0.2.45" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "wasm-bindgen-webidl" -version = "0.2.42" +version = "0.2.45" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.28 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.32 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-backend 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", - "weedle 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.35 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-backend 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", + "weedle 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "wasm-timer" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "send_wrapper 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", + "web-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -5332,32 +5424,53 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.19" +version = "0.3.22" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "env_logger 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "js-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", "sourcefile 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-webidl 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-webidl 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "webpki" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", + "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "webpki-roots" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "webpki 0.19.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "websocket" -version = "0.22.3" +version = "0.22.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", - "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - "hyper 0.10.15 (registry+https://github.com/rust-lang/crates.io-index)", - "native-tls 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "hyper 0.10.16 (registry+https://github.com/rust-lang/crates.io-index)", + "native-tls 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-tls 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "unicase 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5365,7 +5478,7 @@ dependencies = [ [[package]] name = "weedle" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "nom 4.2.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5377,7 +5490,7 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -5428,18 +5541,17 @@ dependencies = [ [[package]] name = "ws" -version = "0.7.9" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "httparse 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", "mio-extras 2.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl 0.10.20 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "sha-1 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -5459,7 +5571,7 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "curve25519-dalek 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "curve25519-dalek 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -5475,11 +5587,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "yamux" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "nohash-hasher 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", @@ -5494,9 +5606,45 @@ name = "zeroize" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "zeroize" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "zeroize_derive 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "zeroize" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "zeroize_derive 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "zeroize_derive" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.35 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "zeroize_derive" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.35 (registry+https://github.com/rust-lang/crates.io-index)", + "synstructure 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + [metadata] -"checksum MacTypes-sys 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "eaf9f0d0b1cc33a4d2aee14fb4b2eac03462ef4db29c8ac4057327d8a71ad86f" -"checksum aes 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "54eb1d8fe354e5fc611daf4f2ea97dd45a765f4f1e4512306ec183ae2e8f20c9" +"checksum adler32 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7e522997b529f05601e05166c07ed17789691f562762c7f3b987263d2dedee5c" "checksum aes-ctr 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d2e5b0458ea3beae0d1d8c0f3946564f8e10f90646cf78c06b4351052058d1ee" "checksum aes-soft 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cfd7e7ae3f9a1fb5c03b389fc6bb9a51400d0c13053f0dca698c832bfd893a0d" "checksum aesni 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2f70a6b5f971e473091ab7cfb5ffac6cde81666c4556751d8d5620ead8abf100" @@ -5510,47 +5658,47 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum asn1_der_derive 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9e7f92edafad155aff997fa5b727c6429b91e996b5a5d62a2b0adbae1306b5fe" "checksum assert_matches 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7deb0a829ca7bcfaf5da70b073a8d128619259a7be8216a355e23f00763059e5" "checksum atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "9a7d5b8723950951411ee34d271d99dddcc2035a16ab25310ea2c8cfd4369652" -"checksum autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a6d640bee2da49f60a4068a7fae53acde8982514ab7bae8b8cea9e88cbcfd799" -"checksum backtrace 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "f106c02a3604afcdc0df5d36cc47b44b55917dbaf3d808f71c163a0ddba64637" +"checksum autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "0e49efa51329a5fd37e7c79db4621af617cd4e3e5bc224939808d076077077bf" +"checksum backtrace 0.3.30 (registry+https://github.com/rust-lang/crates.io-index)" = "ada4c783bb7e7443c14e0480f429ae2cc99da95065aeab7ee1b81ada0419404f" "checksum backtrace-sys 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)" = "797c830ac25ccc92a7f8a7b9862bde440715531514594a6154e3d4a54dd769b6" -"checksum base-x 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "d55aa264e822dbafa12db4d54767aff17c6ba55ea2d8559b3e17392c7d000e5d" "checksum base58 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5024ee8015f02155eee35c711107ddd9a9bf3cb689cf2a9089c97e79b6e1ae83" "checksum base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b25d992356d2eb0ed82172f5248873db5560c4721f564b13cb5193bda5e668e" "checksum base64 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)" = "489d6c0ed21b11d038c31b6ceccca973e65d73ba3bd8ecb9a2babf5546164643" "checksum bigint 4.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ebecac13b3c745150d7b6c3ea7572d372f09d627c2077e893bf26c5c7f70d282" "checksum bindgen 0.47.3 (registry+https://github.com/rust-lang/crates.io-index)" = "df683a55b54b41d5ea8ebfaebb5aa7e6b84e3f3006a78f010dadc9ca88469260" -"checksum bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "228047a76f468627ca71776ecdebd732a3423081fcf5125585bcd7c49886ce12" +"checksum bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3d155346769a6855b86399e9bc3814ab343cd3d62c7e985113d46a0ec3c281fd" "checksum bitmask 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5da9b3d9f6f585199287a473f4f8dfab6566cf827d15c00c219f53c645687ead" "checksum blake2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "91721a6330935673395a0607df4d49a9cb90ae12d259f1b3e0a3f6e1d486872e" "checksum blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "5d6d530bdd2d52966a6d03b7a964add7ae1a288d25214066fd4b600f0f796400" "checksum block-buffer 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1339a1042f5d9f295737ad4d9a6ab6bf81c84a933dba110b9200cd6d1448b814" -"checksum block-buffer 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a076c298b9ecdb530ed9d967e74a6027d6a7478924520acddcddc24c1c8ab3ab" "checksum block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" "checksum block-cipher-trait 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1c924d49bd09e7c06003acda26cd9742e796e34282ec6c1189404dee0c1f4774" -"checksum block-modes 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "31aa8410095e39fdb732909fb5730a48d5bd7c2e3cd76bd1b07b3dbea130c529" "checksum block-padding 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "6d4dc3af3ee2e12f3e5d224e5e1e3d73668abbeb69e566d361f7d5563a4fdf09" "checksum bs58 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0de79cfb98e7aa9988188784d8664b4b5dad6eaaa0863b91d9a4ed871d4f7a42" -"checksum bstr 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6c8203ca06c502958719dae5f653a79e0cc6ba808ed02beffbf27d09610f2143" -"checksum bumpalo 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4639720be048090544634e0402490838995ccdc9d2fe648f528f30d3c33ae71f" +"checksum bstr 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "59604ece62a407dc9164732e5adea02467898954c3a5811fd2dc140af14ef15b" +"checksum build_const 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "39092a32794787acd8525ee150305ff051b0aa6cc2abaf193924f5ab05425f39" +"checksum bumpalo 2.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "84dca3afd8e01b9526818b7963e5b4916063b3cdf9f10cf6b73ef0bd0ec37aa5" "checksum byte-tools 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "560c32574a12a89ecd91f5e742165893f86e3ab98d21f8ea548658eb9eef5f40" "checksum byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" "checksum byteorder 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "0fc10e8cc6b2580fda3f36eb6dc5316657f812a3df879a44a66fc9f0fdbc4855" -"checksum byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a019b10a2a7cdeb292db131fc8113e57ea2a908f6e7894b0c3c671893b65dbeb" +"checksum byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a7c3dd8985a7111efc5c80b44e23ecdd8c007de8ade3b96595387e812b957cf5" "checksum bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)" = "206fdffcfa2df7cbe15601ef46c813fce0965eb3286db6b56c583b814b51c81c" "checksum c_linked_list 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4964518bd3b4a8190e832886cdc0da9794f12e8e6c1613a9e90ff331c4c8724b" "checksum cast 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "926013f2860c46252efceabb19f4a6b308197505082c609025aa6706c011d427" -"checksum cc 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)" = "389803e36973d242e7fecb092b2de44a3d35ac62524b3b9339e51d577d668e02" +"checksum cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)" = "39f75544d7bbaf57560d2168f28fd649ff9c76153874db88bdbdfd839b1a7e7d" "checksum cexpr 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "a7fa24eb00d5ffab90eaeaf1092ac85c04c64aaf358ea6f84505b8116d24c6af" -"checksum cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "11d43355396e872eefb45ce6342e4374ed7bc2b3a502d1b28e36d6e23c05d1f4" +"checksum cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "b486ce3ccf7ffd79fdeb678eac06a9e6c09fc88d33836340becb8fffe87c5e33" "checksum chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "45912881121cb26fad7c38c17ba7daa18764771836b34fab7d3fbd93ed633878" "checksum clang-sys 0.26.4 (registry+https://github.com/rust-lang/crates.io-index)" = "6ef0c1bcf2e99c649104bd7a7012d8f8802684400e03db0ec0af48583c6fa0e4" "checksum clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b957d88f4b6a63b9d70d5f454ac8011819c6efa7727858f458ab71c756ce2d3e" "checksum clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "97276801e127ffb46b66ce23f35cc96bd454fa311294bced4bbace7baa8b1d17" "checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" -"checksum cmake 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)" = "6ec65ee4f9c9d16f335091d23693457ed4928657ba4982289d7fafee03bc614a" +"checksum cmake 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)" = "2ca4386c8954b76a8415b63959337d940d724b336cabd3afe189c2b51a7e1ff0" "checksum constant_time_eq 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8ff012e225ce166d4422e0e78419d901719760f62ae2b7969ca6b564d1b54a9e" -"checksum core-foundation 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "286e0b41c3a20da26536c6000a280585d519fd07b3956b43aed8a79e9edce980" -"checksum core-foundation-sys 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "716c271e8613ace48344f723b60b900a93150271e5be206212d052bbc0883efa" +"checksum core-foundation 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "25b9e03f145fd4f2bf705e07b900cd41fc636598fe5dc452fd0db1441c3f496d" +"checksum core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e7ca8a5221364ef15ce201e8ed2f609fc312682a8f4e0e3d4aa5879764e0fa3b" +"checksum crc 1.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d663548de7f5cca343f1e0a48d14dcfb0e9eb4e079ec58883b7251539fa10aeb" +"checksum crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ba125de2af0df55319f41944744ad91c71113bf74a4646efff39afe1f6842db1" "checksum criterion 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "0363053954f3e679645fc443321ca128b7b950a6fe288cf5f9335cc22ee58394" "checksum criterion-plot 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "76f9212ddf2f4a9eb2d401635190600656a1f88a932ef53d06e7fa4c7e02fb8e" "checksum crossbeam 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ad4c7ea749d9fb09e23c5cb17e3b70650860553a0e2744e38446b1803bf7db94" @@ -5564,24 +5712,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum crossbeam-utils 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2760899e32a1d58d5abb31129f8fae5de75220bc2176e77ff7c627ae45c918d9" "checksum crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "f8306fcef4a7b563b76b7dd949ca48f52bc1141aa067d2ea09565f3e2652aa5c" "checksum crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "a2f4a431c5c9f662e1200b7c7f02c34e91361150e382089a8f2dec3ba680cbda" -"checksum crunchy 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c240f247c278fa08a6d4820a6a222bfc6e0d999e51ba67be94f44c905b2161f2" +"checksum crunchy 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" "checksum crypto-mac 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "779015233ac67d65098614aec748ac1c756ab6677fa2e14cf8b37c08dfed1198" -"checksum crypto-mac 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7afa06d05a046c7a47c3a849907ec303504608c927f4e85f7bfff22b7180d971" "checksum crypto-mac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4434400df11d95d556bac068ddfedd482915eb18fe8bea89bc80b6e4b1c179e5" "checksum csv 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)" = "9044e25afb0924b5a5fc5511689b0918629e85d68ea591e5e87fbf1e85ea1b3b" "checksum csv-core 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "fa5cdef62f37e6ffe7d1f07a381bc0db32b7a3ff1cac0de56cb0d81e71f53d65" "checksum ctor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "3b4c17619643c1252b5f690084b82639dd7fac141c57c8e77a00e0148132092c" "checksum ctr 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "022cd691704491df67d25d006fe8eca083098253c4d43516c2206479c58c6736" -"checksum ctrlc 3.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5531b7f0698d9220b4729f8811931dbe0e91a05be2f7b3245fdc50dd856bae26" +"checksum ctrlc 3.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c7dfd2d8b4c82121dfdff120f818e09fc4380b0b7e17a742081a89b94853e87f" "checksum cuckoofilter 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8dd43f7cfaffe0a386636a10baea2ee05cc50df3b77bea4a456c9572a939bf1f" -"checksum curve25519-dalek 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e1f8a6fc0376eb52dc18af94915cc04dfdf8353746c0e8c550ae683a0815e5c1" +"checksum curve25519-dalek 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5d4b820e8711c211745880150f5fac78ab07d6e3851d8ce9f5a02cedc199174c" "checksum data-encoding 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f4f47ca1860a761136924ddd2422ba77b2ea54fe8cc75b9040804a0d9d32ad97" -"checksum derive_more 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fbe9f11be34f800b3ecaaed0ec9ec2e015d1d0ba0c8644c1310f73d6e8994615" +"checksum derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6d944ac6003ed268757ef1ee686753b57efc5fcf0ebe7b64c9fc81e7e32ff839" "checksum difference 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "524cbf6897b527295dff137cec09ecf3a05f4fddffd7dfcd1585403449e74198" "checksum digest 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e5b29bf156f3f4b3c4f610a25ff69370616ae6e0657d416de22645483e72af0a" -"checksum digest 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)" = "03b072242a8cbaf9c145665af9d250c59af3b958f83ed6824e13533cf76d5b90" "checksum digest 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "05f47366984d3ad862010e22c7ce81a7dbcaebbdfb37241a620f8b6596ee135c" -"checksum discard 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "212d0f5754cb6769937f4501cc0e67f4f4483c8d2c3e1e922ee9edbe4ab4c7c0" "checksum dns-parser 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c4d33be9473d06f75f58220f71f7a9317aca647dc061dbd3c361b0bef505fbea" "checksum ed25519-dalek 1.0.0-pre.1 (registry+https://github.com/rust-lang/crates.io-index)" = "81956bcf7ef761fb4e1d88de3fa181358a0d26cbcb9755b587a08f9119824b86" "checksum either 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5527cfe0d098f36e3f8839852688e63c8fff1c90b2b405aef730615f9a7bcf7b" @@ -5589,7 +5734,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum env_logger 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b61fa891024a945da30a9581546e8cfaf5602c7b3f4c137a2805cf388f92075a" "checksum environmental 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5c7464757b80de8930c91c9afe77ddce501826bf9d134a87db2c67d9dc177e2c" "checksum erased-serde 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "3beee4bc16478a1b26f2e80ad819a52d24745e292f521a63c16eea5f74b7eb60" -"checksum error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "07e791d3be96241c77c43846b665ef1384606da2cd2a48730abe606a12906e02" +"checksum error-chain 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3ab49e9dcb602294bc42f9a7dfc9bc6e936fca4418ea300dbfb84fe16de0b7d9" "checksum exit-future 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "d8013f441e38e31c670e7f34ec8f1d5d3a2bd9d303c1ff83976ca886005e8f48" "checksum failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "795bd83d3abeb9220f257e597aa0080a508b27533824adf336529648f6abf7e2" "checksum failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "ea1063915fd7ef4309e222a5a07cf9c319fb9c7836b1f89b85458672dbb127e1" @@ -5597,6 +5742,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum fdlimit 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b1ee15a7050e5580b3712877157068ea713b245b080ff302ae2ca973cfcd9baa" "checksum finality-grandpa 0.8.0 (git+https://github.com/paritytech/finality-grandpa/)" = "" "checksum fixed-hash 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d1a683d1234507e4f3bf2736eeddf0de1dc65996dc0164d57eba0a74bcf29489" +"checksum flate2 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)" = "f87e68aa82b2de08a6e037f1385455759df6e445a8df5e005b4297191dbf18aa" "checksum fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2fad85553e09a6f881f739c29f0b00b0f01357c743266d478b68951ce23285f3" "checksum foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" "checksum foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" @@ -5604,17 +5750,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" "checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" "checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" -"checksum futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)" = "62941eff9507c8177d448bd83a44d9b9760856e184081d8cd79ba9f03dd24981" +"checksum futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)" = "a2037ec1c6c1c4f79557762eab1f7eae1f64f6cb418ace90fae88f0942b60139" "checksum futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "ab90cde24b3319636588d0c35fe03b1333857621051837ed769faefb4c2162e4" "checksum gcc 0.3.55 (registry+https://github.com/rust-lang/crates.io-index)" = "8f5f3913fa0bfe7ee1fd8248b6b9f42a5af4b9d65ec2dd2c3c26132b950ecfc2" "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 generic-array 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ef25c5683767570c2bbd7deba372926a55eaae9982d7726ee2a1050239d45b9d" "checksum get_if_addrs 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "abddb55a898d32925f3148bd281174a68eeb68bbfd9a5938a57b18f506ee4ef7" "checksum get_if_addrs-sys 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0d04f9fb746cf36b191c00f3ede8bde9c8e64f9f4b05ae2694a9ccf5e3f5ab48" "checksum glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "8be18de09a56b60ed0edf84bc9df007e30040691af7acd1c41874faac5895bfb" +"checksum glob 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" "checksum globset 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ef4feaabe24a0a658fd9cf4a9acf6ed284f045c77df0f49020ba3245cfb7b454" -"checksum h2 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)" = "85ab6286db06040ddefb71641b50017c06874614001a134b423783e2db2920bd" +"checksum h2 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)" = "1e42e3daed5a7e17b12a0c23b5b2fbff23a925a570938ebee4baca1a9a1a2240" "checksum hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ba7fb417e5c470acdd61068c79767d0e65962e70836cf6c9dfd2409f06345ce0" "checksum hash256-std-hasher 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f8b2027c19ec91eb304999abae7307d225cf93be42af53b0039f76e98ed5af86" "checksum hashbrown 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3bae29b6653b3412c2e71e9d486db9f9df5d701941d86683005efb9f2d28e3da" @@ -5627,30 +5773,34 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum hex-literal-impl 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "520870c3213943eb8d7803e80180d12a6c7ceb4ae74602544529d1643dc4ddda" "checksum hex-literal-impl 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "06095d08c7c05760f11a071b3e1d4c5b723761c01bd8d7201c30a9536668a612" "checksum hmac 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7a13f4163aa0c5ca1be584aace0e2212b2e41be5478218d4f657f5f778b2ae2a" -"checksum hmac 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "733e1b3ac906631ca01ebb577e9bb0f5e37a454032b9036b5eaea4013ed6f99a" "checksum hmac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f127a908633569f208325f86f71255d3363c79721d7f9fe31cd5569908819771" "checksum hmac-drbg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4fe727d41d2eec0a6574d887914347e5ff96a3b87177817e2a9820c5c87fecc2" "checksum http 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)" = "eed324f0f0daf6ec10c474f150505af2c143f251722bf9dbd1261bd1f2ee2c1a" +"checksum http-body 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6741c859c1b2463a423a1dbce98d418e6c3c3fc720fb0d45528657320920292d" "checksum httparse 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e8734b0cfd3bc3e101ec59100e101c2eecd19282202e87808b3037b442777a83" "checksum humantime 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3ca7e5f2e110db35f93b837c81797f3714500b81d517bf20c431b16d3ca4f114" -"checksum hyper 0.10.15 (registry+https://github.com/rust-lang/crates.io-index)" = "df0caae6b71d266b91b4a83111a61d2b94ed2e2bea024c532b933dcff867e58c" -"checksum hyper 0.12.27 (registry+https://github.com/rust-lang/crates.io-index)" = "4f2777434f26af6e4ce4fdcdccd3bed9d861d11e87bcbe72c0f51ddaca8ff848" +"checksum hyper 0.10.16 (registry+https://github.com/rust-lang/crates.io-index)" = "0a0652d9a2609a968c14be1a9ea00bf4b1d64e2e1f53a1b51b6fff3a6e829273" +"checksum hyper 0.12.29 (registry+https://github.com/rust-lang/crates.io-index)" = "e2cd6adf83b3347d36e271f030621a8cf95fd1fd0760546b9fc5a24a0f1447c7" "checksum idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e" "checksum impl-codec 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d2050d823639fbeae26b2b5ba09aca8907793117324858070ade0673c49f793b" "checksum impl-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5158079de9d4158e0ce1de3ae0bd7be03904efc40b3d7dd8b8c301cbf6b52b56" +"checksum impl-serde 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7d26be4b97d738552ea423f76c4f681012ff06c3fa36fa968656b3679f60b4a1" "checksum indexmap 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7e81a7c05f79578dbc15793d8b619db9ba32b4577003ef3af1a91c416798c58d" "checksum integer-sqrt 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ea155abb3ba6f382a75f1418988c05fe82959ed9ce727de427f9cfd425b0c903" "checksum interleaved-ordered 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "141340095b15ed7491bd3d4ced9d20cebfb826174b6bb03386381f62b01e3d77" "checksum iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dbe6e417e7d0975db6512b90796e8ce223145ac4e33c377e4a42882a0e88bb08" +"checksum ipnet 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e61c2da0d0f700c77d2d313dbf4f93e41d235fa12c6681fee06621036df4c2af" "checksum itertools 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5b8467d9c1cebe26feb08c640139247fac215782d35371ade9a2136ed6085358" -"checksum itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1306f3464951f30e30d12373d31c79fbd52d236e5e896fd92f96ec7babbbe60b" -"checksum js-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)" = "3c994fd445b81741d77f6bcd227d6ed645b95b35a2ecfd2050767450ff1c0b6d" -"checksum jsonrpc-core 10.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "dc15eef5f8b6bef5ac5f7440a957ff95d036e2f98706947741bfc93d1976db4c" -"checksum jsonrpc-derive 10.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c2dae61ca8a3b047fb11309b00661bc56837085bd07e46f907b9c562c0b03e68" -"checksum jsonrpc-http-server 10.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "11d2a00824306155b8ef57fe957f31b8cd8ad24262f15cf911d84dcf9a3f206d" -"checksum jsonrpc-pubsub 10.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "37fce55133ee264d0ab42bd862efcd45ae1d062cda599f4cc12ccc4be3195f2a" -"checksum jsonrpc-server-utils 10.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c9527f01ef25f251d64082cbefc0c6d6f367349afe6848ef908a674e06b2bdd3" -"checksum jsonrpc-ws-server 10.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3889012aa638a2f18eb1a879f46fc8b34e7e1423cbff3247cd1531de0d51084b" +"checksum itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "501266b7edd0174f8530248f87f99c88fbe60ca4ef3dd486835b8d8d53136f7f" +"checksum js-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "9987e7c13a91d9cf0efe59cca48a3a7a70e2b11695d5a4640f85ae71e28f5e73" +"checksum jsonrpc-client-transports 12.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0245e08f98d627a579cdee6a2138d05ab64f6093efbcdeec50805d121ee13c0c" +"checksum jsonrpc-core 12.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "288dca7f9713710a29e485076b9340156cb701edb46a881f5d0c31aa4f5b9143" +"checksum jsonrpc-core-client 12.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "05e499e393aaa97cf5ff3a7444549c94a6d27e70be1c300b865187d722f1b426" +"checksum jsonrpc-derive 12.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f7b65eafb36286a4251c9a1d4cdf4e9a7cf8fa4f7bf991383e42f0cf26908767" +"checksum jsonrpc-http-server 12.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ea8b3996f19dc6dd90d928c81d30b3ce9535840487734290da9fae3b3185db5d" +"checksum jsonrpc-pubsub 12.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fcdd238ecccde73faea93760b068f3fe3ca84caeb6b5414c2aabd4f008dad418" +"checksum jsonrpc-server-utils 12.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "036a53ffa47533dcccf1e1bb16abb0f45ef9a2dc9a63654d2d2cd199b80ad33e" +"checksum jsonrpc-ws-server 12.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "977ea40f077c027553e4112d750114b9e5cc7bcf5642512838abc2a9b322bd23" "checksum keccak 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" "checksum keccak-hasher 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "af672553b2abac1c86c29fd62c79880638b6abc91d96db4aa42a5baab2bc1ca9" "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" @@ -5660,31 +5810,34 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a91d884b6667cd606bb5a69aa0c99ba811a115fc68915e7056ec08a46e93199a" "checksum lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bc5729f27f159ddd61f4df6228e827e86643d4d3e7c32183cb30a1c08f604a14" "checksum lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b294d6fa9ee409a054354afc4352b0b9ef7ca222c69b8812cbea9e7d2bf3783f" -"checksum libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)" = "bedcc7a809076656486ffe045abeeac163da1b558e963a31e29fbfbeba916917" -"checksum libloading 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9c3ad660d7cb8c5822cd83d10897b0f1f1526792737a179e73896152f85b88c2" -"checksum libp2p 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0231edab431064b30b7749484a39735eb36492cef4658c372c9059e58c3003aa" -"checksum libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d1a3bad2ed26297112847678683dd221473a0d44297250b61f004e1b35e72493" -"checksum libp2p-core-derive 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3f765f103b680cbed910b02bfdbdcfce5b1142899c93e51acb960bf59b6f81b1" -"checksum libp2p-dns 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4b129d20cc8cbb6ce5da8361045649c024659173e246c5dfbf20ae06071c046a" -"checksum libp2p-floodsub 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "70d68816b8435d6788399416eb2f0a6974fb1d15c4be5c30141f87c8e81746df" -"checksum libp2p-identify 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "718ca645a065fd70855ca6042a7df686c24cd21add750c37a82c811fbd1e5c43" -"checksum libp2p-kad 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bbe27c623a6a720efd5d704347838972062f89149a9c3cd149748da60bdcd3e0" -"checksum libp2p-mdns 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c9bc1a5d85f4812cae6367b49a432763fe28997bac7c530dc55b70ec18a78aa7" -"checksum libp2p-mplex 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fe5a858342a1cc89464474f7edc4bae1da649b9c823a3e04d9fb494493601746" -"checksum libp2p-noise 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc6b5185c50a52a12e7bbe2ee7799059e24de4e52ab25edbfd26c8ab8515d317" -"checksum libp2p-ping 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7905c1431ad115bee83405770629a27d6f17153ad02ec9670a7347998ef20e22" -"checksum libp2p-plaintext 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cc17626763ded57da8fed73187c2d9f6ebb89d30838673c430315bf560c7e4db" -"checksum libp2p-ratelimit 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2409d08b809ab1a74269597f7da2829d117cc11b9ed3343af33fc20831619726" -"checksum libp2p-secio 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "258cdc6742945c8f6402997bbbf36733588e2db18e5a0014da6d46e3ccfb92cf" -"checksum libp2p-tcp 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1b5691e2ba2720d42bd1e93d6b90239fa9235c1956ef6a5f1dd499a7ae2767be" -"checksum libp2p-uds 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c9ab0b9ca050105fd94229c48911c0c84aef4d6b86a53d1b6df81d938354e47e" -"checksum libp2p-websocket 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "81692c3141a9aefd84f4faffdc93985af3858ef82ed7fe8185e6b27437b36183" -"checksum libp2p-yamux 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5e6ff51a5b2056bacee1c9f2ed8455cdf3c5c619261ddb4efc783119130aaf52" -"checksum librocksdb-sys 5.17.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7dfb546562f9b450237bb8df7a31961849ee9fb1186d9e356db1d7a6b7609ff2" +"checksum libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)" = "6281b86796ba5e4366000be6e9e18bf35580adf9e63fbe2294aadb587613a319" +"checksum libloading 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a5692f82b51823e27c4118b3e5c0d98aee9be90633ebc71ad12afef380b50219" +"checksum libp2p 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6abde4e6fc777dc06ae2a15202ddedb1a38d7c71ed16bc10fa704b03f73aec37" +"checksum libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b4ceb4791289534d4c1ad8e4bd3c6f06d3670efa55ce71482951a287df93ddd1" +"checksum libp2p-core-derive 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "851a59dcaab66c96777ae0cace96de88a700243c3b8360ab51c7e093f3727066" +"checksum libp2p-deflate 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "902b44e92e1f8b7e697b3a186d15c841e0e38037f14286513207a5407650a635" +"checksum libp2p-dns 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "71a6630a84552b39e5f752e1f6a951d31f3211079465d2e7af73491b6f48fc3f" +"checksum libp2p-floodsub 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9fced4da0c31e0dc8a759472c65fab41db40c01de2d93bc45e1431c13f0564f0" +"checksum libp2p-identify 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1ba5e882d72c71cdf77f45ab68dd715451d3b78a23085f8d385c7a31ec1b4272" +"checksum libp2p-kad 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d71966dbbb4cedcfcdb1d4c87d5dbb6f3f07b465d1ca74f2624256669997d1f2" +"checksum libp2p-mdns 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cdbdaea6f0049cc09ba5db00308f5b93105a8a33b65ba2e36bd35da707850ea2" +"checksum libp2p-mplex 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b351bfd67e97154e7b60f62402237671486c8a89f83eabdb6838f37d4d5f006" +"checksum libp2p-noise 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "44324032b2f9260d2b862c741d79d250dc02298dbba56354a992528a826ee2d5" +"checksum libp2p-ping 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e1ac43ffd01de4210cf1b969bbb55a008c77f9ec22b74df26a6590bb6bd4c93f" +"checksum libp2p-plaintext 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0506e10770bcbcb59f2a6154ce93c8fd5cb9730b6ceb5aa1463164af1fd0b9c6" +"checksum libp2p-ratelimit 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3886b79a35c0348497bab763517a9a2b4965173f4b4c7438d59f1e4dcf5122ff" +"checksum libp2p-secio 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b811272e5cd86d39bd71fb94687025d9802b13daf0998ebe0d3f2885c636c51a" +"checksum libp2p-tcp 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b2c54cb75f17557de6ce0149aa03e729455e2d240f84d854272bc4b11012a324" +"checksum libp2p-uds 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fbedf4a1e72a5f67523915414e9e12d71d128731873f0f24d8b878398fb47aa4" +"checksum libp2p-wasm-ext 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d0c1f615b56aa2a6f4ec07bf9667be9fff8877b9c5bd5335601af47490eda341" +"checksum libp2p-websocket 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a0d1bfe60577558f48a9fdf9f35c0ee2dc5baa01f685ff847d3b5cf4f12ee135" +"checksum libp2p-yamux 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bf4bfc7ff127cd622502dbe56f10513dd6776b970e33d8ebb6e367f0752324f6" +"checksum librocksdb-sys 5.18.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d19778314deaa7048f2ea7d07b8aa12e1c227acebe975a37eeab6d2f8c74e41b" "checksum libsecp256k1 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "688e8d65e495567c2c35ea0001b26b9debf0b4ea11f8cccc954233b75fc3428a" "checksum linked-hash-map 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ae91b68aebc4ddb91978b11a1b02ddd8602a05ec19002801c5666000e05e0f83" "checksum linked_hash_set 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3c7c91c4c7bbeb4f2f7c4e5be11e6a05bd6830bc37249c47ce1ad86ad453ff9c" "checksum lock_api 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "62ebf1391f6acad60e5c8b43706dde4582df75c06698ab44511d15016bc2442c" +"checksum lock_api 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ed946d4529956a20f2d63ebe1b69996d5a2137c91913fe3ebbeff957f5bca7ff" "checksum log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b" "checksum log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c84ec4b527950aa83a329754b01dbe3f58361d1c5efacd1f6d68c494d08a17c6" "checksum lru-cache 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "31e24f1ad8321ca0e8a1e0ac13f23cb668e6f5466c2c57319f6a5cf1cc8e3b1c" @@ -5693,66 +5846,70 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0f9dc261e2b62d7a622bf416ea3c5245cdd5d9a7fcc428c0d06804dfce1775b3" "checksum memory-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7623b01a4f1b7acb7cf8e3f678f05e15e6ae26cb0b738dfeb5cc186fd6b82ef4" "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 merlin 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8c39467de91b004f5b9c06fac5bbc8e7d28309a205ee66905166b70804a71fea" "checksum mime 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "ba626b8a6de5da682e1caa06bdb42a335aee5a84db8e5046a3e8ab17ba0a3ae0" -"checksum mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)" = "71646331f2619b1026cc302f87a2b8b648d5c6dd6937846a16cc8ce0f347f432" +"checksum miniz-sys 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "1e9e3ae51cea1576ceba0dde3d484d30e6e5b86dee0b2d412fe3a16a15c98202" +"checksum miniz_oxide 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c468f2369f07d651a5d0bb2c9079f8488a66d5466efe42d0c5c6466edcb7f71e" +"checksum miniz_oxide_c_api 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b7fe927a42e3807ef71defb191dc87d4e24479b221e67015fe38ae2b7b447bab" +"checksum mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)" = "83f51996a3ed004ef184e16818edc51fadffe8e7ca68be67f9dee67d84d0ff23" "checksum mio-extras 2.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "46e73a04c2fa6250b8d802134d56d554a9ec2922bf977777c805ea5def61ce40" "checksum mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)" = "966257a94e196b11bb43aca423754d87429960a768de9414f3691d6957abf125" "checksum miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919" "checksum multistream-select 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f989d40aab0ed0d83c1cdb4856b5790e980b96548d1a921f280e985eb049f38d" "checksum names 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ef320dab323286b50fb5cdda23f61c796a72a89998ab565ca32525c5c556f2da" -"checksum native-tls 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ff8e08de0070bbf4c31f452ea2a70db092f36f6f2e4d897adf5674477d488fb2" +"checksum native-tls 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4b2df1a4c22fd44a62147fd8f13dd0f95c9d8ca7b2610299b2a2f9cf8964274e" "checksum net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "42550d9fb7b6684a6d404d9fa7250c2eb2646df731d1c06afc06dcee9e1bcf88" -"checksum nix 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)" = "46f0f3210768d796e8fa79ec70ee6af172dacbe7147f5e69be5240a47778302b" +"checksum nix 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6c722bee1037d430d0f8e687bbdbf222f27cc6e4e68d5caf630857bb2b6dbdce" "checksum nodrop 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "2f9667ddcc6cc8a43afc9b7917599d7216aa09c463919ea32c59ed6cac8bc945" "checksum nohash-hasher 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0d138afcce92d219ccb6eb53d9b1e8a96ac0d633cfd3c53cd9856d96d1741bb8" "checksum nom 4.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2ad2a91a8e869eeb30b9cb3119ae87773a8f4ae617f41b1eb9c154b2905f7bd6" -"checksum num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)" = "e83d528d2677f0518c570baf2b7abdcf0cd2d248860b68507bdcb3e91d4c0cea" -"checksum num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0b3a5d7cc97d6d30d8b9bc8fa19bf45349ffe46241e8816f50f62f6d6aaabee1" -"checksum num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1a23f0ed30a54abaa0c7e83b1d2d87ada7c3c23078d1d87815af3e3b6385fbba" +"checksum num-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)" = "b85e541ef8255f6cf42bbfe4ef361305c6c135d10919ecc26126c4e5ae94bc09" +"checksum num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "6ba9a427cfca2be13aa6f6403b0b7e7368fe982bfa16fccc450ce74c46cd9b32" +"checksum num_cpus 1.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "bcef43580c035376c0705c42792c294b66974abbfd2789b511784023f71f3273" "checksum numtoa 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b8f8bdf33df195859076e54ab11ee78a1b208382d3a26ec40d142ffc1ecc49ef" "checksum ole32-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5d2c49021782e5233cd243168edfa8037574afed4eba4bbaf538b3d8d1789d8c" "checksum once_cell 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "532c29a261168a45ce28948f9537ddd7a5dd272cc513b3017b1e82a88f962c37" "checksum opaque-debug 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "93f5bb2e8e8dec81642920ccff6b61f1eb94fa3020c5a325c9851ff604152409" -"checksum openssl 0.10.20 (registry+https://github.com/rust-lang/crates.io-index)" = "5a0d6b781aac4ac1bd6cafe2a2f0ad8c16ae8e1dd5184822a16c50139f8838d9" +"checksum openssl 0.10.23 (registry+https://github.com/rust-lang/crates.io-index)" = "97c140cbb82f3b3468193dd14c1b88def39f341f68257f8a7fe8ed9ed3f628a5" "checksum openssl-probe 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "77af24da69f9d9341038eba93a073b1fdaaa1b788221b00a69bce9e762cb32de" -"checksum openssl-sys 0.9.43 (registry+https://github.com/rust-lang/crates.io-index)" = "33c86834957dd5b915623e94f2f4ab2c70dd8f6b70679824155d5ae21dbd495d" +"checksum openssl-sys 0.9.47 (registry+https://github.com/rust-lang/crates.io-index)" = "75bdd6dbbb4958d38e47a1d2348847ad1eb4dc205dc5d37473ae504391865acc" "checksum output_vt100 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "53cdc5b785b7a58c5aad8216b3dfa114df64b0b06ae6e1501cef91df2fbdf8f9" "checksum owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cdf84f41639e037b484f93433aa3897863b561ed65c6e59c7073d7c561710f37" "checksum owning_ref 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "49a4b8ea2179e6a2e27411d3bca09ca6dd630821cf6894c6c7c8467a8ee7ef13" "checksum parity-bytes 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)" = "" "checksum parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dcb43c05fb71c03b4ea7327bf15694da1e0f23f19d5b1e95bab6c6d74097e336" "checksum parity-codec-derive 3.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "00a486fd383382ddcb2de928364b1f82571c1e48274fc43b7667a4738ee4056c" -"checksum parity-crypto 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cf1b9c063d87e1507cb3807493c8d21859ef23b5414b39f81c53f0ba267d64c1" -"checksum parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "18a130a727008cfcd1068a28439fe939897ccad28664422aeca65b384d6de6d0" -"checksum parity-multihash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05d6a68e07ab34a9e87bd8dd4936f6bb5be21e4f6dbcdbaf04d8e854eba0af01" +"checksum parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "045b3c7af871285146300da35b1932bb6e4639b66c7c98e85d06a32cbc4e8fa7" +"checksum parity-multihash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "eb83358a0c05e52c44d658981fec2d146d3516d1adffd9e553684f8c8e9e8fa5" +"checksum parity-send-wrapper 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aa9777aa91b8ad9dd5aaa04a9b6bcb02c7f1deb952fca5a66034d5e63afc5c6f" "checksum parity-wasm 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)" = "511379a8194230c2395d2f5fa627a5a7e108a9f976656ce723ae68fca4097bfc" -"checksum parity-ws 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2fec5048fba72a2e01baeb0d08089db79aead4b57e2443df172fb1840075a233" "checksum parking_lot 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d4d05f1349491390b1730afba60bb20d55761bef489a954546b58b4b34e1e2ac" "checksum parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f0802bff09003b291ba756dc7e79313e51cc31667e94afbe847def490424cde5" "checksum parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ab41b4aed082705d1056416ae4468b6ea99d52599ecf3169b00088d43113e337" +"checksum parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fa7767817701cce701d5585b9c4db3cdd02086398322c1d7e8bf5094a96a2ce7" "checksum parking_lot_core 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "4db1a8ccf734a7bce794cc19b3df06ed87ab2f3907036b693c68f56b4d4537fa" "checksum parking_lot_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ad7f7e6ebdc79edff6fdcb87a55b620174f7a989e3eb31b65231f4af57f00b8c" "checksum parking_lot_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "94c8c7923936b28d546dfd14d4472eaf34c99b14e1c973a32b3e6d4eb04298c9" +"checksum parking_lot_core 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cb88cb1cb3790baa6776844f968fea3be44956cf184fa1be5a03341f5491278c" "checksum paste 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "1f4a4a1c555c6505821f9d58b8779d0f630a6b7e4e1be24ba718610acf01fa79" "checksum paste-impl 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "26e796e623b8b257215f27e6c80a5478856cae305f5b59810ff9acdaa34570e6" -"checksum pbkdf2 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "0c09cddfbfc98de7f76931acf44460972edb4023eb14d0c6d4018800e552d8e0" "checksum pbkdf2 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "006c038a43a45995a9670da19e67600114740e8511d4333bf97a56e66a7542d9" "checksum peeking_take_while 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" "checksum percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" "checksum pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)" = "676e8eb2b1b4c9043511a9b7bea0915320d7e502b0a079fb03f9635a5252b18c" "checksum pretty_assertions 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3a029430f0d744bc3d15dd474d591bed2402b645d024583082b9f63bb936dac6" "checksum pretty_assertions 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3f81e1644e1b54f5a68959a29aa86cde704219254669da328ecfdf6a1f09d427" -"checksum primitive-types 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "edb92f1ebfc177432c03287b15d48c202e6e2c95993a7af3ba039abb43b1492e" -"checksum proc-macro-crate 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4c6cf4e5b00300d151dfffae39f529dfa5188f42eeb14201229aa420d6aad10c" +"checksum primitive-types 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "6e8612a8dc70f26276fed6131c153ca277cf275ee0a5e2a50cd8a69c697beb8f" +"checksum proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "e10d4b51f154c8a7fb96fd6dad097cb74b863943ec010ac94b9fd1be8861fe1e" "checksum proc-macro-hack 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2c725b36c99df7af7bf9324e9c999b9e37d92c8f8caf106d82e1d7953218d2d8" -"checksum proc-macro-hack 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)" = "6a9bed9ebc40cf53e3a76d7486c54d05002eae6485b2711ab9104476fb2eb8bc" +"checksum proc-macro-hack 0.5.7 (registry+https://github.com/rust-lang/crates.io-index)" = "0c1dd4172a1e1f96f709341418f49b11ea6c2d95d53dca08c0f74cbd332d9cf3" "checksum proc-macro-hack-impl 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2b753ad9ed99dd8efeaa7d2fb8453c8f6bc3e54b97966d35f1bc77ca6865254a" -"checksum proc-macro2 0.4.28 (registry+https://github.com/rust-lang/crates.io-index)" = "ba92c84f814b3f9a44c5cfca7d2ad77fa10710867d2bbb1b3d175ab5f47daa12" -"checksum protobuf 2.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bc7badf647ae2fa27ba51c218e347386c88cc604fcfe71f2aba0ad017f3f2b75" +"checksum proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)" = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" +"checksum protobuf 2.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7e9076cae823584ab4d8fab3a111658d1232faf106611dc8378161b7d062b628" "checksum pwasm-utils 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "efb0dcbddbb600f47a7098d33762a00552c671992171637f5bb310b37fe1f0e4" "checksum quick-error 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "5fb6ccf8db7bbcb9c2eae558db5ab4f3da1c2a87e4e597ed394726bc8ea6ca1d" "checksum quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9274b940887ce9addde99c4eee6b5c44cc494b182b97e73dc8ffdcb3397fd3f0" +"checksum quickcheck 0.8.5 (registry+https://github.com/rust-lang/crates.io-index)" = "9c35d9c36a562f37eca96e79f66d5fd56eefbc22560dacc4a864cabd2d277456" "checksum quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)" = "faf4799c5d274f3868a4aae320a0a182cbd2baee377b378f080e16a23e9d80db" "checksum rand 0.3.23 (registry+https://github.com/rust-lang/crates.io-index)" = "64ac302d8f83c0c1974bf758f6b041c6c8ada916fbb44a609158ca8b064cc76c" "checksum rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "552840b97013b1a26992c11eac34bdd778e464601a4c2054b5f0bff7c6761293" @@ -5763,7 +5920,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d0e7a549d590831370895ab7ba4ea0c1b6b011d106b5ff2da6eee112615e6dc0" "checksum rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4" "checksum rand_isaac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08" -"checksum rand_jitter 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7b9ea758282efe12823e0d952ddb269d2e1897227e464919a554f2a03ef1b832" +"checksum rand_jitter 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "1166d5c91dc97b88d1decc3285bb0a99ed84b05cfd0bc2341bdf2d43fc41e39b" "checksum rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7b75f676a1e053fc562eafbb47838d67c84801e38fc1ba459e8f180deabd5071" "checksum rand_pcg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "abf9b09b01790cfe0364f52bf32995ea3c39f4d2dd011eac241d2914146d0b44" "checksum rand_xorshift 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cbf7e9e623549b0e21f6e97cf8ecf247c1a8fd2e8a992ae265314300b2455d5c" @@ -5774,85 +5931,81 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum redox_syscall 0.1.54 (registry+https://github.com/rust-lang/crates.io-index)" = "12229c14a0f65c4f1cb046a3b52047cdd9da1f4b30f8a39c5063c8bae515e252" "checksum redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76" "checksum ref_thread_local 0.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d813022b2e00774a48eaf43caaa3c20b45f040ba8cbf398e2e8911a06668dbe6" -"checksum regex 1.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "8f0a0bcab2fd7d1d7c54fa9eae6f43eddeb9ce2e7352f8518a814a4f65d60c58" -"checksum regex-syntax 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)" = "dcfd8681eebe297b81d98498869d4aae052137651ad7b96822f09ceb690d0a96" +"checksum regex 1.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "0b2f0808e7d7e4fb1cb07feb6ff2f4bc827938f24f8c2e6a3beb7370af544bdd" +"checksum regex-syntax 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)" = "9d76410686f9e3a17f06128962e0ecc5755870bb890c34820c7af7f1db2e1d48" "checksum remove_dir_all 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3488ba1b9a2084d38645c4c08276a1752dcbf2c7130d74f1569681ad5d2799c5" "checksum rhododendron 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ae9381ed76c1ec4e8994f1f7d2c6d7e33eed3ff7176e16fece09c2e993fc4a5a" "checksum ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)" = "426bc186e3e95cac1e4a4be125a4aca7e84c2d616ffc02244eef36e2a60a093c" -"checksum ripemd160 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ad5112e0dbbb87577bfbc56c42450235e3012ce336e29c5befd7807bd626da4a" "checksum rocksdb 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f1651697fefd273bfb4fd69466cc2a9d20de557a0213b97233b22b5e95924b5e" -"checksum rustc-demangle 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "ccc78bfd5acd7bf3e89cffcf899e5cb1a52d6fafa8dec2739ad70c9577a57288" +"checksum rpassword 3.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c34fa7bcae7fca3c8471e8417088bbc3ad9af8066b0ecf4f3c0d98a0d772716e" +"checksum rustc-demangle 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)" = "a7f4dccf6f4891ebcc0c39f9b6eb1a83b9bf5d747cb439ec6fba4f3b977038af" "checksum rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "403bb3a286107a04825a5f82e1270acc1e14028d3d554d7a1e08914549575ab8" "checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" -"checksum rw-stream-sink 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d548a40fe17c3a77d54b82457b79fcc9b8a288d509ca20fbf5aa1dac386d22d6" -"checksum ryu 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "eb9e9b8cde282a9fe6a42dd4681319bfb63f121b8a8ee9439c6f4107e58a46f7" +"checksum rustls 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f271e3552cd835fa28c541c34a7e8fdd8cdff09d77fe4eb8f6c42e87a11b096e" +"checksum rw-stream-sink 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2f9cbe61c20455d3015b2bb7be39e1872310283b8e5a52f5b242b0ac7581fe78" +"checksum ryu 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "b96a9549dc8d48f2c283938303c4b5a77aa29bfbc5b54b084fb1630408899a8f" "checksum safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7f7bf422d23a88c16d5090d455f182bc99c60af4df6a345c63428acf5129e347" "checksum safemem 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8dca453248a96cb0749e36ccdfe2b0b4e54a61bfef89fb97ec621eb8e0a93dd9" "checksum same-file 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8f20c4be53a8a1ff4c1f1b2bd14570d2f634628709752f0702ecdd2b3f9a5267" "checksum schannel 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)" = "f2f6abf258d99c3c1c5c2131d99d064e94b7b3dd5f416483057f308fea253339" "checksum schnorrkel 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b5eff518f9bed3d803a0d002af0ab96339b0ebbedde3bec98a684986134b7a39" "checksum scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "94258f53601af11e6a49f722422f6e3425c52b06245a5cf9bc09908b174f5e27" -"checksum scrypt 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8570c5e2fa69cb29d492fd4e9974b6b5facb5a888e1c6da630d4a3cd7ebfef4a" -"checksum secp256k1 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bfaccd3a23619349e0878d9a241f34b1982343cdf67367058cd7d078d326b63e" -"checksum security-framework 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bfab8dda0e7a327c696d893df9ffa19cadc4bd195797997f5223cf5831beaf05" -"checksum security-framework-sys 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3d6696852716b589dff9e886ff83778bb635150168e83afa8ac6b8a78cb82abc" +"checksum scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b42e15e59b18a828bbf5c58ea01debb36b9b096346de35d941dcb89009f24a0d" +"checksum sct 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2f5adf8fbd58e1b1b52699dc8bed2630faecb6d8c7bee77d009d6bbe4af569b9" +"checksum security-framework 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "eee63d0f4a9ec776eeb30e220f0bc1e092c3ad744b2a379e3993070364d3adc2" +"checksum security-framework-sys 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9636f8989cbf61385ae4824b98c1aaa54c994d7d8b41f11c601ed799f0549a56" "checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" "checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" "checksum send_wrapper 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a0eddf2e8f50ced781f288c19f18621fa72a3779e3cb58dbf23b07469b0abeb4" -"checksum serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)" = "aa5f7c20820475babd2c077c3ab5f8c77a31c15e16ea38687b4c02d3e48680f4" -"checksum serde_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)" = "58fc82bec244f168b23d1963b45c8bf5726e9a15a9d146a067f9081aeed2de79" +"checksum serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)" = "32746bf0f26eab52f06af0d0aa1984f641341d06d8d673c693871da2d188c9be" +"checksum serde_derive 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)" = "46a3223d0c9ba936b61c0d2e3e559e3217dbfb8d65d06d26e8b3c25de38bae3e" "checksum serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)" = "5a23aa71d4a4d43fdbfaac00eff68ba8a06a51759a89ac3304323e800c4dd40d" "checksum sha-1 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "23962131a91661d643c98940b20fcaffe62d776a823247be80a48fcb8b6fce68" "checksum sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d" "checksum sha2 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7d963c78ce367df26d7ea8b8cc655c651b42e8a1e584e869c1e17dae3ccb116a" -"checksum sha2 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9eb6be24e4c23a84d7184280d2722f7f2731fcdd4a9d886efbfe4413e4847ea0" "checksum sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b4d8bfd0e469f417657573d8451fb33d16cfe0989359b93baf3a1ffc639543d" -"checksum sha3 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "34a5e54083ce2b934bf059fdf38e7330a154177e029ab6c4e18638f2f624053a" +"checksum sha3 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dd26bc0e7a2e3a7c959bc494caf58b72ee0c71d67704e9520f736ca7e4853ecf" "checksum shell32-sys 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9ee04b46101f57121c9da2b151988283b6beb79b34f5bb29a58ee48cb695122c" "checksum slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" "checksum slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1e1a2eec401952cd7b12a84ea120e2d57281329940c3f93c2bf04f462539508e" -"checksum slog-async 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e544d16c6b230d84c866662fe55e31aacfca6ae71e6fc49ae9a311cb379bfc2f" "checksum slog-json 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ddc0d2aff1f8f325ef660d9a0eb6e6dcd20b30b3f581a5897f58bf42d061c37a" "checksum slog-scope 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "60c04b4726fa04595ccf2c2dad7bcd15474242c4c5e109a8a376e8a2c9b1539a" "checksum slog_derive 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9eff3b513cf2e0d1a60e1aba152dc72bedc5b05585722bb3cebd7bcb1e31b98f" -"checksum smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)" = "c4488ae950c49d403731982257768f48fada354a5203fe81f9bb6f43ca9002be" +"checksum smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)" = "ab606a9c5e214920bb66c458cd7be8ef094f813f20fe77a54cc7dbfff220d4b7" "checksum snow 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5a64f02fd208ef15bd2d1a65861df4707e416151e1272d02c8faafad1c138100" +"checksum soketto 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8cf3ae22c0bce5437c7dce6a2b00e492c19da1feb21ad64a7b6fd7058438c3f2" "checksum sourcefile 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4bf77cb82ba8453b42b6ae1d692e4cdc92f9a47beaf89a847c8be83f4e328ad3" "checksum spin 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "44363f6f51401c34e7be73db0db371c04705d35efbe9f7d6082e03a921a32c55" "checksum stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dba1a27d3efae4351c8051072d619e3ade2820635c3958d826bfea39d59b54c8" "checksum static_assertions 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "c19be23126415861cb3a23e501d34a708f7f9b2183c5252d690941c2e69199d5" "checksum static_slice 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "92a7e0c5e3dfb52e8fbe0e63a1b947bbb17b4036408b151353c4491374931362" -"checksum stdweb 0.4.16 (registry+https://github.com/rust-lang/crates.io-index)" = "b2c1d5ac2f828b2877a6be60a51b8e3ebb57b56862b10be1a72676ca8900b69d" -"checksum stdweb-derive 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0e21ebd9179de08f2300a65454268a17ea3de204627458588c84319c4def3930" -"checksum stdweb-internal-macros 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "e68f7d08b76979a43e93fe043b66d2626e35d41d68b0b85519202c6dd8ac59fa" -"checksum stdweb-internal-runtime 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "d52317523542cc0af5b7e31017ad0f7d1e78da50455e38d5657cd17754f617da" "checksum stream-cipher 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8861bc80f649f5b4c9bd38b696ae9af74499d479dbfb327f0607de6b326a36bc" -"checksum string 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "b639411d0b9c738748b5397d5ceba08e648f4f1992231aa859af1a017f31f60b" +"checksum string 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d0bbfb8937e38e34c3444ff00afb28b0811d9554f15c5ad64d12b0308d1d1995" "checksum strsim 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bb4f380125926a99e52bc279241539c018323fab05ad6368b56f93d9369ff550" -"checksum structopt 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)" = "3d0760c312538987d363c36c42339b55f5ee176ea8808bbe4543d484a291c8d1" -"checksum structopt-derive 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)" = "528aeb7351d042e6ffbc2a6fb76a86f9b622fdf7c25932798e7a82cb03bc94c6" +"checksum structopt 0.2.16 (registry+https://github.com/rust-lang/crates.io-index)" = "fa19a5a708e22bb5be31c1b6108a2a902f909c4b9ba85cba44c06632386bc0ff" +"checksum structopt-derive 0.2.16 (registry+https://github.com/rust-lang/crates.io-index)" = "c6d59d0ae8ef8de16e49e3ca7afa16024a3e0dfd974a75ef93fdc5464e34523f" "checksum strum 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1810e25f576e7ffce1ff5243b37066da5ded0310b3274c20baaeccb1145b2806" "checksum strum_macros 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "572a2f4e53dd4c3483fd79e5cc10ddd773a3acb1169bbfe8762365e107110579" "checksum substrate-bip39 0.2.1 (git+https://github.com/paritytech/substrate-bip39)" = "" "checksum subtle 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2d67a5a62ba6e01cb2192ff309324cb4875d0c451d55fe2319433abe7a05a8ee" -"checksum subtle 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "702662512f3ddeb74a64ce2fbbf3707ee1b6bb663d28bb054e0779bbc720d926" -"checksum syn 0.15.32 (registry+https://github.com/rust-lang/crates.io-index)" = "846620ec526c1599c070eff393bfeeeb88a93afa2513fc3b49f1fea84cf7b0ed" -"checksum synstructure 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "73687139bf99285483c96ac0add482c3776528beac1d97d444f6e91f203a2015" -"checksum sysinfo 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b5a0cb7899e248ed0baa6ef6f8406352523c2f99bc7c4b1800f4cd6d5dde99eb" -"checksum take_mut 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f764005d11ee5f36500a149ace24e00e3da98b0158b3e2d53a7495660d3f4d60" +"checksum subtle 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "01dca13cf6c3b179864ab3292bd794e757618d35a7766b7c46050c614ba00829" +"checksum syn 0.15.35 (registry+https://github.com/rust-lang/crates.io-index)" = "641e117d55514d6d918490e47102f7e08d096fdde360247e4a10f7a91a8478d3" +"checksum synstructure 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)" = "02353edf96d6e4dc81aea2d8490a7e9db177bf8acb0e951c24940bf866cb313f" +"checksum sysinfo 0.8.5 (registry+https://github.com/rust-lang/crates.io-index)" = "1cf62641ed7e88e20242b948d17b9fcc37e80b5599cf09cde190d6d4bb4bf289" "checksum target_info 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c63f48baada5c52e65a29eef93ab4f8982681b67f9e8d29c7b05abcfec2b9ffe" "checksum tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "15f2b5fb00ccdf689e0149d1b1b3c03fead81c2b37735d812fa8bddbbf41b6d8" -"checksum tempfile 3.0.7 (registry+https://github.com/rust-lang/crates.io-index)" = "b86c784c88d98c801132806dadd3819ed29d8600836c4088e855cdf3e178ed8a" -"checksum termcolor 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4096add70612622289f2fdcdbd5086dc81c1e2675e6ae58d6c4f62a16c6d7f2f" +"checksum tempfile 3.0.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7dc4738f2e68ed2855de5ac9cdbe05c9216773ecde4739b2f095002ab03a13ef" +"checksum termcolor 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "96d6098003bde162e4277c70665bd87c326f5a0c3f3fbfb285787fa482d54e6e" "checksum termion 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dde0593aeb8d47accea5392b39350015b5eccb12c0d98044d856983d89548dea" "checksum textwrap 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "307686869c93e71f94da64286f9a9524c0f308a9e1c87a583de8e9c9039ad3f6" "checksum thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b" "checksum time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "db8dcfca086c1143c9270ac42a2bbd8a7ee477b78ac8e45b19abfb0cbede4b6f" "checksum tiny-bip39 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c1c5676413eaeb1ea35300a0224416f57abc3bd251657e0fafc12c47ff98c060" -"checksum tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e9175261fbdb60781fcd388a4d6cc7e14764a2b629a7ad94abb439aed223a44f" -"checksum tinytemplate 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7655088894274afb52b807bd3c87072daa1fedd155068b8705cabfd628956115" +"checksum tiny-keccak 1.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "dbbdebb0b801c7fa4260b6b9ac5a15980276d7d7bcc2dc2959a7c4dc8b426a1a" +"checksum tinytemplate 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4574b75faccaacddb9b284faecdf0b544b80b6b294f3d062d325c5726a209c20" "checksum tk-listen 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5462b0f968c0457efe38fcd2df7e487096b992419e4f5337b06775a614bbda4b" -"checksum tokio 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)" = "cec6c34409089be085de9403ba2010b80e36938c9ca992c4f67f407bb13db0b1" +"checksum tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)" = "ec2ffcf4bcfc641413fa0f1427bf8f91dfc78f56a6559cbf50e04837ae442a87" +"checksum tokio-buf 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8fb220f46c53859a4b7ec083e41dec9778ff0b1851c0942b211edb89e0ccdc46" "checksum tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5c501eceaf96f0e1793cf26beb63da3d11c738c4a943fdf3746d81d64684c39f" "checksum tokio-current-thread 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "d16217cad7f1b840c5a97dfb3c43b0c871fef423a6e8d2118c604e843662a443" "checksum tokio-dns-unofficial 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "82c65483db54eb91b4ef3a9389a3364558590faf30ce473141707c0e16fda975" @@ -5860,38 +6013,40 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum tokio-fs 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "3fe6dc22b08d6993916647d108a1a7d15b9cd29c4f4496c62b92c45b5041b7af" "checksum tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "5090db468dad16e1a7a54c8c67280c5e4b544f3d3e018f0b913b400261f85926" "checksum tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "6af16bfac7e112bea8b0442542161bfc41cbfa4466b580bdda7d18cb88b911ce" -"checksum tokio-sync 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "5b2f843ffdf8d6e1f90bddd48da43f99ab071660cd92b7ec560ef3cdfd7a409a" +"checksum tokio-rustls 0.10.0-alpha.3 (registry+https://github.com/rust-lang/crates.io-index)" = "316fdbc899efec48b3b492bd0f339e6d81c4ee96a409257572147ec341943452" +"checksum tokio-sync 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2162248ff317e2bc713b261f242b69dbb838b85248ed20bb21df56d60ea4cae7" "checksum tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1d14b10654be682ac43efee27401d792507e30fd8d26389e1da3b185de2e4119" "checksum tokio-threadpool 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "72558af20be886ea124595ea0f806dd5703b8958e4705429dd58b3d8231f72f2" -"checksum tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)" = "2910970404ba6fa78c5539126a9ae2045d62e3713041e447f695f41405a120c6" +"checksum tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "f2106812d500ed25a4f38235b9cae8f78a09edf43203e16e59c3b769a342a60e" "checksum tokio-tls 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "354b8cd83825b3c20217a9dc174d6a0c67441a2fae5c41bcb1ea6679f6ae0f7c" -"checksum tokio-trace-core 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "350c9edade9830dc185ae48ba45667a445ab59f6167ef6d0254ec9d2430d9dd3" +"checksum tokio-trace-core 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a9c8a256d6956f7cb5e2bdfe8b1e8022f1a09206c6c2b1ba00f3b746b260c613" "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 toml 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b8c96d7873fa7ef8bdeb3a9cda3ac48389b4154f32b9803b4bc26220b677b039" "checksum traitobject 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "efd1f82c56340fdf16f2a953d7bda4f8fdffba13d93b00844c25572110b26079" "checksum trie-bench 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ba20f7d9865497ea46511860b43e05a44f4ac9a76ee089d34cd80a839a690264" "checksum trie-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1ba73747fd3a64ab531274c04cb588dfa9d30d972d62990831e63fbce2cfec59" "checksum trie-root 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "cfa2e20c4f1418ac2e71ddc418e35e1b56e34022e2146209ffdbf1b2de8b1bd9" -"checksum trie-standardmap 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e4e24277af05f38f3aaf03ac78e3a154be83f13db9c8ef0cb95bb1aa764a477b" +"checksum trie-standardmap 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ebaa4b340046196efad8872b2dffe585b5ea330230dc44ee14e399f77da29f51" "checksum try-lock 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e604eb7b43c06650e854be16a2a03155743d3752dd1c943f6829e26b7a36e382" +"checksum trybuild 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d1506db833ec4a139b8e3d2e88125d8999270cc944046ca1fb138f6bbfbc2e43" "checksum twofish 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712d261e83e727c8e2dbb75dacac67c36e35db36a958ee504f2164fc052434e1" -"checksum twox-hash 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "09871da9f15424236082e0b220fd404a4eb6bebc7205c67653701229234ac64c" +"checksum twox-hash 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6c7bcecad121018bdcd6b709fa2325b004878fcb3d3067934ce90749f0faff9a" "checksum typeable 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1410f6f91f21d1612654e7cc69193b0334f909dcf2c790c4826254fbb86f8887" "checksum typenum 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "612d636f949607bdf9b123b4a6f6d966dedf3ff669f7f045890d3a4a73948169" "checksum ucd-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "535c204ee4d8434478593480b8f86ab45ec9aae0e83c568ca81abf0fd0e88f86" -"checksum uint 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e7780bb27fd8a22295e0d9d53ae3be253f715a0dccb1808527f478f1c2603708" +"checksum uint 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2143cded94692b156c356508d92888acc824db5bffc0b4089732264c6fcf86d4" "checksum unicase 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7f4765f83163b74f957c797ad9253caf97f103fb064d3999aea9568d09fc8a33" -"checksum unicase 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "41d17211f887da8e4a70a45b9536f26fc5de166b81e2d5d80de4a17fd22553bd" +"checksum unicase 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a84e5511b2a947f3ae965dcb29b13b7b1691b6e7332cf5dbc1744138d5acb7f6" "checksum unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" "checksum unicode-normalization 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "141339a08b982d942be2ca06ff8b076563cbe223d1befd5450716790d44e2426" -"checksum unicode-segmentation 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "aa6024fc12ddfd1c6dbc14a80fa2324d4568849869b779f6bd37e5e4c03344d1" +"checksum unicode-segmentation 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1967f4cdfc355b37fd76d2a954fb2ed3871034eb4f26d60537d88795cfc332a9" "checksum unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "882386231c45df4700b275c7ff55b6f3698780a650026380e72dabe76fa46526" "checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" "checksum unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2c64cdf40b4a9645534a943668681bcb219faf51874d4b65d2e0abda1b10a2ab" "checksum untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "55cd1f4b4e96b46aeb8d4855db4a7a9bd96eeeb5c6a1ab54593328761642ce2f" "checksum url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a" -"checksum utf8-ranges 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "796f7e48bef87609f7ade7e06495a87d5cd06c7866e6a5cbfceffc558a243737" +"checksum utf8-ranges 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "9d50aa7650df78abf942826607c62468ce18d9019673d4a2ebe1865dbb96ffde" "checksum vcpkg 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "def296d3eb3b12371b2c7d0e83bfe1403e4db2d7a0bba324a12b21c4ee13143d" "checksum vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05c78687fb1a80548ae3250346c3db86a80a7cdd77bda190189f2d0a0987c81a" "checksum vergen 3.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "6aba5e34f93dc7051dfad05b98a18e9156f27e7b431fe1d2398cb6061c0a1dba" @@ -5899,20 +6054,23 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" "checksum wabt 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)" = "74e463a508e390cc7447e70f640fbf44ad52e1bd095314ace1fdf99516d32add" "checksum wabt-sys 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "a6265b25719e82598d104b3717375e37661d41753e2c84cde3f51050c7ed7e3c" -"checksum walkdir 2.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "9d9d7ed3431229a144296213105a390676cc49c9b6a72bd19f3176c98e129fa1" +"checksum walkdir 2.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "c7904a7e2bb3cdf0cf5e783f44204a85a37a93151738fa349f06680f59a98b45" "checksum want 0.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "797464475f30ddb8830cc529aaaae648d581f99e2036a928877dfde027ddf6b3" -"checksum wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "ffde3534e5fa6fd936e3260cd62cd644b8656320e369388f9303c955895e35d4" -"checksum wasm-bindgen-backend 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "40c0543374a7ae881cdc5d32d19de28d1d1929e92263ffa7e31712cc2d53f9f1" -"checksum wasm-bindgen-futures 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)" = "0ad171fc1f6e43f97d155d27f4ee5657bd8aa5cce7c497ef3a0a0c5b44618b2d" -"checksum wasm-bindgen-macro 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "f914c94c2c5f4c9364510ca2429e59c92157ec89429243bcc245e983db990a71" -"checksum wasm-bindgen-macro-support 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "9168c413491e4233db7b6884f09a43beb00c14d11d947ffd165242daa48a2385" -"checksum wasm-bindgen-shared 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "326c32126e1a157b6ced7400061a84ac5b11182b2cda6edad7314eb3ae9ac9fe" -"checksum wasm-bindgen-webidl 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "613dbf4d7d3bf10aeb212b35de14a8ef07222c26526d4f931061a83fc9e2a851" +"checksum wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)" = "b7ccc7b93cfd13e26700a9e2e41e6305f1951b87e166599069f77d10358100e6" +"checksum wasm-bindgen-backend 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)" = "1953f91b1608eb1522513623c7739f047bb0fed4128ce51a93f08e12cc314645" +"checksum wasm-bindgen-futures 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "fa1af11c73eca3dc8c51c76ea475a4416e912da6402064a49fc6c0214701866d" +"checksum wasm-bindgen-macro 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)" = "0f69da5696545d7ca6607a2e4b1a0edf5a6b36b2c49dbb0f1df6ad1d92884047" +"checksum wasm-bindgen-macro-support 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)" = "2d4246f3bc73223bbb846f4f2430a60725826a96c9389adf715ed1d5af46dec6" +"checksum wasm-bindgen-shared 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)" = "c08381e07e7a79e5e229ad7c60d15833d19033542cc5dd91d085df59d235f4a6" +"checksum wasm-bindgen-webidl 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)" = "1f42ff7adb8102bf5ad8adbc45b1635c520c8175f9fdf6eb2c54479d485d435a" +"checksum wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ad9ac33c834103916e373d648adf65f58c83fb3d8a0f3e6b9a64bca7253a4dca" "checksum wasmi 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "aebbaef470840d157a5c47c8c49f024da7b1b80e90ff729ca982b2b80447e78b" "checksum wasmi-validation 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ab380192444b3e8522ae79c0a1976e42a82920916ccdfbce3def89f456ea33f3" -"checksum web-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)" = "24129e4be2281109b3e15a328d3d7f233ee232a5405f75ba1e9bb59a25ebc4d4" -"checksum websocket 0.22.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7cc2d74d89f9df981ab41ae624e33cf302fdf456b93455c6a31911a99c9f0bb8" -"checksum weedle 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "26a4c67f132386d965390b8a734d5d10adbcd30eb5cc74bd9229af8b83f10044" +"checksum web-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "540b8259eb242ff3a566fa0140bda03a4ece4e5c226e1284b5c95dddcd4341f6" +"checksum webpki 0.19.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4f7e1cd7900a3a6b65a3e8780c51a3e6b59c0e2c55c6dc69578c288d69f7d082" +"checksum webpki-roots 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c10fa4212003ba19a564f25cd8ab572c6791f99a03cc219c13ed35ccab00de0e" +"checksum websocket 0.22.4 (registry+https://github.com/rust-lang/crates.io-index)" = "0adcd2a64c5746c9702b354a1b992802b0c363df1dfa324a74cb7aebe10e0cbf" +"checksum weedle 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bcc44aa200daee8b1f3a004beaf16554369746f1b4486f0cf93b0caf8a3c2d1e" "checksum which 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b57acb10231b9493c8472b20cb57317d0679a49e0bdbee44b3b803a6473af164" "checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" "checksum winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "f10e386af2b13e47c89e7236a7a14a086791a2b88ebad6df9bf42040195cf770" @@ -5921,10 +6079,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7168bab6e1daee33b4557efd0e95d5ca70a03706d39fa5f3fe7a236f584b03c9" "checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" "checksum wincolor 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "561ed901ae465d6185fa7864d63fbd5720d0ef718366c9a4dc83cf6170d7e9ba" -"checksum ws 0.7.9 (registry+https://github.com/rust-lang/crates.io-index)" = "329d3e6dd450a9c5c73024e1047f0be7e24121a68484eb0b5368977bee3cf8c3" +"checksum ws 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ec91ea61b83ce033c43c06c52ddc7532f465c0153281610d44c58b74083aee1a" "checksum ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" "checksum x25519-dalek 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7ee1585dc1484373cbc1cee7aafda26634665cf449436fd6e24bfd1fad230538" "checksum xdg 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d089681aa106a86fade1b0128fb5daf07d5867a509ab036d99988dec80429a57" "checksum yaml-rust 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e66366e18dc58b46801afbf2ca7661a9f59cc8c5962c29892b6039b4f86fa992" -"checksum yamux 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ae9073f5dbc901abb0b2ec4f866e726fed2f54953bdf81f8a5fde7762b7cc3b3" +"checksum yamux 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "01bd67889938c48f0049fc60a77341039e6c3eaf16cb7693e6ead7c0ba701295" "checksum zeroize 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8ddfeb6eee2fb3b262ef6e0898a52b7563bb8e0d5955a313b3cf2f808246ea14" +"checksum zeroize 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e68403b858b6af538b11614e62dfe9ab2facba9f13a0cafb974855cfb495ec95" +"checksum zeroize 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b60a6c572b91d8ecb0a460950d84fe5b40699edd07d65f73789b31237afc8f66" +"checksum zeroize_derive 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b3f07490820219949839d0027b965ffdd659d75be9220c00798762e36c6cd281" +"checksum zeroize_derive 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9dac4b660d969bff9c3fe1847a891cacaa8b21dd5f2aae6e0a3e0975aea96431" diff --git a/Cargo.toml b/Cargo.toml index f109d235af15d9ca1151a31c84fec3771dbcd1d7..f45353204f05ba3ec1c0a339eeb75cc7dafcb2c0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,7 +10,6 @@ build = "build.rs" edition = "2018" [dependencies] -error-chain = "0.12" cli = { package = "node-cli", path = "node/cli" } futures = "0.1" ctrlc = { version = "3.0", features = ["termination"] } @@ -23,15 +22,17 @@ members = [ "core/cli", "core/client", "core/client/db", - "core/consensus/common", "core/consensus/aura", "core/consensus/babe", + "core/consensus/common", "core/consensus/rhd", "core/consensus/slots", "core/executor", "core/finality-grandpa", "core/finality-grandpa/primitives", + "core/inherents", "core/keyring", + "core/keystore", "core/network", "core/panic-handler", "core/primitives", @@ -47,13 +48,13 @@ members = [ "core/sr-std", "core/sr-version", "core/state-machine", - "core/test-runtime", "core/telemetry", - "core/trie", - "core/keystore", + "core/test-client", + "core/test-runtime", + "core/test-runtime/client", "core/transaction-pool", "core/transaction-pool/graph", - "core/inherents", + "core/trie", "core/util/fork-tree", "srml/support", "srml/support/procedural", @@ -63,8 +64,7 @@ members = [ "srml/assets", "srml/aura", "srml/balances", - "srml/consensus", - "srml/contract", + "srml/contracts", "srml/council", "srml/democracy", "srml/example", @@ -83,6 +83,7 @@ members = [ "node/executor", "node/primitives", "node/runtime", + "node/rpc-client", "node-template", "subkey", "test-utils/chain-spec-builder", diff --git a/Dockerfile b/Dockerfile index df39db5abb5d17991d49bba67850dd9e8310817e..c5944dbab6de9231c9fa61af735fcf48d2b5be6b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -20,8 +20,8 @@ RUN curl https://sh.rustup.rs -sSf | sh -s -- -y && \ rustup target add wasm32-unknown-unknown --toolchain nightly && \ cargo install --git https://github.com/alexcrichton/wasm-gc && \ rustup default nightly && \ - ./scripts/build.sh && \ - rustup default stable && \ + ./scripts/build.sh && \ + rustup default stable && \ cargo build --$PROFILE # ===== SECOND STAGE ====== diff --git a/README.adoc b/README.adoc index 09ecd0c6e6741542ce31f295fc801f76d7b6b02b..826370ee6f5a0a7f03f178f80ca60cf5a37a6d79 100644 --- a/README.adoc +++ b/README.adoc @@ -284,7 +284,7 @@ Detailed logs may be shown by running the node with the following environment va If you want to see the multi-node consensus algorithm in action locally, then you can create a local testnet with two validator nodes for Alice and Bob, who are the initial authorities of the genesis chain specification that have been endowed with a testnet DOTs. We'll give each node a name and expose them so they are listed on link:https://telemetry.polkadot.io/#/Local%20Testnet[Telemetry] . You'll need two terminals windows open. -We'll start Alice's substrate node first on default TCP port 30333 with her chain database stored locally at `/tmp/alice`. The Bootnode ID of her node is `QmQZ8TjTqeDj3ciwr93EJ95hxfDsb9pEYDizUAbWpigtQN`, which is generated from the `--node-key` value that we specify below: +We'll start Alice's substrate node first on default TCP port 30333 with her chain database stored locally at `/tmp/alice`. The Bootnode ID of her node is `QmRpheLN4JWdAnY7HGJfWFNbfkQCb6tFf4vvA6hgjMZKrR`, which is generated from the `--node-key` value that we specify below: [source, shell] cargo run --release \-- \ @@ -300,18 +300,20 @@ In the second terminal, we'll run the following to start Bob's substrate node on [source, shell] cargo run --release \-- \ --base-path /tmp/bob \ - --bootnodes /ip4/127.0.0.1/tcp/30333/p2p/QmQZ8TjTqeDj3ciwr93EJ95hxfDsb9pEYDizUAbWpigtQN \ + --bootnodes /ip4/127.0.0.1/tcp/30333/p2p/QmRpheLN4JWdAnY7HGJfWFNbfkQCb6tFf4vvA6hgjMZKrR \ --chain=local \ --bob \ --port 30334 \ --telemetry-url ws://telemetry.polkadot.io:1024 \ --validator -Additional Substate CLI usage options are available and may be shown by running `cargo run \-- --help`. +Additional Substrate CLI usage options are available and may be shown by running `cargo run \-- --help`. -=== Joining the Emberic Elm Testnet +[[flaming-fir]] +=== Joining the Flaming Fir Testnet -Emberic Elm is the new testnet for Substrate 1.0. Please note that 1.0 is not compatible with the BBQ-Birch, Charred-Cherry, or Dried-Danta testnets. Ensure you have the dependencies listed above before compiling. +Flaming Fir is the new testnet for Substrate master (2.0). Please note that master is not compatible with the BBQ-Birch, Charred-Cherry, Dried-Danta or Emberic-Elm testnets. Ensure you have the dependencies listed above before compiling. +The master branch might have breaking changes as development progresses, therefore you should make sure you have a reasonably updated client when trying to sync Flaming Fir. [source, shell] ---- @@ -339,8 +341,21 @@ For example, you can choose a custom node name: [source, shell] cargo run --release \-- --name my_custom_name -If you are successful, you will see your node syncing at https://telemetry.polkadot.io/#/Emberic%20Elm +If you are successful, you will see your node syncing at https://telemetry.polkadot.io/#/Flaming%20Fir + +=== Joining the Emberic Elm Testnet + +Emberic Elm is the testnet for Substrate 1.0. Please note that 1.0 is not compatible with the BBQ-Birch, Charred-Cherry, Dried-Danta or Flaming-Fir testnets. +In order to join the Emberic Elm testnet you should build from the `v1.0` branch. Ensure you have the dependencies listed above before compiling. + +[source, shell] +---- +git clone https://github.com/paritytech/substrate.git +cd substrate +git checkout -b v1.0 origin/v1.0 +---- +You can then follow the same steps for building and running as described above in <>. == Documentation @@ -373,7 +388,7 @@ substrate-trie sr-api, sr-io, sr-primitives, sr-sandbox, sr-std, sr-version * Substrate Runtime Module Library (SRML) [source, shell] -srml-assets, srml-balances, srml-consensus, srml-contract, srml-council, srml-democracy, srml-example, +srml-assets, srml-balances, srml-consensus, srml-contracts, srml-council, srml-democracy, srml-example, srml-executive, srml-metadata, srml-session, srml-staking, srml-support, srml-system, srml-timestamp, srml-treasury * Node diff --git a/ci/script.sh b/ci/script.sh index 0ab5f34fb2551aa379525325de5b5065dc03dbe3..b1b7dd3edf3564b5455dff53d4708c8e34139d24 100755 --- a/ci/script.sh +++ b/ci/script.sh @@ -20,12 +20,12 @@ case $TARGET in sudo apt-get -y update sudo apt-get install -y cmake pkg-config libssl-dev - cargo test --all --release --locked + cargo test --all --release --locked "$@" ;; "wasm") # Install prerequisites and build all wasm projects ./scripts/init.sh - ./scripts/build.sh + ./scripts/build.sh "$@" ;; esac diff --git a/core/basic-authorship/Cargo.toml b/core/basic-authorship/Cargo.toml index 63408b4329a2f7b60cf7985bbac26d5d3378f437..547fca9030ee651ec0680d1caf01b39035bf4623 100644 --- a/core/basic-authorship/Cargo.toml +++ b/core/basic-authorship/Cargo.toml @@ -17,4 +17,4 @@ transaction_pool = { package = "substrate-transaction-pool", path = "../../core/ substrate-telemetry = { path = "../telemetry" } [dev-dependencies] -test-client = { package = "substrate-test-client", path = "../../core/test-client" } +test-client = { package = "substrate-test-runtime-client", path = "../../core/test-runtime/client" } diff --git a/core/basic-authorship/src/basic_authorship.rs b/core/basic-authorship/src/basic_authorship.rs index 9f0db708daf184137ae54275065f36aa028a26ef..56a959ccbc9ca1bdc137c0594d6801fcfeac8452 100644 --- a/core/basic-authorship/src/basic_authorship.rs +++ b/core/basic-authorship/src/basic_authorship.rs @@ -20,7 +20,7 @@ // use std::{self, time, sync::Arc}; -use log::{info, debug, warn, trace}; +use log::{info, debug, trace}; use client::{ self, error, Client as SubstrateClient, CallExecutor, @@ -30,12 +30,13 @@ use codec::Decode; use consensus_common::{self, evaluation}; use primitives::{H256, Blake2Hasher, ExecutionContext}; use runtime_primitives::traits::{ - Block as BlockT, Hash as HashT, Header as HeaderT, ProvideRuntimeApi, AuthorityIdFor + Block as BlockT, Hash as HashT, Header as HeaderT, ProvideRuntimeApi, + DigestFor, }; use runtime_primitives::generic::BlockId; use runtime_primitives::ApplyError; use transaction_pool::txpool::{self, Pool as TransactionPool}; -use inherents::{InherentData, pool::InherentsPool}; +use inherents::InherentData; use substrate_telemetry::{telemetry, CONSENSUS_INFO}; /// Build new blocks. @@ -53,11 +54,13 @@ pub trait AuthoringApi: Send + Sync + ProvideRuntimeApi where /// The error used by this API type. type Error: std::error::Error; - /// Build a block on top of the given, with inherent extrinsics pre-pushed. - fn build_block) -> ()>( + /// Build a block on top of the given block, with inherent extrinsics and + /// inherent digests pre-pushed. + fn build_block) -> ()>( &self, at: &BlockId, inherent_data: InherentData, + inherent_digests: DigestFor, build_ctx: F, ) -> Result; } @@ -88,13 +91,15 @@ impl AuthoringApi for SubstrateClient where type Block = Block; type Error = client::error::Error; - fn build_block) -> ()>( + fn build_block) -> ()>( &self, at: &BlockId, inherent_data: InherentData, + inherent_digests: DigestFor, mut build_ctx: F, ) -> Result { - let mut block_builder = self.new_block_at(at)?; + + let mut block_builder = self.new_block_at(at, inherent_digests)?; let runtime_api = self.runtime_api(); // We don't check the API versions any further here since the dispatch compatibility @@ -114,8 +119,6 @@ pub struct ProposerFactory where A: txpool::ChainApi { pub client: Arc, /// The transaction pool. pub transaction_pool: Arc>, - /// The inherents pool - pub inherents_pool: Arc::Extrinsic>>, } impl consensus_common::Environment<::Block> for ProposerFactory where @@ -131,7 +134,6 @@ impl consensus_common::Environment<::Block> for Propose fn init( &self, parent_header: &<::Block as BlockT>::Header, - _: &[AuthorityIdFor<::Block>], ) -> Result { let parent_hash = parent_header.hash(); @@ -145,7 +147,6 @@ impl consensus_common::Environment<::Block> for Propose parent_id: id, parent_number: *parent_header.number(), transaction_pool: self.transaction_pool.clone(), - inherents_pool: self.inherents_pool.clone(), now: Box::new(time::Instant::now), }; @@ -160,8 +161,7 @@ pub struct Proposer { parent_id: BlockId, parent_number: <::Header as HeaderT>::Number, transaction_pool: Arc>, - inherents_pool: Arc::Extrinsic>>, - now: Box time::Instant>, + now: Box time::Instant>, } impl consensus_common::Proposer<::Block> for Proposer where @@ -174,12 +174,16 @@ impl consensus_common::Proposer<::Block> for Pro type Create = Result<::Block, error::Error>; type Error = error::Error; - fn propose(&self, inherent_data: InherentData, max_duration: time::Duration) - -> Result<::Block, error::Error> + fn propose( + &self, + inherent_data: InherentData, + inherent_digests: DigestFor, + max_duration: time::Duration, + ) -> Result<::Block, error::Error> { // leave some time for evaluation and block finalization (33%) let deadline = (self.now)() + max_duration - max_duration / 3; - self.propose_with(inherent_data, deadline) + self.propose_with(inherent_data, inherent_digests, deadline) } } @@ -190,8 +194,12 @@ impl Proposer where A: txpool::ChainApi, client::error::Error: From<::Error>, { - fn propose_with(&self, inherent_data: InherentData, deadline: time::Instant) - -> Result<::Block, error::Error> + fn propose_with( + &self, + inherent_data: InherentData, + inherent_digests: DigestFor, + deadline: time::Instant, + ) -> Result<::Block, error::Error> { use runtime_primitives::traits::BlakeTwo256; @@ -203,17 +211,8 @@ impl Proposer where let block = self.client.build_block( &self.parent_id, inherent_data, + inherent_digests.clone(), |block_builder| { - // Add inherents from the internal pool - - let inherents = self.inherents_pool.drain(); - debug!("Pushing {} queued inherents.", inherents.len()); - for i in inherents { - if let Err(e) = block_builder.push_extrinsic(i) { - warn!("Error while pushing inherent extrinsic from the pool: {:?}", e); - } - } - // proceed with transactions let mut is_first = true; let mut skipped = 0; @@ -316,12 +315,10 @@ mod tests { let proposer_factory = ProposerFactory { client: client.clone(), transaction_pool: txpool.clone(), - inherents_pool: Default::default(), }; let mut proposer = proposer_factory.init( &client.header(&BlockId::number(0)).unwrap().unwrap(), - &[] ).unwrap(); // when @@ -331,40 +328,11 @@ mod tests { cell.replace(new) }); let deadline = time::Duration::from_secs(3); - let block = proposer.propose(Default::default(), deadline).unwrap(); + let block = proposer.propose(Default::default(), Default::default(), deadline).unwrap(); // then // block should have some extrinsics although we have some more in the pool. assert_eq!(block.extrinsics().len(), 1); assert_eq!(txpool.ready().count(), 2); } - - #[test] - fn should_include_inherents_from_the_pool() { - // given - let client = Arc::new(test_client::new()); - let chain_api = transaction_pool::ChainApi::new(client.clone()); - let txpool = Arc::new(TransactionPool::new(Default::default(), chain_api)); - let inpool = Arc::new(InherentsPool::default()); - - let proposer_factory = ProposerFactory { - client: client.clone(), - transaction_pool: txpool.clone(), - inherents_pool: inpool.clone(), - }; - - inpool.add(extrinsic(0)); - - let proposer = proposer_factory.init( - &client.header(&BlockId::number(0)).unwrap().unwrap(), - &[] - ).unwrap(); - - // when - let deadline = time::Duration::from_secs(3); - let block = proposer.propose(Default::default(), deadline).unwrap(); - - // then - assert_eq!(block.extrinsics().len(), 1); - } } diff --git a/core/cli/Cargo.toml b/core/cli/Cargo.toml index dbc9fc0aae69f1f5497c4c9d6734ab14ad9f322b..6ca50ba5f8404277bb9e4377e199cd6c5a3ab813 100644 --- a/core/cli/Cargo.toml +++ b/core/cli/Cargo.toml @@ -7,8 +7,8 @@ edition = "2018" [dependencies] clap = "~2.32" +derive_more = "0.14.0" env_logger = "0.6" -error-chain = "0.12" log = "0.4" atty = "0.2" regex = "1" @@ -21,7 +21,6 @@ futures = "0.1.17" fdlimit = "0.1" exit-future = "0.1" serde_json = "1.0" -sysinfo = "0.8.0" panic-handler = { package = "substrate-panic-handler", path = "../../core/panic-handler" } client = { package = "substrate-client", path = "../../core/client" } network = { package = "substrate-network", path = "../../core/network" } @@ -33,6 +32,7 @@ substrate-telemetry = { path = "../../core/telemetry" } keyring = { package = "substrate-keyring", path = "../keyring" } names = "0.11.0" structopt = "0.2" +rpassword = "3.0" [dev-dependencies] tempdir = "0.3" diff --git a/core/cli/src/error.rs b/core/cli/src/error.rs index 07d14eb479873f3b26a41eeb67ff804cb3d15c0f..b052a29710d7fce5f737b3f64b377f7b015d3bbc 100644 --- a/core/cli/src/error.rs +++ b/core/cli/src/error.rs @@ -16,26 +16,38 @@ //! Initialization errors. -// Silence: `use of deprecated item 'std::error::Error::cause': replaced by Error::source, which can support downcasting` -// https://github.com/paritytech/substrate/issues/1547 -#![allow(deprecated)] - use client; -use error_chain::{error_chain, error_chain_processing, impl_error_chain_processed, - impl_extract_backtrace, impl_error_chain_kind}; - -error_chain! { - foreign_links { - Io(::std::io::Error) #[doc="IO error"]; - Cli(::clap::Error) #[doc="CLI error"]; - Service(::service::Error) #[doc="Substrate service error"]; - Client(client::error::Error) #[doc="Client error"]; - } - errors { - /// Input error. - Input(m: String) { - description("Invalid input"), - display("{}", m), + +/// Result type alias for the CLI. +pub type Result = std::result::Result; + +/// Error type for the CLI. +#[derive(Debug, derive_more::Display, derive_more::From)] +pub enum Error { + /// Io error + Io(std::io::Error), + /// Cli error + Cli(clap::Error), + /// Service error + Service(service::Error), + /// Client error + Client(client::error::Error), + /// Input error + Input(String), + /// Invalid listen multiaddress + #[display(fmt="Invalid listen multiaddress")] + InvalidListenMultiaddress +} + +impl std::error::Error for Error { + fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { + match self { + Error::Io(ref err) => Some(err), + Error::Cli(ref err) => Some(err), + Error::Service(ref err) => Some(err), + Error::Client(ref err) => Some(err), + Error::Input(_) => None, + Error::InvalidListenMultiaddress => None, } } } diff --git a/core/cli/src/informant.rs b/core/cli/src/informant.rs index b78e9b064696395b46acb8dc5e2b13fe6d49255f..3eb5a0d992249c3a8c37f60e99cba01f6ed12fb8 100644 --- a/core/cli/src/informant.rs +++ b/core/cli/src/informant.rs @@ -22,102 +22,63 @@ use std::time; use futures::{Future, Stream}; use service::{Service, Components}; use tokio::runtime::TaskExecutor; -use sysinfo::{get_current_pid, ProcessExt, System, SystemExt}; -use network::{SyncState, SyncProvider}; +use network::SyncState; use client::{backend::Backend, BlockchainEvents}; -use substrate_telemetry::{telemetry, SUBSTRATE_INFO}; use log::{info, warn}; use runtime_primitives::generic::BlockId; -use runtime_primitives::traits::{Header, As}; +use runtime_primitives::traits::{Header, SaturatedConversion}; /// Spawn informant on the event loop +#[deprecated(note = "Please use informant::build instead, and then create the task manually")] pub fn start(service: &Service, exit: ::exit_future::Exit, handle: TaskExecutor) where C: Components, { - let network = service.network(); + handle.spawn(exit.until(build(service)).map(|_| ())); +} + +/// Creates an informant in the form of a `Future` that must be polled regularly. +pub fn build(service: &Service) -> impl Future +where C: Components { let client = service.client(); - let txpool = service.transaction_pool(); let mut last_number = None; let mut last_update = time::Instant::now(); - let mut sys = System::new(); - let self_pid = get_current_pid(); - - let display_notifications = network.status().for_each(move |sync_status| { - - if let Ok(info) = client.info() { - let best_number: u64 = info.chain.best_number.as_(); - let best_hash = info.chain.best_hash; - let num_peers = sync_status.num_peers; - let speed = move || speed(best_number, last_number, last_update); - last_update = time::Instant::now(); - let (status, target) = match (sync_status.sync.state, sync_status.sync.best_seen_block) { - (SyncState::Idle, _) => ("Idle".into(), "".into()), - (SyncState::Downloading, None) => (format!("Syncing{}", speed()), "".into()), - (SyncState::Downloading, Some(n)) => (format!("Syncing{}", speed()), format!(", target=#{}", n)), - }; - last_number = Some(best_number); - let txpool_status = txpool.status(); - let finalized_number: u64 = info.chain.finalized_number.as_(); - let bandwidth_download = network.average_download_per_sec(); - let bandwidth_upload = network.average_upload_per_sec(); - info!( - target: "substrate", - "{}{} ({} peers), best: #{} ({}), finalized #{} ({}), ⬇ {} ⬆ {}", - Colour::White.bold().paint(&status), - target, - Colour::White.bold().paint(format!("{}", sync_status.num_peers)), - Colour::White.paint(format!("{}", best_number)), - best_hash, - Colour::White.paint(format!("{}", finalized_number)), - info.chain.finalized_hash, - TransferRateFormat(bandwidth_download), - TransferRateFormat(bandwidth_upload), - ); - - let backend = (*client).backend(); - let used_state_cache_size = match backend.used_state_cache_size(){ - Some(size) => size, - None => 0, - }; - - // get cpu usage and memory usage of this process - let (cpu_usage, memory) = if sys.refresh_process(self_pid) { - let proc = sys.get_process(self_pid).expect("Above refresh_process succeeds, this should be Some(), qed"); - (proc.cpu_usage(), proc.memory()) - } else { (0.0, 0) }; - - let network_state = network.network_state(); - - telemetry!( - SUBSTRATE_INFO; - "system.interval"; - "network_state" => network_state, - "status" => format!("{}{}", status, target), - "peers" => num_peers, - "height" => best_number, - "best" => ?best_hash, - "txcount" => txpool_status.ready, - "cpu" => cpu_usage, - "memory" => memory, - "finalized_height" => finalized_number, - "finalized_hash" => ?info.chain.finalized_hash, - "bandwidth_download" => bandwidth_download, - "bandwidth_upload" => bandwidth_upload, - "used_state_cache_size" => used_state_cache_size, - ); - } else { - warn!("Error getting best block information"); - } + let display_notifications = service.network_status().for_each(move |net_status| { + + let info = client.info(); + let best_number = info.chain.best_number.saturated_into::(); + let best_hash = info.chain.best_hash; + let speed = move || speed(best_number, last_number, last_update); + last_update = time::Instant::now(); + let (status, target) = match (net_status.sync_state, net_status.best_seen_block) { + (SyncState::Idle, _) => ("Idle".into(), "".into()), + (SyncState::Downloading, None) => (format!("Syncing{}", speed()), "".into()), + (SyncState::Downloading, Some(n)) => (format!("Syncing{}", speed()), format!(", target=#{}", n)), + }; + last_number = Some(best_number); + let finalized_number: u64 = info.chain.finalized_number.saturated_into::(); + info!( + target: "substrate", + "{}{} ({} peers), best: #{} ({}), finalized #{} ({}), ⬇ {} ⬆ {}", + Colour::White.bold().paint(&status), + target, + Colour::White.bold().paint(format!("{}", net_status.num_connected_peers)), + Colour::White.paint(format!("{}", best_number)), + best_hash, + Colour::White.paint(format!("{}", finalized_number)), + info.chain.finalized_hash, + TransferRateFormat(net_status.average_download_per_sec), + TransferRateFormat(net_status.average_upload_per_sec), + ); Ok(()) }); let client = service.client(); - let mut last = match client.info() { - Ok(info) => Some((info.chain.best_number, info.chain.best_hash)), - Err(e) => { warn!("Error getting best block information: {:?}", e); None } + let mut last = { + let info = client.info(); + Some((info.chain.best_number, info.chain.best_hash)) }; let display_block_import = client.import_notification_stream().for_each(move |n| { @@ -125,6 +86,7 @@ pub fn start(service: &Service, exit: ::exit_future::Exit, handle: TaskExe if let Some((ref last_num, ref last_hash)) = last { if n.header.parent_hash() != last_hash { let tree_route = ::client::blockchain::tree_route( + #[allow(deprecated)] client.backend().blockchain(), BlockId::Hash(last_hash.clone()), BlockId::Hash(n.hash), @@ -149,24 +111,17 @@ pub fn start(service: &Service, exit: ::exit_future::Exit, handle: TaskExe Ok(()) }); - let txpool = service.transaction_pool(); - let display_txpool_import = txpool.import_notification_stream().for_each(move |_| { - let status = txpool.status(); - telemetry!(SUBSTRATE_INFO; "txpool.import"; "ready" => status.ready, "future" => status.future); - Ok(()) - }); - - let informant_work = display_notifications.join3(display_block_import, display_txpool_import); - handle.spawn(exit.until(informant_work).map(|_| ())); + display_notifications.join(display_block_import) + .map(|((), ())| ()) } fn speed(best_number: u64, last_number: Option, last_update: time::Instant) -> String { let since_last_millis = last_update.elapsed().as_secs() * 1000; let since_last_subsec_millis = last_update.elapsed().subsec_millis() as u64; - let speed = match last_number { - Some(num) => (best_number.saturating_sub(num) * 10_000 / (since_last_millis + since_last_subsec_millis)) as f64, - None => 0.0 - }; + let speed = last_number + .and_then(|num| + (best_number.saturating_sub(num) * 10_000).checked_div(since_last_millis + since_last_subsec_millis)) + .map_or(0.0, |s| s as f64); if speed < 1.0 { "".into() diff --git a/core/cli/src/lib.rs b/core/cli/src/lib.rs index fd03f5b64675cb9f11ca1326c26110eb57113811..c14c9625917e51d9a6b487668b634151d38429c8 100644 --- a/core/cli/src/lib.rs +++ b/core/cli/src/lib.rs @@ -26,7 +26,6 @@ pub mod error; pub mod informant; use client::ExecutionStrategies; -use runtime_primitives::traits::As; use service::{ ServiceFactory, FactoryFullConfiguration, RuntimeGenesis, FactoryGenesis, PruningMode, ChainSpec, @@ -50,13 +49,12 @@ use structopt::{StructOpt, clap::AppSettings}; pub use structopt::clap::App; use params::{ RunCmd, PurgeChainCmd, RevertCmd, ImportBlocksCmd, ExportBlocksCmd, BuildSpecCmd, - NetworkConfigurationParams, SharedParams, MergeParameters, TransactionPoolParams, - NodeKeyParams, NodeKeyType + NetworkConfigurationParams, MergeParameters, TransactionPoolParams, + NodeKeyParams, NodeKeyType, Cors, }; -pub use params::{NoCustom, CoreParams}; +pub use params::{NoCustom, CoreParams, SharedParams}; pub use traits::{GetLogFilter, AugmentClap}; use app_dirs::{AppInfo, AppDataType}; -use error_chain::bail; use log::info; use lazy_static::lazy_static; @@ -146,10 +144,6 @@ fn base_path(cli: &SharedParams, version: &VersionInfo) -> PathBuf { ) } -fn input_err>(msg: T) -> error::Error { - error::ErrorKind::Input(msg.into()).into() -} - /// Check whether a node name is considered as valid fn is_node_name_valid(_name: &str) -> Result<(), &str> { let name = _name.to_string(); @@ -184,7 +178,7 @@ fn is_node_name_valid(_name: &str) -> Result<(), &str> { /// /// `CC` is a custom subcommand. This needs to be an `enum`! If no custom subcommand is required, /// `NoCustom` can be used as type here. -/// `RP` is are custom parameters for the run command. This needs to be a `struct`! The custom +/// `RP` are custom parameters for the run command. This needs to be a `struct`! The custom /// parameters are visible to the user as if they were normal run command parameters. If no custom /// parameters are required, `NoCustom` can be used as type here. pub fn parse_and_execute<'a, F, CC, RP, S, RS, E, I, T>( @@ -279,7 +273,7 @@ where /// Create an error caused by an invalid node key argument. fn invalid_node_key(e: impl std::fmt::Display) -> error::Error { - input_err(format!("Invalid node key: {}", e)) + error::Error::Input(format!("Invalid node key: {}", e)) } /// Parse a Secp256k1 secret key from a hex string into a `network::Secret`. @@ -335,7 +329,7 @@ fn fill_network_configuration( } for addr in cli.listen_addr.iter() { - let addr = addr.parse().map_err(|_| "Invalid listen multiaddress")?; + let addr = addr.parse().ok().ok_or(error::Error::InvalidListenMultiaddress)?; config.listen_addresses.push(addr); } @@ -365,6 +359,11 @@ fn fill_network_configuration( Ok(()) } +fn input_keystore_password() -> Result { + rpassword::read_password_from_tty(Some("Keystore password: ")) + .map_err(|e| format!("{:?}", e)) +} + fn create_run_node_config( cli: RunCmd, spec_factory: S, impl_name: &'static str, version: &VersionInfo ) -> error::Result> @@ -374,6 +373,9 @@ where { let spec = load_spec(&cli.shared_params, spec_factory)?; let mut config = service::Configuration::default_with_spec(spec.clone()); + if cli.interactive_password { + config.password = input_keystore_password()? + } config.impl_name = impl_name; config.impl_commit = version.commit; @@ -385,14 +387,14 @@ where }; match is_node_name_valid(&config.name) { Ok(_) => (), - Err(msg) => bail!( - input_err( + Err(msg) => Err( + error::Error::Input( format!("Invalid node name '{}'. Reason: {}. If unsure, use none.", config.name, msg ) ) - ) + )? } let base_path = base_path(&cli.shared_params, version); @@ -410,7 +412,7 @@ where Some(ref s) if s == "archive" => PruningMode::ArchiveAll, None => PruningMode::default(), Some(s) => PruningMode::keep_blocks( - s.parse().map_err(|_| input_err("Invalid pruning mode specified"))? + s.parse().map_err(|_| error::Error::Input("Invalid pruning mode specified".to_string()))? ), }; @@ -463,7 +465,7 @@ where config.keys.push(key); } - if cli.shared_params.dev { + if cli.shared_params.dev && cli.keyring.account.is_none() { config.keys.push("//Alice".into()); } @@ -480,11 +482,12 @@ where config.rpc_ws = Some( parse_address(&format!("{}:{}", ws_interface, 9944), cli.ws_port)? ); + config.rpc_ws_max_connections = cli.ws_max_connections; config.rpc_cors = cli.rpc_cors.unwrap_or_else(|| if is_dev { log::warn!("Running in --dev mode, RPC CORS has been disabled."); - None + Cors::All } else { - Some(vec![ + Cors::List(vec![ "http://localhost:*".into(), "http://127.0.0.1:*".into(), "https://localhost:*".into(), @@ -492,7 +495,7 @@ where "https://polkadot.js.org".into(), "https://substrate-ui.parity.io".into(), ]) - }); + }).into(); // Override telemetry if cli.no_telemetry { @@ -579,7 +582,8 @@ where Ok(()) } -fn create_config_with_db_path( +/// Creates a configuration including the database path. +pub fn create_config_with_db_path( spec_factory: S, cli: &SharedParams, version: &VersionInfo, ) -> error::Result> where @@ -613,13 +617,13 @@ where let to = cli.to; let json = cli.json; - let file: Box = match cli.output { + let file: Box = match cli.output { Some(filename) => Box::new(File::create(filename)?), None => Box::new(stdout()), }; service::chain_ops::export_blocks::( - config, exit.into_exit(), file, As::sa(from), to.map(As::sa), json + config, exit.into_exit(), file, from.into(), to.map(Into::into), json ).map_err(Into::into) } @@ -636,7 +640,7 @@ where { let config = create_config_with_db_path::(spec_factory, &cli.shared_params, version)?; - let file: Box = match cli.input { + let file: Box = match cli.input { Some(filename) => Box::new(File::open(filename)?), None => Box::new(stdin()), }; @@ -655,7 +659,7 @@ where { let config = create_config_with_db_path::(spec_factory, &cli.shared_params, version)?; let blocks = cli.num; - Ok(service::chain_ops::revert_chain::(config, As::sa(blocks))?) + Ok(service::chain_ops::revert_chain::(config, blocks.into())?) } fn purge_chain( @@ -828,7 +832,7 @@ mod tests { NodeKeyType::variants().into_iter().try_for_each(|t| { let node_key_type = NodeKeyType::from_str(t).unwrap(); let sk = match node_key_type { - NodeKeyType::Secp256k1 => secp256k1::SecretKey::generate().as_ref().to_vec(), + NodeKeyType::Secp256k1 => secp256k1::SecretKey::generate().to_bytes().to_vec(), NodeKeyType::Ed25519 => ed25519::SecretKey::generate().as_ref().to_vec() }; let params = NodeKeyParams { @@ -839,11 +843,11 @@ mod tests { node_key_config(params, &net_config_dir).and_then(|c| match c { NodeKeyConfig::Secp256k1(network::Secret::Input(ref ski)) if node_key_type == NodeKeyType::Secp256k1 && - &sk[..] == ski.as_ref() => Ok(()), + &sk[..] == ski.to_bytes() => Ok(()), NodeKeyConfig::Ed25519(network::Secret::Input(ref ski)) if node_key_type == NodeKeyType::Ed25519 && &sk[..] == ski.as_ref() => Ok(()), - _ => Err(input_err("Unexpected node key config")) + _ => Err(error::Error::Input("Unexpected node key config".into())) }) }) } @@ -869,7 +873,7 @@ mod tests { if node_key_type == NodeKeyType::Secp256k1 && f == &file => Ok(()), NodeKeyConfig::Ed25519(network::Secret::File(ref f)) if node_key_type == NodeKeyType::Ed25519 && f == &file => Ok(()), - _ => Err(input_err("Unexpected node key config")) + _ => Err(error::Error::Input("Unexpected node key config".into())) }) }) } @@ -903,7 +907,7 @@ mod tests { if typ == NodeKeyType::Secp256k1 => Ok(()), NodeKeyConfig::Ed25519(network::Secret::New) if typ == NodeKeyType::Ed25519 => Ok(()), - _ => Err(input_err("Unexpected node key config")) + _ => Err(error::Error::Input("Unexpected node key config".into())) }) }) } @@ -920,7 +924,7 @@ mod tests { NodeKeyConfig::Ed25519(network::Secret::File(ref f)) if typ == NodeKeyType::Ed25519 && f == &dir.join(NODE_KEY_ED25519_FILE) => Ok(()), - _ => Err(input_err("Unexpected node key config")) + _ => Err(error::Error::Input("Unexpected node key config".into())) }) }) } diff --git a/core/cli/src/params.rs b/core/cli/src/params.rs index 6cb4a6068a1b8fb2d81ff17f0f863f947d89badd..0cdc633188d7dc3ef8ee80b6bece823e1730b74f 100644 --- a/core/cli/src/params.rs +++ b/core/cli/src/params.rs @@ -333,13 +333,17 @@ pub struct RunCmd { #[structopt(long = "ws-port", value_name = "PORT")] pub ws_port: Option, + /// Maximum number of WS RPC server connections. + #[structopt(long = "ws-max-connections", value_name = "COUNT")] + pub ws_max_connections: Option, + /// Specify browser Origins allowed to access the HTTP & WS RPC servers. /// It's a comma-separated list of origins (protocol://domain or special `null` value). /// Value of `all` will disable origin validation. /// Default is to allow localhost, https://polkadot.js.org and https://substrate-ui.parity.io origins. /// When running in --dev mode the default is to allow all origins. #[structopt(long = "rpc-cors", value_name = "ORIGINS", parse(try_from_str = "parse_cors"))] - pub rpc_cors: Option>>, + pub rpc_cors: Option, /// Specify the pruning mode, a number of blocks to keep or 'archive'. Default is 256. #[structopt(long = "pruning", value_name = "PRUNING_MODE")] @@ -395,6 +399,10 @@ pub struct RunCmd { /// Enable authoring even when offline. #[structopt(long = "force-authoring")] pub force_authoring: bool, + + /// Interactive password for validator key. + #[structopt(short = "i")] + pub interactive_password: bool, } /// Stores all required Cli values for a keyring test account. @@ -468,7 +476,7 @@ impl Keyring { } /// Default to verbosity level 0, if none is provided. -fn parse_telemetry_endpoints(s: &str) -> Result<(String, u8), Box> { +fn parse_telemetry_endpoints(s: &str) -> Result<(String, u8), Box> { let pos = s.find(' '); match pos { None => { @@ -482,8 +490,29 @@ fn parse_telemetry_endpoints(s: &str) -> Result<(String, u8), Box>` +/// handling of `structopt`. +#[derive(Clone, Debug)] +pub enum Cors { + /// All hosts allowed + All, + /// Only hosts on the list are allowed. + List(Vec), +} + +impl From for Option> { + fn from(cors: Cors) -> Self { + match cors { + Cors::All => None, + Cors::List(list) => Some(list), + } + } +} + /// Parse cors origins -fn parse_cors(s: &str) -> Result>, Box> { +fn parse_cors(s: &str) -> Result> { let mut is_all = false; let mut origins = Vec::new(); for part in s.split(',') { @@ -496,7 +525,7 @@ fn parse_cors(s: &str) -> Result>, Box> { } } - Ok(if is_all { None } else { Some(origins) }) + Ok(if is_all { Cors::All } else { Cors::List(origins) }) } impl_augment_clap!(RunCmd); @@ -529,11 +558,11 @@ pub struct ExportBlocksCmd { /// Specify starting block number. 1 by default. #[structopt(long = "from", value_name = "BLOCK")] - pub from: Option, + pub from: Option, /// Specify last block number. Best block by default. #[structopt(long = "to", value_name = "BLOCK")] - pub to: Option, + pub to: Option, /// Use JSON output rather than binary. #[structopt(long = "json")] @@ -569,7 +598,7 @@ impl_get_log_filter!(ImportBlocksCmd); pub struct RevertCmd { /// Number of blocks to revert. #[structopt(default_value = "256")] - pub num: u64, + pub num: u32, #[allow(missing_docs)] #[structopt(flatten)] diff --git a/core/cli/src/traits.rs b/core/cli/src/traits.rs index ddb389e454ece4aafacc64e7a40e02a171255e68..0f8d247e49ab144f0f916c54fd1f5998e3701734 100644 --- a/core/cli/src/traits.rs +++ b/core/cli/src/traits.rs @@ -16,7 +16,7 @@ use structopt::{StructOpt, clap::App}; -/// Something that can augment a clapp app with further parameters. +/// Something that can augment a clap app with further parameters. /// `derive(StructOpt)` is implementing this function by default, so a macro `impl_augment_clap!` /// is provided to simplify the implementation of this trait. pub trait AugmentClap: StructOpt { diff --git a/core/client/Cargo.toml b/core/client/Cargo.toml index e295894b83fe420d977a3a7149c233898e5d46af..510ec50b8b5c1bb527460cadfa0059d70b2e6cc7 100644 --- a/core/client/Cargo.toml +++ b/core/client/Cargo.toml @@ -8,7 +8,7 @@ edition = "2018" derive_more = { version = "0.14.0", optional = true } fnv = { version = "1.0", optional = true } log = { version = "0.4", optional = true } -parking_lot = { version = "0.7.1", optional = true } +parking_lot = { version = "0.8.0", optional = true } hex = { package = "hex-literal", version = "0.1", optional = true } futures = { version = "0.1.17", optional = true } consensus = { package = "substrate-consensus-common", path = "../consensus/common", optional = true } @@ -28,7 +28,7 @@ inherents = { package = "substrate-inherents", path = "../inherents", default-fe sr-api-macros = { path = "../sr-api-macros" } [dev-dependencies] -test-client = { package = "substrate-test-client", path = "../test-client" } +test-client = { package = "substrate-test-runtime-client", path = "../test-runtime/client" } kvdb-memorydb = { git = "https://github.com/paritytech/parity-common", rev="b0317f649ab2c665b7987b8475878fc4d2e1f81d" } [features] diff --git a/core/client/db/Cargo.toml b/core/client/db/Cargo.toml index 3fea4fd8122a23adaea6271bfbd0fa1c71d50119..bfc7108db750f19b8e2dadbf0c25e8857e4c6f08 100644 --- a/core/client/db/Cargo.toml +++ b/core/client/db/Cargo.toml @@ -5,13 +5,13 @@ authors = ["Parity Technologies "] edition = "2018" [dependencies] -parking_lot = "0.7.1" +parking_lot = "0.8" log = "0.4" kvdb = { git = "https://github.com/paritytech/parity-common", rev="b0317f649ab2c665b7987b8475878fc4d2e1f81d" } # FIXME replace with release as soon as our rocksdb changes are released upstream https://github.com/paritytech/parity-common/issues/88 -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" +kvdb-rocksdb = { git = "https://github.com/paritytech/parity-common", rev="b0317f649ab2c665b7987b8475878fc4d2e1f81d", optional = true } +kvdb-memorydb = { git = "https://github.com/paritytech/parity-common", rev="b0317f649ab2c665b7987b8475878fc4d2e1f81d" } +linked-hash-map = "0.5" hash-db = { version = "0.12" } primitives = { package = "substrate-primitives", path = "../../primitives" } runtime_primitives = { package = "sr-primitives", path = "../../sr-primitives" } @@ -24,11 +24,10 @@ trie = { package = "substrate-trie", path = "../../trie" } consensus_common = { package = "substrate-consensus-common", path = "../../consensus/common" } [dev-dependencies] -kvdb-memorydb = { git = "https://github.com/paritytech/parity-common", rev="b0317f649ab2c665b7987b8475878fc4d2e1f81d" } substrate-keyring = { path = "../../keyring" } -test-client = { package = "substrate-test-client", path = "../../test-client" } +test-client = { package = "substrate-test-runtime-client", path = "../../test-runtime/client" } env_logger = { version = "0.6" } [features] default = [] -test-helpers = ["kvdb-memorydb"] +test-helpers = [] diff --git a/core/client/db/src/cache/list_cache.rs b/core/client/db/src/cache/list_cache.rs index fcce71a538f4a2ca4790357aab04e6545b71b67b..4f343e93fdc93f5dbadf066879b4393be623f076 100644 --- a/core/client/db/src/cache/list_cache.rs +++ b/core/client/db/src/cache/list_cache.rs @@ -44,9 +44,11 @@ use std::collections::BTreeSet; use log::warn; use client::error::{Error as ClientError, Result as ClientResult}; -use runtime_primitives::traits::{Block as BlockT, NumberFor, As, Zero}; +use runtime_primitives::traits::{ + Block as BlockT, NumberFor, Zero, Bounded, CheckedSub +}; -use crate::cache::{CacheItemT, ComplexBlockId}; +use crate::cache::{CacheItemT, ComplexBlockId, EntryType}; use crate::cache::list_entry::{Entry, StorageEntry}; use crate::cache::list_storage::{Storage, StorageTransaction, Metadata}; @@ -135,7 +137,7 @@ impl> ListCache // BUT since we're not guaranteeing to provide correct values for forks // behind the finalized block, check if the block is finalized first - if !chain::is_finalized_block(&self.storage, at, As::sa(::std::u64::MAX))? { + if !chain::is_finalized_block(&self.storage, at, Bounded::max_value())? { return Ok(None); } @@ -174,10 +176,10 @@ impl> ListCache parent: ComplexBlockId, block: ComplexBlockId, value: Option, - is_final: bool, + entry_type: EntryType, ) -> ClientResult>> { // this guarantee is currently provided by LightStorage && we're relying on it here - debug_assert!(!is_final || self.best_finalized_block.hash == parent.hash); + debug_assert!(entry_type != EntryType::Final || self.best_finalized_block.hash == parent.hash); // we do not store any values behind finalized if block.number != Zero::zero() && self.best_finalized_block.number >= block.number { @@ -185,6 +187,7 @@ impl> ListCache } // if the block is not final, it is possibly appended to/forking from existing unfinalized fork + let is_final = entry_type == EntryType::Final || entry_type == EntryType::Genesis; if !is_final { let mut fork_and_action = None; @@ -348,9 +351,9 @@ impl> ListCache ) { let mut do_pruning = || -> ClientResult<()> { // calculate last ancient block number - let ancient_block = match block.number.as_().checked_sub(self.prune_depth.as_()) { - Some(number) => match self.storage.read_id(As::sa(number))? { - Some(hash) => ComplexBlockId::new(hash, As::sa(number)), + let ancient_block = match block.number.checked_sub(&self.prune_depth) { + Some(number) => match self.storage.read_id(number)? { + Some(hash) => ComplexBlockId::new(hash, number), None => return Ok(()), }, None => return Ok(()), @@ -831,12 +834,27 @@ pub mod tests { #[test] fn list_on_block_insert_works() { + let nfin = EntryType::NonFinal; + let fin = EntryType::Final; + // when trying to insert block < finalized number assert!(ListCache::new(DummyStorage::new(), 1024, test_id(100)) - .on_block_insert(&mut DummyTransaction::new(), test_id(49), test_id(50), Some(50), false).unwrap().is_none()); + .on_block_insert( + &mut DummyTransaction::new(), + test_id(49), + test_id(50), + Some(50), + nfin, + ).unwrap().is_none()); // when trying to insert block @ finalized number assert!(ListCache::new(DummyStorage::new(), 1024, test_id(100)) - .on_block_insert(&mut DummyTransaction::new(), test_id(99), test_id(100), Some(100), false).unwrap().is_none()); + .on_block_insert( + &mut DummyTransaction::new(), + test_id(99), + test_id(100), + Some(100), + nfin, + ).unwrap().is_none()); // when trying to insert non-final block AND it appends to the best block of unfinalized fork // AND new value is the same as in the fork' best block @@ -848,7 +866,7 @@ pub mod tests { ); cache.unfinalized[0].best_block = Some(test_id(4)); let mut tx = DummyTransaction::new(); - assert_eq!(cache.on_block_insert(&mut tx, test_id(4), test_id(5), Some(4), false).unwrap(), + assert_eq!(cache.on_block_insert(&mut tx, test_id(4), test_id(5), Some(4), nfin).unwrap(), Some(CommitOperation::AppendNewBlock(0, test_id(5)))); assert!(tx.inserted_entries().is_empty()); assert!(tx.removed_entries().is_empty()); @@ -856,7 +874,7 @@ pub mod tests { // when trying to insert non-final block AND it appends to the best block of unfinalized fork // AND new value is the same as in the fork' best block let mut tx = DummyTransaction::new(); - assert_eq!(cache.on_block_insert(&mut tx, test_id(4), test_id(5), Some(5), false).unwrap(), + assert_eq!(cache.on_block_insert(&mut tx, test_id(4), test_id(5), Some(5), nfin).unwrap(), Some(CommitOperation::AppendNewEntry(0, Entry { valid_from: test_id(5), value: Some(5) }))); assert_eq!(*tx.inserted_entries(), vec![test_id(5).hash].into_iter().collect()); assert!(tx.removed_entries().is_empty()); @@ -872,7 +890,7 @@ pub mod tests { 1024, test_id(2) ); let mut tx = DummyTransaction::new(); - assert_eq!(cache.on_block_insert(&mut tx, correct_id(4), correct_id(5), Some(4), false).unwrap(), + assert_eq!(cache.on_block_insert(&mut tx, correct_id(4), correct_id(5), Some(4), nfin).unwrap(), Some(CommitOperation::AppendNewBlock(0, correct_id(5)))); assert!(tx.inserted_entries().is_empty()); assert!(tx.removed_entries().is_empty()); @@ -880,7 +898,7 @@ pub mod tests { // when trying to insert non-final block AND it is the first block that appends to the best block of unfinalized fork // AND new value is the same as in the fork' best block let mut tx = DummyTransaction::new(); - assert_eq!(cache.on_block_insert(&mut tx, correct_id(4), correct_id(5), Some(5), false).unwrap(), + assert_eq!(cache.on_block_insert(&mut tx, correct_id(4), correct_id(5), Some(5), nfin).unwrap(), Some(CommitOperation::AppendNewEntry(0, Entry { valid_from: correct_id(5), value: Some(5) }))); assert_eq!(*tx.inserted_entries(), vec![correct_id(5).hash].into_iter().collect()); assert!(tx.removed_entries().is_empty()); @@ -898,7 +916,7 @@ pub mod tests { 1024, correct_id(2) ); let mut tx = DummyTransaction::new(); - assert_eq!(cache.on_block_insert(&mut tx, correct_id(3), fork_id(0, 3, 4), Some(14), false).unwrap(), + assert_eq!(cache.on_block_insert(&mut tx, correct_id(3), fork_id(0, 3, 4), Some(14), nfin).unwrap(), Some(CommitOperation::AddNewFork(Entry { valid_from: fork_id(0, 3, 4), value: Some(14) }))); assert_eq!(*tx.inserted_entries(), vec![fork_id(0, 3, 4).hash].into_iter().collect()); assert!(tx.removed_entries().is_empty()); @@ -913,7 +931,7 @@ pub mod tests { 1024, correct_id(2) ); let mut tx = DummyTransaction::new(); - assert_eq!(cache.on_block_insert(&mut tx, correct_id(2), correct_id(3), Some(2), false).unwrap(), None); + assert_eq!(cache.on_block_insert(&mut tx, correct_id(2), correct_id(3), Some(2), nfin).unwrap(), None); assert!(tx.inserted_entries().is_empty()); assert!(tx.removed_entries().is_empty()); assert!(tx.updated_meta().is_none()); @@ -926,7 +944,7 @@ pub mod tests { 1024, correct_id(2) ); let mut tx = DummyTransaction::new(); - assert_eq!(cache.on_block_insert(&mut tx, correct_id(2), correct_id(3), Some(3), false).unwrap(), + assert_eq!(cache.on_block_insert(&mut tx, correct_id(2), correct_id(3), Some(3), nfin).unwrap(), Some(CommitOperation::AddNewFork(Entry { valid_from: correct_id(3), value: Some(3) }))); assert_eq!(*tx.inserted_entries(), vec![correct_id(3).hash].into_iter().collect()); assert!(tx.removed_entries().is_empty()); @@ -935,7 +953,7 @@ pub mod tests { // when inserting finalized entry AND there are no previous finalized entries let cache = ListCache::new(DummyStorage::new(), 1024, correct_id(2)); let mut tx = DummyTransaction::new(); - assert_eq!(cache.on_block_insert(&mut tx, correct_id(2), correct_id(3), Some(3), true).unwrap(), + assert_eq!(cache.on_block_insert(&mut tx, correct_id(2), correct_id(3), Some(3), fin).unwrap(), Some(CommitOperation::BlockFinalized(correct_id(3), Some(Entry { valid_from: correct_id(3), value: Some(3) }), Default::default()))); assert_eq!(*tx.inserted_entries(), vec![correct_id(3).hash].into_iter().collect()); assert!(tx.removed_entries().is_empty()); @@ -948,14 +966,14 @@ pub mod tests { 1024, correct_id(2) ); let mut tx = DummyTransaction::new(); - assert_eq!(cache.on_block_insert(&mut tx, correct_id(2), correct_id(3), Some(2), true).unwrap(), + assert_eq!(cache.on_block_insert(&mut tx, correct_id(2), correct_id(3), Some(2), fin).unwrap(), Some(CommitOperation::BlockFinalized(correct_id(3), None, Default::default()))); assert!(tx.inserted_entries().is_empty()); assert!(tx.removed_entries().is_empty()); assert!(tx.updated_meta().is_none()); // when inserting finalized entry AND value differs from previous finalized let mut tx = DummyTransaction::new(); - assert_eq!(cache.on_block_insert(&mut tx, correct_id(2), correct_id(3), Some(3), true).unwrap(), + assert_eq!(cache.on_block_insert(&mut tx, correct_id(2), correct_id(3), Some(3), fin).unwrap(), Some(CommitOperation::BlockFinalized(correct_id(3), Some(Entry { valid_from: correct_id(3), value: Some(3) }), Default::default()))); assert_eq!(*tx.inserted_entries(), vec![correct_id(3).hash].into_iter().collect()); assert!(tx.removed_entries().is_empty()); @@ -970,7 +988,7 @@ pub mod tests { 1024, correct_id(2) ); let mut tx = DummyTransaction::new(); - assert_eq!(cache.on_block_insert(&mut tx, correct_id(2), correct_id(3), Some(2), true).unwrap(), + assert_eq!(cache.on_block_insert(&mut tx, correct_id(2), correct_id(3), Some(2), fin).unwrap(), Some(CommitOperation::BlockFinalized(correct_id(3), None, vec![0].into_iter().collect()))); } diff --git a/core/client/db/src/cache/list_storage.rs b/core/client/db/src/cache/list_storage.rs index 6271f892bc859059cdc01b44a5d0acd4f3ca67f3..af0b74066c213dc93064a966342c677367568046 100644 --- a/core/client/db/src/cache/list_storage.rs +++ b/core/client/db/src/cache/list_storage.rs @@ -97,19 +97,19 @@ pub struct DbColumns { pub struct DbStorage { name: Vec, meta_key: Vec, - db: Arc, + db: Arc, columns: DbColumns, } impl DbStorage { /// Create new database-backed list cache storage. - pub fn new(name: Vec, db: Arc, columns: DbColumns) -> Self { + pub fn new(name: Vec, db: Arc, columns: DbColumns) -> Self { let meta_key = meta::key(&name); DbStorage { name, meta_key, db, columns } } /// Get reference to the database. - pub fn db(&self) -> &Arc { &self.db } + pub fn db(&self) -> &Arc { &self.db } /// Get reference to the database columns. pub fn columns(&self) -> &DbColumns { &self.columns } diff --git a/core/client/db/src/cache/mod.rs b/core/client/db/src/cache/mod.rs index b5dd45f11dd52e69ea715243924ac5e799e038b1..64d3c4a25e7bf7e2d2a0e594295722b5bd64c307 100644 --- a/core/client/db/src/cache/mod.rs +++ b/core/client/db/src/cache/mod.rs @@ -25,9 +25,9 @@ use client::blockchain::Cache as BlockchainCache; use client::error::Result as ClientResult; use parity_codec::{Encode, Decode}; use runtime_primitives::generic::BlockId; -use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, NumberFor, As}; +use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, NumberFor, Zero}; use consensus_common::well_known_cache_keys::Id as CacheKeyId; -use crate::utils::{self, COLUMN_META}; +use crate::utils::{self, COLUMN_META, db_err}; use self::list_cache::ListCache; @@ -35,8 +35,19 @@ mod list_cache; mod list_entry; mod list_storage; -/// Minimal post-finalization age age of finalized blocks before they'll pruned. -const PRUNE_DEPTH: u64 = 1024; +/// Minimal post-finalization age of finalized blocks before they'll pruned. +const PRUNE_DEPTH: u32 = 1024; + +/// The type of entry that is inserted to the cache. +#[derive(Clone, Copy, Debug, PartialEq)] +pub enum EntryType { + /// Non-final entry. + NonFinal, + /// Final entry. + Final, + /// Genesis entry (inserted during cache initialization). + Genesis, +} /// Block identifier that holds both hash and number. #[derive(Clone, Debug, Encode, Decode, PartialEq)] @@ -66,20 +77,22 @@ impl CacheItemT for T where T: Clone + Decode + Encode + PartialEq {} /// Database-backed blockchain data cache. pub struct DbCache { cache_at: HashMap, self::list_storage::DbStorage>>, - db: Arc, + db: Arc, key_lookup_column: Option, header_column: Option, authorities_column: Option, + genesis_hash: Block::Hash, best_finalized_block: ComplexBlockId, } impl DbCache { /// Create new cache. pub fn new( - db: Arc, + db: Arc, key_lookup_column: Option, header_column: Option, authorities_column: Option, + genesis_hash: Block::Hash, best_finalized_block: ComplexBlockId, ) -> Self { Self { @@ -88,10 +101,16 @@ impl DbCache { key_lookup_column, header_column, authorities_column, + genesis_hash, best_finalized_block, } } + /// Set genesis block hash. + pub fn set_genesis_hash(&mut self, genesis_hash: Block::Hash) { + self.genesis_hash = genesis_hash; + } + /// Begin cache transaction. pub fn transaction<'a>(&'a mut self, tx: &'a mut DBTransaction) -> DbCacheTransaction<'a, Block> { DbCacheTransaction { @@ -131,7 +150,7 @@ impl DbCache { fn get_cache_helper<'a, Block: BlockT>( cache_at: &'a mut HashMap, self::list_storage::DbStorage>>, name: CacheKeyId, - db: &Arc, + db: &Arc, key_lookup: Option, header: Option, cache: Option, @@ -147,7 +166,7 @@ fn get_cache_helper<'a, Block: BlockT>( cache, }, ), - As::sa(PRUNE_DEPTH), + PRUNE_DEPTH.into(), best_finalized_block.clone(), ) }) @@ -182,7 +201,7 @@ impl<'a, Block: BlockT> DbCacheTransaction<'a, Block> { parent: ComplexBlockId, block: ComplexBlockId, data_at: HashMap>, - is_final: bool, + entry_type: EntryType, ) -> ClientResult { assert!(self.cache_at_op.is_empty()); @@ -203,7 +222,7 @@ impl<'a, Block: BlockT> DbCacheTransaction<'a, Block> { parent.clone(), block.clone(), value.or(cache.value_at_block(&parent)?), - is_final, + entry_type, )?; if let Some(op) = op { self.cache_at_op.insert(name, op); @@ -214,8 +233,10 @@ impl<'a, Block: BlockT> DbCacheTransaction<'a, Block> { data_at.into_iter().try_for_each(|(name, data)| insert_op(name, Some(data)))?; missed_caches.into_iter().try_for_each(|name| insert_op(name, None))?; - if is_final { - self.best_finalized_block = Some(block); + match entry_type { + EntryType::Final | EntryType::Genesis => + self.best_finalized_block = Some(block), + EntryType::NonFinal => (), } Ok(self) @@ -254,6 +275,25 @@ impl<'a, Block: BlockT> DbCacheTransaction<'a, Block> { pub struct DbCacheSync(pub RwLock>); impl BlockchainCache for DbCacheSync { + fn initialize(&self, key: &CacheKeyId, data: Vec) -> ClientResult<()> { + let mut cache = self.0.write(); + let genesis_hash = cache.genesis_hash; + let cache_contents = vec![(*key, data)].into_iter().collect(); + let db = cache.db.clone(); + let mut dbtx = DBTransaction::new(); + let tx = cache.transaction(&mut dbtx); + let tx = tx.on_block_insert( + ComplexBlockId::new(Default::default(), Zero::zero()), + ComplexBlockId::new(genesis_hash, Zero::zero()), + cache_contents, + EntryType::Genesis, + )?; + let tx_ops = tx.into_ops(); + db.write(dbtx).map_err(db_err)?; + cache.commit(tx_ops); + Ok(()) + } + fn get_at(&self, key: &CacheKeyId, at: &BlockId) -> Option> { let cache = self.0.read(); let storage = cache.cache_at.get(key)?.storage(); diff --git a/core/client/db/src/lib.rs b/core/client/db/src/lib.rs index a7d793527876b48f2e51c4cc0ef95666d5b20aac..b1c0596a0e26128bf806c4906669fde1044413ff 100644 --- a/core/client/db/src/lib.rs +++ b/core/client/db/src/lib.rs @@ -38,6 +38,7 @@ use std::collections::HashMap; use client::backend::NewBlockState; use client::blockchain::HeaderBackend; use client::ExecutionStrategies; +use client::backend::{StorageCollection, ChildStorageCollection}; use parity_codec::{Decode, Encode}; use hash_db::Hasher; use kvdb::{KeyValueDB, DBTransaction}; @@ -45,13 +46,17 @@ use trie::{MemoryDB, PrefixedMemoryDB, prefixed_key}; use parking_lot::{Mutex, RwLock}; use primitives::{H256, Blake2Hasher, ChangesTrieConfiguration, convert_hash}; use primitives::storage::well_known_keys; -use runtime_primitives::{generic::BlockId, Justification, StorageOverlay, ChildrenStorageOverlay}; -use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, As, NumberFor, Zero, Digest, DigestItem}; -use runtime_primitives::BuildStorage; +use runtime_primitives::{ + generic::{BlockId, DigestItem}, Justification, StorageOverlay, ChildrenStorageOverlay, + BuildStorage +}; +use runtime_primitives::traits::{ + Block as BlockT, Header as HeaderT, NumberFor, Zero, One, SaturatedConversion +}; use state_machine::backend::Backend as StateBackend; use executor::RuntimeInfo; use state_machine::{CodeExecutor, DBValue}; -use crate::utils::{Meta, db_err, meta_keys, open_database, read_db, block_id_to_lookup_key, read_meta}; +use crate::utils::{Meta, db_err, meta_keys, read_db, block_id_to_lookup_key, read_meta}; use client::leaves::{LeafSet, FinalizationDisplaced}; use client::children; use state_db::StateDb; @@ -64,10 +69,104 @@ pub use state_db::PruningMode; use client::in_mem::Backend as InMemoryBackend; const CANONICALIZATION_DELAY: u64 = 4096; -const MIN_BLOCKS_TO_KEEP_CHANGES_TRIES_FOR: u64 = 32768; +const MIN_BLOCKS_TO_KEEP_CHANGES_TRIES_FOR: u32 = 32768; + +/// Default value for storage cache child ratio. +const DEFAULT_CHILD_RATIO: (usize, usize) = (1, 10); /// DB-backed patricia trie state, transaction type is an overlay of changes to commit. -pub type DbState = state_machine::TrieBackend>, Blake2Hasher>; +pub type DbState = state_machine::TrieBackend>, Blake2Hasher>; + +pub struct RefTrackingState { + state: DbState, + storage: Arc>, + parent_hash: Option, +} + +impl RefTrackingState { + fn new(state: DbState, storage: Arc>, parent_hash: Option) -> RefTrackingState { + if let Some(hash) = &parent_hash { + storage.state_db.pin(hash); + } + RefTrackingState { + state, + parent_hash, + storage, + } + } +} + +impl Drop for RefTrackingState { + fn drop(&mut self) { + if let Some(hash) = &self.parent_hash { + self.storage.state_db.unpin(hash); + } + } +} + +impl StateBackend for RefTrackingState { + type Error = >::Error; + type Transaction = >::Transaction; + type TrieBackendStorage = >::TrieBackendStorage; + + fn storage(&self, key: &[u8]) -> Result>, Self::Error> { + self.state.storage(key) + } + + fn storage_hash(&self, key: &[u8]) -> Result, Self::Error> { + self.state.storage_hash(key) + } + + fn child_storage(&self, storage_key: &[u8], key: &[u8]) -> Result>, Self::Error> { + self.state.child_storage(storage_key, key) + } + + fn exists_storage(&self, key: &[u8]) -> Result { + self.state.exists_storage(key) + } + + fn exists_child_storage(&self, storage_key: &[u8], key: &[u8]) -> Result { + self.state.exists_child_storage(storage_key, key) + } + + fn for_keys_with_prefix(&self, prefix: &[u8], f: F) { + self.state.for_keys_with_prefix(prefix, f) + } + + fn for_keys_in_child_storage(&self, storage_key: &[u8], f: F) { + self.state.for_keys_in_child_storage(storage_key, f) + } + + fn storage_root(&self, delta: I) -> (H256, Self::Transaction) + where + I: IntoIterator, Option>)> + { + self.state.storage_root(delta) + } + + fn child_storage_root(&self, storage_key: &[u8], delta: I) -> (Vec, bool, Self::Transaction) + where + I: IntoIterator, Option>)>, + { + self.state.child_storage_root(storage_key, delta) + } + + fn pairs(&self) -> Vec<(Vec, Vec)> { + self.state.pairs() + } + + fn keys(&self, prefix: &[u8]) -> Vec> { + self.state.keys(prefix) + } + + fn child_keys(&self, child_key: &[u8], prefix: &[u8]) -> Vec> { + self.state.child_keys(child_key, prefix) + } + + fn as_trie_backend(&mut self) -> Option<&state_machine::TrieBackend> { + self.state.as_trie_backend() + } +} /// Database settings. pub struct DatabaseSettings { @@ -75,6 +174,8 @@ pub struct DatabaseSettings { pub cache_size: Option, /// State cache size. pub state_cache_size: usize, + /// Ratio of cache size dedicated to child tries. + pub state_cache_child_ratio: Option<(usize, usize)>, /// Path to the database. pub path: PathBuf, /// Pruning mode. @@ -87,7 +188,10 @@ pub fn new_client( executor: E, genesis_storage: S, execution_strategies: ExecutionStrategies, -) -> Result, client::LocalCallExecutor, E>, Block, RA>, client::error::Error> +) -> Result< + client::Client, + client::LocalCallExecutor, E>, Block, RA>, client::error::Error +> where Block: BlockT, E: CodeExecutor + RuntimeInfo, @@ -119,7 +223,7 @@ struct PendingBlock { } // wrapper that implements trait required for state_db -struct StateMetaDb<'a>(&'a KeyValueDB); +struct StateMetaDb<'a>(&'a dyn KeyValueDB); impl<'a> state_db::MetaDb for StateMetaDb<'a> { type Error = io::Error; @@ -131,13 +235,13 @@ impl<'a> state_db::MetaDb for StateMetaDb<'a> { /// Block database pub struct BlockchainDb { - db: Arc, + db: Arc, meta: Arc, Block::Hash>>>, leaves: RwLock>>, } impl BlockchainDb { - fn new(db: Arc) -> Result { + fn new(db: Arc) -> Result { let meta = read_meta::(&*db, columns::META, columns::HEADER)?; let leaves = LeafSet::read_from_db(&*db, columns::META, meta_keys::LEAF_PREFIX)?; Ok(BlockchainDb { @@ -177,15 +281,15 @@ impl client::blockchain::HeaderBackend for BlockchainDb Result, client::error::Error> { + fn info(&self) -> client::blockchain::Info { let meta = self.meta.read(); - Ok(client::blockchain::Info { + client::blockchain::Info { best_hash: meta.best_hash, best_number: meta.best_number, genesis_hash: meta.genesis_hash, finalized_hash: meta.finalized_hash, finalized_number: meta.finalized_number, - }) + } } fn status(&self, id: BlockId) -> Result { @@ -246,7 +350,7 @@ impl client::blockchain::Backend for BlockchainDb { Ok(self.meta.read().finalized_hash.clone()) } - fn cache(&self) -> Option>> { + fn cache(&self) -> Option>> { None } @@ -260,16 +364,17 @@ impl client::blockchain::Backend for BlockchainDb { } impl client::blockchain::ProvideCache for BlockchainDb { - fn cache(&self) -> Option>> { + fn cache(&self) -> Option>> { None } } /// Database transaction pub struct BlockImportOperation { - old_state: CachingState, + old_state: CachingState, Block>, db_updates: PrefixedMemoryDB, - storage_updates: Vec<(Vec, Option>)>, + storage_updates: StorageCollection, + child_storage_updates: ChildStorageCollection, changes_trie_updates: MemoryDB, pending_block: Option>, aux_ops: Vec<(Vec, Option>)>, @@ -292,7 +397,7 @@ impl client::backend::BlockImportOperation for BlockImportOperation where Block: BlockT, { - type State = CachingState; + type State = CachingState, Block>; fn state(&self) -> Result, client::error::Error> { Ok(Some(&self.old_state)) @@ -324,7 +429,11 @@ where Block: BlockT, Ok(()) } - fn reset_storage(&mut self, top: StorageOverlay, children: ChildrenStorageOverlay) -> Result { + fn reset_storage( + &mut self, + top: StorageOverlay, + children: ChildrenStorageOverlay + ) -> Result { if top.iter().any(|(k, _)| well_known_keys::is_child_storage_key(k)) { return Err(client::error::Error::GenesisInvalid.into()); @@ -361,8 +470,13 @@ where Block: BlockT, Ok(()) } - fn update_storage(&mut self, update: Vec<(Vec, Option>)>) -> Result<(), client::error::Error> { + fn update_storage( + &mut self, + update: StorageCollection, + child_update: ChildStorageCollection, + ) -> Result<(), client::error::Error> { self.storage_updates = update; + self.child_storage_updates = child_update; Ok(()) } @@ -379,7 +493,7 @@ where Block: BlockT, } struct StorageDb { - pub db: Arc, + pub db: Arc, pub state_db: StateDb>, } @@ -418,13 +532,13 @@ impl state_machine::Storage for DbGenesisStorage { } pub struct DbChangesTrieStorage { - db: Arc, + db: Arc, meta: Arc, Block::Hash>>>, - min_blocks_to_keep: Option, + min_blocks_to_keep: Option, _phantom: ::std::marker::PhantomData, } -impl DbChangesTrieStorage { +impl> DbChangesTrieStorage { /// Commit new changes trie. pub fn commit(&self, tx: &mut DBTransaction, mut changes_trie: MemoryDB) { for (key, (val, _)) in changes_trie.drain() { @@ -433,7 +547,13 @@ impl DbChangesTrieStorage { } /// Prune obsolete changes tries. - pub fn prune(&self, config: &ChangesTrieConfiguration, tx: &mut DBTransaction, block_hash: Block::Hash, block_num: NumberFor) { + pub fn prune( + &self, + config: &ChangesTrieConfiguration, + tx: &mut DBTransaction, + block_hash: Block::Hash, + block_num: NumberFor, + ) { // never prune on archive nodes let min_blocks_to_keep = match self.min_blocks_to_keep { Some(min_blocks_to_keep) => min_blocks_to_keep, @@ -443,53 +563,79 @@ impl DbChangesTrieStorage { state_machine::prune_changes_tries( config, &*self, - min_blocks_to_keep, + min_blocks_to_keep.into(), &state_machine::ChangesTrieAnchorBlockId { hash: convert_hash(&block_hash), - number: block_num.as_(), + number: block_num, }, |node| tx.delete(columns::CHANGES_TRIE, node.as_ref())); } } -impl client::backend::PrunableStateChangesTrieStorage for DbChangesTrieStorage { +impl client::backend::PrunableStateChangesTrieStorage + for DbChangesTrieStorage +where + Block: BlockT, +{ fn oldest_changes_trie_block( &self, config: &ChangesTrieConfiguration, - best_finalized_block: u64 - ) -> u64 { + best_finalized_block: NumberFor, + ) -> NumberFor { match self.min_blocks_to_keep { Some(min_blocks_to_keep) => state_machine::oldest_non_pruned_changes_trie( config, - min_blocks_to_keep, + min_blocks_to_keep.into(), best_finalized_block, ), - None => 1, + None => One::one(), } } } -impl state_machine::ChangesTrieRootsStorage for DbChangesTrieStorage { - fn root(&self, anchor: &state_machine::ChangesTrieAnchorBlockId, block: u64) -> Result, String> { +impl state_machine::ChangesTrieRootsStorage> + for DbChangesTrieStorage +where + Block: BlockT, +{ + fn build_anchor( + &self, + hash: H256, + ) -> Result>, String> { + utils::read_header::(&*self.db, columns::KEY_LOOKUP, columns::HEADER, BlockId::Hash(hash)) + .map_err(|e| e.to_string()) + .and_then(|maybe_header| maybe_header.map(|header| + state_machine::ChangesTrieAnchorBlockId { + hash, + number: *header.number(), + } + ).ok_or_else(|| format!("Unknown header: {}", hash))) + } + + fn root( + &self, + anchor: &state_machine::ChangesTrieAnchorBlockId>, + block: NumberFor, + ) -> Result, String> { // check API requirement: we can't get NEXT block(s) based on anchor if block > anchor.number { return Err(format!("Can't get changes trie root at {} using anchor at {}", block, anchor.number)); } // we need to get hash of the block to resolve changes trie root - let block_id = if block <= self.meta.read().finalized_number.as_() { + let block_id = if block <= self.meta.read().finalized_number { // if block is finalized, we could just read canonical hash - BlockId::Number(As::sa(block)) + BlockId::Number(block) } else { // the block is not finalized let mut current_num = anchor.number; let mut current_hash: Block::Hash = convert_hash(&anchor.hash); let maybe_anchor_header: Block::Header = utils::require_header::( - &*self.db, columns::KEY_LOOKUP, columns::HEADER, BlockId::Number(As::sa(current_num)) + &*self.db, columns::KEY_LOOKUP, columns::HEADER, BlockId::Number(current_num) ).map_err(|e| e.to_string())?; if maybe_anchor_header.hash() == current_hash { // if anchor is canonicalized, then the block is also canonicalized - BlockId::Number(As::sa(block)) + BlockId::Number(block) } else { // else (block is not finalized + anchor is not canonicalized): // => we should find the required block hash by traversing @@ -500,7 +646,7 @@ impl state_machine::ChangesTrieRootsStorage for DbC ).map_err(|e| e.to_string())?; current_hash = *current_header.parent_hash(); - current_num = current_num - 1; + current_num = current_num - One::one(); } BlockId::Hash(current_hash) @@ -514,7 +660,11 @@ impl state_machine::ChangesTrieRootsStorage for DbC } } -impl state_machine::ChangesTrieStorage for DbChangesTrieStorage { +impl state_machine::ChangesTrieStorage> + for DbChangesTrieStorage +where + Block: BlockT, +{ fn get(&self, key: &H256, _prefix: &[u8]) -> Result, String> { self.db.get(columns::CHANGES_TRIE, &key[..]) .map_err(|err| format!("{}", err)) @@ -532,6 +682,7 @@ pub struct Backend { blockchain: BlockchainDb, canonicalization_delay: u64, shared_cache: SharedCache, + import_lock: Mutex<()>, } impl> Backend { @@ -539,9 +690,20 @@ impl> Backend { /// /// The pruning window is how old a block must be before the state is pruned. pub fn new(config: DatabaseSettings, canonicalization_delay: u64) -> Result { - let db = open_database(&config, columns::META, "full")?; + Self::new_inner(config, canonicalization_delay) + } + + #[cfg(feature = "kvdb-rocksdb")] + fn new_inner(config: DatabaseSettings, canonicalization_delay: u64) -> Result { + let db = crate::utils::open_database(&config, columns::META, "full")?; + Backend::from_kvdb(db as Arc<_>, canonicalization_delay, &config) + } - Backend::from_kvdb(db as Arc<_>, config.pruning, canonicalization_delay, config.state_cache_size) + #[cfg(not(feature = "kvdb-rocksdb"))] + fn new_inner(config: DatabaseSettings, canonicalization_delay: u64) -> Result { + log::warn!("Running without the RocksDB feature. The database will NOT be saved."); + let db = Arc::new(kvdb_memorydb::create(crate::utils::NUM_COLUMNS)); + Backend::from_kvdb(db as Arc<_>, canonicalization_delay, &config) } #[cfg(any(test, feature = "test-helpers"))] @@ -549,21 +711,36 @@ impl> Backend { use utils::NUM_COLUMNS; let db = Arc::new(::kvdb_memorydb::create(NUM_COLUMNS)); + Self::new_test_db(keep_blocks, canonicalization_delay, db as Arc<_>) + } + #[cfg(any(test, feature = "test-helpers"))] + pub fn new_test_db(keep_blocks: u32, canonicalization_delay: u64, db: Arc) -> Self { + + let db_setting = DatabaseSettings { + cache_size: None, + state_cache_size: 16777216, + state_cache_child_ratio: Some((50, 100)), + path: Default::default(), + pruning: PruningMode::keep_blocks(keep_blocks), + }; Backend::from_kvdb( - db as Arc<_>, - PruningMode::keep_blocks(keep_blocks), + db, canonicalization_delay, - 16777216, + &db_setting, ).expect("failed to create test-db") } - fn from_kvdb(db: Arc, pruning: PruningMode, canonicalization_delay: u64, state_cache_size: usize) -> Result { - let is_archive_pruning = pruning.is_archive(); + fn from_kvdb( + db: Arc, + canonicalization_delay: u64, + config: &DatabaseSettings + ) -> Result { + let is_archive_pruning = config.pruning.is_archive(); 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(config.pruning.clone(), &StateMetaDb(&*db)).map_err(map_e)?; let storage_db = StorageDb { db: db.clone(), state_db, @@ -581,7 +758,11 @@ impl> Backend { changes_trie_config: Mutex::new(None), blockchain, canonicalization_delay, - shared_cache: new_shared_cache(state_cache_size), + shared_cache: new_shared_cache( + config.state_cache_size, + config.state_cache_child_ratio.unwrap_or(DEFAULT_CHILD_RATIO), + ), + import_lock: Default::default(), }) } @@ -607,7 +788,7 @@ impl> Backend { } // insert all other headers + bodies + justifications - let info = self.blockchain.info().unwrap(); + let info = self.blockchain.info(); for (number, hash, header) in headers { let id = BlockId::Hash(hash); let justification = self.blockchain.justification(id).unwrap(); @@ -770,7 +951,7 @@ impl> Backend { ) -> Result<(), client::error::Error> { - let number_u64 = number.as_(); + let number_u64 = number.saturated_into::(); if number_u64 > self.canonicalization_delay { let new_canonical = number_u64 - self.canonicalization_delay; @@ -781,7 +962,7 @@ impl> Backend { let hash = if new_canonical == number_u64 { hash } else { - ::client::blockchain::HeaderBackend::hash(&self.blockchain, As::sa(new_canonical))? + ::client::blockchain::HeaderBackend::hash(&self.blockchain, new_canonical.saturated_into())? .expect("existence of block with number `new_canonical` \ implies existence of blocks with all numbers before it; qed") }; @@ -865,7 +1046,7 @@ impl> Backend { changeset.deleted.push(key); } } - let number_u64 = number.as_(); + let number_u64 = number.saturated_into::(); let commit = self.storage.state_db.insert_block(&hash, number_u64, &pending_block.header.parent_hash(), changeset) .map_err(|e: state_db::Error| client::error::Error::from(format!("State database error: {:?}", e)))?; apply_state_commit(&mut transaction, commit); @@ -878,6 +1059,8 @@ impl> Backend { let changes_trie_updates = operation.changes_trie_updates; self.changes_tries_storage.commit(&mut transaction, changes_trie_updates); + let cache = operation.old_state.release(); // release state reference so that it can be finalized + if finalized { // TODO: ensure best chain contains this block. @@ -909,7 +1092,7 @@ impl> Backend { meta_updates.push((hash, number, pending_block.leaf_state.is_best(), finalized)); - Some((number, hash, enacted, retracted, displaced_leaf, is_best)) + Some((number, hash, enacted, retracted, displaced_leaf, is_best, cache)) } else { None }; @@ -931,7 +1114,7 @@ impl> Backend { let write_result = self.storage.db.write(transaction).map_err(db_err); - if let Some((number, hash, enacted, retracted, displaced_leaf, is_best)) = imported { + if let Some((number, hash, enacted, retracted, displaced_leaf, is_best, mut cache)) = imported { if let Err(e) = write_result { let mut leaves = self.blockchain.leaves.write(); let mut undo = leaves.undo(); @@ -946,10 +1129,11 @@ impl> Backend { return Err(e) } - operation.old_state.sync_cache( + cache.sync_cache( &enacted, &retracted, operation.storage_updates, + operation.child_storage_updates, Some(hash), Some(number), || is_best, @@ -978,7 +1162,7 @@ impl> Backend { { let f_num = f_header.number().clone(); - if self.storage.state_db.best_canonical().map(|c| f_num.as_() > c).unwrap_or(true) { + if self.storage.state_db.best_canonical().map(|c| f_num.saturated_into::() > c).unwrap_or(true) { let parent_hash = f_header.parent_hash().clone(); let lookup_key = utils::number_and_hash_to_lookup_key(f_num, f_hash.clone()); @@ -1046,7 +1230,7 @@ impl client::backend::AuxStore for Backend where Block: BlockT client::backend::Backend for Backend where Block: BlockT { type BlockImportOperation = BlockImportOperation; type Blockchain = BlockchainDb; - type State = CachingState; + type State = CachingState, Block>; type ChangesTrieStorage = DbChangesTrieStorage; fn begin_operation(&self) -> Result { @@ -1056,6 +1240,7 @@ impl client::backend::Backend for Backend whe old_state, db_updates: PrefixedMemoryDB::default(), storage_updates: Default::default(), + child_storage_updates: Default::default(), changes_trie_updates: MemoryDB::default(), aux_ops: Vec::new(), finalized_blocks: Vec::new(), @@ -1121,14 +1306,14 @@ impl client::backend::Backend for Backend whe } fn revert(&self, n: NumberFor) -> Result, client::error::Error> { - let mut best = self.blockchain.info()?.best_number; - let finalized = self.blockchain.info()?.finalized_number; + let mut best = self.blockchain.info().best_number; + let finalized = self.blockchain.info().finalized_number; let revertible = best - finalized; let n = if revertible < n { revertible } else { n }; - for c in 0 .. n.as_() { - if best == As::sa(0) { - return Ok(As::sa(c)) + for c in 0 .. n.saturated_into::() { + if best.is_zero() { + return Ok(c.saturated_into::>()) } let mut transaction = DBTransaction::new(); match self.storage.state_db.revert_one() { @@ -1138,7 +1323,7 @@ impl client::backend::Backend for Backend whe || client::error::Error::UnknownBlock( format!("Error reverting to {}. Block hash not found.", best)))?; - best -= As::sa(1); // prev block + best -= One::one(); // prev block let hash = self.blockchain.hash(best)?.ok_or_else( || client::error::Error::UnknownBlock( format!("Error reverting to {}. Block hash not found.", best)))?; @@ -1150,7 +1335,7 @@ impl client::backend::Backend for Backend whe self.blockchain.update_meta(hash, best, true, false); self.blockchain.leaves.write().revert(removed.hash().clone(), removed.number().clone(), removed.parent_hash().clone()); } - None => return Ok(As::sa(c)) + None => return Ok(c.saturated_into::>()) } } Ok(n) @@ -1173,7 +1358,8 @@ impl client::backend::Backend for Backend whe BlockId::Hash(h) if h == Default::default() => { let genesis_storage = DbGenesisStorage::new(); let root = genesis_storage.0.clone(); - let state = DbState::new(Arc::new(genesis_storage), root); + let db_state = DbState::new(Arc::new(genesis_storage), root); + let state = RefTrackingState::new(db_state, self.storage.clone(), None); return Ok(CachingState::new(state, self.shared_cache.clone(), None)); }, _ => {} @@ -1182,9 +1368,10 @@ impl client::backend::Backend for Backend whe match self.blockchain.header(block) { Ok(Some(ref hdr)) => { let hash = hdr.hash(); - if !self.storage.state_db.is_pruned(&hash, hdr.number().as_()) { + if !self.storage.state_db.is_pruned(&hash, (*hdr.number()).saturated_into::()) { let root = H256::from_slice(hdr.state_root().as_ref()); - let state = DbState::new(self.storage.clone(), root); + let db_state = DbState::new(self.storage.clone(), root); + let state = RefTrackingState::new(db_state, self.storage.clone(), Some(hash.clone())); Ok(CachingState::new(state, self.shared_cache.clone(), Some(hash))) } else { Err(client::error::Error::UnknownBlock(format!("State already discarded for {:?}", block))) @@ -1196,16 +1383,20 @@ impl client::backend::Backend for Backend whe } fn have_state_at(&self, hash: &Block::Hash, number: NumberFor) -> bool { - !self.storage.state_db.is_pruned(hash, number.as_()) + !self.storage.state_db.is_pruned(hash, number.saturated_into::()) } - fn destroy_state(&self, mut state: Self::State) -> Result<(), client::error::Error> { - if let Some(hash) = state.parent_hash.clone() { + fn destroy_state(&self, state: Self::State) -> Result<(), client::error::Error> { + if let Some(hash) = state.cache.parent_hash.clone() { let is_best = || self.blockchain.meta.read().best_hash == hash; - state.sync_cache(&[], &[], vec![], None, None, is_best); + state.release().sync_cache(&[], &[], vec![], vec![], None, None, is_best); } Ok(()) } + + fn get_import_lock(&self) -> &Mutex<()> { + &self.import_lock + } } impl client::backend::LocalBackend for Backend @@ -1249,7 +1440,6 @@ mod tests { changes: Vec<(Vec, Vec)>, extrinsics_root: H256, ) -> H256 { - use runtime_primitives::generic::DigestItem; use runtime_primitives::testing::Digest; let (changes_root, changes_trie_update) = prepare_changes(changes); @@ -1323,8 +1513,8 @@ mod tests { db.storage.db.clone() }; - let backend = Backend::::from_kvdb(backing, PruningMode::keep_blocks(1), 0, 16777216).unwrap(); - assert_eq!(backend.blockchain().info().unwrap().best_number, 9); + let backend = Backend::::new_test_db(1, 0, backing); + assert_eq!(backend.blockchain().info().best_number, 9); for i in 0..10 { assert!(backend.blockchain().hash(i).unwrap().is_some()) } diff --git a/core/client/db/src/light.rs b/core/client/db/src/light.rs index a571ffe142920578f9435e67c02033081f04719b..0abce00528d37dbb3f12b05b95b4cef3104b40c3 100644 --- a/core/client/db/src/light.rs +++ b/core/client/db/src/light.rs @@ -17,6 +17,7 @@ //! RocksDB-based light client blockchain storage. use std::{sync::Arc, collections::HashMap}; +use std::convert::TryInto; use parking_lot::RwLock; use kvdb::{KeyValueDB, DBTransaction}; @@ -30,13 +31,11 @@ use client::error::{Error as ClientError, Result as ClientResult}; use client::light::blockchain::Storage as LightBlockchainStorage; use parity_codec::{Decode, Encode}; use primitives::Blake2Hasher; -use runtime_primitives::generic::BlockId; -use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, - Zero, One, As, NumberFor, Digest, DigestItem}; +use runtime_primitives::generic::{DigestItem, BlockId}; +use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, Zero, One, NumberFor}; use consensus_common::well_known_cache_keys; -use crate::cache::{DbCacheSync, DbCache, ComplexBlockId}; -use crate::utils::{self, meta_keys, Meta, db_err, open_database, - read_db, block_id_to_lookup_key, read_meta}; +use crate::cache::{DbCacheSync, DbCache, ComplexBlockId, EntryType as CacheEntryType}; +use crate::utils::{self, meta_keys, Meta, db_err, read_db, block_id_to_lookup_key, read_meta}; use crate::DatabaseSettings; use log::{trace, warn, debug}; @@ -57,7 +56,7 @@ const CHANGES_TRIE_CHT_PREFIX: u8 = 1; /// Light blockchain storage. Stores most recent headers + CHTs for older headers. /// Locks order: meta, leaves, cache. pub struct LightStorage { - db: Arc, + db: Arc, meta: RwLock, Block::Hash>>, leaves: RwLock>>, cache: Arc>, @@ -69,8 +68,19 @@ impl LightStorage { /// Create new storage with given settings. pub fn new(config: DatabaseSettings) -> ClientResult { - let db = open_database(&config, columns::META, "light")?; + Self::new_inner(config) + } + + #[cfg(feature = "kvdb-rocksdb")] + fn new_inner(config: DatabaseSettings) -> ClientResult { + let db = crate::utils::open_database(&config, columns::META, "light")?; + Self::from_kvdb(db as Arc<_>) + } + #[cfg(not(feature = "kvdb-rocksdb"))] + fn new_inner(_config: DatabaseSettings) -> ClientResult { + log::warn!("Running without the RocksDB feature. The database will NOT be saved."); + let db = Arc::new(kvdb_memorydb::create(crate::utils::NUM_COLUMNS)); Self::from_kvdb(db as Arc<_>) } @@ -83,7 +93,7 @@ impl LightStorage Self::from_kvdb(db as Arc<_>).expect("failed to create test-db") } - fn from_kvdb(db: Arc) -> ClientResult { + fn from_kvdb(db: Arc) -> ClientResult { let meta = read_meta::(&*db, columns::META, columns::HEADER)?; let leaves = LeafSet::read_from_db(&*db, columns::META, meta_keys::LEAF_PREFIX)?; let cache = DbCache::new( @@ -91,6 +101,7 @@ impl LightStorage columns::KEY_LOOKUP, columns::HEADER, columns::CACHE, + meta.genesis_hash, ComplexBlockId::new(meta.finalized_hash, meta.finalized_number), ); @@ -141,15 +152,15 @@ impl BlockchainHeaderBackend for LightStorage utils::read_header(&*self.db, columns::KEY_LOOKUP, columns::HEADER, id) } - fn info(&self) -> ClientResult> { + fn info(&self) -> BlockchainInfo { let meta = self.meta.read(); - Ok(BlockchainInfo { + BlockchainInfo { best_hash: meta.best_hash, best_number: meta.best_number, genesis_hash: meta.genesis_hash, finalized_hash: meta.finalized_hash, finalized_number: meta.finalized_number, - }) + } } fn status(&self, id: BlockId) -> ClientResult { @@ -266,12 +277,18 @@ impl LightStorage { transaction.put(columns::META, meta_keys::FINALIZED_BLOCK, &lookup_key); // build new CHT(s) if required - if let Some(new_cht_number) = cht::is_build_required(cht::SIZE, *header.number()) { - let new_cht_start: NumberFor = cht::start_number(cht::SIZE, new_cht_number); + if let Some(new_cht_number) = cht::is_build_required(cht::size(), *header.number()) { + let new_cht_start: NumberFor = cht::start_number(cht::size(), new_cht_number); + + let mut current_num = new_cht_start; + let cht_range = ::std::iter::from_fn(|| { + let old_current_num = current_num; + current_num = current_num + One::one(); + Some(old_current_num) + }); let new_header_cht_root = cht::compute_root::( - cht::SIZE, new_cht_number, (new_cht_start.as_()..) - .map(|num| self.hash(As::sa(num))) + cht::size(), new_cht_number, cht_range.map(|num| self.hash(num)) )?; transaction.put( columns::CHT, @@ -281,9 +298,15 @@ impl LightStorage { // if the header includes changes trie root, let's build a changes tries roots CHT if header.digest().log(DigestItem::as_changes_trie_root).is_some() { + let mut current_num = new_cht_start; + let cht_range = ::std::iter::from_fn(|| { + let old_current_num = current_num; + current_num = current_num + One::one(); + Some(old_current_num) + }); let new_changes_trie_cht_root = cht::compute_root::( - cht::SIZE, new_cht_number, (new_cht_start.as_()..) - .map(|num| self.changes_trie_root(BlockId::Number(As::sa(num)))) + cht::size(), new_cht_number, cht_range + .map(|num| self.changes_trie_root(BlockId::Number(num))) )?; transaction.put( columns::CHT, @@ -294,7 +317,7 @@ impl LightStorage { // prune headers that are replaced with CHT let mut prune_block = new_cht_start; - let new_cht_end = cht::end_number(cht::SIZE, new_cht_number); + let new_cht_end = cht::end_number(cht::size(), new_cht_number); trace!(target: "db", "Replacing blocks [{}..{}] with CHT#{}", new_cht_start, new_cht_end, new_cht_number); @@ -327,7 +350,7 @@ impl LightStorage { fn read_cht_root( &self, cht_type: u8, - cht_size: u64, + cht_size: NumberFor, block: NumberFor ) -> ClientResult { let no_cht_for_block = || ClientError::Backend(format!("CHT for block {} not exists", block)); @@ -406,6 +429,7 @@ impl LightBlockchainStorage for LightStorage let is_genesis = number.is_zero(); if is_genesis { + self.cache.0.write().set_genesis_hash(hash); transaction.put(columns::META, meta_keys::GENESIS_HASH, hash.as_ref()); } @@ -434,7 +458,7 @@ impl LightBlockchainStorage for LightStorage ComplexBlockId::new(*header.parent_hash(), if number.is_zero() { Zero::zero() } else { number - One::one() }), ComplexBlockId::new(hash, number), cache_at, - finalized, + if finalized { CacheEntryType::Final } else { CacheEntryType::NonFinal }, )? .into_ops(); @@ -478,11 +502,19 @@ impl LightBlockchainStorage for LightStorage } } - fn header_cht_root(&self, cht_size: u64, block: NumberFor) -> ClientResult { + fn header_cht_root( + &self, + cht_size: NumberFor, + block: NumberFor, + ) -> ClientResult { self.read_cht_root(HEADER_CHT_PREFIX, cht_size, block) } - fn changes_trie_cht_root(&self, cht_size: u64, block: NumberFor) -> ClientResult { + fn changes_trie_cht_root( + &self, + cht_size: NumberFor, + block: NumberFor, + ) -> ClientResult { self.read_cht_root(CHANGES_TRIE_CHT_PREFIX, cht_size, block) } @@ -522,13 +554,13 @@ impl LightBlockchainStorage for LightStorage Ok(self.meta.read().finalized_hash.clone()) } - fn cache(&self) -> Option>> { + fn cache(&self) -> Option>> { Some(self.cache.clone()) } } /// Build the key for inserting header-CHT at given block. -fn cht_key>(cht_type: u8, block: N) -> [u8; 5] { +fn cht_key>(cht_type: u8, block: N) -> [u8; 5] { let mut key = [cht_type; 5]; key[1..].copy_from_slice(&utils::number_index_key(block)); key @@ -539,11 +571,10 @@ pub(crate) mod tests { use client::cht; use runtime_primitives::generic::DigestItem; use runtime_primitives::testing::{H256 as Hash, Header, Block as RawBlock, ExtrinsicWrapper}; - use runtime_primitives::traits::AuthorityIdFor; use super::*; type Block = RawBlock>; - type AuthorityId = AuthorityIdFor; + type AuthorityId = primitives::ed25519::Public; pub fn default_header(parent: &Hash, number: u64) -> Header { Header { @@ -620,12 +651,12 @@ pub(crate) mod tests { fn returns_info() { let db = LightStorage::new_test(); let genesis_hash = insert_block(&db, HashMap::new(), || default_header(&Default::default(), 0)); - let info = db.info().unwrap(); + let info = db.info(); assert_eq!(info.best_hash, genesis_hash); assert_eq!(info.best_number, 0); assert_eq!(info.genesis_hash, genesis_hash); let best_hash = insert_block(&db, HashMap::new(), || default_header(&genesis_hash, 1)); - let info = db.info().unwrap(); + let info = db.info(); assert_eq!(info.best_hash, best_hash); assert_eq!(info.best_number, 1); assert_eq!(info.genesis_hash, genesis_hash); @@ -666,33 +697,44 @@ pub(crate) mod tests { fn finalized_ancient_headers_are_replaced_with_cht() { fn insert_headers Header>(header_producer: F) -> LightStorage { let db = LightStorage::new_test(); + let cht_size: u64 = cht::size(); + let ucht_size: usize = cht_size as _; // insert genesis block header (never pruned) let mut prev_hash = insert_final_block(&db, HashMap::new(), || header_producer(&Default::default(), 0)); // insert SIZE blocks && ensure that nothing is pruned - for number in 0..cht::SIZE { + + for number in 0..cht::size() { prev_hash = insert_block(&db, HashMap::new(), || header_producer(&prev_hash, 1 + number)); } - assert_eq!(db.db.iter(columns::HEADER).count(), (1 + cht::SIZE) as usize); + assert_eq!(db.db.iter(columns::HEADER).count(), 1 + ucht_size); assert_eq!(db.db.iter(columns::CHT).count(), 0); // insert next SIZE blocks && ensure that nothing is pruned - for number in 0..cht::SIZE { - prev_hash = insert_block(&db, HashMap::new(), || header_producer(&prev_hash, 1 + cht::SIZE + number)); + for number in 0..(cht_size as _) { + prev_hash = insert_block( + &db, + HashMap::new(), + || header_producer(&prev_hash, 1 + cht_size + number), + ); } - assert_eq!(db.db.iter(columns::HEADER).count(), (1 + cht::SIZE + cht::SIZE) as usize); + assert_eq!(db.db.iter(columns::HEADER).count(), 1 + ucht_size + ucht_size); assert_eq!(db.db.iter(columns::CHT).count(), 0); - // insert block #{2 * cht::SIZE + 1} && check that new CHT is created + headers of this CHT are pruned + // insert block #{2 * cht::size() + 1} && check that new CHT is created + headers of this CHT are pruned // nothing is yet finalized, so nothing is pruned. - prev_hash = insert_block(&db, HashMap::new(), || header_producer(&prev_hash, 1 + cht::SIZE + cht::SIZE)); - assert_eq!(db.db.iter(columns::HEADER).count(), (2 + cht::SIZE + cht::SIZE) as usize); + prev_hash = insert_block( + &db, + HashMap::new(), + || header_producer(&prev_hash, 1 + cht_size + cht_size), + ); + assert_eq!(db.db.iter(columns::HEADER).count(), 2 + ucht_size + ucht_size); assert_eq!(db.db.iter(columns::CHT).count(), 0); // now finalize the block. - for i in (0..(cht::SIZE + cht::SIZE)).map(|i| i + 1) { - db.finalize_header(BlockId::Number(i)).unwrap(); + for i in (0..(ucht_size + ucht_size)).map(|i| i + 1) { + db.finalize_header(BlockId::Number(i as _)).unwrap(); } db.finalize_header(BlockId::Hash(prev_hash)).unwrap(); db @@ -700,34 +742,36 @@ pub(crate) mod tests { // when headers are created without changes tries roots let db = insert_headers(default_header); - assert_eq!(db.db.iter(columns::HEADER).count(), (1 + cht::SIZE + 1) as usize); - assert_eq!(db.db.iter(columns::KEY_LOOKUP).count(), (2 * (1 + cht::SIZE + 1)) as usize); + let cht_size: u64 = cht::size(); + assert_eq!(db.db.iter(columns::HEADER).count(), (1 + cht_size + 1) as usize); + assert_eq!(db.db.iter(columns::KEY_LOOKUP).count(), (2 * (1 + cht_size + 1)) as usize); assert_eq!(db.db.iter(columns::CHT).count(), 1); - assert!((0..cht::SIZE).all(|i| db.header(BlockId::Number(1 + i)).unwrap().is_none())); - assert!(db.header_cht_root(cht::SIZE, cht::SIZE / 2).is_ok()); - assert!(db.header_cht_root(cht::SIZE, cht::SIZE + cht::SIZE / 2).is_err()); - assert!(db.changes_trie_cht_root(cht::SIZE, cht::SIZE / 2).is_err()); - assert!(db.changes_trie_cht_root(cht::SIZE, cht::SIZE + cht::SIZE / 2).is_err()); + assert!((0..cht_size as _).all(|i| db.header(BlockId::Number(1 + i)).unwrap().is_none())); + assert!(db.header_cht_root(cht_size, cht_size / 2).is_ok()); + assert!(db.header_cht_root(cht_size, cht_size + cht_size / 2).is_err()); + assert!(db.changes_trie_cht_root(cht_size, cht_size / 2).is_err()); + assert!(db.changes_trie_cht_root(cht_size, cht_size + cht_size / 2).is_err()); // when headers are created with changes tries roots let db = insert_headers(header_with_changes_trie); - assert_eq!(db.db.iter(columns::HEADER).count(), (1 + cht::SIZE + 1) as usize); + assert_eq!(db.db.iter(columns::HEADER).count(), (1 + cht_size + 1) as usize); assert_eq!(db.db.iter(columns::CHT).count(), 2); - assert!((0..cht::SIZE).all(|i| db.header(BlockId::Number(1 + i)).unwrap().is_none())); - assert!(db.header_cht_root(cht::SIZE, cht::SIZE / 2).is_ok()); - assert!(db.header_cht_root(cht::SIZE, cht::SIZE + cht::SIZE / 2).is_err()); - assert!(db.changes_trie_cht_root(cht::SIZE, cht::SIZE / 2).is_ok()); - assert!(db.changes_trie_cht_root(cht::SIZE, cht::SIZE + cht::SIZE / 2).is_err()); + assert!((0..cht_size as _).all(|i| db.header(BlockId::Number(1 + i)).unwrap().is_none())); + assert!(db.header_cht_root(cht_size, cht_size / 2).is_ok()); + assert!(db.header_cht_root(cht_size, cht_size + cht_size / 2).is_err()); + assert!(db.changes_trie_cht_root(cht_size, cht_size / 2).is_ok()); + assert!(db.changes_trie_cht_root(cht_size, cht_size + cht_size / 2).is_err()); } #[test] fn get_cht_fails_for_genesis_block() { - assert!(LightStorage::::new_test().header_cht_root(cht::SIZE, 0).is_err()); + assert!(LightStorage::::new_test().header_cht_root(cht::size(), 0).is_err()); } #[test] fn get_cht_fails_for_non_existant_cht() { - assert!(LightStorage::::new_test().header_cht_root(cht::SIZE, (cht::SIZE / 2) as u64).is_err()); + let cht_size: u64 = cht::size(); + assert!(LightStorage::::new_test().header_cht_root(cht_size, cht_size / 2).is_err()); } #[test] @@ -736,20 +780,22 @@ pub(crate) mod tests { // insert 1 + SIZE + SIZE + 1 blocks so that CHT#0 is created let mut prev_hash = insert_final_block(&db, HashMap::new(), || header_with_changes_trie(&Default::default(), 0)); - for i in 1..1 + cht::SIZE + cht::SIZE + 1 { + let cht_size: u64 = cht::size(); + let ucht_size: usize = cht_size as _; + for i in 1..1 + ucht_size + ucht_size + 1 { prev_hash = insert_block(&db, HashMap::new(), || header_with_changes_trie(&prev_hash, i as u64)); db.finalize_header(BlockId::Hash(prev_hash)).unwrap(); } - let cht_root_1 = db.header_cht_root(cht::SIZE, cht::start_number(cht::SIZE, 0)).unwrap(); - let cht_root_2 = db.header_cht_root(cht::SIZE, (cht::start_number(cht::SIZE, 0) + cht::SIZE / 2) as u64).unwrap(); - let cht_root_3 = db.header_cht_root(cht::SIZE, cht::end_number(cht::SIZE, 0)).unwrap(); + let cht_root_1 = db.header_cht_root(cht_size, cht::start_number(cht_size, 0)).unwrap(); + let cht_root_2 = db.header_cht_root(cht_size, cht::start_number(cht_size, 0) + cht_size / 2).unwrap(); + let cht_root_3 = db.header_cht_root(cht_size, cht::end_number(cht_size, 0)).unwrap(); assert_eq!(cht_root_1, cht_root_2); assert_eq!(cht_root_2, cht_root_3); - let cht_root_1 = db.changes_trie_cht_root(cht::SIZE, cht::start_number(cht::SIZE, 0)).unwrap(); - let cht_root_2 = db.changes_trie_cht_root(cht::SIZE, (cht::start_number(cht::SIZE, 0) + cht::SIZE / 2) as u64).unwrap(); - let cht_root_3 = db.changes_trie_cht_root(cht::SIZE, cht::end_number(cht::SIZE, 0)).unwrap(); + let cht_root_1 = db.changes_trie_cht_root(cht_size, cht::start_number(cht_size, 0)).unwrap(); + let cht_root_2 = db.changes_trie_cht_root(cht_size, cht::start_number(cht_size, 0) + cht_size / 2).unwrap(); + let cht_root_3 = db.changes_trie_cht_root(cht_size, cht::end_number(cht_size, 0)).unwrap(); assert_eq!(cht_root_1, cht_root_2); assert_eq!(cht_root_2, cht_root_3); } @@ -821,7 +867,7 @@ pub(crate) mod tests { fn authorities_are_cached() { let db = LightStorage::new_test(); - fn run_checks(db: &LightStorage, max: u64, checks: &[(u64, Option>>)]) { + fn run_checks(db: &LightStorage, max: u64, checks: &[(u64, Option>)]) { for (at, expected) in checks.iter().take_while(|(at, _)| *at <= max) { let actual = get_authorities(db.cache(), BlockId::Number(*at)); assert_eq!(*expected, actual); @@ -838,7 +884,7 @@ pub(crate) mod tests { map } - fn get_authorities(cache: &BlockchainCache, at: BlockId) -> Option> { + fn get_authorities(cache: &dyn BlockchainCache, at: BlockId) -> Option> { cache.get_at(&well_known_cache_keys::AUTHORITIES, &at).and_then(|val| Decode::decode(&mut &val[..])) } @@ -984,12 +1030,12 @@ pub(crate) mod tests { fn database_is_reopened() { let db = LightStorage::new_test(); let hash0 = insert_final_block(&db, HashMap::new(), || default_header(&Default::default(), 0)); - assert_eq!(db.info().unwrap().best_hash, hash0); + assert_eq!(db.info().best_hash, hash0); assert_eq!(db.header(BlockId::Hash(hash0)).unwrap().unwrap().hash(), hash0); let db = db.db; let db = LightStorage::from_kvdb(db).unwrap(); - assert_eq!(db.info().unwrap().best_hash, hash0); + assert_eq!(db.info().best_hash, hash0); assert_eq!(db.header(BlockId::Hash::(hash0)).unwrap().unwrap().hash(), hash0); } @@ -1040,4 +1086,24 @@ pub(crate) mod tests { // leaves at same height stay. Leaves at lower heights pruned. assert_eq!(db.leaves.read().hashes(), vec![block2_a, block2_b, block2_c]); } + + #[test] + fn cache_can_be_initialized_after_genesis_inserted() { + let db = LightStorage::::new_test(); + + // before cache is initialized => None + assert_eq!(db.cache().get_at(b"test", &BlockId::Number(0)), None); + + // insert genesis block (no value for cache is provided) + insert_block(&db, HashMap::new(), || default_header(&Default::default(), 0)); + + // after genesis is inserted => None + assert_eq!(db.cache().get_at(b"test", &BlockId::Number(0)), None); + + // initialize cache + db.cache().initialize(b"test", vec![42]).unwrap(); + + // after genesis is inserted + cache is initialized => Some + assert_eq!(db.cache().get_at(b"test", &BlockId::Number(0)), Some(vec![42])); + } } diff --git a/core/client/db/src/storage_cache.rs b/core/client/db/src/storage_cache.rs index 439a749c85346668b0f4620ed6bc709469382d28..53e4594856f2091eab3253e9b4310a39a653be02 100644 --- a/core/client/db/src/storage_cache.rs +++ b/core/client/db/src/storage_cache.rs @@ -19,60 +19,158 @@ use std::collections::{VecDeque, HashSet, HashMap}; use std::sync::Arc; use parking_lot::{Mutex, RwLock, RwLockUpgradableReadGuard}; -use lru_cache::LruCache; +use linked_hash_map::{LinkedHashMap, Entry}; use hash_db::Hasher; use runtime_primitives::traits::{Block, Header}; use state_machine::{backend::Backend as StateBackend, TrieBackend}; use log::trace; - +use super::{StorageCollection, ChildStorageCollection}; +use std::hash::Hash as StdHash; const STATE_CACHE_BLOCKS: usize = 12; type StorageKey = Vec; +type ChildStorageKey = (Vec, Vec); type StorageValue = Vec; /// Shared canonical state cache. pub struct Cache { /// Storage cache. `None` indicates that key is known to be missing. - storage: LruCache>, + lru_storage: LRUMap>, /// Storage hashes cache. `None` indicates that key is known to be missing. - hashes: LruCache>, + lru_hashes: LRUMap>, + /// Storage cache for child trie. `None` indicates that key is known to be missing. + lru_child_storage: LRUMap>, /// Information on the modifications in recently committed blocks; specifically which keys /// changed in which block. Ordered by block number. modifications: VecDeque>, - /// Maximum cache size available, in Bytes. - shared_cache_size: usize, - /// Used storage size, in Bytes. - storage_used_size: usize, } +struct LRUMap(LinkedHashMap, usize, usize); + +/// Internal trait similar to `heapsize` but using +/// a simply estimation. +/// +/// This should not be made public, it is implementation +/// detail trait. If it need to become public please +/// consider using `malloc_size_of`. +trait EstimateSize { + /// Return a size estimation of additional size needed + /// to cache this struct (in bytes). + fn estimate_size(&self) -> usize; +} + +impl EstimateSize for Vec { + fn estimate_size(&self) -> usize { + self.capacity() + } +} + +impl EstimateSize for Option> { + fn estimate_size(&self) -> usize { + self.as_ref().map(|v|v.capacity()).unwrap_or(0) + } +} + +struct OptionHOut>(Option); + +impl> EstimateSize for OptionHOut { + fn estimate_size(&self) -> usize { + // capacity would be better + self.0.as_ref().map(|v|v.as_ref().len()).unwrap_or(0) + } +} + +impl EstimateSize for (T, T) { + fn estimate_size(&self) -> usize { + self.0.estimate_size() + self.1.estimate_size() + } +} + +impl LRUMap { + fn remove(&mut self, k: &K) { + let map = &mut self.0; + let storage_used_size = &mut self.1; + if let Some(v) = map.remove(k) { + *storage_used_size -= k.estimate_size(); + *storage_used_size -= v.estimate_size(); + } + } + + fn add(&mut self, k: K, v: V) { + let lmap = &mut self.0; + let storage_used_size = &mut self.1; + let limit = self.2; + let klen = k.estimate_size(); + *storage_used_size += v.estimate_size(); + // TODO assert k v size fit into limit?? to avoid insert remove? + match lmap.entry(k) { + Entry::Occupied(mut entry) => { + // note that in this case we are not running pure lru as + // it would require to remove first + *storage_used_size -= entry.get().estimate_size(); + entry.insert(v); + }, + Entry::Vacant(entry) => { + *storage_used_size += klen; + entry.insert(v); + }, + }; + + while *storage_used_size > limit { + if let Some((k,v)) = lmap.pop_front() { + *storage_used_size -= k.estimate_size(); + *storage_used_size -= v.estimate_size(); + } else { + // can happen fairly often as we get value from multiple lru + // and only remove from a single lru + break; + } + } + } + + fn get(&mut self, k: &Q) -> Option<&mut V> + where K: std::borrow::Borrow, + Q: StdHash + Eq { + self.0.get_refresh(k) + } + + fn used_size(&self) -> usize { + self.1 + } + fn clear(&mut self) { + self.0.clear(); + self.1 = 0; + } + +} + impl Cache { /// Returns the used memory size of the storage cache in bytes. pub fn used_storage_cache_size(&self) -> usize { - self.storage_used_size + self.lru_storage.used_size() + + self.lru_child_storage.used_size() + // ignore small hashes storage and self.lru_hashes.used_size() } } pub type SharedCache = Arc>>; -/// Create new shared cache instance with given max memory usage. -pub fn new_shared_cache(shared_cache_size: usize) -> SharedCache { - // we need to supply a max capacity to `LruCache`, but since - // we don't have any idea how large the size of each item - // that is stored will be we can't calculate the max amount - // of items properly from `shared_cache_size`. - // - // what we do instead is to supply `shared_cache_size` as the - // max upper bound capacity (this would only be reached if each - // item would be one byte). - // each time we store to the storage cache we verify the memory - // constraint and pop the lru item if space needs to be freed. +/// Fix lru storage size for hash (small 64ko). +const FIX_LRU_HASH_SIZE: usize = 65_536; +/// Create a new shared cache instance with given max memory usage. +pub fn new_shared_cache( + shared_cache_size: usize, + child_ratio: (usize, usize), +) -> SharedCache { + let top = child_ratio.1.saturating_sub(child_ratio.0); Arc::new(Mutex::new(Cache { - storage: LruCache::new(shared_cache_size), - hashes: LruCache::new(shared_cache_size), + lru_storage: LRUMap(LinkedHashMap::new(), 0, + shared_cache_size * top / child_ratio.1), + lru_hashes: LRUMap(LinkedHashMap::new(), 0, FIX_LRU_HASH_SIZE), + lru_child_storage: LRUMap(LinkedHashMap::new(), 0, + shared_cache_size * child_ratio.0 / child_ratio.1), modifications: VecDeque::new(), - shared_cache_size: shared_cache_size, - storage_used_size: 0, })) } @@ -87,6 +185,8 @@ struct BlockChanges { parent: B::Hash, /// A set of modified storage keys. storage: HashSet, + /// A set of modified child storage keys. + child_storage: HashSet, /// Block is part of the canonical chain. is_canon: bool, } @@ -97,6 +197,19 @@ struct LocalCache { storage: HashMap>, /// Storage hashes cache. `None` indicates that key is known to be missing. hashes: HashMap>, + /// Child storage cache. `None` indicates that key is known to be missing. + child_storage: HashMap>, +} + +/// Cache changes. +pub struct CacheChanges { + /// Shared canonical state cache. + shared_cache: SharedCache, + /// Local cache of values for this state. + local_cache: RwLock>, + /// Hash of the block on top of which this instance was created or + /// `None` if cache is disabled + pub parent_hash: Option, } /// State abstraction. @@ -109,56 +222,11 @@ struct LocalCache { pub struct CachingState, B: Block> { /// Backing state. state: S, - /// Shared canonical state cache. - shared_cache: SharedCache, - /// Local cache of values for this state. - local_cache: RwLock>, - /// Hash of the block on top of which this instance was created or - /// `None` if cache is disabled - pub parent_hash: Option, + /// Cache data. + pub cache: CacheChanges } -impl, B: Block> CachingState { - /// Create a new instance wrapping generic State and shared cache. - pub fn new(state: S, shared_cache: SharedCache, parent_hash: Option) -> CachingState { - CachingState { - state, - shared_cache, - local_cache: RwLock::new(LocalCache { - storage: Default::default(), - hashes: Default::default(), - }), - parent_hash: parent_hash, - } - } - - fn storage_insert(cache: &mut Cache, k: StorageValue, v: Option) { - if let Some(v_) = &v { - while cache.storage_used_size + v_.len() > cache.shared_cache_size { - // pop until space constraint satisfied - match cache.storage.remove_lru() { - Some((_, Some(popped_v))) => - cache.storage_used_size = cache.storage_used_size - popped_v.len(), - Some((_, None)) => continue, - None => break, - }; - } - cache.storage_used_size = cache.storage_used_size + v_.len(); - } - cache.storage.insert(k, v); - } - - fn storage_remove( - storage: &mut LruCache>, - k: &StorageKey, - storage_used_size: &mut usize, - ) { - let v = storage.remove(k); - if let Some(Some(v_)) = v { - *storage_used_size = *storage_used_size - v_.len(); - } - } - +impl CacheChanges { /// Propagate local cache into the shared cache and synchronize /// the shared cache with the best block state. /// This function updates the shared cache by removing entries @@ -169,7 +237,8 @@ impl, B: Block> CachingState { &mut self, enacted: &[B::Hash], retracted: &[B::Hash], - changes: Vec<(StorageKey, Option)>, + changes: StorageCollection, + child_changes: ChildStorageCollection, commit_hash: Option, commit_number: Option<::Number>, is_best: F, @@ -189,7 +258,11 @@ impl, B: Block> CachingState { m.is_canon = true; for a in &m.storage { trace!("Reverting enacted key {:?}", a); - CachingState::::storage_remove(&mut cache.storage, a, &mut cache.storage_used_size); + cache.lru_storage.remove(a); + } + for a in &m.child_storage { + trace!("Reverting enacted child key {:?}", a); + cache.lru_child_storage.remove(a); } false } else { @@ -205,7 +278,11 @@ impl, B: Block> CachingState { m.is_canon = false; for a in &m.storage { trace!("Retracted key {:?}", a); - CachingState::::storage_remove(&mut cache.storage, a, &mut cache.storage_used_size); + cache.lru_storage.remove(a); + } + for a in &m.child_storage { + trace!("Retracted child key {:?}", a); + cache.lru_child_storage.remove(a); } false } else { @@ -216,7 +293,9 @@ impl, B: Block> CachingState { if clear { // We don't know anything about the block; clear everything trace!("Wiping cache"); - cache.storage.clear(); + cache.lru_storage.clear(); + cache.lru_child_storage.clear(); + cache.lru_hashes.clear(); cache.modifications.clear(); } @@ -226,12 +305,21 @@ impl, B: Block> CachingState { if let Some(_) = self.parent_hash { let mut local_cache = self.local_cache.write(); if is_best { - trace!("Committing {} local, {} hashes, {} modified entries", local_cache.storage.len(), local_cache.hashes.len(), changes.len()); + trace!( + "Committing {} local, {} hashes, {} modified root entries, {} modified child entries", + local_cache.storage.len(), + local_cache.hashes.len(), + changes.len(), + child_changes.iter().map(|v|v.1.len()).sum::(), + ); for (k, v) in local_cache.storage.drain() { - CachingState::::storage_insert(cache, k, v); + cache.lru_storage.add(k, v); + } + for (k, v) in local_cache.child_storage.drain() { + cache.lru_child_storage.add(k, v); } for (k, v) in local_cache.hashes.drain() { - cache.hashes.insert(k, v); + cache.lru_hashes.add(k, OptionHOut(v)); } } } @@ -244,16 +332,28 @@ impl, B: Block> CachingState { cache.modifications.pop_back(); } let mut modifications = HashSet::new(); + let mut child_modifications = HashSet::new(); + child_changes.into_iter().for_each(|(sk, changes)| + for (k, v) in changes.into_iter() { + let k = (sk.clone(), k); + if is_best { + cache.lru_child_storage.add(k.clone(), v); + } + child_modifications.insert(k); + } + ); for (k, v) in changes.into_iter() { - modifications.insert(k.clone()); if is_best { - cache.hashes.remove(&k); - CachingState::::storage_insert(cache, k, v); + cache.lru_hashes.remove(&k); + cache.lru_storage.add(k.clone(), v); } + modifications.insert(k); } + // Save modified storage. These are ordered by the block number. let block_changes = BlockChanges { storage: modifications, + child_storage: child_modifications, number: *number, hash: hash.clone(), is_canon: is_best, @@ -272,10 +372,30 @@ impl, B: Block> CachingState { } } +} + +impl, B: Block> CachingState { + /// Create a new instance wrapping generic State and shared cache. + pub fn new(state: S, shared_cache: SharedCache, parent_hash: Option) -> CachingState { + CachingState { + state, + cache: CacheChanges { + shared_cache, + local_cache: RwLock::new(LocalCache { + storage: Default::default(), + hashes: Default::default(), + child_storage: Default::default(), + }), + parent_hash: parent_hash, + }, + } + } + /// Check if the key can be returned from cache by matching current block parent hash against canonical /// state and filtering out entries modified in later blocks. fn is_allowed( - key: &[u8], + key: Option<&[u8]>, + child_key: Option<&ChildStorageKey>, parent_hash: &Option, modifications: &VecDeque> @@ -304,30 +424,44 @@ impl, B: Block> CachingState { } parent = &m.parent; } - if m.storage.contains(key) { - trace!("Cache lookup skipped for {:?}: modified in a later block", key); - return false; + if let Some(key) = key { + if m.storage.contains(key) { + trace!("Cache lookup skipped for {:?}: modified in a later block", key); + return false; + } + } + if let Some(child_key) = child_key { + if m.child_storage.contains(child_key) { + trace!("Cache lookup skipped for {:?}: modified in a later block", child_key); + return false; + } } } trace!("Cache lookup skipped for {:?}: parent hash is unknown", key); false } + + /// Dispose state and return cache data. + pub fn release(self) -> CacheChanges { + self.cache + } } impl, B:Block> StateBackend for CachingState { - type Error = S::Error; + type Error = S::Error; type Transaction = S::Transaction; type TrieBackendStorage = S::TrieBackendStorage; fn storage(&self, key: &[u8]) -> Result>, Self::Error> { - let local_cache = self.local_cache.upgradable_read(); + let local_cache = self.cache.local_cache.upgradable_read(); + // Note that local cache makes that lru is not refreshed if let Some(entry) = local_cache.storage.get(key).cloned() { trace!("Found in local cache: {:?}", key); return Ok(entry) } - let mut cache = self.shared_cache.lock(); - if Self::is_allowed(key, &self.parent_hash, &cache.modifications) { - if let Some(entry) = cache.storage.get_mut(key).map(|a| a.clone()) { + let mut cache = self.cache.shared_cache.lock(); + if Self::is_allowed(Some(key), None, &self.cache.parent_hash, &cache.modifications) { + if let Some(entry) = cache.lru_storage.get(key).map(|a| a.clone()) { trace!("Found in shared cache: {:?}", key); return Ok(entry) } @@ -339,14 +473,14 @@ impl, B:Block> StateBackend for CachingState Result, Self::Error> { - let local_cache = self.local_cache.upgradable_read(); + let local_cache = self.cache.local_cache.upgradable_read(); if let Some(entry) = local_cache.hashes.get(key).cloned() { trace!("Found hash in local cache: {:?}", key); return Ok(entry) } - let mut cache = self.shared_cache.lock(); - if Self::is_allowed(key, &self.parent_hash, &cache.modifications) { - if let Some(entry) = cache.hashes.get_mut(key).map(|a| a.clone()) { + let mut cache = self.cache.shared_cache.lock(); + if Self::is_allowed(Some(key), None, &self.cache.parent_hash, &cache.modifications) { + if let Some(entry) = cache.lru_hashes.get(key).map(|a| a.0.clone()) { trace!("Found hash in shared cache: {:?}", key); return Ok(entry) } @@ -358,7 +492,23 @@ impl, B:Block> StateBackend for CachingState Result>, Self::Error> { - self.state.child_storage(storage_key, key) + let key = (storage_key.to_vec(), key.to_vec()); + let local_cache = self.cache.local_cache.upgradable_read(); + if let Some(entry) = local_cache.child_storage.get(&key).cloned() { + trace!("Found in local cache: {:?}", key); + return Ok(entry) + } + let mut cache = self.cache.shared_cache.lock(); + if Self::is_allowed(None, Some(&key), &self.cache.parent_hash, &cache.modifications) { + if let Some(entry) = cache.lru_child_storage.get(&key).map(|a| a.clone()) { + trace!("Found in shared cache: {:?}", key); + return Ok(entry) + } + } + trace!("Cache miss: {:?}", key); + let value = self.state.child_storage(storage_key, &key.1[..])?; + RwLockUpgradableReadGuard::upgrade(local_cache).child_storage.insert(key, value.clone()); + Ok(value) } fn exists_storage(&self, key: &[u8]) -> Result { @@ -397,12 +547,16 @@ impl, B:Block> StateBackend for CachingState) -> Vec> { + fn keys(&self, prefix: &[u8]) -> Vec> { self.state.keys(prefix) } - fn try_into_trie_backend(self) -> Option> { - self.state.try_into_trie_backend() + fn child_keys(&self, child_key: &[u8], prefix: &[u8]) -> Vec> { + self.state.child_keys(child_key, prefix) + } + + fn as_trie_backend(&mut self) -> Option<&TrieBackend> { + self.state.as_trie_backend() } } @@ -427,27 +581,27 @@ mod tests { let h3a = H256::random(); let h3b = H256::random(); - let shared = new_shared_cache::(256*1024); + let shared = new_shared_cache::(256*1024, (0,1)); // blocks [ 3a(c) 2a(c) 2b 1b 1a(c) 0 ] // state [ 5 5 4 3 2 2 ] let mut s = CachingState::new(InMemory::::default(), shared.clone(), Some(root_parent.clone())); - s.sync_cache(&[], &[], vec![(key.clone(), Some(vec![2]))], Some(h0.clone()), Some(0), || true); + s.cache.sync_cache(&[], &[], vec![(key.clone(), Some(vec![2]))], vec![], Some(h0.clone()), Some(0), || true); let mut s = CachingState::new(InMemory::::default(), shared.clone(), Some(h0.clone())); - s.sync_cache(&[], &[], vec![], Some(h1a.clone()), Some(1), || true); + s.cache.sync_cache(&[], &[], vec![], vec![], Some(h1a.clone()), Some(1), || true); let mut s = CachingState::new(InMemory::::default(), shared.clone(), Some(h0.clone())); - s.sync_cache(&[], &[], vec![(key.clone(), Some(vec![3]))], Some(h1b.clone()), Some(1), || false); + s.cache.sync_cache(&[], &[], vec![(key.clone(), Some(vec![3]))], vec![], Some(h1b.clone()), Some(1), || false); let mut s = CachingState::new(InMemory::::default(), shared.clone(), Some(h1b.clone())); - s.sync_cache(&[], &[], vec![(key.clone(), Some(vec![4]))], Some(h2b.clone()), Some(2), || false); + s.cache.sync_cache(&[], &[], vec![(key.clone(), Some(vec![4]))], vec![], Some(h2b.clone()), Some(2), || false); let mut s = CachingState::new(InMemory::::default(), shared.clone(), Some(h1a.clone())); - s.sync_cache(&[], &[], vec![(key.clone(), Some(vec![5]))], Some(h2a.clone()), Some(2), || true); + s.cache.sync_cache(&[], &[], vec![(key.clone(), Some(vec![5]))], vec![], Some(h2a.clone()), Some(2), || true); let mut s = CachingState::new(InMemory::::default(), shared.clone(), Some(h2a.clone())); - s.sync_cache(&[], &[], vec![], Some(h3a.clone()), Some(3), || true); + s.cache.sync_cache(&[], &[], vec![], vec![], Some(h3a.clone()), Some(3), || true); let s = CachingState::new(InMemory::::default(), shared.clone(), Some(h3a.clone())); assert_eq!(s.storage(&key).unwrap().unwrap(), vec![5]); @@ -464,7 +618,15 @@ mod tests { // reorg to 3b // blocks [ 3b(c) 3a 2a 2b(c) 1b 1a 0 ] let mut s = CachingState::new(InMemory::::default(), shared.clone(), Some(h2b.clone())); - s.sync_cache(&[h1b.clone(), h2b.clone(), h3b.clone()], &[h1a.clone(), h2a.clone(), h3a.clone()], vec![], Some(h3b.clone()), Some(3), || true); + s.cache.sync_cache( + &[h1b.clone(), h2b.clone(), h3b.clone()], + &[h1a.clone(), h2a.clone(), h3a.clone()], + vec![], + vec![], + Some(h3b.clone()), + Some(3), + || true, + ); let s = CachingState::new(InMemory::::default(), shared.clone(), Some(h3a.clone())); assert!(s.storage(&key).unwrap().is_none()); } @@ -472,34 +634,71 @@ mod tests { #[test] fn should_track_used_size_correctly() { let root_parent = H256::random(); - let shared = new_shared_cache::(5); + let shared = new_shared_cache::(109, ((109-36), 109)); let h0 = H256::random(); let mut s = CachingState::new(InMemory::::default(), shared.clone(), Some(root_parent.clone())); let key = H256::random()[..].to_vec(); - s.sync_cache(&[], &[], vec![(key.clone(), Some(vec![1, 2, 3]))], Some(h0.clone()), Some(0), || true); - assert_eq!(shared.lock().used_storage_cache_size(), 3 /* bytes */); + let s_key = H256::random()[..].to_vec(); + s.cache.sync_cache( + &[], + &[], + vec![(key.clone(), Some(vec![1, 2, 3]))], + vec![], + Some(h0.clone()), + Some(0), + || true, + ); + // 32 key, 3 byte size + assert_eq!(shared.lock().used_storage_cache_size(), 35 /* bytes */); let key = H256::random()[..].to_vec(); - s.sync_cache(&[], &[], vec![(key.clone(), Some(vec![1, 2]))], Some(h0.clone()), Some(0), || true); - assert_eq!(shared.lock().used_storage_cache_size(), 5 /* bytes */); + s.cache.sync_cache( + &[], + &[], + vec![], + vec![(s_key.clone(), vec![(key.clone(), Some(vec![1, 2]))])], + Some(h0.clone()), + Some(0), + || true, + ); + // 35 + (2 * 32) key, 2 byte size + assert_eq!(shared.lock().used_storage_cache_size(), 101 /* bytes */); } #[test] fn should_remove_lru_items_based_on_tracking_used_size() { let root_parent = H256::random(); - let shared = new_shared_cache::(5); + let shared = new_shared_cache::(36*3, (2,3)); let h0 = H256::random(); let mut s = CachingState::new(InMemory::::default(), shared.clone(), Some(root_parent.clone())); let key = H256::random()[..].to_vec(); - s.sync_cache(&[], &[], vec![(key.clone(), Some(vec![1, 2, 3, 4]))], Some(h0.clone()), Some(0), || true); - assert_eq!(shared.lock().used_storage_cache_size(), 4 /* bytes */); + s.cache.sync_cache( + &[], + &[], + vec![(key.clone(), Some(vec![1, 2, 3, 4]))], + vec![], + Some(h0.clone()), + Some(0), + || true, + ); + // 32 key, 4 byte size + assert_eq!(shared.lock().used_storage_cache_size(), 36 /* bytes */); let key = H256::random()[..].to_vec(); - s.sync_cache(&[], &[], vec![(key.clone(), Some(vec![1, 2]))], Some(h0.clone()), Some(0), || true); - assert_eq!(shared.lock().used_storage_cache_size(), 2 /* bytes */); + s.cache.sync_cache( + &[], + &[], + vec![(key.clone(), Some(vec![1, 2]))], + vec![], + Some(h0.clone()), + Some(0), + || true, + ); + // 32 key, 2 byte size + assert_eq!(shared.lock().used_storage_cache_size(), 34 /* bytes */); } } diff --git a/core/client/db/src/utils.rs b/core/client/db/src/utils.rs index b51faae6de857620702f839be2ac38ea9913d035..a4ab82b5d8b2d72c81913ae8d7664fe6adfa32b3 100644 --- a/core/client/db/src/utils.rs +++ b/core/client/db/src/utils.rs @@ -17,10 +17,10 @@ //! Db-based backend utility structures and functions, used by both //! full and light storages. -use std::sync::Arc; -use std::io; +use std::{io, convert::TryInto, sync::Arc}; use kvdb::{KeyValueDB, DBTransaction}; +#[cfg(feature = "kvdb-rocksdb")] use kvdb_rocksdb::{Database, DatabaseConfig}; use log::debug; @@ -28,7 +28,10 @@ use client; use parity_codec::Decode; use trie::DBValue; use runtime_primitives::generic::BlockId; -use runtime_primitives::traits::{As, Block as BlockT, Header as HeaderT, Zero}; +use runtime_primitives::traits::{ + Block as BlockT, Header as HeaderT, Zero, UniqueSaturatedFrom, + UniqueSaturatedInto, CheckedConversion +}; use crate::DatabaseSettings; /// Number of columns in the db. Must be the same for both full && light dbs. @@ -78,10 +81,8 @@ pub type NumberIndexKey = [u8; 4]; /// /// In the current database schema, this kind of key is only used for /// lookups into an index, NOT for storing header data or others. -pub fn number_index_key(n: N) -> NumberIndexKey where N: As { - let n: u64 = n.as_(); - assert!(n & 0xffffffff00000000 == 0); - +pub fn number_index_key>(n: N) -> NumberIndexKey { + let n = n.checked_into::().unwrap(); [ (n >> 24) as u8, ((n >> 16) & 0xff) as u8, @@ -93,7 +94,7 @@ pub fn number_index_key(n: N) -> NumberIndexKey where N: As { /// Convert number and hash into long lookup key for blocks that are /// not in the canonical chain. pub fn number_and_hash_to_lookup_key(number: N, hash: H) -> Vec where - N: As, + N: TryInto, H: AsRef<[u8]> { let mut lookup_key = number_index_key(number).to_vec(); @@ -103,18 +104,20 @@ pub fn number_and_hash_to_lookup_key(number: N, hash: H) -> Vec where /// Convert block lookup key into block number. /// all block lookup keys start with the block number. -pub fn lookup_key_to_number(key: &[u8]) -> client::error::Result where N: As { +pub fn lookup_key_to_number(key: &[u8]) -> client::error::Result where + N: From +{ if key.len() < 4 { return Err(client::error::Error::Backend("Invalid block key".into())); } - Ok((key[0] as u64) << 24 - | (key[1] as u64) << 16 - | (key[2] as u64) << 8 - | (key[3] as u64)).map(As::sa) + Ok((key[0] as u32) << 24 + | (key[1] as u32) << 16 + | (key[2] as u32) << 8 + | (key[3] as u32)).map(Into::into) } /// Delete number to hash mapping in DB transaction. -pub fn remove_number_to_key_mapping>( +pub fn remove_number_to_key_mapping>( transaction: &mut DBTransaction, key_lookup_col: Option, number: N, @@ -123,7 +126,7 @@ pub fn remove_number_to_key_mapping>( } /// Remove key mappings. -pub fn remove_key_mappings, H: AsRef<[u8]>>( +pub fn remove_key_mappings, H: AsRef<[u8]>>( transaction: &mut DBTransaction, key_lookup_col: Option, number: N, @@ -135,7 +138,7 @@ pub fn remove_key_mappings, H: AsRef<[u8]>>( /// Place a number mapping into the database. This maps number to current perceived /// block hash at that position. -pub fn insert_number_to_key_mapping + Clone, H: AsRef<[u8]>>( +pub fn insert_number_to_key_mapping + Clone, H: AsRef<[u8]>>( transaction: &mut DBTransaction, key_lookup_col: Option, number: N, @@ -149,7 +152,7 @@ pub fn insert_number_to_key_mapping + Clone, H: AsRef<[u8]>>( } /// Insert a hash to key mapping in the database. -pub fn insert_hash_to_key_mapping, H: AsRef<[u8]> + Clone>( +pub fn insert_hash_to_key_mapping, H: AsRef<[u8]> + Clone>( transaction: &mut DBTransaction, key_lookup_col: Option, number: N, @@ -166,12 +169,12 @@ pub fn insert_hash_to_key_mapping, H: AsRef<[u8]> + Clone>( /// block lookup key is the DB-key header, block and justification are stored under. /// looks up lookup key by hash from DB as necessary. pub fn block_id_to_lookup_key( - db: &KeyValueDB, + db: &dyn KeyValueDB, key_lookup_col: Option, id: BlockId ) -> Result>, client::error::Error> where Block: BlockT, - ::runtime_primitives::traits::NumberFor: As, + ::runtime_primitives::traits::NumberFor: UniqueSaturatedFrom + UniqueSaturatedInto, { let res = match id { BlockId::Number(n) => db.get( @@ -186,12 +189,16 @@ pub fn block_id_to_lookup_key( /// Maps database error to client error pub fn db_err(err: io::Error) -> client::error::Error { - use std::error::Error; - client::error::Error::Backend(err.description().into()) + client::error::Error::Backend(format!("{}", err)) } /// Open RocksDB database. -pub fn open_database(config: &DatabaseSettings, col_meta: Option, db_type: &str) -> client::error::Result> { +#[cfg(feature = "kvdb-rocksdb")] +pub fn open_database( + config: &DatabaseSettings, + col_meta: Option, + db_type: &str +) -> client::error::Result> { let mut db_config = DatabaseConfig::with_columns(Some(NUM_COLUMNS)); db_config.memory_budget = config.cache_size; let path = config.path.to_str().ok_or_else(|| client::error::Error::Backend("Invalid database path".into()))?; @@ -216,7 +223,12 @@ pub fn open_database(config: &DatabaseSettings, col_meta: Option, db_type: } /// Read database column entry for the given block. -pub fn read_db(db: &KeyValueDB, col_index: Option, col: Option, id: BlockId) -> client::error::Result> +pub fn read_db( + db: &dyn KeyValueDB, + col_index: Option, + col: Option, + id: BlockId +) -> client::error::Result> where Block: BlockT, { @@ -228,7 +240,7 @@ pub fn read_db(db: &KeyValueDB, col_index: Option, col: Option, /// Read a header from the database. pub fn read_header( - db: &KeyValueDB, + db: &dyn KeyValueDB, col_index: Option, col: Option, id: BlockId, @@ -246,7 +258,7 @@ pub fn read_header( /// Required header from the database. pub fn require_header( - db: &KeyValueDB, + db: &dyn KeyValueDB, col_index: Option, col: Option, id: BlockId, @@ -256,7 +268,7 @@ pub fn require_header( } /// Read meta from the database. -pub fn read_meta(db: &KeyValueDB, col_meta: Option, col_header: Option) -> Result< +pub fn read_meta(db: &dyn KeyValueDB, col_meta: Option, col_header: Option) -> Result< Meta<<::Header as HeaderT>::Number, Block::Hash>, client::error::Error, > diff --git a/core/client/src/backend.rs b/core/client/src/backend.rs index 09faab1a12fedaed23ce6c3017d471acf5487fa6..8860f61c47e7045639145dcb9ec8b81983c98a45 100644 --- a/core/client/src/backend.rs +++ b/core/client/src/backend.rs @@ -26,6 +26,13 @@ use state_machine::ChangesTrieStorage as StateChangesTrieStorage; use consensus::well_known_cache_keys; use hash_db::Hasher; use trie::MemoryDB; +use parking_lot::Mutex; + +/// In memory array of storage values. +pub type StorageCollection = Vec<(Vec, Option>)>; + +/// In memory arrays of storage values for multiple child tries. +pub type ChildStorageCollection = Vec<(Vec, StorageCollection)>; /// State of a new block. #[derive(Debug, Clone, Copy, PartialEq, Eq)] @@ -81,8 +88,12 @@ pub trait BlockImportOperation where fn update_db_storage(&mut self, update: >::Transaction) -> error::Result<()>; /// Inject storage data into the database replacing any existing data. fn reset_storage(&mut self, top: StorageOverlay, children: ChildrenStorageOverlay) -> error::Result; - /// Set top level storage changes. - fn update_storage(&mut self, update: Vec<(Vec, Option>)>) -> error::Result<()>; + /// Set storage changes. + fn update_storage( + &mut self, + update: StorageCollection, + child_update: ChildStorageCollection, + ) -> error::Result<()>; /// Inject changes trie data into the database. fn update_changes_trie(&mut self, update: MemoryDB) -> error::Result<()>; /// Insert auxiliary keys. Values are `None` if should be deleted. @@ -127,7 +138,7 @@ pub trait Backend: AuxStore + Send + Sync where /// Associated state backend type. type State: StateBackend; /// Changes trie storage. - type ChangesTrieStorage: PrunableStateChangesTrieStorage; + type ChangesTrieStorage: PrunableStateChangesTrieStorage; /// Begin a new block insertion transaction with given parent block id. /// When constructing the genesis, this is called with all-zero hash. @@ -174,12 +185,25 @@ pub trait Backend: AuxStore + Send + Sync where fn get_aux(&self, key: &[u8]) -> error::Result>> { AuxStore::get_aux(self, key) } + + /// Gain access to the import lock around this backend. + /// _Note_ Backend isn't expected to acquire the lock by itself ever. Rather + /// the using components should acquire and hold the lock whenever they do + /// something that the import of a block would interfere with, e.g. importing + /// a new block or calculating the best head. + fn get_import_lock(&self) -> &Mutex<()>; } /// Changes trie storage that supports pruning. -pub trait PrunableStateChangesTrieStorage: StateChangesTrieStorage { +pub trait PrunableStateChangesTrieStorage: + StateChangesTrieStorage> +{ /// Get number block of oldest, non-pruned changes trie. - fn oldest_changes_trie_block(&self, config: &ChangesTrieConfiguration, best_finalized: u64) -> u64; + fn oldest_changes_trie_block( + &self, + config: &ChangesTrieConfiguration, + best_finalized: NumberFor, + ) -> NumberFor; } /// Mark for all Backend implementations, that are making use of state data, stored locally. diff --git a/core/client/src/block_builder/block_builder.rs b/core/client/src/block_builder/block_builder.rs index 4d40bed9b050e31a68b091666dcbdc3e1da390a3..4564c29aae4191956e48cd9d9ac21342c1e5f224 100644 --- a/core/client/src/block_builder/block_builder.rs +++ b/core/client/src/block_builder/block_builder.rs @@ -20,7 +20,7 @@ use parity_codec::Encode; use runtime_primitives::ApplyOutcome; use runtime_primitives::generic::BlockId; use runtime_primitives::traits::{ - Header as HeaderT, Hash, Block as BlockT, One, HashFor, ProvideRuntimeApi, ApiRef + Header as HeaderT, Hash, Block as BlockT, One, HashFor, ProvideRuntimeApi, ApiRef, DigestFor, }; use primitives::{H256, ExecutionContext}; use crate::blockchain::HeaderBackend; @@ -41,23 +41,23 @@ where A: ProvideRuntimeApi + HeaderBackend + 'a, A::Api: BlockBuilderApi, { - /// Create a new instance of builder from the given client, building on the latest block. - pub fn new(api: &'a A) -> error::Result { - api.info().and_then(|i| - Self::at_block(&BlockId::Hash(i.best_hash), api, false) - ) + /// Create a new instance of builder from the given client, building on the + /// latest block. + pub fn new(api: &'a A, inherent_digests: DigestFor) -> error::Result { + Self::at_block(&BlockId::Hash(api.info().best_hash), api, false, inherent_digests) } /// Create a new instance of builder from the given client using a /// particular block's ID to build upon with optional proof recording enabled. /// /// While proof recording is enabled, all accessed trie nodes are saved. - /// These recorded trie nodes can be used by a third party to proof the + /// These recorded trie nodes can be used by a third party to prove the /// output of this block builder without having access to the full storage. pub fn at_block( block_id: &BlockId, api: &'a A, - proof_recording: bool + proof_recording: bool, + inherent_digests: DigestFor, ) -> error::Result { let number = api.block_number_from_id(block_id)? .ok_or_else(|| error::Error::UnknownBlock(format!("{}", block_id)))? @@ -70,7 +70,7 @@ where Default::default(), Default::default(), parent_hash, - Default::default() + inherent_digests, ); let mut api = api.runtime_api(); @@ -80,7 +80,7 @@ where } api.initialize_block_with_context( - block_id, ExecutionContext::BlockConstruction, &header + block_id, ExecutionContext::BlockConstruction, &header, )?; Ok(BlockBuilder { diff --git a/core/client/src/blockchain.rs b/core/client/src/blockchain.rs index b0e7c2943ac86ee71726675f57782312e799d600..b07e26396efb5bee8eda6edaab74d97913b26989 100644 --- a/core/client/src/blockchain.rs +++ b/core/client/src/blockchain.rs @@ -30,7 +30,7 @@ pub trait HeaderBackend: Send + Sync { /// Get block header. Returns `None` if block is not found. fn header(&self, id: BlockId) -> Result>; /// Get blockchain info. - fn info(&self) -> Result>; + fn info(&self) -> Info; /// Get block status. fn status(&self, id: BlockId) -> Result; /// Get block number by hash. Returns `None` if the header is not in the chain. @@ -81,7 +81,7 @@ pub trait Backend: HeaderBackend { /// Get last finalized block hash. fn last_finalized(&self) -> Result; /// Returns data cache reference, if it is enabled on this backend. - fn cache(&self) -> Option>>; + fn cache(&self) -> Option>>; /// Returns hashes of all blocks that are leaves of the block tree. /// in other words, that have no children, are chain heads. @@ -95,11 +95,16 @@ pub trait Backend: HeaderBackend { /// Provides access to the optional cache. pub trait ProvideCache { /// Returns data cache reference, if it is enabled on this backend. - fn cache(&self) -> Option>>; + fn cache(&self) -> Option>>; } /// Blockchain optional data cache. pub trait Cache: Send + Sync { + /// Initialize genesis value for the given cache. + /// + /// The operation should be performed once before anything else is inserted in the cache. + /// Otherwise cache may end up in inconsistent state. + fn initialize(&self, key: &well_known_cache_keys::Id, value_at_genesis: Vec) -> Result<()>; /// Returns cached value by the given key. fn get_at(&self, key: &well_known_cache_keys::Id, block: &BlockId) -> Option>; } diff --git a/core/client/src/call_executor.rs b/core/client/src/call_executor.rs index 9a47d1ac21497920dc0f55caf3b57b2053db0a7d..f956f27b5058b813452a00e448599da946be27f9 100644 --- a/core/client/src/call_executor.rs +++ b/core/client/src/call_executor.rs @@ -26,9 +26,7 @@ use state_machine::{ use executor::{RuntimeVersion, RuntimeInfo, NativeVersion}; use hash_db::Hasher; use trie::MemoryDB; -use primitives::{ - H256, Blake2Hasher, NativeOrEncoded, NeverNativeValue, OffchainExt -}; +use primitives::{offchain, H256, Blake2Hasher, NativeOrEncoded, NeverNativeValue}; use crate::runtime_api::{ProofRecorder, InitializeBlock}; use crate::backend; @@ -48,7 +46,7 @@ where /// /// No changes are made. fn call< - O: OffchainExt, + O: offchain::Externalities, >( &self, id: &BlockId, @@ -65,7 +63,7 @@ where /// of the execution context. fn contextual_call< 'a, - O: OffchainExt, + O: offchain::Externalities, IB: Fn() -> error::Result<()>, EM: Fn( Result, Self::Error>, @@ -96,7 +94,7 @@ where /// /// No changes are made. fn call_at_state< - O: OffchainExt, + O: offchain::Externalities, S: state_machine::Backend, F: FnOnce( Result, Self::Error>, @@ -119,17 +117,17 @@ where /// No changes are made. fn prove_at_state>( &self, - state: S, + mut state: S, overlay: &mut OverlayedChanges, method: &str, call_data: &[u8] ) -> Result<(Vec, Vec>), error::Error> { - let trie_state = state.try_into_trie_backend() + let trie_state = state.as_trie_backend() .ok_or_else(|| Box::new(state_machine::ExecutionError::UnableToGenerateProof) - as Box + as Box )?; - self.prove_at_trie_state(&trie_state, overlay, method, call_data) + self.prove_at_trie_state(trie_state, overlay, method, call_data) } /// Execute a call to a contract on top of given trie state, gathering execution proof. @@ -181,7 +179,7 @@ where { type Error = E::Error; - fn call( + fn call( &self, id: &BlockId, method: &str, @@ -211,7 +209,7 @@ where fn contextual_call< 'a, - O: OffchainExt, + O: offchain::Externalities, IB: Fn() -> error::Result<()>, EM: Fn( Result, Self::Error>, @@ -241,18 +239,18 @@ where _ => {}, } - let state = self.backend.state_at(*at)?; + let mut state = self.backend.state_at(*at)?; match recorder { Some(recorder) => { - let trie_state = state.try_into_trie_backend() + let trie_state = state.as_trie_backend() .ok_or_else(|| Box::new(state_machine::ExecutionError::UnableToGenerateProof) - as Box + as Box )?; let backend = state_machine::ProvingBackend::new_with_recorder( - &trie_state, + trie_state, recorder.clone() ); @@ -300,7 +298,7 @@ where } fn call_at_state< - O: OffchainExt, + O: offchain::Externalities, S: state_machine::Backend, F: FnOnce( Result, Self::Error>, diff --git a/core/client/src/children.rs b/core/client/src/children.rs index 3a9f0a6bea5b43c9242e9e6a7d9a60b682c74693..4423ad8939467e911382a7d286387e4f9bcf683f 100644 --- a/core/client/src/children.rs +++ b/core/client/src/children.rs @@ -26,7 +26,7 @@ use std::hash::Hash; pub fn read_children< K: Eq + Hash + Clone + Encode + Decode, V: Eq + Hash + Clone + Encode + Decode, ->(db: &KeyValueDB, column: Option, prefix: &[u8], parent_hash: K) -> error::Result> { +>(db: &dyn KeyValueDB, column: Option, prefix: &[u8], parent_hash: K) -> error::Result> { let mut buf = prefix.to_vec(); parent_hash.using_encoded(|s| buf.extend(s)); @@ -116,6 +116,6 @@ mod tests { let r2: Vec = read_children(&db, None, PREFIX, 1_2).unwrap(); assert_eq!(r1, vec![1_3, 1_5]); - assert_eq!(r2.len(), 0); + assert_eq!(r2.len(), 0); } } diff --git a/core/client/src/cht.rs b/core/client/src/cht.rs index 8002f52b6f6d47b60e171d1f234d945c624c1d60..fc8920327e90b64b58542ca62161f4f9af2b5c77 100644 --- a/core/client/src/cht.rs +++ b/core/client/src/cht.rs @@ -26,10 +26,11 @@ use std::collections::HashSet; use hash_db; +use parity_codec::Encode; use trie; use primitives::{H256, convert_hash}; -use runtime_primitives::traits::{As, Header as HeaderT, SimpleArithmetic, One}; +use runtime_primitives::traits::{Header as HeaderT, SimpleArithmetic, Zero, One}; use state_machine::backend::InMemory as InMemoryState; use state_machine::{MemoryDB, TrieBackend, Backend as StateBackend, prove_read_on_trie_backend, read_proof_check, read_proof_check_on_proving_backend}; @@ -38,14 +39,19 @@ use crate::error::{Error as ClientError, Result as ClientResult}; /// The size of each CHT. This value is passed to every CHT-related function from /// production code. Other values are passed from tests. -pub const SIZE: u64 = 2048; +const SIZE: u32 = 2048; + +/// Gets default CHT size. +pub fn size>() -> N { + SIZE.into() +} /// Returns Some(cht_number) if CHT is need to be built when the block with given number is canonized. -pub fn is_build_required(cht_size: u64, block_num: N) -> Option +pub fn is_build_required(cht_size: N, block_num: N) -> Option where N: Clone + SimpleArithmetic, { - let block_cht_num = block_to_cht_number(cht_size, block_num.clone())?; + let block_cht_num = block_to_cht_number(cht_size.clone(), block_num.clone())?; let two = N::one() + N::one(); if block_cht_num < two { return None; @@ -62,7 +68,7 @@ pub fn is_build_required(cht_size: u64, block_num: N) -> Option /// SIZE items. The items are assumed to proceed sequentially from `start_number(cht_num)`. /// Discards the trie's nodes. pub fn compute_root( - cht_size: u64, + cht_size: Header::Number, cht_num: Header::Number, hashes: I, ) -> ClientResult @@ -79,7 +85,7 @@ pub fn compute_root( /// Build CHT-based header proof. pub fn build_proof( - cht_size: u64, + cht_size: Header::Number, cht_num: Header::Number, blocks: BlocksI, hashes: HashesI @@ -95,14 +101,14 @@ pub fn build_proof( .into_iter() .map(|(k, v)| (None, k, Some(v))) .collect::>(); - let storage = InMemoryState::::default().update(transaction); - let trie_storage = storage.try_into_trie_backend() - .expect("InMemoryState::try_into_trie_backend always returns Some; qed"); + let mut storage = InMemoryState::::default().update(transaction); + let trie_storage = storage.as_trie_backend() + .expect("InMemoryState::as_trie_backend always returns Some; qed"); let mut total_proof = HashSet::new(); for block in blocks.into_iter() { debug_assert_eq!(block_to_cht_number(cht_size, block), Some(cht_num)); - let (value, proof) = prove_read_on_trie_backend(&trie_storage, &encode_cht_key(block))?; + let (value, proof) = prove_read_on_trie_backend(trie_storage, &encode_cht_key(block))?; assert!(value.is_some(), "we have just built trie that includes the value for block"); total_proof.extend(proof); } @@ -170,7 +176,7 @@ fn do_check_proof( /// Group ordered blocks by CHT number and call functor with blocks of each group. pub fn for_each_cht_group( - cht_size: u64, + cht_size: Header::Number, blocks: I, mut functor: F, mut functor_param: P, @@ -183,7 +189,7 @@ pub fn for_each_cht_group( let mut current_cht_num = None; let mut current_cht_blocks = Vec::new(); for block in blocks { - let new_cht_num = match block_to_cht_number(cht_size, block.as_()) { + let new_cht_num = match block_to_cht_number(cht_size, block) { Some(new_cht_num) => new_cht_num, None => return Err(ClientError::Backend(format!( "Cannot compute CHT root for the block #{}", block)).into() @@ -198,7 +204,7 @@ pub fn for_each_cht_group( functor_param = functor( functor_param, - As::sa(current_cht_num), + current_cht_num, ::std::mem::replace(&mut current_cht_blocks, Vec::new()), )?; } @@ -210,7 +216,7 @@ pub fn for_each_cht_group( if let Some(current_cht_num) = current_cht_num { functor( functor_param, - As::sa(current_cht_num), + current_cht_num, ::std::mem::replace(&mut current_cht_blocks, Vec::new()), )?; } @@ -220,7 +226,7 @@ pub fn for_each_cht_group( /// Build pairs for computing CHT. fn build_pairs( - cht_size: u64, + cht_size: Header::Number, cht_num: Header::Number, hashes: I ) -> ClientResult, Vec)>> @@ -230,22 +236,25 @@ fn build_pairs( { let start_num = start_number(cht_size, cht_num); let mut pairs = Vec::new(); - let mut hash_number = start_num; - for hash in hashes.into_iter().take(cht_size as usize) { + let mut hash_index = Header::Number::zero(); + for hash in hashes.into_iter() { let hash = hash?.ok_or_else(|| ClientError::from( - ClientError::MissingHashRequiredForCHT(cht_num.as_(), hash_number.as_()) + ClientError::MissingHashRequiredForCHT ))?; pairs.push(( - encode_cht_key(hash_number).to_vec(), + encode_cht_key(start_num + hash_index).to_vec(), encode_cht_value(hash) )); - hash_number += Header::Number::one(); + hash_index += Header::Number::one(); + if hash_index == cht_size { + break; + } } - if pairs.len() as u64 == cht_size { + if hash_index == cht_size { Ok(pairs) } else { - Err(ClientError::MissingHashRequiredForCHT(cht_num.as_(), hash_number.as_())) + Err(ClientError::MissingHashRequiredForCHT) } } @@ -255,38 +264,28 @@ fn build_pairs( /// More generally: CHT N includes block (1 + N*SIZE)...((N+1)*SIZE). /// This is because the genesis hash is assumed to be known /// and including it would be redundant. -pub fn start_number(cht_size: u64, cht_num: N) -> N { - (cht_num * As::sa(cht_size)) + N::one() +pub fn start_number(cht_size: N, cht_num: N) -> N { + (cht_num * cht_size) + N::one() } /// Get the ending block of a given CHT. -pub fn end_number(cht_size: u64, cht_num: N) -> N { - (cht_num + N::one()) * As::sa(cht_size) +pub fn end_number(cht_size: N, cht_num: N) -> N { + (cht_num + N::one()) * cht_size } /// Convert a block number to a CHT number. /// Returns `None` for `block_num` == 0, `Some` otherwise. -pub fn block_to_cht_number(cht_size: u64, block_num: N) -> Option { +pub fn block_to_cht_number(cht_size: N, block_num: N) -> Option { if block_num == N::zero() { None } else { - Some((block_num - N::one()) / As::sa(cht_size)) + Some((block_num - N::one()) / cht_size) } } /// Convert header number into CHT key. -pub fn encode_cht_key>(number: N) -> Vec { - let number: u64 = number.as_(); - vec![ - (number >> 56) as u8, - ((number >> 48) & 0xff) as u8, - ((number >> 40) & 0xff) as u8, - ((number >> 32) & 0xff) as u8, - ((number >> 24) & 0xff) as u8, - ((number >> 16) & 0xff) as u8, - ((number >> 8) & 0xff) as u8, - (number & 0xff) as u8 - ] +pub fn encode_cht_key(number: N) -> Vec { + number.encode() } /// Convert header hash into CHT value. @@ -311,8 +310,8 @@ mod tests { #[test] fn is_build_required_works() { - assert_eq!(is_build_required(SIZE, 0u64), None); - assert_eq!(is_build_required(SIZE, 1u64), None); + assert_eq!(is_build_required(SIZE, 0u32.into()), None); + assert_eq!(is_build_required(SIZE, 1u32.into()), None); assert_eq!(is_build_required(SIZE, SIZE), None); assert_eq!(is_build_required(SIZE, SIZE + 1), None); assert_eq!(is_build_required(SIZE, 2 * SIZE), None); @@ -323,73 +322,101 @@ mod tests { #[test] fn start_number_works() { - assert_eq!(start_number(SIZE, 0u64), 1u64); - assert_eq!(start_number(SIZE, 1u64), SIZE + 1); - assert_eq!(start_number(SIZE, 2u64), SIZE + SIZE + 1); + assert_eq!(start_number(SIZE, 0u32), 1u32); + assert_eq!(start_number(SIZE, 1u32), SIZE + 1); + assert_eq!(start_number(SIZE, 2u32), SIZE + SIZE + 1); } #[test] fn end_number_works() { - assert_eq!(end_number(SIZE, 0u64), SIZE); - assert_eq!(end_number(SIZE, 1u64), SIZE + SIZE); - assert_eq!(end_number(SIZE, 2u64), SIZE + SIZE + SIZE); + assert_eq!(end_number(SIZE, 0u32), SIZE); + assert_eq!(end_number(SIZE, 1u32), SIZE + SIZE); + assert_eq!(end_number(SIZE, 2u32), SIZE + SIZE + SIZE); } #[test] fn build_pairs_fails_when_no_enough_blocks() { - assert!(build_pairs::(SIZE, 0, + assert!(build_pairs::(SIZE as _, 0, ::std::iter::repeat_with(|| Ok(Some(H256::from_low_u64_be(1)))).take(SIZE as usize / 2)).is_err()); } #[test] fn build_pairs_fails_when_missing_block() { - assert!(build_pairs::(SIZE, 0, ::std::iter::repeat_with(|| Ok(Some(H256::from_low_u64_be(1)))).take(SIZE as usize / 2) - .chain(::std::iter::once(Ok(None))) - .chain(::std::iter::repeat_with(|| Ok(Some(H256::from_low_u64_be(2)))).take(SIZE as usize / 2 - 1))).is_err()); + assert!(build_pairs::( + SIZE as _, + 0, + ::std::iter::repeat_with(|| Ok(Some(H256::from_low_u64_be(1)))) + .take(SIZE as usize / 2) + .chain(::std::iter::once(Ok(None))) + .chain(::std::iter::repeat_with(|| Ok(Some(H256::from_low_u64_be(2)))) + .take(SIZE as usize / 2 - 1)) + ).is_err()); } #[test] fn compute_root_works() { - assert!(compute_root::(SIZE, 42, - ::std::iter::repeat_with(|| Ok(Some(H256::from_low_u64_be(1)))).take(SIZE as usize)).is_ok()); + assert!(compute_root::( + SIZE as _, + 42, + ::std::iter::repeat_with(|| Ok(Some(H256::from_low_u64_be(1)))) + .take(SIZE as usize) + ).is_ok()); } #[test] #[should_panic] fn build_proof_panics_when_querying_wrong_block() { assert!(build_proof::( - SIZE, 0, vec![(SIZE * 1000) as u64], - ::std::iter::repeat_with(|| Ok(Some(H256::from_low_u64_be(1)))).take(SIZE as usize)).is_err()); + SIZE as _, + 0, + vec![(SIZE * 1000) as u64], + ::std::iter::repeat_with(|| Ok(Some(H256::from_low_u64_be(1)))) + .take(SIZE as usize) + ).is_err()); } #[test] fn build_proof_works() { assert!(build_proof::( - SIZE, 0, vec![(SIZE / 2) as u64], - ::std::iter::repeat_with(|| Ok(Some(H256::from_low_u64_be(1)))).take(SIZE as usize)).is_ok()); + SIZE as _, + 0, + vec![(SIZE / 2) as u64], + ::std::iter::repeat_with(|| Ok(Some(H256::from_low_u64_be(1)))) + .take(SIZE as usize) + ).is_ok()); } #[test] #[should_panic] fn for_each_cht_group_panics() { - let _ = for_each_cht_group::(SIZE, vec![SIZE * 5, SIZE * 2], |_, _, _| Ok(()), ()); + let cht_size = SIZE as u64; + let _ = for_each_cht_group::( + cht_size, + vec![cht_size * 5, cht_size * 2], + |_, _, _| Ok(()), + (), + ); } #[test] fn for_each_cht_group_works() { - let _ = for_each_cht_group::(SIZE, vec![ - SIZE * 2 + 1, SIZE * 2 + 2, SIZE * 2 + 5, - SIZE * 4 + 1, SIZE * 4 + 7, - SIZE * 6 + 1 - ], |_, cht_num, blocks| { - match cht_num { - 2 => assert_eq!(blocks, vec![SIZE * 2 + 1, SIZE * 2 + 2, SIZE * 2 + 5]), - 4 => assert_eq!(blocks, vec![SIZE * 4 + 1, SIZE * 4 + 7]), - 6 => assert_eq!(blocks, vec![SIZE * 6 + 1]), - _ => unreachable!(), - } - - Ok(()) - }, ()); + let cht_size = SIZE as u64; + let _ = for_each_cht_group::( + cht_size, + vec![ + cht_size * 2 + 1, cht_size * 2 + 2, cht_size * 2 + 5, + cht_size * 4 + 1, cht_size * 4 + 7, + cht_size * 6 + 1 + ], |_, cht_num, blocks| { + match cht_num { + 2 => assert_eq!(blocks, vec![cht_size * 2 + 1, cht_size * 2 + 2, cht_size * 2 + 5]), + 4 => assert_eq!(blocks, vec![cht_size * 4 + 1, cht_size * 4 + 7]), + 6 => assert_eq!(blocks, vec![cht_size * 6 + 1]), + _ => unreachable!(), + } + + Ok(()) + }, () + ); } } diff --git a/core/client/src/client.rs b/core/client/src/client.rs index 4091e23b5f01c9c876d295751d1217ad1171f9aa..3f3f1563b8b0fd35bec7cb6c9d3e8a6d7f4a37d0 100644 --- a/core/client/src/client.rs +++ b/core/client/src/client.rs @@ -29,15 +29,17 @@ use runtime_primitives::{ generic::{BlockId, SignedBlock}, }; use consensus::{ - Error as ConsensusError, ErrorKind as ConsensusErrorKind, ImportBlock, + Error as ConsensusError, ImportBlock, ImportResult, BlockOrigin, ForkChoiceStrategy, well_known_cache_keys::Id as CacheKeyId, SelectChain, self, }; use runtime_primitives::traits::{ - Block as BlockT, Header as HeaderT, Zero, As, NumberFor, CurrentHeight, - BlockNumberToHash, ApiRef, ProvideRuntimeApi, Digest, DigestItem + Block as BlockT, Header as HeaderT, Zero, NumberFor, CurrentHeight, + BlockNumberToHash, ApiRef, ProvideRuntimeApi, + SaturatedConversion, One, DigestFor, }; +use runtime_primitives::generic::DigestItem; use runtime_primitives::BuildStorage; use crate::runtime_api::{ CallRuntimeAt, ConstructRuntimeApi, Core as CoreApi, ProofRecorder, @@ -58,7 +60,10 @@ use state_machine::{ }; use hash_db::Hasher; -use crate::backend::{self, BlockImportOperation, PrunableStateChangesTrieStorage}; +use crate::backend::{ + self, BlockImportOperation, PrunableStateChangesTrieStorage, + StorageCollection, ChildStorageCollection +}; use crate::blockchain::{ self, Info as ChainInfo, Backend as ChainBackend, HeaderBackend as ChainHeaderBackend, ProvideCache, Cache, @@ -76,13 +81,18 @@ use substrate_telemetry::{telemetry, SUBSTRATE_INFO}; use log::{info, trace, warn}; + /// Type that implements `futures::Stream` of block import events. pub type ImportNotifications = mpsc::UnboundedReceiver>; /// A stream of block finality notifications. pub type FinalityNotifications = mpsc::UnboundedReceiver>; -type StorageUpdate = <<>::BlockImportOperation as BlockImportOperation>::State as state_machine::Backend>::Transaction; +type StorageUpdate = < + < + >::BlockImportOperation + as BlockImportOperation + >::State as state_machine::Backend>::Transaction; type ChangesUpdate = trie::MemoryDB; /// Execution strategies settings. @@ -119,7 +129,6 @@ pub struct Client where Block: BlockT { storage_notifications: Mutex>, import_notification_sinks: Mutex>>>, finality_notification_sinks: Mutex>>>, - import_lock: Arc>, // holds the block hash currently being imported. TODO: replace this with block queue importing_block: RwLock>, execution_strategies: ExecutionStrategies, @@ -129,7 +138,15 @@ pub struct Client where Block: BlockT { /// Client import operation, a wrapper for the backend. pub struct ClientImportOperation, B: backend::Backend> { op: B::BlockImportOperation, - notify_imported: Option<(Block::Hash, BlockOrigin, Block::Header, bool, Option, Option>)>>)>, + notify_imported: Option<( + Block::Hash, + BlockOrigin, + Block::Header, + bool, + Option<( + StorageCollection, + ChildStorageCollection, + )>)>, notify_finalized: Vec, } @@ -146,13 +163,19 @@ pub trait BlockchainEvents { /// Get storage changes event stream. /// /// Passing `None` as `filter_keys` subscribes to all storage changes. - fn storage_changes_notification_stream(&self, filter_keys: Option<&[StorageKey]>) -> error::Result>; + fn storage_changes_notification_stream( + &self, + filter_keys: Option<&[StorageKey]>, + child_filter_keys: Option<&[(StorageKey, Option>)]>, + ) -> error::Result>; } /// Fetch block body by ID. pub trait BlockBody { /// Get block body by ID. Returns `None` if the body is not stored. - fn block_body(&self, id: &BlockId) -> error::Result::Extrinsic>>>; + fn block_body(&self, + id: &BlockId + ) -> error::Result::Extrinsic>>>; } /// Client info @@ -160,10 +183,6 @@ pub trait BlockBody { pub struct ClientInfo { /// Best block hash. pub chain: ChainInfo, - /// Best block number in the queue. - pub best_queued_number: Option<<::Header as HeaderT>::Number>, - /// Best queued block hash. - pub best_queued_hash: Option, } /// Block status. @@ -242,11 +261,15 @@ impl PrePostHeader { pub fn new_in_mem( executor: E, genesis_storage: S, -) -> error::Result, LocalCallExecutor, E>, Block, RA>> - where - E: CodeExecutor + RuntimeInfo, - S: BuildStorage, - Block: BlockT, +) -> error::Result, + LocalCallExecutor, E>, + Block, + RA +>> where + E: CodeExecutor + RuntimeInfo, + S: BuildStorage, + Block: BlockT, { new_with_backend(Arc::new(in_mem::Backend::new()), executor, genesis_storage) } @@ -286,7 +309,10 @@ impl Client where backend.begin_state_operation(&mut op, BlockId::Hash(Default::default()))?; let state_root = op.reset_storage(genesis_storage, children_genesis_storage)?; let genesis_block = genesis::construct_genesis_block::(state_root.into()); - info!("Initializing Genesis block/state (state: {}, header-hash: {})", genesis_block.header().state_root(), genesis_block.header().hash()); + info!("Initializing Genesis block/state (state: {}, header-hash: {})", + genesis_block.header().state_root(), + genesis_block.header().hash() + ); op.set_block_data( genesis_block.deconstruct().0, Some(vec![]), @@ -302,7 +328,6 @@ impl Client where storage_notifications: Default::default(), import_notification_sinks: Default::default(), finality_notification_sinks: Default::default(), - import_lock: Default::default(), importing_block: Default::default(), execution_strategies, _phantom: Default::default(), @@ -328,32 +353,71 @@ impl Client where &self.backend } - /// Expose reference to import lock - #[doc(hidden)] - #[deprecated(note="Rather than relying on `client` to provide this, access \ - to the backend should be handled at setup only - see #1134. This function \ - will be removed once that is in place.")] - pub fn import_lock(&self) -> Arc> { - self.import_lock.clone() - } - - /// Return storage entry keys in state in a block of given hash with given prefix. + /// Given a `BlockId` and a key prefix, return the matching child storage keys in that block. pub fn storage_keys(&self, id: &BlockId, key_prefix: &StorageKey) -> error::Result> { let keys = self.state_at(id)?.keys(&key_prefix.0).into_iter().map(StorageKey).collect(); Ok(keys) } - /// Return single storage entry of contract under given address in state in a block of given hash. + /// Given a `BlockId` and a key, return the value under the key in that block. pub fn storage(&self, id: &BlockId, key: &StorageKey) -> error::Result> { Ok(self.state_at(id)? .storage(&key.0).map_err(|e| error::Error::from_state(Box::new(e)))? .map(StorageData)) } + /// Given a `BlockId` and a key, return the value under the hash in that block. + pub fn storage_hash(&self, id: &BlockId, key: &StorageKey) + -> error::Result> { + Ok(self.state_at(id)? + .storage_hash(&key.0).map_err(|e| error::Error::from_state(Box::new(e)))? + ) + } + + /// Given a `BlockId`, a key prefix, and a child storage key, return the matching child storage keys. + pub fn child_storage_keys( + &self, + id: &BlockId, + child_storage_key: &StorageKey, + key_prefix: &StorageKey + ) -> error::Result> { + let keys = self.state_at(id)? + .child_keys(&child_storage_key.0, &key_prefix.0) + .into_iter() + .map(StorageKey) + .collect(); + Ok(keys) + } + + /// Given a `BlockId`, a key and a child storage key, return the value under the key in that block. + pub fn child_storage( + &self, + id: &BlockId, + child_storage_key: &StorageKey, + key: &StorageKey + ) -> error::Result> { + Ok(self.state_at(id)? + .child_storage(&child_storage_key.0, &key.0).map_err(|e| error::Error::from_state(Box::new(e)))? + .map(StorageData)) + } + + /// Given a `BlockId`, a key and a child storage key, return the hash under the key in that block. + pub fn child_storage_hash( + &self, + id: &BlockId, + child_storage_key: &StorageKey, + key: &StorageKey + ) -> error::Result> { + Ok(self.state_at(id)? + .child_storage_hash(&child_storage_key.0, &key.0).map_err(|e| error::Error::from_state(Box::new(e)))? + ) + } + /// Get the code at a given block. pub fn code_at(&self, id: &BlockId) -> error::Result> { Ok(self.storage(id, &StorageKey(well_known_keys::CODE.to_vec()))? - .expect("None is returned if there's no value stored for the given key; ':code' key is always defined; qed").0) + .expect("None is returned if there's no value stored for the given key;\ + ':code' key is always defined; qed").0) } /// Get the RuntimeVersion at a given block. @@ -392,7 +456,11 @@ impl Client where /// AND returning execution proof. /// /// No changes are made. - pub fn execution_proof(&self, id: &BlockId, method: &str, call_data: &[u8]) -> error::Result<(Vec, Vec>)> { + pub fn execution_proof(&self, + id: &BlockId, + method: &str, + call_data: &[u8] + ) -> error::Result<(Vec, Vec>)> { let state = self.state_at(id)?; let header = self.prepare_environment_block(id)?; prove_execution(state, header, &self.executor, method, call_data) @@ -400,22 +468,34 @@ impl Client where /// Reads given header and generates CHT-based header proof. pub fn header_proof(&self, id: &BlockId) -> error::Result<(Block::Header, Vec>)> { - self.header_proof_with_cht_size(id, cht::SIZE) + self.header_proof_with_cht_size(id, cht::size()) } /// Get block hash by number. - pub fn block_hash(&self, block_number: <::Header as HeaderT>::Number) -> error::Result> { + pub fn block_hash(&self, + block_number: <::Header as HeaderT>::Number + ) -> error::Result> { self.backend.blockchain().hash(block_number) } /// Reads given header and generates CHT-based header proof for CHT of given size. - pub fn header_proof_with_cht_size(&self, id: &BlockId, cht_size: u64) -> error::Result<(Block::Header, Vec>)> { + pub fn header_proof_with_cht_size( + &self, + id: &BlockId, + cht_size: NumberFor, + ) -> error::Result<(Block::Header, Vec>)> { let proof_error = || error::Error::Backend(format!("Failed to generate header proof for {:?}", id)); let header = self.backend.blockchain().expect_header(*id)?; let block_num = *header.number(); let cht_num = cht::block_to_cht_number(cht_size, block_num).ok_or_else(proof_error)?; let cht_start = cht::start_number(cht_size, cht_num); - let headers = (cht_start.as_()..).map(|num| self.block_hash(As::sa(num))); + let mut current_num = cht_start; + let cht_range = ::std::iter::from_fn(|| { + let old_current_num = current_num; + current_num = current_num + One::one(); + Some(old_current_num) + }); + let headers = cht_range.map(|num| self.block_hash(num)); let proof = cht::build_proof::(cht_size, cht_num, ::std::iter::once(block_num), headers)?; Ok((header, proof)) } @@ -433,19 +513,20 @@ impl Client where Some((config, storage)) => (config, storage), None => return Ok(None), }; - let first = first.as_(); - let last_num = self.backend.blockchain().expect_block_number_from_id(&last)?.as_(); + let last_num = self.backend.blockchain().expect_block_number_from_id(&last)?; if first > last_num { return Err(error::Error::ChangesTrieAccessFailed("Invalid changes trie range".into())); } - let finalized_number = self.backend.blockchain().info()?.finalized_number; - let oldest = storage.oldest_changes_trie_block(&config, finalized_number.as_()); - let first = As::sa(::std::cmp::max(first, oldest)); + let finalized_number = self.backend.blockchain().info().finalized_number; + let oldest = storage.oldest_changes_trie_block(&config, finalized_number); + let first = ::std::cmp::max(first, oldest); Ok(Some((first, last))) } /// Get pairs of (block, extrinsic) where key has been changed at given blocks range. /// Works only for runtimes that are supporting changes tries. + /// + /// Changes are returned in descending order (i.e. last block comes first). pub fn key_changes( &self, first: NumberFor, @@ -453,20 +534,20 @@ impl Client where key: &StorageKey ) -> error::Result, u32)>> { let (config, storage) = self.require_changes_trie()?; - let last_number = self.backend.blockchain().expect_block_number_from_id(&last)?.as_(); + let last_number = self.backend.blockchain().expect_block_number_from_id(&last)?; let last_hash = self.backend.blockchain().expect_block_hash_from_id(&last)?; - key_changes::<_, Blake2Hasher>( + key_changes::<_, Blake2Hasher, _>( &config, &*storage, - first.as_(), + first, &ChangesTrieAnchorBlockId { hash: convert_hash(&last_hash), number: last_number, }, - self.backend.blockchain().info()?.best_number.as_(), + self.backend.blockchain().info().best_number, &key.0) - .and_then(|r| r.map(|r| r.map(|(block, tx)| (As::sa(block), tx))).collect::>()) + .and_then(|r| r.map(|r| r.map(|(block, tx)| (block, tx))).collect::>()) .map_err(|err| error::Error::ChangesTrieAccessFailed(err)) } @@ -490,7 +571,7 @@ impl Client where min, max, key, - cht::SIZE, + cht::size(), ) } @@ -502,21 +583,29 @@ impl Client where min: Block::Hash, max: Block::Hash, key: &StorageKey, - cht_size: u64, + cht_size: NumberFor, ) -> error::Result> { struct AccessedRootsRecorder<'a, Block: BlockT> { - storage: &'a ChangesTrieStorage, - min: u64, + storage: &'a dyn ChangesTrieStorage>, + min: NumberFor, required_roots_proofs: Mutex, H256>>, }; - impl<'a, Block: BlockT> ChangesTrieRootsStorage for AccessedRootsRecorder<'a, Block> { - fn root(&self, anchor: &ChangesTrieAnchorBlockId, block: u64) -> Result, String> { + impl<'a, Block: BlockT> ChangesTrieRootsStorage> for AccessedRootsRecorder<'a, Block> { + fn build_anchor(&self, hash: H256) -> Result>, String> { + self.storage.build_anchor(hash) + } + + fn root( + &self, + anchor: &ChangesTrieAnchorBlockId>, + block: NumberFor, + ) -> Result, String> { let root = self.storage.root(anchor, block)?; if block < self.min { if let Some(ref root) = root { self.required_roots_proofs.lock().insert( - As::sa(block), + block, root.clone() ); } @@ -525,7 +614,7 @@ impl Client where } } - impl<'a, Block: BlockT> ChangesTrieStorage for AccessedRootsRecorder<'a, Block> { + impl<'a, Block: BlockT> ChangesTrieStorage> for AccessedRootsRecorder<'a, Block> { fn get(&self, key: &H256, prefix: &[u8]) -> Result, String> { self.storage.get(key, prefix) } @@ -536,19 +625,21 @@ impl Client where let recording_storage = AccessedRootsRecorder:: { storage, - min: min_number.as_(), + min: min_number, required_roots_proofs: Mutex::new(BTreeMap::new()), }; let max_number = ::std::cmp::min( - self.backend.blockchain().info()?.best_number, + self.backend.blockchain().info().best_number, self.backend.blockchain().expect_block_number_from_id(&BlockId::Hash(max))?, ); // fetch key changes proof - let first_number = self.backend.blockchain().expect_block_number_from_id(&BlockId::Hash(first))?.as_(); - let last_number = self.backend.blockchain().expect_block_number_from_id(&BlockId::Hash(last))?.as_(); - let key_changes_proof = key_changes_proof::<_, Blake2Hasher>( + let first_number = self.backend.blockchain() + .expect_block_number_from_id(&BlockId::Hash(first))?; + let last_number = self.backend.blockchain() + .expect_block_number_from_id(&BlockId::Hash(last))?; + let key_changes_proof = key_changes_proof::<_, Blake2Hasher, _>( &config, &recording_storage, first_number, @@ -556,7 +647,7 @@ impl Client where hash: convert_hash(&last), number: last_number, }, - max_number.as_(), + max_number, &key.0 ) .map_err(|err| error::Error::from(error::Error::ChangesTrieAccessFailed(err)))?; @@ -577,7 +668,7 @@ impl Client where /// Generate CHT-based proof for roots of changes tries at given blocks. fn changes_trie_roots_proof>>( &self, - cht_size: u64, + cht_size: NumberFor, blocks: I ) -> error::Result>> { // most probably we have touched several changes tries that are parts of the single CHT @@ -596,12 +687,19 @@ impl Client where /// Generates CHT-based proof for roots of changes tries at given blocks (that are part of single CHT). fn changes_trie_roots_proof_at_cht( &self, - cht_size: u64, + cht_size: NumberFor, cht_num: NumberFor, blocks: Vec> ) -> error::Result>> { let cht_start = cht::start_number(cht_size, cht_num); - let roots = (cht_start.as_()..).map(|num| self.header(&BlockId::Number(As::sa(num))) + let mut current_num = cht_start; + let cht_range = ::std::iter::from_fn(|| { + let old_current_num = current_num; + current_num = current_num + One::one(); + Some(old_current_num) + }); + let roots = cht_range + .map(|num| self.header(&BlockId::Number(num)) .map(|block| block.and_then(|block| block.digest().log(DigestItem::as_changes_trie_root).cloned()))); let proof = cht::build_proof::(cht_size, cht_num, blocks, roots)?; Ok(proof) @@ -619,26 +717,29 @@ impl Client where /// Create a new block, built on the head of the chain. pub fn new_block( - &self + &self, + inherent_digests: DigestFor, ) -> error::Result> where E: Clone + Send + Sync, RA: Send + Sync, Self: ProvideRuntimeApi, ::Api: BlockBuilderAPI { - block_builder::BlockBuilder::new(self) + block_builder::BlockBuilder::new(self, inherent_digests) } /// Create a new block, built on top of `parent`. pub fn new_block_at( - &self, parent: &BlockId + &self, + parent: &BlockId, + inherent_digests: DigestFor, ) -> error::Result> where E: Clone + Send + Sync, RA: Send + Sync, Self: ProvideRuntimeApi, ::Api: BlockBuilderAPI { - block_builder::BlockBuilder::at_block(parent, &self, false) + block_builder::BlockBuilder::at_block(parent, &self, false, inherent_digests) } /// Create a new block, built on top of `parent` with proof recording enabled. @@ -647,14 +748,16 @@ impl Client where /// These recorded trie nodes can be used by a third party to proof the /// output of this block builder without having access to the full storage. pub fn new_block_at_with_proof_recording( - &self, parent: &BlockId + &self, + parent: &BlockId, + inherent_digests: DigestFor, ) -> error::Result> where E: Clone + Send + Sync, RA: Send + Sync, Self: ProvideRuntimeApi, ::Api: BlockBuilderAPI { - block_builder::BlockBuilder::at_block(parent, &self, true) + block_builder::BlockBuilder::at_block(parent, &self, true, inherent_digests) } /// Lock the import lock, and run operations inside. @@ -663,7 +766,7 @@ impl Client where Err: From, { let inner = || { - let _import_lock = self.import_lock.lock(); + let _import_lock = self.backend.get_import_lock().lock(); let mut op = ClientImportOperation { op: self.backend.begin_operation()?, @@ -750,7 +853,7 @@ impl Client where }; let hash = import_headers.post().hash(); - let height: u64 = import_headers.post().number().as_(); + let height = (*import_headers.post().number()).saturated_into::(); *self.importing_block.write() = Some(hash); @@ -798,7 +901,7 @@ impl Client where } let (last_best, last_best_number) = { - let info = self.backend.blockchain().info()?; + let info = self.backend.blockchain().info(); (info.best_hash, info.best_number) }; @@ -847,7 +950,7 @@ impl Client where operation.op.update_db_storage(storage_update)?; } if let Some(storage_changes) = storage_changes.clone() { - operation.op.update_storage(storage_changes)?; + operation.op.update_storage(storage_changes.0, storage_changes.1)?; } if let Some(Some(changes_update)) = changes_update { operation.op.update_changes_trie(changes_update)?; @@ -876,7 +979,10 @@ impl Client where ) -> error::Result<( Option>, Option>, - Option, Option>)>>, + Option<( + Vec<(Vec, Option>)>, + Vec<(Vec, Vec<(Vec, Option>)>)> + )> )> where E: CallExecutor + Send + Sync + Clone, @@ -919,7 +1025,9 @@ impl Client where overlay.commit_prospective(); - Ok((Some(storage_update), Some(changes_update), Some(overlay.into_committed().collect()))) + let (top, children) = overlay.into_committed(); + let children = children.map(|(sk, it)| (sk, it.collect())).collect(); + Ok((Some(storage_update), Some(changes_update), Some((top.collect(), children)))) }, None => Ok((None, None, None)) } @@ -1018,14 +1126,26 @@ impl Client where fn notify_imported( &self, - notify_import: (Block::Hash, BlockOrigin, Block::Header, bool, Option, Option>)>>), + notify_import: ( + Block::Hash, BlockOrigin, + Block::Header, + bool, + Option<( + Vec<(Vec, Option>)>, + Vec<(Vec, Vec<(Vec, Option>)>)>, + ) + >), ) -> error::Result<()> { let (hash, origin, header, is_new_best, storage_changes) = notify_import; if let Some(storage_changes) = storage_changes { // TODO [ToDr] How to handle re-orgs? Should we re-emit all storage changes? self.storage_notifications.lock() - .trigger(&hash, storage_changes.into_iter()); + .trigger( + &hash, + storage_changes.0.into_iter(), + storage_changes.1.into_iter().map(|(sk, v)| (sk, v.into_iter())), + ); } let notification = BlockImportNotification:: { @@ -1071,7 +1191,7 @@ impl Client where justification: Option, notify: bool, ) -> error::Result<()> { - let last_best = self.backend.blockchain().info()?.best_hash; + let last_best = self.backend.blockchain().info().best_hash; let to_finalize_hash = self.backend.blockchain().expect_block_hash_from_id(&id)?; self.apply_finality_with_block_hash(operation, to_finalize_hash, justification, last_best, notify) } @@ -1084,7 +1204,7 @@ impl Client where /// while performing major synchronization work. pub fn finalize_block(&self, id: BlockId, justification: Option, notify: bool) -> error::Result<()> { self.lock_import_and_run(|operation| { - let last_best = self.backend.blockchain().info()?.best_hash; + let last_best = self.backend.blockchain().info().best_hash; let to_finalize_hash = self.backend.blockchain().expect_block_hash_from_id(&id)?; self.apply_finality_with_block_hash(operation, to_finalize_hash, justification, last_best, notify) }) @@ -1097,13 +1217,11 @@ impl Client where } /// Get blockchain info. - pub fn info(&self) -> error::Result> { - let info = self.backend.blockchain().info().map_err(|e| error::Error::from_blockchain(Box::new(e)))?; - Ok(ClientInfo { + pub fn info(&self) -> ClientInfo { + let info = self.backend.blockchain().info(); + ClientInfo { chain: info, - best_queued_hash: None, - best_queued_number: None, - }) + } } /// Get block status. @@ -1165,7 +1283,7 @@ impl Client where } }; - let genesis_hash = self.backend.blockchain().info()?.genesis_hash; + let genesis_hash = self.backend.blockchain().info().genesis_hash; if genesis_hash == target_hash { return Ok(Vec::new()); } let mut current_hash = target_hash; @@ -1174,7 +1292,7 @@ impl Client where let mut ancestor = load_header(ancestor_hash)?; let mut uncles = Vec::new(); - for _generation in 0..max_generation.as_() { + for _generation in 0..max_generation.saturated_into() { let children = self.backend.blockchain().children(ancestor_hash)?; uncles.extend(children.into_iter().filter(|h| h != ¤t_hash)); current_hash = ancestor_hash; @@ -1188,7 +1306,7 @@ impl Client where } fn changes_trie_config(&self) -> Result, Error> { - Ok(self.backend.state_at(BlockId::Number(self.backend.blockchain().info()?.best_number))? + Ok(self.backend.state_at(BlockId::Number(self.backend.blockchain().info().best_number))? .storage(well_known_keys::CHANGES_TRIE_CONFIG) .map_err(|e| error::Error::from_state(Box::new(e)))? .and_then(|c| Decode::decode(&mut &*c))) @@ -1196,11 +1314,12 @@ impl Client where /// Prepare in-memory header that is used in execution environment. fn prepare_environment_block(&self, parent: &BlockId) -> error::Result { + let parent_header = self.backend.blockchain().expect_header(*parent)?; Ok(<::Header as HeaderT>::new( - self.backend.blockchain().expect_block_number_from_id(parent)? + As::sa(1), + self.backend.blockchain().expect_block_number_from_id(parent)? + One::one(), Default::default(), Default::default(), - self.backend.blockchain().expect_block_hash_from_id(&parent)?, + parent_header.hash(), Default::default(), )) } @@ -1216,7 +1335,7 @@ impl ChainHeaderBackend for Client wher self.backend.blockchain().header(id) } - fn info(&self) -> error::Result> { + fn info(&self) -> blockchain::Info { self.backend.blockchain().info() } @@ -1237,7 +1356,7 @@ impl ProvideCache for Client where B: backend::Backend, Block: BlockT, { - fn cache(&self) -> Option>> { + fn cache(&self) -> Option>> { self.backend.blockchain().cache() } } @@ -1330,7 +1449,7 @@ impl consensus::BlockImport for Client ) -> Result { self.lock_import_and_run(|operation| { self.apply_block(operation, import_block, new_cache) - }).map_err(|e| ConsensusErrorKind::ClientImport(e.to_string()).into()) + }).map_err(|e| ConsensusError::ClientImport(e.to_string()).into()) } /// Check block preconditions. @@ -1340,7 +1459,7 @@ impl consensus::BlockImport for Client parent_hash: Block::Hash, ) -> Result { match self.block_status(&BlockId::Hash(parent_hash)) - .map_err(|e| ConsensusError::from(ConsensusErrorKind::ClientImport(e.to_string())))? + .map_err(|e| ConsensusError::ClientImport(e.to_string()))? { BlockStatus::InChainWithState | BlockStatus::Queued => {}, BlockStatus::Unknown | BlockStatus::InChainPruned => return Ok(ImportResult::UnknownParent), @@ -1348,7 +1467,7 @@ impl consensus::BlockImport for Client } match self.block_status(&BlockId::Hash(hash)) - .map_err(|e| ConsensusError::from(ConsensusErrorKind::ClientImport(e.to_string())))? + .map_err(|e| ConsensusError::ClientImport(e.to_string()))? { BlockStatus::InChainWithState | BlockStatus::Queued => return Ok(ImportResult::AlreadyInChain), BlockStatus::Unknown | BlockStatus::InChainPruned => {}, @@ -1366,7 +1485,7 @@ impl CurrentHeight for Client where { type BlockNumber = ::Number; fn current_height(&self) -> Self::BlockNumber { - self.backend.blockchain().info().map(|i| i.best_number).unwrap_or_else(|_| Zero::zero()) + self.backend.blockchain().info().best_number } } @@ -1402,8 +1521,12 @@ where } /// Get storage changes event stream. - fn storage_changes_notification_stream(&self, filter_keys: Option<&[StorageKey]>) -> error::Result> { - Ok(self.storage_notifications.lock().listen(filter_keys)) + fn storage_changes_notification_stream( + &self, + filter_keys: Option<&[StorageKey]>, + child_filter_keys: Option<&[(StorageKey, Option>)]>, + ) -> error::Result> { + Ok(self.storage_notifications.lock().listen(filter_keys, child_filter_keys)) } } @@ -1411,17 +1534,14 @@ where /// where 'longest' is defined as the highest number of blocks pub struct LongestChain { backend: Arc, - import_lock: Arc>, _phantom: PhantomData } impl Clone for LongestChain { fn clone(&self) -> Self { let backend = self.backend.clone(); - let import_lock = self.import_lock.clone(); LongestChain { backend, - import_lock, _phantom: Default::default() } } @@ -1433,19 +1553,15 @@ where Block: BlockT, { /// Instantiate a new LongestChain for Backend B - pub fn new(backend: Arc, import_lock: Arc>) -> Self { + pub fn new(backend: Arc) -> Self { LongestChain { backend, - import_lock, _phantom: Default::default() } } fn best_block_header(&self) -> error::Result<::Header> { - let info : ChainInfo = match self.backend.blockchain().info() { - Ok(i) => i, - Err(e) => return Err(error::Error::from_blockchain(Box::new(e))) - }; + let info : ChainInfo = self.backend.blockchain().info(); Ok(self.backend.blockchain().header(BlockId::Hash(info.best_hash))? .expect("Best block header must always exist")) } @@ -1485,9 +1601,9 @@ where // ensure no blocks are imported during this code block. // an import could trigger a reorg which could change the canonical chain. // we depend on the canonical chain staying the same during this code block. - let _import_lock = self.import_lock.lock(); + let _import_lock = self.backend.get_import_lock().lock(); - let info = self.backend.blockchain().info()?; + let info = self.backend.blockchain().info(); let canon_hash = self.backend.blockchain().hash(*target_header.number())? .ok_or_else(|| error::Error::from(format!("failed to get hash for block number {}", target_header.number())))?; @@ -1584,14 +1700,14 @@ where fn leaves(&self) -> Result::Hash>, ConsensusError> { LongestChain::leaves(self) - .map_err(|e| ConsensusErrorKind::ChainLookup(e.to_string()).into()) + .map_err(|e| ConsensusError::ChainLookup(e.to_string()).into()) } fn best_chain(&self) -> Result<::Header, ConsensusError> { LongestChain::best_block_header(&self) - .map_err(|e| ConsensusErrorKind::ChainLookup(e.to_string()).into()) + .map_err(|e| ConsensusError::ChainLookup(e.to_string()).into()) } fn finality_target( @@ -1600,7 +1716,7 @@ where maybe_max_number: Option> ) -> Result, ConsensusError> { LongestChain::best_containing(self, target_hash, maybe_max_number) - .map_err(|e| ConsensusErrorKind::ChainLookup(e.to_string()).into()) + .map_err(|e| ConsensusError::ChainLookup(e.to_string()).into()) } } @@ -1647,13 +1763,13 @@ pub(crate) mod tests { use std::collections::HashMap; use super::*; use primitives::blake2_256; - use runtime_primitives::traits::DigestItem as DigestItemT; - use runtime_primitives::generic::DigestItem; - use test_client::{self, TestClient, AccountKeyring}; + use runtime_primitives::DigestItem; use consensus::{BlockOrigin, SelectChain}; - use test_client::client::backend::Backend as TestBackend; - use test_client::BlockBuilderExt; - use test_client::runtime::{self, Block, Transfer, RuntimeApi, TestAPI}; + use test_client::{ + prelude::*, + client::backend::Backend as TestBackend, + runtime::{self, Block, Transfer, RuntimeApi, TestAPI}, + }; /// Returns tuple, consisting of: /// 1) test client pre-filled with blocks changing balances; @@ -1674,10 +1790,10 @@ pub(crate) mod tests { // prepare client ang import blocks let mut local_roots = Vec::new(); - let remote_client = test_client::new_with_changes_trie(); + let remote_client = TestClientBuilder::new().set_support_changes_trie(true).build(); let mut nonces: HashMap<_, u64> = Default::default(); for (i, block_transfers) in blocks_transfers.into_iter().enumerate() { - let mut builder = remote_client.new_block().unwrap(); + let mut builder = remote_client.new_block(Default::default()).unwrap(); for (from, to) in block_transfers { builder.push_transfer(Transfer { from: from.into(), @@ -1734,14 +1850,14 @@ pub(crate) mod tests { assert_eq!( client.runtime_api().balance_of( - &BlockId::Number(client.info().unwrap().chain.best_number), + &BlockId::Number(client.info().chain.best_number), AccountKeyring::Alice.into() ).unwrap(), 1000 ); assert_eq!( client.runtime_api().balance_of( - &BlockId::Number(client.info().unwrap().chain.best_number), + &BlockId::Number(client.info().chain.best_number), AccountKeyring::Ferdie.into() ).unwrap(), 0 @@ -1752,18 +1868,18 @@ pub(crate) mod tests { fn block_builder_works_with_no_transactions() { let client = test_client::new(); - let builder = client.new_block().unwrap(); + let builder = client.new_block(Default::default()).unwrap(); client.import(BlockOrigin::Own, builder.bake().unwrap()).unwrap(); - assert_eq!(client.info().unwrap().chain.best_number, 1); + assert_eq!(client.info().chain.best_number, 1); } #[test] fn block_builder_works_with_transactions() { let client = test_client::new(); - let mut builder = client.new_block().unwrap(); + let mut builder = client.new_block(Default::default()).unwrap(); builder.push_transfer(Transfer { from: AccountKeyring::Alice.into(), @@ -1774,18 +1890,21 @@ pub(crate) mod tests { client.import(BlockOrigin::Own, builder.bake().unwrap()).unwrap(); - assert_eq!(client.info().unwrap().chain.best_number, 1); - assert!(client.state_at(&BlockId::Number(1)).unwrap().pairs() != client.state_at(&BlockId::Number(0)).unwrap().pairs()); + assert_eq!(client.info().chain.best_number, 1); + assert_ne!( + client.state_at(&BlockId::Number(1)).unwrap().pairs(), + client.state_at(&BlockId::Number(0)).unwrap().pairs() + ); assert_eq!( client.runtime_api().balance_of( - &BlockId::Number(client.info().unwrap().chain.best_number), + &BlockId::Number(client.info().chain.best_number), AccountKeyring::Alice.into() ).unwrap(), 958 ); assert_eq!( client.runtime_api().balance_of( - &BlockId::Number(client.info().unwrap().chain.best_number), + &BlockId::Number(client.info().chain.best_number), AccountKeyring::Ferdie.into() ).unwrap(), 42 @@ -1796,7 +1915,7 @@ pub(crate) mod tests { fn block_builder_does_not_include_invalid() { let client = test_client::new(); - let mut builder = client.new_block().unwrap(); + let mut builder = client.new_block(Default::default()).unwrap(); builder.push_transfer(Transfer { from: AccountKeyring::Alice.into(), @@ -1814,8 +1933,11 @@ pub(crate) mod tests { client.import(BlockOrigin::Own, builder.bake().unwrap()).unwrap(); - assert_eq!(client.info().unwrap().chain.best_number, 1); - assert!(client.state_at(&BlockId::Number(1)).unwrap().pairs() != client.state_at(&BlockId::Number(0)).unwrap().pairs()); + assert_eq!(client.info().chain.best_number, 1); + assert_ne!( + client.state_at(&BlockId::Number(1)).unwrap().pairs(), + client.state_at(&BlockId::Number(0)).unwrap().pairs() + ); assert_eq!(client.body(&BlockId::Number(1)).unwrap().unwrap().len(), 1) } @@ -1824,17 +1946,14 @@ pub(crate) mod tests { // block tree: // G - let client = test_client::new(); + let (client, longest_chain_select) = TestClientBuilder::new().build_with_longest_chain(); - let genesis_hash = client.info().unwrap().chain.genesis_hash; - let longest_chain_select = test_client::client::LongestChain::new( - client.backend().clone(), - client.import_lock() - ); + let genesis_hash = client.info().chain.genesis_hash; - - assert_eq!(genesis_hash.clone(), longest_chain_select.finality_target( - genesis_hash.clone(), None).unwrap().unwrap()); + assert_eq!( + genesis_hash.clone(), + longest_chain_select.finality_target(genesis_hash.clone(), None).unwrap().unwrap() + ); } #[test] @@ -1842,16 +1961,14 @@ pub(crate) mod tests { // block tree: // G - let client = test_client::new(); + let (client, longest_chain_select) = TestClientBuilder::new().build_with_longest_chain(); - let uninserted_block = client.new_block().unwrap().bake().unwrap(); - let backend = client.backend().as_in_memory(); - let longest_chain_select = test_client::client::LongestChain::new( - Arc::new(backend), - client.import_lock()); + let uninserted_block = client.new_block(Default::default()).unwrap().bake().unwrap(); - assert_eq!(None, longest_chain_select.finality_target( - uninserted_block.hash().clone(), None).unwrap()); + assert_eq!( + None, + longest_chain_select.finality_target(uninserted_block.hash().clone(), None).unwrap() + ); } #[test] @@ -1861,11 +1978,11 @@ pub(crate) mod tests { let client = test_client::new(); // G -> A1 - let a1 = client.new_block().unwrap().bake().unwrap(); + let a1 = client.new_block(Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a1.clone()).unwrap(); // A1 -> A2 - let a2 = client.new_block().unwrap().bake().unwrap(); + let a2 = client.new_block(Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a2.clone()).unwrap(); let v: Vec = Vec::new(); assert_eq!(v, client.uncles(a2.hash(), 3).unwrap()); @@ -1881,27 +1998,27 @@ pub(crate) mod tests { let client = test_client::new(); // G -> A1 - let a1 = client.new_block().unwrap().bake().unwrap(); + let a1 = client.new_block(Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a1.clone()).unwrap(); // A1 -> A2 - let a2 = client.new_block_at(&BlockId::Hash(a1.hash())).unwrap().bake().unwrap(); + let a2 = client.new_block_at(&BlockId::Hash(a1.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a2.clone()).unwrap(); // A2 -> A3 - let a3 = client.new_block_at(&BlockId::Hash(a2.hash())).unwrap().bake().unwrap(); + let a3 = client.new_block_at(&BlockId::Hash(a2.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a3.clone()).unwrap(); // A3 -> A4 - let a4 = client.new_block_at(&BlockId::Hash(a3.hash())).unwrap().bake().unwrap(); + let a4 = client.new_block_at(&BlockId::Hash(a3.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a4.clone()).unwrap(); // A4 -> A5 - let a5 = client.new_block_at(&BlockId::Hash(a4.hash())).unwrap().bake().unwrap(); + let a5 = client.new_block_at(&BlockId::Hash(a4.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a5.clone()).unwrap(); // A1 -> B2 - let mut builder = client.new_block_at(&BlockId::Hash(a1.hash())).unwrap(); + let mut builder = client.new_block_at(&BlockId::Hash(a1.hash()), Default::default()).unwrap(); // this push is required as otherwise B2 has the same hash as A2 and won't get imported builder.push_transfer(Transfer { from: AccountKeyring::Alice.into(), @@ -1913,15 +2030,15 @@ pub(crate) mod tests { client.import(BlockOrigin::Own, b2.clone()).unwrap(); // B2 -> B3 - let b3 = client.new_block_at(&BlockId::Hash(b2.hash())).unwrap().bake().unwrap(); + let b3 = client.new_block_at(&BlockId::Hash(b2.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, b3.clone()).unwrap(); // B3 -> B4 - let b4 = client.new_block_at(&BlockId::Hash(b3.hash())).unwrap().bake().unwrap(); + let b4 = client.new_block_at(&BlockId::Hash(b3.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, b4.clone()).unwrap(); // // B2 -> C3 - let mut builder = client.new_block_at(&BlockId::Hash(b2.hash())).unwrap(); + let mut builder = client.new_block_at(&BlockId::Hash(b2.hash()), Default::default()).unwrap(); // this push is required as otherwise C3 has the same hash as B3 and won't get imported builder.push_transfer(Transfer { from: AccountKeyring::Alice.into(), @@ -1933,7 +2050,7 @@ pub(crate) mod tests { client.import(BlockOrigin::Own, c3.clone()).unwrap(); // A1 -> D2 - let mut builder = client.new_block_at(&BlockId::Hash(a1.hash())).unwrap(); + let mut builder = client.new_block_at(&BlockId::Hash(a1.hash()), Default::default()).unwrap(); // this push is required as otherwise D2 has the same hash as B2 and won't get imported builder.push_transfer(Transfer { from: AccountKeyring::Alice.into(), @@ -1944,7 +2061,7 @@ pub(crate) mod tests { let d2 = builder.bake().unwrap(); client.import(BlockOrigin::Own, d2.clone()).unwrap(); - let genesis_hash = client.info().unwrap().chain.genesis_hash; + let genesis_hash = client.info().chain.genesis_hash; let uncles1 = client.uncles(a4.hash(), 10).unwrap(); assert_eq!(vec![b2.hash(), d2.hash()], uncles1); @@ -1970,28 +2087,21 @@ pub(crate) mod tests { // block tree: // G -> A1 -> A2 - let client = test_client::new(); + let (client, longest_chain_select) = TestClientBuilder::new().build_with_longest_chain(); // G -> A1 - let a1 = client.new_block().unwrap().bake().unwrap(); + let a1 = client.new_block(Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a1.clone()).unwrap(); // A1 -> A2 - let a2 = client.new_block().unwrap().bake().unwrap(); + let a2 = client.new_block(Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a2.clone()).unwrap(); - let genesis_hash = client.info().unwrap().chain.genesis_hash; - - let longest_chain_select = test_client::client::LongestChain::new( - Arc::new(client.backend().as_in_memory()), - client.import_lock()); + let genesis_hash = client.info().chain.genesis_hash; - assert_eq!(a2.hash(), longest_chain_select.finality_target( - genesis_hash, None).unwrap().unwrap()); - assert_eq!(a2.hash(), longest_chain_select.finality_target( - a1.hash(), None).unwrap().unwrap()); - assert_eq!(a2.hash(), longest_chain_select.finality_target( - a2.hash(), None).unwrap().unwrap()); + assert_eq!(a2.hash(), longest_chain_select.finality_target(genesis_hash, None).unwrap().unwrap()); + assert_eq!(a2.hash(), longest_chain_select.finality_target(a1.hash(), None).unwrap().unwrap()); + assert_eq!(a2.hash(), longest_chain_select.finality_target(a2.hash(), None).unwrap().unwrap()); } #[test] @@ -2001,30 +2111,30 @@ pub(crate) mod tests { // A1 -> B2 -> B3 -> B4 // B2 -> C3 // A1 -> D2 - let client = test_client::new(); + let (client, longest_chain_select) = TestClientBuilder::new().build_with_longest_chain(); // G -> A1 - let a1 = client.new_block().unwrap().bake().unwrap(); + let a1 = client.new_block(Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a1.clone()).unwrap(); // A1 -> A2 - let a2 = client.new_block_at(&BlockId::Hash(a1.hash())).unwrap().bake().unwrap(); + let a2 = client.new_block_at(&BlockId::Hash(a1.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a2.clone()).unwrap(); // A2 -> A3 - let a3 = client.new_block_at(&BlockId::Hash(a2.hash())).unwrap().bake().unwrap(); + let a3 = client.new_block_at(&BlockId::Hash(a2.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a3.clone()).unwrap(); // A3 -> A4 - let a4 = client.new_block_at(&BlockId::Hash(a3.hash())).unwrap().bake().unwrap(); + let a4 = client.new_block_at(&BlockId::Hash(a3.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a4.clone()).unwrap(); // A4 -> A5 - let a5 = client.new_block_at(&BlockId::Hash(a4.hash())).unwrap().bake().unwrap(); + let a5 = client.new_block_at(&BlockId::Hash(a4.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a5.clone()).unwrap(); // A1 -> B2 - let mut builder = client.new_block_at(&BlockId::Hash(a1.hash())).unwrap(); + let mut builder = client.new_block_at(&BlockId::Hash(a1.hash()), Default::default()).unwrap(); // this push is required as otherwise B2 has the same hash as A2 and won't get imported builder.push_transfer(Transfer { from: AccountKeyring::Alice.into(), @@ -2036,15 +2146,15 @@ pub(crate) mod tests { client.import(BlockOrigin::Own, b2.clone()).unwrap(); // B2 -> B3 - let b3 = client.new_block_at(&BlockId::Hash(b2.hash())).unwrap().bake().unwrap(); + let b3 = client.new_block_at(&BlockId::Hash(b2.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, b3.clone()).unwrap(); // B3 -> B4 - let b4 = client.new_block_at(&BlockId::Hash(b3.hash())).unwrap().bake().unwrap(); + let b4 = client.new_block_at(&BlockId::Hash(b3.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, b4.clone()).unwrap(); // // B2 -> C3 - let mut builder = client.new_block_at(&BlockId::Hash(b2.hash())).unwrap(); + let mut builder = client.new_block_at(&BlockId::Hash(b2.hash()), Default::default()).unwrap(); // this push is required as otherwise C3 has the same hash as B3 and won't get imported builder.push_transfer(Transfer { from: AccountKeyring::Alice.into(), @@ -2056,7 +2166,7 @@ pub(crate) mod tests { client.import(BlockOrigin::Own, c3.clone()).unwrap(); // A1 -> D2 - let mut builder = client.new_block_at(&BlockId::Hash(a1.hash())).unwrap(); + let mut builder = client.new_block_at(&BlockId::Hash(a1.hash()), Default::default()).unwrap(); // this push is required as otherwise D2 has the same hash as B2 and won't get imported builder.push_transfer(Transfer { from: AccountKeyring::Alice.into(), @@ -2067,13 +2177,9 @@ pub(crate) mod tests { let d2 = builder.bake().unwrap(); client.import(BlockOrigin::Own, d2.clone()).unwrap(); - assert_eq!(client.info().unwrap().chain.best_hash, a5.hash()); - - let genesis_hash = client.info().unwrap().chain.genesis_hash; - let longest_chain_select = test_client::client::LongestChain::new( - Arc::new(client.backend().as_in_memory()), - client.import_lock()); + assert_eq!(client.info().chain.best_hash, a5.hash()); + let genesis_hash = client.info().chain.genesis_hash; let leaves = longest_chain_select.leaves().unwrap(); assert!(leaves.contains(&a5.hash())); @@ -2289,24 +2395,19 @@ pub(crate) mod tests { // block tree: // G -> A1 -> A2 - let client = test_client::new(); + let (client, longest_chain_select) = TestClientBuilder::new().build_with_longest_chain(); // G -> A1 - let a1 = client.new_block().unwrap().bake().unwrap(); + let a1 = client.new_block(Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a1.clone()).unwrap(); // A1 -> A2 - let a2 = client.new_block().unwrap().bake().unwrap(); + let a2 = client.new_block(Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a2.clone()).unwrap(); - let genesis_hash = client.info().unwrap().chain.genesis_hash; - let longest_chain_select = test_client::client::LongestChain::new( - Arc::new(client.backend().as_in_memory()), - client.import_lock() - ); + let genesis_hash = client.info().chain.genesis_hash; - assert_eq!(a2.hash(), longest_chain_select.finality_target( - genesis_hash, Some(10)).unwrap().unwrap()); + assert_eq!(a2.hash(), longest_chain_select.finality_target(genesis_hash, Some(10)).unwrap().unwrap()); } #[test] @@ -2331,35 +2432,38 @@ pub(crate) mod tests { let client = test_client::new(); // G -> A1 - let a1 = client.new_block().unwrap().bake().unwrap(); + let a1 = client.new_block(Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a1.clone()).unwrap(); // A1 -> A2 - let a2 = client.new_block_at(&BlockId::Hash(a1.hash())).unwrap().bake().unwrap(); + let a2 = client.new_block_at(&BlockId::Hash(a1.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a2.clone()).unwrap(); // A2 -> A3 let justification = vec![1, 2, 3]; - let a3 = client.new_block_at(&BlockId::Hash(a2.hash())).unwrap().bake().unwrap(); + let a3 = client.new_block_at(&BlockId::Hash(a2.hash()), Default::default()).unwrap().bake().unwrap(); client.import_justified(BlockOrigin::Own, a3.clone(), justification.clone()).unwrap(); + #[allow(deprecated)] + let blockchain = client.backend().blockchain(); + assert_eq!( - client.backend().blockchain().last_finalized().unwrap(), + blockchain.last_finalized().unwrap(), a3.hash(), ); assert_eq!( - client.backend().blockchain().justification(BlockId::Hash(a3.hash())).unwrap(), + blockchain.justification(BlockId::Hash(a3.hash())).unwrap(), Some(justification), ); assert_eq!( - client.backend().blockchain().justification(BlockId::Hash(a1.hash())).unwrap(), + blockchain.justification(BlockId::Hash(a1.hash())).unwrap(), None, ); assert_eq!( - client.backend().blockchain().justification(BlockId::Hash(a2.hash())).unwrap(), + blockchain.justification(BlockId::Hash(a2.hash())).unwrap(), None, ); } diff --git a/core/client/src/error.rs b/core/client/src/error.rs index 050f867dfcb86e0816b63db2ba03ae904022f817..b807d5e11cc5dddaff2d3b93b71b4e14855478f8 100644 --- a/core/client/src/error.rs +++ b/core/client/src/error.rs @@ -42,7 +42,7 @@ pub enum Error { ApplyExtrinsicFailed(ApplyError), /// Execution error. #[display(fmt = "Execution: {}", _0)] - Execution(Box), + Execution(Box), /// Blockchain error. #[display(fmt = "Blockchain: {}", _0)] Blockchain(Box), @@ -55,7 +55,10 @@ pub enum Error { /// Genesis config is invalid. #[display(fmt = "Genesis config provided is invalid")] GenesisInvalid, - /// Bad justification for header. + /// Error decoding header justification. + #[display(fmt = "error decoding justification for header")] + JustificationDecode, + /// Justification for header is correctly encoded, but invalid. #[display(fmt = "bad justification for header: {}", _0)] BadJustification(String), /// Not available on light client. @@ -89,15 +92,15 @@ pub enum Error { #[display(fmt = "Potential long-range attack: block not in finalized chain.")] NotInFinalizedChain, /// Hash that is required for building CHT is missing. - #[display(fmt = "Failed to get hash of block#{} for building CHT#{}", _0, _1)] - MissingHashRequiredForCHT(u64, u64), + #[display(fmt = "Failed to get hash of block for building CHT")] + MissingHashRequiredForCHT, /// A convenience variant for String #[display(fmt = "{}", _0)] Msg(String), } impl error::Error for Error { - fn source(&self) -> Option<&(error::Error + 'static)> { + fn source(&self) -> Option<&(dyn error::Error + 'static)> { match self { Error::Consensus(e) => Some(e), Error::Blockchain(e) => Some(e), @@ -125,7 +128,7 @@ impl Error { } /// Chain a state error. - pub fn from_state(e: Box) -> Self { + pub fn from_state(e: Box) -> Self { Error::Execution(e) } } diff --git a/core/client/src/genesis.rs b/core/client/src/genesis.rs index 74bc74360a2c9517c7344b4f1dfc31c07cc1b870..73bd1e03680bc7649a2d8bf5fd4424fba65472da 100644 --- a/core/client/src/genesis.rs +++ b/core/client/src/genesis.rs @@ -84,7 +84,7 @@ mod tests { state_machine::new( backend, - Some(&InMemoryChangesTrieStorage::new()), + Some(&InMemoryChangesTrieStorage::<_, u64>::new()), state_machine::NeverOffchainExt::new(), &mut overlay, &executor(), @@ -97,7 +97,7 @@ mod tests { for tx in transactions.iter() { state_machine::new( backend, - Some(&InMemoryChangesTrieStorage::new()), + Some(&InMemoryChangesTrieStorage::<_, u64>::new()), state_machine::NeverOffchainExt::new(), &mut overlay, &executor(), @@ -110,7 +110,7 @@ mod tests { let (ret_data, _, _) = state_machine::new( backend, - Some(&InMemoryChangesTrieStorage::new()), + Some(&InMemoryChangesTrieStorage::<_, u64>::new()), state_machine::NeverOffchainExt::new(), &mut overlay, &executor(), @@ -157,7 +157,7 @@ mod tests { let mut overlay = OverlayedChanges::default(); let _ = state_machine::new( &backend, - Some(&InMemoryChangesTrieStorage::new()), + Some(&InMemoryChangesTrieStorage::<_, u64>::new()), state_machine::NeverOffchainExt::new(), &mut overlay, &executor(), @@ -186,7 +186,7 @@ mod tests { let mut overlay = OverlayedChanges::default(); let _ = state_machine::new( &backend, - Some(&InMemoryChangesTrieStorage::new()), + Some(&InMemoryChangesTrieStorage::<_, u64>::new()), state_machine::NeverOffchainExt::new(), &mut overlay, &executor(), @@ -215,7 +215,7 @@ mod tests { let mut overlay = OverlayedChanges::default(); let r = state_machine::new( &backend, - Some(&InMemoryChangesTrieStorage::new()), + Some(&InMemoryChangesTrieStorage::<_, u64>::new()), state_machine::NeverOffchainExt::new(), &mut overlay, &Executor::new(None), diff --git a/core/client/src/in_mem.rs b/core/client/src/in_mem.rs index 0050cb91101c7c6fd37572263108f64b5d1d31ad..d0283147fa4ce15bda1302f037400001a03fcb7b 100644 --- a/core/client/src/in_mem.rs +++ b/core/client/src/in_mem.rs @@ -18,11 +18,10 @@ use std::collections::HashMap; use std::sync::Arc; -use parking_lot::RwLock; +use parking_lot::{RwLock, Mutex}; use primitives::{ChangesTrieConfiguration, storage::well_known_keys}; -use runtime_primitives::generic::BlockId; -use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, Zero, - NumberFor, As, Digest, DigestItem}; +use runtime_primitives::generic::{BlockId, DigestItem}; +use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, Zero, NumberFor}; use runtime_primitives::{Justification, StorageOverlay, ChildrenStorageOverlay}; use state_machine::backend::{Backend as StateBackend, InMemory}; use state_machine::{self, InMemoryChangesTrieStorage, ChangesTrieAnchorBlockId}; @@ -31,7 +30,7 @@ use trie::MemoryDB; use consensus::well_known_cache_keys::Id as CacheKeyId; use crate::error; -use crate::backend::{self, NewBlockState}; +use crate::backend::{self, NewBlockState, StorageCollection, ChildStorageCollection}; use crate::light; use crate::leaves::LeafSet; use crate::blockchain::{self, BlockStatus, HeaderBackend}; @@ -295,15 +294,15 @@ impl HeaderBackend for Blockchain { })) } - fn info(&self) -> error::Result> { + fn info(&self) -> blockchain::Info { let storage = self.storage.read(); - Ok(blockchain::Info { + blockchain::Info { best_hash: storage.best_hash, best_number: storage.best_number, genesis_hash: storage.genesis_hash, finalized_hash: storage.finalized_hash, finalized_number: storage.finalized_number, - }) + } } fn status(&self, id: BlockId) -> error::Result { @@ -341,7 +340,7 @@ impl blockchain::Backend for Blockchain { Ok(self.storage.read().finalized_hash.clone()) } - fn cache(&self) -> Option>> { + fn cache(&self) -> Option>> { None } @@ -355,7 +354,7 @@ impl blockchain::Backend for Blockchain { } impl blockchain::ProvideCache for Blockchain { - fn cache(&self) -> Option>> { + fn cache(&self) -> Option>> { None } } @@ -413,17 +412,25 @@ impl light::blockchain::Storage for Blockchain Blockchain::finalize_header(self, id, None) } - fn header_cht_root(&self, _cht_size: u64, block: NumberFor) -> error::Result { + fn header_cht_root( + &self, + _cht_size: NumberFor, + block: NumberFor, + ) -> error::Result { self.storage.read().header_cht_roots.get(&block).cloned() .ok_or_else(|| error::Error::Backend(format!("Header CHT for block {} not exists", block))) } - fn changes_trie_cht_root(&self, _cht_size: u64, block: NumberFor) -> error::Result { + fn changes_trie_cht_root( + &self, + _cht_size: NumberFor, + block: NumberFor, + ) -> error::Result { self.storage.read().changes_trie_cht_roots.get(&block).cloned() .ok_or_else(|| error::Error::Backend(format!("Changes trie CHT for block {} not exists", block))) } - fn cache(&self) -> Option>> { + fn cache(&self) -> Option>> { None } } @@ -505,7 +512,11 @@ where Ok(()) } - fn update_storage(&mut self, _update: Vec<(Vec, Option>)>) -> error::Result<()> { + fn update_storage( + &mut self, + _update: StorageCollection, + _child_update: ChildStorageCollection, + ) -> error::Result<()> { Ok(()) } @@ -529,8 +540,9 @@ where H::Out: Ord, { states: RwLock>>, - changes_trie_storage: ChangesTrieStorage, + changes_trie_storage: ChangesTrieStorage, blockchain: Blockchain, + import_lock: Mutex<()>, } impl Backend @@ -545,6 +557,7 @@ where states: RwLock::new(HashMap::new()), changes_trie_storage: ChangesTrieStorage(InMemoryChangesTrieStorage::new()), blockchain: Blockchain::new(), + import_lock: Default::default(), } } } @@ -579,7 +592,7 @@ where type BlockImportOperation = BlockImportOperation; type Blockchain = Blockchain; type State = InMemory; - type ChangesTrieStorage = ChangesTrieStorage; + type ChangesTrieStorage = ChangesTrieStorage; fn begin_operation(&self) -> error::Result { let old_state = self.state_at(BlockId::Hash(Default::default()))?; @@ -615,11 +628,14 @@ where self.states.write().insert(hash, operation.new_state.unwrap_or_else(|| old_state.clone())); - let changes_trie_root = header.digest().log(DigestItem::as_changes_trie_root).cloned(); - if let Some(changes_trie_root) = changes_trie_root { + let maybe_changes_trie_root = header.digest().log(DigestItem::as_changes_trie_root).cloned(); + if let Some(changes_trie_root) = maybe_changes_trie_root { if let Some(changes_trie_update) = operation.changes_trie_update { - let changes_trie_root: H::Out = changes_trie_root.into(); - self.changes_trie_storage.0.insert(header.number().as_(), changes_trie_root, changes_trie_update); + self.changes_trie_storage.0.insert( + *header.number(), + changes_trie_root, + changes_trie_update + ); } } @@ -668,7 +684,11 @@ where } fn revert(&self, _n: NumberFor) -> error::Result> { - Ok(As::sa(0)) + Ok(Zero::zero()) + } + + fn get_import_lock(&self) -> &Mutex<()> { + &self.import_lock } } @@ -693,22 +713,45 @@ where } /// Prunable in-memory changes trie storage. -pub struct ChangesTrieStorage(InMemoryChangesTrieStorage); -impl backend::PrunableStateChangesTrieStorage for ChangesTrieStorage { - fn oldest_changes_trie_block(&self, _config: &ChangesTrieConfiguration, _best_finalized: u64) -> u64 { - 0 +pub struct ChangesTrieStorage(InMemoryChangesTrieStorage>); +impl backend::PrunableStateChangesTrieStorage for ChangesTrieStorage { + fn oldest_changes_trie_block( + &self, + _config: &ChangesTrieConfiguration, + _best_finalized: NumberFor, + ) -> NumberFor { + Zero::zero() } } -impl state_machine::ChangesTrieRootsStorage for ChangesTrieStorage { - fn root(&self, anchor: &ChangesTrieAnchorBlockId, block: u64) -> Result, String> { - self.0.root(anchor, block) +impl state_machine::ChangesTrieRootsStorage> for ChangesTrieStorage + where + Block: BlockT, + H: Hasher, +{ + fn build_anchor( + &self, + _hash: H::Out, + ) -> Result>, String> { + Err("Dummy implementation".into()) + } + + fn root( + &self, + _anchor: &ChangesTrieAnchorBlockId>, + _block: NumberFor, + ) -> Result, String> { + Err("Dummy implementation".into()) } } -impl state_machine::ChangesTrieStorage for ChangesTrieStorage { - fn get(&self, key: &H::Out, prefix: &[u8]) -> Result, String> { - self.0.get(key, prefix) +impl state_machine::ChangesTrieStorage> for ChangesTrieStorage + where + Block: BlockT, + H: Hasher, +{ + fn get(&self, _key: &H::Out, _prefix: &[u8]) -> Result, String> { + Err("Dummy implementation".into()) } } diff --git a/core/client/src/leaves.rs b/core/client/src/leaves.rs index 144237f777ca8b066be3ba03882bc68bee0d8612..b0e49ead80d40e04bf829c8719fd0f40d3d11fa5 100644 --- a/core/client/src/leaves.rs +++ b/core/client/src/leaves.rs @@ -77,7 +77,7 @@ impl LeafSet where } /// Read the leaf list from the DB, using given prefix for keys. - pub fn read_from_db(db: &KeyValueDB, column: Option, prefix: &[u8]) -> error::Result { + pub fn read_from_db(db: &dyn KeyValueDB, column: Option, prefix: &[u8]) -> error::Result { let mut storage = BTreeMap::new(); for (key, value) in db.iter_from_prefix(column, prefix) { diff --git a/core/client/src/lib.rs b/core/client/src/lib.rs index fe33c56262b3ca2e7caaee62f147665594f76606..8062fae500199692810d2f79d401a3e1feeec663 100644 --- a/core/client/src/lib.rs +++ b/core/client/src/lib.rs @@ -59,12 +59,12 @@ pub use crate::client::{ new_in_mem, BlockBody, BlockStatus, ImportNotifications, FinalityNotifications, BlockchainEvents, BlockImportNotification, Client, ClientInfo, ExecutionStrategies, - LongestChain + LongestChain, }; #[cfg(feature = "std")] pub use crate::notifications::{StorageEventStream, StorageChangeSet}; #[cfg(feature = "std")] -pub use state_machine::ExecutionStrategy; +pub use state_machine::{ExecutionStrategy, NeverOffchainExt}; #[cfg(feature = "std")] pub use crate::leaves::LeafSet; diff --git a/core/client/src/light/backend.rs b/core/client/src/light/backend.rs index 52cdb6a626a11a872b039f8dfa4bf98d53da72cd..f71366808eccd146bb341ab69a6407806f714ada 100644 --- a/core/client/src/light/backend.rs +++ b/core/client/src/light/backend.rs @@ -20,13 +20,16 @@ use std::collections::HashMap; use std::sync::{Arc, Weak}; use futures::{Future, IntoFuture}; -use parking_lot::RwLock; +use parking_lot::{RwLock, Mutex}; use runtime_primitives::{generic::BlockId, Justification, StorageOverlay, ChildrenStorageOverlay}; use state_machine::{Backend as StateBackend, TrieBackend, backend::InMemory as InMemoryState}; use runtime_primitives::traits::{Block as BlockT, NumberFor, Zero, Header}; use crate::in_mem::{self, check_genesis_storage}; -use crate::backend::{AuxStore, Backend as ClientBackend, BlockImportOperation, RemoteBackend, NewBlockState}; +use crate::backend::{ + AuxStore, Backend as ClientBackend, BlockImportOperation, RemoteBackend, NewBlockState, + StorageCollection, ChildStorageCollection, +}; use crate::blockchain::HeaderBackend as BlockchainHeaderBackend; use crate::error::{Error as ClientError, Result as ClientResult}; use crate::light::blockchain::{Blockchain, Storage as BlockchainStorage}; @@ -38,13 +41,14 @@ use consensus::well_known_cache_keys; const IN_MEMORY_EXPECT_PROOF: &str = "InMemory state backend has Void error type and always suceeds; qed"; /// Light client backend. -pub struct Backend { +pub struct Backend { blockchain: Arc>, genesis_state: RwLock>>, + import_lock: Mutex<()>, } /// Light block (header and justification) import operation. -pub struct ImportOperation { +pub struct ImportOperation { header: Option, cache: HashMap>, leaf_state: NewBlockState, @@ -64,19 +68,20 @@ pub struct OnDemandState { } /// On-demand or in-memory genesis state. -pub enum OnDemandOrGenesisState { +pub enum OnDemandOrGenesisState { /// On-demand state - storage values are fetched from remote nodes. OnDemand(OnDemandState), /// Genesis state - storage values are stored in-memory. Genesis(InMemoryState), } -impl Backend { +impl Backend { /// Create new light backend. pub fn new(blockchain: Arc>) -> Self { Self { blockchain, genesis_state: RwLock::new(None), + import_lock: Default::default(), } } @@ -86,7 +91,7 @@ impl Backend { } } -impl AuxStore for Backend { +impl AuxStore for Backend { fn insert_aux< 'a, 'b: 'a, @@ -112,7 +117,7 @@ impl ClientBackend for Backend where type BlockImportOperation = ImportOperation; type Blockchain = Blockchain; type State = OnDemandOrGenesisState; - type ChangesTrieStorage = in_mem::ChangesTrieStorage; + type ChangesTrieStorage = in_mem::ChangesTrieStorage; fn begin_operation(&self) -> ClientResult { Ok(ImportOperation { @@ -213,6 +218,10 @@ impl ClientBackend for Backend where fn revert(&self, _n: NumberFor) -> ClientResult> { Err(ClientError::NotAvailableOnLightClient.into()) } + + fn get_import_lock(&self) -> &Mutex<()> { + &self.import_lock + } } impl RemoteBackend for Backend @@ -278,11 +287,20 @@ where // this is only called when genesis block is imported => shouldn't be performance bottleneck let mut storage: HashMap>, StorageOverlay> = HashMap::new(); storage.insert(None, top); + + // create a list of children keys to re-compute roots for + let child_delta = children.keys() + .cloned() + .map(|storage_key| (storage_key, None)) + .collect::>(); + + // make sure to persist the child storage for (child_key, child_storage) in children { storage.insert(Some(child_key), child_storage); } + let storage_update: InMemoryState = storage.into(); - let (storage_root, _) = storage_update.storage_root(::std::iter::empty()); + let (storage_root, _) = storage_update.full_storage_root(::std::iter::empty(), child_delta); self.storage_update = Some(storage_update); Ok(storage_root) @@ -295,7 +313,11 @@ where Ok(()) } - fn update_storage(&mut self, _update: Vec<(Vec, Option>)>) -> ClientResult<()> { + fn update_storage( + &mut self, + _update: StorageCollection, + _child_update: ChildStorageCollection, + ) -> ClientResult<()> { // we're not storing anything locally => ignore changes Ok(()) } @@ -373,12 +395,12 @@ where Vec::new() } - fn keys(&self, _prefix: &Vec) -> Vec> { + fn keys(&self, _prefix: &[u8]) -> Vec> { // whole state is not available on light node Vec::new() } - fn try_into_trie_backend(self) -> Option> { + fn as_trie_backend(&mut self) -> Option<&TrieBackend> { None } } @@ -465,7 +487,7 @@ where } } - fn keys(&self, prefix: &Vec) -> Vec> { + fn keys(&self, prefix: &[u8]) -> Vec> { match *self { OnDemandOrGenesisState::OnDemand(ref state) => StateBackend::::keys(state, prefix), @@ -473,10 +495,10 @@ where } } - fn try_into_trie_backend(self) -> Option> { + fn as_trie_backend(&mut self) -> Option<&TrieBackend> { match self { - OnDemandOrGenesisState::OnDemand(state) => state.try_into_trie_backend(), - OnDemandOrGenesisState::Genesis(state) => state.try_into_trie_backend(), + OnDemandOrGenesisState::OnDemand(ref mut state) => state.as_trie_backend(), + OnDemandOrGenesisState::Genesis(ref mut state) => state.as_trie_backend(), } } } diff --git a/core/client/src/light/blockchain.rs b/core/client/src/light/blockchain.rs index c38d50303ecc381378b25b797b79b5bd6377e5c8..e3d9c55a6a4633c0197debdd6ac9f93b2ee93ece 100644 --- a/core/client/src/light/blockchain.rs +++ b/core/client/src/light/blockchain.rs @@ -30,7 +30,7 @@ use crate::blockchain::{Backend as BlockchainBackend, BlockStatus, Cache as Bloc HeaderBackend as BlockchainHeaderBackend, Info as BlockchainInfo, ProvideCache}; use crate::cht; use crate::error::{Error as ClientError, Result as ClientResult}; -use crate::light::fetcher::{Fetcher, RemoteHeaderRequest}; +use crate::light::fetcher::{Fetcher, RemoteBodyRequest, RemoteHeaderRequest}; /// Light client blockchain storage. pub trait Storage: AuxStore + BlockchainHeaderBackend { @@ -56,13 +56,21 @@ pub trait Storage: AuxStore + BlockchainHeaderBackend { fn last_finalized(&self) -> ClientResult; /// Get headers CHT root for given block. Fails if the block is not pruned (not a part of any CHT). - fn header_cht_root(&self, cht_size: u64, block: NumberFor) -> ClientResult; + fn header_cht_root( + &self, + cht_size: NumberFor, + block: NumberFor, + ) -> ClientResult; /// Get changes trie CHT root for given block. Fails if the block is not pruned (not a part of any CHT). - fn changes_trie_cht_root(&self, cht_size: u64, block: NumberFor) -> ClientResult; + fn changes_trie_cht_root( + &self, + cht_size: NumberFor, + block: NumberFor, + ) -> ClientResult; /// Get storage cache. - fn cache(&self) -> Option>>; + fn cache(&self) -> Option>>; } /// Light client blockchain. @@ -116,7 +124,7 @@ impl BlockchainHeaderBackend for Blockchain where Bloc self.fetcher().upgrade().ok_or(ClientError::NotAvailableOnLightClient)? .remote_header(RemoteHeaderRequest { - cht_root: self.storage.header_cht_root(cht::SIZE, number)?, + cht_root: self.storage.header_cht_root(cht::size(), number)?, block: number, retry_count: None, }) @@ -126,7 +134,7 @@ impl BlockchainHeaderBackend for Blockchain where Bloc } } - fn info(&self) -> ClientResult> { + fn info(&self) -> BlockchainInfo { self.storage.info() } @@ -144,9 +152,19 @@ impl BlockchainHeaderBackend for Blockchain where Bloc } impl BlockchainBackend for Blockchain where Block: BlockT, S: Storage, F: Fetcher { - fn body(&self, _id: BlockId) -> ClientResult>> { - // TODO: #1445 fetch from remote node - Ok(None) + fn body(&self, id: BlockId) -> ClientResult>> { + let header = match self.header(id)? { + Some(header) => header, + None => return Ok(None), + }; + + self.fetcher().upgrade().ok_or(ClientError::NotAvailableOnLightClient)? + .remote_body(RemoteBodyRequest { + header, + retry_count: None, + }) + .into_future().wait() + .map(Some) } fn justification(&self, _id: BlockId) -> ClientResult> { @@ -157,7 +175,7 @@ impl BlockchainBackend for Blockchain where Block: Blo self.storage.last_finalized() } - fn cache(&self) -> Option>> { + fn cache(&self) -> Option>> { self.storage.cache() } @@ -171,7 +189,7 @@ impl BlockchainBackend for Blockchain where Block: Blo } impl, F, Block: BlockT> ProvideCache for Blockchain { - fn cache(&self) -> Option>> { + fn cache(&self) -> Option>> { self.storage.cache() } } @@ -205,8 +223,8 @@ pub mod tests { Err(ClientError::Backend("Test error".into())) } - fn info(&self) -> ClientResult> { - Err(ClientError::Backend("Test error".into())) + fn info(&self) -> Info { + panic!("Test error") } fn status(&self, _id: BlockId) -> ClientResult { @@ -285,7 +303,7 @@ pub mod tests { ).into()) } - fn cache(&self) -> Option>> { + fn cache(&self) -> Option>> { None } } diff --git a/core/client/src/light/call_executor.rs b/core/client/src/light/call_executor.rs index 8f90aaf54e4895cbabcccae5fd8870f1fc8132b9..4dba803921527d836f2a9acab7fbe7b40290dbc8 100644 --- a/core/client/src/light/call_executor.rs +++ b/core/client/src/light/call_executor.rs @@ -24,9 +24,9 @@ use std::{ use futures::{IntoFuture, Future}; use parity_codec::{Encode, Decode}; -use primitives::{H256, Blake2Hasher, convert_hash, NativeOrEncoded, OffchainExt}; +use primitives::{offchain, H256, Blake2Hasher, convert_hash, NativeOrEncoded}; use runtime_primitives::generic::BlockId; -use runtime_primitives::traits::{As, Block as BlockT, Header as HeaderT}; +use runtime_primitives::traits::{One, Block as BlockT, Header as HeaderT}; use state_machine::{ self, Backend as StateBackend, CodeExecutor, OverlayedChanges, ExecutionStrategy, create_proof_check_backend, @@ -87,7 +87,7 @@ where type Error = ClientError; fn call< - O: OffchainExt, + O: offchain::Externalities, >( &self, id: &BlockId, @@ -111,7 +111,7 @@ where fn contextual_call< 'a, - O: OffchainExt, + O: offchain::Externalities, IB: Fn() -> ClientResult<()>, EM: Fn( Result, Self::Error>, @@ -154,7 +154,7 @@ where } fn call_at_state< - O: OffchainExt, + O: offchain::Externalities, S: StateBackend, FF: FnOnce( Result, Self::Error>, @@ -230,7 +230,7 @@ impl CallExecutor for type Error = ClientError; fn call< - O: OffchainExt, + O: offchain::Externalities, >( &self, id: &BlockId, @@ -247,7 +247,7 @@ impl CallExecutor for fn contextual_call< 'a, - O: OffchainExt, + O: offchain::Externalities, IB: Fn() -> ClientResult<()>, EM: Fn( Result, Self::Error>, @@ -327,7 +327,7 @@ impl CallExecutor for } fn call_at_state< - O: OffchainExt, + O: offchain::Externalities, S: StateBackend, FF: FnOnce( Result, Self::Error>, @@ -388,7 +388,7 @@ impl CallExecutor for /// Method is executed using passed header as environment' current block. /// Proof includes both environment preparation proof and method execution proof. pub fn prove_execution( - state: S, + mut state: S, header: Block::Header, executor: &E, method: &str, @@ -399,13 +399,13 @@ pub fn prove_execution( S: StateBackend, E: CallExecutor, { - let trie_state = state.try_into_trie_backend() - .ok_or_else(|| Box::new(state_machine::ExecutionError::UnableToGenerateProof) as Box)?; + let trie_state = state.as_trie_backend() + .ok_or_else(|| Box::new(state_machine::ExecutionError::UnableToGenerateProof) as Box)?; // prepare execution environment + record preparation proof let mut changes = Default::default(); let (_, init_proof) = executor.prove_at_trie_state( - &trie_state, + trie_state, &mut changes, "Core_initialize_block", &header.encode(), @@ -435,7 +435,7 @@ pub fn check_execution_proof( Header: HeaderT, E: CodeExecutor, H: Hasher, - H::Out: Ord, + H::Out: Ord + 'static, { let local_state_root = request.header.state_root(); let root: H::Out = convert_hash(&local_state_root); @@ -444,11 +444,11 @@ pub fn check_execution_proof( let mut changes = OverlayedChanges::default(); let trie_backend = create_proof_check_backend(root, remote_proof)?; let next_block =
::new( - *request.header.number() + As::sa(1), + *request.header.number() + One::one(), Default::default(), Default::default(), request.header.hash(), - Default::default(), + request.header.digest().clone(), ); execution_proof_check_on_trie_backend::( &trie_backend, @@ -473,7 +473,7 @@ pub fn check_execution_proof( #[cfg(test)] mod tests { use consensus::BlockOrigin; - use test_client::{self, runtime::{Block, Header}, runtime::RuntimeApi, TestClient}; + use test_client::{self, runtime::Header, ClientExt, TestClient}; use executor::NativeExecutionDispatch; use crate::backend::{Backend, NewBlockState}; use crate::in_mem::Backend as InMemBackend; @@ -482,13 +482,6 @@ mod tests { #[test] fn execution_proof_is_generated_and_checked() { - type TestClient = test_client::client::Client< - test_client::Backend, - test_client::Executor, - Block, - RuntimeApi - >; - fn execute(remote_client: &TestClient, at: u64, method: &'static str) -> (Vec, Vec) { let remote_block_id = BlockId::Number(at); let remote_root = remote_client.state_at(&remote_block_id) @@ -525,7 +518,7 @@ mod tests { for _ in 1..3 { remote_client.import_justified( BlockOrigin::Own, - remote_client.new_block().unwrap().bake().unwrap(), + remote_client.new_block(Default::default()).unwrap().bake().unwrap(), Default::default(), ).unwrap(); } @@ -559,7 +552,25 @@ mod tests { let local_executor = RemoteCallExecutor::new(Arc::new(backend.blockchain().clone()), Arc::new(OkCallFetcher::new(vec![1]))); let remote_executor = RemoteCallExecutor::new(Arc::new(backend.blockchain().clone()), Arc::new(OkCallFetcher::new(vec![2]))); let remote_or_local = RemoteOrLocalCallExecutor::new(backend, remote_executor, local_executor); - assert_eq!(remote_or_local.call(&BlockId::Number(0), "test_method", &[], ExecutionStrategy::NativeElseWasm, NeverOffchainExt::new()).unwrap(), vec![1]); - assert_eq!(remote_or_local.call(&BlockId::Number(1), "test_method", &[], ExecutionStrategy::NativeElseWasm, NeverOffchainExt::new()).unwrap(), vec![2]); + assert_eq!( + remote_or_local.call( + &BlockId::Number(0), + "test_method", + &[], + ExecutionStrategy::NativeElseWasm, + NeverOffchainExt::new(), + ).unwrap(), + vec![1], + ); + assert_eq!( + remote_or_local.call( + &BlockId::Number(1), + "test_method", + &[], + ExecutionStrategy::NativeElseWasm, + NeverOffchainExt::new(), + ).unwrap(), + vec![2], + ); } } diff --git a/core/client/src/light/fetcher.rs b/core/client/src/light/fetcher.rs index 1e6f0842fb1c25e5cd3026d69aea33346fc65f72..c77ebcd0fdd3a8b96eed66a05f930ff862303513 100644 --- a/core/client/src/light/fetcher.rs +++ b/core/client/src/light/fetcher.rs @@ -22,8 +22,12 @@ use std::marker::PhantomData; use futures::IntoFuture; use hash_db::{HashDB, Hasher}; +use parity_codec::{Decode, Encode}; use primitives::{ChangesTrieConfiguration, convert_hash}; -use runtime_primitives::traits::{As, Block as BlockT, Header as HeaderT, NumberFor}; +use runtime_primitives::traits::{ + Block as BlockT, Header as HeaderT, Hash, HashFor, NumberFor, + SimpleArithmetic, CheckedConversion, +}; use state_machine::{CodeExecutor, ChangesTrieRootsStorage, ChangesTrieAnchorBlockId, TrieBackend, read_proof_check, key_changes_proof_check, create_proof_check_backend_storage, read_child_proof_check}; @@ -124,17 +128,28 @@ pub struct ChangesProof { pub roots_proof: Vec>, } +/// Remote block body request +#[derive(Clone, Default, Debug, PartialEq, Eq, Hash)] +pub struct RemoteBodyRequest { + /// Header of the requested block body + pub header: Header, + /// Number of times to retry request. None means that default RETRY_COUNT is used. + pub retry_count: Option, +} + /// Light client data fetcher. Implementations of this trait must check if remote data /// is correct (see FetchedDataChecker) and return already checked data. pub trait Fetcher: Send + Sync { /// Remote header future. - type RemoteHeaderResult: IntoFuture; + type RemoteHeaderResult: IntoFuture; /// Remote storage read future. - type RemoteReadResult: IntoFuture>, Error=ClientError>; + type RemoteReadResult: IntoFuture>, Error = ClientError>; /// Remote call result future. - type RemoteCallResult: IntoFuture, Error=ClientError>; + type RemoteCallResult: IntoFuture, Error = ClientError>; /// Remote changes result future. - type RemoteChangesResult: IntoFuture, u32)>, Error=ClientError>; + type RemoteChangesResult: IntoFuture, u32)>, Error = ClientError>; + /// Remote block body result future. + type RemoteBodyResult: IntoFuture, Error = ClientError>; /// Fetch remote header. fn remote_header(&self, request: RemoteHeaderRequest) -> Self::RemoteHeaderResult; @@ -153,6 +168,8 @@ pub trait Fetcher: Send + Sync { /// Fetch remote changes ((block number, extrinsic index)) where given key has been changed /// at a given blocks range. fn remote_changes(&self, request: RemoteChangesRequest) -> Self::RemoteChangesResult; + /// Fetch remote block body + fn remote_body(&self, request: RemoteBodyRequest) -> Self::RemoteBodyResult; } /// Light client remote data checker. @@ -191,6 +208,12 @@ pub trait FetchChecker: Send + Sync { request: &RemoteChangesRequest, proof: ChangesProof ) -> ClientResult, u32)>>; + /// Check remote body proof. + fn check_body_proof( + &self, + request: &RemoteBodyRequest, + body: Vec + ) -> ClientResult>; } /// Remote data checker. @@ -213,7 +236,7 @@ impl, F> LightDataChecker, remote_proof: ChangesProof, - cht_size: u64, + cht_size: NumberFor, ) -> ClientResult, u32)>> where H: Hasher, @@ -261,28 +284,27 @@ impl, F> LightDataChecker( + key_changes_proof_check::<_, H, _>( &request.changes_trie_config, &RootsStorage { roots: (request.tries_roots.0, &request.tries_roots.2), prev_roots: remote_roots, }, remote_proof, - request.first_block.0.as_(), + request.first_block.0, &ChangesTrieAnchorBlockId { hash: convert_hash(&request.last_block.1), - number: request.last_block.0.as_(), + number: request.last_block.0, }, - remote_max_block.as_(), + remote_max_block, &request.key) - .map(|pairs| pairs.into_iter().map(|(b, x)| (As::sa(b), x)).collect()) .map_err(|err| ClientError::ChangesTrieAccessFailed(err)) } /// Check CHT-based proof for changes tries roots. fn check_changes_tries_proof( &self, - cht_size: u64, + cht_size: NumberFor, remote_roots: &BTreeMap, B::Hash>, remote_roots_proof: Vec>, ) -> ClientResult<()> @@ -338,7 +360,7 @@ impl FetchChecker for LightDataChecker, H: Hasher, - H::Out: Ord, + H::Out: Ord + 'static, S: BlockchainStorage, F: Send + Sync, { @@ -394,30 +416,62 @@ impl FetchChecker for LightDataChecker, remote_proof: ChangesProof ) -> ClientResult, u32)>> { - self.check_changes_proof_with_cht_size(request, remote_proof, cht::SIZE) + self.check_changes_proof_with_cht_size(request, remote_proof, cht::size()) + } + + fn check_body_proof( + &self, + request: &RemoteBodyRequest, + body: Vec + ) -> ClientResult> { + + // TODO: #2621 + let extrinsics_root = HashFor::::ordered_trie_root(body.iter().map(Encode::encode)); + if *request.header.extrinsics_root() == extrinsics_root { + Ok(body) + } else { + Err(format!("RemoteBodyRequest: invalid extrinsics root expected: {} but got {}", + *request.header.extrinsics_root(), + extrinsics_root, + ).into()) + } + } } /// A view of BTreeMap as a changes trie roots storage. -struct RootsStorage<'a, Number: As, Hash: 'a> { +struct RootsStorage<'a, Number: SimpleArithmetic, Hash: 'a> { roots: (Number, &'a [Hash]), prev_roots: BTreeMap, } -impl<'a, H, Number, Hash> ChangesTrieRootsStorage for RootsStorage<'a, Number, Hash> +impl<'a, H, Number, Hash> ChangesTrieRootsStorage for RootsStorage<'a, Number, Hash> where H: Hasher, - Number: Send + Sync + Eq + ::std::cmp::Ord + Copy + As, + Number: ::std::fmt::Display + Clone + SimpleArithmetic + Encode + Decode + Send + Sync + 'static, Hash: 'a + Send + Sync + Clone + AsRef<[u8]>, { - fn root(&self, _anchor: &ChangesTrieAnchorBlockId, block: u64) -> Result, String> { + fn build_anchor( + &self, + _hash: H::Out, + ) -> Result, String> { + Err("build_anchor is only called when building block".into()) + } + + fn root( + &self, + _anchor: &ChangesTrieAnchorBlockId, + block: Number, + ) -> Result, String> { // we can't ask for roots from parallel forks here => ignore anchor - let root = if block < self.roots.0.as_() { - self.prev_roots.get(&As::sa(block)).cloned() + let root = if block < self.roots.0 { + self.prev_roots.get(&Number::unique_saturated_from(block)).cloned() } else { - block.checked_sub(self.roots.0.as_()) - .and_then(|index| self.roots.1.get(index as usize)) - .cloned() + let index: Option = block.checked_sub(&self.roots.0).and_then(|index| index.checked_into()); + match index { + Some(index) => self.roots.1.get(index as usize).cloned(), + None => None, + } }; Ok(root.map(|root| { @@ -437,8 +491,8 @@ pub mod tests { use executor::{self, NativeExecutionDispatch}; use crate::error::Error as ClientError; use test_client::{ - self, TestClient, blockchain::HeaderBackend, AccountKeyring, - runtime::{self, Hash, Block, Header} + self, ClientExt, blockchain::HeaderBackend, AccountKeyring, + runtime::{self, Hash, Block, Header, Extrinsic} }; use consensus::BlockOrigin; @@ -446,30 +500,38 @@ pub mod tests { use crate::light::fetcher::{Fetcher, FetchChecker, LightDataChecker, RemoteCallRequest, RemoteHeaderRequest}; use crate::light::blockchain::tests::{DummyStorage, DummyBlockchain}; - use primitives::{blake2_256, Blake2Hasher}; - use primitives::storage::{StorageKey, well_known_keys}; + use primitives::{blake2_256, Blake2Hasher, H256}; + use primitives::storage::{well_known_keys, StorageKey}; use runtime_primitives::generic::BlockId; use state_machine::Backend; use super::*; pub type OkCallFetcher = Mutex>; + fn not_implemented_in_tests() -> FutureResult + where + E: std::convert::From<&'static str>, + { + err("Not implemented on test node".into()) + } + impl Fetcher for OkCallFetcher { type RemoteHeaderResult = FutureResult; type RemoteReadResult = FutureResult>, ClientError>; type RemoteCallResult = FutureResult, ClientError>; type RemoteChangesResult = FutureResult, u32)>, ClientError>; + type RemoteBodyResult = FutureResult, ClientError>; fn remote_header(&self, _request: RemoteHeaderRequest
) -> Self::RemoteHeaderResult { - err("Not implemented on test node".into()) + not_implemented_in_tests() } fn remote_read(&self, _request: RemoteReadRequest
) -> Self::RemoteReadResult { - err("Not implemented on test node".into()) + not_implemented_in_tests() } fn remote_read_child(&self, _request: RemoteReadChildRequest
) -> Self::RemoteReadResult { - err("Not implemented on test node".into()) + not_implemented_in_tests() } fn remote_call(&self, _request: RemoteCallRequest
) -> Self::RemoteCallResult { @@ -477,11 +539,21 @@ pub mod tests { } fn remote_changes(&self, _request: RemoteChangesRequest
) -> Self::RemoteChangesResult { - err("Not implemented on test node".into()) + not_implemented_in_tests() + } + + fn remote_body(&self, _request: RemoteBodyRequest
) -> Self::RemoteBodyResult { + not_implemented_in_tests() } } - type TestChecker = LightDataChecker, Blake2Hasher, Block, DummyStorage, OkCallFetcher>; + type TestChecker = LightDataChecker< + executor::NativeExecutor, + Blake2Hasher, + Block, + DummyStorage, + OkCallFetcher, + >; fn prepare_for_read_proof_check() -> (TestChecker, Header, Vec>, u32) { // prepare remote client @@ -492,10 +564,10 @@ pub mod tests { remote_block_header.state_root = remote_client.state_at(&remote_block_id).unwrap().storage_root(::std::iter::empty()).0.into(); // 'fetch' read proof from remote node - let authorities_len = remote_client.storage(&remote_block_id, &StorageKey(well_known_keys::AUTHORITY_COUNT.to_vec())) + let heap_pages = remote_client.storage(&remote_block_id, &StorageKey(well_known_keys::HEAP_PAGES.to_vec())) .unwrap() .and_then(|v| Decode::decode(&mut &v.0[..])).unwrap(); - let remote_read_proof = remote_client.read_proof(&remote_block_id, well_known_keys::AUTHORITY_COUNT).unwrap(); + let remote_read_proof = remote_client.read_proof(&remote_block_id, well_known_keys::HEAP_PAGES).unwrap(); // check remote read proof locally let local_storage = InMemoryBlockchain::::new(); @@ -508,7 +580,7 @@ pub mod tests { ).unwrap(); let local_executor = test_client::LocalExecutor::new(None); let local_checker = LightDataChecker::new(Arc::new(DummyBlockchain::new(DummyStorage::new())), local_executor); - (local_checker, remote_block_header, remote_read_proof, authorities_len) + (local_checker, remote_block_header, remote_read_proof, heap_pages) } fn prepare_for_header_proof_check(insert_cht: bool) -> (TestChecker, Hash, Header, Vec>) { @@ -516,7 +588,7 @@ pub mod tests { let remote_client = test_client::new(); let mut local_headers_hashes = Vec::new(); for i in 0..4 { - let builder = remote_client.new_block().unwrap(); + let builder = remote_client.new_block(Default::default()).unwrap(); remote_client.import(BlockOrigin::Own, builder.bake().unwrap()).unwrap(); local_headers_hashes.push(remote_client.block_hash(i + 1) .map_err(|_| ClientError::Backend("TestError".into()))); @@ -537,21 +609,29 @@ pub mod tests { (local_checker, local_cht_root, remote_block_header, remote_header_proof) } + fn header_with_computed_extrinsics_root(extrinsics: Vec) -> Header { + let extrinsics_root = + trie::ordered_trie_root::(extrinsics.iter().map(Encode::encode)); + + // only care about `extrinsics_root` + Header::new(0, extrinsics_root, H256::zero(), H256::zero(), Default::default()) + } + #[test] fn storage_read_proof_is_generated_and_checked() { - let (local_checker, remote_block_header, remote_read_proof, authorities_len) = prepare_for_read_proof_check(); - assert_eq!((&local_checker as &FetchChecker).check_read_proof(&RemoteReadRequest::
{ + let (local_checker, remote_block_header, remote_read_proof, heap_pages) = prepare_for_read_proof_check(); + assert_eq!((&local_checker as &dyn FetchChecker).check_read_proof(&RemoteReadRequest::
{ block: remote_block_header.hash(), header: remote_block_header, - key: well_known_keys::AUTHORITY_COUNT.to_vec(), + key: well_known_keys::HEAP_PAGES.to_vec(), retry_count: None, - }, remote_read_proof).unwrap().unwrap()[0], authorities_len as u8); + }, remote_read_proof).unwrap().unwrap()[0], heap_pages as u8); } #[test] fn header_proof_is_generated_and_checked() { let (local_checker, local_cht_root, remote_block_header, remote_header_proof) = prepare_for_header_proof_check(true); - assert_eq!((&local_checker as &FetchChecker).check_header_proof(&RemoteHeaderRequest::
{ + assert_eq!((&local_checker as &dyn FetchChecker).check_header_proof(&RemoteHeaderRequest::
{ cht_root: local_cht_root, block: 1, retry_count: None, @@ -562,7 +642,7 @@ pub mod tests { fn check_header_proof_fails_if_cht_root_is_invalid() { let (local_checker, _, mut remote_block_header, remote_header_proof) = prepare_for_header_proof_check(true); remote_block_header.number = 100; - assert!((&local_checker as &FetchChecker).check_header_proof(&RemoteHeaderRequest::
{ + assert!((&local_checker as &dyn FetchChecker).check_header_proof(&RemoteHeaderRequest::
{ cht_root: Default::default(), block: 1, retry_count: None, @@ -573,7 +653,7 @@ pub mod tests { fn check_header_proof_fails_if_invalid_header_provided() { let (local_checker, local_cht_root, mut remote_block_header, remote_header_proof) = prepare_for_header_proof_check(true); remote_block_header.number = 100; - assert!((&local_checker as &FetchChecker).check_header_proof(&RemoteHeaderRequest::
{ + assert!((&local_checker as &dyn FetchChecker).check_header_proof(&RemoteHeaderRequest::
{ cht_root: local_cht_root, block: 1, retry_count: None, @@ -587,9 +667,9 @@ pub mod tests { Arc::new(DummyBlockchain::new(DummyStorage::new())), test_client::LocalExecutor::new(None) ); - let local_checker = &local_checker as &FetchChecker; - let max = remote_client.info().unwrap().chain.best_number; - let max_hash = remote_client.info().unwrap().chain.best_hash; + let local_checker = &local_checker as &dyn FetchChecker; + let max = remote_client.info().chain.best_number; + let max_hash = remote_client.info().chain.best_hash; for (index, (begin, end, key, expected_result)) in test_cases.into_iter().enumerate() { let begin_hash = remote_client.block_hash(begin).unwrap().unwrap(); @@ -683,9 +763,9 @@ pub mod tests { Arc::new(DummyBlockchain::new(DummyStorage::new())), test_client::LocalExecutor::new(None) ); - let local_checker = &local_checker as &FetchChecker; - let max = remote_client.info().unwrap().chain.best_number; - let max_hash = remote_client.info().unwrap().chain.best_hash; + let local_checker = &local_checker as &dyn FetchChecker; + let max = remote_client.info().chain.best_number; + let max_hash = remote_client.info().chain.best_hash; let (begin, end, key, _) = test_cases[0].clone(); let begin_hash = remote_client.block_hash(begin).unwrap().unwrap(); @@ -776,4 +856,47 @@ pub mod tests { ); assert!(local_checker.check_changes_tries_proof(4, &remote_proof.roots, vec![]).is_err()); } + + #[test] + fn check_body_proof_faulty() { + let header = header_with_computed_extrinsics_root( + vec![Extrinsic::IncludeData(vec![1, 2, 3, 4])] + ); + let block = Block::new(header.clone(), Vec::new()); + + let local_checker = TestChecker::new( + Arc::new(DummyBlockchain::new(DummyStorage::new())), + test_client::LocalExecutor::new(None) + ); + + let body_request = RemoteBodyRequest { + header: header.clone(), + retry_count: None, + }; + + assert!( + local_checker.check_body_proof(&body_request, block.extrinsics).is_err(), + "vec![1, 2, 3, 4] != vec![]" + ); + } + + #[test] + fn check_body_proof_of_same_data_should_succeed() { + let extrinsics = vec![Extrinsic::IncludeData(vec![1, 2, 3, 4, 5, 6, 7, 8, 255])]; + + let header = header_with_computed_extrinsics_root(extrinsics.clone()); + let block = Block::new(header.clone(), extrinsics); + + let local_checker = TestChecker::new( + Arc::new(DummyBlockchain::new(DummyStorage::new())), + test_client::LocalExecutor::new(None) + ); + + let body_request = RemoteBodyRequest { + header: header.clone(), + retry_count: None, + }; + + assert!(local_checker.check_body_proof(&body_request, block.extrinsics).is_ok()); + } } diff --git a/core/client/src/notifications.rs b/core/client/src/notifications.rs index 139238f3435e6e3a96a4a7c11dc3bef5adeaa043..931a40f20d37e39750e22366084ff321380b785d 100644 --- a/core/client/src/notifications.rs +++ b/core/client/src/notifications.rs @@ -30,18 +30,39 @@ use runtime_primitives::traits::Block as BlockT; #[derive(Debug)] pub struct StorageChangeSet { changes: Arc)>>, + child_changes: Arc)>)>>, filter: Option>, + child_filters: Option>>>, } impl StorageChangeSet { /// Convert the change set into iterator over storage items. - pub fn iter<'a>(&'a self) -> impl Iterator)> + 'a { - self.changes + pub fn iter<'a>(&'a self) + -> impl Iterator, &'a StorageKey, Option<&'a StorageData>)> + 'a { + let top = self.changes .iter() .filter(move |&(key, _)| match self.filter { Some(ref filter) => filter.contains(key), None => true, }) + .map(move |(k,v)| (None, k, v.as_ref())); + let children = self.child_changes + .iter() + .filter_map(move |(sk, changes)| { + if let Some(cf) = self.child_filters.as_ref() { + if let Some(filter) = cf.get(sk) { + Some(changes + .iter() + .filter(move |&(key, _)| match filter { + Some(ref filter) => filter.contains(key), + None => true, + }) + .map(move |(k,v)| (Some(sk), k, v.as_ref()))) + } else { None } + } else { None } + }) + .flatten(); + top.chain(children) } } @@ -56,9 +77,14 @@ pub struct StorageNotifications { next_id: SubscriberId, wildcard_listeners: FnvHashSet, listeners: HashMap>, + child_listeners: HashMap>, + FnvHashSet + )>, sinks: FnvHashMap, Option>, + Option>>>, )>, } @@ -68,6 +94,7 @@ impl Default for StorageNotifications { next_id: Default::default(), wildcard_listeners: Default::default(), listeners: Default::default(), + child_listeners: Default::default(), sinks: Default::default(), } } @@ -78,16 +105,24 @@ impl StorageNotifications { /// /// Note the changes are going to be filtered by listener's filter key. /// In fact no event might be sent if clients are not interested in the changes. - pub fn trigger(&mut self, hash: &Block::Hash, changeset: impl Iterator, Option>)>) { + pub fn trigger( + &mut self, + hash: &Block::Hash, + changeset: impl Iterator, Option>)>, + child_changeset: impl Iterator< + Item=(Vec, impl Iterator, Option>)>) + >, + ) { let has_wildcard = !self.wildcard_listeners.is_empty(); // early exit if no listeners - if !has_wildcard && self.listeners.is_empty() { + if !has_wildcard && self.listeners.is_empty() && self.child_listeners.is_empty() { return; } let mut subscribers = self.wildcard_listeners.clone(); let mut changes = Vec::new(); + let mut child_changes = Vec::new(); // Collect subscribers and changes for (k, v) in changeset { @@ -102,21 +137,47 @@ impl StorageNotifications { changes.push((k, v.map(StorageData))); } } + for (sk, changeset) in child_changeset { + let sk = StorageKey(sk); + if let Some((cl, cw)) = self.child_listeners.get(&sk) { + let mut changes = Vec::new(); + for (k, v) in changeset { + let k = StorageKey(k); + let listeners = cl.get(&k); + + if let Some(ref listeners) = listeners { + subscribers.extend(listeners.iter()); + } + + subscribers.extend(cw.iter()); + + if !cw.is_empty() || listeners.is_some() { + changes.push((k, v.map(StorageData))); + } + } + if !changes.is_empty() { + child_changes.push((sk, changes)); + } + } + } // Don't send empty notifications - if changes.is_empty() { + if changes.is_empty() && child_changes.is_empty() { return; } let changes = Arc::new(changes); + let child_changes = Arc::new(child_changes); // Trigger the events for subscriber in subscribers { let should_remove = { - let &(ref sink, ref filter) = self.sinks.get(&subscriber) + let &(ref sink, ref filter, ref child_filters) = self.sinks.get(&subscriber) .expect("subscribers returned from self.listeners are always in self.sinks; qed"); sink.unbounded_send((hash.clone(), StorageChangeSet { changes: changes.clone(), + child_changes: child_changes.clone(), filter: filter.clone(), + child_filters: child_filters.clone(), })).is_err() }; @@ -126,53 +187,120 @@ impl StorageNotifications { } } + fn remove_subscriber_from( + subscriber: &SubscriberId, + filters: &Option>, + listeners: &mut HashMap>, + wildcards: &mut FnvHashSet, + ){ + match filters { + None => { + wildcards.remove(subscriber); + }, + Some(filters) => { + + for key in filters.iter() { + let remove_key = match listeners.get_mut(key) { + Some(ref mut set) => { + set.remove(subscriber); + set.is_empty() + }, + None => false, + }; + + if remove_key { + listeners.remove(key); + } + } + } + } + } + fn remove_subscriber(&mut self, subscriber: SubscriberId) { - if let Some((_, filters)) = self.sinks.remove(&subscriber) { - match filters { - None => { - self.wildcard_listeners.remove(&subscriber); - }, - Some(filters) => { - for key in filters { - let remove_key = match self.listeners.get_mut(&key) { - Some(ref mut set) => { - set.remove(&subscriber); - set.is_empty() - }, - None => false, - }; - - if remove_key { - self.listeners.remove(&key); + if let Some((_, filters, child_filters)) = self.sinks.remove(&subscriber) { + Self::remove_subscriber_from( + &subscriber, + &filters, + &mut self.listeners, + &mut self.wildcard_listeners, + ); + if let Some(child_filters) = child_filters.as_ref() { + for (c_key, filters) in child_filters { + + if let Some((listeners, wildcards)) = self.child_listeners.get_mut(&c_key) { + Self::remove_subscriber_from( + &subscriber, + &filters, + &mut *listeners, + &mut *wildcards, + ); + + if listeners.is_empty() && wildcards.is_empty() { + self.child_listeners.remove(&c_key); } } - }, + } } } } - /// Start listening for particular storage keys. - pub fn listen(&mut self, filter_keys: Option<&[StorageKey]>) -> StorageEventStream { - self.next_id += 1; - - // add subscriber for every key - let keys = match filter_keys { + fn listen_from( + current_id: SubscriberId, + filter_keys: &Option>, + listeners: &mut HashMap>, + wildcards: &mut FnvHashSet, + ) -> Option> + { + match filter_keys { None => { - self.wildcard_listeners.insert(self.next_id); + wildcards.insert(current_id); None }, - Some(keys) => Some(keys.iter().map(|key| { - self.listeners + Some(keys) => Some(keys.as_ref().iter().map(|key| { + listeners .entry(key.clone()) .or_insert_with(Default::default) - .insert(self.next_id); + .insert(current_id); key.clone() }).collect()) - }; + } + } + + /// Start listening for particular storage keys. + pub fn listen( + &mut self, + filter_keys: Option<&[StorageKey]>, + filter_child_keys: Option<&[(StorageKey, Option>)]>, + ) -> StorageEventStream { + self.next_id += 1; + let current_id = self.next_id; + + // add subscriber for every key + let keys = Self::listen_from( + current_id, + &filter_keys, + &mut self.listeners, + &mut self.wildcard_listeners, + ); + let child_keys = filter_child_keys.map(|filter_child_keys| { + filter_child_keys.iter().map(|(c_key, o_keys)| { + let (c_listeners, c_wildcards) = self.child_listeners + .entry(c_key.clone()) + .or_insert_with(Default::default); + + (c_key.clone(), Self::listen_from( + current_id, + o_keys, + &mut *c_listeners, + &mut *c_wildcards, + )) + }).collect() + }); + // insert sink let (tx, rx) = mpsc::unbounded(); - self.sinks.insert(self.next_id, (tx, keys)); + self.sinks.insert(current_id, (tx, keys, child_keys)); rx } } @@ -182,13 +310,26 @@ mod tests { use runtime_primitives::testing::{H256 as Hash, Block as RawBlock, ExtrinsicWrapper}; use super::*; use futures::Stream; + use std::iter::{empty, Empty}; + + type TestChangeSet = ( + Vec<(StorageKey, Option)>, + Vec<(StorageKey, Vec<(StorageKey, Option)>)>, + ); #[cfg(test)] - impl From)>> for StorageChangeSet { - fn from(changes: Vec<(StorageKey, Option)>) -> Self { + impl From for StorageChangeSet { + fn from(changes: TestChangeSet) -> Self { + // warning hardcoded child trie wildcard to test upon + let child_filters = Some([ + (StorageKey(vec![4]), None), + (StorageKey(vec![5]), None), + ].into_iter().cloned().collect()); StorageChangeSet { - changes: Arc::new(changes), + changes: Arc::new(changes.0), + child_changes: Arc::new(changes.1), filter: None, + child_filters, } } } @@ -206,43 +347,73 @@ mod tests { fn triggering_change_should_notify_wildcard_listeners() { // given let mut notifications = StorageNotifications::::default(); - let mut recv = notifications.listen(None).wait(); + let child_filter = [(StorageKey(vec![4]), None)]; + let mut recv = notifications.listen(None, Some(&child_filter[..])).wait(); // when let changeset = vec![ (vec![2], Some(vec![3])), (vec![3], None), ]; - notifications.trigger(&Hash::from_low_u64_be(1), changeset.into_iter()); + let c_changeset_1 = vec![ + (vec![5], Some(vec![4])), + (vec![6], None), + ]; + let c_changeset = vec![(vec![4], c_changeset_1)]; + notifications.trigger( + &Hash::from_low_u64_be(1), + changeset.into_iter(), + c_changeset.into_iter().map(|(a,b)| (a, b.into_iter())), + ); // then - assert_eq!(recv.next().unwrap(), Ok((Hash::from_low_u64_be(1), vec![ + assert_eq!(recv.next().unwrap(), Ok((Hash::from_low_u64_be(1), (vec![ (StorageKey(vec![2]), Some(StorageData(vec![3]))), (StorageKey(vec![3]), None), - ].into()))); + ], vec![(StorageKey(vec![4]), vec![ + (StorageKey(vec![5]), Some(StorageData(vec![4]))), + (StorageKey(vec![6]), None), + ])]).into()))); } #[test] fn should_only_notify_interested_listeners() { // given let mut notifications = StorageNotifications::::default(); - let mut recv1 = notifications.listen(Some(&[StorageKey(vec![1])])).wait(); - let mut recv2 = notifications.listen(Some(&[StorageKey(vec![2])])).wait(); + let child_filter = [(StorageKey(vec![4]), Some(vec![StorageKey(vec![5])]))]; + let mut recv1 = notifications.listen(Some(&[StorageKey(vec![1])]), None).wait(); + let mut recv2 = notifications.listen(Some(&[StorageKey(vec![2])]), None).wait(); + let mut recv3 = notifications.listen(Some(&[]), Some(&child_filter)).wait(); // when let changeset = vec![ (vec![2], Some(vec![3])), (vec![1], None), ]; - notifications.trigger(&Hash::from_low_u64_be(1), changeset.into_iter()); + let c_changeset_1 = vec![ + (vec![5], Some(vec![4])), + (vec![6], None), + ]; + + let c_changeset = vec![(vec![4], c_changeset_1)]; + notifications.trigger( + &Hash::from_low_u64_be(1), + changeset.into_iter(), + c_changeset.into_iter().map(|(a,b)| (a, b.into_iter())), + ); // then - assert_eq!(recv1.next().unwrap(), Ok((Hash::from_low_u64_be(1), vec![ + assert_eq!(recv1.next().unwrap(), Ok((Hash::from_low_u64_be(1), (vec![ (StorageKey(vec![1]), None), - ].into()))); - assert_eq!(recv2.next().unwrap(), Ok((Hash::from_low_u64_be(1), vec![ + ], vec![]).into()))); + assert_eq!(recv2.next().unwrap(), Ok((Hash::from_low_u64_be(1), (vec![ (StorageKey(vec![2]), Some(StorageData(vec![3]))), - ].into()))); + ], vec![]).into()))); + assert_eq!(recv3.next().unwrap(), Ok((Hash::from_low_u64_be(1), (vec![], + vec![ + (StorageKey(vec![4]), vec![(StorageKey(vec![5]), Some(StorageData(vec![4])))]), + ]).into()))); + } #[test] @@ -250,11 +421,14 @@ mod tests { // given let mut notifications = StorageNotifications::::default(); { - let _recv1 = notifications.listen(Some(&[StorageKey(vec![1])])).wait(); - let _recv2 = notifications.listen(Some(&[StorageKey(vec![2])])).wait(); - let _recv3 = notifications.listen(None).wait(); + let child_filter = [(StorageKey(vec![4]), Some(vec![StorageKey(vec![5])]))]; + let _recv1 = notifications.listen(Some(&[StorageKey(vec![1])]), None).wait(); + let _recv2 = notifications.listen(Some(&[StorageKey(vec![2])]), None).wait(); + let _recv3 = notifications.listen(None, None).wait(); + let _recv4 = notifications.listen(None, Some(&child_filter)).wait(); assert_eq!(notifications.listeners.len(), 2); - assert_eq!(notifications.wildcard_listeners.len(), 1); + assert_eq!(notifications.wildcard_listeners.len(), 2); + assert_eq!(notifications.child_listeners.len(), 1); } // when @@ -262,11 +436,13 @@ mod tests { (vec![2], Some(vec![3])), (vec![1], None), ]; - notifications.trigger(&Hash::from_low_u64_be(1), changeset.into_iter()); + let c_changeset = empty::<(_, Empty<_>)>(); + notifications.trigger(&Hash::from_low_u64_be(1), changeset.into_iter(), c_changeset); // then assert_eq!(notifications.listeners.len(), 0); assert_eq!(notifications.wildcard_listeners.len(), 0); + assert_eq!(notifications.child_listeners.len(), 0); } #[test] @@ -274,11 +450,12 @@ mod tests { // given let mut recv = { let mut notifications = StorageNotifications::::default(); - let recv = notifications.listen(None).wait(); + let recv = notifications.listen(None, None).wait(); // when let changeset = vec![]; - notifications.trigger(&Hash::from_low_u64_be(1), changeset.into_iter()); + let c_changeset = empty::<(_, Empty<_>)>(); + notifications.trigger(&Hash::from_low_u64_be(1), changeset.into_iter(), c_changeset); recv }; diff --git a/core/client/src/runtime_api.rs b/core/client/src/runtime_api.rs index f5c8a59a903c4565097735d987080b458ed1c5c2..d14907f162bbfbc73267e1c6baf91b40c8fd41c2 100644 --- a/core/client/src/runtime_api.rs +++ b/core/client/src/runtime_api.rs @@ -25,13 +25,13 @@ pub use primitives::NativeOrEncoded; #[doc(hidden)] pub use runtime_primitives::{ traits::{ - AuthorityIdFor, Block as BlockT, GetNodeBlockType, GetRuntimeBlockType, + Block as BlockT, GetNodeBlockType, GetRuntimeBlockType, Header as HeaderT, ApiRef, RuntimeApiInfo, Hash as HashT, }, generic::BlockId, transaction_validity::TransactionValidity, }; #[doc(hidden)] -pub use primitives::{ExecutionContext, OffchainExt}; +pub use primitives::{offchain, ExecutionContext}; #[doc(hidden)] pub use runtime_version::{ApiId, RuntimeVersion, ApisVec, create_apis_vec}; #[doc(hidden)] @@ -46,7 +46,6 @@ use sr_api_macros::decl_runtime_apis; use primitives::OpaqueMetadata; #[cfg(feature = "std")] use std::{panic::UnwindSafe, cell::RefCell, rc::Rc}; -use rstd::vec::Vec; #[cfg(feature = "std")] use primitives::Hasher as HasherT; @@ -171,9 +170,6 @@ decl_runtime_apis! { #[skip_initialize_block] #[initialize_block] fn initialize_block(header: &::Header); - /// Returns the authorities. - #[deprecated(since = "1.0", note = "Please switch to `AuthoritiesApi`.")] - fn authorities() -> Vec>; } /// The `Metadata` api trait that returns metadata for the runtime. diff --git a/core/consensus/aura/Cargo.toml b/core/consensus/aura/Cargo.toml index a0e43b8bbc80e4d1ab98d2bba4f4fc65aaa08312..400f209a9b7c36b712c7bf5bc72659074ca84763 100644 --- a/core/consensus/aura/Cargo.toml +++ b/core/consensus/aura/Cargo.toml @@ -14,23 +14,21 @@ runtime_io = { package = "sr-io", path = "../../sr-io" } slots = { package = "substrate-consensus-slots", path = "../slots" } aura_primitives = { package = "substrate-consensus-aura-primitives", path = "primitives" } inherents = { package = "substrate-inherents", path = "../../inherents" } -srml-consensus = { path = "../../../srml/consensus" } srml-aura = { path = "../../../srml/aura" } client = { package = "substrate-client", path = "../../client" } substrate-telemetry = { path = "../../telemetry" } -futures = "0.1.17" -tokio = "0.1.7" -parking_lot = "0.7.1" -error-chain = "0.12" -log = "0.4" consensus_common = { package = "substrate-consensus-common", path = "../common" } -authorities = { package = "substrate-consensus-authorities", path = "../authorities" } runtime_primitives = { package = "sr-primitives", path = "../../sr-primitives" } +futures = "0.1.17" +tokio-timer = "0.2.11" +parking_lot = "0.8.0" +log = "0.4" [dev-dependencies] keyring = { package = "substrate-keyring", path = "../../keyring" } substrate-executor = { path = "../../executor" } network = { package = "substrate-network", path = "../../network", features = ["test-helpers"]} service = { package = "substrate-service", path = "../../service" } -test_client = { package = "substrate-test-client", path = "../../test-client" } +test-client = { package = "substrate-test-runtime-client", path = "../../test-runtime/client" } +tokio = "0.1.7" env_logger = "0.6" diff --git a/core/consensus/aura/primitives/Cargo.toml b/core/consensus/aura/primitives/Cargo.toml index a5e24e6fbee827c2a6b774ab4f5106fc86c2d972..74f678a6c0bc9f64ebf8100b7b2462e64408c7fd 100644 --- a/core/consensus/aura/primitives/Cargo.toml +++ b/core/consensus/aura/primitives/Cargo.toml @@ -6,12 +6,18 @@ description = "Primitives for Aura consensus" edition = "2018" [dependencies] +parity-codec = { version = "3.5", default-features = false } substrate-client = { path = "../../../client", default-features = false } +substrate-primitives = { path = "../../../primitives", default-features = false } +rstd = { package = "sr-std", path = "../../../sr-std", default-features = false } runtime_primitives = { package = "sr-primitives", path = "../../../sr-primitives", default-features = false } [features] default = ["std"] std = [ + "rstd/std", + "parity-codec/std", "runtime_primitives/std", "substrate-client/std", + "substrate-primitives/std", ] diff --git a/core/consensus/aura/primitives/src/lib.rs b/core/consensus/aura/primitives/src/lib.rs index 47b6ec7c1417058583eaa6d1f2a93ff42a1569bf..9bdf39d29337d5d4e2ae0766a34216821f77626c 100644 --- a/core/consensus/aura/primitives/src/lib.rs +++ b/core/consensus/aura/primitives/src/lib.rs @@ -18,20 +18,32 @@ #![cfg_attr(not(feature = "std"), no_std)] +use parity_codec::{Encode, Decode, Codec}; use substrate_client::decl_runtime_apis; +use rstd::vec::Vec; use runtime_primitives::ConsensusEngineId; /// The `ConsensusEngineId` of AuRa. pub const AURA_ENGINE_ID: ConsensusEngineId = [b'a', b'u', b'r', b'a']; +/// An consensus log item for Aura. +#[derive(Decode, Encode)] +pub enum ConsensusLog { + /// The authorities have changed. + AuthoritiesChange(Vec), +} + decl_runtime_apis! { /// API necessary for block authorship with aura. - pub trait AuraApi { + pub trait AuraApi { /// Return the slot duration in seconds for Aura. /// Currently, only the value provided by this type at genesis /// will be used. /// /// Dynamic slot duration may be supported in the future. fn slot_duration() -> u64; + + // Return the current set of authorities. + fn authorities() -> Vec; } } diff --git a/core/consensus/aura/src/digest.rs b/core/consensus/aura/src/digest.rs new file mode 100644 index 0000000000000000000000000000000000000000..1fe79324f4e504915412cc96e6b7e95b632eb23a --- /dev/null +++ b/core/consensus/aura/src/digest.rs @@ -0,0 +1,65 @@ +// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +//! Aura (Authority-Round) digests +//! +//! This implements the digests for AuRa, to allow the private +//! `CompatibleDigestItem` trait to appear in public interfaces. + +use primitives::Pair; +use aura_primitives::AURA_ENGINE_ID; +use runtime_primitives::generic::{DigestItem, OpaqueDigestItemId}; +use parity_codec::{Encode, Codec}; +use std::fmt::Debug; + +type Signature

=

::Signature; + +/// A digest item which is usable with aura consensus. +pub trait CompatibleDigestItem: Sized { + /// Construct a digest item which contains a signature on the hash. + fn aura_seal(signature: Signature

) -> Self; + + /// If this item is an Aura seal, return the signature. + fn as_aura_seal(&self) -> Option>; + + /// Construct a digest item which contains the slot number + fn aura_pre_digest(slot_num: u64) -> Self; + + /// If this item is an AuRa pre-digest, return the slot number + fn as_aura_pre_digest(&self) -> Option; +} + +impl CompatibleDigestItem

for DigestItem where + P: Pair, + Signature

: Codec, + Hash: Debug + Send + Sync + Eq + Clone + Codec + 'static +{ + fn aura_seal(signature: Signature

) -> Self { + DigestItem::Seal(AURA_ENGINE_ID, signature.encode()) + } + + fn as_aura_seal(&self) -> Option> { + self.try_to(OpaqueDigestItemId::Seal(&AURA_ENGINE_ID)) + } + + fn aura_pre_digest(slot_num: u64) -> Self { + DigestItem::PreRuntime(AURA_ENGINE_ID, slot_num.encode()) + } + + fn as_aura_pre_digest(&self) -> Option { + self.try_to(OpaqueDigestItemId::PreRuntime(&AURA_ENGINE_ID)) + } +} diff --git a/core/consensus/aura/src/lib.rs b/core/consensus/aura/src/lib.rs index d5123feb4f17eb8ac6bc974bede2e2fb32a0a1bb..c85e273a42b34b3203ec39a27d2568419dfb2562 100644 --- a/core/consensus/aura/src/lib.rs +++ b/core/consensus/aura/src/lib.rs @@ -25,34 +25,37 @@ //! //! Blocks from future steps will be either deferred or rejected depending on how //! far in the future they are. +//! +//! NOTE: Aura itself is designed to be generic over the crypto used. #![forbid(missing_docs, unsafe_code)] use std::{sync::Arc, time::Duration, thread, marker::PhantomData, hash::Hash, fmt::Debug}; -use parity_codec::{Encode, Decode}; -use consensus_common::{self, Authorities, BlockImport, Environment, Proposer, +use parity_codec::{Encode, Decode, Codec}; +use consensus_common::{self, BlockImport, Environment, Proposer, ForkChoiceStrategy, ImportBlock, BlockOrigin, Error as ConsensusError, - SelectChain, well_known_cache_keys + SelectChain, well_known_cache_keys::{self, Id as CacheKeyId} +}; +use consensus_common::import_queue::{ + Verifier, BasicQueue, SharedBlockImport, SharedJustificationImport, SharedFinalityProofImport, + SharedFinalityProofRequestBuilder, }; -use consensus_common::import_queue::{Verifier, BasicQueue, SharedBlockImport, SharedJustificationImport}; use client::{ block_builder::api::BlockBuilder as BlockBuilderApi, blockchain::ProvideCache, - runtime_api::{ApiExt, Core as CoreApi}, + runtime_api::ApiExt, error::Result as CResult, backend::AuxStore, }; -use aura_primitives::AURA_ENGINE_ID; -use runtime_primitives::{generic, generic::BlockId, Justification}; -use runtime_primitives::traits::{ - Block, Header, Digest, DigestItemFor, DigestItem, ProvideRuntimeApi, AuthorityIdFor, -}; + +use runtime_primitives::{generic::{self, BlockId, OpaqueDigestItemId}, Justification}; +use runtime_primitives::traits::{Block, Header, DigestItemFor, ProvideRuntimeApi, Zero, Member}; + use primitives::Pair; -use inherents::{InherentDataProviders, InherentData, RuntimeString}; -use authorities::AuthoritiesApi; +use inherents::{InherentDataProviders, InherentData}; -use futures::{Future, IntoFuture, future, stream::Stream}; -use tokio::timer::Timeout; -use log::{warn, debug, info, trace}; +use futures::{Future, IntoFuture, future}; +use tokio_timer::Timeout; +use log::{error, warn, debug, info, trace}; use srml_aura::{ InherentType as AuraInherent, AuraInherentData, @@ -60,29 +63,16 @@ use srml_aura::{ }; use substrate_telemetry::{telemetry, CONSENSUS_TRACE, CONSENSUS_DEBUG, CONSENSUS_WARN, CONSENSUS_INFO}; -use slots::{CheckedHeader, SlotWorker, SlotInfo, SlotCompatible, slot_now}; +use slots::{CheckedHeader, SlotData, SlotWorker, SlotInfo, SlotCompatible}; +use slots::{SignedDuration, check_equivocation}; pub use aura_primitives::*; -pub use consensus_common::{SyncOracle, ExtraVerification}; +pub use consensus_common::SyncOracle; +pub use digest::CompatibleDigestItem; -type AuthorityId

=

::Public; -type Signature

=

::Signature; +mod digest; -/// A handle to the network. This is generally implemented by providing some -/// handle to a gossip service or similar. -/// -/// Intended to be a lightweight handle such as an `Arc`. -#[deprecated( - since = "1.0.1", - note = "This is dead code and will be removed in a future release", -)] -pub trait Network: Clone { - /// A stream of input messages for a topic. - type In: Stream,Error=()>; - - /// Send a message at a specific round out. - fn send_message(&self, slot: u64, message: Vec); -} +type AuthorityId

=

::Public; /// A slot duration. Create with `get_or_compute`. #[derive(Clone, Copy, Debug, Encode, Decode, Hash, PartialOrd, Ord, PartialEq, Eq)] @@ -91,9 +81,12 @@ pub struct SlotDuration(slots::SlotDuration); impl SlotDuration { /// Either fetch the slot duration from disk or compute it from the genesis /// state. - pub fn get_or_compute(client: &C) -> CResult + pub fn get_or_compute(client: &C) -> CResult where - C: AuxStore, C: ProvideRuntimeApi, C::Api: AuraApi, + A: Codec, + B: Block, + C: AuxStore + ProvideRuntimeApi, + C::Api: AuraApi, { slots::SlotDuration::get_or_compute(client, |a, b| a.slot_duration(b)).map(Self) } @@ -119,52 +112,6 @@ fn slot_author(slot_num: u64, authorities: &[AuthorityId

]) -> Option Some(current_author) } -fn inherent_to_common_error(err: RuntimeString) -> consensus_common::Error { - consensus_common::ErrorKind::InherentData(err.into()).into() -} - -/// A digest item which is usable with aura consensus. -pub trait CompatibleDigestItem: Sized { - /// Construct a digest item which contains a slot number and a signature on the - /// hash. - fn aura_seal(slot_num: u64, signature: Signature) -> Self; - - /// If this item is an Aura seal, return the slot number and signature. - fn as_aura_seal(&self) -> Option<(u64, Signature)>; - - /// Return `true` if this seal type is deprecated. Otherwise, return - /// `false`. - fn is_deprecated(&self) -> bool; -} - -impl CompatibleDigestItem

for generic::DigestItem - where P: Pair, P::Signature: Clone + Encode + Decode, -{ - /// Construct a digest item which is a slot number and a signature on the - /// hash. - fn aura_seal(slot_number: u64, signature: Signature

) -> Self { - generic::DigestItem::Consensus(AURA_ENGINE_ID, (slot_number, signature).encode()) - } - - /// If this item is an Aura seal, return the slot number and signature. - #[allow(deprecated)] - fn as_aura_seal(&self) -> Option<(u64, Signature

)> { - match self { - generic::DigestItem::Seal(slot, ref sig) => Some((*slot, (*sig).clone())), - generic::DigestItem::Consensus(AURA_ENGINE_ID, seal) => Decode::decode(&mut &seal[..]), - _ => None, - } - } - - #[allow(deprecated)] - fn is_deprecated(&self) -> bool { - match self { - generic::DigestItem::Seal(_, _) => true, - _ => false, - } - } -} - #[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)] struct AuraSlotCompatible; @@ -174,64 +121,13 @@ impl SlotCompatible for AuraSlotCompatible { ) -> Result<(TimestampInherent, AuraInherent), consensus_common::Error> { data.timestamp_inherent_data() .and_then(|t| data.aura_inherent_data().map(|a| (t, a))) - .map_err(inherent_to_common_error) + .map_err(Into::into) + .map_err(consensus_common::Error::InherentData) } } -/// Start the aura worker in a separate thread. -#[deprecated(since = "1.1", note = "Please spawn a thread manually")] -pub fn start_aura_thread( - slot_duration: SlotDuration, - local_key: Arc

, - client: Arc, - select_chain: SC, - block_import: Arc, - env: Arc, - sync_oracle: SO, - on_exit: OnExit, - inherent_data_providers: InherentDataProviders, - force_authoring: bool, -) -> Result<(), consensus_common::Error> where - B: Block + 'static, - C: ProvideRuntimeApi + ProvideCache + Send + Sync + 'static, - C::Api: AuthoritiesApi, - SC: SelectChain + Clone + 'static, - E: Environment + Send + Sync + 'static, - E::Proposer: Proposer + Send + 'static, - <>::Create as IntoFuture>::Future: Send + 'static, - I: BlockImport + Send + Sync + 'static, - Error: From + 'static, - P: Pair + Send + Sync + 'static, - P::Public: Encode + Decode + Eq + Clone + Debug + Hash + Send + Sync + 'static, - P::Signature: Encode, - SO: SyncOracle + Send + Sync + Clone + 'static, - OnExit: Future + Send + 'static, - DigestItemFor: CompatibleDigestItem

+ DigestItem> + 'static, - Error: ::std::error::Error + Send + From<::consensus_common::Error> + 'static, -{ - let worker = AuraWorker { - client: client.clone(), - block_import, - env, - local_key, - inherent_data_providers: inherent_data_providers.clone(), - sync_oracle: sync_oracle.clone(), - force_authoring, - }; - - #[allow(deprecated)] // The function we are in is also deprecated. - slots::start_slot_worker_thread::<_, _, _, _, AuraSlotCompatible, u64, _>( - slot_duration.0, - select_chain, - Arc::new(worker), - sync_oracle, - on_exit, - inherent_data_providers - ) -} - /// Start the aura worker. The returned future should be run in a tokio runtime. -pub fn start_aura( +pub fn start_aura( slot_duration: SlotDuration, local_key: Arc

, client: Arc, @@ -239,43 +135,43 @@ pub fn start_aura( block_import: Arc, env: Arc, sync_oracle: SO, - on_exit: OnExit, inherent_data_providers: InherentDataProviders, force_authoring: bool, ) -> Result, consensus_common::Error> where - B: Block, - C: ProvideRuntimeApi + ProvideCache, - C::Api: AuthoritiesApi, - SC: SelectChain + Clone, - E: Environment, + B: Block, + C: ProvideRuntimeApi + ProvideCache + AuxStore + Send + Sync, + C::Api: AuraApi>, + SC: SelectChain, E::Proposer: Proposer, <>::Create as IntoFuture>::Future: Send + 'static, - I: BlockImport + Send + Sync + 'static, P: Pair + Send + Sync + 'static, - P::Public: Hash + Eq + Send + Sync + Clone + Debug + Encode + Decode + 'static, - P::Signature: Encode, - SO: SyncOracle + Send + Sync + Clone, - DigestItemFor: CompatibleDigestItem

+ DigestItem>, + P::Public: Hash + Member + Encode + Decode, + P::Signature: Hash + Member + Encode + Decode, + H: Header, + E: Environment, + I: BlockImport + Send + Sync + 'static, Error: ::std::error::Error + Send + From<::consensus_common::Error> + From + 'static, - OnExit: Future, + SO: SyncOracle + Send + Sync + Clone, { let worker = AuraWorker { client: client.clone(), block_import, env, local_key, - inherent_data_providers: inherent_data_providers.clone(), sync_oracle: sync_oracle.clone(), force_authoring, }; - slots::start_slot_worker::<_, _, _, _, _, AuraSlotCompatible, _>( + register_aura_inherent_data_provider( + &inherent_data_providers, + slot_duration.0.slot_duration() + )?; + Ok(slots::start_slot_worker::<_, _, _, _, _, AuraSlotCompatible>( slot_duration.0, select_chain, - Arc::new(worker), + worker, sync_oracle, - on_exit, inherent_data_providers - ) + )) } struct AuraWorker { @@ -284,32 +180,25 @@ struct AuraWorker { env: Arc, local_key: Arc

, sync_oracle: SO, - inherent_data_providers: InherentDataProviders, force_authoring: bool, } -impl SlotWorker for AuraWorker where - C: ProvideRuntimeApi + ProvideCache, - C::Api: AuthoritiesApi, +impl SlotWorker for AuraWorker where + B: Block, + C: ProvideRuntimeApi + ProvideCache + Sync, + C::Api: AuraApi>, E: Environment, E::Proposer: Proposer, <>::Create as IntoFuture>::Future: Send + 'static, + H: Header, I: BlockImport + Send + Sync + 'static, P: Pair + Send + Sync + 'static, - P::Public: Hash + Eq + Send + Sync + Clone + Debug + Encode + Decode + 'static, - P::Signature: Encode, + P::Public: Member + Encode + Decode + Hash, + P::Signature: Member + Encode + Decode + Hash + Debug, SO: SyncOracle + Send + Clone, - DigestItemFor: CompatibleDigestItem

+ DigestItem>, Error: ::std::error::Error + Send + From<::consensus_common::Error> + From + 'static, { - type OnSlot = Box + Send>; - - fn on_start( - &self, - slot_duration: u64 - ) -> Result<(), consensus_common::Error> { - register_aura_inherent_data_provider(&self.inherent_data_providers, slot_duration) - } + type OnSlot = Box + Send>; fn on_slot( &self, @@ -361,7 +250,7 @@ impl SlotWorker for AuraWorker p, Err(e) => { warn!("Unable to author block in slot {:?}: {:?}", slot_num, e); @@ -376,7 +265,15 @@ impl SlotWorker for AuraWorker as CompatibleDigestItem

>::aura_pre_digest(slot_num), + ], + }, + remaining_duration, + ).into_future(), remaining_duration, ) } else { @@ -384,106 +281,129 @@ impl SlotWorker for AuraWorker slot_num - ); - return - } + Box::new(proposal_work.map(move |b| { + // minor hack since we don't have access to the timestamp + // that is actually set by the proposer. + let slot_after_building = SignedDuration::default().slot_now(slot_duration); + if slot_after_building != slot_num { + info!( + "Discarding proposal for slot {}; block production took too long", + slot_num + ); + telemetry!(CONSENSUS_INFO; "aura.discarding_proposal_took_too_long"; + "slot" => slot_num + ); + return + } - let (header, body) = b.deconstruct(); - let header_num = header.number().clone(); - let pre_hash = header.hash(); - let parent_hash = header.parent_hash().clone(); - - // sign the pre-sealed hash of the block and then - // add it to a digest item. - let to_sign = (slot_num, pre_hash).encode(); - let signature = pair.sign(&to_sign[..]); - let item = as CompatibleDigestItem

>::aura_seal( - slot_num, - signature, - ); + let (header, body) = b.deconstruct(); + let pre_digest: Result = find_pre_digest::(&header); + if let Err(e) = pre_digest { + error!(target: "aura", "FATAL ERROR: Invalid pre-digest: {}!", e); + return + } else { + trace!(target: "aura", "Got correct number of seals. Good!") + }; + + let header_num = header.number().clone(); + let parent_hash = header.parent_hash().clone(); + + // sign the pre-sealed hash of the block and then + // add it to a digest item. + let header_hash = header.hash(); + let signature = pair.sign(header_hash.as_ref()); + let signature_digest_item = as CompatibleDigestItem

>::aura_seal(signature); + + let import_block: ImportBlock = ImportBlock { + origin: BlockOrigin::Own, + header, + justification: None, + post_digests: vec![signature_digest_item], + body: Some(body), + finalized: false, + auxiliary: Vec::new(), + fork_choice: ForkChoiceStrategy::LongestChain, + }; + + info!("Pre-sealed block for proposal at {}. Hash now {:?}, previously {:?}.", + header_num, + import_block.post_header().hash(), + header_hash + ); + telemetry!(CONSENSUS_INFO; "aura.pre_sealed_block"; + "header_num" => ?header_num, + "hash_now" => ?import_block.post_header().hash(), + "hash_previously" => ?header_hash + ); - let import_block: ImportBlock = ImportBlock { - origin: BlockOrigin::Own, - header, - justification: None, - post_digests: vec![item], - body: Some(body), - finalized: false, - auxiliary: Vec::new(), - fork_choice: ForkChoiceStrategy::LongestChain, - }; - - info!("Pre-sealed block for proposal at {}. Hash now {:?}, previously {:?}.", - header_num, - import_block.post_header().hash(), - pre_hash - ); - telemetry!(CONSENSUS_INFO; "aura.pre_sealed_block"; - "header_num" => ?header_num, - "hash_now" => ?import_block.post_header().hash(), - "hash_previously" => ?pre_hash - ); + if let Err(e) = block_import.import_block(import_block, Default::default()) { + warn!(target: "aura", "Error with block built on {:?}: {:?}", + parent_hash, e); + telemetry!(CONSENSUS_WARN; "aura.err_with_block_built_on"; + "hash" => ?parent_hash, "err" => ?e + ); + } + }).map_err(|e| consensus_common::Error::ClientImport(format!("{:?}", e)).into())) + } +} - if let Err(e) = block_import.import_block(import_block, Default::default()) { - warn!(target: "aura", "Error with block built on {:?}: {:?}", - parent_hash, e); - telemetry!(CONSENSUS_WARN; "aura.err_with_block_built_on"; - "hash" => ?parent_hash, "err" => ?e - ); - } - }) - .map_err(|e| consensus_common::ErrorKind::ClientImport(format!("{:?}", e)).into()) - ) +macro_rules! aura_err { + ($($i: expr),+) => { + { debug!(target: "aura", $($i),+) + ; format!($($i),+) + } + }; +} + +fn find_pre_digest(header: &B::Header) -> Result + where DigestItemFor: CompatibleDigestItem

, + P::Signature: Decode, + P::Public: Encode + Decode + PartialEq + Clone, +{ + let mut pre_digest: Option = None; + for log in header.digest().logs() { + trace!(target: "aura", "Checking log {:?}", log); + match (log.as_aura_pre_digest(), pre_digest.is_some()) { + (Some(_), true) => Err(aura_err!("Multiple AuRa pre-runtime headers, rejecting!"))?, + (None, _) => trace!(target: "aura", "Ignoring digest not meant for us"), + (s, false) => pre_digest = s, + } } + pre_digest.ok_or_else(|| aura_err!("No AuRa pre-runtime digest found")) } + /// check a header has been signed by the right key. If the slot is too far in the future, an error will be returned. /// if it's successful, returns the pre-header and the digest item containing the seal. /// /// This digest item will always return `Some` when used with `as_aura_seal`. // // FIXME #1018 needs misbehavior types -fn check_header( +fn check_header( + client: &C, slot_now: u64, mut header: B::Header, hash: B::Hash, authorities: &[AuthorityId

], - allow_old_seals: bool, -) -> Result>, String> - where DigestItemFor: CompatibleDigestItem

, - P::Public: AsRef, - P::Signature: Decode, +) -> Result)>, String> where + DigestItemFor: CompatibleDigestItem

, + P::Signature: Decode, + C: client::backend::AuxStore, + P::Public: AsRef + Encode + Decode + PartialEq + Clone, { - let digest_item = match header.digest_mut().pop() { + let seal = match header.digest_mut().pop() { Some(x) => x, None => return Err(format!("Header {:?} is unsealed", hash)), }; - if !allow_old_seals && digest_item.is_deprecated() { - debug!(target: "aura", "Header {:?} uses old seal format, rejecting", hash); - return Err(format!("Header {:?} uses old seal format, rejecting", hash)) - } - - let (slot_num, sig) = digest_item.as_aura_seal().ok_or_else(|| { - debug!(target: "aura", "Header {:?} is unsealed", hash); - format!("Header {:?} is unsealed", hash) + let sig = seal.as_aura_seal().ok_or_else(|| { + aura_err!("Header {:?} has a bad seal", hash) })?; + let slot_num = find_pre_digest::(&header)?; + if slot_num > slot_now { - header.digest_mut().push(digest_item); + header.digest_mut().push(seal); Ok(CheckedHeader::Deferred(header, slot_num)) } else { // check the signature is valid under the expected authority and @@ -494,11 +414,24 @@ fn check_header( }; let pre_hash = header.hash(); - let to_sign = (slot_num, pre_hash).encode(); - let public = expected_author; - if P::verify(&sig, &to_sign[..], public) { - Ok(CheckedHeader::Checked(header, digest_item)) + if P::verify(&sig, pre_hash.as_ref(), expected_author) { + if let Some(equivocation_proof) = check_equivocation( + client, + slot_now, + slot_num, + &header, + expected_author, + ).map_err(|e| e.to_string())? { + info!( + "Slot author is equivocating at slot {} with headers {:?} and {:?}", + slot_num, + equivocation_proof.fst_header().hash(), + equivocation_proof.snd_header().hash(), + ); + } + + Ok(CheckedHeader::Checked(header, (slot_num, seal))) } else { Err(format!("Bad signature on {:?}", hash)) } @@ -506,15 +439,13 @@ fn check_header( } /// A verifier for Aura blocks. -pub struct AuraVerifier { +pub struct AuraVerifier { client: Arc, - extra: E, phantom: PhantomData

, inherent_data_providers: inherents::InherentDataProviders, - allow_old_seals: bool, } -impl AuraVerifier +impl AuraVerifier where P: Send + Sync + 'static { fn check_inherents( @@ -566,28 +497,14 @@ impl AuraVerifier } } -/// No-op extra verification. -#[derive(Debug, Clone, Copy)] -pub struct NothingExtra; - -impl ExtraVerification for NothingExtra { - type Verified = Result<(), String>; - - fn verify(&self, _: &B::Header, _: Option<&[B::Extrinsic]>) -> Self::Verified { - Ok(()) - } -} - #[forbid(deprecated)] -impl Verifier for AuraVerifier where - C: ProvideRuntimeApi + Send + Sync, - C::Api: BlockBuilderApi, - DigestItemFor: CompatibleDigestItem

+ DigestItem>, - E: ExtraVerification, +impl Verifier for AuraVerifier where + C: ProvideRuntimeApi + Send + Sync + client::backend::AuxStore + ProvideCache, + C::Api: BlockBuilderApi + AuraApi>, + DigestItemFor: CompatibleDigestItem

, P: Pair + Send + Sync + 'static, P::Public: Send + Sync + Hash + Eq + Clone + Decode + Encode + Debug + AsRef + 'static, P::Signature: Encode + Decode, - Self: Authorities, { fn verify( &self, @@ -595,34 +512,27 @@ impl Verifier for AuraVerifier where header: B::Header, justification: Option, mut body: Option>, - ) -> Result<(ImportBlock, Option>>), String> { + ) -> Result<(ImportBlock, Option)>>), String> { let mut inherent_data = self.inherent_data_providers.create_inherent_data().map_err(String::from)?; let (timestamp_now, slot_now) = AuraSlotCompatible::extract_timestamp_and_slot(&inherent_data) .map_err(|e| format!("Could not extract timestamp and slot: {:?}", e))?; let hash = header.hash(); let parent_hash = *header.parent_hash(); - let authorities = self.authorities(&BlockId::Hash(parent_hash)) + let authorities = authorities(self.client.as_ref(), &BlockId::Hash(parent_hash)) .map_err(|e| format!("Could not fetch authorities at {:?}: {:?}", parent_hash, e))?; - let extra_verification = self.extra.verify( - &header, - body.as_ref().map(|x| &x[..]), - ); - // we add one to allow for some small drift. - // FIXME #1019 in the future, alter this queue to allow deferring of headers - let checked_header = check_header::( + // FIXME #1019 in the future, alter this queue to allow deferring of + // headers + let checked_header = check_header::( + &self.client, slot_now + 1, header, hash, &authorities[..], - self.allow_old_seals, )?; match checked_header { - CheckedHeader::Checked(pre_header, seal) => { - let (slot_num, _) = seal.as_aura_seal() - .expect("check_header always returns a seal digest item; qed"); - + CheckedHeader::Checked(pre_header, (slot_num, seal)) => { // if the body is passed through, we need to use the runtime // to check that the internally-set timestamp in the inherents // actually matches the slot set in the seal. @@ -633,7 +543,7 @@ impl Verifier for AuraVerifier where // skip the inherents verification if the runtime API is old. if self.client .runtime_api() - .has_api_with::, _>(&BlockId::Hash(parent_hash), |v| v >= 2) + .has_api_with::, _>(&BlockId::Hash(parent_hash), |v| v >= 2) .map_err(|e| format!("{:?}", e))? { self.check_inherents( @@ -651,7 +561,14 @@ impl Verifier for AuraVerifier where trace!(target: "aura", "Checked {:?}; importing.", pre_header); telemetry!(CONSENSUS_TRACE; "aura.checked_and_importing"; "pre_header" => ?pre_header); - extra_verification.into_future().wait()?; + // `Consensus` is the Aura-specific authorities change log. + let maybe_keys = pre_header.digest() + .convert_first(|l| l.try_to::>>( + OpaqueDigestItemId::Consensus(&AURA_ENGINE_ID) + )) + .map(|ConsensusLog::AuthoritiesChange(a)| + vec![(well_known_cache_keys::AUTHORITIES, a.encode())] + ); let import_block = ImportBlock { origin, @@ -664,8 +581,7 @@ impl Verifier for AuraVerifier where fork_choice: ForkChoiceStrategy::LongestChain, }; - // FIXME #1019 extract authorities - Ok((import_block, None)) + Ok((import_block, maybe_keys)) } CheckedHeader::Deferred(a, b) => { debug!(target: "aura", "Checking {:?} failed; {:?}, {:?}.", hash, a, b); @@ -678,35 +594,54 @@ impl Verifier for AuraVerifier where } } -impl Authorities for AuraVerifier where +fn initialize_authorities_cache(client: &C) -> Result<(), ConsensusError> where + A: Codec, B: Block, C: ProvideRuntimeApi + ProvideCache, - C::Api: AuthoritiesApi, + C::Api: AuraApi, { - type Error = ConsensusError; + // no cache => no initialization + let cache = match client.cache() { + Some(cache) => cache, + None => return Ok(()), + }; - fn authorities(&self, at: &BlockId) -> Result>, Self::Error> { - authorities(self.client.as_ref(), at) + // check if we already have initialized the cache + let genesis_id = BlockId::Number(Zero::zero()); + let genesis_authorities: Option> = cache + .get_at(&well_known_cache_keys::AUTHORITIES, &genesis_id) + .and_then(|v| Decode::decode(&mut &v[..])); + if genesis_authorities.is_some() { + return Ok(()); } + + let map_err = |error| consensus_common::Error::from(consensus_common::Error::ClientImport( + format!( + "Error initializing authorities cache: {}", + error, + ))); + let genesis_authorities = authorities(client, &genesis_id)?; + cache.initialize(&well_known_cache_keys::AUTHORITIES, genesis_authorities.encode()) + .map_err(map_err)?; + + Ok(()) } #[allow(deprecated)] -fn authorities(client: &C, at: &BlockId) -> Result>, ConsensusError> where +fn authorities(client: &C, at: &BlockId) -> Result, ConsensusError> where + A: Codec, B: Block, C: ProvideRuntimeApi + ProvideCache, - C::Api: AuthoritiesApi, + C::Api: AuraApi, { client .cache() - .and_then(|cache| cache.get_at(&well_known_cache_keys::AUTHORITIES, at) - .and_then(|v| Decode::decode(&mut &v[..]))) - .or_else(|| { - if client.runtime_api().has_api::>(at).unwrap_or(false) { - AuthoritiesApi::authorities(&*client.runtime_api(), at).ok() - } else { - CoreApi::authorities(&*client.runtime_api(), at).ok() - } - }).ok_or_else(|| consensus_common::ErrorKind::InvalidAuthoritiesSet.into()) + .and_then(|cache| cache + .get_at(&well_known_cache_keys::AUTHORITIES, at) + .and_then(|v| Decode::decode(&mut &v[..])) + ) + .or_else(|| AuraApi::authorities(&*client.runtime_api(), at).ok()) + .ok_or_else(|| consensus_common::Error::InvalidAuthoritiesSet.into()) } /// The Aura import queue type. @@ -720,87 +655,58 @@ fn register_aura_inherent_data_provider( if !inherent_data_providers.has_provider(&srml_aura::INHERENT_IDENTIFIER) { inherent_data_providers .register_provider(srml_aura::InherentDataProvider::new(slot_duration)) - .map_err(inherent_to_common_error) + .map_err(Into::into) + .map_err(consensus_common::Error::InherentData) } else { Ok(()) } } /// Start an import queue for the Aura consensus algorithm. -pub fn import_queue( +pub fn import_queue( slot_duration: SlotDuration, block_import: SharedBlockImport, justification_import: Option>, + finality_proof_import: Option>, + finality_proof_request_builder: Option>, client: Arc, - extra: E, inherent_data_providers: InherentDataProviders, ) -> Result, consensus_common::Error> where B: Block, - C: 'static + ProvideRuntimeApi + ProvideCache + Send + Sync, - C::Api: BlockBuilderApi + AuthoritiesApi, - DigestItemFor: CompatibleDigestItem

+ DigestItem>, - E: 'static + ExtraVerification, + C: 'static + ProvideRuntimeApi + ProvideCache + Send + Sync + AuxStore, + C::Api: BlockBuilderApi + AuraApi>, + DigestItemFor: CompatibleDigestItem

, P: Pair + Send + Sync + 'static, P::Public: Clone + Eq + Send + Sync + Hash + Debug + Encode + Decode + AsRef, P::Signature: Encode + Decode, { register_aura_inherent_data_provider(&inherent_data_providers, slot_duration.get())?; + initialize_authorities_cache(&*client)?; let verifier = Arc::new( AuraVerifier { client: client.clone(), - extra, inherent_data_providers, phantom: PhantomData, - allow_old_seals: false, } ); - Ok(BasicQueue::new(verifier, block_import, justification_import)) -} - -/// Start an import queue for the Aura consensus algorithm with backwards compatibility. -#[deprecated( - since = "1.0.1", - note = "should not be used unless backwards compatibility with an older chain is needed.", -)] -pub fn import_queue_accept_old_seals( - slot_duration: SlotDuration, - block_import: SharedBlockImport, - justification_import: Option>, - client: Arc, - extra: E, - inherent_data_providers: InherentDataProviders, -) -> Result, consensus_common::Error> where - B: Block, - C: 'static + ProvideRuntimeApi + ProvideCache + Send + Sync, - C::Api: BlockBuilderApi + AuthoritiesApi, - DigestItemFor: CompatibleDigestItem

+ DigestItem>, - E: 'static + ExtraVerification, - P: Pair + Send + Sync + 'static, - P::Public: Clone + Eq + Send + Sync + Hash + Debug + Encode + Decode + AsRef, - P::Signature: Encode + Decode, -{ - register_aura_inherent_data_provider(&inherent_data_providers, slot_duration.get())?; - - let verifier = Arc::new( - AuraVerifier { - client: client.clone(), - extra, - inherent_data_providers, - phantom: PhantomData, - allow_old_seals: true, - } - ); - Ok(BasicQueue::new(verifier, block_import, justification_import)) + Ok(BasicQueue::new( + verifier, + block_import, + justification_import, + finality_proof_import, + finality_proof_request_builder, + )) } #[cfg(test)] mod tests { use super::*; + use futures::stream::Stream as _; use consensus_common::NoNetwork as DummyOracle; use network::test::*; - use network::test::{Block as TestBlock, PeersClient}; - use runtime_primitives::traits::Block as BlockT; + use network::test::{Block as TestBlock, PeersClient, PeersFullClient}; + use runtime_primitives::traits::{Block as BlockT, DigestFor}; use network::config::ProtocolConfig; use parking_lot::Mutex; use tokio::runtime::current_thread; @@ -811,7 +717,12 @@ mod tests { type Error = client::error::Error; - type TestClient = client::Client; + type TestClient = client::Client< + test_client::Backend, + test_client::Executor, + TestBlock, + test_client::runtime::RuntimeApi + >; struct DummyFactory(Arc); struct DummyProposer(u64, Arc); @@ -820,7 +731,7 @@ mod tests { type Proposer = DummyProposer; type Error = Error; - fn init(&self, parent_header: &::Header, _authorities: &[AuthorityId]) + fn init(&self, parent_header: &::Header) -> Result { Ok(DummyProposer(parent_header.number + 1, self.0.clone())) @@ -831,8 +742,13 @@ mod tests { type Error = Error; type Create = Result; - fn propose(&self, _: InherentData, _: Duration) -> Result { - self.1.new_block().unwrap().bake().map_err(|e| e.into()) + fn propose( + &self, + _: InherentData, + digests: DigestFor, + _: Duration, + ) -> Result { + self.1.new_block(digests).unwrap().bake().map_err(|e| e.into()) } } @@ -846,7 +762,7 @@ mod tests { impl TestNetFactory for AuraTestNet { type Specialization = DummySpecialization; - type Verifier = AuraVerifier; + type Verifier = AuraVerifier; type PeerData = (); /// Create new test network with peers and given config. @@ -857,25 +773,32 @@ mod tests { } } - fn make_verifier(&self, client: Arc, _cfg: &ProtocolConfig) + fn make_verifier(&self, client: PeersClient, _cfg: &ProtocolConfig) -> Arc { - let slot_duration = SlotDuration::get_or_compute(&*client) - .expect("slot duration available"); - let inherent_data_providers = InherentDataProviders::new(); - register_aura_inherent_data_provider( - &inherent_data_providers, - slot_duration.get() - ).expect("Registers aura inherent data provider"); + match client { + PeersClient::Full(client) => { + let slot_duration = SlotDuration::get_or_compute(&*client) + .expect("slot duration available"); + let inherent_data_providers = InherentDataProviders::new(); + register_aura_inherent_data_provider( + &inherent_data_providers, + slot_duration.get() + ).expect("Registers aura inherent data provider"); + + assert_eq!(slot_duration.get(), SLOT_DURATION); + Arc::new(AuraVerifier { + client, + inherent_data_providers, + phantom: Default::default(), + }) + }, + PeersClient::Light(_) => unreachable!("No (yet) tests for light client + Aura"), + } + } - assert_eq!(slot_duration.get(), SLOT_DURATION); - Arc::new(AuraVerifier { - client, - extra: NothingExtra, - inherent_data_providers, - phantom: Default::default(), - allow_old_seals: false, - }) + fn uses_tokio(&self) -> bool { + true } fn peer(&self, i: usize) -> &Peer { @@ -900,6 +823,7 @@ mod tests { } #[test] + #[allow(deprecated)] fn authoring_blocks() { let _ = ::env_logger::try_init(); let mut net = AuraTestNet::new(3); @@ -917,10 +841,10 @@ mod tests { let mut runtime = current_thread::Runtime::new().unwrap(); for (peer_id, key) in peers { - let client = net.lock().peer(*peer_id).client().clone(); + let client = net.lock().peer(*peer_id).client().as_full().expect("full clients are created").clone(); + #[allow(deprecated)] let select_chain = LongestChain::new( client.backend().clone(), - client.import_lock().clone(), ); let environ = Arc::new(DummyFactory(client.clone())); import_notifications.push( @@ -945,7 +869,6 @@ mod tests { client, environ.clone(), DummyOracle, - futures::empty(), inherent_data_providers, false, ).expect("Starts aura"); @@ -958,7 +881,7 @@ mod tests { .map(|_| ()) .map_err(|_| ()); - let drive_to_completion = ::tokio::timer::Interval::new_interval(TEST_ROUTING_INTERVAL) + let drive_to_completion = ::tokio_timer::Interval::new_interval(TEST_ROUTING_INTERVAL) .for_each(move |_| { net.lock().send_import_notifications(); net.lock().sync_without_disconnects(); @@ -967,14 +890,14 @@ mod tests { .map(|_| ()) .map_err(|_| ()); - runtime.block_on(wait_for.select(drive_to_completion).map_err(|_| ())).unwrap(); + let _ = runtime.block_on(wait_for.select(drive_to_completion).map_err(|_| ())).unwrap(); } #[test] fn authorities_call_works() { let client = test_client::new(); - assert_eq!(client.info().unwrap().chain.best_number, 0); + assert_eq!(client.info().chain.best_number, 0); assert_eq!(authorities(&client, &BlockId::Number(0)).unwrap(), vec![ Keyring::Alice.into(), Keyring::Bob.into(), diff --git a/core/consensus/authorities/Cargo.toml b/core/consensus/authorities/Cargo.toml deleted file mode 100644 index c4249f39d463537db1396cbe2063e3694f7fcf59..0000000000000000000000000000000000000000 --- a/core/consensus/authorities/Cargo.toml +++ /dev/null @@ -1,29 +0,0 @@ -[package] -name = "substrate-consensus-authorities" -version = "2.0.0" -authors = ["Parity Technologies "] -description = "Primitives for Aura consensus" -edition = "2018" - -[dependencies] -parity-codec = { version = "3.3", default-features = false } -substrate-client = { path = "../../client", default-features = false } -primitives = { package = "substrate-primitives", path = "../../primitives", default-features = false } -runtime_support = { package = "srml-support", path = "../../../srml/support", default-features = false } -runtime_primitives = { package = "sr-primitives", path = "../../sr-primitives", default-features = false } -sr-version = { path = "../../sr-version", default-features = false } -runtime_io = { package = "sr-io", path = "../../sr-io", default-features = false } -rstd = { package = "sr-std", path = "../../sr-std", default-features = false } - -[features] -default = ["std"] -std = [ - "parity-codec/std", - "substrate-client/std", - "primitives/std", - "runtime_support/std", - "runtime_primitives/std", - "sr-version/std", - "runtime_io/std", - "rstd/std" -] diff --git a/core/consensus/babe/Cargo.toml b/core/consensus/babe/Cargo.toml index 8ecfa05c4d48546b0c849c3acf186eaa62d4d3ca..a20b7de00149d17a636286903cb6677ba36b1601 100644 --- a/core/consensus/babe/Cargo.toml +++ b/core/consensus/babe/Cargo.toml @@ -14,18 +14,15 @@ runtime_support = { package = "srml-support", path = "../../../srml/support" } runtime_version = { package = "sr-version", path = "../../sr-version" } runtime_io = { package = "sr-io", path = "../../sr-io" } inherents = { package = "substrate-inherents", path = "../../inherents" } -srml-consensus = { path = "../../../srml/consensus" } substrate-telemetry = { path = "../../telemetry" } srml-babe = { path = "../../../srml/babe" } client = { package = "substrate-client", path = "../../client" } consensus_common = { package = "substrate-consensus-common", path = "../common" } -authorities = { package = "substrate-consensus-authorities", path = "../authorities" } slots = { package = "substrate-consensus-slots", path = "../slots" } runtime_primitives = { package = "sr-primitives", path = "../../sr-primitives" } futures = "0.1.26" -tokio = "0.1.18" -parking_lot = "0.7.1" -error-chain = "0.12.0" +tokio-timer = "0.2.11" +parking_lot = "0.8.0" log = "0.4.6" schnorrkel = "0.1.1" rand = "0.6.5" @@ -36,5 +33,6 @@ keyring = { package = "substrate-keyring", path = "../../keyring" } substrate-executor = { path = "../../executor" } network = { package = "substrate-network", path = "../../network", features = ["test-helpers"]} service = { package = "substrate-service", path = "../../service" } -test_client = { package = "substrate-test-client", path = "../../test-client" } +test-client = { package = "substrate-test-runtime-client", path = "../../test-runtime/client" } +tokio = "0.1.18" env_logger = "0.6.1" diff --git a/core/consensus/babe/primitives/Cargo.toml b/core/consensus/babe/primitives/Cargo.toml index 67700c8ee0abe9175de61d09948ca1370ad758c2..fd45f6470a27e236aa95a33d6cf342d897d21647 100644 --- a/core/consensus/babe/primitives/Cargo.toml +++ b/core/consensus/babe/primitives/Cargo.toml @@ -7,13 +7,16 @@ edition = "2018" [dependencies] substrate-client = { path = "../../../client", default-features = false } +rstd = { package = "sr-std", path = "../../../sr-std", default-features = false } runtime_primitives = { package = "sr-primitives", path = "../../../sr-primitives", default-features = false } +substrate-primitives = { path = "../../../primitives", default-features = false } slots = { package = "substrate-consensus-slots", path = "../../slots", optional = true } parity-codec = { version = "3.5.1", default-features = false } [features] default = ["std"] std = [ + "rstd/std", "runtime_primitives/std", "substrate-client/std", "parity-codec/std", diff --git a/core/consensus/babe/primitives/src/lib.rs b/core/consensus/babe/primitives/src/lib.rs index 83ba6ccba2bbc377d0b6c35379c68fee6e9821d8..f1d4a452d68725d7f1b1d69250d06fcc7152d7d9 100644 --- a/core/consensus/babe/primitives/src/lib.rs +++ b/core/consensus/babe/primitives/src/lib.rs @@ -15,16 +15,21 @@ // along with Substrate. If not, see . //! Primitives for BABE. -#![forbid(warnings, unsafe_code, missing_docs)] +#![deny(warnings, unsafe_code, missing_docs)] #![cfg_attr(not(feature = "std"), no_std)] +use parity_codec::{Encode, Decode}; +use rstd::vec::Vec; use runtime_primitives::ConsensusEngineId; +use substrate_primitives::sr25519::Public; use substrate_client::decl_runtime_apis; -use parity_codec::{Encode, Decode}; +/// A Babe authority identifier. Necessarily equivalent to the schnorrkel public key used in +/// the main Babe module. If that ever changes, then this must, too. +pub type AuthorityId = Public; /// The `ConsensusEngineId` of BABE. -pub const BABE_ENGINE_ID: ConsensusEngineId = [b'b', b'a', b'b', b'e']; +pub const BABE_ENGINE_ID: ConsensusEngineId = *b"BABE"; /// Configuration data used by the BABE consensus engine. #[derive(Copy, Clone, Hash, PartialEq, Eq, Debug, Encode, Decode)] @@ -46,6 +51,15 @@ pub struct BabeConfiguration { /// /// Dynamic thresholds may be supported in the future. pub threshold: u64, + + /// The minimum number of blocks that must be received before running the + /// median algorithm to compute the offset between the on-chain time and the + /// local time. Currently, only the value provided by this type at genesis + /// will be used, but this is subject to change. + /// + /// Blocks less than `self.median_required_blocks` must be generated by an + /// *initial validator* ― that is, a node that was a validator at genesis. + pub median_required_blocks: u64, } #[cfg(feature = "std")] @@ -69,5 +83,8 @@ decl_runtime_apis! { /// /// Dynamic configuration may be supported in the future. fn startup_data() -> BabeConfiguration; + + /// Get the current authorites for Babe. + fn authorities() -> Vec; } } diff --git a/core/consensus/babe/src/digest.rs b/core/consensus/babe/src/digest.rs new file mode 100644 index 0000000000000000000000000000000000000000..7356001cf798843bd9216d36c0482038db68f7c2 --- /dev/null +++ b/core/consensus/babe/src/digest.rs @@ -0,0 +1,110 @@ +// Copyright 2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +//! Private mplementation details of BABE digests. + +use primitives::sr25519::{Public, Signature}; +use babe_primitives::BABE_ENGINE_ID; +use runtime_primitives::{DigestItem, generic::OpaqueDigestItemId}; +use std::fmt::Debug; +use parity_codec::{Decode, Encode, Codec, Input}; +use schnorrkel::{ + vrf::{VRFProof, VRFOutput, VRF_OUTPUT_LENGTH, VRF_PROOF_LENGTH}, + PUBLIC_KEY_LENGTH, +}; + +/// A BABE pre-digest. It includes: +/// +/// * The public key of the author. +/// * The VRF proof. +/// * The VRF output. +/// * The slot number. +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct BabePreDigest { + pub(super) vrf_output: VRFOutput, + pub(super) proof: VRFProof, + pub(super) author: Public, + pub(super) slot_num: u64, +} + +/// The prefix used by BABE for its VRF keys. +pub const BABE_VRF_PREFIX: &'static [u8] = b"substrate-babe-vrf"; + +type TmpDecode = ( + [u8; VRF_OUTPUT_LENGTH], + [u8; VRF_PROOF_LENGTH], + [u8; PUBLIC_KEY_LENGTH], + u64, +); + +impl Encode for BabePreDigest { + fn encode(&self) -> Vec { + let tmp: TmpDecode = ( + *self.vrf_output.as_bytes(), + self.proof.to_bytes(), + self.author.0, + self.slot_num, + ); + parity_codec::Encode::encode(&tmp) + } +} + +impl Decode for BabePreDigest { + fn decode(i: &mut R) -> Option { + let (output, proof, public_key, slot_num): TmpDecode = Decode::decode(i)?; + Some(BabePreDigest { + proof: VRFProof::from_bytes(&proof).ok()?, + vrf_output: VRFOutput::from_bytes(&output).ok()?, + author: Public(public_key), + slot_num, + }) + } +} + +/// A digest item which is usable with BABE consensus. +pub trait CompatibleDigestItem: Sized { + /// Construct a digest item which contains a BABE pre-digest. + fn babe_pre_digest(seal: BabePreDigest) -> Self; + + /// If this item is an BABE pre-digest, return it. + fn as_babe_pre_digest(&self) -> Option; + + /// Construct a digest item which contains a BABE seal. + fn babe_seal(signature: Signature) -> Self; + + /// If this item is a BABE signature, return the signature. + fn as_babe_seal(&self) -> Option; +} + +impl CompatibleDigestItem for DigestItem where + Hash: Debug + Send + Sync + Eq + Clone + Codec + 'static +{ + fn babe_pre_digest(digest: BabePreDigest) -> Self { + DigestItem::PreRuntime(BABE_ENGINE_ID, digest.encode()) + } + + fn as_babe_pre_digest(&self) -> Option { + self.try_to(OpaqueDigestItemId::PreRuntime(&BABE_ENGINE_ID)) + } + + fn babe_seal(signature: Signature) -> Self { + DigestItem::Seal(BABE_ENGINE_ID, signature.encode()) + } + + fn as_babe_seal(&self) -> Option { + self.try_to(OpaqueDigestItemId::Seal(&BABE_ENGINE_ID)) + } +} diff --git a/core/consensus/babe/src/lib.rs b/core/consensus/babe/src/lib.rs index a016e835c5fd8c8e9806647349a8309ce88f9ed8..0bab790c991f84bb4ac904fd0bd798d960f1cbb4 100644 --- a/core/consensus/babe/src/lib.rs +++ b/core/consensus/babe/src/lib.rs @@ -16,7 +16,7 @@ //! # BABE consensus //! -//! BABE (Blind Assignment for Blockchain Extension) consensus in substrate. +//! BABE (Blind Assignment for Blockchain Extension) consensus in Substrate. //! //! # Stability //! @@ -24,34 +24,44 @@ //! happen at any point. This crate is also missing features, such as banning //! of malicious validators, that are essential for a production network. #![forbid(unsafe_code, missing_docs)] -#![deny(warnings)] extern crate core; +mod digest; +use digest::CompatibleDigestItem; +pub use digest::{BabePreDigest, BABE_VRF_PREFIX}; pub use babe_primitives::*; pub use consensus_common::SyncOracle; -use consensus_common::ExtraVerification; -use runtime_primitives::{generic, generic::BlockId, Justification}; -use runtime_primitives::traits::{ - Block, Header, Digest, DigestItemFor, DigestItem, ProvideRuntimeApi, AuthorityIdFor, +use consensus_common::import_queue::{ + SharedBlockImport, SharedJustificationImport, SharedFinalityProofImport, + SharedFinalityProofRequestBuilder, }; -use std::{sync::Arc, u64, fmt::Debug}; -use parity_codec::{Decode, Encode, Input}; -use primitives::{ - crypto::Pair, - sr25519::{Public, Signature, LocalizedSignature, self}, +use consensus_common::well_known_cache_keys::Id as CacheKeyId; +use runtime_primitives::{generic, generic::{BlockId, OpaqueDigestItemId}, Justification}; +use runtime_primitives::traits::{ + Block, Header, DigestItemFor, ProvideRuntimeApi, + SimpleBitOps, Zero, }; +use std::{sync::Arc, u64, fmt::{Debug, Display}, time::{Instant, Duration}}; +use runtime_support::serde::{Serialize, Deserialize}; +use parity_codec::{Decode, Encode}; +use parking_lot::Mutex; +use primitives::{crypto::Pair, sr25519}; use merlin::Transcript; -use inherents::{InherentDataProviders, InherentData, RuntimeString}; -use substrate_telemetry::{telemetry, CONSENSUS_TRACE, CONSENSUS_DEBUG, CONSENSUS_WARN, CONSENSUS_INFO}; +use inherents::{InherentDataProviders, InherentData}; +use substrate_telemetry::{ + telemetry, + CONSENSUS_TRACE, + CONSENSUS_DEBUG, + CONSENSUS_WARN, + CONSENSUS_INFO, +}; use schnorrkel::{ keys::Keypair, vrf::{ - VRFProof, VRFProofBatchable, VRFInOut, VRFOutput, - VRF_OUTPUT_LENGTH, VRF_PROOF_LENGTH, + VRFProof, VRFProofBatchable, VRFInOut, }, - PUBLIC_KEY_LENGTH, SIGNATURE_LENGTH, }; -use authorities::AuthoritiesApi; -use consensus_common::{self, Authorities, BlockImport, Environment, Proposer, +use consensus_common::{ + self, BlockImport, Environment, Proposer, ForkChoiceStrategy, ImportBlock, BlockOrigin, Error as ConsensusError, }; use srml_babe::{ @@ -67,99 +77,18 @@ use client::{ error::Result as CResult, backend::AuxStore, }; -use slots::CheckedHeader; +use slots::{CheckedHeader, check_equivocation}; use futures::{Future, IntoFuture, future}; -use tokio::timer::Timeout; +use tokio_timer::Timeout; use log::{error, warn, debug, info, trace}; -use slots::{SlotWorker, SlotInfo, SlotCompatible, slot_now}; +use slots::{SlotWorker, SlotData, SlotInfo, SlotCompatible, SignedDuration}; -/// A BABE seal. It includes: -/// -/// * The public key -/// * The VRF proof -/// * The signature -/// * The slot number -#[derive(Clone, Debug, PartialEq, Eq)] -pub struct BabeSeal { - vrf_output: VRFOutput, - proof: VRFProof, - signature: LocalizedSignature, - slot_num: u64, -} - -/// The prefix used by BABE for its VRF keys. -pub const BABE_VRF_PREFIX: &'static [u8] = b"substrate-babe-vrf"; - -macro_rules! babe_assert_eq { - ($a: expr, $b: expr) => { - { - let ref a = $a; - let ref b = $b; - if a != b { - error!( - target: "babe", - "Expected {:?} to equal {:?}, but they were not", - stringify!($a), - stringify!($b), - ); - assert_eq!(a, b); - } - } - }; -} - -type TmpDecode = ( - [u8; VRF_OUTPUT_LENGTH], - [u8; VRF_PROOF_LENGTH], - [u8; SIGNATURE_LENGTH], - [u8; PUBLIC_KEY_LENGTH], - u64, -); - -impl Encode for BabeSeal { - fn encode(&self) -> Vec { - let tmp: TmpDecode = ( - *self.vrf_output.as_bytes(), - self.proof.to_bytes(), - self.signature.signature.0, - self.signature.signer.0, - self.slot_num, - ); - let encoded = parity_codec::Encode::encode(&tmp); - if cfg!(any(test, debug_assertions)) { - debug!(target: "babe", "Checking if encoding was correct"); - let decoded_version = Self::decode(&mut &encoded[..]) - .expect("we just encoded this ourselves, so it is correct; qed"); - babe_assert_eq!(decoded_version.proof, self.proof); - babe_assert_eq!(decoded_version.vrf_output, self.vrf_output); - babe_assert_eq!(decoded_version.signature.signature, self.signature.signature); - babe_assert_eq!(decoded_version.signature.signer, self.signature.signer); - babe_assert_eq!(decoded_version.slot_num, self.slot_num); - debug!(target: "babe", "Encoding was correct") - } - encoded - } -} - -impl Decode for BabeSeal { - fn decode(i: &mut R) -> Option { - let (output, proof, sig, public_key, slot_num): TmpDecode = Decode::decode(i)?; - Some(BabeSeal { - proof: VRFProof::from_bytes(&proof).ok()?, - vrf_output: VRFOutput::from_bytes(&output).ok()?, - signature: LocalizedSignature { - signature: Signature(sig), - signer: Public(public_key), - }, - slot_num, - }) - } -} +pub use babe_primitives::AuthorityId; /// A slot duration. Create with `get_or_compute`. // FIXME: Once Rust has higher-kinded types, the duplication between this -// and `super::aura::Config` can be eliminated. +// and `super::babe::Config` can be eliminated. // https://github.com/paritytech/substrate/issues/2434 pub struct Config(slots::SlotDuration); @@ -191,49 +120,6 @@ impl Config { } } -fn inherent_to_common_error(err: RuntimeString) -> consensus_common::Error { - consensus_common::ErrorKind::InherentData(err.into()).into() -} - -/// A digest item which is usable with BABE consensus. -pub trait CompatibleDigestItem: Sized { - /// Construct a digest item which contains a slot number and a signature - /// on the hash. - fn babe_seal(signature: BabeSeal) -> Self; - - /// If this item is an Babe seal, return the slot number and signature. - fn as_babe_seal(&self) -> Option; -} - -impl CompatibleDigestItem for generic::DigestItem - where T: Debug, Hash: Debug -{ - /// Construct a digest item which contains a slot number and a signature - /// on the hash. - fn babe_seal(signature: BabeSeal) -> Self { - generic::DigestItem::Consensus(BABE_ENGINE_ID, signature.encode()) - } - - /// If this item is an BABE seal, return the slot number and signature. - fn as_babe_seal(&self) -> Option { - match self { - generic::DigestItem::Consensus(BABE_ENGINE_ID, seal) => { - match Decode::decode(&mut &seal[..]) { - s @ Some(_) => s, - s @ None => { - info!(target: "babe", "Failed to decode {:?}", seal); - s - } - } - } - _ => { - info!(target: "babe", "Invalid consensus: {:?}!", self); - None - } - } - } -} - struct BabeSlotCompatible; impl SlotCompatible for BabeSlotCompatible { @@ -243,12 +129,13 @@ impl SlotCompatible for BabeSlotCompatible { trace!(target: "babe", "extract timestamp"); data.timestamp_inherent_data() .and_then(|t| data.babe_inherent_data().map(|a| (t, a))) - .map_err(slots::inherent_to_common_error) + .map_err(Into::into) + .map_err(consensus_common::Error::InherentData) } } /// Parameters for BABE. -pub struct BabeParams { +pub struct BabeParams { /// The configuration for BABE. Includes the slot duration, threshold, and /// other parameters. @@ -272,9 +159,6 @@ pub struct BabeParams { /// A sync oracle pub sync_oracle: SO, - /// Exit callback. - pub on_exit: OnExit, - /// Providers for inherent data. pub inherent_data_providers: InherentDataProviders, @@ -283,7 +167,7 @@ pub struct BabeParams { } /// Start the babe worker. The returned future should be run in a tokio runtime. -pub fn start_babe(BabeParams { +pub fn start_babe(BabeParams { config, local_key, client, @@ -291,44 +175,41 @@ pub fn start_babe(BabeParams { block_import, env, sync_oracle, - on_exit, inherent_data_providers, force_authoring, -}: BabeParams) -> Result< +}: BabeParams) -> Result< impl Future, consensus_common::Error, > where - B: Block, + B: Block, C: ProvideRuntimeApi + ProvideCache, - C::Api: AuthoritiesApi, - E: Environment, + C::Api: BabeApi, + SC: SelectChain, E::Proposer: Proposer, <>::Create as IntoFuture>::Future: Send + 'static, + H: Header, + E: Environment, I: BlockImport + Send + Sync + 'static, + Error: std::error::Error + Send + From<::consensus_common::Error> + From + 'static, SO: SyncOracle + Send + Sync + Clone, - SC: SelectChain, - DigestItemFor: CompatibleDigestItem + DigestItem, - Error: ::std::error::Error + Send + From<::consensus_common::Error> + From + 'static, - OnExit: Future, { let worker = BabeWorker { client: client.clone(), block_import, env, local_key, - inherent_data_providers: inherent_data_providers.clone(), sync_oracle: sync_oracle.clone(), force_authoring, threshold: config.threshold(), }; - slots::start_slot_worker::<_, _, _, _, _, BabeSlotCompatible, _>( + register_babe_inherent_data_provider(&inherent_data_providers, config.0.slot_duration())?; + Ok(slots::start_slot_worker::<_, _, _, _, _, BabeSlotCompatible>( config.0, select_chain, - Arc::new(worker), + worker, sync_oracle, - on_exit, inherent_data_providers - ) + )) } struct BabeWorker { @@ -337,30 +218,26 @@ struct BabeWorker { env: Arc, local_key: Arc, sync_oracle: SO, - inherent_data_providers: InherentDataProviders, force_authoring: bool, threshold: u64, } -impl SlotWorker for BabeWorker where +impl SlotWorker for BabeWorker where + B: Block, C: ProvideRuntimeApi + ProvideCache, - C::Api: AuthoritiesApi, + C::Api: BabeApi, E: Environment, E::Proposer: Proposer, <>::Create as IntoFuture>::Future: Send + 'static, + Hash: Debug + Eq + Copy + SimpleBitOps + Encode + Decode + Serialize + + for<'de> Deserialize<'de> + Debug + Default + AsRef<[u8]> + AsMut<[u8]> + + std::hash::Hash + Display + Send + Sync + 'static, + H: Header, I: BlockImport + Send + Sync + 'static, SO: SyncOracle + Send + Clone, - DigestItemFor: CompatibleDigestItem + DigestItem, Error: std::error::Error + Send + From<::consensus_common::Error> + From + 'static, { - type OnSlot = Box + Send>; - - fn on_start( - &self, - slot_duration: u64 - ) -> Result<(), consensus_common::Error> { - register_babe_inherent_data_provider(&self.inherent_data_providers, slot_duration) - } + type OnSlot = Box + Send>; fn on_slot( &self, @@ -402,7 +279,7 @@ impl SlotWorker for BabeWorker whe // FIXME replace the dummy empty slices with real data // https://github.com/paritytech/substrate/issues/2435 // https://github.com/paritytech/substrate/issues/2436 - let authoring_result = if let Some((inout, proof, _batchable_proof)) = claim_slot( + let proposal_work = if let Some((inout, proof, _batchable_proof)) = claim_slot( &[0u8; 0], slot_info.number, &[0u8; 0], @@ -421,7 +298,7 @@ impl SlotWorker for BabeWorker whe ); // we are the slot author. make a block and sign it. - let proposer = match env.init(&chain_head, &authorities) { + let proposer = match env.init(&chain_head) { Ok(p) => p, Err(e) => { warn!(target: "babe", "Unable to author block in slot {:?}: {:?}", slot_num, e); @@ -432,144 +309,167 @@ impl SlotWorker for BabeWorker whe } }; + let inherent_digest = BabePreDigest { + proof, + vrf_output: inout.to_output(), + author: pair.public(), + slot_num, + }; + + // deadline our production to approx. the end of the slot let remaining_duration = slot_info.remaining_duration(); - // deadline our production to approx. the end of the - // slot - (Timeout::new( + Timeout::new( proposer.propose( slot_info.inherent_data, + generic::Digest { + logs: vec![ + generic::DigestItem::babe_pre_digest(inherent_digest.clone()), + ], + }, remaining_duration, ).into_future(), remaining_duration, - ), - inout.to_output(), - proof) + ) } else { return Box::new(future::ok(())); }; - let (proposal_work, vrf_output, proof) = authoring_result; - - Box::new( - proposal_work - .map(move |b| { - // minor hack since we don't have access to the timestamp - // that is actually set by the proposer. - let slot_after_building = slot_now(slot_duration); - if slot_after_building != Some(slot_num) { - info!( - target: "babe", - "Discarding proposal for slot {}; block production took too long", - slot_num - ); - telemetry!(CONSENSUS_INFO; "babe.discarding_proposal_took_too_long"; - "slot" => slot_num - ); - return - } - - let (header, body) = b.deconstruct(); - let header_num = header.number().clone(); - let pre_hash = header.hash(); - let parent_hash = header.parent_hash().clone(); - - // sign the pre-sealed hash of the block and then - // add it to a digest item. - let to_sign = (slot_num, pre_hash, proof.to_bytes()).encode(); - let signature = pair.sign(&to_sign[..]); - let item = as CompatibleDigestItem>::babe_seal(BabeSeal { - proof, - signature: LocalizedSignature { - signature, - signer: pair.public(), - }, - slot_num, - vrf_output, - }); - - let import_block: ImportBlock = ImportBlock { - origin: BlockOrigin::Own, - header, - justification: None, - post_digests: vec![item], - body: Some(body), - finalized: false, - auxiliary: Vec::new(), - fork_choice: ForkChoiceStrategy::LongestChain, - }; - - info!(target: "babe", - "Pre-sealed block for proposal at {}. Hash now {:?}, previously {:?}.", - header_num, - import_block.post_header().hash(), - pre_hash - ); - telemetry!(CONSENSUS_INFO; "babe.pre_sealed_block"; - "header_num" => ?header_num, - "hash_now" => ?import_block.post_header().hash(), - "hash_previously" => ?pre_hash - ); + Box::new(proposal_work.map(move |b| { + // minor hack since we don't have access to the timestamp + // that is actually set by the proposer. + let slot_after_building = SignedDuration::default().slot_now(slot_duration); + if slot_after_building != slot_num { + info!( + target: "babe", + "Discarding proposal for slot {}; block production took too long", + slot_num + ); + telemetry!(CONSENSUS_INFO; "babe.discarding_proposal_took_too_long"; + "slot" => slot_num + ); + return + } - if let Err(e) = block_import.import_block(import_block, Default::default()) { - warn!(target: "babe", "Error with block built on {:?}: {:?}", - parent_hash, e); - telemetry!(CONSENSUS_WARN; "babe.err_with_block_built_on"; - "hash" => ?parent_hash, "err" => ?e - ); - } - }) - .map_err(|e| { - warn!("Client import failed: {:?}", e); - consensus_common::ErrorKind::ClientImport(format!("{:?}", e)).into() - }) - ) + let (header, body) = b.deconstruct(); + let pre_digest: Result = find_pre_digest::(&header); + if let Err(e) = pre_digest { + error!(target: "babe", "FATAL ERROR: Invalid pre-digest: {}!", e); + return + } else { + trace!(target: "babe", "Got correct number of seals. Good!") + }; + + let header_num = header.number().clone(); + let parent_hash = header.parent_hash().clone(); + + // sign the pre-sealed hash of the block and then + // add it to a digest item. + let header_hash = header.hash(); + let signature = pair.sign(header_hash.as_ref()); + let signature_digest_item = DigestItemFor::::babe_seal(signature); + + let import_block: ImportBlock = ImportBlock { + origin: BlockOrigin::Own, + header, + justification: None, + post_digests: vec![signature_digest_item], + body: Some(body), + finalized: false, + auxiliary: Vec::new(), + fork_choice: ForkChoiceStrategy::LongestChain, + }; + + info!(target: "babe", + "Pre-sealed block for proposal at {}. Hash now {:?}, previously {:?}.", + header_num, + import_block.post_header().hash(), + header_hash, + ); + telemetry!(CONSENSUS_INFO; "babe.pre_sealed_block"; + "header_num" => ?header_num, + "hash_now" => ?import_block.post_header().hash(), + "hash_previously" => ?header_hash, + ); + + if let Err(e) = block_import.import_block(import_block, Default::default()) { + warn!(target: "babe", "Error with block built on {:?}: {:?}", + parent_hash, e); + telemetry!(CONSENSUS_WARN; "babe.err_with_block_built_on"; + "hash" => ?parent_hash, "err" => ?e + ); + } + }).map_err(|e| { + warn!("Client import failed: {:?}", e); + consensus_common::Error::ClientImport(format!("{:?}", e)).into() + })) } } +macro_rules! babe_err { + ($($i: expr),+) => { + { debug!(target: "babe", $($i),+) + ; format!($($i),+) + } + }; +} + +fn find_pre_digest(header: &B::Header) -> Result + where DigestItemFor: CompatibleDigestItem, +{ + let mut pre_digest: Option<_> = None; + for log in header.digest().logs() { + trace!(target: "babe", "Checking log {:?}", log); + match (log.as_babe_pre_digest(), pre_digest.is_some()) { + (Some(_), true) => Err(babe_err!("Multiple BABE pre-runtime headers, rejecting!"))?, + (None, _) => trace!(target: "babe", "Ignoring digest not meant for us"), + (s, false) => pre_digest = s, + } + } + pre_digest.ok_or_else(|| babe_err!("No BABE pre-runtime digest found")) +} + /// check a header has been signed by the right key. If the slot is too far in /// the future, an error will be returned. If successful, returns the pre-header /// and the digest item containing the seal. /// -/// This digest item will always return `Some` when used with `as_babe_seal`. +/// The seal must be the last digest. Otherwise, the whole header is considered +/// unsigned. This is required for security and must not be changed. +/// +/// This digest item will always return `Some` when used with `as_babe_pre_digest`. // // FIXME #1018 needs misbehavior types -#[forbid(warnings)] -fn check_header( +fn check_header( + client: &C, slot_now: u64, mut header: B::Header, hash: B::Hash, - authorities: &[Public], + authorities: &[AuthorityId], threshold: u64, -) -> Result>, String> +) -> Result, DigestItemFor)>, String> where DigestItemFor: CompatibleDigestItem, { trace!(target: "babe", "Checking header"); - let digest_item = match header.digest_mut().pop() { + let seal = match header.digest_mut().pop() { Some(x) => x, - None => return Err(format!("Header {:?} is unsealed", hash)), + None => return Err(babe_err!("Header {:?} is unsealed", hash)), }; - let BabeSeal { - slot_num, - signature: LocalizedSignature {signer, signature }, - proof, - vrf_output, - } = digest_item.as_babe_seal().ok_or_else(|| { - debug!(target: "babe", "Header {:?} is unsealed", hash); - format!("Header {:?} is unsealed", hash) + let sig = seal.as_babe_seal().ok_or_else(|| { + babe_err!("Header {:?} has a bad seal", hash) })?; + let pre_digest = find_pre_digest::(&header)?; + let BabePreDigest { slot_num, ref author, ref proof, ref vrf_output } = pre_digest; + if slot_num > slot_now { - header.digest_mut().push(digest_item); + header.digest_mut().push(seal); Ok(CheckedHeader::Deferred(header, slot_num)) - } else if !authorities.contains(&signer) { - debug!(target: "babe", "Slot Author not found"); - Err("Slot Author not found".to_string()) + } else if !authorities.contains(&author) { + Err(babe_err!("Slot author not found")) } else { let pre_hash = header.hash(); - let to_sign = (slot_num, pre_hash, proof.to_bytes()).encode(); - if sr25519::Pair::verify(&signature, &to_sign[..], &signer) { + if sr25519::Pair::verify(&sig, pre_hash, author) { let (inout, _batchable_proof) = { let transcript = make_transcript( Default::default(), @@ -577,35 +477,51 @@ fn check_header( Default::default(), 0, ); - schnorrkel::PublicKey::from_bytes(signer.as_slice()).and_then(|p| { - p.vrf_verify(transcript, &vrf_output, &proof) + schnorrkel::PublicKey::from_bytes(author.as_slice()).and_then(|p| { + p.vrf_verify(transcript, vrf_output, proof) }).map_err(|s| { - debug!(target: "babe", "VRF verification failed: {:?}", s); - format!("VRF verification failed") + babe_err!("VRF verification failed: {:?}", s) })? }; - if check(&inout, threshold) { - Ok(CheckedHeader::Checked(header, digest_item)) - } else { - debug!(target: "babe", "VRF verification failed: threshold {} exceeded", threshold); - Err(format!("Validator {:?} made seal when it wasn’t its turn", signer)) + + if !check(&inout, threshold) { + return Err(babe_err!("VRF verification of block by author {:?} failed: \ + threshold {} exceeded", author, threshold)); + } + + if let Some(equivocation_proof) = check_equivocation( + client, + slot_now, + slot_num, + &header, + author, + ).map_err(|e| e.to_string())? { + info!( + "Slot author {:?} is equivocating at slot {} with headers {:?} and {:?}", + author, + slot_num, + equivocation_proof.fst_header().hash(), + equivocation_proof.snd_header().hash(), + ); } + + let pre_digest = CompatibleDigestItem::babe_pre_digest(pre_digest); + Ok(CheckedHeader::Checked(header, (pre_digest, seal))) } else { - debug!(target: "babe", "Bad signature on {:?}", hash); - Err(format!("Bad signature on {:?}", hash)) + Err(babe_err!("Bad signature on {:?}", hash)) } } } /// A verifier for Babe blocks. -pub struct BabeVerifier { +pub struct BabeVerifier { client: Arc, - extra: E, inherent_data_providers: inherents::InherentDataProviders, - threshold: u64, + config: Config, + timestamps: Mutex<(Option, Vec<(Instant, u64)>)>, } -impl BabeVerifier { +impl BabeVerifier { fn check_inherents( &self, block: B, @@ -630,24 +546,42 @@ impl BabeVerifier { } } -/// No-op extra verification. -#[derive(Debug, Clone, Copy)] -pub struct NothingExtra; - -impl ExtraVerification for NothingExtra { - type Verified = Result<(), String>; - - fn verify(&self, _: &B::Header, _: Option<&[B::Extrinsic]>) -> Self::Verified { - Ok(()) +fn median_algorithm( + median_required_blocks: u64, + slot_duration: u64, + slot_num: u64, + slot_now: u64, + timestamps: &mut (Option, Vec<(Instant, u64)>), +) { + let num_timestamps = timestamps.1.len(); + if num_timestamps as u64 >= median_required_blocks && median_required_blocks > 0 { + let mut new_list: Vec<_> = timestamps.1.iter().map(|&(t, sl)| { + let offset: u128 = u128::from(slot_duration) + .checked_mul(1_000_000u128) // self.config.get() returns *milliseconds* + .and_then(|x| x.checked_mul(u128::from(slot_num).saturating_sub(u128::from(sl)))) + .expect("we cannot have timespans long enough for this to overflow; qed"); + const NANOS_PER_SEC: u32 = 1_000_000_000; + let nanos = (offset % u128::from(NANOS_PER_SEC)) as u32; + let secs = (offset / u128::from(NANOS_PER_SEC)) as u64; + t + Duration::new(secs, nanos) + }).collect(); + // FIXME #2926: use a selection algorithm instead of a full sorting algorithm. + new_list.sort_unstable(); + let &median = new_list + .get(num_timestamps / 2) + .expect("we have at least one timestamp, so this is a valid index; qed"); + timestamps.1.clear(); + // FIXME #2927: pass this to the block authoring logic somehow + timestamps.0.replace(Instant::now() - median); + } else { + timestamps.1.push((Instant::now(), slot_now)) } } -impl Verifier for BabeVerifier where - C: ProvideRuntimeApi + Send + Sync, - C::Api: BlockBuilderApi, - DigestItemFor: CompatibleDigestItem + DigestItem, - E: ExtraVerification, - Self: Authorities, +impl Verifier for BabeVerifier where + C: ProvideRuntimeApi + Send + Sync + AuxStore + ProvideCache, + C::Api: BlockBuilderApi + BabeApi, + DigestItemFor: CompatibleDigestItem, { fn verify( &self, @@ -655,7 +589,7 @@ impl Verifier for BabeVerifier where header: B::Header, justification: Option, mut body: Option>, - ) -> Result<(ImportBlock, Option>), String> { + ) -> Result<(ImportBlock, Option)>>), String> { trace!( target: "babe", "Verifying origin: {:?} header: {:?} justification: {:?} body: {:?}", @@ -664,6 +598,8 @@ impl Verifier for BabeVerifier where justification, body, ); + + debug!(target: "babe", "We have {:?} logs in this header", header.digest().logs().len()); let mut inherent_data = self .inherent_data_providers .create_inherent_data() @@ -672,28 +608,24 @@ impl Verifier for BabeVerifier where .map_err(|e| format!("Could not extract timestamp and slot: {:?}", e))?; let hash = header.hash(); let parent_hash = *header.parent_hash(); - let authorities = self.authorities(&BlockId::Hash(parent_hash)) + let authorities = authorities(self.client.as_ref(), &BlockId::Hash(parent_hash)) .map_err(|e| format!("Could not fetch authorities at {:?}: {:?}", parent_hash, e))?; - let extra_verification = self.extra.verify( - &header, - body.as_ref().map(|x| &x[..]), - ); - // we add one to allow for some small drift. // FIXME #1019 in the future, alter this queue to allow deferring of // headers - let checked_header = check_header::( + let checked_header = check_header::( + &self.client, slot_now + 1, header, hash, &authorities[..], - self.threshold, + self.config.threshold(), )?; match checked_header { - CheckedHeader::Checked(pre_header, seal) => { - let BabeSeal { slot_num, .. } = seal.as_babe_seal() - .expect("check_header always returns a seal digest item; qed"); + CheckedHeader::Checked(pre_header, (pre_digest, seal)) => { + let BabePreDigest { slot_num, .. } = pre_digest.as_babe_pre_digest() + .expect("check_header always returns a pre-digest digest item; qed"); // if the body is passed through, we need to use the runtime // to check that the internally-set timestamp in the inherents @@ -718,7 +650,12 @@ impl Verifier for BabeVerifier where "babe.checked_and_importing"; "pre_header" => ?pre_header); - extra_verification.into_future().wait()?; + // `Consensus` is the Babe-specific authorities change log. + // It's an encoded `Vec`, the same format as is stored in the cache, + // so no need to decode/re-encode. + let maybe_keys = pre_header.digest() + .log(|l| l.try_as_raw(OpaqueDigestItemId::Consensus(&BABE_ENGINE_ID))) + .map(|blob| vec![(well_known_cache_keys::AUTHORITIES, blob.to_vec())]); let import_block = ImportBlock { origin, @@ -730,9 +667,15 @@ impl Verifier for BabeVerifier where auxiliary: Vec::new(), fork_choice: ForkChoiceStrategy::LongestChain, }; - + median_algorithm( + self.config.0.median_required_blocks, + self.config.get(), + slot_num, + slot_now, + &mut *self.timestamps.lock(), + ); // FIXME #1019 extract authorities - Ok((import_block, None)) + Ok((import_block, maybe_keys)) } CheckedHeader::Deferred(a, b) => { debug!(target: "babe", "Checking {:?} failed; {:?}, {:?}.", hash, a, b); @@ -745,38 +688,26 @@ impl Verifier for BabeVerifier where } } -impl Authorities for BabeVerifier where - B: Block, - C: ProvideRuntimeApi + ProvideCache, - C::Api: AuthoritiesApi, -{ - type Error = ConsensusError; - - fn authorities(&self, at: &BlockId) -> Result>, Self::Error> { - authorities(self.client.as_ref(), at) - } -} - fn authorities(client: &C, at: &BlockId) -> Result< - Vec>, + Vec, ConsensusError, > where B: Block, C: ProvideRuntimeApi + ProvideCache, - C::Api: AuthoritiesApi, + C::Api: BabeApi, { client .cache() .and_then(|cache| cache.get_at(&well_known_cache_keys::AUTHORITIES, at) .and_then(|v| Decode::decode(&mut &v[..]))) .or_else(|| { - if client.runtime_api().has_api::>(at).unwrap_or(false) { - AuthoritiesApi::authorities(&*client.runtime_api(), at).ok() + if client.runtime_api().has_api::>(at).unwrap_or(false) { + BabeApi::authorities(&*client.runtime_api(), at).ok() } else { panic!("We don’t support deprecated code with new consensus algorithms, \ therefore this is unreachable; qed") } - }).ok_or_else(|| consensus_common::ErrorKind::InvalidAuthoritiesSet.into()) + }).ok_or(consensus_common::Error::InvalidAuthoritiesSet) } /// The BABE import queue type. @@ -791,7 +722,8 @@ fn register_babe_inherent_data_provider( if !inherent_data_providers.has_provider(&srml_babe::INHERENT_IDENTIFIER) { inherent_data_providers .register_provider(srml_babe::InherentDataProvider::new(slot_duration)) - .map_err(inherent_to_common_error) + .map_err(Into::into) + .map_err(consensus_common::Error::InherentData) } else { Ok(()) } @@ -801,6 +733,7 @@ fn get_keypair(q: &sr25519::Pair) -> &Keypair { q.as_ref() } +#[allow(deprecated)] fn make_transcript( randomness: &[u8], slot_number: u64, @@ -829,7 +762,7 @@ fn claim_slot( slot_number: u64, genesis_hash: &[u8], epoch: u64, - authorities: &[sr25519::Public], + authorities: &[AuthorityId], key: &sr25519::Pair, threshold: u64, ) -> Option<(VRFInOut, VRFProof, VRFProofBatchable)> { @@ -850,9 +783,76 @@ fn claim_slot( get_keypair(key).vrf_sign_n_check(transcript, |inout| check(inout, threshold)) } +fn initialize_authorities_cache(client: &C) -> Result<(), ConsensusError> where + B: Block, + C: ProvideRuntimeApi + ProvideCache, + C::Api: BabeApi, +{ + // no cache => no initialization + let cache = match client.cache() { + Some(cache) => cache, + None => return Ok(()), + }; + + // check if we already have initialized the cache + let genesis_id = BlockId::Number(Zero::zero()); + let genesis_authorities: Option> = cache + .get_at(&well_known_cache_keys::AUTHORITIES, &genesis_id) + .and_then(|v| Decode::decode(&mut &v[..])); + if genesis_authorities.is_some() { + return Ok(()); + } + + let map_err = |error| consensus_common::Error::from(consensus_common::Error::ClientImport( + format!( + "Error initializing authorities cache: {}", + error, + ))); + let genesis_authorities = authorities(client, &genesis_id)?; + cache.initialize(&well_known_cache_keys::AUTHORITIES, genesis_authorities.encode()) + .map_err(map_err) +} + +/// Start an import queue for the Babe consensus algorithm. +pub fn import_queue( + config: Config, + block_import: SharedBlockImport, + justification_import: Option>, + finality_proof_import: Option>, + finality_proof_request_builder: Option>, + client: Arc, + inherent_data_providers: InherentDataProviders, +) -> Result, consensus_common::Error> where + B: Block, + C: 'static + ProvideRuntimeApi + ProvideCache + Send + Sync + AuxStore, + C::Api: BlockBuilderApi + BabeApi, + DigestItemFor: CompatibleDigestItem, + E: 'static, +{ + register_babe_inherent_data_provider(&inherent_data_providers, config.get())?; + initialize_authorities_cache(&*client)?; + + let verifier = Arc::new( + BabeVerifier { + client: client, + inherent_data_providers, + timestamps: Default::default(), + config, + } + ); + Ok(BasicQueue::new( + verifier, + block_import, + justification_import, + finality_proof_import, + finality_proof_request_builder, + )) +} + #[cfg(test)] #[allow(dead_code, unused_imports, deprecated)] -// FIXME #2532: need to allow deprecated until refactor is done https://github.com/paritytech/substrate/issues/2532 +// FIXME #2532: need to allow deprecated until refactor is done +// https://github.com/paritytech/substrate/issues/2532 mod tests { use super::*; @@ -861,16 +861,18 @@ mod tests { use consensus_common::NoNetwork as DummyOracle; use network::test::*; use network::test::{Block as TestBlock, PeersClient}; - use runtime_primitives::traits::Block as BlockT; + use runtime_primitives::traits::{Block as BlockT, DigestFor}; use network::config::ProtocolConfig; - use parking_lot::Mutex; use tokio::runtime::current_thread; use keyring::sr25519::Keyring; + use super::generic::DigestItem; use client::BlockchainEvents; use test_client; use futures::stream::Stream; use log::debug; use std::time::Duration; + type Item = generic::DigestItem; + use test_client::AuthorityKeyring; type Error = client::error::Error; @@ -888,7 +890,7 @@ mod tests { type Proposer = DummyProposer; type Error = Error; - fn init(&self, parent_header: &::Header, _authorities: &[Public]) + fn init(&self, parent_header: &::Header) -> Result { Ok(DummyProposer(parent_header.number + 1, self.0.clone())) @@ -899,8 +901,8 @@ mod tests { type Error = Error; type Create = Result; - fn propose(&self, _: InherentData, _: Duration) -> Result { - self.1.new_block().unwrap().bake().map_err(|e| e.into()) + fn propose(&self, _: InherentData, digests: DigestFor, _: Duration) -> Result { + self.1.new_block(digests).unwrap().bake().map_err(|e| e.into()) } } @@ -914,7 +916,7 @@ mod tests { impl TestNetFactory for BabeTestNet { type Specialization = DummySpecialization; - type Verifier = BabeVerifier; + type Verifier = BabeVerifier; type PeerData = (); /// Create new test network with peers and given config. @@ -926,9 +928,10 @@ mod tests { } } - fn make_verifier(&self, client: Arc, _cfg: &ProtocolConfig) + fn make_verifier(&self, client: PeersClient, _cfg: &ProtocolConfig) -> Arc { + let client = client.as_full().expect("only full clients are used in test"); trace!(target: "babe", "Creating a verifier"); let config = Config::get_or_compute(&*client) .expect("slot duration available"); @@ -942,12 +945,16 @@ mod tests { assert_eq!(config.get(), SLOT_DURATION); Arc::new(BabeVerifier { client, - extra: NothingExtra, inherent_data_providers, - threshold: config.threshold(), + config, + timestamps: Default::default(), }) } + fn uses_tokio(&self) -> bool { + true + } + fn peer(&self, i: usize) -> &Peer { trace!(target: "babe", "Retreiving a peer"); &self.peers[i] @@ -977,7 +984,7 @@ mod tests { #[test] fn can_serialize_block() { drop(env_logger::try_init()); - assert!(BabeSeal::decode(&mut &b""[..]).is_none()); + assert!(BabePreDigest::decode(&mut &b""[..]).is_none()); } #[test] @@ -1001,7 +1008,7 @@ mod tests { debug!(target: "babe", "checkpoint 4"); let mut runtime = current_thread::Runtime::new().unwrap(); for (peer_id, key) in peers { - let client = net.lock().peer(*peer_id).client().clone(); + let client = net.lock().peer(*peer_id).client().as_full().unwrap(); let environ = Arc::new(DummyFactory(client.clone())); import_notifications.push( client.import_notification_stream() @@ -1017,15 +1024,18 @@ mod tests { &inherent_data_providers, config.get() ).expect("Registers babe inherent data provider"); + + #[allow(deprecated)] + let select_chain = LongestChain::new(client.backend().clone()); + let babe = start_babe(BabeParams { config, local_key: Arc::new(key.clone().into()), block_import: client.clone(), - select_chain: LongestChain::new(client.backend().clone(), client.import_lock().clone()), + select_chain, client, env: environ.clone(), sync_oracle: DummyOracle, - on_exit: futures::empty(), inherent_data_providers, force_authoring: false, }).expect("Starts babe"); @@ -1039,7 +1049,7 @@ mod tests { .map(drop) .map_err(drop); - let drive_to_completion = ::tokio::timer::Interval::new_interval(TEST_ROUTING_INTERVAL) + let drive_to_completion = ::tokio_timer::Interval::new_interval(TEST_ROUTING_INTERVAL) .for_each(move |_| { net.lock().send_import_notifications(); net.lock().sync_without_disconnects(); @@ -1048,37 +1058,39 @@ mod tests { .map(drop) .map_err(drop); - runtime.block_on(wait_for.select(drive_to_completion).map_err(drop)).unwrap(); + let _ = runtime.block_on(wait_for.select(drive_to_completion).map_err(drop)).unwrap(); } #[test] - #[allow(deprecated)] - #[should_panic] - fn old_seals_rejected() { + fn wrong_consensus_engine_id_rejected() { drop(env_logger::try_init()); - generic::DigestItem::::Seal(0, Signature([0; 64])).as_babe_seal().unwrap(); + let sig = sr25519::Pair::generate().0.sign(b""); + let bad_seal: Item = DigestItem::Seal([0; 4], sig.0.to_vec()); + assert!(bad_seal.as_babe_pre_digest().is_none()); + assert!(bad_seal.as_babe_seal().is_none()) } #[test] - fn wrong_number_rejected() { + fn malformed_pre_digest_rejected() { drop(env_logger::try_init()); - let bad_seal = generic::DigestItem::::Consensus([0; 4], Signature([0; 64]).encode()); - assert!(bad_seal.as_babe_seal().is_none()) + let bad_seal: Item = DigestItem::Seal(BABE_ENGINE_ID, [0; 64].to_vec()); + assert!(bad_seal.as_babe_pre_digest().is_none()); } #[test] - #[should_panic] - fn bad_seal_rejected() { + fn sig_is_not_pre_digest() { drop(env_logger::try_init()); - let bad_seal = generic::DigestItem::::Consensus(BABE_ENGINE_ID, Signature([0; 64]).encode()); - bad_seal.as_babe_seal().expect("we should not decode this successfully"); + let sig = sr25519::Pair::generate().0.sign(b""); + let bad_seal: Item = DigestItem::Seal(BABE_ENGINE_ID, sig.0.to_vec()); + assert!(bad_seal.as_babe_pre_digest().is_none()); + assert!(bad_seal.as_babe_seal().is_some()) } #[test] fn can_author_block() { drop(env_logger::try_init()); let randomness = &[]; - let pair = sr25519::Pair::generate(); + let (pair, _) = sr25519::Pair::generate(); let mut i = 0; loop { match claim_slot(randomness, i, &[], 0, &[pair.public()], &pair, u64::MAX / 10) { @@ -1096,7 +1108,7 @@ mod tests { drop(env_logger::try_init()); let client = test_client::new(); - assert_eq!(client.info().unwrap().chain.best_number, 0); + assert_eq!(client.info().chain.best_number, 0); assert_eq!(authorities(&client, &BlockId::Number(0)).unwrap(), vec![ Keyring::Alice.into(), Keyring::Bob.into(), diff --git a/core/consensus/common/Cargo.toml b/core/consensus/common/Cargo.toml index 52a2c6a1c4b7f4a8dd148ed6374d51134a07ed47..c1a847da74fef5f27d705b43ee45792d9b3fa576 100644 --- a/core/consensus/common/Cargo.toml +++ b/core/consensus/common/Cargo.toml @@ -6,20 +6,22 @@ description = "Common utilities for substrate consensus" edition = "2018" [dependencies] -crossbeam-channel = "0.3.4" -libp2p = { version = "0.7.0", default-features = false } +derive_more = "0.14.0" +libp2p = { version = "0.9.0", default-features = false } log = "0.4" primitives = { package = "substrate-primitives", path= "../../primitives" } inherents = { package = "substrate-inherents", path = "../../inherents" } -error-chain = "0.12" futures = "0.1" +rstd = { package = "sr-std", path = "../../sr-std" } runtime_version = { package = "sr-version", path = "../../sr-version" } runtime_primitives = { package = "sr-primitives", path = "../../sr-primitives" } +tokio-executor = "0.1.6" tokio-timer = "0.2" parity-codec = { version = "3.3", features = ["derive"] } +parking_lot = "0.8.0" [dev-dependencies] -test_client = { package = "substrate-test-client", path = "../../test-client" } +test-client = { package = "substrate-test-runtime-client", path = "../../test-runtime/client" } [features] default = [] diff --git a/core/consensus/common/src/block_import.rs b/core/consensus/common/src/block_import.rs index 7debe1acfec7fd89d76e3026cbaf1f8979f76f49..6ce4acdf3941a64e1155af82c5ac3ea9927563a5 100644 --- a/core/consensus/common/src/block_import.rs +++ b/core/consensus/common/src/block_import.rs @@ -22,6 +22,8 @@ use std::borrow::Cow; use std::collections::HashMap; use crate::well_known_cache_keys; +use crate::import_queue::Verifier; + /// Block import result. #[derive(Debug, PartialEq, Eq)] pub enum ImportResult { @@ -44,6 +46,8 @@ pub struct ImportedAux { pub needs_justification: bool, /// Received a bad justification. pub bad_justification: bool, + /// Request a finality proof for the given block. + pub needs_finality_proof: bool, } impl Default for ImportedAux { @@ -52,6 +56,7 @@ impl Default for ImportedAux { clear_justification_requests: false, needs_justification: false, bad_justification: false, + needs_finality_proof: false, } } } @@ -149,8 +154,6 @@ impl ImportBlock { /// Get a handle to full header (with post-digests applied). pub fn post_header(&self) -> Cow { - use runtime_primitives::traits::Digest; - if self.post_digests.is_empty() { Cow::Borrowed(&self.header) } else { @@ -192,7 +195,7 @@ pub trait JustificationImport { type Error: ::std::error::Error + Send + 'static; /// Called by the import queue when it is started. - fn on_start(&self, _link: &crate::import_queue::Link) { } + fn on_start(&self, _link: &mut dyn crate::import_queue::Link) { } /// Import a Block justification and finalize the given block. fn import_justification( @@ -202,3 +205,26 @@ pub trait JustificationImport { justification: Justification, ) -> Result<(), Self::Error>; } + +/// Finality proof import trait. +pub trait FinalityProofImport { + type Error: std::error::Error + Send + 'static; + + /// Called by the import queue when it is started. + fn on_start(&self, _link: &mut dyn crate::import_queue::Link) { } + + /// Import a Block justification and finalize the given block. Returns finalized block or error. + fn import_finality_proof( + &self, + hash: B::Hash, + number: NumberFor, + finality_proof: Vec, + verifier: &dyn Verifier, + ) -> Result<(B::Hash, NumberFor), Self::Error>; +} + +/// Finality proof request builder. +pub trait FinalityProofRequestBuilder: Send { + /// Build data blob, associated with the request. + fn build_request_data(&self, hash: &B::Hash) -> Vec; +} diff --git a/core/consensus/common/src/error.rs b/core/consensus/common/src/error.rs index 71517c544062e5790c9d6677c4f5d27feeb5aa97..d8683d0b685472de860b405aef7c728e71a84704 100644 --- a/core/consensus/common/src/error.rs +++ b/core/consensus/common/src/error.rs @@ -16,100 +16,69 @@ //! Error types in Consensus use runtime_version::RuntimeVersion; -use error_chain::{error_chain, error_chain_processing, impl_error_chain_processed, - impl_extract_backtrace, impl_error_chain_kind}; use primitives::ed25519::{Public, Signature}; +use std::error; + +/// Result type alias. +pub type Result = std::result::Result; + +/// Error type. +#[derive(Debug, derive_more::Display, derive_more::From)] +pub enum Error { + /// Missing state at block with given descriptor. + #[display(fmt="State unavailable at block {}", _0)] + StateUnavailable(String), + /// I/O terminated unexpectedly + #[display(fmt="I/O terminated unexpectedly.")] + IoTerminated, + /// Unable to schedule wakeup. + #[display(fmt="Timer error: {}", _0)] + FaultyTimer(tokio_timer::Error), + /// Error while working with inherent data. + #[display(fmt="InherentData error: {}", _0)] + InherentData(String), + /// Unable to propose a block. + #[display(fmt="Unable to create block proposal.")] + CannotPropose, + /// Error checking signature + #[display(fmt="Message signature {:?} by {:?} is invalid.", _0, _1)] + InvalidSignature(Signature, Public), + /// Invalid authorities set received from the runtime. + #[display(fmt="Current state of blockchain has invalid authorities set")] + InvalidAuthoritiesSet, + /// Account is not an authority. + #[display(fmt="Message sender {:?} is not a valid authority.", _0)] + InvalidAuthority(Public), + /// Authoring interface does not match the runtime. + #[display(fmt="Authoring for current \ + runtime is not supported. Native ({}) cannot author for on-chain ({}).", native, on_chain)] + IncompatibleAuthoringRuntime { native: RuntimeVersion, on_chain: RuntimeVersion }, + /// Authoring interface does not match the runtime. + #[display(fmt="Authoring for current runtime is not supported since it has no version.")] + RuntimeVersionMissing, + /// Authoring interface does not match the runtime. + #[display(fmt="Authoring in current build is not supported since it has no runtime.")] + NativeRuntimeMissing, + /// Justification requirements not met. + #[display(fmt="Invalid justification.")] + InvalidJustification, + /// Some other error. + #[display(fmt="Other error: {}", _0)] + Other(Box), + /// Error from the client while importing + #[display(fmt="Import failed: {}", _0)] + ClientImport(String), + /// Error from the client while importing + #[display(fmt="Chain lookup failed: {}", _0)] + ChainLookup(String), +} -error_chain! { - errors { - /// Missing state at block with given descriptor. - StateUnavailable(b: String) { - description("State missing at given block."), - display("State unavailable at block {}", b), - } - - /// I/O terminated unexpectedly - IoTerminated { - description("I/O terminated unexpectedly."), - display("I/O terminated unexpectedly."), - } - - /// Unable to schedule wakeup. - FaultyTimer(e: ::tokio_timer::Error) { - description("Timer error"), - display("Timer error: {}", e), - } - - /// Error while working with inherent data. - InherentData(e: String) { - description("InherentData error"), - display("InherentData error: {}", e), - } - - /// Unable to propose a block. - CannotPropose { - description("Unable to create block proposal."), - display("Unable to create block proposal."), - } - - /// Error checking signature - InvalidSignature(s: Signature, a: Public) { - description("Message signature is invalid"), - display("Message signature {:?} by {:?} is invalid.", s, a), - } - - /// Invalid authorities set received from the runtime. - InvalidAuthoritiesSet { - description("authorities set is invalid"), - display("Current state of blockchain has invalid authorities set"), - } - - /// Account is not an authority. - InvalidAuthority(a: Public) { - description("Message sender is not a valid authority"), - display("Message sender {:?} is not a valid authority.", a), - } - - /// Authoring interface does not match the runtime. - IncompatibleAuthoringRuntime(native: RuntimeVersion, on_chain: RuntimeVersion) { - description("Authoring for current runtime is not supported"), - display("Authoring for current runtime is not supported. Native ({}) cannot author for on-chain ({}).", native, on_chain), - } - - /// Authoring interface does not match the runtime. - RuntimeVersionMissing { - description("Current runtime has no version"), - display("Authoring for current runtime is not supported since it has no version."), - } - - /// Authoring interface does not match the runtime. - NativeRuntimeMissing { - description("This build has no native runtime"), - display("Authoring in current build is not supported since it has no runtime."), - } - - /// Justification requirements not met. - InvalidJustification { - description("Invalid justification"), - display("Invalid justification."), - } - - /// Some other error. - Other(e: Box<::std::error::Error + Send>) { - description("Other error") - display("Other error: {}", e.description()) - } - - /// Error from the client while importing - ClientImport(reason: String) { - description("Import failed"), - display("Import failed: {}", reason), - } - - /// Error from the client while importing - ChainLookup(reason: String) { - description("Looking up chain failed"), - display("Chain lookup failed: {}", reason), +impl error::Error for Error { + fn source(&self) -> Option<&(dyn error::Error + 'static)> { + match self { + Error::FaultyTimer(ref err) => Some(err), + Error::Other(ref err) => Some(&**err), + _ => None, } } } diff --git a/core/consensus/common/src/evaluation.rs b/core/consensus/common/src/evaluation.rs index 48016b1e94c93f0b55e8806d8e28cdcc79e6a6bc..ed7515a419194c1cc8ea651a903d89650f03373e 100644 --- a/core/consensus/common/src/evaluation.rs +++ b/core/consensus/common/src/evaluation.rs @@ -19,36 +19,37 @@ use super::MAX_BLOCK_SIZE; use parity_codec::Encode; -use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, As}; -use error_chain::{error_chain, error_chain_processing, impl_error_chain_processed, - impl_extract_backtrace, impl_error_chain_kind, bail}; - -type BlockNumber = u64; - -error_chain! { - errors { - BadProposalFormat { - description("Proposal provided not a block."), - display("Proposal provided not a block."), - } - WrongParentHash(expected: String, got: String) { - description("Proposal had wrong parent hash."), - display("Proposal had wrong parent hash. Expected {:?}, got {:?}", expected, got), - } - WrongNumber(expected: BlockNumber, got: BlockNumber) { - description("Proposal had wrong number."), - display("Proposal had wrong number. Expected {}, got {}", expected, got), - } - ProposalTooLarge(size: usize) { - description("Proposal exceeded the maximum size."), - display( - "Proposal exceeded the maximum size of {} by {} bytes.", - MAX_BLOCK_SIZE, size.saturating_sub(MAX_BLOCK_SIZE) - ), - } - } +use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, One, CheckedConversion}; + +// This is just a best effort to encode the number. None indicated that it's too big to encode +// in a u128. +type BlockNumber = Option; + +/// Result type alias. +pub type Result = std::result::Result; + +/// Error type. +#[derive(Debug, derive_more::Display)] +pub enum Error { + /// Proposal provided not a block. + #[display(fmt="Proposal provided not a block.")] + BadProposalFormat, + /// Proposal had wrong parent hash. + #[display(fmt="Proposal had wrong parent hash. Expected {:?}, got {:?}", expected, got)] + WrongParentHash { expected: String, got: String }, + /// Proposal had wrong number. + #[display(fmt="Proposal had wrong number. Expected {:?}, got {:?}", expected, got)] + WrongNumber { expected: BlockNumber, got: BlockNumber }, + /// Proposal exceeded the maximum size. + #[display( + fmt="Proposal exceeded the maximum size of {} by {} bytes.", + "MAX_BLOCK_SIZE", "_0.saturating_sub(MAX_BLOCK_SIZE)" + )] + ProposalTooLarge(usize), } +impl std::error::Error for Error {} + /// Attempt to evaluate a substrate block as a node block, returning error /// upon any initial validity checks failing. pub fn evaluate_initial( @@ -59,21 +60,24 @@ pub fn evaluate_initial( let encoded = Encode::encode(proposal); let proposal = Block::decode(&mut &encoded[..]) - .ok_or_else(|| ErrorKind::BadProposalFormat)?; + .ok_or_else(|| Error::BadProposalFormat)?; if encoded.len() > MAX_BLOCK_SIZE { - bail!(ErrorKind::ProposalTooLarge(encoded.len())) + return Err(Error::ProposalTooLarge(encoded.len())) } if *parent_hash != *proposal.header().parent_hash() { - bail!(ErrorKind::WrongParentHash( - format!("{:?}", *parent_hash), - format!("{:?}", proposal.header().parent_hash()) - )); + return Err(Error::WrongParentHash { + expected: format!("{:?}", *parent_hash), + got: format!("{:?}", proposal.header().parent_hash()) + }); } - if parent_number.as_() + 1 != proposal.header().number().as_() { - bail!(ErrorKind::WrongNumber(parent_number.as_() + 1, proposal.header().number().as_())); + if parent_number + One::one() != *proposal.header().number() { + return Err(Error::WrongNumber { + expected: parent_number.checked_into::().map(|x| x + 1), + got: (*proposal.header().number()).checked_into::(), + }); } Ok(()) diff --git a/core/consensus/common/src/import_queue.rs b/core/consensus/common/src/import_queue.rs index a2da3ed2e55adbfadc1411b5105ff3b20101c5db..6cbb8ee413ed6b2373df3e25ffbfac1e46d25469 100644 --- a/core/consensus/common/src/import_queue.rs +++ b/core/consensus/common/src/import_queue.rs @@ -25,22 +25,15 @@ //! instantiated. The `BasicQueue` and `BasicVerifier` traits allow serial //! queues to be instantiated simply. -use crate::block_import::{ +use std::{sync::Arc, collections::HashMap}; +use futures::{prelude::*, sync::mpsc}; +use runtime_primitives::{Justification, traits::{ + Block as BlockT, Header as HeaderT, NumberFor, +}}; +use crate::{error::Error as ConsensusError, well_known_cache_keys::Id as CacheKeyId, block_import::{ BlockImport, BlockOrigin, ImportBlock, ImportedAux, ImportResult, JustificationImport, -}; -use crossbeam_channel::{self as channel, Receiver, Sender}; -use parity_codec::Encode; - -use std::sync::Arc; -use std::thread; - -use runtime_primitives::traits::{ - AuthorityIdFor, Block as BlockT, Header as HeaderT, NumberFor -}; -use runtime_primitives::Justification; - -use crate::error::Error as ConsensusError; -use parity_codec::alloc::collections::hash_map::HashMap; + FinalityProofImport, FinalityProofRequestBuilder, +}}; /// Reputation change for peers which send us a block with an incomplete header. const INCOMPLETE_HEADER_REPUTATION_CHANGE: i32 = -(1 << 20); @@ -57,6 +50,12 @@ pub type SharedBlockImport = Arc + /// Shared justification import struct used by the queue. pub type SharedJustificationImport = Arc + Send + Sync>; +/// Shared finality proof import struct used by the queue. +pub type SharedFinalityProofImport = Arc + Send + Sync>; + +/// Shared finality proof request builder struct used by the queue. +pub type SharedFinalityProofRequestBuilder = Arc + Send + Sync>; + /// Maps to the Origin used by the network. pub type Origin = libp2p::PeerId; @@ -76,7 +75,7 @@ pub struct IncomingBlock { } /// Verify a justification of a block -pub trait Verifier: Send + Sync + Sized { +pub trait Verifier: Send + Sync { /// Verify the given data and return the ImportBlock and an optional /// new set of validators to import. If not, err with an Error-Message /// presented to the User in the logs. @@ -86,81 +85,82 @@ pub trait Verifier: Send + Sync + Sized { header: B::Header, justification: Option, body: Option>, - ) -> Result<(ImportBlock, Option>>), String>; + ) -> Result<(ImportBlock, Option)>>), String>; } /// Blocks import queue API. -pub trait ImportQueue: Send + Sync + ImportQueueClone { - /// Start background work for the queue as necessary. - /// - /// This is called automatically by the network service when synchronization - /// begins. - fn start(&self, _link: Box>) -> Result<(), std::io::Error> { - Ok(()) - } - /// Clears the import queue and stops importing. - fn stop(&self); +/// +/// The `import_*` methods can be called in order to send elements for the import queue to verify. +/// Afterwards, call `poll_actions` to determine how to respond to these elements. +pub trait ImportQueue: Send { /// Import bunch of blocks. - fn import_blocks(&self, origin: BlockOrigin, blocks: Vec>); + fn import_blocks(&mut self, origin: BlockOrigin, blocks: Vec>); /// Import a block justification. - fn import_justification(&self, who: Origin, hash: B::Hash, number: NumberFor, justification: Justification); -} - -pub trait ImportQueueClone { - fn clone_box(&self) -> Box>; -} - -impl Clone for Box> { - fn clone(&self) -> Box> { - self.clone_box() - } + fn import_justification( + &mut self, + who: Origin, + hash: B::Hash, + number: NumberFor, + justification: Justification + ); + /// Import block finality proof. + fn import_finality_proof( + &mut self, + who: Origin, + hash: B::Hash, + number: NumberFor, + finality_proof: Vec + ); + /// Polls for actions to perform on the network. + /// + /// This method should behave in a way similar to `Future::poll`. It can register the current + /// task and notify later when more actions are ready to be polled. To continue the comparison, + /// it is as if this method always returned `Ok(Async::NotReady)`. + fn poll_actions(&mut self, link: &mut dyn Link); } -/// Interface to a basic block import queue that is importing blocks -/// sequentially in a separate thread, with pluggable verification. -#[derive(Clone)] +/// Interface to a basic block import queue that is importing blocks sequentially in a separate +/// task, with pluggable verification. pub struct BasicQueue { - sender: Sender>, -} - -impl ImportQueueClone for BasicQueue { - fn clone_box(&self) -> Box> { - Box::new(self.clone()) - } + /// Channel to send messages to the background task. + sender: mpsc::UnboundedSender>, + /// Results coming from the worker task. + result_port: BufferedLinkReceiver, + /// Sent through the link as soon as possible. + finality_proof_request_builder: Option>, + /// Since we have to be in a tokio context in order to spawn background tasks, we first store + /// the task to spawn here, then extract it as soon as we are in a tokio context. + /// If `Some`, contains the task to spawn in the background. If `None`, the future has already + /// been spawned. + future_to_spawn: Option + Send>>, } -/// "BasicQueue" is a wrapper around a channel sender to the "BlockImporter". -/// "BasicQueue" itself does not keep any state or do any importing work, and -/// can therefore be send to other threads. -/// -/// "BasicQueue" implements "ImportQueue" by sending messages to the -/// "BlockImporter", which runs in it's own thread. -/// -/// The "BlockImporter" is responsible for handling incoming requests from the -/// "BasicQueue". Some of these requests are handled by the "BlockImporter" -/// itself, such as "is_importing", "status", and justifications. -/// -/// The "import block" work will be offloaded to a single "BlockImportWorker", -/// running in another thread. Offloading the work is done via a channel, -/// ensuring blocks in this implementation are imported sequentially and in -/// order (as received by the "BlockImporter"). -/// -/// As long as the "BasicQueue" is not dropped, the "BlockImporter" will keep -/// running. The "BlockImporter" owns a sender to the "BlockImportWorker", -/// ensuring that the worker is kept alive until that sender is dropped. impl BasicQueue { /// Instantiate a new basic queue, with given verifier. + /// + /// This creates a background task, and calls `on_start` on the justification importer and + /// finality proof importer. pub fn new>( verifier: Arc, block_import: SharedBlockImport, - justification_import: Option> + justification_import: Option>, + finality_proof_import: Option>, + finality_proof_request_builder: Option>, ) -> Self { - let (result_sender, result_port) = channel::unbounded(); - let worker_sender = BlockImportWorker::new(result_sender, verifier, block_import); - let importer_sender = BlockImporter::new(result_port, worker_sender, justification_import); + let (result_sender, result_port) = buffered_link(); + let (future, worker_sender) = BlockImportWorker::new( + result_sender, + verifier, + block_import, + justification_import, + finality_proof_import, + ); Self { - sender: importer_sender, + sender: worker_sender, + result_port, + finality_proof_request_builder, + future_to_spawn: Some(Box::new(future)), } } @@ -170,177 +170,131 @@ impl BasicQueue { /// has synchronized with ImportQueue. #[cfg(any(test, feature = "test-helpers"))] pub fn synchronize(&self) { - self - .sender - .send(BlockImportMsg::Synchronize) - .expect("1. self is holding a sender to the Importer, 2. Importer should handle messages while there are senders around; qed"); + let _ = self.sender.unbounded_send(ToWorkerMsg::Synchronize); } } impl ImportQueue for BasicQueue { - fn start(&self, link: Box>) -> Result<(), std::io::Error> { - let (sender, port) = channel::unbounded(); - let _ = self - .sender - .send(BlockImportMsg::Start(link, sender)) - .expect("1. self is holding a sender to the Importer, 2. Importer should handle messages while there are senders around; qed"); - port.recv().expect("1. self is holding a sender to the Importer, 2. Importer should handle messages while there are senders around; qed") + fn import_blocks(&mut self, origin: BlockOrigin, blocks: Vec>) { + if blocks.is_empty() { + return; + } + + trace!(target: "sync", "Scheduling {} blocks for import", blocks.len()); + let _ = self.sender.unbounded_send(ToWorkerMsg::ImportBlocks(origin, blocks)); } - fn stop(&self) { - let _ = self - .sender - .send(BlockImportMsg::Stop) - .expect("1. self is holding a sender to the Importer, 2. Importer should handle messages while there are senders around; qed"); + fn import_justification( + &mut self, + who: Origin, + hash: B::Hash, + number: NumberFor, + justification: Justification + ) { + let _ = self.sender.unbounded_send(ToWorkerMsg::ImportJustification(who.clone(), hash, number, justification)); } - fn import_blocks(&self, origin: BlockOrigin, blocks: Vec>) { - if blocks.is_empty() { - return; - } - let _ = self - .sender - .send(BlockImportMsg::ImportBlocks(origin, blocks)) - .expect("1. self is holding a sender to the Importer, 2. Importer should handle messages while there are senders around; qed"); + fn import_finality_proof(&mut self, who: Origin, hash: B::Hash, number: NumberFor, finality_proof: Vec) { + trace!(target: "sync", "Scheduling finality proof of {}/{} for import", number, hash); + let _ = self.sender.unbounded_send(ToWorkerMsg::ImportFinalityProof(who, hash, number, finality_proof)); } - fn import_justification(&self, who: Origin, hash: B::Hash, number: NumberFor, justification: Justification) { - let _ = self - .sender - .send(BlockImportMsg::ImportJustification(who.clone(), hash, number, justification)) - .expect("1. self is holding a sender to the Importer, 2. Importer should handle messages while there are senders around; qed"); + fn poll_actions(&mut self, link: &mut dyn Link) { + if let Some(future) = self.future_to_spawn.take() { + tokio_executor::spawn(future); + } + + if let Some(fprb) = self.finality_proof_request_builder.take() { + link.set_finality_proof_request_builder(fprb); + } + + self.result_port.poll_actions(link); } } -pub enum BlockImportMsg { +/// Message destinated to the background worker. +#[derive(Debug)] +enum ToWorkerMsg { ImportBlocks(BlockOrigin, Vec>), ImportJustification(Origin, B::Hash, NumberFor, Justification), - Start(Box>, Sender>), - Stop, + ImportFinalityProof(Origin, B::Hash, NumberFor, Vec), #[cfg(any(test, feature = "test-helpers"))] Synchronize, } -pub enum BlockImportWorkerMsg { - ImportBlocks(BlockOrigin, Vec>), - Imported( - Vec<( - Result>, BlockImportError>, - B::Hash, - )>, - ), - #[cfg(any(test, feature = "test-helpers"))] - Synchronize, -} - -enum ImportMsgType { - FromWorker(BlockImportWorkerMsg), - FromNetwork(BlockImportMsg), -} - -struct BlockImporter { - port: Receiver>, - result_port: Receiver>, - worker_sender: Sender>, - link: Option>>, +struct BlockImportWorker> { + result_sender: BufferedLinkSender, + block_import: SharedBlockImport, justification_import: Option>, + finality_proof_import: Option>, + verifier: Arc, } -impl BlockImporter { +impl> BlockImportWorker { fn new( - result_port: Receiver>, - worker_sender: Sender>, + result_sender: BufferedLinkSender, + verifier: Arc, + block_import: SharedBlockImport, justification_import: Option>, - ) -> Sender> { - trace!(target: "block_import", "Creating new Block Importer!"); - let (sender, port) = channel::bounded(4); - let _ = thread::Builder::new() - .name("ImportQueue".into()) - .spawn(move || { - let mut importer = BlockImporter { - port, - result_port, - worker_sender, - link: None, - justification_import, + finality_proof_import: Option>, + ) -> (impl Future + Send, mpsc::UnboundedSender>) { + let (sender, mut port) = mpsc::unbounded(); + + let mut worker = BlockImportWorker { + result_sender, + verifier, + justification_import, + block_import, + finality_proof_import, + }; + + if let Some(justification_import) = worker.justification_import.as_ref() { + justification_import.on_start(&mut worker.result_sender); + } + if let Some(finality_proof_import) = worker.finality_proof_import.as_ref() { + finality_proof_import.on_start(&mut worker.result_sender); + } + + let future = futures::future::poll_fn(move || { + loop { + let msg = match port.poll() { + Ok(Async::Ready(Some(msg))) => msg, + Err(_) | Ok(Async::Ready(None)) => return Ok(Async::Ready(())), + Ok(Async::NotReady) => return Ok(Async::NotReady), }; - while importer.run() { - // Importing until all senders have been dropped... - } - }) - .expect("ImportQueue thread spawning failed"); - sender - } - fn run(&mut self) -> bool { - trace!(target: "import_queue", "Running import queue"); - let msg = select! { - recv(self.port) -> msg => { - match msg { - // Our sender has been dropped, quitting. - Err(_) => return false, - Ok(msg) => ImportMsgType::FromNetwork(msg) - } - }, - recv(self.result_port) -> msg => { match msg { - Err(_) => unreachable!("1. We hold a sender to the Worker, 2. it should not quit until that sender is dropped; qed"), - Ok(msg) => ImportMsgType::FromWorker(msg), + ToWorkerMsg::ImportBlocks(origin, blocks) => { + worker.import_a_batch_of_blocks(origin, blocks); + }, + ToWorkerMsg::ImportFinalityProof(who, hash, number, proof) => { + worker.import_finality_proof(who, hash, number, proof); + }, + ToWorkerMsg::ImportJustification(who, hash, number, justification) => { + worker.import_justification(who, hash, number, justification); + } + #[cfg(any(test, feature = "test-helpers"))] + ToWorkerMsg::Synchronize => { + trace!(target: "sync", "Sending sync message"); + worker.result_sender.synchronized(); + }, } } - }; - match msg { - ImportMsgType::FromNetwork(msg) => self.handle_network_msg(msg), - ImportMsgType::FromWorker(msg) => self.handle_worker_msg(msg), - } - } + }); - fn handle_network_msg(&mut self, msg: BlockImportMsg) -> bool { - match msg { - BlockImportMsg::ImportBlocks(origin, incoming_blocks) => { - self.handle_import_blocks(origin, incoming_blocks) - }, - BlockImportMsg::ImportJustification(who, hash, number, justification) => { - self.handle_import_justification(who, hash, number, justification) - }, - BlockImportMsg::Start(link, sender) => { - if let Some(justification_import) = self.justification_import.as_ref() { - justification_import.on_start(&*link); - } - self.link = Some(link); - let _ = sender.send(Ok(())); - }, - BlockImportMsg::Stop => return false, - #[cfg(any(test, feature = "test-helpers"))] - BlockImportMsg::Synchronize => { - trace!(target: "sync", "Received synchronization message"); - self.worker_sender - .send(BlockImportWorkerMsg::Synchronize) - .expect("1. This is holding a sender to the worker, 2. the worker should not quit while a sender is still held; qed"); - }, - } - true + (future, sender) } - fn handle_worker_msg(&mut self, msg: BlockImportWorkerMsg) -> bool { - let link = match self.link.as_ref() { - Some(link) => link, - None => { - trace!(target: "sync", "Received import result while import-queue has no link"); - return true; - }, - }; + fn import_a_batch_of_blocks(&mut self, origin: BlockOrigin, blocks: Vec>) { + let (imported, count, results) = import_many_blocks( + &*self.block_import, + origin, + blocks, + self.verifier.clone(), + ); + + trace!(target: "sync", "Imported {} of {}", imported, count); - let results = match msg { - BlockImportWorkerMsg::Imported(results) => (results), - #[cfg(any(test, feature = "test-helpers"))] - BlockImportWorkerMsg::Synchronize => { - trace!(target: "sync", "Synchronizing link"); - link.synchronized(); - return true; - }, - _ => unreachable!("Import Worker does not send ImportBlocks message; qed"), - }; let mut has_error = false; let mut hashes = vec![]; for (result, hash) in results { @@ -355,189 +309,286 @@ impl BlockImporter { } match result { - Ok(BlockImportResult::ImportedKnown(number)) => link.block_imported(&hash, number), + Ok(BlockImportResult::ImportedKnown(number)) => self.result_sender.block_imported(&hash, number), Ok(BlockImportResult::ImportedUnknown(number, aux, who)) => { - link.block_imported(&hash, number); + self.result_sender.block_imported(&hash, number); if aux.clear_justification_requests { - trace!(target: "sync", "Block imported clears all pending justification requests {}: {:?}", number, hash); - link.clear_justification_requests(); + trace!( + target: "sync", + "Block imported clears all pending justification requests {}: {:?}", + number, + hash + ); + self.result_sender.clear_justification_requests(); } if aux.needs_justification { trace!(target: "sync", "Block imported but requires justification {}: {:?}", number, hash); - link.request_justification(&hash, number); + self.result_sender.request_justification(&hash, number); } if aux.bad_justification { if let Some(peer) = who { info!("Sent block with bad justification to import"); - link.report_peer(peer, BAD_JUSTIFICATION_REPUTATION_CHANGE); + self.result_sender.report_peer(peer, BAD_JUSTIFICATION_REPUTATION_CHANGE); } } + + if aux.needs_finality_proof { + trace!(target: "sync", "Block imported but requires finality proof {}: {:?}", number, hash); + self.result_sender.request_finality_proof(&hash, number); + } }, Err(BlockImportError::IncompleteHeader(who)) => { if let Some(peer) = who { info!("Peer sent block with incomplete header to import"); - link.report_peer(peer, INCOMPLETE_HEADER_REPUTATION_CHANGE); - link.restart(); + self.result_sender.report_peer(peer, INCOMPLETE_HEADER_REPUTATION_CHANGE); + self.result_sender.restart(); } }, Err(BlockImportError::VerificationFailed(who, e)) => { if let Some(peer) = who { info!("Verification failed from peer: {}", e); - link.report_peer(peer, VERIFICATION_FAIL_REPUTATION_CHANGE); - link.restart(); + self.result_sender.report_peer(peer, VERIFICATION_FAIL_REPUTATION_CHANGE); + self.result_sender.restart(); } }, Err(BlockImportError::BadBlock(who)) => { if let Some(peer) = who { info!("Bad block"); - link.report_peer(peer, BAD_BLOCK_REPUTATION_CHANGE); - link.restart(); + self.result_sender.report_peer(peer, BAD_BLOCK_REPUTATION_CHANGE); + self.result_sender.restart(); } }, Err(BlockImportError::UnknownParent) | Err(BlockImportError::Error) => { - link.restart(); + self.result_sender.restart(); }, }; } - if let Some(link) = self.link.as_ref() { - link.blocks_processed(hashes, has_error); - } - true + + self.result_sender.blocks_processed(hashes, has_error); + } + + fn import_finality_proof(&mut self, who: Origin, hash: B::Hash, number: NumberFor, finality_proof: Vec) { + let result = self.finality_proof_import.as_ref().map(|finality_proof_import| { + finality_proof_import.import_finality_proof(hash, number, finality_proof, &*self.verifier) + .map_err(|e| { + debug!( + "Finality proof import failed with {:?} for hash: {:?} number: {:?} coming from node: {:?}", + e, + hash, + number, + who, + ); + }) + }).unwrap_or(Err(())); + + trace!(target: "sync", "Imported finality proof for {}/{}", number, hash); + self.result_sender.finality_proof_imported(who, (hash, number), result); } - fn handle_import_justification(&self, who: Origin, hash: B::Hash, number: NumberFor, justification: Justification) { + fn import_justification( + &mut self, + who: Origin, + hash: B::Hash, + number: NumberFor, + justification: Justification + ) { let success = self.justification_import.as_ref().map(|justification_import| { justification_import.import_justification(hash, number, justification) .map_err(|e| { - debug!(target: "sync", "Justification import failed with {:?} for hash: {:?} number: {:?} coming from node: {:?}", e, hash, number, who); + debug!( + target: "sync", + "Justification import failed with {:?} for hash: {:?} number: {:?} coming from node: {:?}", + e, + hash, + number, + who, + ); e }).is_ok() }).unwrap_or(false); - if let Some(link) = self.link.as_ref() { - link.justification_imported(who, &hash, number, success); - } + self.result_sender.justification_imported(who, &hash, number, success); } +} - fn handle_import_blocks(&mut self, origin: BlockOrigin, blocks: Vec>) { - trace!(target: "sync", "Scheduling {} blocks for import", blocks.len()); - self.worker_sender - .send(BlockImportWorkerMsg::ImportBlocks(origin, blocks)) - .expect("1. This is holding a sender to the worker, 2. the worker should not quit while a sender is still held; qed"); - } +/// Hooks that the verification queue can use to influence the synchronization +/// algorithm. +pub trait Link: Send { + /// Block imported. + fn block_imported(&mut self, _hash: &B::Hash, _number: NumberFor) {} + /// Batch of blocks imported, with or without error. + fn blocks_processed(&mut self, _processed_blocks: Vec, _has_error: bool) {} + /// Justification import result. + fn justification_imported(&mut self, _who: Origin, _hash: &B::Hash, _number: NumberFor, _success: bool) {} + /// Clear all pending justification requests. + fn clear_justification_requests(&mut self) {} + /// Request a justification for the given block. + fn request_justification(&mut self, _hash: &B::Hash, _number: NumberFor) {} + /// Finality proof import result. + /// + /// Even though we have asked for finality proof of block A, provider could return proof of + /// some earlier block B, if the proof for A was too large. The sync module should continue + /// asking for proof of A in this case. + fn finality_proof_imported( + &mut self, + _who: Origin, + _request_block: (B::Hash, NumberFor), + _finalization_result: Result<(B::Hash, NumberFor), ()>, + ) {} + /// Request a finality proof for the given block. + fn request_finality_proof(&mut self, _hash: &B::Hash, _number: NumberFor) {} + /// Remember finality proof request builder on start. + fn set_finality_proof_request_builder(&mut self, _request_builder: SharedFinalityProofRequestBuilder) {} + /// Adjusts the reputation of the given peer. + fn report_peer(&mut self, _who: Origin, _reputation_change: i32) {} + /// Restart sync. + fn restart(&mut self) {} + /// Synchronization request has been processed. + #[cfg(any(test, feature = "test-helpers"))] + fn synchronized(&mut self) {} } -struct BlockImportWorker> { - result_sender: Sender>, - block_import: SharedBlockImport, - verifier: Arc, +/// Wraps around an unbounded channel from the `futures` crate. The sender implements `Link` and +/// can be used to buffer commands, and the receiver can be used to poll said commands and transfer +/// them to another link. +pub fn buffered_link() -> (BufferedLinkSender, BufferedLinkReceiver) { + let (tx, rx) = mpsc::unbounded(); + let tx = BufferedLinkSender { tx }; + let rx = BufferedLinkReceiver { rx }; + (tx, rx) } -impl> BlockImportWorker { - pub fn new( - result_sender: Sender>, - verifier: Arc, - block_import: SharedBlockImport, - ) -> Sender> { - let (sender, port) = channel::bounded(4); - let _ = thread::Builder::new() - .name("ImportQueueWorker".into()) - .spawn(move || { - let worker = BlockImportWorker { - result_sender, - verifier, - block_import, - }; - for msg in port.iter() { - // Working until all senders have been dropped... - match msg { - BlockImportWorkerMsg::ImportBlocks(origin, blocks) => { - worker.import_a_batch_of_blocks(origin, blocks); - }, - #[cfg(any(test, feature = "test-helpers"))] - BlockImportWorkerMsg::Synchronize => { - trace!(target: "sync", "Sending sync message"); - let _ = worker.result_sender.send(BlockImportWorkerMsg::Synchronize); - }, - _ => unreachable!("Import Worker does not receive the Imported message; qed"), - } - } - }) - .expect("ImportQueueWorker thread spawning failed"); - sender +/// See [`buffered_link`]. +pub struct BufferedLinkSender { + tx: mpsc::UnboundedSender>, +} + +/// Internal buffered message. +enum BlockImportWorkerMsg { + BlockImported(B::Hash, NumberFor), + BlocksProcessed(Vec, bool), + JustificationImported(Origin, B::Hash, NumberFor, bool), + ClearJustificationRequests, + RequestJustification(B::Hash, NumberFor), + FinalityProofImported(Origin, (B::Hash, NumberFor), Result<(B::Hash, NumberFor), ()>), + RequestFinalityProof(B::Hash, NumberFor), + SetFinalityProofRequestBuilder(SharedFinalityProofRequestBuilder), + ReportPeer(Origin, i32), + Restart, + #[cfg(any(test, feature = "test-helpers"))] + Synchronized, +} + +impl Link for BufferedLinkSender { + fn block_imported(&mut self, hash: &B::Hash, number: NumberFor) { + let _ = self.tx.unbounded_send(BlockImportWorkerMsg::BlockImported(hash.clone(), number)); } - fn import_a_batch_of_blocks(&self, origin: BlockOrigin, blocks: Vec>) { - let count = blocks.len(); - let mut imported = 0; - - let blocks_range = match ( - blocks.first().and_then(|b| b.header.as_ref().map(|h| h.number())), - blocks.last().and_then(|b| b.header.as_ref().map(|h| h.number())), - ) { - (Some(first), Some(last)) if first != last => format!(" ({}..{})", first, last), - (Some(first), Some(_)) => format!(" ({})", first), - _ => Default::default(), - }; + fn blocks_processed(&mut self, processed_blocks: Vec, has_error: bool) { + let _ = self.tx.unbounded_send(BlockImportWorkerMsg::BlocksProcessed(processed_blocks, has_error)); + } - trace!(target: "sync", "Starting import of {} blocks {}", count, blocks_range); + fn justification_imported( + &mut self, + who: Origin, + hash: &B::Hash, + number: NumberFor, + success: bool + ) { + let msg = BlockImportWorkerMsg::JustificationImported(who, hash.clone(), number, success); + let _ = self.tx.unbounded_send(msg); + } - let mut results = vec![]; + fn clear_justification_requests(&mut self) { + let _ = self.tx.unbounded_send(BlockImportWorkerMsg::ClearJustificationRequests); + } - let mut has_error = false; + fn request_justification(&mut self, hash: &B::Hash, number: NumberFor) { + let _ = self.tx.unbounded_send(BlockImportWorkerMsg::RequestJustification(hash.clone(), number)); + } - // Blocks in the response/drain should be in ascending order. - for block in blocks { - let import_result = if has_error { - Err(BlockImportError::Error) - } else { - import_single_block( - &*self.block_import, - origin.clone(), - block.clone(), - self.verifier.clone(), - ) - }; - let was_ok = import_result.is_ok(); - results.push((import_result, block.hash)); - if was_ok { - imported += 1; - } else { - has_error = true; - } - } + fn finality_proof_imported( + &mut self, + who: Origin, + request_block: (B::Hash, NumberFor), + finalization_result: Result<(B::Hash, NumberFor), ()>, + ) { + let msg = BlockImportWorkerMsg::FinalityProofImported(who, request_block, finalization_result); + let _ = self.tx.unbounded_send(msg); + } - let _ = self - .result_sender - .send(BlockImportWorkerMsg::Imported(results)); + fn request_finality_proof(&mut self, hash: &B::Hash, number: NumberFor) { + let _ = self.tx.unbounded_send(BlockImportWorkerMsg::RequestFinalityProof(hash.clone(), number)); + } - trace!(target: "sync", "Imported {} of {}", imported, count); + fn set_finality_proof_request_builder(&mut self, request_builder: SharedFinalityProofRequestBuilder) { + let _ = self.tx.unbounded_send(BlockImportWorkerMsg::SetFinalityProofRequestBuilder(request_builder)); + } + + fn report_peer(&mut self, who: Origin, reputation_change: i32) { + let _ = self.tx.unbounded_send(BlockImportWorkerMsg::ReportPeer(who, reputation_change)); + } + + fn restart(&mut self) { + let _ = self.tx.unbounded_send(BlockImportWorkerMsg::Restart); } -} -/// Hooks that the verification queue can use to influence the synchronization -/// algorithm. -pub trait Link: Send { - /// Block imported. - fn block_imported(&self, _hash: &B::Hash, _number: NumberFor) {} - /// Batch of blocks imported, with or without error. - fn blocks_processed(&self, _processed_blocks: Vec, _has_error: bool) {} - /// Justification import result. - fn justification_imported(&self, _who: Origin, _hash: &B::Hash, _number: NumberFor, _success: bool) {} - /// Clear all pending justification requests. - fn clear_justification_requests(&self) {} - /// Request a justification for the given block. - fn request_justification(&self, _hash: &B::Hash, _number: NumberFor) {} - /// Adjusts the reputation of the given peer. - fn report_peer(&self, _who: Origin, _reputation_change: i32) {} - /// Restart sync. - fn restart(&self) {} - /// Synchronization request has been processed. #[cfg(any(test, feature = "test-helpers"))] - fn synchronized(&self) {} + fn synchronized(&mut self) { + let _ = self.tx.unbounded_send(BlockImportWorkerMsg::Synchronized); + } +} + +/// See [`buffered_link`]. +pub struct BufferedLinkReceiver { + rx: mpsc::UnboundedReceiver>, +} + +impl BufferedLinkReceiver { + /// Polls for the buffered link actions. Any enqueued action will be propagated to the link + /// passed as parameter. + /// + /// This method should behave in a way similar to `Future::poll`. It can register the current + /// task and notify later when more actions are ready to be polled. To continue the comparison, + /// it is as if this method always returned `Ok(Async::NotReady)`. + pub fn poll_actions(&mut self, link: &mut dyn Link) { + loop { + let msg = if let Ok(Async::Ready(Some(msg))) = self.rx.poll() { + msg + } else { + break + }; + + match msg { + BlockImportWorkerMsg::BlockImported(hash, number) => + link.block_imported(&hash, number), + BlockImportWorkerMsg::BlocksProcessed(blocks, has_error) => + link.blocks_processed(blocks, has_error), + BlockImportWorkerMsg::JustificationImported(who, hash, number, success) => + link.justification_imported(who, &hash, number, success), + BlockImportWorkerMsg::ClearJustificationRequests => + link.clear_justification_requests(), + BlockImportWorkerMsg::RequestJustification(hash, number) => + link.request_justification(&hash, number), + BlockImportWorkerMsg::FinalityProofImported(who, block, result) => + link.finality_proof_imported(who, block, result), + BlockImportWorkerMsg::RequestFinalityProof(hash, number) => + link.request_finality_proof(&hash, number), + BlockImportWorkerMsg::SetFinalityProofRequestBuilder(builder) => + link.set_finality_proof_request_builder(builder), + BlockImportWorkerMsg::ReportPeer(who, reput) => + link.report_peer(who, reput), + BlockImportWorkerMsg::Restart => + link.restart(), + #[cfg(any(test, feature = "test-helpers"))] + BlockImportWorkerMsg::Synchronized => + link.synchronized(), + } + } + } } /// Block import successful result. @@ -564,9 +615,62 @@ pub enum BlockImportError { Error, } +/// Import several blocks at once, returning import result for each block. +fn import_many_blocks>( + import_handle: &dyn BlockImport, + blocks_origin: BlockOrigin, + blocks: Vec>, + verifier: Arc, +) -> (usize, usize, Vec<( + Result>, BlockImportError>, + B::Hash, +)>) { + let count = blocks.len(); + let mut imported = 0; + + let blocks_range = match ( + blocks.first().and_then(|b| b.header.as_ref().map(|h| h.number())), + blocks.last().and_then(|b| b.header.as_ref().map(|h| h.number())), + ) { + (Some(first), Some(last)) if first != last => format!(" ({}..{})", first, last), + (Some(first), Some(_)) => format!(" ({})", first), + _ => Default::default(), + }; + + trace!(target: "sync", "Starting import of {} blocks {}", count, blocks_range); + + let mut results = vec![]; + + let mut has_error = false; + + // Blocks in the response/drain should be in ascending order. + for block in blocks { + let block_hash = block.hash; + let import_result = if has_error { + Err(BlockImportError::Error) + } else { + import_single_block( + import_handle, + blocks_origin.clone(), + block, + verifier.clone(), + ) + }; + let was_ok = import_result.is_ok(); + results.push((import_result, block_hash)); + if was_ok { + imported += 1; + } else { + has_error = true; + } + } + + (imported, count, results) +} + /// Single block import function. pub fn import_single_block>( - import_handle: &BlockImport, + import_handle: &dyn BlockImport, block_origin: BlockOrigin, block: IncomingBlock, verifier: Arc, @@ -585,6 +689,8 @@ pub fn import_single_block>( }, }; + trace!(target: "sync", "Header {} has {:?} logs", block.hash, header.digest().logs().len()); + let number = header.number().clone(); let hash = header.hash(); let parent = header.parent_hash().clone(); @@ -616,7 +722,7 @@ pub fn import_single_block>( r => return Ok(r), // Any other successful result means that the block is already imported. } - let (import_block, new_authorities) = verifier.verify(block_origin, header, justification, block.body) + let (import_block, maybe_keys) = verifier.verify(block_origin, header, justification, block.body) .map_err(|msg| { if let Some(ref peer) = peer { trace!(target: "sync", "Verifying {}({}) from {} failed: {}", number, hash, peer, msg); @@ -627,112 +733,9 @@ pub fn import_single_block>( })?; let mut cache = HashMap::new(); - if let Some(authorities) = new_authorities { - cache.insert(crate::well_known_cache_keys::AUTHORITIES, authorities.encode()); + if let Some(keys) = maybe_keys { + cache.extend(keys.into_iter()); } import_error(import_handle.import_block(import_block, cache)) } - -#[cfg(test)] -mod tests { - use super::*; - use libp2p::PeerId; - use test_client::runtime::{Block, Hash}; - - #[derive(Debug, PartialEq)] - enum LinkMsg { - BlockImported, - Disconnected, - Restarted, - } - - #[derive(Clone)] - struct TestLink { - sender: Sender, - } - - impl TestLink { - fn new(sender: Sender) -> TestLink { - TestLink { - sender, - } - } - } - - impl Link for TestLink { - fn block_imported(&self, _hash: &Hash, _number: NumberFor) { - let _ = self.sender.send(LinkMsg::BlockImported); - } - fn report_peer(&self, _: Origin, _: i32) { - let _ = self.sender.send(LinkMsg::Disconnected); - } - fn restart(&self) { - let _ = self.sender.send(LinkMsg::Restarted); - } - } - - #[test] - fn process_import_result_works() { - let (result_sender, result_port) = channel::unbounded(); - let (worker_sender, _) = channel::unbounded(); - let (link_sender, link_port) = channel::unbounded(); - let importer_sender = BlockImporter::::new(result_port, worker_sender, None); - let link = TestLink::new(link_sender); - let (ack_sender, start_ack_port) = channel::bounded(4); - let _ = importer_sender.send(BlockImportMsg::Start(Box::new(link.clone()), ack_sender)); - - // Ensure the importer handles Start before any result messages. - let _ = start_ack_port.recv(); - - // Send a known - let results = vec![(Ok(BlockImportResult::ImportedKnown(Default::default())), Default::default())]; - let _ = result_sender.send(BlockImportWorkerMsg::Imported(results)).ok().unwrap(); - assert_eq!(link_port.recv(), Ok(LinkMsg::BlockImported)); - - // Send a second known - let results = vec![(Ok(BlockImportResult::ImportedKnown(Default::default())), Default::default())]; - let _ = result_sender.send(BlockImportWorkerMsg::Imported(results)).ok().unwrap(); - assert_eq!(link_port.recv(), Ok(LinkMsg::BlockImported)); - - // Send an unknown - let results = vec![(Ok(BlockImportResult::ImportedUnknown(Default::default(), Default::default(), None)), Default::default())]; - let _ = result_sender.send(BlockImportWorkerMsg::Imported(results)).ok().unwrap(); - assert_eq!(link_port.recv(), Ok(LinkMsg::BlockImported)); - - // Send an unknown with peer and bad justification - let peer_id = PeerId::random(); - let results = vec![(Ok(BlockImportResult::ImportedUnknown(Default::default(), - ImportedAux { needs_justification: true, clear_justification_requests: false, bad_justification: true }, - Some(peer_id.clone()))), Default::default())]; - let _ = result_sender.send(BlockImportWorkerMsg::Imported(results)).ok().unwrap(); - assert_eq!(link_port.recv(), Ok(LinkMsg::BlockImported)); - assert_eq!(link_port.recv(), Ok(LinkMsg::Disconnected)); - - // Send an incomplete header - let results = vec![(Err(BlockImportError::IncompleteHeader(Some(peer_id.clone()))), Default::default())]; - let _ = result_sender.send(BlockImportWorkerMsg::Imported(results)).ok().unwrap(); - assert_eq!(link_port.recv(), Ok(LinkMsg::Disconnected)); - assert_eq!(link_port.recv(), Ok(LinkMsg::Restarted)); - - // Send an unknown parent - let results = vec![(Err(BlockImportError::UnknownParent), Default::default())]; - let _ = result_sender.send(BlockImportWorkerMsg::Imported(results)).ok().unwrap(); - assert_eq!(link_port.recv(), Ok(LinkMsg::Restarted)); - - // Send a verification failed - let results = vec![(Err(BlockImportError::VerificationFailed(Some(peer_id.clone()), String::new())), Default::default())]; - let _ = result_sender.send(BlockImportWorkerMsg::Imported(results)).ok().unwrap(); - assert_eq!(link_port.recv(), Ok(LinkMsg::Disconnected)); - assert_eq!(link_port.recv(), Ok(LinkMsg::Restarted)); - - // Send an error - let results = vec![(Err(BlockImportError::Error), Default::default())]; - let _ = result_sender.send(BlockImportWorkerMsg::Imported(results)).ok().unwrap(); - assert_eq!(link_port.recv(), Ok(LinkMsg::Restarted)); - - // Drop the importer sender first, ensuring graceful shutdown. - drop(importer_sender); - } -} - diff --git a/core/consensus/common/src/lib.rs b/core/consensus/common/src/lib.rs index be7900d853a944fe52c1d65c53f064d89fa91649..aa210b9f867d640b4f1a8a08319f4b2feb962ebe 100644 --- a/core/consensus/common/src/lib.rs +++ b/core/consensus/common/src/lib.rs @@ -26,20 +26,18 @@ // our error-chain could potentially blow up otherwise #![recursion_limit="128"] -#[macro_use] extern crate crossbeam_channel; #[macro_use] extern crate log; use std::sync::Arc; use std::time::Duration; -use runtime_primitives::generic::BlockId; -use runtime_primitives::traits::{AuthorityIdFor, Block}; +use runtime_primitives::traits::{Block, DigestFor}; use futures::prelude::*; pub use inherents::InherentData; pub mod offline_tracker; pub mod error; -mod block_import; +pub mod block_import; mod select_chain; pub mod import_queue; pub mod evaluation; @@ -47,20 +45,13 @@ pub mod evaluation; // block size limit. const MAX_BLOCK_SIZE: usize = 4 * 1024 * 1024 + 512; -pub use self::error::{Error, ErrorKind}; +pub use self::error::Error; pub use block_import::{ - BlockImport, BlockOrigin, ForkChoiceStrategy, ImportedAux, ImportBlock, ImportResult, JustificationImport, + BlockImport, BlockOrigin, ForkChoiceStrategy, ImportedAux, ImportBlock, ImportResult, + JustificationImport, FinalityProofImport, FinalityProofRequestBuilder, }; pub use select_chain::SelectChain; -/// Trait for getting the authorities at a given block. -pub trait Authorities { - type Error: std::error::Error + Send + 'static; - - /// Get the authorities at the given block. - fn authorities(&self, at: &BlockId) -> Result>, Self::Error>; -} - /// Environment producer for a Consensus instance. Creates proposer instance and communication streams. pub trait Environment { /// The proposer type this creates. @@ -70,7 +61,7 @@ pub trait Environment { /// Initialize the proposal logic on top of a specific header. Provide /// the authorities at that header. - fn init(&self, parent_header: &B::Header, authorities: &[AuthorityIdFor]) + fn init(&self, parent_header: &B::Header) -> Result; } @@ -86,7 +77,12 @@ pub trait Proposer { /// Future that resolves to a committed proposal. type Create: IntoFuture; /// Create a proposal. - fn propose(&self, inherent_data: InherentData, max_duration: Duration) -> Self::Create; + fn propose( + &self, + inherent_data: InherentData, + inherent_digests: DigestFor, + max_duration: Duration, + ) -> Self::Create; } /// An oracle for when major synchronization work is being undertaken. @@ -120,20 +116,6 @@ impl SyncOracle for Arc { } } -/// Extra verification for blocks. -pub trait ExtraVerification: Send + Sync { - /// Future that resolves when the block is verified, or fails with error if - /// not. - type Verified: IntoFuture; - - /// Do additional verification for this block. - fn verify( - &self, - header: &B::Header, - body: Option<&[B::Extrinsic]>, - ) -> Self::Verified; -} - /// A list of all well known keys in the cache. pub mod well_known_cache_keys { /// The type representing cache keys. diff --git a/core/consensus/common/src/offline_tracker.rs b/core/consensus/common/src/offline_tracker.rs index 3c6755d9411d7230bc2aaaa575737a208a13953d..f5adbdc0e041d9e1bcc2e69a5cf3b3011c008a67 100644 --- a/core/consensus/common/src/offline_tracker.rs +++ b/core/consensus/common/src/offline_tracker.rs @@ -112,25 +112,24 @@ impl OfflineTracker { #[cfg(test)] mod tests { use super::*; - use primitives::ed25519::Public as AuthorityId; #[test] fn validator_offline() { - let mut tracker = OfflineTracker::::new(); - let v = AuthorityId::from_raw([0; 32]); - let v2 = AuthorityId::from_raw([1; 32]); - let v3 = AuthorityId::from_raw([2; 32]); - tracker.note_round_end(v.clone(), true); - tracker.note_round_end(v2.clone(), true); - tracker.note_round_end(v3.clone(), true); + let mut tracker = OfflineTracker::::new(); + let v1 = 1; + let v2 = 2; + let v3 = 3; + tracker.note_round_end(v1, true); + tracker.note_round_end(v2, true); + tracker.note_round_end(v3, true); let slash_time = REPORT_TIME + Duration::from_secs(5); - tracker.observed.get_mut(&v).unwrap().offline_since -= slash_time; + tracker.observed.get_mut(&v1).unwrap().offline_since -= slash_time; tracker.observed.get_mut(&v2).unwrap().offline_since -= slash_time; - assert_eq!(tracker.reports(&[v.clone(), v2.clone(), v3.clone()]), vec![0, 1]); + assert_eq!(tracker.reports(&[v1, v2, v3]), vec![0, 1]); - tracker.note_new_block(&[v.clone(), v3.clone()]); - assert_eq!(tracker.reports(&[v, v2, v3]), vec![0]); + tracker.note_new_block(&[v1, v3]); + assert_eq!(tracker.reports(&[v1, v2, v3]), vec![0]); } } diff --git a/core/consensus/common/src/select_chain.rs b/core/consensus/common/src/select_chain.rs index 47c65d1fe78e530837648160c8d8ba30fd03300e..9ab21cba13ba9a08d5515cbf87b4f4151cecff98 100644 --- a/core/consensus/common/src/select_chain.rs +++ b/core/consensus/common/src/select_chain.rs @@ -19,13 +19,13 @@ use runtime_primitives::traits::{Block as BlockT, NumberFor}; /// The SelectChain trait defines the strategy upon which the head is chosen -/// if multiple forks are present for an opaque definition of "best" in the +/// if multiple forks are present for an opaque definition of "best" in the /// specific chain build. /// /// The Strategy can be customised for the two use cases of authoring new blocks /// upon the best chain or which fork to finalise. Unless implemented differently /// by default finalisation methods fall back to use authoring, so as a minimum -/// `_authoring`-functions must be implemented. +/// `_authoring`-functions must be implemented. /// /// Any particular user must make explicit, however, whether they intend to finalise /// or author through the using the right function call, as these might differ in @@ -51,4 +51,4 @@ pub trait SelectChain: Sync + Send + Clone { ) -> Result::Hash>, Error> { Ok(Some(target_hash)) } -} \ No newline at end of file +} diff --git a/core/consensus/rhd/Cargo.toml b/core/consensus/rhd/Cargo.toml index 8535f3f006e3cec7c6a3796794275e5def10709c..d9632bac8715e9e9dd8f9becae6177c187f789e5 100644 --- a/core/consensus/rhd/Cargo.toml +++ b/core/consensus/rhd/Cargo.toml @@ -6,6 +6,7 @@ description = "Rhododendron Round-Based consensus-algorithm for substrate" edition = "2018" [dependencies] +derive_more = "0.14.0" futures = "0.1.17" codec = { package = "parity-codec", version = "3.2", features = ["derive"] } primitives = { package = "substrate-primitives", path = "../../primitives" } @@ -14,13 +15,11 @@ client = { package = "substrate-client", path = "../../client" } transaction_pool = { package = "substrate-transaction-pool", path = "../../transaction-pool" } runtime_support = { package = "srml-support", path = "../../../srml/support" } srml-system = { path = "../../../srml/system" } -srml-consensus = { path = "../../../srml/consensus" } runtime_primitives = { package = "sr-primitives", path = "../../sr-primitives" } runtime_version = { package = "sr-version", path = "../../sr-version" } runtime_io = { package = "sr-io", path = "../../sr-io" } tokio = "0.1.7" -parking_lot = "0.7.1" -error-chain = "0.12" +parking_lot = "0.8.0" log = "0.4" rhododendron = { version = "0.5.0", features = ["codec"] } exit-future = "0.1" diff --git a/core/consensus/rhd/src/error.rs b/core/consensus/rhd/src/error.rs index 38081109754555b73c02c48f2c51bb1404425cf7..601cf1c963a586d883de92527818c2721fb644f5 100644 --- a/core/consensus/rhd/src/error.rs +++ b/core/consensus/rhd/src/error.rs @@ -15,45 +15,36 @@ // along with Substrate. If not, see . //! Error types in the rhododendron Consensus service. -use consensus::error::{Error as CommonError, ErrorKind as CommonErrorKind}; +use consensus::error::{Error as CommonError}; use primitives::AuthorityId; use client; -use error_chain::{error_chain, error_chain_processing, impl_error_chain_processed, - impl_extract_backtrace, impl_error_chain_kind}; -error_chain! { - links { - Client(client::error::Error, client::error::ErrorKind); - Common(CommonError, CommonErrorKind); - } - errors { - NotValidator(id: AuthorityId) { - description("Local account ID not a validator at this block."), - display("Local account ID ({:?}) not a validator at this block.", id), - } - PrematureDestruction { - description("Proposer destroyed before finishing proposing or evaluating"), - display("Proposer destroyed before finishing proposing or evaluating"), - } - Timer(e: ::tokio::timer::Error) { - description("Failed to register or resolve async timer."), - display("Timer failed: {}", e), - } - Executor(e: ::futures::future::ExecuteErrorKind) { - description("Unable to dispatch agreement future"), - display("Unable to dispatch agreement future: {:?}", e), - } - } +/// A result alias. +pub type Result = std::result::Result; + +/// A RHD error type. +#[derive(Debug, derive_more::Display, derive_more::From)] +pub enum Error { + /// Client error. + Client(client::error::Error), + /// Consensus error. + Common(CommonError), + /// Local account ID not a validator at this block. + #[display(fmt="Local account ID ({:?}) not a validator at this block.", _0)] + NotValidator(AuthorityId), + /// Proposer destroyed before finishing proposing or evaluating + #[display(fmt="Proposer destroyed before finishing proposing or evaluating")] + PrematureDestruction, + /// Failed to register or resolve async timer. + #[display(fmt="Timer failed: {}", _0)] + Timer(tokio::timer::Error), + /// Unable to dispatch agreement future + #[display(fmt="Unable to dispatch agreement future: {:?}", _0)] + Executor(futures::future::ExecuteErrorKind), } impl From<::rhododendron::InputStreamConcluded> for Error { fn from(_: ::rhododendron::InputStreamConcluded) -> Self { - CommonErrorKind::IoTerminated.into() - } -} - -impl From for Error { - fn from(e: CommonErrorKind) -> Self { - CommonError::from(e).into() + CommonError::IoTerminated.into() } } diff --git a/core/consensus/rhd/src/lib.rs b/core/consensus/rhd/src/lib.rs index 0afe10ffce9f1ee640dbf1bce074b2a09ddf2e44..4a3e03759b4d47d3f34e0b64d301161d6916a54e 100644 --- a/core/consensus/rhd/src/lib.rs +++ b/core/consensus/rhd/src/lib.rs @@ -32,6 +32,9 @@ #![cfg(feature="rhd")] // FIXME #1020 doesn't compile +// NOTE: this is the legacy constant used for transaction size. No longer used except +// for the rhd code which is not updated. Placed here for compatibility. +const MAX_TRANSACTIONS_SIZE: u32 = 4 * 1024 * 1024; use std::sync::Arc; use std::sync::atomic::{AtomicUsize, Ordering}; @@ -45,7 +48,10 @@ use client::{Client as SubstrateClient, CallExecutor}; use client::runtime_api::{Core, BlockBuilder as BlockBuilderAPI, OldTxQueue, BlockBuilderError}; use runtime_primitives::generic::{BlockId, Era, ImportResult, ImportBlock, BlockOrigin}; use runtime_primitives::traits::{Block, Header}; -use runtime_primitives::traits::{Block as BlockT, Hash as HashT, Header as HeaderT, As, BlockNumberToHash}; +use runtime_primitives::traits::{ + Block as BlockT, Hash as HashT, Header as HeaderT, + BlockNumberToHash, SaturatedConversion +}; use runtime_primitives::Justification; use primitives::{AuthorityId, ed25519, Blake2Hasher, ed25519::LocalizedSignature}; use srml_system::Trait as SystemT; @@ -1246,7 +1252,7 @@ impl LocalProposer<::Block> for Proposer where for (target, misbehavior) in misbehavior { let report = MisbehaviorReport { parent_hash: self.parent_hash.into(), - parent_number: self.parent_number.as_(), + parent_number: self.parent_number.saturated_into::(), target, misbehavior: match misbehavior { GenericMisbehavior::ProposeOutOfTurn(_, _, _) => continue, diff --git a/core/consensus/slots/Cargo.toml b/core/consensus/slots/Cargo.toml index c02559185f9056b614d4fe4cff6ab9ed6a2b0989..5c187024c9f49f70665c7aa015e306016b0436ee 100644 --- a/core/consensus/slots/Cargo.toml +++ b/core/consensus/slots/Cargo.toml @@ -13,7 +13,9 @@ runtime_primitives = { package = "sr-primitives", path = "../../sr-primitives" } consensus_common = { package = "substrate-consensus-common", path = "../common" } inherents = { package = "substrate-inherents", path = "../../inherents" } futures = "0.1.17" -tokio = "0.1.7" -parking_lot = "0.7.1" -error-chain = "0.12" +tokio-timer = "0.2.11" +parking_lot = "0.8.0" log = "0.4" + +[dev-dependencies] +test-client = { package = "substrate-test-runtime-client", path = "../../test-runtime/client" } diff --git a/core/consensus/slots/src/aux_schema.rs b/core/consensus/slots/src/aux_schema.rs new file mode 100644 index 0000000000000000000000000000000000000000..1af8b2da530116afa6e409ca787c7cf0314be645 --- /dev/null +++ b/core/consensus/slots/src/aux_schema.rs @@ -0,0 +1,265 @@ +// Copyright 2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +//! Schema for slots in the aux-db. + +use codec::{Encode, Decode}; +use client::backend::AuxStore; +use client::error::{Result as ClientResult, Error as ClientError}; +use runtime_primitives::traits::Header; + +const SLOT_HEADER_MAP_KEY: &[u8] = b"slot_header_map"; +const SLOT_HEADER_START: &[u8] = b"slot_header_start"; + +/// We keep at least this number of slots in database. +pub const MAX_SLOT_CAPACITY: u64 = 1000; +/// We prune slots when they reach this number. +pub const PRUNING_BOUND: u64 = 2 * MAX_SLOT_CAPACITY; + +fn load_decode(backend: &C, key: &[u8]) -> ClientResult> + where + C: AuxStore, + T: Decode, +{ + match backend.get_aux(key)? { + None => Ok(None), + Some(t) => T::decode(&mut &t[..]) + .ok_or_else( + || ClientError::Backend(format!("Slots DB is corrupted.")).into(), + ) + .map(Some) + } +} + +/// Represents an equivocation proof. +#[derive(Debug, Clone)] +pub struct EquivocationProof { + slot: u64, + fst_header: H, + snd_header: H, +} + +impl EquivocationProof { + /// Get the slot number where the equivocation happened. + pub fn slot(&self) -> u64 { + self.slot + } + + /// Get the first header involved in the equivocation. + pub fn fst_header(&self) -> &H { + &self.fst_header + } + + /// Get the second header involved in the equivocation. + pub fn snd_header(&self) -> &H { + &self.snd_header + } +} + +/// Checks if the header is an equivocation and returns the proof in that case. +/// +/// Note: it detects equivocations only when slot_now - slot <= MAX_SLOT_CAPACITY. +pub fn check_equivocation( + backend: &C, + slot_now: u64, + slot: u64, + header: &H, + signer: &P, +) -> ClientResult>> + where + H: Header, + C: AuxStore, + P: Clone + Encode + Decode + PartialEq, +{ + // We don't check equivocations for old headers out of our capacity. + if slot_now - slot > MAX_SLOT_CAPACITY { + return Ok(None) + } + + // Key for this slot. + let mut curr_slot_key = SLOT_HEADER_MAP_KEY.to_vec(); + slot.using_encoded(|s| curr_slot_key.extend(s)); + + // Get headers of this slot. + let mut headers_with_sig = load_decode::<_, Vec<(H, P)>>(backend, &curr_slot_key[..])? + .unwrap_or_else(Vec::new); + + // Get first slot saved. + let slot_header_start = SLOT_HEADER_START.to_vec(); + let first_saved_slot = load_decode::<_, u64>(backend, &slot_header_start[..])? + .unwrap_or(slot); + + for (prev_header, prev_signer) in headers_with_sig.iter() { + // A proof of equivocation consists of two headers: + // 1) signed by the same voter, + if prev_signer == signer { + // 2) with different hash + if header.hash() != prev_header.hash() { + return Ok(Some(EquivocationProof { + slot, // 3) and mentioning the same slot. + fst_header: prev_header.clone(), + snd_header: header.clone(), + })); + } else { + // We don't need to continue in case of duplicated header, + // since it's already saved and a possible equivocation + // would have been detected before. + return Ok(None) + } + } + } + + let mut keys_to_delete = vec![]; + let mut new_first_saved_slot = first_saved_slot; + + if slot_now - first_saved_slot >= PRUNING_BOUND { + let prefix = SLOT_HEADER_MAP_KEY.to_vec(); + new_first_saved_slot = slot_now.saturating_sub(MAX_SLOT_CAPACITY); + + for s in first_saved_slot..new_first_saved_slot { + let mut p = prefix.clone(); + s.using_encoded(|s| p.extend(s)); + keys_to_delete.push(p); + } + } + + headers_with_sig.push((header.clone(), signer.clone())); + + backend.insert_aux( + &[ + (&curr_slot_key[..], headers_with_sig.encode().as_slice()), + (&slot_header_start[..], new_first_saved_slot.encode().as_slice()), + ], + &keys_to_delete.iter().map(|k| &k[..]).collect::>()[..], + )?; + + Ok(None) +} + +#[cfg(test)] +mod test { + use primitives::{sr25519, Pair}; + use primitives::hash::H256; + use runtime_primitives::testing::{Header as HeaderTest, Digest as DigestTest}; + use test_client; + + use super::{MAX_SLOT_CAPACITY, PRUNING_BOUND, check_equivocation}; + + fn create_header(number: u64) -> HeaderTest { + // so that different headers for the same number get different hashes + let parent_hash = H256::random(); + + let header = HeaderTest { + parent_hash, + number, + state_root: Default::default(), + extrinsics_root: Default::default(), + digest: DigestTest { logs: vec![], }, + }; + + header + } + + #[test] + fn check_equivocation_works() { + let client = test_client::new(); + let (pair, _seed) = sr25519::Pair::generate(); + let public = pair.public(); + + let header1 = create_header(1); // @ slot 2 + let header2 = create_header(2); // @ slot 2 + let header3 = create_header(2); // @ slot 4 + let header4 = create_header(3); // @ slot MAX_SLOT_CAPACITY + 4 + let header5 = create_header(4); // @ slot MAX_SLOT_CAPACITY + 4 + let header6 = create_header(3); // @ slot 4 + + // It's ok to sign same headers. + assert!( + check_equivocation( + &client, + 2, + 2, + &header1, + &public, + ).unwrap().is_none(), + ); + + assert!( + check_equivocation( + &client, + 3, + 2, + &header1, + &public, + ).unwrap().is_none(), + ); + + // But not two different headers at the same slot. + assert!( + check_equivocation( + &client, + 4, + 2, + &header2, + &public, + ).unwrap().is_some(), + ); + + // Different slot is ok. + assert!( + check_equivocation( + &client, + 5, + 4, + &header3, + &public, + ).unwrap().is_none(), + ); + + // Here we trigger pruning and save header 4. + assert!( + check_equivocation( + &client, + PRUNING_BOUND + 2, + MAX_SLOT_CAPACITY + 4, + &header4, + &public, + ).unwrap().is_none(), + ); + + // This fails because header 5 is an equivocation of header 4. + assert!( + check_equivocation( + &client, + PRUNING_BOUND + 3, + MAX_SLOT_CAPACITY + 4, + &header5, + &public, + ).unwrap().is_some(), + ); + + // This is ok because we pruned the corresponding header. Shows that we are pruning. + assert!( + check_equivocation( + &client, + PRUNING_BOUND + 4, + 4, + &header6, + &public, + ).unwrap().is_none(), + ); + } +} diff --git a/core/consensus/slots/src/lib.rs b/core/consensus/slots/src/lib.rs index 2f8eedb497d3907d048b3a572a20468d4e352972..c26b6e2ff6c7681387d97ccc3154f0f5821f3667 100644 --- a/core/consensus/slots/src/lib.rs +++ b/core/consensus/slots/src/lib.rs @@ -23,8 +23,10 @@ #![forbid(warnings, unsafe_code, missing_docs)] mod slots; +mod aux_schema; -pub use slots::{slot_now, SlotInfo, Slots}; +pub use slots::{SignedDuration, SlotInfo, Slots}; +pub use aux_schema::{check_equivocation, MAX_SLOT_CAPACITY, PRUNING_BOUND}; use codec::{Decode, Encode}; use consensus_common::{SyncOracle, SelectChain}; @@ -39,8 +41,6 @@ use runtime_primitives::generic::BlockId; use runtime_primitives::traits::{ApiRef, Block, ProvideRuntimeApi}; use std::fmt::Debug; use std::ops::Deref; -use std::sync::{mpsc, Arc}; -use std::thread; /// A worker that should be invoked at every new slot. pub trait SlotWorker { @@ -49,7 +49,8 @@ pub trait SlotWorker { type OnSlot: IntoFuture; /// Called when the proposer starts. - fn on_start(&self, slot_duration: u64) -> Result<(), consensus_common::Error>; + #[deprecated(note = "Not called. Please perform any initialization before calling start_slot_worker.")] + fn on_start(&self, _slot_duration: u64) -> Result<(), consensus_common::Error> { Ok(()) } /// Called when a new slot is triggered. fn on_slot(&self, chain_head: B::Header, slot_info: SlotInfo) -> Self::OnSlot; @@ -63,135 +64,59 @@ pub trait SlotCompatible { ) -> Result<(u64, u64), consensus_common::Error>; } -/// Convert an inherent error to common error. -pub fn inherent_to_common_error(err: inherents::RuntimeString) -> consensus_common::Error { - consensus_common::ErrorKind::InherentData(err.into()).into() -} - -/// Start a new slot worker in a separate thread. -#[deprecated(since = "1.1", note = "Please spawn a thread manually")] -pub fn start_slot_worker_thread( - slot_duration: SlotDuration, - select_chain: C, - worker: Arc, - sync_oracle: SO, - on_exit: OnExit, - inherent_data_providers: InherentDataProviders, -) -> Result<(), consensus_common::Error> -where - B: Block + 'static, - C: SelectChain + Clone + 'static, - W: SlotWorker + Send + Sync + 'static, - SO: SyncOracle + Send + Clone + 'static, - SC: SlotCompatible + 'static, - OnExit: Future + Send + 'static, - T: SlotData + Send + Clone + 'static, -{ - use tokio::runtime::current_thread::Runtime; - - let (result_sender, result_recv) = mpsc::channel(); - - thread::spawn(move || { - let mut runtime = match Runtime::new() { - Ok(r) => r, - Err(e) => { - warn!(target: "slots", "Unable to start authorship: {:?}", e); - return; - } - }; - - let slot_worker_future = match start_slot_worker::<_, _, _, T, _, SC, _>( - slot_duration.clone(), - select_chain, - worker, - sync_oracle, - on_exit, - inherent_data_providers, - ) { - Ok(slot_worker_future) => { - result_sender - .send(Ok(())) - .expect("Receive is not dropped before receiving a result; qed"); - slot_worker_future - } - Err(e) => { - result_sender - .send(Err(e)) - .expect("Receive is not dropped before receiving a result; qed"); - return; - } - }; - - let _ = runtime.block_on(slot_worker_future); - }); - - result_recv - .recv() - .expect("Slots start thread result sender dropped") -} - /// Start a new slot worker. -pub fn start_slot_worker( +/// +/// Every time a new slot is triggered, `worker.on_slot` is called and the future it returns is +/// polled until completion, unless we are major syncing. +pub fn start_slot_worker( slot_duration: SlotDuration, client: C, - worker: Arc, + worker: W, sync_oracle: SO, - on_exit: OnExit, inherent_data_providers: InherentDataProviders, -) -> Result, consensus_common::Error> +) -> impl Future where B: Block, C: SelectChain + Clone, W: SlotWorker, SO: SyncOracle + Send + Clone, SC: SlotCompatible, - OnExit: Future, T: SlotData + Clone, { - worker.on_start(slot_duration.slot_duration())?; - - let make_authorship = move || { - let client = client.clone(); - let worker = worker.clone(); - let sync_oracle = sync_oracle.clone(); - let SlotDuration(slot_duration) = slot_duration.clone(); - let inherent_data_providers = inherent_data_providers.clone(); - - // rather than use a timer interval, we schedule our waits ourselves - Slots::::new(slot_duration.slot_duration(), inherent_data_providers) - .map_err(|e| debug!(target: "slots", "Faulty timer: {:?}", e)) - .for_each(move |slot_info| { - let client = client.clone(); - let worker = worker.clone(); - let sync_oracle = sync_oracle.clone(); - - // only propose when we are not syncing. - if sync_oracle.is_major_syncing() { - debug!(target: "slots", "Skipping proposal slot due to sync."); + let SlotDuration(slot_duration) = slot_duration; + + // rather than use a timer interval, we schedule our waits ourselves + let mut authorship = Slots::::new(slot_duration.slot_duration(), inherent_data_providers) + .map_err(|e| debug!(target: "slots", "Faulty timer: {:?}", e)) + .for_each(move |slot_info| { + // only propose when we are not syncing. + if sync_oracle.is_major_syncing() { + debug!(target: "slots", "Skipping proposal slot due to sync."); + return Either::B(future::ok(())); + } + + let slot_num = slot_info.number; + let chain_head = match client.best_chain() { + Ok(x) => x, + Err(e) => { + warn!(target: "slots", "Unable to author block in slot {}. \ + no best block header: {:?}", slot_num, e); return Either::B(future::ok(())); } - - let slot_num = slot_info.number; - let chain_head = match client.best_chain() { - Ok(x) => x, - Err(e) => { - warn!(target: "slots", "Unable to author block in slot {}. \ - no best block header: {:?}", slot_num, e); - return Either::B(future::ok(())); - } - }; - - Either::A(worker.on_slot(chain_head, slot_info).into_future().map_err( - |e| warn!(target: "slots", "Encountered consensus error: {:?}", e), - )) - }) - }; - - let work = future::loop_fn((), move |()| { - let authorship_task = ::std::panic::AssertUnwindSafe(make_authorship()); - authorship_task.catch_unwind().then(|res| { - match res { - Ok(Ok(())) => (), + }; + + Either::A(worker.on_slot(chain_head, slot_info).into_future().map_err( + |e| warn!(target: "slots", "Encountered consensus error: {:?}", e), + )) + }); + + future::poll_fn(move || + loop { + let mut authorship = std::panic::AssertUnwindSafe(&mut authorship); + match std::panic::catch_unwind(move || authorship.poll()) { + Ok(Ok(Async::Ready(()))) => + warn!(target: "slots", "Slots stream has terminated unexpectedly."), + Ok(Ok(Async::NotReady)) => break Ok(Async::NotReady), Ok(Err(())) => warn!(target: "slots", "Authorship task terminated unexpectedly. Restarting"), Err(e) => { if let Some(s) = e.downcast_ref::<&'static str>() { @@ -201,12 +126,8 @@ where warn!(target: "slots", "Restarting authorship task"); } } - - Ok(future::Loop::Continue(())) - }) - }); - - Ok(work.select(on_exit).then(|_| Ok(()))) + } + ) } /// A header which has been checked diff --git a/core/consensus/slots/src/slots.rs b/core/consensus/slots/src/slots.rs index df21ae9b839ce99c8f58c8bed11cd35457b8b7c8..1bce98487ac94f6b9a93bc123bee6457cbeff1b2 100644 --- a/core/consensus/slots/src/slots.rs +++ b/core/consensus/slots/src/slots.rs @@ -19,33 +19,48 @@ //! This is used instead of `tokio_timer::Interval` because it was unreliable. use super::SlotCompatible; -use consensus_common::{Error, ErrorKind}; +use consensus_common::Error; use futures::prelude::*; use futures::try_ready; use inherents::{InherentData, InherentDataProviders}; -use log::warn; + use std::marker::PhantomData; use std::time::{Duration, Instant}; -use tokio::timer::Delay; +use tokio_timer::Delay; /// Returns current duration since unix epoch. -pub fn duration_now() -> Option { +pub fn duration_now() -> Duration { use std::time::SystemTime; - let now = SystemTime::now(); - now.duration_since(SystemTime::UNIX_EPOCH) - .map_err(|e| { - warn!( - "Current time {:?} is before unix epoch. Something is wrong: {:?}", - now, e - ); - }) - .ok() + now.duration_since(SystemTime::UNIX_EPOCH).unwrap_or_else(|e| panic!( + "Current time {:?} is before unix epoch. Something is wrong: {:?}", + now, + e, + )) +} + + +/// A `Duration` with a sign (before or after). Immutable. +#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Default)] +pub struct SignedDuration { + offset: Duration, + is_positive: bool, } -/// Get the slot for now. -pub fn slot_now(slot_duration: u64) -> Option { - duration_now().map(|s| s.as_secs() / slot_duration) +impl SignedDuration { + /// Construct a `SignedDuration` + pub fn new(offset: Duration, is_positive: bool) -> Self { + Self { offset, is_positive } + } + + /// Get the slot for now. Panics if `slot_duration` is 0. + pub fn slot_now(&self, slot_duration: u64) -> u64 { + if self.is_positive { + duration_now() + self.offset + } else { + duration_now() - self.offset + }.as_secs() / slot_duration + } } /// Returns the duration until the next slot, based on current duration since @@ -112,11 +127,7 @@ impl Stream for Slots { self.inner_delay = match self.inner_delay.take() { None => { // schedule wait. - let wait_until = match duration_now() { - None => return Ok(Async::Ready(None)), - Some(now) => Instant::now() + time_until_next(now, slot_duration), - }; - + let wait_until = Instant::now() + time_until_next(duration_now(), slot_duration); Some(Delay::new(wait_until)) } Some(d) => Some(d), @@ -125,7 +136,7 @@ impl Stream for Slots { if let Some(ref mut inner_delay) = self.inner_delay { try_ready!(inner_delay .poll() - .map_err(|e| Error::from(ErrorKind::FaultyTimer(e)))); + .map_err(Error::FaultyTimer)); } // timeout has fired. @@ -133,7 +144,7 @@ impl Stream for Slots { let inherent_data = self .inherent_data_providers .create_inherent_data() - .map_err(crate::inherent_to_common_error)?; + .map_err(|s| consensus_common::Error::InherentData(s.into_owned()))?; let (timestamp, slot_num) = SC::extract_timestamp_and_slot(&inherent_data)?; // reschedule delay for next slot. diff --git a/core/executor/Cargo.toml b/core/executor/Cargo.toml index 0272ce2f47e8f363b7277cdac959945886473a90..9cc198557da0f1c57657e9a31f051fabca05c42d 100644 --- a/core/executor/Cargo.toml +++ b/core/executor/Cargo.toml @@ -5,7 +5,7 @@ authors = ["Parity Technologies "] edition = "2018" [dependencies] -error-chain = "0.12" +derive_more = "0.14.0" parity-codec = "3.3" runtime_io = { package = "sr-io", path = "../sr-io" } primitives = { package = "substrate-primitives", path = "../primitives" } @@ -17,7 +17,7 @@ panic-handler = { package = "substrate-panic-handler", path = "../panic-handler" wasmi = { version = "0.4.3" } byteorder = "1.1" lazy_static = "1.0" -parking_lot = "0.7.1" +parking_lot = "0.8.0" log = "0.4" libsecp256k1 = "0.2.1" tiny-keccak = "1.4.2" diff --git a/core/executor/src/allocator.rs b/core/executor/src/allocator.rs index 4b3f7d32193cffd8d26f80404d5a4954e95b58f7..9e61a2c6ef553533ee5e1dae138717001ab857b7 100644 --- a/core/executor/src/allocator.rs +++ b/core/executor/src/allocator.rs @@ -17,9 +17,8 @@ //! This module implements a freeing-bump allocator. //! See more details at https://github.com/paritytech/substrate/issues/1615. -use crate::wasm_utils::UserError; +use crate::error::{Error, Result}; use log::trace; -use wasmi::Error; use wasmi::MemoryRef; use wasmi::memory_units::Bytes; @@ -34,9 +33,6 @@ const ALIGNMENT: u32 = 8; const N: usize = 22; const MAX_POSSIBLE_ALLOCATION: u32 = 16777216; // 2^24 bytes -pub const OUT_OF_SPACE: &str = "Requested allocation size does not fit into remaining heap space"; -pub const REQUESTED_SIZE_TOO_LARGE: &str = "Requested size to allocate is too large"; - pub struct FreeingBumpHeapAllocator { bumper: u32, heads: [u32; N], @@ -46,8 +42,12 @@ pub struct FreeingBumpHeapAllocator { total_size: u32, } -impl FreeingBumpHeapAllocator { +/// Create an allocator error. +fn error(msg: &'static str) -> Error { + Error::Allocator(msg) +} +impl FreeingBumpHeapAllocator { /// Creates a new allocation heap which follows a freeing-bump strategy. /// The maximum size which can be allocated at once is 16 MiB. /// @@ -87,23 +87,22 @@ impl FreeingBumpHeapAllocator { /// Gets requested number of bytes to allocate and returns a pointer. /// The maximum size which can be allocated at once is 16 MiB. - pub fn allocate(&mut self, size: u32) -> Result { + pub fn allocate(&mut self, size: u32) -> Result { if size > MAX_POSSIBLE_ALLOCATION { - return Err(UserError(REQUESTED_SIZE_TOO_LARGE)); + return Err(Error::RequestedAllocationTooLarge); } let size = size.max(8); let item_size = size.next_power_of_two(); if item_size + 8 + self.total_size > self.max_heap_size { - return Err(UserError(OUT_OF_SPACE)); + return Err(Error::AllocatorOutOfSpace); } let list_index = (item_size.trailing_zeros() - 3) as usize; let ptr: u32 = if self.heads[list_index] != 0 { // Something from the free list let item = self.heads[list_index]; - let four_bytes = self.get_heap_4bytes(item) - .map_err(|_| UserError("Unable to get bytes at pointer taken from list of free items"))?; + let four_bytes = self.get_heap_4bytes(item)?; self.heads[list_index] = FreeingBumpHeapAllocator::le_bytes_to_u32(four_bytes); item + 8 } else { @@ -111,13 +110,9 @@ impl FreeingBumpHeapAllocator { self.bump(item_size + 8) + 8 }; - for i in 1..8 { - self.set_heap(ptr - i, 255) - .map_err(|_| UserError("Unable to successively write bytes into heap at pointer prefix"))?; - } + (1..8).try_for_each(|i| self.set_heap(ptr - i, 255))?; - self.set_heap(ptr - 8, list_index as u8) - .map_err(|_| UserError("Unable to write byte into heap at pointer prefix"))?; + self.set_heap(ptr - 8, list_index as u8)?; self.total_size = self.total_size + item_size + 8; trace!(target: "wasm-heap", "Heap size is {} bytes after allocation", self.total_size); @@ -126,31 +121,24 @@ impl FreeingBumpHeapAllocator { } /// Deallocates the space which was allocated for a pointer. - pub fn deallocate(&mut self, ptr: u32) -> Result<(), UserError> { + pub fn deallocate(&mut self, ptr: u32) -> Result<()> { let ptr = ptr - self.ptr_offset; if ptr < 8 { - return Err(UserError("Invalid pointer for deallocation")); + return Err(error("Invalid pointer for deallocation")); } - let list_index = self.get_heap_byte(ptr - 8) - .map_err(|_| UserError("Unable to access pointer prefix"))? as usize; - for i in 1..8 { - let heap_byte = self.get_heap_byte(ptr - i) - .map_err(|_| UserError("Unable to write single bytes into heap at pointer"))?; - debug_assert!(heap_byte == 255) - } + let list_index = usize::from(self.get_heap_byte(ptr - 8)?); + (1..8).try_for_each(|i| self.get_heap_byte(ptr - i).map(|byte| assert!(byte == 255)))?; let tail = self.heads[list_index]; self.heads[list_index] = ptr - 8; - let mut slice = self.get_heap_4bytes(ptr - 8) - .map_err(|_| UserError("Unable to get 4 bytes from heap at pointer prefix"))?; + let mut slice = self.get_heap_4bytes(ptr - 8)?; FreeingBumpHeapAllocator::write_u32_into_le_bytes(tail, &mut slice); - self.set_heap_4bytes(ptr - 8, slice) - .map_err(|_| UserError("Unable to write 4 bytes into heap at pointer prefix"))?; + self.set_heap_4bytes(ptr - 8, slice)?; let item_size = FreeingBumpHeapAllocator::get_item_size_from_index(list_index); self.total_size = self.total_size.checked_sub(item_size as u32 + 8) - .ok_or_else(|| UserError("Unable to subtract from total heap size without overflow"))?; + .ok_or_else(|| error("Unable to subtract from total heap size without overflow"))?; trace!(target: "wasm-heap", "Heap size is {} bytes after deallocation", self.total_size); Ok(()) @@ -163,8 +151,7 @@ impl FreeingBumpHeapAllocator { } fn le_bytes_to_u32(arr: [u8; 4]) -> u32 { - let bytes = [arr[0], arr[1], arr[2], arr[3]]; - unsafe { std::mem::transmute::<[u8; 4], u32>(bytes) }.to_le() + u32::from_le_bytes(arr) } fn write_u32_into_le_bytes(bytes: u32, slice: &mut [u8]) { @@ -177,24 +164,24 @@ impl FreeingBumpHeapAllocator { 1 << 3 << index } - fn get_heap_4bytes(&mut self, ptr: u32) -> Result<[u8; 4], Error> { + fn get_heap_4bytes(&mut self, ptr: u32) -> Result<[u8; 4]> { let mut arr = [0u8; 4]; self.heap.get_into(self.ptr_offset + ptr, &mut arr)?; Ok(arr) } - fn get_heap_byte(&mut self, ptr: u32) -> Result { + fn get_heap_byte(&mut self, ptr: u32) -> Result { let mut arr = [0u8; 1]; self.heap.get_into(self.ptr_offset + ptr, &mut arr)?; Ok(arr[0]) } - fn set_heap(&mut self, ptr: u32, value: u8) -> Result<(), Error> { - self.heap.set(self.ptr_offset + ptr, &[value]) + fn set_heap(&mut self, ptr: u32, value: u8) -> Result<()> { + self.heap.set(self.ptr_offset + ptr, &[value]).map_err(Into::into) } - fn set_heap_4bytes(&mut self, ptr: u32, value: [u8; 4]) -> Result<(), Error> { - self.heap.set(self.ptr_offset + ptr, &value) + fn set_heap_4bytes(&mut self, ptr: u32, value: [u8; 4]) -> Result<()> { + self.heap.set(self.ptr_offset + ptr, &value).map_err(Into::into) } } @@ -354,7 +341,10 @@ mod tests { // then assert_eq!(ptr.is_err(), true); if let Err(err) = ptr { - assert_eq!(err, UserError(OUT_OF_SPACE)); + match err { + Error::AllocatorOutOfSpace => {}, + _ => panic!("Expected out of space error"), + } } } @@ -373,7 +363,10 @@ mod tests { // there is no room for another half page incl. its 8 byte prefix assert_eq!(ptr2.is_err(), true); if let Err(err) = ptr2 { - assert_eq!(err, UserError(OUT_OF_SPACE)); + match err { + Error::AllocatorOutOfSpace => {}, + _ => panic!("Expected out of space error"), + } } } @@ -403,7 +396,10 @@ mod tests { // then assert_eq!(ptr.is_err(), true); if let Err(err) = ptr { - assert_eq!(err, UserError(REQUESTED_SIZE_TOO_LARGE)); + match err { + Error::RequestedAllocationTooLarge => {}, + e => panic!("Expected out of space error, got: {:?}", e), + } } } diff --git a/core/executor/src/error.rs b/core/executor/src/error.rs index b27ccf01bf4cef520c3e22d0d9ce8923f7456f5c..a81fc1b148287b0e76953455c1153f53ad998aaf 100644 --- a/core/executor/src/error.rs +++ b/core/executor/src/error.rs @@ -16,74 +16,78 @@ //! Rust executor possible errors. -// Silence: `use of deprecated item 'std::error::Error::cause': replaced by Error::source, which can support downcasting` -// https://github.com/paritytech/substrate/issues/1547 -#![allow(deprecated)] - use state_machine; use serializer; use wasmi; -use error_chain::{ - error_chain, error_chain_processing, impl_error_chain_processed, - impl_extract_backtrace, impl_error_chain_kind -}; - -error_chain! { - foreign_links { - InvalidData(serializer::Error) #[doc = "Unserializable Data"]; - Trap(wasmi::Trap) #[doc = "Trap occured during execution"]; - Wasmi(wasmi::Error) #[doc = "Wasmi loading/instantiating error"]; - } - - errors { - /// Method is not found - MethodNotFound(t: String) { - description("method not found"), - display("Method not found: '{}'", t), - } - /// Code is invalid (expected single byte) - InvalidCode(c: Vec) { - description("invalid code"), - display("Invalid Code: {:?}", c), - } - - /// Could not get runtime version. - VersionInvalid { - description("Runtime version error"), - display("On-chain runtime does not specify version"), - } - - /// Externalities have failed. - Externalities { - description("externalities failure"), - display("Externalities error"), - } +/// Result type alias. +pub type Result = std::result::Result; + +/// Error type. +#[derive(Debug, derive_more::Display, derive_more::From)] +pub enum Error { + /// Unserializable Data + InvalidData(serializer::Error), + /// Trap occured during execution + Trap(wasmi::Trap), + /// Wasmi loading/instantiating error + Wasmi(wasmi::Error), + /// Error in the API. Parameter is an error message. + ApiError(String), + /// Method is not found + #[display(fmt="Method not found: '{}'", _0)] + MethodNotFound(String), + /// Code is invalid (expected single byte) + #[display(fmt="Invalid Code: {:?}", _0)] + InvalidCode(Vec), + /// Could not get runtime version. + #[display(fmt="On-chain runtime does not specify version")] + VersionInvalid, + /// Externalities have failed. + #[display(fmt="Externalities error")] + Externalities, + /// Invalid index. + #[display(fmt="Invalid index provided")] + InvalidIndex, + /// Invalid return type. + #[display(fmt="Invalid type returned (should be u64)")] + InvalidReturn, + /// Runtime failed. + #[display(fmt="Runtime error")] + Runtime, + /// Invalid memory reference. + #[display(fmt="Invalid memory reference")] + InvalidMemoryReference, + /// Some other error occurred + Other(&'static str), + /// Some error occurred in the allocator + #[display(fmt="Error in allocator: {}", _0)] + Allocator(&'static str), + /// The allocator run out of space. + #[display(fmt="Allocator run out of space")] + AllocatorOutOfSpace, + /// Someone tried to allocate more memory than the allowed maximum per allocation. + #[display(fmt="Requested allocation size is too large")] + RequestedAllocationTooLarge, +} - /// Invalid index. - InvalidIndex { - description("index given was not in range"), - display("Invalid index provided"), +impl std::error::Error for Error { + fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { + match self { + Error::InvalidData(ref err) => Some(err), + Error::Trap(ref err) => Some(err), + Error::Wasmi(ref err) => Some(err), + _ => None, } + } +} - /// Invalid return type. - InvalidReturn { - description("u64 was not returned"), - display("Invalid type returned (should be u64)"), - } +impl state_machine::Error for Error {} - /// Runtime failed. - Runtime { - description("runtime failure"), - display("Runtime error"), - } +impl wasmi::HostError for Error {} - /// Runtime failed. - InvalidMemoryReference { - description("invalid memory reference"), - display("Invalid memory reference"), - } +impl From<&'static str> for Error { + fn from(err: &'static str) -> Error { + Error::Other(err) } } - -impl state_machine::Error for Error {} diff --git a/core/executor/src/native_executor.rs b/core/executor/src/native_executor.rs index 0a702a5a1b0667878d212cbdc35f93fd9d7f3ced..e4a65c811bf6ae6e5ab49bc9db2fd7c38461a27e 100644 --- a/core/executor/src/native_executor.rs +++ b/core/executor/src/native_executor.rs @@ -15,7 +15,7 @@ // along with Substrate. If not, see . use std::{borrow::BorrowMut, result, cell::{RefMut, RefCell}}; -use crate::error::{Error, ErrorKind, Result}; +use crate::error::{Error, Result}; use state_machine::{CodeExecutor, Externalities}; use crate::wasm_executor::WasmExecutor; use wasmi::{Module as WasmModule, ModuleRef as WasmModuleInstanceRef}; @@ -55,7 +55,7 @@ fn fetch_cached_runtime_version<'a, E: Externalities>( ) -> Result<(&'a WasmModuleInstanceRef, &'a Option)> { let code_hash = match ext.original_storage_hash(well_known_keys::CODE) { Some(code_hash) => code_hash, - None => return Err(ErrorKind::InvalidCode(vec![]).into()), + None => return Err(Error::InvalidCode(vec![])), }; let maybe_runtime_preproc = cache.borrow_mut().entry(code_hash.into()) @@ -69,7 +69,7 @@ fn fetch_cached_runtime_version<'a, E: Externalities>( .or(default_heap_pages) .unwrap_or(DEFAULT_HEAP_PAGES); match WasmModule::from_buffer(code) - .map_err(|_| ErrorKind::InvalidCode(vec![]).into()) + .map_err(|_| Error::InvalidCode(vec![])) .and_then(|module| wasm_executor.prepare_module(ext, heap_pages as usize, &module)) { Ok(module) => { @@ -88,7 +88,7 @@ fn fetch_cached_runtime_version<'a, E: Externalities>( match maybe_runtime_preproc { RuntimePreproc::InvalidCode => { let code = ext.original_storage(well_known_keys::CODE).unwrap_or(vec![]); - Err(ErrorKind::InvalidCode(code).into()) + Err(Error::InvalidCode(code)) }, RuntimePreproc::ValidCode(m, v) => { Ok((m, v)) @@ -101,13 +101,13 @@ fn safe_call(f: F) -> Result { // Substrate uses custom panic hook that terminates process on panic. Disable termination for the native call. let _guard = panic_handler::AbortGuard::new(false); - ::std::panic::catch_unwind(f).map_err(|_| ErrorKind::Runtime.into()) + ::std::panic::catch_unwind(f).map_err(|_| Error::Runtime) } /// Set up the externalities and safe calling environment to execute calls to a native runtime. /// /// If the inner closure panics, it will be caught and return an error. -pub fn with_native_environment(ext: &mut Externalities, f: F) -> Result +pub fn with_native_environment(ext: &mut dyn Externalities, f: F) -> Result where F: UnwindSafe + FnOnce() -> U { ::runtime_io::with_externalities(ext, move || safe_call(f)) @@ -121,7 +121,7 @@ pub trait NativeExecutionDispatch: Send + Sync { /// Dispatch a method and input data to be executed natively. Returns `Some` result or `None` /// if the `method` is unknown. Panics if there's an unrecoverable error. // fn dispatch(ext: &mut Externalities, method: &str, data: &[u8]) -> Result>; - fn dispatch(ext: &mut Externalities, method: &str, data: &[u8]) -> Result>; + fn dispatch(ext: &mut dyn Externalities, method: &str, data: &[u8]) -> Result>; /// Provide native runtime version. fn native_version() -> NativeVersion; @@ -133,7 +133,7 @@ pub trait NativeExecutionDispatch: Send + Sync { /// A generic `CodeExecutor` implementation that uses a delegate to determine wasm code equivalence /// and dispatch to native code when possible, falling back on `WasmExecutor` when not. #[derive(Debug)] -pub struct NativeExecutor { +pub struct NativeExecutor { /// Dummy field to avoid the compiler complaining about us not using `D`. _dummy: ::std::marker::PhantomData, /// The fallback executor in case native isn't available. @@ -248,7 +248,7 @@ impl CodeExecutor for NativeExecutor { /// A unit struct which implements `NativeExecutionDispatch` feeding in the hard-coded runtime. $pub struct $name; - native_executor_instance!(IMPL $name, $dispatcher, $version, $code); + $crate::native_executor_instance!(IMPL $name, $dispatcher, $version, $code); }; (IMPL $name:ident, $dispatcher:path, $version:path, $code:expr) => { impl $crate::NativeExecutionDispatch for $name { @@ -283,7 +283,7 @@ macro_rules! native_executor_instance { } fn dispatch(ext: &mut $crate::Externalities<$crate::Blake2Hasher>, method: &str, data: &[u8]) -> $crate::error::Result> { $crate::with_native_environment(ext, move || $dispatcher(method, data))? - .ok_or_else(|| $crate::error::ErrorKind::MethodNotFound(method.to_owned()).into()) + .ok_or_else(|| $crate::error::Error::MethodNotFound(method.to_owned())) } fn native_version() -> $crate::NativeVersion { diff --git a/core/executor/src/sandbox.rs b/core/executor/src/sandbox.rs index cc21d762bec11fd13645a5a971640e5ddedd155b..ceb5f44a260bb3bdf2a4077e549ee249c5268154 100644 --- a/core/executor/src/sandbox.rs +++ b/core/executor/src/sandbox.rs @@ -18,16 +18,13 @@ //! This module implements sandboxing support in the runtime. -use std::collections::HashMap; -use std::rc::Rc; +use crate::error::{Result, Error}; +use std::{collections::HashMap, rc::Rc}; use parity_codec::{Decode, Encode}; use primitives::sandbox as sandbox_primitives; -use crate::wasm_utils::UserError; -use wasmi; -use wasmi::memory_units::Pages; use wasmi::{ Externals, FuncRef, ImportResolver, MemoryInstance, MemoryRef, Module, ModuleInstance, - ModuleRef, RuntimeArgs, RuntimeValue, Trap, TrapKind + ModuleRef, RuntimeArgs, RuntimeValue, Trap, TrapKind, memory_units::Pages, }; /// Index of a function inside the supervisor. @@ -75,18 +72,18 @@ impl ImportResolver for Imports { module_name: &str, field_name: &str, signature: &::wasmi::Signature, - ) -> Result { + ) -> std::result::Result { let key = ( module_name.as_bytes().to_owned(), field_name.as_bytes().to_owned(), ); let idx = *self.func_map.get(&key).ok_or_else(|| { - ::wasmi::Error::Instantiation(format!( + wasmi::Error::Instantiation(format!( "Export {}:{} not found", module_name, field_name )) })?; - Ok(::wasmi::FuncInstance::alloc_host(signature.clone(), idx.0)) + Ok(wasmi::FuncInstance::alloc_host(signature.clone(), idx.0)) } fn resolve_memory( @@ -94,7 +91,7 @@ impl ImportResolver for Imports { module_name: &str, field_name: &str, _memory_type: &::wasmi::MemoryDescriptor, - ) -> Result { + ) -> std::result::Result { let key = ( module_name.as_bytes().to_vec(), field_name.as_bytes().to_vec(), @@ -102,7 +99,7 @@ impl ImportResolver for Imports { let mem = self.memories_map .get(&key) .ok_or_else(|| { - ::wasmi::Error::Instantiation(format!( + wasmi::Error::Instantiation(format!( "Export {}:{} not found", module_name, field_name )) @@ -116,8 +113,8 @@ impl ImportResolver for Imports { module_name: &str, field_name: &str, _global_type: &::wasmi::GlobalDescriptor, - ) -> Result<::wasmi::GlobalRef, ::wasmi::Error> { - Err(::wasmi::Error::Instantiation(format!( + ) -> std::result::Result { + Err(wasmi::Error::Instantiation(format!( "Export {}:{} not found", module_name, field_name ))) @@ -128,8 +125,8 @@ impl ImportResolver for Imports { module_name: &str, field_name: &str, _table_type: &::wasmi::TableDescriptor, - ) -> Result<::wasmi::TableRef, ::wasmi::Error> { - Err(::wasmi::Error::Instantiation(format!( + ) -> std::result::Result { + Err(wasmi::Error::Instantiation(format!( "Export {}:{} not found", module_name, field_name ))) @@ -153,7 +150,7 @@ pub trait SandboxCapabilities { /// Returns `Err` if allocation not possible or errors during heap management. /// /// Returns pointer to the allocated block. - fn allocate(&mut self, len: u32) -> Result; + fn allocate(&mut self, len: u32) -> Result; /// Deallocate space specified by the pointer that was previously returned by [`allocate`]. /// @@ -162,21 +159,21 @@ pub trait SandboxCapabilities { /// Returns `Err` if deallocation not possible or because of errors in heap management. /// /// [`allocate`]: #tymethod.allocate - fn deallocate(&mut self, ptr: u32) -> Result<(), UserError>; + fn deallocate(&mut self, ptr: u32) -> Result<()>; /// Write `data` into the supervisor memory at offset specified by `ptr`. /// /// # Errors /// /// Returns `Err` if `ptr + data.len()` is out of bounds. - fn write_memory(&mut self, ptr: u32, data: &[u8]) -> Result<(), UserError>; + fn write_memory(&mut self, ptr: u32, data: &[u8]) -> Result<()>; /// Read `len` bytes from the supervisor memory. /// /// # Errors /// /// Returns `Err` if `ptr + len` is out of bounds. - fn read_memory(&self, ptr: u32, len: u32) -> Result, UserError>; + fn read_memory(&self, ptr: u32, len: u32) -> Result>; } /// Implementation of [`Externals`] that allows execution of guest module with @@ -190,12 +187,12 @@ pub struct GuestExternals<'a, FE: SandboxCapabilities + Externals + 'a> { } fn trap(msg: &'static str) -> Trap { - TrapKind::Host(Box::new(UserError(msg))).into() + TrapKind::Host(Box::new(Error::Other(msg))).into() } -fn deserialize_result(serialized_result: &[u8]) -> Result, Trap> { +fn deserialize_result(serialized_result: &[u8]) -> std::result::Result, Trap> { use self::sandbox_primitives::{HostError, ReturnValue}; - let result_val = Result::::decode(&mut &serialized_result[..]) + let result_val = std::result::Result::::decode(&mut &serialized_result[..]) .ok_or_else(|| trap("Decoding Result failed!"))?; match result_val { @@ -212,7 +209,7 @@ impl<'a, FE: SandboxCapabilities + Externals + 'a> Externals for GuestExternals< &mut self, index: usize, args: RuntimeArgs, - ) -> Result, Trap> { + ) -> std::result::Result, Trap> { // Make `index` typesafe again. let index = GuestFuncIndex(index); @@ -331,7 +328,7 @@ impl SandboxInstance { args: &[RuntimeValue], supervisor_externals: &mut FE, state: u32, - ) -> Result, wasmi::Error> { + ) -> std::result::Result, wasmi::Error> { with_guest_externals( supervisor_externals, self, @@ -362,7 +359,7 @@ pub enum InstantiationError { fn decode_environment_definition( raw_env_def: &[u8], memories: &[Option], -) -> Result<(Imports, GuestToSupervisorFunctionMapping), InstantiationError> { +) -> std::result::Result<(Imports, GuestToSupervisorFunctionMapping), InstantiationError> { let env_def = sandbox_primitives::EnvironmentDefinition::decode(&mut &raw_env_def[..]) .ok_or_else(|| InstantiationError::EnvironmentDefintionCorrupted)?; @@ -420,7 +417,7 @@ pub fn instantiate( wasm: &[u8], raw_env_def: &[u8], state: u32, -) -> Result { +) -> std::result::Result { let (imports, guest_to_supervisor_mapping) = decode_environment_definition(raw_env_def, &supervisor_externals.store().memories)?; @@ -476,7 +473,7 @@ impl Store { /// /// Returns `Err` if the memory couldn't be created. /// Typically happens if `initial` is more than `maximum`. - pub fn new_memory(&mut self, initial: u32, maximum: u32) -> Result { + pub fn new_memory(&mut self, initial: u32, maximum: u32) -> Result { let maximum = match maximum { sandbox_primitives::MEM_UNLIMITED => None, specified_limit => Some(Pages(specified_limit as usize)), @@ -486,8 +483,7 @@ impl Store { MemoryInstance::alloc( Pages(initial as usize), maximum, - ) - .map_err(|_| UserError("Sandboxed memory allocation error"))?; + )?; let mem_idx = self.memories.len(); self.memories.push(Some(mem)); @@ -500,12 +496,12 @@ impl Store { /// /// Returns `Err` If `instance_idx` isn't a valid index of an instance or /// instance is already torndown. - pub fn instance(&self, instance_idx: u32) -> Result, UserError> { + pub fn instance(&self, instance_idx: u32) -> Result> { self.instances .get(instance_idx as usize) .cloned() - .ok_or_else(|| UserError("Trying to access a non-existent instance"))? - .ok_or_else(|| UserError("Trying to access a torndown instance")) + .ok_or_else(|| "Trying to access a non-existent instance")? + .ok_or_else(|| "Trying to access a torndown instance".into()) } /// Returns reference to a memory instance by `memory_idx`. @@ -514,12 +510,12 @@ impl Store { /// /// Returns `Err` If `memory_idx` isn't a valid index of an memory or /// if memory has been torn down. - pub fn memory(&self, memory_idx: u32) -> Result { + pub fn memory(&self, memory_idx: u32) -> Result { self.memories .get(memory_idx as usize) .cloned() - .ok_or_else(|| UserError("Trying to access a non-existent sandboxed memory"))? - .ok_or_else(|| UserError("Trying to access a torndown sandboxed memory")) + .ok_or_else(|| "Trying to access a non-existent sandboxed memory")? + .ok_or_else(|| "Trying to access a torndown sandboxed memory".into()) } /// Tear down the memory at the specified index. @@ -528,10 +524,10 @@ impl Store { /// /// Returns `Err` if `memory_idx` isn't a valid index of an memory or /// if it has been torn down. - pub fn memory_teardown(&mut self, memory_idx: u32) -> Result<(), UserError> { + pub fn memory_teardown(&mut self, memory_idx: u32) -> Result<()> { match self.memories.get_mut(memory_idx as usize) { - None => Err(UserError("Trying to teardown a non-existent sandboxed memory")), - Some(None) => Err(UserError("Double teardown of a sandboxed memory")), + None => Err("Trying to teardown a non-existent sandboxed memory".into()), + Some(None) => Err("Double teardown of a sandboxed memory".into()), Some(memory) => { *memory = None; Ok(()) @@ -545,10 +541,10 @@ impl Store { /// /// Returns `Err` if `instance_idx` isn't a valid index of an instance or /// if it has been torn down. - pub fn instance_teardown(&mut self, instance_idx: u32) -> Result<(), UserError> { + pub fn instance_teardown(&mut self, instance_idx: u32) -> Result<()> { match self.instances.get_mut(instance_idx as usize) { - None => Err(UserError("Trying to teardown a non-existent instance")), - Some(None) => Err(UserError("Double teardown of an instance")), + None => Err("Trying to teardown a non-existent instance".into()), + Some(None) => Err("Double teardown of an instance".into()), Some(instance) => { *instance = None; Ok(()) @@ -565,13 +561,14 @@ impl Store { #[cfg(test)] mod tests { + use super::*; use primitives::{Blake2Hasher}; - use crate::allocator; - use crate::sandbox::trap; use crate::wasm_executor::WasmExecutor; - use state_machine::TestExternalities; + use state_machine::TestExternalities as CoreTestExternalities; use wabt; + type TestExternalities = CoreTestExternalities; + #[test] fn sandbox_should_work() { let mut ext = TestExternalities::::default(); @@ -643,10 +640,9 @@ mod tests { let res = WasmExecutor::new().call(&mut ext, 8, &test_code[..], "test_exhaust_heap", &code); assert_eq!(res.is_err(), true); if let Err(err) = res { - let inner_err = err.iter().next().unwrap(); assert_eq!( - format!("{}", inner_err), - format!("{}", wasmi::Error::Trap(trap(allocator::OUT_OF_SPACE))) + format!("{}", err), + format!("{}", wasmi::Error::Trap(Error::AllocatorOutOfSpace.into())) ); } } diff --git a/core/executor/src/wasm_executor.rs b/core/executor/src/wasm_executor.rs index 3fe1a1c3cc6a37ccfc6629f6158b4a9c8f221eeb..cbb47195de87baa5684aaa12e06a0709dc5bda33 100644 --- a/core/executor/src/wasm_executor.rs +++ b/core/executor/src/wasm_executor.rs @@ -16,19 +16,18 @@ //! Rust implementation of Substrate contracts. -use std::collections::HashMap; +use std::{collections::HashMap, convert::TryFrom, str}; use tiny_keccak; use secp256k1; use wasmi::{ Module, ModuleInstance, MemoryInstance, MemoryRef, TableRef, ImportsBuilder, ModuleRef, + memory_units::Pages, RuntimeValue::{I32, I64, self}, }; -use wasmi::RuntimeValue::{I32, I64, self}; -use wasmi::memory_units::{Pages}; use state_machine::{Externalities, ChildStorageKey}; -use crate::error::{Error, ErrorKind, Result}; -use crate::wasm_utils::UserError; +use crate::error::{Error, Result}; use primitives::{blake2_128, blake2_256, twox_64, twox_128, twox_256, ed25519, sr25519, Pair}; +use primitives::offchain; use primitives::hexdisplay::HexDisplay; use primitives::sandbox as sandbox_primitives; use primitives::{H256, Blake2Hasher}; @@ -75,41 +74,60 @@ impl<'e, E: Externalities> sandbox::SandboxCapabilities for Functi fn store_mut(&mut self) -> &mut sandbox::Store { &mut self.sandbox_store } - fn allocate(&mut self, len: u32) -> ::std::result::Result { + fn allocate(&mut self, len: u32) -> Result { self.heap.allocate(len) } - fn deallocate(&mut self, ptr: u32) -> ::std::result::Result<(), UserError> { + fn deallocate(&mut self, ptr: u32) -> Result<()> { self.heap.deallocate(ptr) } - fn write_memory(&mut self, ptr: u32, data: &[u8]) -> ::std::result::Result<(), UserError> { - self.memory.set(ptr, data).map_err(|_| UserError("Invalid attempt to write_memory")) + fn write_memory(&mut self, ptr: u32, data: &[u8]) -> Result<()> { + self.memory.set(ptr, data).map_err(Into::into) } - fn read_memory(&self, ptr: u32, len: u32) -> ::std::result::Result, UserError> { - self.memory.get(ptr, len as usize).map_err(|_| UserError("Invalid attempt to write_memory")) + fn read_memory(&self, ptr: u32, len: u32) -> Result> { + self.memory.get(ptr, len as usize).map_err(Into::into) } } trait WritePrimitive { - fn write_primitive(&self, offset: u32, t: T) -> ::std::result::Result<(), UserError>; + fn write_primitive(&self, offset: u32, t: T) -> Result<()>; } impl WritePrimitive for MemoryInstance { - fn write_primitive(&self, offset: u32, t: u32) -> ::std::result::Result<(), UserError> { + fn write_primitive(&self, offset: u32, t: u32) -> Result<()> { use byteorder::{LittleEndian, ByteOrder}; let mut r = [0u8; 4]; LittleEndian::write_u32(&mut r, t); - self.set(offset, &r).map_err(|_| UserError("Invalid attempt to write_primitive")) + self.set(offset, &r).map_err(Into::into) } } trait ReadPrimitive { - fn read_primitive(&self, offset: u32) -> ::std::result::Result; + fn read_primitive(&self, offset: u32) -> Result; } impl ReadPrimitive for MemoryInstance { - fn read_primitive(&self, offset: u32) -> ::std::result::Result { + fn read_primitive(&self, offset: u32) -> Result { use byteorder::{LittleEndian, ByteOrder}; - Ok(LittleEndian::read_u32(&self.get(offset, 4).map_err(|_| UserError("Invalid attempt to read_primitive"))?)) + let result = self.get(offset, 4)?; + Ok(LittleEndian::read_u32(&result)) + } +} + +fn deadline_to_timestamp(deadline: u64) -> Option { + if deadline == 0 { + None + } else { + Some(offchain::Timestamp::from_unix_millis(deadline)) + } +} + +fn u32_to_key(key: u32) -> std::result::Result, ()> { + if key > u16::max_value() as u32 { + Err(()) + } else if key == 0 { + Ok(None) + } else { + Ok(Some(offchain::CryptoKeyId(key as u16))) } } @@ -143,94 +161,133 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, Ok(()) }, ext_set_storage(key_data: *const u8, key_len: u32, value_data: *const u8, value_len: u32) => { - let key = this.memory.get(key_data, key_len as usize).map_err(|_| UserError("Invalid attempt to determine key in ext_set_storage"))?; - let value = this.memory.get(value_data, value_len as usize).map_err(|_| UserError("Invalid attempt to determine value in ext_set_storage"))?; + let key = this.memory.get(key_data, key_len as usize) + .map_err(|_| "Invalid attempt to determine key in ext_set_storage")?; + let value = this.memory.get(value_data, value_len as usize) + .map_err(|_| "Invalid attempt to determine value in ext_set_storage")?; if let Some(_preimage) = this.hash_lookup.get(&key) { - debug_trace!(target: "wasm-trace", "*** Setting storage: %{} -> {} [k={}]", ::primitives::hexdisplay::ascii_format(&_preimage), HexDisplay::from(&value), HexDisplay::from(&key)); + debug_trace!( + target: "wasm-trace", + "*** Setting storage: %{} -> {} [k={}]", + primitives::hexdisplay::ascii_format(&_preimage), + HexDisplay::from(&value), + HexDisplay::from(&key), + ); } else { - debug_trace!(target: "wasm-trace", "*** Setting storage: {} -> {} [k={}]", ::primitives::hexdisplay::ascii_format(&key), HexDisplay::from(&value), HexDisplay::from(&key)); + debug_trace!( + target: "wasm-trace", + "*** Setting storage: {} -> {} [k={}]", + primitives::hexdisplay::ascii_format(&key), + HexDisplay::from(&value), + HexDisplay::from(&key), + ); } this.ext.set_storage(key, value); Ok(()) }, - ext_set_child_storage(storage_key_data: *const u8, storage_key_len: u32, key_data: *const u8, key_len: u32, value_data: *const u8, value_len: u32) => { - let storage_key = this.memory.get(storage_key_data, storage_key_len as usize).map_err(|_| UserError("Invalid attempt to determine storage_key in ext_set_child_storage"))?; - let key = this.memory.get(key_data, key_len as usize).map_err(|_| UserError("Invalid attempt to determine key in ext_set_child_storage"))?; - let value = this.memory.get(value_data, value_len as usize).map_err(|_| UserError("Invalid attempt to determine value in ext_set_child_storage"))?; + ext_set_child_storage( + storage_key_data: *const u8, + storage_key_len: u32, + key_data: *const u8, + key_len: u32, + value_data: *const u8, + value_len: u32 + ) => { + let storage_key = this.memory.get(storage_key_data, storage_key_len as usize) + .map_err(|_| "Invalid attempt to determine storage_key in ext_set_child_storage")?; + let key = this.memory.get(key_data, key_len as usize) + .map_err(|_| "Invalid attempt to determine key in ext_set_child_storage")?; + let value = this.memory.get(value_data, value_len as usize) + .map_err(|_| "Invalid attempt to determine value in ext_set_child_storage")?; if let Some(_preimage) = this.hash_lookup.get(&key) { debug_trace!( target: "wasm-trace", "*** Setting child storage: {} -> %{} -> {} [k={}]", - ::primitives::hexdisplay::ascii_format(&storage_key), - ::primitives::hexdisplay::ascii_format(&_preimage), + primitives::hexdisplay::ascii_format(&storage_key), + primitives::hexdisplay::ascii_format(&_preimage), HexDisplay::from(&value), HexDisplay::from(&key) ); } else { debug_trace!( target: "wasm-trace", "*** Setting child storage: {} -> {} -> {} [k={}]", - ::primitives::hexdisplay::ascii_format(&storage_key), - ::primitives::hexdisplay::ascii_format(&key), + primitives::hexdisplay::ascii_format(&storage_key), + primitives::hexdisplay::ascii_format(&key), HexDisplay::from(&value), HexDisplay::from(&key) ); } let storage_key = ChildStorageKey::from_vec(storage_key) - .ok_or_else(|| - UserError("ext_set_child_storage: child storage key is invalid") - )?; + .ok_or_else(|| "ext_set_child_storage: child storage key is invalid")?; this.ext.set_child_storage(storage_key, key, value); Ok(()) }, - ext_clear_child_storage(storage_key_data: *const u8, storage_key_len: u32, key_data: *const u8, key_len: u32) => { + ext_clear_child_storage( + storage_key_data: *const u8, + storage_key_len: u32, + key_data: *const u8, + key_len: u32 + ) => { let storage_key = this.memory.get( storage_key_data, storage_key_len as usize - ).map_err(|_| UserError("Invalid attempt to determine storage_key in ext_clear_child_storage"))?; - let key = this.memory.get(key_data, key_len as usize).map_err(|_| UserError("Invalid attempt to determine key in ext_clear_child_storage"))?; - debug_trace!(target: "wasm-trace", "*** Clearing child storage: {} -> {} [k={}]", - ::primitives::hexdisplay::ascii_format(&storage_key), + ).map_err(|_| "Invalid attempt to determine storage_key in ext_clear_child_storage")?; + let key = this.memory.get(key_data, key_len as usize) + .map_err(|_| "Invalid attempt to determine key in ext_clear_child_storage")?; + debug_trace!( + target: "wasm-trace", "*** Clearing child storage: {} -> {} [k={}]", + primitives::hexdisplay::ascii_format(&storage_key), if let Some(_preimage) = this.hash_lookup.get(&key) { - format!("%{}", ::primitives::hexdisplay::ascii_format(&_preimage)) + format!("%{}", primitives::hexdisplay::ascii_format(&_preimage)) } else { - format!(" {}", ::primitives::hexdisplay::ascii_format(&key)) - }, HexDisplay::from(&key) + format!(" {}", primitives::hexdisplay::ascii_format(&key)) + }, + HexDisplay::from(&key) ); let storage_key = ChildStorageKey::from_vec(storage_key) - .ok_or_else(|| - UserError("ext_clear_child_storage: child storage key is not valid") - )?; + .ok_or_else(|| "ext_clear_child_storage: child storage key is not valid")?; + this.ext.clear_child_storage(storage_key, &key); Ok(()) }, ext_clear_storage(key_data: *const u8, key_len: u32) => { - let key = this.memory.get(key_data, key_len as usize).map_err(|_| UserError("Invalid attempt to determine key in ext_clear_storage"))?; - debug_trace!(target: "wasm-trace", "*** Clearing storage: {} [k={}]", + let key = this.memory.get(key_data, key_len as usize) + .map_err(|_| "Invalid attempt to determine key in ext_clear_storage")?; + debug_trace!( + target: "wasm-trace", "*** Clearing storage: {} [k={}]", if let Some(_preimage) = this.hash_lookup.get(&key) { format!("%{}", ::primitives::hexdisplay::ascii_format(&_preimage)) } else { format!(" {}", ::primitives::hexdisplay::ascii_format(&key)) - }, HexDisplay::from(&key)); + }, + HexDisplay::from(&key) + ); this.ext.clear_storage(&key); Ok(()) }, ext_exists_storage(key_data: *const u8, key_len: u32) -> u32 => { - let key = this.memory.get(key_data, key_len as usize).map_err(|_| UserError("Invalid attempt to determine key in ext_exists_storage"))?; + let key = this.memory.get(key_data, key_len as usize) + .map_err(|_| "Invalid attempt to determine key in ext_exists_storage")?; Ok(if this.ext.exists_storage(&key) { 1 } else { 0 }) }, - ext_exists_child_storage(storage_key_data: *const u8, storage_key_len: u32, key_data: *const u8, key_len: u32) -> u32 => { + ext_exists_child_storage( + storage_key_data: *const u8, + storage_key_len: u32, + key_data: *const u8, + key_len: u32 + ) -> u32 => { let storage_key = this.memory.get( storage_key_data, storage_key_len as usize - ).map_err(|_| UserError("Invalid attempt to determine storage_key in ext_exists_child_storage"))?; - let key = this.memory.get(key_data, key_len as usize).map_err(|_| UserError("Invalid attempt to determine key in ext_exists_child_storage"))?; + ).map_err(|_| "Invalid attempt to determine storage_key in ext_exists_child_storage")?; + let key = this.memory.get(key_data, key_len as usize) + .map_err(|_| "Invalid attempt to determine key in ext_exists_child_storage")?; let storage_key = ChildStorageKey::from_vec(storage_key) - .ok_or_else(|| - UserError("ext_exists_child_storage: child storage key is not valid") - )?; + .ok_or_else(|| "ext_exists_child_storage: child storage key is not valid")?; Ok(if this.ext.exists_child_storage(storage_key, &key) { 1 } else { 0 }) }, ext_clear_prefix(prefix_data: *const u8, prefix_len: u32) => { - let prefix = this.memory.get(prefix_data, prefix_len as usize).map_err(|_| UserError("Invalid attempt to determine prefix in ext_clear_prefix"))?; + let prefix = this.memory.get(prefix_data, prefix_len as usize) + .map_err(|_| "Invalid attempt to determine prefix in ext_clear_prefix")?; this.ext.clear_prefix(&prefix); Ok(()) }, @@ -238,11 +295,9 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, let storage_key = this.memory.get( storage_key_data, storage_key_len as usize - ).map_err(|_| UserError("Invalid attempt to determine storage_key in ext_kill_child_storage"))?; + ).map_err(|_| "Invalid attempt to determine storage_key in ext_kill_child_storage")?; let storage_key = ChildStorageKey::from_vec(storage_key) - .ok_or_else(|| - UserError("ext_exists_child_storage: child storage key is not valid") - )?; + .ok_or_else(|| "ext_exists_child_storage: child storage key is not valid")?; this.ext.kill_child_storage(storage_key); Ok(()) }, @@ -251,10 +306,11 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, let key = this.memory.get( key_data, key_len as usize - ).map_err(|_| UserError("Invalid attempt to determine key in ext_get_allocated_storage"))?; + ).map_err(|_| "Invalid attempt to determine key in ext_get_allocated_storage")?; let maybe_value = this.ext.storage(&key); - debug_trace!(target: "wasm-trace", "*** Getting storage: {} == {} [k={}]", + debug_trace!( + target: "wasm-trace", "*** Getting storage: {} == {} [k={}]", if let Some(_preimage) = this.hash_lookup.get(&key) { format!("%{}", ::primitives::hexdisplay::ascii_format(&_preimage)) } else { @@ -265,42 +321,48 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, } else { "" }, - HexDisplay::from(&key) + HexDisplay::from(&key), ); if let Some(value) = maybe_value { let offset = this.heap.allocate(value.len() as u32)? as u32; - this.memory.set(offset, &value).map_err(|_| UserError("Invalid attempt to set memory in ext_get_allocated_storage"))?; + this.memory.set(offset, &value) + .map_err(|_| "Invalid attempt to set memory in ext_get_allocated_storage")?; this.memory.write_primitive(written_out, value.len() as u32) - .map_err(|_| UserError("Invalid attempt to write written_out in ext_get_allocated_storage"))?; + .map_err(|_| "Invalid attempt to write written_out in ext_get_allocated_storage")?; Ok(offset) } else { this.memory.write_primitive(written_out, u32::max_value()) - .map_err(|_| UserError("Invalid attempt to write failed written_out in ext_get_allocated_storage"))?; + .map_err(|_| "Invalid attempt to write failed written_out in ext_get_allocated_storage")?; Ok(0) } }, // return 0 and place u32::max_value() into written_out if no value exists for the key. - ext_get_allocated_child_storage(storage_key_data: *const u8, storage_key_len: u32, key_data: *const u8, key_len: u32, written_out: *mut u32) -> *mut u8 => { + ext_get_allocated_child_storage( + storage_key_data: *const u8, + storage_key_len: u32, + key_data: *const u8, + key_len: u32, + written_out: *mut u32 + ) -> *mut u8 => { let storage_key = this.memory.get( storage_key_data, storage_key_len as usize - ).map_err(|_| UserError("Invalid attempt to determine storage_key in ext_get_allocated_child_storage"))?; + ).map_err(|_| "Invalid attempt to determine storage_key in ext_get_allocated_child_storage")?; let key = this.memory.get( key_data, key_len as usize - ).map_err(|_| UserError("Invalid attempt to determine key in ext_get_allocated_child_storage"))?; + ).map_err(|_| "Invalid attempt to determine key in ext_get_allocated_child_storage")?; let maybe_value = { let storage_key = ChildStorageKey::from_slice(&storage_key) - .ok_or_else(|| - UserError("ext_get_allocated_child_storage: child storage key is not valid") - )?; + .ok_or_else(|| "ext_get_allocated_child_storage: child storage key is not valid")?; this.ext.child_storage(storage_key, &key) }; - debug_trace!(target: "wasm-trace", "*** Getting child storage: {} -> {} == {} [k={}]", - ::primitives::hexdisplay::ascii_format(&storage_key), + debug_trace!( + target: "wasm-trace", "*** Getting child storage: {} -> {} == {} [k={}]", + primitives::hexdisplay::ascii_format(&storage_key), if let Some(_preimage) = this.hash_lookup.get(&key) { format!("%{}", ::primitives::hexdisplay::ascii_format(&_preimage)) } else { @@ -311,68 +373,85 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, } else { "" }, - HexDisplay::from(&key) + HexDisplay::from(&key), ); if let Some(value) = maybe_value { let offset = this.heap.allocate(value.len() as u32)? as u32; - this.memory.set(offset, &value).map_err(|_| UserError("Invalid attempt to set memory in ext_get_allocated_child_storage"))?; + this.memory.set(offset, &value) + .map_err(|_| "Invalid attempt to set memory in ext_get_allocated_child_storage")?; this.memory.write_primitive(written_out, value.len() as u32) - .map_err(|_| UserError("Invalid attempt to write written_out in ext_get_allocated_child_storage"))?; + .map_err(|_| "Invalid attempt to write written_out in ext_get_allocated_child_storage")?; Ok(offset) } else { this.memory.write_primitive(written_out, u32::max_value()) - .map_err(|_| UserError("Invalid attempt to write failed written_out in ext_get_allocated_child_storage"))?; + .map_err(|_| "Invalid attempt to write failed written_out in ext_get_allocated_child_storage")?; Ok(0) } }, // return u32::max_value() if no value exists for the key. - ext_get_storage_into(key_data: *const u8, key_len: u32, value_data: *mut u8, value_len: u32, value_offset: u32) -> u32 => { - let key = this.memory.get(key_data, key_len as usize).map_err(|_| UserError("Invalid attempt to get key in ext_get_storage_into"))?; + ext_get_storage_into( + key_data: *const u8, + key_len: u32, + value_data: *mut u8, + value_len: u32, + value_offset: u32 + ) -> u32 => { + let key = this.memory.get(key_data, key_len as usize) + .map_err(|_| "Invalid attempt to get key in ext_get_storage_into")?; let maybe_value = this.ext.storage(&key); - debug_trace!(target: "wasm-trace", "*** Getting storage: {} == {} [k={}]", + debug_trace!( + target: "wasm-trace", "*** Getting storage: {} == {} [k={}]", if let Some(_preimage) = this.hash_lookup.get(&key) { - format!("%{}", ::primitives::hexdisplay::ascii_format(&_preimage)) + format!("%{}", primitives::hexdisplay::ascii_format(&_preimage)) } else { - format!(" {}", ::primitives::hexdisplay::ascii_format(&key)) + format!(" {}", primitives::hexdisplay::ascii_format(&key)) }, if let Some(ref b) = maybe_value { &format!("{}", HexDisplay::from(b)) } else { "" }, - HexDisplay::from(&key) + HexDisplay::from(&key), ); if let Some(value) = maybe_value { let value = &value[value_offset as usize..]; - let written = ::std::cmp::min(value_len as usize, value.len()); - this.memory.set(value_data, &value[..written]).map_err(|_| UserError("Invalid attempt to set value in ext_get_storage_into"))?; + let written = std::cmp::min(value_len as usize, value.len()); + this.memory.set(value_data, &value[..written]) + .map_err(|_| "Invalid attempt to set value in ext_get_storage_into")?; Ok(written as u32) } else { Ok(u32::max_value()) } }, // return u32::max_value() if no value exists for the key. - ext_get_child_storage_into(storage_key_data: *const u8, storage_key_len: u32, key_data: *const u8, key_len: u32, value_data: *mut u8, value_len: u32, value_offset: u32) -> u32 => { + ext_get_child_storage_into( + storage_key_data: *const u8, + storage_key_len: u32, + key_data: *const u8, + key_len: u32, + value_data: *mut u8, + value_len: u32, + value_offset: u32 + ) -> u32 => { let storage_key = this.memory.get( storage_key_data, storage_key_len as usize - ).map_err(|_| UserError("Invalid attempt to determine storage_key in ext_get_child_storage_into"))?; + ).map_err(|_| "Invalid attempt to determine storage_key in ext_get_child_storage_into")?; let key = this.memory.get( key_data, key_len as usize - ).map_err(|_| UserError("Invalid attempt to get key in ext_get_child_storage_into"))?; + ).map_err(|_| "Invalid attempt to get key in ext_get_child_storage_into")?; let maybe_value = { let storage_key = ChildStorageKey::from_slice(&*storage_key) - .ok_or_else(|| - UserError("ext_get_child_storage_into: child storage key is not valid") - )?; + .ok_or_else(|| "ext_get_child_storage_into: child storage key is not valid")?; this.ext.child_storage(storage_key, &key) }; - debug_trace!(target: "wasm-trace", "*** Getting storage: {} -> {} == {} [k={}]", - ::primitives::hexdisplay::ascii_format(&storage_key), + debug_trace!( + target: "wasm-trace", "*** Getting storage: {} -> {} == {} [k={}]", + primitives::hexdisplay::ascii_format(&storage_key), if let Some(_preimage) = this.hash_lookup.get(&key) { format!("%{}", ::primitives::hexdisplay::ascii_format(&_preimage)) } else { @@ -383,13 +462,14 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, } else { "" }, - HexDisplay::from(&key) + HexDisplay::from(&key), ); if let Some(value) = maybe_value { let value = &value[value_offset as usize..]; let written = ::std::cmp::min(value_len as usize, value.len()); - this.memory.set(value_data, &value[..written]).map_err(|_| UserError("Invalid attempt to set value in ext_get_child_storage_into"))?; + this.memory.set(value_data, &value[..written]) + .map_err(|_| "Invalid attempt to set value in ext_get_child_storage_into")?; Ok(written as u32) } else { Ok(u32::max_value()) @@ -397,52 +477,69 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, }, ext_storage_root(result: *mut u8) => { let r = this.ext.storage_root(); - this.memory.set(result, r.as_ref()).map_err(|_| UserError("Invalid attempt to set memory in ext_storage_root"))?; + this.memory.set(result, r.as_ref()) + .map_err(|_| "Invalid attempt to set memory in ext_storage_root")?; Ok(()) }, - ext_child_storage_root(storage_key_data: *const u8, storage_key_len: u32, written_out: *mut u32) -> *mut u8 => { - let storage_key = this.memory.get(storage_key_data, storage_key_len as usize).map_err(|_| UserError("Invalid attempt to determine storage_key in ext_child_storage_root"))?; + ext_child_storage_root( + storage_key_data: *const u8, + storage_key_len: u32, + written_out: *mut u32 + ) -> *mut u8 => { + let storage_key = this.memory.get(storage_key_data, storage_key_len as usize) + .map_err(|_| "Invalid attempt to determine storage_key in ext_child_storage_root")?; let storage_key = ChildStorageKey::from_slice(&*storage_key) - .ok_or_else(|| - UserError("ext_child_storage_root: child storage key is not valid") - )?; + .ok_or_else(|| "ext_child_storage_root: child storage key is not valid")?; let value = this.ext.child_storage_root(storage_key); let offset = this.heap.allocate(value.len() as u32)? as u32; - this.memory.set(offset, &value).map_err(|_| UserError("Invalid attempt to set memory in ext_child_storage_root"))?; + this.memory.set(offset, &value) + .map_err(|_| "Invalid attempt to set memory in ext_child_storage_root")?; this.memory.write_primitive(written_out, value.len() as u32) - .map_err(|_| UserError("Invalid attempt to write written_out in ext_child_storage_root"))?; + .map_err(|_| "Invalid attempt to write written_out in ext_child_storage_root")?; Ok(offset) }, - ext_storage_changes_root(parent_hash_data: *const u8, parent_hash_len: u32, parent_number: u64, result: *mut u8) -> u32 => { + ext_storage_changes_root(parent_hash_data: *const u8, parent_hash_len: u32, result: *mut u8) -> u32 => { let mut parent_hash = H256::default(); if parent_hash_len != parent_hash.as_ref().len() as u32 { - return Err(UserError("Invalid parent_hash_len in ext_storage_changes_root").into()); + return Err("Invalid parent_hash_len in ext_storage_changes_root".into()); } let raw_parent_hash = this.memory.get(parent_hash_data, parent_hash_len as usize) - .map_err(|_| UserError("Invalid attempt to get parent_hash in ext_storage_changes_root"))?; + .map_err(|_| "Invalid attempt to get parent_hash in ext_storage_changes_root")?; parent_hash.as_mut().copy_from_slice(&raw_parent_hash[..]); - let r = this.ext.storage_changes_root(parent_hash, parent_number); + let r = this.ext.storage_changes_root(parent_hash) + .map_err(|_| "Invaid parent_hash passed to ext_storage_changes_root")?; if let Some(r) = r { - this.memory.set(result, &r[..]).map_err(|_| UserError("Invalid attempt to set memory in ext_storage_changes_root"))?; + this.memory.set(result, &r[..]) + .map_err(|_| "Invalid attempt to set memory in ext_storage_changes_root")?; Ok(1) } else { Ok(0) } }, - ext_blake2_256_enumerated_trie_root(values_data: *const u8, lens_data: *const u32, lens_len: u32, result: *mut u8) => { + ext_blake2_256_enumerated_trie_root( + values_data: *const u8, + lens_data: *const u32, + lens_len: u32, + result: *mut u8 + ) => { let values = (0..lens_len) .map(|i| this.memory.read_primitive(lens_data + i * 4)) - .collect::<::std::result::Result, UserError>>()? + .collect::>>()? .into_iter() .scan(0u32, |acc, v| { let o = *acc; *acc += v; Some((o, v)) }) .map(|(offset, len)| this.memory.get(values_data + offset, len as usize) - .map_err(|_| UserError("Invalid attempt to get memory in ext_blake2_256_enumerated_trie_root")) + .map_err(|_| + Error::from( + "Invalid attempt to get memory in ext_blake2_256_enumerated_trie_root" + ) + ) ) - .collect::<::std::result::Result, UserError>>()?; + .collect::>>()?; let r = ordered_trie_root::(values.into_iter()); - this.memory.set(result, &r[..]).map_err(|_| UserError("Invalid attempt to set memory in ext_blake2_256_enumerated_trie_root"))?; + this.memory.set(result, &r[..]) + .map_err(|_| "Invalid attempt to set memory in ext_blake2_256_enumerated_trie_root")?; Ok(()) }, ext_chain_id() -> u64 => { @@ -455,21 +552,25 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, this.hash_lookup.insert(hashed.to_vec(), vec![]); hashed } else { - let key = this.memory.get(data, len as usize).map_err(|_| UserError("Invalid attempt to get key in ext_twox_64"))?; + let key = this.memory.get(data, len as usize) + .map_err(|_| "Invalid attempt to get key in ext_twox_64")?; let hashed_key = twox_64(&key); - debug_trace!(target: "xxhash", "XXhash: {} -> {}", - if let Ok(_skey) = ::std::str::from_utf8(&key) { + + debug_trace!( + target: "xxhash", "XXhash: {} -> {}", + if let Ok(_skey) = str::from_utf8(&key) { _skey } else { &format!("{}", HexDisplay::from(&key)) }, - HexDisplay::from(&hashed_key) + HexDisplay::from(&hashed_key), ); + this.hash_lookup.insert(hashed_key.to_vec(), key); hashed_key }; - this.memory.set(out, &result).map_err(|_| UserError("Invalid attempt to set result in ext_twox_64"))?; + this.memory.set(out, &result).map_err(|_| "Invalid attempt to set result in ext_twox_64")?; Ok(()) }, ext_twox_128(data: *const u8, len: u32, out: *mut u8) => { @@ -479,30 +580,35 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, this.hash_lookup.insert(hashed.to_vec(), vec![]); hashed } else { - let key = this.memory.get(data, len as usize).map_err(|_| UserError("Invalid attempt to get key in ext_twox_128"))?; + let key = this.memory.get(data, len as usize) + .map_err(|_| "Invalid attempt to get key in ext_twox_128")?; let hashed_key = twox_128(&key); - debug_trace!(target: "xxhash", "XXhash: {} -> {}", - if let Ok(_skey) = ::std::str::from_utf8(&key) { - _skey + debug_trace!( + target: "xxhash", "XXhash: {} -> {}", + &if let Ok(_skey) = str::from_utf8(&key) { + *_skey } else { - &format!("{}", HexDisplay::from(&key)) + format!("{}", HexDisplay::from(&key)) }, - HexDisplay::from(&hashed_key) + HexDisplay::from(&hashed_key), ); this.hash_lookup.insert(hashed_key.to_vec(), key); hashed_key }; - this.memory.set(out, &result).map_err(|_| UserError("Invalid attempt to set result in ext_twox_128"))?; + this.memory.set(out, &result) + .map_err(|_| "Invalid attempt to set result in ext_twox_128")?; Ok(()) }, ext_twox_256(data: *const u8, len: u32, out: *mut u8) => { let result: [u8; 32] = if len == 0 { twox_256(&[0u8; 0]) } else { - twox_256(&this.memory.get(data, len as usize).map_err(|_| UserError("Invalid attempt to get data in ext_twox_256"))?) + let mem = this.memory.get(data, len as usize) + .map_err(|_| "Invalid attempt to get data in ext_twox_256")?; + twox_256(&mem) }; - this.memory.set(out, &result).map_err(|_| UserError("Invalid attempt to set result in ext_twox_256"))?; + this.memory.set(out, &result).map_err(|_| "Invalid attempt to set result in ext_twox_256")?; Ok(()) }, ext_blake2_128(data: *const u8, len: u32, out: *mut u8) => { @@ -511,39 +617,48 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, this.hash_lookup.insert(hashed.to_vec(), vec![]); hashed } else { - let key = this.memory.get(data, len as usize).map_err(|_| UserError("Invalid attempt to get key in ext_blake2_128"))?; + let key = this.memory.get(data, len as usize) + .map_err(|_| "Invalid attempt to get key in ext_blake2_128")?; let hashed_key = blake2_128(&key); this.hash_lookup.insert(hashed_key.to_vec(), key); hashed_key }; - this.memory.set(out, &result).map_err(|_| UserError("Invalid attempt to set result in ext_blake2_128"))?; + this.memory.set(out, &result) + .map_err(|_| "Invalid attempt to set result in ext_blake2_128")?; Ok(()) }, ext_blake2_256(data: *const u8, len: u32, out: *mut u8) => { let result: [u8; 32] = if len == 0 { blake2_256(&[0u8; 0]) } else { - blake2_256(&this.memory.get(data, len as usize).map_err(|_| UserError("Invalid attempt to get data in ext_blake2_256"))?) + let mem = this.memory.get(data, len as usize) + .map_err(|_| "Invalid attempt to get data in ext_blake2_256")?; + blake2_256(&mem) }; - this.memory.set(out, &result).map_err(|_| UserError("Invalid attempt to set result in ext_blake2_256"))?; + this.memory.set(out, &result).map_err(|_| "Invalid attempt to set result in ext_blake2_256")?; Ok(()) }, ext_keccak_256(data: *const u8, len: u32, out: *mut u8) => { let result: [u8; 32] = if len == 0 { tiny_keccak::keccak256(&[0u8; 0]) } else { - tiny_keccak::keccak256(&this.memory.get(data, len as usize).map_err(|_| UserError("Invalid attempt to get data in ext_keccak_256"))?) + let mem = this.memory.get(data, len as usize) + .map_err(|_| "Invalid attempt to get data in ext_keccak_256")?; + tiny_keccak::keccak256(&mem) }; - this.memory.set(out, &result).map_err(|_| UserError("Invalid attempt to set result in ext_keccak_256"))?; + this.memory.set(out, &result).map_err(|_| "Invalid attempt to set result in ext_keccak_256")?; Ok(()) }, ext_ed25519_verify(msg_data: *const u8, msg_len: u32, sig_data: *const u8, pubkey_data: *const u8) -> u32 => { let mut sig = [0u8; 64]; - this.memory.get_into(sig_data, &mut sig[..]).map_err(|_| UserError("Invalid attempt to get signature in ext_ed25519_verify"))?; + this.memory.get_into(sig_data, &mut sig[..]) + .map_err(|_| "Invalid attempt to get signature in ext_ed25519_verify")?; let mut pubkey = [0u8; 32]; - this.memory.get_into(pubkey_data, &mut pubkey[..]).map_err(|_| UserError("Invalid attempt to get pubkey in ext_ed25519_verify"))?; - let msg = this.memory.get(msg_data, msg_len as usize).map_err(|_| UserError("Invalid attempt to get message in ext_ed25519_verify"))?; + this.memory.get_into(pubkey_data, &mut pubkey[..]) + .map_err(|_| "Invalid attempt to get pubkey in ext_ed25519_verify")?; + let msg = this.memory.get(msg_data, msg_len as usize) + .map_err(|_| "Invalid attempt to get message in ext_ed25519_verify")?; Ok(if ed25519::Pair::verify_weak(&sig, &msg, &pubkey) { 0 @@ -553,10 +668,13 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, }, ext_sr25519_verify(msg_data: *const u8, msg_len: u32, sig_data: *const u8, pubkey_data: *const u8) -> u32 => { let mut sig = [0u8; 64]; - this.memory.get_into(sig_data, &mut sig[..]).map_err(|_| UserError("Invalid attempt to get signature in ext_sr25519_verify"))?; + this.memory.get_into(sig_data, &mut sig[..]) + .map_err(|_| "Invalid attempt to get signature in ext_sr25519_verify")?; let mut pubkey = [0u8; 32]; - this.memory.get_into(pubkey_data, &mut pubkey[..]).map_err(|_| UserError("Invalid attempt to get pubkey in ext_sr25519_verify"))?; - let msg = this.memory.get(msg_data, msg_len as usize).map_err(|_| UserError("Invalid attempt to get message in ext_sr25519_verify"))?; + this.memory.get_into(pubkey_data, &mut pubkey[..]) + .map_err(|_| "Invalid attempt to get pubkey in ext_sr25519_verify")?; + let msg = this.memory.get(msg_data, msg_len as usize) + .map_err(|_| "Invalid attempt to get message in ext_sr25519_verify")?; Ok(if sr25519::Pair::verify_weak(&sig, &msg, &pubkey) { 0 @@ -566,7 +684,8 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, }, ext_secp256k1_ecdsa_recover(msg_data: *const u8, sig_data: *const u8, pubkey_data: *mut u8) -> u32 => { let mut sig = [0u8; 65]; - this.memory.get_into(sig_data, &mut sig[..]).map_err(|_| UserError("Invalid attempt to get signature in ext_secp256k1_ecdsa_recover"))?; + this.memory.get_into(sig_data, &mut sig[..]) + .map_err(|_| "Invalid attempt to get signature in ext_secp256k1_ecdsa_recover")?; let rs = match secp256k1::Signature::parse_slice(&sig[0..64]) { Ok(rs) => rs, _ => return Ok(1), @@ -578,26 +697,358 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, let mut msg = [0u8; 32]; - this.memory.get_into(msg_data, &mut msg[..]).map_err(|_| UserError("Invalid attempt to get message in ext_secp256k1_ecdsa_recover"))?; + this.memory.get_into(msg_data, &mut msg[..]) + .map_err(|_| "Invalid attempt to get message in ext_secp256k1_ecdsa_recover")?; let pubkey = match secp256k1::recover(&secp256k1::Message::parse(&msg), &rs, &v) { Ok(pk) => pk, _ => return Ok(3), }; - this.memory.set(pubkey_data, &pubkey.serialize()[1..65]).map_err(|_| UserError("Invalid attempt to set pubkey in ext_secp256k1_ecdsa_recover"))?; + this.memory.set(pubkey_data, &pubkey.serialize()[1..65]) + .map_err(|_| "Invalid attempt to set pubkey in ext_secp256k1_ecdsa_recover")?; Ok(0) }, - ext_submit_extrinsic(msg_data: *const u8, len: u32) => { + ext_submit_transaction(msg_data: *const u8, len: u32) -> u32 => { let extrinsic = this.memory.get(msg_data, len as usize) - .map_err(|_| UserError("OOB while ext_submit_extrinsic: wasm"))?; + .map_err(|_| "OOB while ext_submit_transaction: wasm")?; + + let res = this.ext.offchain() + .map(|api| api.submit_transaction(extrinsic)) + .ok_or_else(|| "Calling unavailable API ext_submit_transaction: wasm")?; + + Ok(if res.is_ok() { 0 } else { 1 }) + }, + ext_new_crypto_key(crypto: u32) -> u32 => { + let kind = offchain::CryptoKind::try_from(crypto) + .map_err(|_| "crypto kind OOB while ext_new_crypto_key: wasm")?; - this.ext.submit_extrinsic(extrinsic) - .map_err(|_| UserError("Calling unavailable API ext_submit_extrinsic: wasm"))?; + let res = this.ext.offchain() + .map(|api| api.new_crypto_key(kind)) + .ok_or_else(|| "Calling unavailable API ext_new_crypto_key: wasm")?; + match res { + Ok(key_id) => Ok(key_id.0 as u32), + Err(()) => Ok(u32::max_value()), + } + }, + ext_encrypt(key: u32, data: *const u8, data_len: u32, msg_len: *mut u32) -> *mut u8 => { + let key = u32_to_key(key) + .map_err(|_| "Key OOB while ext_encrypt: wasm")?; + let message = this.memory.get(data, data_len as usize) + .map_err(|_| "OOB while ext_encrypt: wasm")?; + + let res = this.ext.offchain() + .map(|api| api.encrypt(key, &*message)) + .ok_or_else(|| "Calling unavailable API ext_encrypt: wasm")?; + + let (offset,len) = match res { + Ok(encrypted) => { + let len = encrypted.len() as u32; + let offset = this.heap.allocate(len)? as u32; + this.memory.set(offset, &encrypted) + .map_err(|_| "Invalid attempt to set memory in ext_encrypt")?; + (offset, len) + }, + Err(()) => (0, u32::max_value()), + }; + + this.memory.write_primitive(msg_len, len) + .map_err(|_| "Invalid attempt to write msg_len in ext_encrypt")?; + + Ok(offset) + }, + ext_decrypt(key: u32, data: *const u8, data_len: u32, msg_len: *mut u32) -> *mut u8 => { + let key = u32_to_key(key) + .map_err(|_| "Key OOB while ext_decrypt: wasm")?; + let message = this.memory.get(data, data_len as usize) + .map_err(|_| "OOB while ext_decrypt: wasm")?; + + let res = this.ext.offchain() + .map(|api| api.decrypt(key, &*message)) + .ok_or_else(|| "Calling unavailable API ext_decrypt: wasm")?; + + let (offset,len) = match res { + Ok(decrypted) => { + let len = decrypted.len() as u32; + let offset = this.heap.allocate(len)? as u32; + this.memory.set(offset, &decrypted) + .map_err(|_| "Invalid attempt to set memory in ext_decrypt")?; + (offset, len) + }, + Err(()) => (0, u32::max_value()), + }; + + this.memory.write_primitive(msg_len, len) + .map_err(|_| "Invalid attempt to write msg_len in ext_decrypt")?; + + Ok(offset) + }, + ext_sign(key: u32, data: *const u8, data_len: u32, sig_data_len: *mut u32) -> *mut u8 => { + let key = u32_to_key(key) + .map_err(|_| "Key OOB while ext_sign: wasm")?; + let message = this.memory.get(data, data_len as usize) + .map_err(|_| "OOB while ext_sign: wasm")?; + + let res = this.ext.offchain() + .map(|api| api.sign(key, &*message)) + .ok_or_else(|| "Calling unavailable API ext_sign: wasm")?; + + let (offset,len) = match res { + Ok(signature) => { + let len = signature.len() as u32; + let offset = this.heap.allocate(len)? as u32; + this.memory.set(offset, &signature) + .map_err(|_| "Invalid attempt to set memory in ext_sign")?; + (offset, len) + }, + Err(()) => (0, u32::max_value()), + }; + + this.memory.write_primitive(sig_data_len, len) + .map_err(|_| "Invalid attempt to write sig_data_len in ext_sign")?; + + Ok(offset) + }, + ext_verify( + key: u32, + msg: *const u8, + msg_len: u32, + signature: *const u8, + signature_len: u32 + ) -> u32 => { + let key = u32_to_key(key) + .map_err(|_| "Key OOB while ext_verify: wasm")?; + let message = this.memory.get(msg, msg_len as usize) + .map_err(|_| "OOB while ext_verify: wasm")?; + let signature = this.memory.get(signature, signature_len as usize) + .map_err(|_| "OOB while ext_verify: wasm")?; + + let res = this.ext.offchain() + .map(|api| api.verify(key, &*message, &*signature)) + .ok_or_else(|| "Calling unavailable API ext_verify: wasm")?; + + match res { + Ok(true) => Ok(0), + Ok(false) => Ok(1), + Err(()) => Ok(u32::max_value()), + } + }, + ext_timestamp() -> u64 => { + let timestamp = this.ext.offchain() + .map(|api| api.timestamp()) + .ok_or_else(|| "Calling unavailable API ext_timestamp: wasm")?; + Ok(timestamp.unix_millis()) + }, + ext_sleep_until(deadline: u64) => { + this.ext.offchain() + .map(|api| api.sleep_until(offchain::Timestamp::from_unix_millis(deadline))) + .ok_or_else(|| "Calling unavailable API ext_sleep_until: wasm")?; + Ok(()) + }, + ext_random_seed(seed_data: *mut u8) => { + // NOTE the runtime as assumptions about seed size. + let seed: [u8; 32] = this.ext.offchain() + .map(|api| api.random_seed()) + .ok_or_else(|| "Calling unavailable API ext_random_seed: wasm")?; + + this.memory.set(seed_data, &seed) + .map_err(|_| "Invalid attempt to set value in ext_random_seed")?; Ok(()) }, + ext_local_storage_set(key: *const u8, key_len: u32, value: *const u8, value_len: u32) => { + let key = this.memory.get(key, key_len as usize) + .map_err(|_| "OOB while ext_local_storage_set: wasm")?; + let value = this.memory.get(value, value_len as usize) + .map_err(|_| "OOB while ext_local_storage_set: wasm")?; + + this.ext.offchain() + .map(|api| api.local_storage_set(&key, &value)) + .ok_or_else(|| "Calling unavailable API ext_local_storage_set: wasm")?; + + Ok(()) + }, + ext_local_storage_get(key: *const u8, key_len: u32, value_len: *mut u32) -> *mut u8 => { + let key = this.memory.get(key, key_len as usize) + .map_err(|_| "OOB while ext_local_storage_get: wasm")?; + + let maybe_value = this.ext.offchain() + .map(|api| api.local_storage_get(&key)) + .ok_or_else(|| "Calling unavailable API ext_local_storage_get: wasm")?; + + let (offset, len) = if let Some(value) = maybe_value { + let offset = this.heap.allocate(value.len() as u32)? as u32; + this.memory.set(offset, &value) + .map_err(|_| "Invalid attempt to set memory in ext_local_storage_get")?; + (offset, value.len() as u32) + } else { + (0, u32::max_value()) + }; + + this.memory.write_primitive(value_len, len) + .map_err(|_| "Invalid attempt to write value_len in ext_local_storage_get")?; + + Ok(offset) + }, + ext_http_request_start( + method: *const u8, + method_len: u32, + url: *const u8, + url_len: u32, + meta: *const u8, + meta_len: u32 + ) -> u32 => { + let method = this.memory.get(method, method_len as usize) + .map_err(|_| "OOB while ext_http_request_start: wasm")?; + let url = this.memory.get(url, url_len as usize) + .map_err(|_| "OOB while ext_http_request_start: wasm")?; + let meta = this.memory.get(meta, meta_len as usize) + .map_err(|_| "OOB while ext_http_request_start: wasm")?; + + let method_str = str::from_utf8(&method) + .map_err(|_| "invalid str while ext_http_request_start: wasm")?; + let url_str = str::from_utf8(&url) + .map_err(|_| "invalid str while ext_http_request_start: wasm")?; + + let id = this.ext.offchain() + .map(|api| api.http_request_start(method_str, url_str, &*meta)) + .ok_or_else(|| "Calling unavailable API ext_http_request_start: wasm")?; + + if let Ok(id) = id { + Ok(id.0 as u32) + } else { + Ok(u32::max_value()) + } + }, + ext_http_request_add_header( + request_id: u32, + name: *const u8, + name_len: u32, + value: *const u8, + value_len: u32 + ) -> u32 => { + let name = this.memory.get(name, name_len as usize) + .map_err(|_| "OOB while ext_http_request_add_header: wasm")?; + let value = this.memory.get(value, value_len as usize) + .map_err(|_| "OOB while ext_http_request_add_header: wasm")?; + + let name_str = str::from_utf8(&name) + .map_err(|_| "Invalid str while ext_http_request_add_header: wasm")?; + let value_str = str::from_utf8(&value) + .map_err(|_| "Invalid str while ext_http_request_add_header: wasm")?; + + let res = this.ext.offchain() + .map(|api| api.http_request_add_header( + offchain::HttpRequestId(request_id as u16), + &name_str, + &value_str, + )) + .ok_or_else(|| "Calling unavailable API ext_http_request_add_header: wasm")?; + + Ok(if res.is_ok() { 0 } else { 1 }) + }, + ext_http_request_write_body( + request_id: u32, + chunk: *const u8, + chunk_len: u32, + deadline: u64 + ) -> u32 => { + let chunk = this.memory.get(chunk, chunk_len as usize) + .map_err(|_| "OOB while ext_http_request_write_body: wasm")?; + + let res = this.ext.offchain() + .map(|api| api.http_request_write_body( + offchain::HttpRequestId(request_id as u16), + &chunk, + deadline_to_timestamp(deadline) + )) + .ok_or_else(|| "Calling unavailable API ext_http_request_write_body: wasm")?; + + Ok(match res { + Ok(()) => 0, + Err(e) => e as u8 as u32, + }) + }, + ext_http_response_wait( + ids: *const u32, + ids_len: u32, + statuses: *mut u32, + deadline: u64 + ) => { + let ids = (0..ids_len) + .map(|i| + this.memory.read_primitive(ids + i * 4) + .map(|id: u32| offchain::HttpRequestId(id as u16)) + .map_err(|_| "OOB while ext_http_response_wait: wasm") + ) + .collect::<::std::result::Result, _>>()?; + + let res = this.ext.offchain() + .map(|api| api.http_response_wait(&ids, deadline_to_timestamp(deadline))) + .ok_or_else(|| "Calling unavailable API ext_http_response_wait: wasm")? + .into_iter() + .map(|status| status.into()) + .enumerate() + // make sure to take up to `ids_len` to avoid exceeding the mem. + .take(ids_len as usize); + + for (i, status) in res { + this.memory.write_primitive(statuses + i as u32 * 4, status) + .map_err(|_| "Invalid attempt to set memory in ext_http_response_wait")?; + } + + Ok(()) + }, + ext_http_response_headers( + request_id: u32, + written_out: *mut u32 + ) -> *mut u8 => { + use parity_codec::Encode; + + let headers = this.ext.offchain() + .map(|api| api.http_response_headers(offchain::HttpRequestId(request_id as u16))) + .ok_or_else(|| "Calling unavailable API ext_http_response_headers: wasm")?; + + let encoded = headers.encode(); + let len = encoded.len() as u32; + let offset = this.heap.allocate(len)? as u32; + this.memory.set(offset, &encoded) + .map_err(|_| "Invalid attempt to set memory in ext_http_response_headers")?; + this.memory.write_primitive(written_out, len) + .map_err(|_| "Invalid attempt to write written_out in ext_http_response_headers")?; + + Ok(offset) + }, + ext_http_response_read_body( + request_id: u32, + buffer: *mut u8, + buffer_len: u32, + deadline: u64 + ) -> u32 => { + let mut internal_buffer = Vec::with_capacity(buffer_len as usize); + internal_buffer.resize(buffer_len as usize, 0); + + let res = this.ext.offchain() + .map(|api| api.http_response_read_body( + offchain::HttpRequestId(request_id as u16), + &mut internal_buffer, + deadline_to_timestamp(deadline), + )) + .ok_or_else(|| "Calling unavailable API ext_http_response_read_body: wasm")?; + + Ok(match res { + Ok(read) => { + this.memory.set(buffer, &internal_buffer[..read]) + .map_err(|_| "Invalid attempt to set memory in ext_http_response_read_body")?; + + read as u32 + }, + Err(err) => { + u32::max_value() - err as u8 as u32 + 1 + } + }) + }, ext_sandbox_instantiate( dispatch_thunk_idx: usize, wasm_ptr: *const u8, @@ -607,17 +1058,17 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, state: usize ) -> u32 => { let wasm = this.memory.get(wasm_ptr, wasm_len as usize) - .map_err(|_| UserError("OOB while ext_sandbox_instantiate: wasm"))?; + .map_err(|_| "OOB while ext_sandbox_instantiate: wasm")?; let raw_env_def = this.memory.get(imports_ptr, imports_len as usize) - .map_err(|_| UserError("OOB while ext_sandbox_instantiate: imports"))?; + .map_err(|_| "OOB while ext_sandbox_instantiate: imports")?; // Extract a dispatch thunk from instance's table by the specified index. let dispatch_thunk = { let table = this.table.as_ref() - .ok_or_else(|| UserError("Runtime doesn't have a table; sandbox is unavailable"))?; + .ok_or_else(|| "Runtime doesn't have a table; sandbox is unavailable")?; table.get(dispatch_thunk_idx) - .map_err(|_| UserError("dispatch_thunk_idx is out of the table bounds"))? - .ok_or_else(|| UserError("dispatch_thunk_idx points on an empty table entry"))? + .map_err(|_| "dispatch_thunk_idx is out of the table bounds")? + .ok_or_else(|| "dispatch_thunk_idx points on an empty table entry")? .clone() }; @@ -634,22 +1085,31 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, this.sandbox_store.instance_teardown(instance_idx)?; Ok(()) }, - ext_sandbox_invoke(instance_idx: u32, export_ptr: *const u8, export_len: usize, args_ptr: *const u8, args_len: usize, return_val_ptr: *const u8, return_val_len: usize, state: usize) -> u32 => { + ext_sandbox_invoke( + instance_idx: u32, + export_ptr: *const u8, + export_len: usize, + args_ptr: *const u8, + args_len: usize, + return_val_ptr: *const u8, + return_val_len: usize, + state: usize + ) -> u32 => { use parity_codec::{Decode, Encode}; trace!(target: "sr-sandbox", "invoke, instance_idx={}", instance_idx); let export = this.memory.get(export_ptr, export_len as usize) - .map_err(|_| UserError("OOB while ext_sandbox_invoke: export")) + .map_err(|_| "OOB while ext_sandbox_invoke: export") .and_then(|b| String::from_utf8(b) - .map_err(|_| UserError("export name should be a valid utf-8 sequence")) + .map_err(|_| "Export name should be a valid utf-8 sequence") )?; // Deserialize arguments and convert them into wasmi types. let serialized_args = this.memory.get(args_ptr, args_len as usize) - .map_err(|_| UserError("OOB while ext_sandbox_invoke: args"))?; + .map_err(|_| "OOB while ext_sandbox_invoke: args")?; let args = Vec::::decode(&mut &serialized_args[..]) - .ok_or_else(|| UserError("Can't decode serialized arguments for the invocation"))? + .ok_or_else(|| "Can't decode serialized arguments for the invocation")? .into_iter() .map(Into::into) .collect::>(); @@ -663,11 +1123,11 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, // Serialize return value and write it back into the memory. sandbox_primitives::ReturnValue::Value(val.into()).using_encoded(|val| { if val.len() > return_val_len as usize { - Err(UserError("Return value buffer is too small"))?; + Err("Return value buffer is too small")?; } this.memory .set(return_val_ptr, val) - .map_err(|_| UserError("Return value buffer is OOB"))?; + .map_err(|_| "Return value buffer is OOB")?; Ok(sandbox_primitives::ERR_OK) }) } @@ -749,7 +1209,7 @@ impl WasmExecutor { /// This should be used for tests only. pub fn call_with_custom_signature< E: Externalities, - F: FnOnce(&mut FnMut(&[u8]) -> Result) -> Result>, + F: FnOnce(&mut dyn FnMut(&[u8]) -> Result) -> Result>, FR: FnOnce(Option, &MemoryRef) -> Result>, R, >( @@ -763,15 +1223,21 @@ impl WasmExecutor { ) -> Result { let module = wasmi::Module::from_buffer(code)?; let module = self.prepare_module(ext, heap_pages, &module)?; - self.call_in_wasm_module_with_custom_signature(ext, &module, method, create_parameters, filter_result) + self.call_in_wasm_module_with_custom_signature( + ext, + &module, + method, + create_parameters, + filter_result, + ) } fn get_mem_instance(module: &ModuleRef) -> Result { Ok(module .export_by_name("memory") - .ok_or_else(|| Error::from(ErrorKind::InvalidMemoryReference))? + .ok_or_else(|| Error::InvalidMemoryReference)? .as_memory() - .ok_or_else(|| Error::from(ErrorKind::InvalidMemoryReference))? + .ok_or_else(|| Error::InvalidMemoryReference)? .clone()) } @@ -795,7 +1261,7 @@ impl WasmExecutor { if let Some(I64(r)) = res { let offset = r as u32; let length = (r as u64 >> 32) as usize; - memory.get(offset, length).map_err(|_| ErrorKind::Runtime.into()).map(Some) + memory.get(offset, length).map_err(|_| Error::Runtime).map(Some) } else { Ok(None) } @@ -806,7 +1272,7 @@ impl WasmExecutor { /// Call a given method in the given wasm-module runtime. fn call_in_wasm_module_with_custom_signature< E: Externalities, - F: FnOnce(&mut FnMut(&[u8]) -> Result) -> Result>, + F: FnOnce(&mut dyn FnMut(&[u8]) -> Result) -> Result>, FR: FnOnce(Option, &MemoryRef) -> Result>, R, >( @@ -828,7 +1294,7 @@ impl WasmExecutor { let used_mem = memory.used_size(); let mut fec = FunctionExecutor::new(memory.clone(), table, ext)?; let parameters = create_parameters(&mut |data: &[u8]| { - let offset = fec.heap.allocate(data.len() as u32).map_err(|_| ErrorKind::Runtime)?; + let offset = fec.heap.allocate(data.len() as u32)?; memory.set(offset, &data)?; Ok(offset) })?; @@ -841,7 +1307,7 @@ impl WasmExecutor { let result = match result { Ok(val) => match filter_result(val, &memory)? { Some(val) => Ok(val), - None => Err(ErrorKind::InvalidReturn.into()), + None => Err(Error::InvalidReturn), }, Err(e) => { trace!(target: "wasm-executor", "Failed to execute code with {} pages", memory.current_size().0); @@ -877,7 +1343,7 @@ impl WasmExecutor { // extract a reference to a linear memory, optional reference to a table // and then initialize FunctionExecutor. let memory = Self::get_mem_instance(intermediate_instance.not_started_instance())?; - memory.grow(Pages(heap_pages)).map_err(|_| Error::from(ErrorKind::Runtime))?; + memory.grow(Pages(heap_pages)).map_err(|_| Error::Runtime)?; let table: Option = intermediate_instance .not_started_instance() .export_by_name("__indirect_function_table") @@ -896,10 +1362,12 @@ mod tests { use parity_codec::Encode; - use state_machine::TestExternalities; + use state_machine::TestExternalities as CoreTestExternalities; use hex_literal::hex; use primitives::map; + type TestExternalities = CoreTestExternalities; + #[test] fn returning_should_work() { let mut ext = TestExternalities::default(); @@ -1025,7 +1493,7 @@ mod tests { fn ed25519_verify_should_work() { let mut ext = TestExternalities::::default(); let test_code = include_bytes!("../wasm/target/wasm32-unknown-unknown/release/runtime_test.compact.wasm"); - let key = ed25519::Pair::from_seed(blake2_256(b"test")); + let key = ed25519::Pair::from_seed(&blake2_256(b"test")); let sig = key.sign(b"all ok!"); let mut calldata = vec![]; calldata.extend_from_slice(key.public().as_ref()); @@ -1051,7 +1519,7 @@ mod tests { fn sr25519_verify_should_work() { let mut ext = TestExternalities::::default(); let test_code = include_bytes!("../wasm/target/wasm32-unknown-unknown/release/runtime_test.compact.wasm"); - let key = sr25519::Pair::from_seed(blake2_256(b"test")); + let key = sr25519::Pair::from_seed(&blake2_256(b"test")); let sig = key.sign(b"all ok!"); let mut calldata = vec![]; calldata.extend_from_slice(key.public().as_ref()); diff --git a/core/executor/src/wasm_utils.rs b/core/executor/src/wasm_utils.rs index a9fbca7f6ca4faa6ac1c35616a967e46fa62e5f6..47867f7b4849b00f5ea5ded19ce5b1b9f7b49385 100644 --- a/core/executor/src/wasm_utils.rs +++ b/core/executor/src/wasm_utils.rs @@ -16,31 +16,73 @@ //! Rust implementation of Substrate contracts. -use wasmi::{ValueType, RuntimeValue, HostError}; +use wasmi::{ValueType, RuntimeValue}; use wasmi::nan_preserving_float::{F32, F64}; -use std::fmt; - -#[derive(Debug, PartialEq)] -pub struct UserError(pub &'static str); -impl fmt::Display for UserError { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "UserError: {}", self.0) - } -} -impl HostError for UserError { -} - -pub trait ConvertibleToWasm { const VALUE_TYPE: ValueType; type NativeType; fn to_runtime_value(self) -> RuntimeValue; } -impl ConvertibleToWasm for i32 { type NativeType = i32; const VALUE_TYPE: ValueType = ValueType::I32; fn to_runtime_value(self) -> RuntimeValue { RuntimeValue::I32(self) } } -impl ConvertibleToWasm for u32 { type NativeType = u32; const VALUE_TYPE: ValueType = ValueType::I32; fn to_runtime_value(self) -> RuntimeValue { RuntimeValue::I32(self as i32) } } -impl ConvertibleToWasm for i64 { type NativeType = i64; const VALUE_TYPE: ValueType = ValueType::I64; fn to_runtime_value(self) -> RuntimeValue { RuntimeValue::I64(self) } } -impl ConvertibleToWasm for u64 { type NativeType = u64; const VALUE_TYPE: ValueType = ValueType::I64; fn to_runtime_value(self) -> RuntimeValue { RuntimeValue::I64(self as i64) } } -impl ConvertibleToWasm for F32 { type NativeType = F32; const VALUE_TYPE: ValueType = ValueType::F32; fn to_runtime_value(self) -> RuntimeValue { RuntimeValue::F32(self) } } -impl ConvertibleToWasm for F64 { type NativeType = F64; const VALUE_TYPE: ValueType = ValueType::F64; fn to_runtime_value(self) -> RuntimeValue { RuntimeValue::F64(self) } } -impl ConvertibleToWasm for isize { type NativeType = i32; const VALUE_TYPE: ValueType = ValueType::I32; fn to_runtime_value(self) -> RuntimeValue { RuntimeValue::I32(self as i32) } } -impl ConvertibleToWasm for usize { type NativeType = u32; const VALUE_TYPE: ValueType = ValueType::I32; fn to_runtime_value(self) -> RuntimeValue { RuntimeValue::I32(self as u32 as i32) } } -impl ConvertibleToWasm for *const T { type NativeType = u32; const VALUE_TYPE: ValueType = ValueType::I32; fn to_runtime_value(self) -> RuntimeValue { RuntimeValue::I32(self as isize as i32) } } -impl ConvertibleToWasm for *mut T { type NativeType = u32; const VALUE_TYPE: ValueType = ValueType::I32; fn to_runtime_value(self) -> RuntimeValue { RuntimeValue::I32(self as isize as i32) } } + +pub trait ConvertibleToWasm { + const VALUE_TYPE: ValueType; + type NativeType; fn to_runtime_value(self) -> RuntimeValue; +} + +impl ConvertibleToWasm for i32 { + type NativeType = i32; + const VALUE_TYPE: ValueType = ValueType::I32; + fn to_runtime_value(self) -> RuntimeValue { RuntimeValue::I32(self) } +} + +impl ConvertibleToWasm for u32 { + type NativeType = u32; + const VALUE_TYPE: ValueType = ValueType::I32; + fn to_runtime_value(self) -> RuntimeValue { RuntimeValue::I32(self as i32) } +} + +impl ConvertibleToWasm for i64 { + type NativeType = i64; + const VALUE_TYPE: ValueType = ValueType::I64; + fn to_runtime_value(self) -> RuntimeValue { RuntimeValue::I64(self) } +} + +impl ConvertibleToWasm for u64 { + type NativeType = u64; + const VALUE_TYPE: ValueType = ValueType::I64; + fn to_runtime_value(self) -> RuntimeValue { RuntimeValue::I64(self as i64) } +} + +impl ConvertibleToWasm for F32 { + type NativeType = F32; + const VALUE_TYPE: ValueType = ValueType::F32; + fn to_runtime_value(self) -> RuntimeValue { RuntimeValue::F32(self) } +} + +impl ConvertibleToWasm for F64 { + type NativeType = F64; + const VALUE_TYPE: ValueType = ValueType::F64; + fn to_runtime_value(self) -> RuntimeValue { RuntimeValue::F64(self) } +} + +impl ConvertibleToWasm for isize { + type NativeType = i32; + const VALUE_TYPE: ValueType = ValueType::I32; + fn to_runtime_value(self) -> RuntimeValue { RuntimeValue::I32(self as i32) } +} + +impl ConvertibleToWasm for usize { + type NativeType = u32; + const VALUE_TYPE: ValueType = ValueType::I32; + fn to_runtime_value(self) -> RuntimeValue { RuntimeValue::I32(self as u32 as i32) } +} + +impl ConvertibleToWasm for *const T { + type NativeType = u32; + const VALUE_TYPE: ValueType = ValueType::I32; + fn to_runtime_value(self) -> RuntimeValue { RuntimeValue::I32(self as isize as i32) } +} + +impl ConvertibleToWasm for *mut T { + type NativeType = u32; + const VALUE_TYPE: ValueType = ValueType::I32; + fn to_runtime_value(self) -> RuntimeValue { RuntimeValue::I32(self as isize as i32) } +} /// Converts arguments into respective WASM types. #[macro_export] @@ -118,7 +160,7 @@ macro_rules! unmarshall_args { #[inline(always)] pub fn constrain_closure(f: F) -> F where - F: FnOnce() -> Result + F: FnOnce() -> Result { f } @@ -132,14 +174,14 @@ macro_rules! marshall { >(|| { unmarshall_args!($body, $objectname, $args_iter, $( $names : $params ),*) }); - let r = body()?; + let r = body().map_err(wasmi::Trap::from)?; return Ok(Some({ use $crate::wasm_utils::ConvertibleToWasm; r.to_runtime_value() })) }); ( $args_iter:ident, $objectname:ident, ( $( $names:ident : $params:ty ),* ) => $body:tt ) => ({ let body = $crate::wasm_utils::constrain_closure::<(), _>(|| { unmarshall_args!($body, $objectname, $args_iter, $( $names : $params ),*) }); - body()?; + body().map_err(wasmi::Trap::from)?; return Ok(None) }) } @@ -154,7 +196,13 @@ macro_rules! dispatch_fn { panic!("fn with index {} is undefined", $index); }; - ( @iter $index:expr, $index_ident:ident, $objectname:ident, $args_iter:ident, $name:ident ( $( $names:ident : $params:ty ),* ) $( -> $returns:ty )* => $body:tt $($tail:tt)*) => ( + (@iter + $index:expr, + $index_ident:ident, + $objectname:ident, + $args_iter:ident, + $name:ident ( $( $names:ident : $params:ty ),* ) $( -> $returns:ty )* => $body:tt $($tail:tt)* + ) => ( if $index_ident == $index { { marshall!($args_iter, $objectname, ( $( $names : $params ),* ) $( -> $returns )* => $body) } } @@ -174,10 +222,14 @@ macro_rules! impl_function_executor { => $($pre:tt)+ ) => ( impl $( $pre ) + $structname { #[allow(unused)] - fn resolver() -> &'static $crate::wasmi::ModuleImportResolver { + fn resolver() -> &'static dyn $crate::wasmi::ModuleImportResolver { struct Resolver; impl $crate::wasmi::ModuleImportResolver for Resolver { - fn resolve_func(&self, name: &str, signature: &$crate::wasmi::Signature) -> ::std::result::Result<$crate::wasmi::FuncRef, $crate::wasmi::Error> { + fn resolve_func( + &self, + name: &str, + signature: &$crate::wasmi::Signature + ) -> std::result::Result<$crate::wasmi::FuncRef, $crate::wasmi::Error> { resolve_fn!(signature, name, $( $name( $( $params ),* ) $( -> $returns )* => )*); Err($crate::wasmi::Error::Instantiation( @@ -194,7 +246,7 @@ macro_rules! impl_function_executor { &mut self, index: usize, args: $crate::wasmi::RuntimeArgs, - ) -> ::std::result::Result, $crate::wasmi::Trap> { + ) -> std::result::Result, $crate::wasmi::Trap> { let $objectname = self; let mut args = args.as_ref().iter(); dispatch_fn!(index, $objectname, args, $( $name( $( $names : $params ),* ) $( -> $returns )* => $body ),*); diff --git a/core/executor/wasm/Cargo.lock b/core/executor/wasm/Cargo.lock index b65d8e08694a0021989a33d819649f0230ee844c..34cd17116c3c1708e76d2923a21fc47b15d598ee 100644 --- a/core/executor/wasm/Cargo.lock +++ b/core/executor/wasm/Cargo.lock @@ -2,12 +2,17 @@ # It is not intended for manual editing. [[package]] name = "arrayvec" -version = "0.4.7" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "nodrop 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "autocfg" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "byteorder" version = "1.3.1" @@ -15,12 +20,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "crunchy" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "fixed-hash" -version = "0.3.0" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "static_assertions 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -28,15 +33,15 @@ dependencies = [ [[package]] name = "hash-db" -version = "0.12.0" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "hash256-std-hasher" -version = "0.12.0" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "crunchy 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "crunchy 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -49,15 +54,23 @@ dependencies = [ [[package]] name = "nodrop" -version = "0.1.12" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "num-traits" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] name = "parity-codec" version = "3.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", + "arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec-derive 3.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -66,33 +79,33 @@ name = "parity-codec-derive" version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro-crate 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.19 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.26 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "primitive-types" -version = "0.2.1" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "fixed-hash 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "fixed-hash 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "impl-codec 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "uint 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "uint 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "proc-macro-crate" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "toml 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "toml 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "proc-macro2" -version = "0.4.19" +version = "0.4.30" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -100,10 +113,10 @@ dependencies = [ [[package]] name = "quote" -version = "0.6.8" +version = "0.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.19 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -143,14 +156,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "serde" -version = "1.0.79" +version = "1.0.91" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "sr-io" version = "2.0.0" dependencies = [ - "hash-db 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "sr-std 2.0.0", @@ -184,39 +197,40 @@ name = "substrate-primitives" version = "2.0.0" dependencies = [ "byteorder 1.3.1 (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)", + "hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", + "hash256-std-hasher 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "primitive-types 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "primitive-types 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "sr-std 2.0.0", ] [[package]] name = "syn" -version = "0.15.26" +version = "0.15.34" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.19 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "toml" -version = "0.4.10" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "uint" -version = "0.6.1" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "crunchy 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "crunchy 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -226,27 +240,29 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" [metadata] -"checksum arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)" = "a1e964f9e24d588183fcb43503abda40d288c8657dfc27311516ce2f05675aef" +"checksum arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "92c7fb76bc8826a8b33b4ee5bb07a247a81e76764ab4d55e8f73e3a4d8808c71" +"checksum autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "0e49efa51329a5fd37e7c79db4621af617cd4e3e5bc224939808d076077077bf" "checksum byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a019b10a2a7cdeb292db131fc8113e57ea2a908f6e7894b0c3c671893b65dbeb" -"checksum crunchy 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c240f247c278fa08a6d4820a6a222bfc6e0d999e51ba67be94f44c905b2161f2" -"checksum fixed-hash 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a557e80084b05c32b455963ff565a9de6f2866da023d6671705c6aff6f65e01c" -"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 crunchy 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" +"checksum fixed-hash 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d1a683d1234507e4f3bf2736eeddf0de1dc65996dc0164d57eba0a74bcf29489" +"checksum hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ba7fb417e5c470acdd61068c79767d0e65962e70836cf6c9dfd2409f06345ce0" +"checksum hash256-std-hasher 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f8b2027c19ec91eb304999abae7307d225cf93be42af53b0039f76e98ed5af86" "checksum impl-codec 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d2050d823639fbeae26b2b5ba09aca8907793117324858070ade0673c49f793b" -"checksum nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "9a2228dca57108069a5262f2ed8bd2e82496d2e074a06d1ccc7ce1687b6ae0a2" +"checksum nodrop 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "2f9667ddcc6cc8a43afc9b7917599d7216aa09c463919ea32c59ed6cac8bc945" +"checksum num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "6ba9a427cfca2be13aa6f6403b0b7e7368fe982bfa16fccc450ce74c46cd9b32" "checksum parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dcb43c05fb71c03b4ea7327bf15694da1e0f23f19d5b1e95bab6c6d74097e336" "checksum parity-codec-derive 3.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "00a486fd383382ddcb2de928364b1f82571c1e48274fc43b7667a4738ee4056c" -"checksum primitive-types 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "edb92f1ebfc177432c03287b15d48c202e6e2c95993a7af3ba039abb43b1492e" -"checksum proc-macro-crate 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4c6cf4e5b00300d151dfffae39f529dfa5188f42eeb14201229aa420d6aad10c" -"checksum proc-macro2 0.4.19 (registry+https://github.com/rust-lang/crates.io-index)" = "ffe022fb8c8bd254524b0b3305906c1921fa37a84a644e29079a9e62200c3901" -"checksum quote 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)" = "dd636425967c33af890042c483632d33fa7a18f19ad1d7ea72e8998c6ef8dea5" +"checksum primitive-types 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "6e8612a8dc70f26276fed6131c153ca277cf275ee0a5e2a50cd8a69c697beb8f" +"checksum proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "e10d4b51f154c8a7fb96fd6dad097cb74b863943ec010ac94b9fd1be8861fe1e" +"checksum proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)" = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" +"checksum quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)" = "faf4799c5d274f3868a4aae320a0a182cbd2baee377b378f080e16a23e9d80db" "checksum rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "403bb3a286107a04825a5f82e1270acc1e14028d3d554d7a1e08914549575ab8" "checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" "checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" "checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" -"checksum serde 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)" = "84257ccd054dc351472528c8587b4de2dbf0dc0fe2e634030c1a90bfdacebaa9" +"checksum serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)" = "a72e9b96fa45ce22a4bc23da3858dfccfd60acd28a25bcd328a98fdd6bea43fd" "checksum static_assertions 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "c19be23126415861cb3a23e501d34a708f7f9b2183c5252d690941c2e69199d5" -"checksum syn 0.15.26 (registry+https://github.com/rust-lang/crates.io-index)" = "f92e629aa1d9c827b2bb8297046c1ccffc57c99b947a680d3ccff1f136a3bee9" -"checksum toml 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "758664fc71a3a69038656bee8b6be6477d2a6c315a6b81f7081f591bffa4111f" -"checksum uint 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e7780bb27fd8a22295e0d9d53ae3be253f715a0dccb1808527f478f1c2603708" +"checksum syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)" = "a1393e4a97a19c01e900df2aec855a29f71cf02c402e2f443b8d2747c25c5dbe" +"checksum toml 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b8c96d7873fa7ef8bdeb3a9cda3ac48389b4154f32b9803b4bc26220b677b039" +"checksum uint 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2143cded94692b156c356508d92888acc824db5bffc0b4089732264c6fcf86d4" "checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" diff --git a/core/executor/wasm/build.sh b/core/executor/wasm/build.sh index c23ac076e210aa3d00c5550e18e40b4c9d90d09c..9414c8037b57933d2da64d1f562ffbdfdab32e1f 100755 --- a/core/executor/wasm/build.sh +++ b/core/executor/wasm/build.sh @@ -6,7 +6,7 @@ if cargo --version | grep -q "nightly"; then else CARGO_CMD="cargo +nightly" fi -CARGO_INCREMENTAL=0 RUSTFLAGS="-C link-arg=--export-table" $CARGO_CMD build --target=wasm32-unknown-unknown --release +CARGO_INCREMENTAL=0 RUSTFLAGS="-C link-arg=--export-table" $CARGO_CMD build --target=wasm32-unknown-unknown --release "$@" for i in test do wasm-gc target/wasm32-unknown-unknown/release/runtime_$i.wasm target/wasm32-unknown-unknown/release/runtime_$i.compact.wasm diff --git a/core/executor/wasm/src/lib.rs b/core/executor/wasm/src/lib.rs index 193ff5c9c0d3cbe9d39122f28126c6b052de55a5..41f071ca9fef4be361c0ca66eda83cd004021b46 100644 --- a/core/executor/wasm/src/lib.rs +++ b/core/executor/wasm/src/lib.rs @@ -91,7 +91,13 @@ impl_stubs!( [sr25519_verify(&sig, &msg[..], &pubkey) as u8].to_vec() }, test_enumerated_trie_root => |_| { - enumerated_trie_root::(&[&b"zero"[..], &b"one"[..], &b"two"[..]]).as_ref().to_vec() + enumerated_trie_root::( + &[ + &b"zero"[..], + &b"one"[..], + &b"two"[..], + ] + ).as_ref().to_vec() }, test_sandbox => |code: &[u8]| { let ok = execute_sandboxed(code, &[]).is_ok(); @@ -108,13 +114,15 @@ impl_stubs!( [ok as u8].to_vec() }, test_sandbox_return_val => |code: &[u8]| { - let result = execute_sandboxed( + let ok = match execute_sandboxed( code, &[ sandbox::TypedValue::I32(0x1336), ] - ); - let ok = if let Ok(sandbox::ReturnValue::Value(sandbox::TypedValue::I32(0x1337))) = result { true } else { false }; + ) { + Ok(sandbox::ReturnValue::Value(sandbox::TypedValue::I32(0x1337))) => true, + _ => false, + }; [ok as u8].to_vec() }, test_sandbox_instantiate => |code: &[u8]| { diff --git a/core/finality-grandpa/Cargo.toml b/core/finality-grandpa/Cargo.toml index c23c0a97cd34f3d17455a37ac71d6e499680c91b..a2881b97d0ed1d1f873ba5b80cec6604de8bfcd3 100644 --- a/core/finality-grandpa/Cargo.toml +++ b/core/finality-grandpa/Cargo.toml @@ -8,7 +8,7 @@ edition = "2018" fork-tree = { path = "../../core/util/fork-tree" } futures = "0.1" log = "0.4" -parking_lot = "0.7.1" +parking_lot = "0.8.0" tokio = "0.1.7" rand = "0.6" parity-codec = { version = "3.3", features = ["derive"] } @@ -29,7 +29,7 @@ grandpa = { package = "finality-grandpa", git = "https://github.com/paritytech/f consensus_common = { package = "substrate-consensus-common", path = "../consensus/common", features = ["test-helpers"] } network = { package = "substrate-network", path = "../network", features = ["test-helpers"] } keyring = { package = "substrate-keyring", path = "../keyring" } -test_client = { package = "substrate-test-client", path = "../test-client"} +test-client = { package = "substrate-test-runtime-client", path = "../test-runtime/client"} env_logger = "0.6" [features] diff --git a/core/finality-grandpa/primitives/Cargo.toml b/core/finality-grandpa/primitives/Cargo.toml index e51ed754eb85fb46cd526ab6143dc929e4e36457..6a36d74b01788489e82407ebf6b62e96c4ac3cb5 100644 --- a/core/finality-grandpa/primitives/Cargo.toml +++ b/core/finality-grandpa/primitives/Cargo.toml @@ -10,6 +10,7 @@ substrate-primitives = { path = "../../primitives", default-features = false } parity-codec = { version = "3.3", default-features = false, features = ["derive"] } sr-primitives = { path = "../../sr-primitives", default-features = false } rstd = { package = "sr-std", path = "../../sr-std", default-features = false } +serde = { version = "1.0", optional = true, features = ["derive"] } [features] default = ["std"] @@ -19,4 +20,5 @@ std = [ "parity-codec/std", "sr-primitives/std", "rstd/std", + "serde", ] diff --git a/core/finality-grandpa/primitives/src/lib.rs b/core/finality-grandpa/primitives/src/lib.rs index 869b5e68fd6af5f744d4f9ed34ca77af7545f822..aded32efa36e188a3bf9838523bb06f5830bf59f 100644 --- a/core/finality-grandpa/primitives/src/lib.rs +++ b/core/finality-grandpa/primitives/src/lib.rs @@ -21,17 +21,32 @@ #[cfg(not(feature = "std"))] extern crate alloc; +#[cfg(feature = "std")] +use serde::Serialize; use parity_codec::{Encode, Decode}; -use substrate_primitives::ed25519; -use sr_primitives::traits::{DigestFor, NumberFor}; +use sr_primitives::{ConsensusEngineId, traits::{DigestFor, NumberFor}}; use client::decl_runtime_apis; use rstd::vec::Vec; -use ed25519::Public as AuthorityId; +/// The grandpa crypto scheme defined via the keypair type. +#[cfg(feature = "std")] +pub type AuthorityPair = substrate_primitives::ed25519::Pair; + +/// Identity of a Grandpa authority. +pub type AuthorityId = substrate_primitives::ed25519::Public; + +/// Signature for a Grandpa authority. +pub type AuthoritySignature = substrate_primitives::ed25519::Signature; + +/// The `ConsensusEngineId` of GRANDPA. +pub const GRANDPA_ENGINE_ID: ConsensusEngineId = *b"FRNK"; + +/// The weight of an authority. +pub type AuthorityWeight = u64; /// A scheduled change of authority set. -#[cfg_attr(feature = "std", derive(Debug, PartialEq))] -#[derive(Clone, Encode, Decode)] +#[cfg_attr(feature = "std", derive(Debug, Serialize))] +#[derive(Clone, Eq, PartialEq, Encode, Decode)] pub struct ScheduledChange { /// The new authorities after the change, along with their respective weights. pub next_authorities: Vec<(AuthorityId, u64)>, @@ -44,14 +59,6 @@ pub const PENDING_CHANGE_CALL: &str = "grandpa_pending_change"; /// WASM function call to get current GRANDPA authorities. pub const AUTHORITIES_CALL: &str = "grandpa_authorities"; -/// Well-known storage keys for GRANDPA. -pub mod well_known_keys { - /// The key for the authorities and weights vector in storage. - pub const AUTHORITY_PREFIX: &[u8] = b":grandpa:auth:"; - /// The key for the authorities count. - pub const AUTHORITY_COUNT: &[u8] = b":grandpa:auth:len"; -} - decl_runtime_apis! { /// APIs for integrating the GRANDPA finality gadget into runtimes. /// This should be implemented on the runtime side. @@ -107,6 +114,6 @@ decl_runtime_apis! { /// When called at block B, it will return the set of authorities that should be /// used to finalize descendants of this block (B+1, B+2, ...). The block B itself /// is finalized by the authorities from block B-1. - fn grandpa_authorities() -> Vec<(AuthorityId, u64)>; + fn grandpa_authorities() -> Vec<(AuthorityId, AuthorityWeight)>; } } diff --git a/core/finality-grandpa/src/authorities.rs b/core/finality-grandpa/src/authorities.rs index 5379cfe4ef6e9934e3068cd25b5f7d3554fca953..8b329d4116d8f9dc08cf1195e5ca36679f0e1c2f 100644 --- a/core/finality-grandpa/src/authorities.rs +++ b/core/finality-grandpa/src/authorities.rs @@ -18,19 +18,17 @@ use fork_tree::ForkTree; use parking_lot::RwLock; -use substrate_primitives::ed25519; use grandpa::voter_set::VoterSet; use parity_codec::{Encode, Decode}; use log::{debug, info}; use substrate_telemetry::{telemetry, CONSENSUS_INFO}; +use fg_primitives::AuthorityId; use std::cmp::Ord; use std::fmt::Debug; use std::ops::Add; use std::sync::Arc; -use ed25519::Public as AuthorityId; - /// A shared authority set. pub(crate) struct SharedAuthoritySet { inner: Arc>>, @@ -522,8 +520,8 @@ mod tests { pending_forced_changes: Vec::new(), }; - let set_a = vec![(AuthorityId([1; 32]), 5)]; - let set_b = vec![(AuthorityId([2; 32]), 5)]; + let set_a = vec![(AuthorityId::from_raw([1; 32]), 5)]; + let set_b = vec![(AuthorityId::from_raw([2; 32]), 5)]; // two competing changes at the same height on different forks let change_a = PendingChange { @@ -587,8 +585,8 @@ mod tests { pending_forced_changes: Vec::new(), }; - let set_a = vec![(AuthorityId([1; 32]), 5)]; - let set_c = vec![(AuthorityId([2; 32]), 5)]; + let set_a = vec![(AuthorityId::from_raw([1; 32]), 5)]; + let set_c = vec![(AuthorityId::from_raw([2; 32]), 5)]; // two competing changes at the same height on different forks let change_a = PendingChange { @@ -653,7 +651,7 @@ mod tests { pending_forced_changes: Vec::new(), }; - let set_a = vec![(AuthorityId([1; 32]), 5)]; + let set_a = vec![(AuthorityId::from_raw([1; 32]), 5)]; let change_a = PendingChange { next_authorities: set_a.clone(), @@ -719,8 +717,8 @@ mod tests { pending_forced_changes: Vec::new(), }; - let set_a = vec![(AuthorityId([1; 32]), 5)]; - let set_b = vec![(AuthorityId([2; 32]), 5)]; + let set_a = vec![(AuthorityId::from_raw([1; 32]), 5)]; + let set_b = vec![(AuthorityId::from_raw([2; 32]), 5)]; let change_a = PendingChange { next_authorities: set_a.clone(), diff --git a/core/finality-grandpa/src/aux_schema.rs b/core/finality-grandpa/src/aux_schema.rs index 4f888e276019fd045ddf0b5bd339adfc68799a1f..8ed9db89dcb09aedbd8a2dedf56f965ffaba31a3 100644 --- a/core/finality-grandpa/src/aux_schema.rs +++ b/core/finality-grandpa/src/aux_schema.rs @@ -28,14 +28,13 @@ use grandpa::{round::State as RoundState, HistoricalVotes}; use runtime_primitives::traits::{Block as BlockT, NumberFor}; use log::{info, warn}; use substrate_telemetry::{telemetry, CONSENSUS_INFO}; +use fg_primitives::AuthorityId; use crate::authorities::{AuthoritySet, SharedAuthoritySet, PendingChange, DelayKind}; use crate::consensus_changes::{SharedConsensusChanges, ConsensusChanges}; use crate::environment::{CompletedRound, CompletedRounds, HasVoted, SharedVoterSetState, VoterSetState}; use crate::{NewAuthoritySet, SignedMessage}; -use substrate_primitives::ed25519::Public as AuthorityId; - const VERSION_KEY: &[u8] = b"grandpa_schema_version"; const SET_STATE_KEY: &[u8] = b"grandpa_completed_round"; const AUTHORITY_SET_KEY: &[u8] = b"grandpa_voters"; @@ -158,7 +157,7 @@ where H: Clone + Debug + PartialEq, } } -fn load_decode(backend: &B, key: &[u8]) -> ClientResult> { +pub(crate) fn load_decode(backend: &B, key: &[u8]) -> ClientResult> { match backend.get_aux(key)? { None => Ok(None), Some(t) => T::decode(&mut &t[..]) @@ -220,10 +219,25 @@ fn migrate_from_version0( None => (0, genesis_round()), }; + let set_id = new_set.current().0; + let base = last_round_state.prevote_ghost .expect("state is for completed round; completed rounds must have a prevote ghost; qed."); - let set_state = make_voter_set_state_live(last_round_number, last_round_state, base); + let set_state = VoterSetState::Live { + completed_rounds: CompletedRounds::new( + CompletedRound { + number: last_round_number, + state: last_round_state, + votes: Vec::new(), + base, + }, + set_id, + &new_set, + ), + current_round: HasVoted::No, + }; + backend.insert_aux(&[(SET_STATE_KEY, set_state.encode().as_slice())], &[])?; return Ok(Some((new_set, set_state))); @@ -249,6 +263,19 @@ fn migrate_from_version1( backend, AUTHORITY_SET_KEY, )? { + let set_id = set.current().0; + + let completed_rounds = |number, state, base| CompletedRounds::new( + CompletedRound { + number, + state, + votes: Vec::new(), + base, + }, + set_id, + &set, + ); + let set_state = match load_decode::<_, V1VoterSetState>>( backend, SET_STATE_KEY, @@ -258,18 +285,17 @@ fn migrate_from_version1( .expect("state is for completed round; completed rounds must have a prevote ghost; qed."); VoterSetState::Paused { - completed_rounds: CompletedRounds::new(CompletedRound { - number: last_round_number, - state: set_state, - votes: HistoricalVotes::new(), - base, - }), + completed_rounds: completed_rounds(last_round_number, set_state, base), } }, Some(V1VoterSetState::Live(last_round_number, set_state)) => { let base = set_state.prevote_ghost .expect("state is for completed round; completed rounds must have a prevote ghost; qed."); - make_voter_set_state_live(last_round_number, set_state, base) + + VoterSetState::Live { + completed_rounds: completed_rounds(last_round_number, set_state, base), + current_round: HasVoted::No, + } }, None => { let set_state = genesis_round(); @@ -279,24 +305,9 @@ fn migrate_from_version1( }, }; - backend.insert_aux(&[(SET_STATE_KEY, set_state.encode().as_slice())], &[])?; - - return Ok(Some((set, set_state))); - } - - Ok(None) -} - -fn voter_set_state_from_v2(voter_set_state_v2: V2VoterSetState) -> VoterSetState { - let transform = |completed_rounds: V2CompletedRounds| { - CompletedRounds::new_with_rounds(completed_rounds.inner.into_iter().map( - | V2CompletedRound { number, state, base, votes } | { - CompletedRound { - number, - state, - base, - votes: HistoricalVotes::new_with(votes, None, None), - } + VoterSetState::Live { + completed_rounds: completed_rounds(0, set_state, base), + current_round: HasVoted::No, } ).collect::>>() ) @@ -416,12 +427,16 @@ pub(crate) fn load_persistent( .expect("state is for completed round; completed rounds must have a prevote ghost; qed."); VoterSetState::Live { - completed_rounds: CompletedRounds::new(CompletedRound { - number: 0, - votes: HistoricalVotes::new(), - base, - state, - }), + completed_rounds: CompletedRounds::new( + CompletedRound { + number: 0, + votes: Vec::new(), + base, + state, + }, + set.current().0, + &set, + ), current_round: HasVoted::No, } } @@ -443,18 +458,23 @@ pub(crate) fn load_persistent( info!(target: "afg", "Loading GRANDPA authority set \ from genesis on what appears to be first startup."); - let genesis_set = AuthoritySet::genesis(genesis_authorities()?); + let genesis_authorities = genesis_authorities()?; + let genesis_set = AuthoritySet::genesis(genesis_authorities.clone()); let state = make_genesis_round(); let base = state.prevote_ghost .expect("state is for completed round; completed rounds must have a prevote ghost; qed."); let genesis_state = VoterSetState::Live { - completed_rounds: CompletedRounds::new(CompletedRound { - number: 0, - votes: HistoricalVotes::new(), - state, - base, - }), + completed_rounds: CompletedRounds::new( + CompletedRound { + number: 0, + votes: Vec::new(), + state, + base, + }, + 0, + &genesis_set, + ), current_round: HasVoted::No, }; backend.insert_aux( @@ -473,6 +493,10 @@ pub(crate) fn load_persistent( } /// Update the authority set on disk after a change. +/// +/// If there has just been a handoff, pass a `new_set` parameter that describes the +/// handoff. `set` in all cases should reflect the current authority set, with all +/// changes and handoffs applied. pub(crate) fn update_authority_set( set: &AuthoritySet>, new_set: Option<&NewAuthoritySet>>, @@ -503,12 +527,16 @@ pub(crate) fn update_authority_set( new_set.canon_number.clone(), )); let set_state = VoterSetState::::Live { - completed_rounds: CompletedRounds::new(CompletedRound { - number: 0, - state: round_state, - votes: HistoricalVotes::new(), - base: (new_set.canon_hash, new_set.canon_number), - }), + completed_rounds: CompletedRounds::new( + CompletedRound { + number: 0, + state: round_state, + votes: HistoricalVotes::new(), + base: (new_set.canon_hash, new_set.canon_number), + }, + new_set.set_id, + &set, + ), current_round: HasVoted::No, }; let encoded = set_state.encode(); @@ -620,7 +648,7 @@ mod test { assert_eq!( *authority_set.inner().read(), AuthoritySet { - current_authorities: authorities, + current_authorities: authorities.clone(), pending_standard_changes: ForkTree::new(), pending_forced_changes: Vec::new(), set_id, @@ -630,12 +658,16 @@ mod test { assert_eq!( &*set_state.read(), &VoterSetState::Live { - completed_rounds: CompletedRounds::new(CompletedRound { - number: round_number, - state: round_state.clone(), - base: round_state.prevote_ghost.unwrap(), - votes: HistoricalVotes::new(), - }), + completed_rounds: CompletedRounds::new( + CompletedRound { + number: round_number, + state: round_state.clone(), + base: round_state.prevote_ghost.unwrap(), + votes: HistoricalVotes::new(), + }, + set_id, + &*authority_set.inner().read(), + ), current_round: HasVoted::No, }, ); @@ -703,7 +735,7 @@ mod test { assert_eq!( *authority_set.inner().read(), AuthoritySet { - current_authorities: authorities, + current_authorities: authorities.clone(), pending_standard_changes: ForkTree::new(), pending_forced_changes: Vec::new(), set_id, @@ -713,12 +745,16 @@ mod test { assert_eq!( &*set_state.read(), &VoterSetState::Live { - completed_rounds: CompletedRounds::new(CompletedRound { - number: round_number, - state: round_state.clone(), - base: round_state.prevote_ghost.unwrap(), - votes: HistoricalVotes::new(), - }), + completed_rounds: CompletedRounds::new( + CompletedRound { + number: round_number, + state: round_state.clone(), + base: round_state.prevote_ghost.unwrap(), + votes: HistoricalVotes::new(), + }, + set_id, + &*authority_set.inner().read(), + ), current_round: HasVoted::No, }, ); diff --git a/core/finality-grandpa/src/communication/gossip.rs b/core/finality-grandpa/src/communication/gossip.rs index fd9d30e9519d647e81f5c449e23010fe4ff252af..ca529125ec172bd2c5ed08a51fd904fe8f304fd2 100644 --- a/core/finality-grandpa/src/communication/gossip.rs +++ b/core/finality-grandpa/src/communication/gossip.rs @@ -71,6 +71,7 @@ use runtime_primitives::traits::{NumberFor, Block as BlockT, Zero}; use network::consensus_gossip::{self as network_gossip, MessageIntent, ValidatorContext}; use network::{config::Roles, PeerId}; use parity_codec::{Encode, Decode}; +use crate::ed25519::Public as AuthorityId; use substrate_telemetry::{telemetry, CONSENSUS_DEBUG}; use log::{trace, debug, warn}; @@ -94,6 +95,8 @@ enum Consider { RejectPast, /// Message is from the future. Reject. RejectFuture, + /// Message cannot be evaluated. Reject. + RejectOutOfScope, } /// A view of protocol state. @@ -300,6 +303,10 @@ pub(super) enum Misbehavior { // A message received that's from the future relative to our view. // always misbehavior. FutureMessage, + // A message received that cannot be evaluated relative to our view. + // This happens before we have a view and have sent out neighbor packets. + // always misbehavior. + OutOfScopeMessage, } impl Misbehavior { @@ -319,6 +326,7 @@ impl Misbehavior { (benefit as i32).saturating_add(cost as i32) }, FutureMessage => cost::FUTURE_MESSAGE, + OutOfScopeMessage => cost::OUT_OF_SCOPE_MESSAGE, } } } @@ -407,7 +415,7 @@ impl Peers { } } -#[derive(Debug)] +#[derive(Debug, PartialEq)] pub(super) enum Action { // repropagate under given topic, to the given peers, applying cost/benefit to originator. Keep(H, i32), @@ -418,9 +426,10 @@ pub(super) enum Action { } struct Inner { - local_view: View>, + local_view: Option>>, peers: Peers>, live_topics: KeepTopics, + authorities: Vec, config: crate::Config, next_rebroadcast: Instant, } @@ -430,58 +439,87 @@ type MaybeMessage = Option<(Vec, NeighborPacket> impl Inner { fn new(config: crate::Config) -> Self { Inner { - local_view: View::default(), + local_view: None, peers: Peers::default(), live_topics: KeepTopics::new(), next_rebroadcast: Instant::now() + REBROADCAST_AFTER, + authorities: Vec::new(), config, } } - /// Note a round in a set has started. - fn note_round(&mut self, round: Round, set_id: SetId) -> MaybeMessage { - if self.local_view.round == round && self.local_view.set_id == set_id { - return None; - } + /// Note a round in the current set has started. + fn note_round(&mut self, round: Round) -> MaybeMessage { + { + let local_view = match self.local_view { + None => return None, + Some(ref mut v) => if v.round == round { + return None + } else { + v + }, + }; + + let set_id = local_view.set_id; - debug!(target: "afg", "Voter {} noting beginning of round {:?} to network.", - self.config.name(), (round, set_id)); + debug!(target: "afg", "Voter {} noting beginning of round {:?} to network.", + self.config.name(), (round,set_id)); - self.local_view.round = round; - self.local_view.set_id = set_id; + local_view.round = round; - self.live_topics.push(round, set_id); + self.live_topics.push(round, set_id); + } self.multicast_neighbor_packet() } /// Note that a voter set with given ID has started. Does nothing if the last /// call to the function was with the same `set_id`. - fn note_set(&mut self, set_id: SetId) -> MaybeMessage { - if self.local_view.set_id == set_id { - return None; - } + fn note_set(&mut self, set_id: SetId, authorities: Vec) -> MaybeMessage { + { + let local_view = match self.local_view { + ref mut x @ None => x.get_or_insert(View { + round: Round(0), + set_id, + last_commit: None, + }), + Some(ref mut v) => if v.set_id == set_id { + return None + } else { + v + }, + }; - self.local_view.update_set(set_id); - self.live_topics.push(Round(0), set_id); + local_view.update_set(set_id); + self.live_topics.push(Round(0), set_id); + self.authorities = authorities; + } self.multicast_neighbor_packet() } /// Note that we've imported a commit finalizing a given block. fn note_commit_finalized(&mut self, finalized: NumberFor) -> MaybeMessage { - if self.local_view.last_commit.as_ref() < Some(&finalized) { - self.local_view.last_commit = Some(finalized); - self.multicast_neighbor_packet() - } else { - None + { + match self.local_view { + None => return None, + Some(ref mut v) => if v.last_commit.as_ref() < Some(&finalized) { + v.last_commit = Some(finalized); + } else { + return None + }, + }; } + + self.multicast_neighbor_packet() } fn consider_vote(&self, round: Round, set_id: SetId) -> Consider { - self.local_view.consider_vote(round, set_id) + self.local_view.as_ref().map(|v| v.consider_vote(round, set_id)) + .unwrap_or(Consider::RejectOutOfScope) } fn consider_global(&self, set_id: SetId, number: NumberFor) -> Consider { - self.local_view.consider_global(set_id, number) + self.local_view.as_ref().map(|v| v.consider_global(set_id, number)) + .unwrap_or(Consider::RejectOutOfScope) } fn cost_past_rejection(&self, _who: &PeerId, _round: Round, _set_id: SetId) -> i32 { @@ -494,11 +532,18 @@ impl Inner { { match self.consider_vote(full.round, full.set_id) { Consider::RejectFuture => return Action::Discard(Misbehavior::FutureMessage.cost()), + Consider::RejectOutOfScope => return Action::Discard(Misbehavior::OutOfScopeMessage.cost()), Consider::RejectPast => return Action::Discard(self.cost_past_rejection(who, full.round, full.set_id)), Consider::Accept => {}, } + // ensure authority is part of the set. + if !self.authorities.contains(&full.message.id) { + telemetry!(CONSENSUS_DEBUG; "afg.bad_msg_signature"; "signature" => ?full.message.id); + return Action::Discard(cost::UNKNOWN_VOTER); + } + if let Err(()) = super::check_message_sig::( &full.message.message, &full.message.id, @@ -527,7 +572,9 @@ impl Inner { Consider::RejectFuture => return Action::Discard(Misbehavior::FutureMessage.cost()), Consider::RejectPast => return Action::Discard(self.cost_past_rejection(who, full.round, full.set_id)), + Consider::RejectOutOfScope => return Action::Discard(Misbehavior::OutOfScopeMessage.cost()), Consider::Accept => {}, + } if full.message.precommits.len() != full.message.auth_data.len() || full.message.precommits.is_empty() { @@ -561,14 +608,16 @@ impl Inner { } fn multicast_neighbor_packet(&self) -> MaybeMessage { - let packet = NeighborPacket { - round: self.local_view.round, - set_id: self.local_view.set_id, - commit_finalized_height: self.local_view.last_commit.unwrap_or(Zero::zero()), - }; + self.local_view.as_ref().map(|local_view| { + let packet = NeighborPacket { + round: local_view.round, + set_id: local_view.set_id, + commit_finalized_height: local_view.last_commit.unwrap_or(Zero::zero()), + }; - let peers = self.peers.inner.keys().cloned().collect(); - Some((peers, packet)) + let peers = self.peers.inner.keys().cloned().collect(); + (peers, packet) + }) } } @@ -579,7 +628,7 @@ pub(super) struct GossipValidator { } impl GossipValidator { - /// Create a new gossip-validator. + /// Create a new gossip-validator. This initialized the current set to 0. pub(super) fn new(config: crate::Config) -> (GossipValidator, ReportStream) { let (tx, rx) = mpsc::unbounded(); let val = GossipValidator { @@ -590,21 +639,22 @@ impl GossipValidator { (val, ReportStream { reports: rx }) } - /// Note a round in a set has started. - pub(super) fn note_round(&self, round: Round, set_id: SetId, send_neighbor: F) + /// Note a round in the current set has started. + pub(super) fn note_round(&self, round: Round, send_neighbor: F) where F: FnOnce(Vec, NeighborPacket>) { - let maybe_msg = self.inner.write().note_round(round, set_id); + let maybe_msg = self.inner.write().note_round(round); if let Some((to, msg)) = maybe_msg { send_neighbor(to, msg); } } - /// Note that a voter set with given ID has started. - pub(super) fn note_set(&self, set_id: SetId, send_neighbor: F) + /// Note that a voter set with given ID has started. Updates the current set to given + /// value and initializes the round to 0. + pub(super) fn note_set(&self, set_id: SetId, authorities: Vec, send_neighbor: F) where F: FnOnce(Vec, NeighborPacket>) { - let maybe_msg = self.inner.write().note_set(set_id); + let maybe_msg = self.inner.write().note_set(set_id, authorities); if let Some((to, msg)) = maybe_msg { send_neighbor(to, msg); } @@ -657,27 +707,31 @@ impl GossipValidator { } impl network_gossip::Validator for GossipValidator { - fn new_peer(&self, context: &mut ValidatorContext, who: &PeerId, _roles: Roles) { - let packet_data = { + fn new_peer(&self, context: &mut dyn ValidatorContext, who: &PeerId, _roles: Roles) { + let packet = { let mut inner = self.inner.write(); inner.peers.new_peer(who.clone()); - let packet = NeighborPacket { - round: inner.local_view.round, - set_id: inner.local_view.set_id, - commit_finalized_height: inner.local_view.last_commit.unwrap_or(Zero::zero()), - }; - - GossipMessage::::from(packet).encode() + inner.local_view.as_ref().map(|v| { + NeighborPacket { + round: v.round, + set_id: v.set_id, + commit_finalized_height: v.last_commit.unwrap_or(Zero::zero()), + } + }) }; - context.send_message(who, packet_data); + + if let Some(packet) = packet { + let packet_data = GossipMessage::::from(packet).encode(); + context.send_message(who, packet_data); + } } - fn peer_disconnected(&self, _context: &mut ValidatorContext, who: &PeerId) { + fn peer_disconnected(&self, _context: &mut dyn ValidatorContext, who: &PeerId) { self.inner.write().peers.peer_disconnected(who); } - fn validate(&self, context: &mut ValidatorContext, who: &PeerId, data: &[u8]) + fn validate(&self, context: &mut dyn ValidatorContext, who: &PeerId, data: &[u8]) -> network_gossip::ValidationResult { let (action, broadcast_topics) = self.do_validate(who, data); @@ -690,6 +744,7 @@ impl network_gossip::Validator for GossipValidator match action { Action::Keep(topic, cb) => { self.report(who.clone(), cb); + context.broadcast_message(topic, data.to_vec(), false); network_gossip::ValidationResult::ProcessAndKeep(topic) } Action::ProcessAndDiscard(topic, cb) => { @@ -704,7 +759,7 @@ impl network_gossip::Validator for GossipValidator } fn message_allowed<'a>(&'a self) - -> Box bool + 'a> + -> Box bool + 'a> { let (inner, do_rebroadcast) = { use parking_lot::RwLockWriteGuard; @@ -745,7 +800,12 @@ impl network_gossip::Validator for GossipValidator } // global message. - let our_best_commit = inner.local_view.last_commit; + let local_view = match inner.local_view { + Some(ref v) => v, + None => return false, // cannot evaluate until we have a local view. + }; + + let our_best_commit = local_view.last_commit; let peer_best_commit = peer.view.last_commit; match GossipMessage::::decode(&mut data) { @@ -762,7 +822,7 @@ impl network_gossip::Validator for GossipValidator }) } - fn message_expired<'a>(&'a self) -> Box bool + 'a> { + fn message_expired<'a>(&'a self) -> Box bool + 'a> { let inner = self.inner.read(); Box::new(move |topic, mut data| { // if the topic is not one of the ones that we are keeping at the moment, @@ -773,8 +833,13 @@ impl network_gossip::Validator for GossipValidator Some((None, _)) => {}, }; + let local_view = match inner.local_view { + Some(ref v) => v, + None => return true, // no local view means we can't evaluate or hold any topic. + }; + // global messages -- only keep the best commit. - let best_commit = inner.local_view.last_commit; + let best_commit = local_view.last_commit; match GossipMessage::::decode(&mut data) { None => true, @@ -1003,8 +1068,10 @@ mod tests { let set_id = 1; + val.note_set(SetId(set_id), Vec::new(), |_, _| {}); + for round_num in 1u64..10 { - val.note_round(Round(round_num), SetId(set_id), |_, _| {}); + val.note_round(Round(round_num), |_, _| {}); } { @@ -1024,4 +1091,47 @@ mod tests { } } } + + #[test] + fn message_from_unknown_authority_discarded() { + assert!(cost::UNKNOWN_VOTER != cost::BAD_SIGNATURE); + + let (val, _) = GossipValidator::::new(config()); + let set_id = 1; + let auth = AuthorityId::from_raw([1u8; 32]); + let peer = PeerId::random(); + + val.note_set(SetId(set_id), vec![auth.clone()], |_, _| {}); + val.note_round(Round(0), |_, _| {}); + + let inner = val.inner.read(); + let unknown_voter = inner.validate_round_message(&peer, &VoteOrPrecommitMessage { + round: Round(0), + set_id: SetId(set_id), + message: SignedMessage:: { + message: grandpa::Message::Prevote(grandpa::Prevote { + target_hash: Default::default(), + target_number: 10, + }), + signature: Default::default(), + id: AuthorityId::from_raw([2u8; 32]), + } + }); + + let bad_sig = inner.validate_round_message(&peer, &VoteOrPrecommitMessage { + round: Round(0), + set_id: SetId(set_id), + message: SignedMessage:: { + message: grandpa::Message::Prevote(grandpa::Prevote { + target_hash: Default::default(), + target_number: 10, + }), + signature: Default::default(), + id: auth.clone(), + } + }); + + assert_eq!(unknown_voter, Action::Discard(cost::UNKNOWN_VOTER)); + assert_eq!(bad_sig, Action::Discard(cost::BAD_SIGNATURE)); + } } diff --git a/core/finality-grandpa/src/communication/mod.rs b/core/finality-grandpa/src/communication/mod.rs index 395f8202548cc3b186bc8d62984b565b71667487..cbcfef0d41a2ebd65f9e5a29471d760874d5a088 100644 --- a/core/finality-grandpa/src/communication/mod.rs +++ b/core/finality-grandpa/src/communication/mod.rs @@ -37,9 +37,8 @@ use log::{debug, trace}; use parity_codec::{Encode, Decode}; use substrate_primitives::{ed25519, Pair}; use substrate_telemetry::{telemetry, CONSENSUS_DEBUG, CONSENSUS_INFO}; -use runtime_primitives::ConsensusEngineId; use runtime_primitives::traits::{Block as BlockT, Hash as HashT, Header as HeaderT}; -use network::{consensus_gossip as network_gossip, Service as NetworkService}; +use network::{consensus_gossip as network_gossip, NetworkService}; use network_gossip::ConsensusMessage; use crate::{Error, Message, SignedMessage, Commit, CompactCommit}; @@ -55,8 +54,7 @@ mod periodic; #[cfg(test)] mod tests; -/// The consensus engine ID of GRANDPA. -pub const GRANDPA_ENGINE_ID: ConsensusEngineId = [b'a', b'f', b'g', b'1']; +pub use fg_primitives::GRANDPA_ENGINE_ID; // cost scalars for reporting peers. mod cost { @@ -64,12 +62,14 @@ mod cost { pub(super) const BAD_SIGNATURE: i32 = -100; pub(super) const MALFORMED_COMMIT: i32 = -1000; pub(super) const FUTURE_MESSAGE: i32 = -500; + pub(super) const UNKNOWN_VOTER: i32 = -150; pub(super) const INVALID_VIEW_CHANGE: i32 = -500; pub(super) const PER_UNDECODABLE_BYTE: i32 = -5; pub(super) const PER_SIGNATURE_CHECKED: i32 = -25; pub(super) const PER_BLOCK_LOADED: i32 = -10; pub(super) const INVALID_COMMIT: i32 = -5000; + pub(super) const OUT_OF_SCOPE_MESSAGE: i32 = -500; } // benefit scalars for reporting peers. @@ -99,6 +99,12 @@ pub trait Network: Clone + Send + 'static { /// Only should be used in case of consensus stall. fn gossip_message(&self, topic: Block::Hash, data: Vec, force: bool); + /// Register a message with the gossip service, it isn't broadcast right + /// away to any peers, but may be sent to new peers joining or when asked to + /// broadcast the topic. Useful to register previous messages on node + /// startup. + fn register_gossip_message(&self, topic: Block::Hash, data: Vec); + /// Send a message to a bunch of specific peers, even if they've seen it already. fn send_message(&self, who: Vec, data: Vec); @@ -119,9 +125,10 @@ pub(crate) fn global_topic(set_id: u64) -> B::Hash { <::Hashing as HashT>::hash(format!("{}-GLOBAL", set_id).as_bytes()) } -impl Network for Arc> where +impl Network for Arc> where B: BlockT, S: network::specialization::NetworkSpecialization, + H: network::ExHashT, { type In = NetworkStream; @@ -145,11 +152,21 @@ impl Network for Arc> where engine_id: GRANDPA_ENGINE_ID, data, }; + self.with_gossip( move |gossip, ctx| gossip.multicast(ctx, topic, msg, force) ) } + fn register_gossip_message(&self, topic: B::Hash, data: Vec) { + let msg = ConsensusMessage { + engine_id: GRANDPA_ENGINE_ID, + data, + }; + + self.with_gossip(move |gossip, _| gossip.register_message(topic, msg)) + } + fn send_message(&self, who: Vec, data: Vec) { let msg = ConsensusMessage { engine_id: GRANDPA_ENGINE_ID, @@ -212,9 +229,12 @@ pub(crate) struct NetworkBridge> { impl> NetworkBridge { /// Create a new NetworkBridge to the given NetworkService. Returns the service /// handle and a future that must be polled to completion to finish startup. + /// If a voter set state is given it registers previous round votes with the + /// gossip service. pub(crate) fn new( service: N, config: crate::Config, + set_state: Option<&crate::environment::VoterSetState>, on_exit: impl Future + Clone + Send + 'static, ) -> ( Self, @@ -225,6 +245,44 @@ impl> NetworkBridge { let validator = Arc::new(validator); service.register_validator(validator.clone()); + if let Some(set_state) = set_state { + // register all previous votes with the gossip service so that they're + // available to peers potentially stuck on a previous round. + let completed = set_state.completed_rounds(); + let (set_id, voters) = completed.set_info(); + validator.note_set(SetId(set_id), voters.to_vec(), |_, _| {}); + for round in completed.iter() { + let topic = round_topic::(round.number, set_id); + + // we need to note the round with the gossip validator otherwise + // messages will be ignored. + validator.note_round(Round(round.number), |_, _| {}); + + for signed in round.votes.iter() { + let message = gossip::GossipMessage::VoteOrPrecommit( + gossip::VoteOrPrecommitMessage:: { + message: signed.clone(), + round: Round(round.number), + set_id: SetId(set_id), + } + ); + + service.register_gossip_message( + topic, + message.encode(), + ); + } + + trace!(target: "afg", + "Registered {} messages for topic {:?} (round: {}, set_id: {})", + round.votes.len(), + topic, + round.number, + set_id, + ); + } + } + let (rebroadcast_job, neighbor_sender) = periodic::neighbor_packet_worker(service.clone()); let reporting_job = report_stream.consume(service.clone()); @@ -241,7 +299,7 @@ impl> NetworkBridge { (bridge, startup_work) } - /// Get the round messages for a round in a given set ID. These are signature-checked. + /// Get the round messages for a round in the current set ID. These are signature-checked. pub(crate) fn round_communication( &self, round: Round, @@ -253,9 +311,18 @@ impl> NetworkBridge { impl Stream,Error=Error>, impl Sink,SinkError=Error>, ) { + // is a no-op if currently in that set. + self.validator.note_set( + set_id, + voters.voters().iter().map(|(v, _)| v.clone()).collect(), + |to, neighbor| self.service.send_message( + to, + GossipMessage::::from(neighbor).encode() + ), + ); + self.validator.note_round( round, - set_id, |to, neighbor| self.service.send_message( to, GossipMessage::::from(neighbor).encode() @@ -356,6 +423,7 @@ impl> NetworkBridge { ) { self.validator.note_set( set_id, + voters.voters().iter().map(|(v, _)| v.clone()).collect(), |to, neighbor| self.service.send_message(to, GossipMessage::::from(neighbor).encode()), ); @@ -596,7 +664,7 @@ fn check_compact_commit( let f = voters.total_weight() - voters.threshold(); let full_threshold = voters.total_weight() + f; - // check total weight is not too high. + // check total weight is not out of range. let mut total_weight = 0; for (_, ref id) in &msg.auth_data { if let Some(weight) = voters.info(id).map(|info| info.weight()) { diff --git a/core/finality-grandpa/src/communication/tests.rs b/core/finality-grandpa/src/communication/tests.rs index 2ef6d280646a4214f8564cff99806ce6c50f1db0..f2b50ab80c2b6288db97a6416da27612b67f9a74 100644 --- a/core/finality-grandpa/src/communication/tests.rs +++ b/core/finality-grandpa/src/communication/tests.rs @@ -72,6 +72,15 @@ impl super::Network for TestNetwork { let _ = self.sender.unbounded_send(Event::SendMessage(who, data)); } + /// Register a message with the gossip service, it isn't broadcast right + /// away to any peers, but may be sent to new peers joining or when asked to + /// broadcast the topic. Useful to register previous messages on node + /// startup. + fn register_gossip_message(&self, _topic: Hash, _data: Vec) { + // NOTE: only required to restore previous state on startup + // not required for tests currently + } + /// Report a peer's cost or benefit after some action. fn report(&self, who: network::PeerId, cost_benefit: i32) { let _ = self.sender.unbounded_send(Event::Report(who, cost_benefit)); @@ -136,6 +145,7 @@ fn make_test_network() -> impl Future { let (bridge, startup_work) = super::NetworkBridge::new( net.clone(), config(), + None, Exit, ); diff --git a/core/finality-grandpa/src/consensus_changes.rs b/core/finality-grandpa/src/consensus_changes.rs index cbd7b30f8e7a5ebcb2883baf4ea0be20683357d6..02ac95124151d70a42368f0917430a0c0e6d449b 100644 --- a/core/finality-grandpa/src/consensus_changes.rs +++ b/core/finality-grandpa/src/consensus_changes.rs @@ -32,6 +32,11 @@ impl ConsensusChanges { impl ConsensusChanges { + /// Returns reference to all pending changes. + pub fn pending_changes(&self) -> &[(N, H)] { + &self.pending_changes + } + /// Note unfinalized change of consensus-related data. pub(crate) fn note_change(&mut self, at: (N, H)) { let idx = self.pending_changes diff --git a/core/finality-grandpa/src/environment.rs b/core/finality-grandpa/src/environment.rs index e4ba75a1ef5a2a35bbeb1a39f76677a0e9af2c26..5a62a65f480dd9bf499ba20c404a1156ab3c6f23 100644 --- a/core/finality-grandpa/src/environment.rs +++ b/core/finality-grandpa/src/environment.rs @@ -34,7 +34,7 @@ use grandpa::{ }; use runtime_primitives::generic::BlockId; use runtime_primitives::traits::{ - As, Block as BlockT, Header as HeaderT, NumberFor, One, Zero, BlockNumberToHash, + Block as BlockT, Header as HeaderT, NumberFor, One, Zero, BlockNumberToHash, }; use substrate_primitives::{Blake2Hasher, ed25519, H256, Pair}; use substrate_telemetry::{telemetry, CONSENSUS_INFO}; @@ -45,12 +45,13 @@ use crate::{ PrimaryPropose, NewAuthoritySet, VoterCommand, HistoricalVotes, }; -use crate::authorities::SharedAuthoritySet; +use consensus_common::SelectChain; + +use crate::authorities::{AuthoritySet, SharedAuthoritySet}; use crate::consensus_changes::SharedConsensusChanges; use crate::justification::GrandpaJustification; use crate::until_imported::UntilVoteTargetImported; - -use ed25519::Public as AuthorityId; +use fg_primitives::AuthorityId; /// Data about a completed round. #[derive(Debug, Clone, Decode, Encode, PartialEq)] @@ -65,11 +66,13 @@ pub struct CompletedRound { pub votes: HistoricalVotes, } -// Data about last completed rounds. Stores NUM_LAST_COMPLETED_ROUNDS and always +// Data about last completed rounds within a single voter set. Stores NUM_LAST_COMPLETED_ROUNDS and always // contains data about at least one round (genesis). #[derive(Debug, Clone, PartialEq)] pub struct CompletedRounds { - inner: VecDeque>, + rounds: VecDeque>, + set_id: u64, + voters: Vec, } @@ -80,25 +83,53 @@ const NUM_LAST_COMPLETED_ROUNDS: usize = 2; impl Encode for CompletedRounds { fn encode(&self) -> Vec { - Vec::from_iter(&self.inner).encode() + let v = Vec::from_iter(&self.rounds); + (&v, &self.set_id, &self.voters).encode() } } impl Decode for CompletedRounds { fn decode(value: &mut I) -> Option { - Vec::>::decode(value) - .map(|completed_rounds| CompletedRounds { - inner: completed_rounds.into(), + <(Vec>, u64, Vec)>::decode(value) + .map(|(rounds, set_id, voters)| CompletedRounds { + rounds: rounds.into(), + set_id, + voters, }) } } impl CompletedRounds { /// Create a new completed rounds tracker with NUM_LAST_COMPLETED_ROUNDS capacity. +<<<<<<< HEAD pub fn new(genesis: CompletedRound) -> Self { let mut inner = VecDeque::with_capacity(NUM_LAST_COMPLETED_ROUNDS); inner.push_back(genesis); CompletedRounds { inner } +======= + pub(crate) fn new( + genesis: CompletedRound, + set_id: u64, + voters: &AuthoritySet>, + ) + -> CompletedRounds + { + let mut rounds = VecDeque::with_capacity(NUM_LAST_COMPLETED_ROUNDS); + rounds.push_back(genesis); + + let voters = voters.current().1.iter().map(|(a, _)| a.clone()).collect(); + CompletedRounds { rounds, set_id, voters } + } + + /// Get the set-id and voter set of the completed rounds. + pub fn set_info(&self) -> (u64, &[AuthorityId]) { + (self.set_id, &self.voters[..]) + } + + /// Iterate over all completed rounds. + pub fn iter(&self) -> impl Iterator> { + self.rounds.iter() +>>>>>>> master } /// Create a new completed rounds tracker initialized with the rounds in `completed_rounds`. @@ -108,7 +139,7 @@ impl CompletedRounds { /// Returns the last (latest) completed round. pub fn last(&self) -> &CompletedRound { - self.inner.back() + self.rounds.back() .expect("inner is never empty; always contains at least genesis; qed") } @@ -119,11 +150,11 @@ impl CompletedRounds { return false; } - if self.inner.len() == NUM_LAST_COMPLETED_ROUNDS { - self.inner.pop_front(); + if self.rounds.len() == NUM_LAST_COMPLETED_ROUNDS { + self.rounds.pop_front(); } - self.inner.push_back(completed_round); + self.rounds.push_back(completed_round); true } @@ -400,6 +431,7 @@ pub(crate) fn ancestry, E, RA>( if base == block { return Err(GrandpaError::NotDescendent) } let tree_route_res = ::client::blockchain::tree_route( + #[allow(deprecated)] client.backend().blockchain(), BlockId::Hash(block), BlockId::Hash(base), @@ -522,6 +554,7 @@ where current_round: HasVoted::Yes(local_id, Vote::Propose(propose)), }; + #[allow(deprecated)] crate::aux_schema::write_voter_set_state(&**self.inner.backend(), &set_state)?; Ok(Some(set_state)) @@ -563,6 +596,7 @@ where current_round: HasVoted::Yes(local_id, Vote::Prevote(propose.cloned(), prevote)), }; + #[allow(deprecated)] crate::aux_schema::write_voter_set_state(&**self.inner.backend(), &set_state)?; Ok(Some(set_state)) @@ -602,6 +636,7 @@ where current_round: HasVoted::Yes(local_id, Vote::Precommit(propose.clone(), prevote.clone(), precommit)), }; + #[allow(deprecated)] crate::aux_schema::write_voter_set_state(&**self.inner.backend(), &set_state)?; Ok(Some(set_state)) @@ -645,6 +680,7 @@ where current_round: HasVoted::No, }; + #[allow(deprecated)] crate::aux_schema::write_voter_set_state(&**self.inner.backend(), &set_state)?; Ok(Some(set_state)) @@ -656,8 +692,10 @@ where fn finalize_block(&self, hash: Block::Hash, number: NumberFor, round: u64, commit: Commit) -> Result<(), Self::Error> { use client::blockchain::HeaderBackend; - let status = self.inner.backend().blockchain().info()?; - if number <= status.finalized_number && self.inner.backend().blockchain().hash(number)? == Some(hash) { + #[allow(deprecated)] + let blockchain = self.inner.backend().blockchain(); + let status = blockchain.info(); + if number <= status.finalized_number && blockchain.hash(number)? == Some(hash) { // This can happen after a forced change (triggered by the finality tracker when finality is stalled), since // the voter will be restarted at the median last finalized block, which can be lower than the local best // finalized block. @@ -674,7 +712,7 @@ where &*self.inner, &self.authority_set, &self.consensus_changes, - Some(As::sa(self.config.justification_period)), + Some(self.config.justification_period.into()), hash, number, (round, commit).into(), @@ -806,7 +844,7 @@ pub(crate) fn finalize_block, E, RA>( // finalization to remote nodes if !justification_required { if let Some(justification_period) = justification_period { - let last_finalized_number = client.info()?.chain.finalized_number; + let last_finalized_number = client.info().chain.finalized_number; justification_required = (!last_finalized_number.is_zero() || number - last_finalized_number == justification_period) && (last_finalized_number / justification_period != number / justification_period); @@ -975,6 +1013,7 @@ where B: Backend, } let tree_route = client::blockchain::tree_route( + #[allow(deprecated)] client.backend().blockchain(), BlockId::Hash(*hash), BlockId::Hash(*base), diff --git a/core/finality-grandpa/src/finality_proof.rs b/core/finality-grandpa/src/finality_proof.rs index a3147ce33810383f6c5dd60193e0b0fb784c031e..e9cc08c6951c96604c767c9a606a8c163b184f03 100644 --- a/core/finality-grandpa/src/finality_proof.rs +++ b/core/finality-grandpa/src/finality_proof.rs @@ -17,254 +17,613 @@ //! GRANDPA block finality proof generation and check. //! //! Finality of block B is proved by providing: -//! 1) valid headers sub-chain from the block B to the block F; -//! 2) valid (with respect to proved authorities) GRANDPA justification of the block F; -//! 3) proof-of-execution of the `grandpa_authorities` call at the block F. +//! 1) the justification for the descendant block F; +//! 2) headers sub-chain (B; F] if B != F; +//! 3) proof of GRANDPA::authorities() if the set changes at block F. //! //! Since earliest possible justification is returned, the GRANDPA authorities set //! at the block F is guaranteed to be the same as in the block B (this is because block //! that enacts new GRANDPA authorities set always comes with justification). It also //! means that the `set_id` is the same at blocks B and F. //! -//! The caller should track the `set_id`. The most straightforward way is to fetch finality -//! proofs ONLY for blocks on the tip of the chain and track the latest known `set_id`. +//! Let U be the last finalized block known to caller. If authorities set has changed several +//! times in the (U; F] interval, multiple finality proof fragments are returned (one for each +//! authority set change) and they must be verified in-order. +//! +//! Finality proof provider can choose how to provide finality proof on its own. The incomplete +//! finality proof (that finalizes some block C that is ancestor of the B and descendant +//! of the U) could be returned. -use grandpa::voter_set::VoterSet; +use std::sync::Arc; +use log::{trace, warn}; use client::{ - blockchain::Backend as BlockchainBackend, + backend::Backend, blockchain::Backend as BlockchainBackend, CallExecutor, Client, error::{Error as ClientError, Result as ClientResult}, - light::fetcher::RemoteCallRequest, + light::fetcher::{FetchChecker, RemoteCallRequest}, + ExecutionStrategy, NeverOffchainExt, }; use parity_codec::{Encode, Decode}; use grandpa::BlockNumberOps; -use runtime_primitives::generic::BlockId; +use runtime_primitives::{Justification, generic::BlockId}; use runtime_primitives::traits::{ NumberFor, Block as BlockT, Header as HeaderT, One, }; -use substrate_primitives::{ed25519, H256}; -use ed25519::Public as AuthorityId; +use substrate_primitives::{H256, Blake2Hasher}; use substrate_telemetry::{telemetry, CONSENSUS_INFO}; +use fg_primitives::AuthorityId; use crate::justification::GrandpaJustification; -/// Prepare proof-of-finality for the given block. +/// Maximum number of fragments that we want to return in a single prove_finality call. +const MAX_FRAGMENTS_IN_PROOF: usize = 8; + +/// GRANDPA authority set related methods for the finality proof provider. +pub trait AuthoritySetForFinalityProver: Send + Sync { + /// Call GrandpaApi::grandpa_authorities at given block. + fn authorities(&self, block: &BlockId) -> ClientResult>; + /// Prove call of GrandpaApi::grandpa_authorities at given block. + fn prove_authorities(&self, block: &BlockId) -> ClientResult>>; +} + +/// Client-based implementation of AuthoritySetForFinalityProver. +impl, RA> AuthoritySetForFinalityProver for Client + where + B: Backend + Send + Sync + 'static, + E: CallExecutor + 'static + Clone + Send + Sync, + RA: Send + Sync, +{ + fn authorities(&self, block: &BlockId) -> ClientResult> { + self.executor().call( + block, + "GrandpaApi_grandpa_authorities", + &[], + ExecutionStrategy::NativeElseWasm, + NeverOffchainExt::new(), + ).and_then(|call_result| Decode::decode(&mut &call_result[..]) + .ok_or_else(|| ClientError::CallResultDecode( + "failed to decode GRANDPA authorities set proof".into(), + ))) + } + + fn prove_authorities(&self, block: &BlockId) -> ClientResult>> { + self.execution_proof(block, "GrandpaApi_grandpa_authorities",&[]).map(|(_, proof)| proof) + } +} + +/// GRANDPA authority set related methods for the finality proof checker. +pub trait AuthoritySetForFinalityChecker: Send + Sync { + /// Check execution proof of Grandpa::grandpa_authorities at given block. + fn check_authorities_proof( + &self, + hash: Block::Hash, + header: Block::Header, + proof: Vec>, + ) -> ClientResult>; +} + +/// FetchChecker-based implementation of AuthoritySetForFinalityChecker. +impl AuthoritySetForFinalityChecker for Arc> { + fn check_authorities_proof( + &self, + hash: Block::Hash, + header: Block::Header, + proof: Vec>, + ) -> ClientResult> { + let request = RemoteCallRequest { + block: hash, + header, + method: "GrandpaApi_grandpa_authorities".into(), + call_data: vec![], + retry_count: None, + }; + + self.check_execution_proof(&request, proof) + .and_then(|authorities| { + let authorities: Vec<(AuthorityId, u64)> = Decode::decode(&mut &authorities[..]) + .ok_or_else(|| ClientError::CallResultDecode( + "failed to decode GRANDPA authorities set proof".into(), + ))?; + Ok(authorities.into_iter().collect()) + }) + } +} + +/// Finality proof provider for serving network requests. +pub struct FinalityProofProvider, RA> { + client: Arc>, + authority_provider: Arc>, +} + +impl, RA> FinalityProofProvider + where + B: Backend + Send + Sync + 'static, + E: CallExecutor + 'static + Clone + Send + Sync, + RA: Send + Sync, +{ + /// Create new finality proof provider using: + /// + /// - client for accessing blockchain data; + /// - authority_provider for calling and proving runtime methods. + pub fn new( + client: Arc>, + authority_provider: Arc>, + ) -> Self { + FinalityProofProvider { client, authority_provider } + } +} + +impl network::FinalityProofProvider for FinalityProofProvider + where + Block: BlockT, + NumberFor: BlockNumberOps, + B: Backend + Send + Sync + 'static, + E: CallExecutor + 'static + Clone + Send + Sync, + RA: Send + Sync, +{ + fn prove_finality( + &self, + for_block: Block::Hash, + request: &[u8], + ) -> Result>, ClientError> { + let request: FinalityProofRequest = Decode::decode(&mut &request[..]) + .ok_or_else(|| { + warn!(target: "finality", "Unable to decode finality proof request."); + ClientError::Backend(format!("Invalid finality proof request")) + })?; + match request { + FinalityProofRequest::Original(request) => prove_finality::<_, _, GrandpaJustification>( + #[allow(deprecated)] + &*self.client.backend().blockchain(), + &*self.authority_provider, + request.authorities_set_id, + request.last_finalized, + for_block, + ), + } + } +} + +/// The effects of block finality. +#[derive(Debug, PartialEq)] +pub struct FinalityEffects { + /// The (ordered) set of headers that could be imported. + pub headers_to_import: Vec

, + /// The hash of the block that could be finalized. + pub block: Header::Hash, + /// The justification for the block. + pub justification: Vec, + /// New authorities set id that should be applied starting from block. + pub new_set_id: u64, + /// New authorities set that should be applied starting from block. + pub new_authorities: Vec<(AuthorityId, u64)>, +} + +/// Single fragment of proof-of-finality. /// -/// The proof is the serialized `FinalityProof` constructed using earliest known -/// justification of the block. None is returned if there's no known justification atm. -pub fn prove_finality( +/// Finality for block B is proved by providing: +/// 1) the justification for the descendant block F; +/// 2) headers sub-chain (B; F] if B != F; +/// 3) proof of GRANDPA::authorities() if the set changes at block F. +#[derive(Debug, PartialEq, Encode, Decode)] +struct FinalityProofFragment { + /// The hash of block F for which justification is provided. + pub block: Header::Hash, + /// Justification of the block F. + pub justification: Vec, + /// The set of headers in the range (U; F] that we believe are unknown to the caller. Ordered. + pub unknown_headers: Vec
, + /// Optional proof of execution of GRANDPA::authorities(). + pub authorities_proof: Option>>, +} + +/// Proof of finality is the ordered set of finality fragments, where: +/// - last fragment provides justification for the best possible block from the requested range; +/// - all other fragments provide justifications for GRANDPA authorities set changes within requested range. +type FinalityProof
= Vec>; + +/// Finality proof request data. +#[derive(Debug, Encode, Decode)] +enum FinalityProofRequest { + /// Original version of the request. + Original(OriginalFinalityProofRequest), +} + +/// Original version of finality proof request. +#[derive(Debug, Encode, Decode)] +struct OriginalFinalityProofRequest { + /// The authorities set id we are waiting proof from. + /// + /// The first justification in the proof must be signed by this authority set. + pub authorities_set_id: u64, + /// Hash of the last known finalized block. + pub last_finalized: H, +} + +/// Prepare data blob associated with finality proof request. +pub(crate) fn make_finality_proof_request(last_finalized: H, authorities_set_id: u64) -> Vec { + FinalityProofRequest::Original(OriginalFinalityProofRequest { + authorities_set_id, + last_finalized, + }).encode() +} + +/// Prepare proof-of-finality for the best possible block in the range: (begin; end]. +/// +/// It is assumed that the caller already have a proof-of-finality for the block 'begin'. +/// It is assumed that the caller already knows all blocks in the range (begin; end]. +/// +/// Returns None if there are no finalized blocks unknown to the caller. +pub(crate) fn prove_finality, B: BlockchainBackend, J>( blockchain: &B, - generate_execution_proof: G, - block: Block::Hash, + authorities_provider: &dyn AuthoritySetForFinalityProver, + authorities_set_id: u64, + begin: Block::Hash, + end: Block::Hash, ) -> ::client::error::Result>> where - B: BlockchainBackend, - G: Fn(&BlockId, &str, &[u8]) -> ClientResult>>, + J: ProvableJustification, { - let block_id = BlockId::Hash(block); - let mut block_number = blockchain.expect_block_number_from_id(&block_id)?; + let begin_id = BlockId::Hash(begin); + let begin_number = blockchain.expect_block_number_from_id(&begin_id)?; + + // early-return if we sure that there are no blocks finalized AFTER begin block + let info = blockchain.info(); + if info.finalized_number <= begin_number { + trace!( + target: "finality", + "Requested finality proof for descendant of #{} while we only have finalized #{}. Returning empty proof.", + begin_number, + info.finalized_number, + ); - // early-return if we sure that the block isn't finalized yet - let info = blockchain.info()?; - if info.finalized_number < block_number { return Ok(None); } + // check if blocks range is valid. It is the caller responsibility to ensure + // that it only asks peers that know about whole blocks range + let end_number = blockchain.expect_block_number_from_id(&BlockId::Hash(end))?; + if begin_number + One::one() > end_number { + return Err(ClientError::Backend( + format!("Cannot generate finality proof for invalid range: {}..{}", begin_number, end_number), + )); + } + // early-return if we sure that the block is NOT a part of canonical chain - let canonical_block = blockchain.expect_block_hash_from_id(&BlockId::Number(block_number))?; - if block != canonical_block { + let canonical_begin = blockchain.expect_block_hash_from_id(&BlockId::Number(begin_number))?; + if begin != canonical_begin { return Err(ClientError::Backend( - "Cannot generate finality proof for non-canonical block".into() - ).into()); - } - - // now that we know that the block is finalized, we can generate finalization proof - - // we need to prove grandpa authorities set that has generated justification - // BUT since `GrandpaApi::grandpa_authorities` call returns the set that becames actual - // at the next block, the proof-of execution is generated using parent block' state - // (this will fail if we're trying to prove genesis finality, but such the call itself is redundant) - let mut current_header = blockchain.expect_header(BlockId::Hash(block))?; - let parent_block_id = BlockId::Hash(*current_header.parent_hash()); - let authorities_proof = generate_execution_proof( - &parent_block_id, - "GrandpaApi_grandpa_authorities", - &[], - )?; - - // search for earliest post-block (inclusive) justification - let mut finalization_path = Vec::new(); + format!("Cannot generate finality proof for non-canonical block: {}", begin), + )); + } + + // iterate justifications && try to prove finality + let mut fragment_index = 0; + let mut current_authorities = authorities_provider.authorities(&begin_id)?; + let mut current_number = begin_number + One::one(); + let mut finality_proof = Vec::new(); + let mut unknown_headers = Vec::new(); + let mut latest_proof_fragment = None; loop { - finalization_path.push(current_header); + let current_id = BlockId::Number(current_number); - match blockchain.justification(BlockId::Number(block_number))? { - Some(justification) => return Ok(Some(FinalityProof { - finalization_path, + // check if header is unknown to the caller + if current_number > end_number { + let unknown_header = blockchain.expect_header(current_id)?; + unknown_headers.push(unknown_header); + } + + if let Some(justification) = blockchain.justification(current_id)? { + // check if the current block enacts new GRANDPA authorities set + let parent_id = BlockId::Number(current_number - One::one()); + let new_authorities = authorities_provider.authorities(&parent_id)?; + let new_authorities_proof = if current_authorities != new_authorities { + current_authorities = new_authorities; + Some(authorities_provider.prove_authorities(&parent_id)?) + } else { + None + }; + + // prepare finality proof for the current block + let current = blockchain.expect_block_hash_from_id(&BlockId::Number(current_number))?; + let proof_fragment = FinalityProofFragment { + block: current, justification, - authorities_proof, - }.encode())), - None if block_number == info.finalized_number => break, - None => { - block_number = block_number + One::one(); - current_header = blockchain.expect_header(BlockId::Number(block_number))?; - }, + unknown_headers: ::std::mem::replace(&mut unknown_headers, Vec::new()), + authorities_proof: new_authorities_proof, + }; + + // append justification to finality proof if required + let justifies_end_block = current_number >= end_number; + let justifies_authority_set_change = proof_fragment.authorities_proof.is_some(); + if justifies_end_block || justifies_authority_set_change { + // check if the proof is generated by the requested authority set + if finality_proof.is_empty() { + let justification_check_result = J::decode_and_verify( + &proof_fragment.justification, + authorities_set_id, + ¤t_authorities, + ); + if justification_check_result.is_err() { + trace!( + target: "finality", + "Can not provide finality proof with requested set id #{}\ + (possible forced change?). Returning empty proof.", + authorities_set_id, + ); + + return Ok(None); + } + } + + finality_proof.push(proof_fragment); + latest_proof_fragment = None; + } else { + latest_proof_fragment = Some(proof_fragment); + } + + // we don't need to provide more justifications + if justifies_end_block { + break; + } } + + // we can't provide more justifications + if current_number == info.finalized_number { + // append last justification - even if we can't generate finality proof for + // the end block, we try to generate it for the latest possible block + if let Some(latest_proof_fragment) = latest_proof_fragment.take() { + finality_proof.push(latest_proof_fragment); + + fragment_index += 1; + if fragment_index == MAX_FRAGMENTS_IN_PROOF { + break; + } + } + break; + } + + // else search for the next justification + current_number = current_number + One::one(); } - Err(ClientError::Backend( - "cannot find justification for finalized block".into() - ).into()) + if finality_proof.is_empty() { + trace!( + target: "finality", + "No justifications found when making finality proof for {}. Returning empty proof.", + end, + ); + + Ok(None) + } else { + trace!( + target: "finality", + "Built finality proof for {} of {} fragments. Last fragment for {}.", + end, + finality_proof.len(), + finality_proof.last().expect("checked that !finality_proof.is_empty(); qed").block, + ); + + Ok(Some(finality_proof.encode())) + } } -/// Check proof-of-finality for the given block. +/// Check GRANDPA proof-of-finality for the given block. /// -/// Returns the vector of headers (including `block` header, ordered by ASC block number) that MUST be -/// validated + imported at once (i.e. within single db transaction). If at least one of those headers -/// is invalid, all other MUST be considered invalid. -pub fn check_finality_proof, C>( - check_execution_proof: C, - parent_header: Block::Header, - block: (NumberFor, Block::Hash), - set_id: u64, +/// Returns the vector of headers that MUST be validated + imported +/// AND if at least one of those headers is invalid, all other MUST be considered invalid. +pub(crate) fn check_finality_proof, B>( + blockchain: &B, + current_set_id: u64, + current_authorities: Vec<(AuthorityId, u64)>, + authorities_provider: &dyn AuthoritySetForFinalityChecker, remote_proof: Vec, -) -> ClientResult> +) -> ClientResult> where - NumberFor: grandpa::BlockNumberOps, - C: Fn(&RemoteCallRequest) -> ClientResult>, + NumberFor: BlockNumberOps, + B: BlockchainBackend, { - do_check_finality_proof::>( - check_execution_proof, - parent_header, - block, - set_id, - remote_proof, - ) + do_check_finality_proof::<_, _, GrandpaJustification>( + blockchain, + current_set_id, + current_authorities, + authorities_provider, + remote_proof) } -/// Check proof-of-finality using given justification type. -fn do_check_finality_proof, C, J>( - check_execution_proof: C, - parent_header: Block::Header, - block: (NumberFor, Block::Hash), - set_id: u64, +fn do_check_finality_proof, B, J>( + blockchain: &B, + current_set_id: u64, + current_authorities: Vec<(AuthorityId, u64)>, + authorities_provider: &dyn AuthoritySetForFinalityChecker, remote_proof: Vec, -) -> ClientResult> +) -> ClientResult> where - NumberFor: grandpa::BlockNumberOps, - C: Fn(&RemoteCallRequest) -> ClientResult>, + NumberFor: BlockNumberOps, + B: BlockchainBackend, J: ProvableJustification, { // decode finality proof - let proof = FinalityProof::::decode(&mut &remote_proof[..]) + let proof = FinalityProof::::decode(&mut &remote_proof[..]) .ok_or_else(|| ClientError::BadJustification("failed to decode finality proof".into()))?; - // check that the first header in finalization path is the block itself - { - let finalized_header = proof.finalization_path.first() - .ok_or_else(|| ClientError::from(ClientError::BadJustification( - "finality proof: finalized path is empty".into() - )))?; - if *finalized_header.number() != block.0 || finalized_header.hash() != block.1 { - return Err(ClientError::BadJustification( - "finality proof: block is not a part of finalized path".into() - ).into()); - } + // empty proof can't prove anything + if proof.is_empty() { + return Err(ClientError::BadJustification("empty proof of finality".into())); } - // check that the last header in finalization path is the justification target block - let just_block = proof.justification.target_block(); - { - let finalized_header = proof.finalization_path.last() - .expect("checked above that proof.finalization_path is not empty; qed"); - if *finalized_header.number() != just_block.0 || finalized_header.hash() != just_block.1 { - return Err(ClientError::BadJustification( - "finality proof: target justification block is not a part of finalized path".into() - ).into()); + // iterate and verify proof fragments + let last_fragment_index = proof.len() - 1; + let mut authorities = AuthoritiesOrEffects::Authorities(current_set_id, current_authorities); + for (proof_fragment_index, proof_fragment) in proof.into_iter().enumerate() { + // check that proof is non-redundant. The proof still can be valid, but + // we do not want peer to spam us with redundant data + if proof_fragment_index != last_fragment_index { + let has_unknown_headers = !proof_fragment.unknown_headers.is_empty(); + let has_new_authorities = proof_fragment.authorities_proof.is_some(); + if has_unknown_headers || !has_new_authorities { + return Err(ClientError::BadJustification("redundant proof of finality".into())); + } } - } - // check authorities set proof && get grandpa authorities that should have signed justification - let grandpa_authorities = check_execution_proof(&RemoteCallRequest { - block: just_block.1, - header: parent_header, - method: "GrandpaApi_grandpa_authorities".into(), - call_data: vec![], - retry_count: None, - })?; - let grandpa_authorities: Vec<(AuthorityId, u64)> = Decode::decode(&mut &grandpa_authorities[..]) - .ok_or_else(|| ClientError::BadJustification("failed to decode GRANDPA authorities set proof".into()))?; + authorities = check_finality_proof_fragment::<_, _, J>( + blockchain, + authorities, + authorities_provider, + proof_fragment)?; + } - // and now check justification - proof.justification.verify(set_id, &grandpa_authorities.into_iter().collect())?; + let effects = authorities.extract_effects().expect("at least one loop iteration is guaranteed + because proof is not empty;\ + check_finality_proof_fragment is called on every iteration;\ + check_finality_proof_fragment always returns FinalityEffects;\ + qed"); telemetry!(CONSENSUS_INFO; "afg.finality_proof_ok"; - "set_id" => ?set_id, "finalized_header_hash" => ?block.1); - Ok(proof.finalization_path) + "set_id" => ?effects.new_set_id, "finalized_header_hash" => ?effects.block); + + Ok(effects) } -/// Proof of finality. -/// -/// Finality of block B is proved by providing: -/// 1) valid headers sub-chain from the block B to the block F; -/// 2) proof of `GrandpaApi::grandpa_authorities()` call at the block F; -/// 3) valid (with respect to proved authorities) GRANDPA justification of the block F. -#[derive(Debug, PartialEq, Encode, Decode)] -struct FinalityProof { - /// Headers-path (ordered by block number, ascending) from the block we're gathering proof for - /// (inclusive) to the target block of the justification (inclusive). - pub finalization_path: Vec
, - /// Justification (finalization) of the last block from the `finalization_path`. - pub justification: Justification, - /// Proof of `GrandpaApi::grandpa_authorities` call execution at the - /// justification' target block. - pub authorities_proof: Vec>, +/// Check finality proof for the single block. +fn check_finality_proof_fragment, B, J>( + blockchain: &B, + authority_set: AuthoritiesOrEffects, + authorities_provider: &dyn AuthoritySetForFinalityChecker, + proof_fragment: FinalityProofFragment, +) -> ClientResult> + where + NumberFor: BlockNumberOps, + B: BlockchainBackend, + J: Decode + ProvableJustification, +{ + // verify justification using previous authorities set + let (mut current_set_id, mut current_authorities) = authority_set.extract_authorities(); + let justification: J = Decode::decode(&mut &proof_fragment.justification[..]) + .ok_or_else(|| ClientError::JustificationDecode)?; + justification.verify(current_set_id, ¤t_authorities)?; + + // and now verify new authorities proof (if provided) + if let Some(new_authorities_proof) = proof_fragment.authorities_proof { + // it is safe to query header here, because its non-finality proves that it can't be pruned + let header = blockchain.expect_header(BlockId::Hash(proof_fragment.block))?; + let parent_hash = *header.parent_hash(); + let parent_header = blockchain.expect_header(BlockId::Hash(parent_hash))?; + current_authorities = authorities_provider.check_authorities_proof( + parent_hash, + parent_header, + new_authorities_proof, + )?; + + current_set_id = current_set_id + 1; + } + + Ok(AuthoritiesOrEffects::Effects(FinalityEffects { + headers_to_import: proof_fragment.unknown_headers, + block: proof_fragment.block, + justification: proof_fragment.justification, + new_set_id: current_set_id, + new_authorities: current_authorities, + })) } -/// Justification used to prove block finality. -trait ProvableJustification: Encode + Decode { - /// Get target block of this justification. - fn target_block(&self) -> (Header::Number, Header::Hash); +/// Authorities set from initial authorities set or finality effects. +enum AuthoritiesOrEffects { + Authorities(u64, Vec<(AuthorityId, u64)>), + Effects(FinalityEffects
), +} +impl AuthoritiesOrEffects
{ + pub fn extract_authorities(self) -> (u64, Vec<(AuthorityId, u64)>) { + match self { + AuthoritiesOrEffects::Authorities(set_id, authorities) => (set_id, authorities), + AuthoritiesOrEffects::Effects(effects) => (effects.new_set_id, effects.new_authorities), + } + } + + pub fn extract_effects(self) -> Option> { + match self { + AuthoritiesOrEffects::Authorities(_, _) => None, + AuthoritiesOrEffects::Effects(effects) => Some(effects), + } + } +} + +/// Justification used to prove block finality. +pub(crate) trait ProvableJustification: Encode + Decode { /// Verify justification with respect to authorities set and authorities set id. - fn verify(&self, set_id: u64, authorities: &VoterSet) -> ClientResult<()>; + fn verify(&self, set_id: u64, authorities: &[(AuthorityId, u64)]) -> ClientResult<()>; + + /// Decode and verify justification. + fn decode_and_verify( + justification: &Justification, + set_id: u64, + authorities: &[(AuthorityId, u64)], + ) -> ClientResult { + let justification = Self::decode(&mut &**justification).ok_or(ClientError::JustificationDecode)?; + justification.verify(set_id, authorities)?; + Ok(justification) + } } impl> ProvableJustification for GrandpaJustification where NumberFor: BlockNumberOps, { - fn target_block(&self) -> (NumberFor, Block::Hash) { - (self.commit.target_number, self.commit.target_hash) - } - - fn verify(&self, set_id: u64, authorities: &VoterSet) -> ClientResult<()> { - GrandpaJustification::verify(self, set_id, authorities) + fn verify(&self, set_id: u64, authorities: &[(AuthorityId, u64)]) -> ClientResult<()> { + GrandpaJustification::verify(self, set_id, &authorities.iter().cloned().collect()) } } #[cfg(test)] -mod tests { - use test_client::runtime::{Block, Header}; - use test_client::client::backend::NewBlockState; +pub(crate) mod tests { + use test_client::runtime::{Block, Header, H256}; + use test_client::client::{backend::NewBlockState}; use test_client::client::in_mem::Blockchain as InMemoryBlockchain; use super::*; - type FinalityProof = super::FinalityProof>; + type FinalityProof = super::FinalityProof
; + + impl AuthoritySetForFinalityProver for (GetAuthorities, ProveAuthorities) + where + GetAuthorities: Send + Sync + Fn(BlockId) -> ClientResult>, + ProveAuthorities: Send + Sync + Fn(BlockId) -> ClientResult>>, + { + fn authorities(&self, block: &BlockId) -> ClientResult> { + self.0(*block) + } - #[derive(Encode, Decode)] - struct ValidFinalityProof(Vec); + fn prove_authorities(&self, block: &BlockId) -> ClientResult>> { + self.1(*block) + } + } - impl ProvableJustification
for ValidFinalityProof { - fn target_block(&self) -> (u64, H256) { (3, header(3).hash()) } + struct ClosureAuthoritySetForFinalityChecker(pub Closure); - fn verify(&self, set_id: u64, authorities: &VoterSet) -> ClientResult<()> { - assert_eq!(set_id, 1); - assert_eq!(authorities, &vec![ - (AuthorityId([1u8; 32]), 1), - (AuthorityId([2u8; 32]), 2), - (AuthorityId([3u8; 32]), 3), - ].into_iter().collect()); - Ok(()) + impl AuthoritySetForFinalityChecker for ClosureAuthoritySetForFinalityChecker + where + Closure: Send + Sync + Fn(H256, Header, Vec>) -> ClientResult>, + { + fn check_authorities_proof( + &self, + hash: H256, + header: Header, + proof: Vec>, + ) -> ClientResult> { + self.0(hash, header, proof) + } + } + + #[derive(Debug, PartialEq, Encode, Decode)] + pub struct TestJustification(pub bool, pub Vec); + + impl ProvableJustification
for TestJustification { + fn verify(&self, _set_id: u64, _authorities: &[(AuthorityId, u64)]) -> ClientResult<()> { + if self.0 { + Ok(()) + } else { + Err(ClientError::BadJustification("test".into())) + } } } @@ -277,7 +636,23 @@ mod tests { } fn side_header(number: u64) -> Header { - Header::new(number, H256::from_low_u64_be(0), H256::from_low_u64_be(1), header(number - 1).hash(), Default::default()) + Header::new( + number, + H256::from_low_u64_be(0), + H256::from_low_u64_be(1), + header(number - 1).hash(), + Default::default(), + ) + } + + fn second_side_header(number: u64) -> Header { + Header::new( + number, + H256::from_low_u64_be(0), + H256::from_low_u64_be(1), + side_header(number - 1).hash(), + Default::default(), + ) } fn test_blockchain() -> InMemoryBlockchain { @@ -290,13 +665,42 @@ mod tests { } #[test] - fn finality_proof_is_not_generated_for_non_final_block() { + fn finality_prove_fails_with_invalid_range() { + let blockchain = test_blockchain(); + + // their last finalized is: 2 + // they request for proof-of-finality of: 2 + // => range is invalid + prove_finality::<_, _, TestJustification>( + &blockchain, + &( + |_| unreachable!("should return before calling GetAuthorities"), + |_| unreachable!("should return before calling ProveAuthorities"), + ), + 0, + header(2).hash(), + header(2).hash(), + ).unwrap_err(); + } + + #[test] + fn finality_proof_is_none_if_no_more_last_finalized_blocks() { let blockchain = test_blockchain(); blockchain.insert(header(4).hash(), header(4), None, None, NewBlockState::Best).unwrap(); - // when asking for finality of block 4, None is returned - let proof_of_4 = prove_finality(&blockchain, |_, _, _| Ok(vec![vec![42]]), header(4).hash()) - .unwrap(); + // our last finalized is: 3 + // their last finalized is: 3 + // => we can't provide any additional justifications + let proof_of_4 = prove_finality::<_, _, TestJustification>( + &blockchain, + &( + |_| unreachable!("should return before calling GetAuthorities"), + |_| unreachable!("should return before calling ProveAuthorities"), + ), + 0, + header(3).hash(), + header(4).hash(), + ).unwrap(); assert_eq!(proof_of_4, None); } @@ -305,128 +709,279 @@ mod tests { let blockchain = test_blockchain(); blockchain.insert(header(4).hash(), header(4), None, None, NewBlockState::Best).unwrap(); blockchain.insert(side_header(4).hash(), side_header(4), None, None, NewBlockState::Best).unwrap(); + blockchain.insert(second_side_header(5).hash(), second_side_header(5), None, None, NewBlockState::Best) + .unwrap(); blockchain.insert(header(5).hash(), header(5), Some(vec![5]), None, NewBlockState::Final).unwrap(); - // when asking for finality of side-block 42, None is returned - let proof_of_side_4_fails = prove_finality(&blockchain, |_, _, _| Ok(vec![vec![42]]), H256::from_low_u64_be(42)).is_err(); - assert_eq!(proof_of_side_4_fails, true); + // chain is 1 -> 2 -> 3 -> 4 -> 5 + // \> 4' -> 5' + // and the best finalized is 5 + // => when requesting for (4'; 5'], error is returned + prove_finality::<_, _, TestJustification>( + &blockchain, + &( + |_| unreachable!("should return before calling GetAuthorities"), + |_| unreachable!("should return before calling ProveAuthorities"), + ), + 0, + side_header(4).hash(), + second_side_header(5).hash(), + ).unwrap_err(); } #[test] - fn finality_proof_fails_if_no_justification_known() { + fn finality_proof_is_none_if_no_justification_known() { let blockchain = test_blockchain(); blockchain.insert(header(4).hash(), header(4), None, None, NewBlockState::Final).unwrap(); - // when asking for finality of block 4, search for justification failing - let proof_of_4_fails = prove_finality(&blockchain, |_, _, _| Ok(vec![vec![42]]), H256::from_low_u64_be(42)).is_err(); - assert_eq!(proof_of_4_fails, true); + // block 4 is finalized without justification + // => we can't prove finality + let proof_of_4 = prove_finality::<_, _, TestJustification>( + &blockchain, + &( + |_| Ok(vec![(AuthorityId::from_raw([1u8; 32]), 1u64)]), + |_| unreachable!("authorities didn't change => ProveAuthorities won't be called"), + ), + 0, + header(3).hash(), + header(4).hash(), + ).unwrap(); + assert_eq!(proof_of_4, None); } #[test] - fn prove_finality_is_generated() { + fn finality_proof_works_without_authorities_change() { let blockchain = test_blockchain(); + let just4 = TestJustification(true, vec![4]).encode(); + let just5 = TestJustification(true, vec![5]).encode(); + blockchain.insert(header(4).hash(), header(4), Some(just4), None, NewBlockState::Final).unwrap(); + blockchain.insert(header(5).hash(), header(5), Some(just5.clone()), None, NewBlockState::Final).unwrap(); + + // blocks 4 && 5 are finalized with justification + // => since authorities are the same, we only need justification for 5 + let proof_of_5: FinalityProof = Decode::decode(&mut &prove_finality::<_, _, TestJustification>( + &blockchain, + &( + |_| Ok(vec![(AuthorityId::from_raw([1u8; 32]), 1u64)]), + |_| unreachable!("should return before calling ProveAuthorities"), + ), + 0, + header(3).hash(), + header(5).hash(), + ).unwrap().unwrap()[..]).unwrap(); + assert_eq!(proof_of_5, vec![FinalityProofFragment { + block: header(5).hash(), + justification: just5, + unknown_headers: Vec::new(), + authorities_proof: None, + }]); + } - // when asking for finality of block 2, justification of 3 is returned - let proof_of_2: FinalityProof = prove_finality(&blockchain, |_, _, _| Ok(vec![vec![42]]), header(2).hash()) - .unwrap().and_then(|p| Decode::decode(&mut &p[..])).unwrap(); - assert_eq!(proof_of_2, FinalityProof { - finalization_path: vec![header(2), header(3)], - justification: vec![3], - authorities_proof: vec![vec![42]], - }); + #[test] + fn finality_proof_finalized_earlier_block_if_no_justification_for_target_is_known() { + let blockchain = test_blockchain(); + blockchain.insert(header(4).hash(), header(4), Some(vec![4]), None, NewBlockState::Final).unwrap(); + blockchain.insert(header(5).hash(), header(5), None, None, NewBlockState::Final).unwrap(); + + // block 4 is finalized with justification + we request for finality of 5 + // => we can't prove finality of 5, but providing finality for 4 is still useful for requester + let proof_of_5: FinalityProof = Decode::decode(&mut &prove_finality::<_, _, TestJustification>( + &blockchain, + &( + |_| Ok(vec![(AuthorityId::from_raw([1u8; 32]), 1u64)]), + |_| unreachable!("should return before calling ProveAuthorities"), + ), + 0, + header(3).hash(), + header(5).hash(), + ).unwrap().unwrap()[..]).unwrap(); + assert_eq!(proof_of_5, vec![FinalityProofFragment { + block: header(4).hash(), + justification: vec![4], + unknown_headers: Vec::new(), + authorities_proof: None, + }]); + } - // when asking for finality of block 3, justification of 3 is returned - let proof_of_3: FinalityProof = prove_finality(&blockchain, |_, _, _| Ok(vec![vec![42]]), header(3).hash()) - .unwrap().and_then(|p| Decode::decode(&mut &p[..])).unwrap(); - assert_eq!(proof_of_3, FinalityProof { - finalization_path: vec![header(3)], - justification: vec![3], - authorities_proof: vec![vec![42]], - }); + #[test] + fn finality_proof_works_with_authorities_change() { + let blockchain = test_blockchain(); + let just4 = TestJustification(true, vec![4]).encode(); + let just5 = TestJustification(true, vec![5]).encode(); + let just7 = TestJustification(true, vec![7]).encode(); + blockchain.insert(header(4).hash(), header(4), Some(just4), None, NewBlockState::Final).unwrap(); + blockchain.insert(header(5).hash(), header(5), Some(just5.clone()), None, NewBlockState::Final).unwrap(); + blockchain.insert(header(6).hash(), header(6), None, None, NewBlockState::Final).unwrap(); + blockchain.insert(header(7).hash(), header(7), Some(just7.clone()), None, NewBlockState::Final).unwrap(); + + // when querying for finality of 6, we assume that the #6 is the last block known to the requester + // => since we only have justification for #7, we provide #7 + let proof_of_6: FinalityProof = Decode::decode(&mut &prove_finality::<_, _, TestJustification>( + &blockchain, + &( + |block_id| match block_id { + BlockId::Hash(h) if h == header(3).hash() => Ok(vec![(AuthorityId::from_raw([3u8; 32]), 1u64)]), + BlockId::Number(3) => Ok(vec![(AuthorityId::from_raw([3u8; 32]), 1u64)]), + BlockId::Number(4) => Ok(vec![(AuthorityId::from_raw([4u8; 32]), 1u64)]), + BlockId::Number(6) => Ok(vec![(AuthorityId::from_raw([6u8; 32]), 1u64)]), + _ => unreachable!("no other authorities should be fetched: {:?}", block_id), + }, + |block_id| match block_id { + BlockId::Number(4) => Ok(vec![vec![40]]), + BlockId::Number(6) => Ok(vec![vec![60]]), + _ => unreachable!("no other authorities should be proved: {:?}", block_id), + }, + ), + 0, + header(3).hash(), + header(6).hash(), + ).unwrap().unwrap()[..]).unwrap(); + // initial authorities set (which start acting from #4) is [3; 32] + assert_eq!(proof_of_6, vec![ + // new authorities set starts acting from #5 => we do not provide fragment for #4 + // first fragment provides justification for #5 && authorities set that starts acting from #5 + FinalityProofFragment { + block: header(5).hash(), + justification: just5, + unknown_headers: Vec::new(), + authorities_proof: Some(vec![vec![40]]), + }, + // last fragment provides justification for #7 && unknown#7 + FinalityProofFragment { + block: header(7).hash(), + justification: just7, + unknown_headers: vec![header(7)], + authorities_proof: Some(vec![vec![60]]), + }, + ]); } #[test] - fn finality_proof_check_fails_when_block_is_not_included() { - let mut proof_of_2: FinalityProof = prove_finality( - &test_blockchain(), - |_, _, _| Ok(vec![vec![42]]), - header(2).hash(), - ).unwrap().and_then(|p| Decode::decode(&mut &p[..])).unwrap(); - proof_of_2.finalization_path.remove(0); - - // block for which we're trying to request finality proof is missing from finalization_path - assert_eq!(do_check_finality_proof::( - |_| Ok(Vec::::new().encode()), - header(1), - (2, header(2).hash()), + fn finality_proof_check_fails_when_proof_decode_fails() { + let blockchain = test_blockchain(); + + // when we can't decode proof from Vec + do_check_finality_proof::<_, _, TestJustification>( + &blockchain, 1, - proof_of_2.encode(), - ).is_err(), true); + vec![(AuthorityId::from_raw([3u8; 32]), 1u64)], + &ClosureAuthoritySetForFinalityChecker(|_, _, _| unreachable!("returns before CheckAuthoritiesProof")), + vec![42], + ).unwrap_err(); } #[test] - fn finality_proof_check_fails_when_justified_block_is_not_included() { - let mut proof_of_2: FinalityProof = prove_finality( - &test_blockchain(), - |_, _, _| Ok(vec![vec![42]]), - header(2).hash(), - ).unwrap().and_then(|p| Decode::decode(&mut &p[..])).unwrap(); - proof_of_2.finalization_path.remove(1); - - // justified block is missing from finalization_path - assert_eq!(do_check_finality_proof::( - |_| Ok(Vec::::new().encode()), - header(1), - (2, header(2).hash()), + fn finality_proof_check_fails_when_proof_is_empty() { + let blockchain = test_blockchain(); + + // when decoded proof has zero length + do_check_finality_proof::<_, _, TestJustification>( + &blockchain, 1, - proof_of_2.encode(), - ).is_err(), true); + vec![(AuthorityId::from_raw([3u8; 32]), 1u64)], + &ClosureAuthoritySetForFinalityChecker(|_, _, _| unreachable!("returns before CheckAuthoritiesProof")), + Vec::::new().encode(), + ).unwrap_err(); } #[test] - fn finality_proof_check_fails_when_justification_verification_fails() { - #[derive(Encode, Decode)] - struct InvalidFinalityProof(Vec); + fn finality_proof_check_fails_when_intemediate_fragment_has_unknown_headers() { + let blockchain = test_blockchain(); - impl ProvableJustification
for InvalidFinalityProof { - fn target_block(&self) -> (u64, H256) { (3, header(3).hash()) } + // when intermediate (#0) fragment has non-empty unknown headers + do_check_finality_proof::<_, _, TestJustification>( + &blockchain, + 1, + vec![(AuthorityId::from_raw([3u8; 32]), 1u64)], + &ClosureAuthoritySetForFinalityChecker(|_, _, _| unreachable!("returns before CheckAuthoritiesProof")), + vec![FinalityProofFragment { + block: header(4).hash(), + justification: TestJustification(true, vec![7]).encode(), + unknown_headers: vec![header(4)], + authorities_proof: Some(vec![vec![42]]), + }, FinalityProofFragment { + block: header(5).hash(), + justification: TestJustification(true, vec![8]).encode(), + unknown_headers: vec![header(5)], + authorities_proof: None, + }].encode(), + ).unwrap_err(); + } - fn verify(&self, _set_id: u64, _authorities: &VoterSet) -> ClientResult<()> { - Err(ClientError::Backend("test error".into())) - } - } + #[test] + fn finality_proof_check_fails_when_intemediate_fragment_has_no_authorities_proof() { + let blockchain = test_blockchain(); - let mut proof_of_2: FinalityProof = prove_finality( - &test_blockchain(), - |_, _, _| Ok(vec![vec![42]]), - header(2).hash(), - ).unwrap().and_then(|p| Decode::decode(&mut &p[..])).unwrap(); - proof_of_2.finalization_path.remove(1); - - // justification is not valid - assert_eq!(do_check_finality_proof::( - |_| Ok(Vec::::new().encode()), - header(1), - (2, header(2).hash()), + // when intermediate (#0) fragment has empty authorities proof + do_check_finality_proof::<_, _, TestJustification>( + &blockchain, 1, - proof_of_2.encode(), - ).is_err(), true); + vec![(AuthorityId::from_raw([3u8; 32]), 1u64)], + &ClosureAuthoritySetForFinalityChecker(|_, _, _| unreachable!("returns before CheckAuthoritiesProof")), + vec![FinalityProofFragment { + block: header(4).hash(), + justification: TestJustification(true, vec![7]).encode(), + unknown_headers: Vec::new(), + authorities_proof: None, + }, FinalityProofFragment { + block: header(5).hash(), + justification: TestJustification(true, vec![8]).encode(), + unknown_headers: vec![header(5)], + authorities_proof: None, + }].encode(), + ).unwrap_err(); } #[test] fn finality_proof_check_works() { - let proof_of_2 = prove_finality(&test_blockchain(), |_, _, _| Ok(vec![vec![42]]), header(2).hash()) - .unwrap().unwrap(); - assert_eq!(do_check_finality_proof::( - |_| Ok(vec![ - (AuthorityId([1u8; 32]), 1u64), - (AuthorityId([2u8; 32]), 2u64), - (AuthorityId([3u8; 32]), 3u64), - ].encode()), - header(1), - (2, header(2).hash()), + let blockchain = test_blockchain(); + + let effects = do_check_finality_proof::<_, _, TestJustification>( + &blockchain, 1, - proof_of_2, - ).unwrap(), vec![header(2), header(3)]); + vec![(AuthorityId::from_raw([3u8; 32]), 1u64)], + &ClosureAuthoritySetForFinalityChecker(|_, _, _| Ok(vec![(AuthorityId::from_raw([4u8; 32]), 1u64)])), + vec![FinalityProofFragment { + block: header(2).hash(), + justification: TestJustification(true, vec![7]).encode(), + unknown_headers: Vec::new(), + authorities_proof: Some(vec![vec![42]]), + }, FinalityProofFragment { + block: header(4).hash(), + justification: TestJustification(true, vec![8]).encode(), + unknown_headers: vec![header(4)], + authorities_proof: None, + }].encode(), + ).unwrap(); + assert_eq!(effects, FinalityEffects { + headers_to_import: vec![header(4)], + block: header(4).hash(), + justification: TestJustification(true, vec![8]).encode(), + new_set_id: 2, + new_authorities: vec![(AuthorityId::from_raw([4u8; 32]), 1u64)], + }); + } + + #[test] + fn finality_proof_is_none_if_first_justification_is_generated_by_unknown_set() { + // this is the case for forced change: set_id has been forcibly increased on full node + // and ligh node missed that + // => justification verification will fail on light node anyways, so we do not return + // finality proof at all + let blockchain = test_blockchain(); + let just4 = TestJustification(false, vec![4]).encode(); // false makes verification fail + blockchain.insert(header(4).hash(), header(4), Some(just4), None, NewBlockState::Final).unwrap(); + + let proof_of_4 = prove_finality::<_, _, TestJustification>( + &blockchain, + &( + |_| Ok(vec![(AuthorityId::from_raw([1u8; 32]), 1u64)]), + |_| unreachable!("should return before calling ProveAuthorities"), + ), + 0, + header(3).hash(), + header(4).hash(), + ).unwrap(); + assert!(proof_of_4.is_none()); } } diff --git a/core/finality-grandpa/src/import.rs b/core/finality-grandpa/src/import.rs index 542617fbcf0b7a7f6f6d663c1984a1d24c5d4112..227daff5527d1c8322d9ba5fc1ec6b0b633e2510 100644 --- a/core/finality-grandpa/src/import.rs +++ b/core/finality-grandpa/src/import.rs @@ -26,7 +26,7 @@ use client::blockchain::HeaderBackend; use client::backend::Backend; use client::runtime_api::ApiExt; use consensus_common::{ - BlockImport, Error as ConsensusError, ErrorKind as ConsensusErrorKind, + BlockImport, Error as ConsensusError, ImportBlock, ImportResult, JustificationImport, well_known_cache_keys, SelectChain, }; @@ -76,11 +76,8 @@ impl, RA, PRA, SC> JustificationImport { type Error = ConsensusError; - fn on_start(&self, link: &::consensus_common::import_queue::Link) { - let chain_info = match self.inner.info() { - Ok(info) => info.chain, - _ => return, - }; + fn on_start(&self, link: &mut dyn consensus_common::import_queue::Link) { + let chain_info = self.inner.info().chain; // request justifications for all pending changes for which change blocks have already been imported let authorities = self.authority_set.inner().read(); @@ -186,12 +183,12 @@ where ); match maybe_change { - Err(e) => match api.has_api_with::, _>(&at, |v| v >= 2) { - Err(e) => return Err(ConsensusErrorKind::ClientImport(e.to_string()).into()), + Err(e) => match api.has_api_with::, _>(&at, |v| v >= 2) { + Err(e) => return Err(ConsensusError::ClientImport(e.to_string()).into()), Ok(true) => { // API version is high enough to support forced changes // but got error, so it is legitimate. - return Err(ConsensusErrorKind::ClientImport(e.to_string()).into()) + return Err(ConsensusError::ClientImport(e.to_string()).into()) }, Ok(false) => { // API version isn't high enough to support forced changes @@ -216,7 +213,7 @@ where ); match maybe_change { - Err(e) => Err(ConsensusErrorKind::ClientImport(e.to_string()).into()), + Err(e) => Err(ConsensusError::ClientImport(e.to_string()).into()), Ok(Some(change)) => Ok(Some(PendingChange { next_authorities: change.next_authorities, delay: change.delay, @@ -301,12 +298,12 @@ where guard.as_mut().add_pending_change( change, &is_descendent_of, - ).map_err(|e| ConsensusError::from(ConsensusErrorKind::ClientImport(e.to_string())))?; + ).map_err(|e| ConsensusError::from(ConsensusError::ClientImport(e.to_string())))?; } let applied_changes = { let forced_change_set = guard.as_mut().apply_forced_changes(hash, number, &is_descendent_of) - .map_err(|e| ConsensusErrorKind::ClientImport(e.to_string())) + .map_err(|e| ConsensusError::ClientImport(e.to_string())) .map_err(ConsensusError::from)?; if let Some((median_last_finalized_number, new_set)) = forced_change_set { @@ -317,15 +314,17 @@ where // for the canon block the new authority set should start // with. we use the minimum between the median and the local // best finalized block. + + #[allow(deprecated)] let best_finalized_number = self.inner.backend().blockchain().info() - .map_err(|e| ConsensusErrorKind::ClientImport(e.to_string()))? .finalized_number; let canon_number = best_finalized_number.min(median_last_finalized_number); + #[allow(deprecated)] let canon_hash = self.inner.backend().blockchain().header(BlockId::Number(canon_number)) - .map_err(|e| ConsensusErrorKind::ClientImport(e.to_string()))? + .map_err(|e| ConsensusError::ClientImport(e.to_string()))? .expect("the given block number is less or equal than the current best finalized number; \ current best finalized number must exist in chain; qed.") .hash(); @@ -343,7 +342,7 @@ where AppliedChanges::Forced(new_authorities) } else { let did_standard = guard.as_mut().enacts_standard_change(hash, number, &is_descendent_of) - .map_err(|e| ConsensusErrorKind::ClientImport(e.to_string())) + .map_err(|e| ConsensusError::ClientImport(e.to_string())) .map_err(ConsensusError::from)?; if let Some(root) = did_standard { @@ -396,10 +395,11 @@ impl, RA, PRA, SC> BlockImport // early exit if block already in chain, otherwise the check for // authority changes will error when trying to re-import a change block + #[allow(deprecated)] match self.inner.backend().blockchain().status(BlockId::Hash(hash)) { Ok(blockchain::BlockStatus::InChain) => return Ok(ImportResult::AlreadyInChain), Ok(blockchain::BlockStatus::Unknown) => {}, - Err(e) => return Err(ConsensusErrorKind::ClientImport(e.to_string()).into()), + Err(e) => return Err(ConsensusError::ClientImport(e.to_string()).into()), } let pending_changes = self.make_authorities_changes(&mut block, hash)?; @@ -420,7 +420,7 @@ impl, RA, PRA, SC> BlockImport Err(e) => { debug!(target: "afg", "Restoring old authority set after block import error: {:?}", e); pending_changes.revert(); - return Err(ConsensusErrorKind::ClientImport(e.to_string()).into()); + return Err(ConsensusError::ClientImport(e.to_string()).into()); }, } }; @@ -509,7 +509,7 @@ impl, RA, PRA, SC> BlockImport } } -impl, RA, PRA, SC> +impl, RA, PRA, SC> GrandpaBlockImport { pub(crate) fn new( @@ -552,14 +552,14 @@ where enacts_change: bool, ) -> Result<(), ConsensusError> { let justification = GrandpaJustification::decode_and_verify_finalizes( - justification, + &justification, (hash, number), self.authority_set.set_id(), &self.authority_set.current_authorities(), ); let justification = match justification { - Err(e) => return Err(ConsensusErrorKind::ClientImport(e.to_string()).into()), + Err(e) => return Err(ConsensusError::ClientImport(e.to_string()).into()), Ok(justification) => justification, }; @@ -579,17 +579,17 @@ where command {}, signaling voter.", number, command); if let Err(e) = self.send_voter_commands.unbounded_send(command) { - return Err(ConsensusErrorKind::ClientImport(e.to_string()).into()); + return Err(ConsensusError::ClientImport(e.to_string()).into()); } }, Err(CommandOrError::Error(e)) => { return Err(match e { - Error::Grandpa(error) => ConsensusErrorKind::ClientImport(error.to_string()), - Error::Network(error) => ConsensusErrorKind::ClientImport(error), - Error::Blockchain(error) => ConsensusErrorKind::ClientImport(error), - Error::Client(error) => ConsensusErrorKind::ClientImport(error.to_string()), - Error::Safety(error) => ConsensusErrorKind::ClientImport(error), - Error::Timer(error) => ConsensusErrorKind::ClientImport(error.to_string()), + Error::Grandpa(error) => ConsensusError::ClientImport(error.to_string()), + Error::Network(error) => ConsensusError::ClientImport(error), + Error::Blockchain(error) => ConsensusError::ClientImport(error), + Error::Client(error) => ConsensusError::ClientImport(error.to_string()), + Error::Safety(error) => ConsensusError::ClientImport(error), + Error::Timer(error) => ConsensusError::ClientImport(error.to_string()), }.into()); }, Ok(_) => { diff --git a/core/finality-grandpa/src/justification.rs b/core/finality-grandpa/src/justification.rs index 5b55acec8524f95048d6eda99f212a7300a6c0cd..99aedbae052b1920ebb61248b5628850f0f5d4d2 100644 --- a/core/finality-grandpa/src/justification.rs +++ b/core/finality-grandpa/src/justification.rs @@ -25,13 +25,12 @@ use grandpa::voter_set::VoterSet; use grandpa::{Error as GrandpaError}; use runtime_primitives::generic::BlockId; use runtime_primitives::traits::{NumberFor, Block as BlockT, Header as HeaderT}; -use substrate_primitives::{H256, ed25519, Blake2Hasher}; +use substrate_primitives::{H256, Blake2Hasher}; +use fg_primitives::AuthorityId; use crate::{Commit, Error}; use crate::communication; -use ed25519::Public as AuthorityId; - /// A GRANDPA justification for block finality, it includes a commit message and /// an ancestry proof including all headers routing all precommit target blocks /// to the commit target block. Due to the current voting strategy the precommit @@ -72,6 +71,7 @@ impl> GrandpaJustification { loop { if current_hash == commit.target_hash { break; } + #[allow(deprecated)] match client.backend().blockchain().header(BlockId::Hash(current_hash))? { Some(current_header) => { if *current_header.number() <= commit.target_number { @@ -95,17 +95,16 @@ impl> GrandpaJustification { /// Decode a GRANDPA justification and validate the commit and the votes' /// ancestry proofs finalize the given block. pub(crate) fn decode_and_verify_finalizes( - encoded: Vec, + encoded: &[u8], finalized_target: (Block::Hash, NumberFor), set_id: u64, voters: &VoterSet, ) -> Result, ClientError> where NumberFor: grandpa::BlockNumberOps, { - let justification = GrandpaJustification::::decode(&mut &*encoded).ok_or_else(|| { - let msg = "failed to decode grandpa justification".to_string(); - ClientError::from(ClientError::BadJustification(msg)) - })?; + + let justification = GrandpaJustification::::decode(&mut &*encoded) + .ok_or(ClientError::JustificationDecode)?; if (justification.commit.target_hash, justification.commit.target_number) != finalized_target { let msg = "invalid commit target in grandpa justification".to_string(); diff --git a/core/finality-grandpa/src/lib.rs b/core/finality-grandpa/src/lib.rs index f8ee8daae2e7d5cd2a0a85a2c99216c8c982f4ae..eb0dcb38f34040f7dcf52386431da437ca50485d 100644 --- a/core/finality-grandpa/src/lib.rs +++ b/core/finality-grandpa/src/lib.rs @@ -51,16 +51,11 @@ //! number (this is num(signal) + N). When finalizing a block, we either apply //! or prune any signaled changes based on whether the signaling block is //! included in the newly-finalized chain. -#![forbid(warnings)] -#![allow(deprecated)] // FIXME #2532: remove once the refactor is done https://github.com/paritytech/substrate/issues/2532 use futures::prelude::*; use log::{debug, info, warn}; use futures::sync::mpsc; -use client::{ - BlockchainEvents, CallExecutor, Client, backend::Backend, - error::Error as ClientError, -}; +use client::{BlockchainEvents, CallExecutor, Client, backend::Backend, error::Error as ClientError}; use client::blockchain::HeaderBackend; use parity_codec::Encode; use runtime_primitives::traits::{ @@ -83,8 +78,6 @@ use std::fmt; use std::sync::Arc; use std::time::Duration; -pub use fg_primitives::ScheduledChange; - mod authorities; mod aux_schema; mod communication; @@ -93,15 +86,17 @@ mod environment; mod finality_proof; mod import; mod justification; +mod light_import; mod observer; mod until_imported; #[cfg(feature="service-integration")] mod service_integration; #[cfg(feature="service-integration")] -pub use service_integration::{LinkHalfForService, BlockImportForService}; +pub use service_integration::{LinkHalfForService, BlockImportForService, BlockImportForLightService}; pub use communication::Network; -pub use finality_proof::{prove_finality, check_finality_proof}; +pub use finality_proof::FinalityProofProvider; +pub use light_import::light_block_import; pub use observer::run_grandpa_observer; use aux_schema::PersistentData; @@ -110,8 +105,10 @@ use import::GrandpaBlockImport; use until_imported::UntilCommitBlocksImported; use communication::NetworkBridge; use service::TelemetryOnConnect; +use fg_primitives::AuthoritySignature; -use ed25519::{Public as AuthorityId, Signature as AuthoritySignature}; +// Re-export these two because it's just so damn convenient. +pub use fg_primitives::{AuthorityId, ScheduledChange}; #[cfg(test)] mod tests; @@ -167,7 +164,7 @@ pub struct Config { /// Justification generation period (in blocks). GRANDPA will try to generate justifications /// at least every justification_period blocks. There are some other events which might cause /// justification generation. - pub justification_period: u64, + pub justification_period: u32, /// The local signing key. pub local_key: Option>, /// Some local identifier of the voter. @@ -312,7 +309,7 @@ pub struct LinkHalf, RA, SC> { pub fn block_import, RA, PRA, SC>( client: Arc>, api: Arc, - select_chain: SC + select_chain: SC, ) -> Result<( GrandpaBlockImport, LinkHalf @@ -327,10 +324,11 @@ where { use runtime_primitives::traits::Zero; - let chain_info = client.info()?; + let chain_info = client.info(); let genesis_hash = chain_info.chain.genesis_hash; let persistent_data = aux_schema::load_persistent( + #[allow(deprecated)] &**client.backend(), genesis_hash, >::zero(), @@ -440,18 +438,17 @@ fn register_finality_tracker_inherent_data_provider Err(std::borrow::Cow::Owned(e.to_string())), - Ok(info) => { - telemetry!(CONSENSUS_INFO; "afg.finalized"; - "finalized_number" => ?info.finalized_number, - "finalized_hash" => ?info.finalized_hash, - ); - Ok(info.finalized_number) - }, + #[allow(deprecated)] + { + let info = client.backend().blockchain().info(); + telemetry!(CONSENSUS_INFO; "afg.finalized"; + "finalized_number" => ?info.finalized_number, + "finalized_hash" => ?info.finalized_hash, + ); + Ok(info.finalized_number) } })) - .map_err(|err| consensus_common::ErrorKind::InherentData(err.into()).into()) + .map_err(|err| consensus_common::Error::InherentData(err.into())) } else { Ok(()) } @@ -500,16 +497,22 @@ pub fn run_grandpa_voter, N, RA, SC, X>( use futures::future::{self, Loop as FutureLoop}; - let (network, network_startup) = NetworkBridge::new(network, config.clone(), on_exit.clone()); - let LinkHalf { client, select_chain, persistent_data, voter_commands_rx, } = link; + let PersistentData { authority_set, set_state, consensus_changes } = persistent_data; + let (network, network_startup) = NetworkBridge::new( + network, + config.clone(), + Some(&set_state.read()), + on_exit.clone(), + ); + register_finality_tracker_inherent_data_provider(client.clone(), &inherent_data_providers)?; if let Some(telemetry_on_connect) = telemetry_on_connect { @@ -582,10 +585,7 @@ pub fn run_grandpa_voter, N, RA, SC, X>( let mut maybe_voter = match &*env.voter_set_state.read() { VoterSetState::Live { completed_rounds, .. } => { - let chain_info = match client.info() { - Ok(i) => i, - Err(e) => return future::Either::B(future::err(Error::Client(e))), - }; + let chain_info = client.info(); let last_finalized = ( chain_info.chain.finalized_hash, @@ -648,15 +648,20 @@ pub fn run_grandpa_voter, N, RA, SC, X>( let set_state = VoterSetState::Live { // always start at round 0 when changing sets. - completed_rounds: CompletedRounds::new(CompletedRound { - number: 0, - state: genesis_state, - base: (new.canon_hash, new.canon_number), - votes: HistoricalVotes::::new(), - }), + completed_rounds: CompletedRounds::new( + CompletedRound { + number: 0, + state: genesis_state, + base: (new.canon_hash, new.canon_number), + votes: HistoricalVotes::new(), + }, + new.set_id, + &*authority_set.inner().read(), + ), current_round: HasVoted::No, }; + #[allow(deprecated)] aux_schema::write_voter_set_state(&**client.backend(), &set_state)?; let set_state: SharedVoterSetState<_> = set_state.into(); @@ -682,6 +687,8 @@ pub fn run_grandpa_voter, N, RA, SC, X>( env.update_voter_set_state(|voter_set_state| { let completed_rounds = voter_set_state.completed_rounds(); let set_state = VoterSetState::Paused { completed_rounds }; + + #[allow(deprecated)] aux_schema::write_voter_set_state(&**client.backend(), &set_state)?; Ok(Some(set_state)) })?; @@ -691,7 +698,7 @@ pub fn run_grandpa_voter, N, RA, SC, X>( } }; - future::Either::A(poll_voter.select2(voter_commands_rx).then(move |res| match res { + poll_voter.select2(voter_commands_rx).then(move |res| match res { Ok(future::Either::A(((), _))) => { // voters don't conclude naturally; this could reasonably be an error. Ok(FutureLoop::Break(())) @@ -716,7 +723,7 @@ pub fn run_grandpa_voter, N, RA, SC, X>( // some command issued internally. handle_voter_command(command, voter_commands_rx) }, - })) + }) }); let voter_work = voter_work diff --git a/core/finality-grandpa/src/light_import.rs b/core/finality-grandpa/src/light_import.rs new file mode 100644 index 0000000000000000000000000000000000000000..25a3f84f6dc01c4bd5a88eda8a5013d6b528e3f9 --- /dev/null +++ b/core/finality-grandpa/src/light_import.rs @@ -0,0 +1,732 @@ +// Copyright 2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +use std::collections::HashMap; +use std::sync::Arc; +use log::{info, trace, warn}; +use parking_lot::RwLock; + +use client::{ + CallExecutor, Client, + backend::{AuxStore, Backend}, + blockchain::HeaderBackend, + error::Error as ClientError, +}; +use parity_codec::{Encode, Decode}; +use consensus_common::{ + import_queue::{Verifier, SharedFinalityProofRequestBuilder}, well_known_cache_keys, + BlockOrigin, BlockImport, FinalityProofImport, ImportBlock, ImportResult, ImportedAux, + Error as ConsensusError, FinalityProofRequestBuilder, +}; +use runtime_primitives::Justification; +use runtime_primitives::traits::{ + NumberFor, Block as BlockT, Header as HeaderT, ProvideRuntimeApi, DigestFor, +}; +use fg_primitives::{GrandpaApi, AuthorityId}; +use runtime_primitives::generic::BlockId; +use substrate_primitives::{H256, Blake2Hasher}; + +use crate::aux_schema::load_decode; +use crate::consensus_changes::ConsensusChanges; +use crate::environment::canonical_at_height; +use crate::finality_proof::{AuthoritySetForFinalityChecker, ProvableJustification, make_finality_proof_request}; +use crate::justification::GrandpaJustification; + +/// LightAuthoritySet is saved under this key in aux storage. +const LIGHT_AUTHORITY_SET_KEY: &[u8] = b"grandpa_voters"; +/// ConsensusChanges is saver under this key in aux storage. +const LIGHT_CONSENSUS_CHANGES_KEY: &[u8] = b"grandpa_consensus_changes"; + +/// Create light block importer. +pub fn light_block_import, RA, PRA>( + client: Arc>, + authority_set_provider: Arc>, + api: Arc, +) -> Result, ClientError> + where + B: Backend + 'static, + E: CallExecutor + 'static + Clone + Send + Sync, + RA: Send + Sync, + PRA: ProvideRuntimeApi, + PRA::Api: GrandpaApi, +{ + let info = client.info(); + #[allow(deprecated)] + let import_data = load_aux_import_data(info.chain.finalized_hash, &**client.backend(), api)?; + Ok(GrandpaLightBlockImport { + client, + authority_set_provider, + data: Arc::new(RwLock::new(import_data)), + }) +} + +/// A light block-import handler for GRANDPA. +/// +/// It is responsible for: +/// - checking GRANDPA justifications; +/// - fetching finality proofs for blocks that are enacting consensus changes. +pub struct GrandpaLightBlockImport, RA> { + client: Arc>, + authority_set_provider: Arc>, + data: Arc>>, +} + +/// Mutable data of light block importer. +struct LightImportData> { + last_finalized: Block::Hash, + authority_set: LightAuthoritySet, + consensus_changes: ConsensusChanges>, +} + +/// Latest authority set tracker. +#[derive(Debug, Encode, Decode)] +struct LightAuthoritySet { + set_id: u64, + authorities: Vec<(AuthorityId, u64)>, +} + +impl, RA> GrandpaLightBlockImport { + /// Create finality proof request builder. + pub fn create_finality_proof_request_builder(&self) -> SharedFinalityProofRequestBuilder { + Arc::new(GrandpaFinalityProofRequestBuilder(self.data.clone())) as _ + } +} + +impl, RA> BlockImport + for GrandpaLightBlockImport where + NumberFor: grandpa::BlockNumberOps, + B: Backend + 'static, + E: CallExecutor + 'static + Clone + Send + Sync, + DigestFor: Encode, + RA: Send + Sync, +{ + type Error = ConsensusError; + + fn import_block( + &self, + block: ImportBlock, + new_cache: HashMap>, + ) -> Result { + do_import_block::<_, _, _, _, GrandpaJustification>( + &*self.client, &mut *self.data.write(), block, new_cache + ) + } + + fn check_block( + &self, + hash: Block::Hash, + parent_hash: Block::Hash, + ) -> Result { + self.client.check_block(hash, parent_hash) + } +} + +impl, RA> FinalityProofImport + for GrandpaLightBlockImport where + NumberFor: grandpa::BlockNumberOps, + B: Backend + 'static, + E: CallExecutor + 'static + Clone + Send + Sync, + DigestFor: Encode, + RA: Send + Sync, +{ + type Error = ConsensusError; + + fn on_start(&self, link: &mut dyn consensus_common::import_queue::Link) { + let chain_info = self.client.info().chain; + + let data = self.data.read(); + for (pending_number, pending_hash) in data.consensus_changes.pending_changes() { + if *pending_number > chain_info.finalized_number && *pending_number <= chain_info.best_number { + link.request_finality_proof(pending_hash, *pending_number); + } + } + } + + fn import_finality_proof( + &self, + hash: Block::Hash, + number: NumberFor, + finality_proof: Vec, + verifier: &dyn Verifier, + ) -> Result<(Block::Hash, NumberFor), Self::Error> { + do_import_finality_proof::<_, _, _, _, GrandpaJustification>( + &*self.client, + &*self.authority_set_provider, + &mut *self.data.write(), + hash, + number, + finality_proof, + verifier, + ) + } +} + +impl LightAuthoritySet { + /// Get a genesis set with given authorities. + pub fn genesis(initial: Vec<(AuthorityId, u64)>) -> Self { + LightAuthoritySet { + set_id: 0, + authorities: initial, + } + } + + /// Get latest set id. + pub fn set_id(&self) -> u64 { + self.set_id + } + + /// Get latest authorities set. + pub fn authorities(&self) -> Vec<(AuthorityId, u64)> { + self.authorities.clone() + } + + /// Set new authorities set. + pub fn update(&mut self, set_id: u64, authorities: Vec<(AuthorityId, u64)>) { + self.set_id = set_id; + std::mem::replace(&mut self.authorities, authorities); + } +} + +struct GrandpaFinalityProofRequestBuilder>(Arc>>); + +impl> FinalityProofRequestBuilder for GrandpaFinalityProofRequestBuilder { + fn build_request_data(&self, _hash: &B::Hash) -> Vec { + let data = self.0.read(); + make_finality_proof_request( + data.last_finalized, + data.authority_set.set_id(), + ) + } +} + +/// Try to import new block. +fn do_import_block, RA, J>( + client: &Client, + data: &mut LightImportData, + mut block: ImportBlock, + new_cache: HashMap>, +) -> Result + where + B: Backend + 'static, + E: CallExecutor + 'static + Clone + Send + Sync, + RA: Send + Sync, + NumberFor: grandpa::BlockNumberOps, + DigestFor: Encode, + J: ProvableJustification, +{ + let hash = block.post_header().hash(); + let number = block.header.number().clone(); + + // we don't want to finalize on `inner.import_block` + let justification = block.justification.take(); + let enacts_consensus_change = !new_cache.is_empty(); + let import_result = client.import_block(block, new_cache); + + let mut imported_aux = match import_result { + Ok(ImportResult::Imported(aux)) => aux, + Ok(r) => return Ok(r), + Err(e) => return Err(ConsensusError::ClientImport(e.to_string()).into()), + }; + + match justification { + Some(justification) => { + trace!( + target: "finality", + "Imported block {}{}. Importing justification.", + if enacts_consensus_change { " which enacts consensus changes" } else { "" }, + hash, + ); + + do_import_justification::<_, _, _, _, J>(client, data, hash, number, justification) + }, + None if enacts_consensus_change => { + trace!( + target: "finality", + "Imported block {} which enacts consensus changes. Requesting finality proof.", + hash, + ); + + // remember that we need finality proof for this block + imported_aux.needs_finality_proof = true; + data.consensus_changes.note_change((number, hash)); + Ok(ImportResult::Imported(imported_aux)) + }, + None => Ok(ImportResult::Imported(imported_aux)), + } +} + +/// Try to import finality proof. +fn do_import_finality_proof, RA, J>( + client: &Client, + authority_set_provider: &dyn AuthoritySetForFinalityChecker, + data: &mut LightImportData, + _hash: Block::Hash, + _number: NumberFor, + finality_proof: Vec, + verifier: &dyn Verifier, +) -> Result<(Block::Hash, NumberFor), ConsensusError> + where + B: Backend + 'static, + E: CallExecutor + 'static + Clone + Send + Sync, + RA: Send + Sync, + DigestFor: Encode, + NumberFor: grandpa::BlockNumberOps, + J: ProvableJustification, +{ + let authority_set_id = data.authority_set.set_id(); + let authorities = data.authority_set.authorities(); + let finality_effects = crate::finality_proof::check_finality_proof( + #[allow(deprecated)] + &*client.backend().blockchain(), + authority_set_id, + authorities, + authority_set_provider, + finality_proof, + ).map_err(|e| ConsensusError::ClientImport(e.to_string()))?; + + // try to import all new headers + let block_origin = BlockOrigin::NetworkBroadcast; + for header_to_import in finality_effects.headers_to_import { + let (block_to_import, new_authorities) = verifier.verify(block_origin, header_to_import, None, None) + .map_err(|e| ConsensusError::ClientImport(e))?; + assert!(block_to_import.justification.is_none(), "We have passed None as justification to verifier.verify"); + + let mut cache = HashMap::new(); + if let Some(authorities) = new_authorities { + cache.insert(well_known_cache_keys::AUTHORITIES, authorities.encode()); + } + do_import_block::<_, _, _, _, J>(client, data, block_to_import, cache)?; + } + + // try to import latest justification + let finalized_block_hash = finality_effects.block; + #[allow(deprecated)] + let finalized_block_number = client.backend().blockchain() + .expect_block_number_from_id(&BlockId::Hash(finality_effects.block)) + .map_err(|e| ConsensusError::ClientImport(e.to_string()))?; + do_finalize_block( + client, + data, + finalized_block_hash, + finalized_block_number, + finality_effects.justification.encode(), + )?; + + // apply new authorities set + data.authority_set.update( + finality_effects.new_set_id, + finality_effects.new_authorities, + ); + + Ok((finalized_block_hash, finalized_block_number)) +} + +/// Try to import justification. +fn do_import_justification, RA, J>( + client: &Client, + data: &mut LightImportData, + hash: Block::Hash, + number: NumberFor, + justification: Justification, +) -> Result + where + B: Backend + 'static, + E: CallExecutor + 'static + Clone + Send + Sync, + RA: Send + Sync, + NumberFor: grandpa::BlockNumberOps, + J: ProvableJustification, +{ + // with justification, we have two cases + // + // optimistic: the same GRANDPA authorities set has generated intermediate justification + // => justification is verified using current authorities set + we could proceed further + // + // pessimistic scenario: the GRANDPA authorities set has changed + // => we need to fetch new authorities set (i.e. finality proof) from remote node + + // first, try to behave optimistically + let authority_set_id = data.authority_set.set_id(); + let justification = J::decode_and_verify( + &justification, + authority_set_id, + &data.authority_set.authorities(), + ); + + // BadJustification error means that justification has been successfully decoded, but + // it isn't valid within current authority set + let justification = match justification { + Err(ClientError::BadJustification(_)) => { + trace!( + target: "finality", + "Justification for {} is not valid within current authorities set. Requesting finality proof.", + hash, + ); + + let mut imported_aux = ImportedAux::default(); + imported_aux.needs_finality_proof = true; + return Ok(ImportResult::Imported(imported_aux)); + }, + Err(e) => { + trace!( + target: "finality", + "Justification for {} is not valid. Bailing.", + hash, + ); + + return Err(ConsensusError::ClientImport(e.to_string()).into()); + }, + Ok(justification) => { + trace!( + target: "finality", + "Justification for {} is valid. Finalizing the block.", + hash, + ); + + justification + }, + }; + + // finalize the block + do_finalize_block(client, data, hash, number, justification.encode()) +} + +/// Finalize the block. +fn do_finalize_block, RA>( + client: &Client, + data: &mut LightImportData, + hash: Block::Hash, + number: NumberFor, + justification: Justification, +) -> Result + where + B: Backend + 'static, + E: CallExecutor + 'static + Clone + Send + Sync, + RA: Send + Sync, + NumberFor: grandpa::BlockNumberOps, +{ + // finalize the block + client.finalize_block(BlockId::Hash(hash), Some(justification), true).map_err(|e| { + warn!(target: "finality", "Error applying finality to block {:?}: {:?}", (hash, number), e); + ConsensusError::ClientImport(e.to_string()) + })?; + + // forget obsoleted consensus changes + let consensus_finalization_res = data.consensus_changes + .finalize((number, hash), |at_height| canonical_at_height(&client, (hash, number), true, at_height)); + match consensus_finalization_res { + Ok((true, _)) => require_insert_aux( + &client, + LIGHT_CONSENSUS_CHANGES_KEY, + &data.consensus_changes, + "consensus changes", + )?, + Ok(_) => (), + Err(error) => return Err(on_post_finalization_error(error, "consensus changes")), + } + + // update last finalized block reference + data.last_finalized = hash; + + Ok(ImportResult::imported()) +} + +/// Load light import aux data from the store. +fn load_aux_import_data, PRA>( + last_finalized: Block::Hash, + aux_store: &B, + api: Arc, +) -> Result, ClientError> + where + B: AuxStore, + PRA: ProvideRuntimeApi, + PRA::Api: GrandpaApi, +{ + use runtime_primitives::traits::Zero; + let authority_set = match load_decode(aux_store, LIGHT_AUTHORITY_SET_KEY)? { + Some(authority_set) => authority_set, + None => { + info!(target: "afg", "Loading GRANDPA authorities \ + from genesis on what appears to be first startup."); + + // no authority set on disk: fetch authorities from genesis state + let genesis_authorities = api.runtime_api().grandpa_authorities(&BlockId::number(Zero::zero()))?; + + let authority_set = LightAuthoritySet::genesis(genesis_authorities); + let encoded = authority_set.encode(); + aux_store.insert_aux(&[(LIGHT_AUTHORITY_SET_KEY, &encoded[..])], &[])?; + + authority_set + }, + }; + + let consensus_changes = match load_decode(aux_store, LIGHT_CONSENSUS_CHANGES_KEY)? { + Some(consensus_changes) => consensus_changes, + None => { + let consensus_changes = ConsensusChanges::>::empty(); + + let encoded = authority_set.encode(); + aux_store.insert_aux(&[(LIGHT_CONSENSUS_CHANGES_KEY, &encoded[..])], &[])?; + + consensus_changes + }, + }; + + Ok(LightImportData { + last_finalized, + authority_set, + consensus_changes, + }) +} + +/// Insert into aux store. If failed, return error && show inconsistency warning. +fn require_insert_aux, RA>( + client: &Client, + key: &[u8], + value: &T, + value_type: &str, +) -> Result<(), ConsensusError> + where + B: Backend + 'static, + E: CallExecutor + 'static + Clone + Send + Sync, +{ + #[allow(deprecated)] + let backend = &**client.backend(); + let encoded = value.encode(); + let update_res = Backend::insert_aux(backend, &[(key, &encoded[..])], &[]); + if let Err(error) = update_res { + return Err(on_post_finalization_error(error, value_type)); + } + + Ok(()) +} + +/// Display inconsistency warning. +fn on_post_finalization_error(error: ClientError, value_type: &str) -> ConsensusError { + warn!(target: "finality", "Failed to write updated {} to disk. Bailing.", value_type); + warn!(target: "finality", "Node is in a potentially inconsistent state."); + ConsensusError::ClientImport(error.to_string()) +} + +#[cfg(test)] +pub mod tests { + use super::*; + use consensus_common::ForkChoiceStrategy; + use substrate_primitives::H256; + use test_client::client::in_mem::Blockchain as InMemoryAuxStore; + use test_client::runtime::{Block, Header}; + use crate::tests::TestApi; + use crate::finality_proof::tests::TestJustification; + + pub struct NoJustificationsImport, RA>( + pub GrandpaLightBlockImport + ); + + impl, RA> BlockImport + for NoJustificationsImport where + NumberFor: grandpa::BlockNumberOps, + B: Backend + 'static, + E: CallExecutor + 'static + Clone + Send + Sync, + DigestFor: Encode, + RA: Send + Sync, + { + type Error = ConsensusError; + + fn import_block( + &self, + mut block: ImportBlock, + new_cache: HashMap>, + ) -> Result { + block.justification.take(); + self.0.import_block(block, new_cache) + } + + fn check_block( + &self, + hash: Block::Hash, + parent_hash: Block::Hash, + ) -> Result { + self.0.check_block(hash, parent_hash) + } + } + + impl, RA> FinalityProofImport + for NoJustificationsImport where + NumberFor: grandpa::BlockNumberOps, + B: Backend + 'static, + E: CallExecutor + 'static + Clone + Send + Sync, + DigestFor: Encode, + RA: Send + Sync, + { + type Error = ConsensusError; + + fn on_start(&self, link: &mut dyn consensus_common::import_queue::Link) { + self.0.on_start(link) + } + + fn import_finality_proof( + &self, + hash: Block::Hash, + number: NumberFor, + finality_proof: Vec, + verifier: &dyn Verifier, + ) -> Result<(Block::Hash, NumberFor), Self::Error> { + self.0.import_finality_proof(hash, number, finality_proof, verifier) + } + } + + /// Creates light block import that ignores justifications that came outside of finality proofs. + pub fn light_block_import_without_justifications, RA, PRA>( + client: Arc>, + authority_set_provider: Arc>, + api: Arc, + ) -> Result, ClientError> + where + B: Backend + 'static, + E: CallExecutor + 'static + Clone + Send + Sync, + RA: Send + Sync, + PRA: ProvideRuntimeApi, + PRA::Api: GrandpaApi, + { + light_block_import(client, authority_set_provider, api).map(NoJustificationsImport) + } + + fn import_block( + new_cache: HashMap>, + justification: Option, + ) -> ImportResult { + let client = test_client::new_light(); + let mut import_data = LightImportData { + last_finalized: Default::default(), + authority_set: LightAuthoritySet::genesis(vec![(AuthorityId::from_raw([1; 32]), 1)]), + consensus_changes: ConsensusChanges::empty(), + }; + let block = ImportBlock { + origin: BlockOrigin::Own, + header: Header { + number: 1, + parent_hash: client.info().chain.best_hash, + state_root: Default::default(), + digest: Default::default(), + extrinsics_root: Default::default(), + }, + justification, + post_digests: Vec::new(), + body: None, + finalized: false, + auxiliary: Vec::new(), + fork_choice: ForkChoiceStrategy::LongestChain, + }; + do_import_block::<_, _, _, _, TestJustification>( + &client, + &mut import_data, + block, + new_cache, + ).unwrap() + } + + #[test] + fn finality_proof_not_required_when_consensus_data_does_not_changes_and_no_justification_provided() { + assert_eq!(import_block(HashMap::new(), None), ImportResult::Imported(ImportedAux { + clear_justification_requests: false, + needs_justification: false, + bad_justification: false, + needs_finality_proof: false, + })); + } + + #[test] + fn finality_proof_not_required_when_consensus_data_does_not_changes_and_correct_justification_provided() { + let justification = TestJustification(true, Vec::new()).encode(); + assert_eq!(import_block(HashMap::new(), Some(justification)), ImportResult::Imported(ImportedAux { + clear_justification_requests: false, + needs_justification: false, + bad_justification: false, + needs_finality_proof: false, + })); + } + + #[test] + fn finality_proof_required_when_consensus_data_changes_and_no_justification_provided() { + let mut cache = HashMap::new(); + cache.insert(well_known_cache_keys::AUTHORITIES, vec![AuthorityId::from_raw([2; 32])].encode()); + assert_eq!(import_block(cache, None), ImportResult::Imported(ImportedAux { + clear_justification_requests: false, + needs_justification: false, + bad_justification: false, + needs_finality_proof: true, + })); + } + + #[test] + fn finality_proof_required_when_consensus_data_changes_and_incorrect_justification_provided() { + let justification = TestJustification(false, Vec::new()).encode(); + let mut cache = HashMap::new(); + cache.insert(well_known_cache_keys::AUTHORITIES, vec![AuthorityId::from_raw([2; 32])].encode()); + assert_eq!( + import_block(cache, Some(justification)), + ImportResult::Imported(ImportedAux { + clear_justification_requests: false, + needs_justification: false, + bad_justification: false, + needs_finality_proof: true, + }, + )); + } + + + #[test] + fn aux_data_updated_on_start() { + let aux_store = InMemoryAuxStore::::new(); + let api = Arc::new(TestApi::new(vec![(AuthorityId::from_raw([1; 32]), 1)])); + + // when aux store is empty initially + assert!(aux_store.get_aux(LIGHT_AUTHORITY_SET_KEY).unwrap().is_none()); + assert!(aux_store.get_aux(LIGHT_CONSENSUS_CHANGES_KEY).unwrap().is_none()); + + // it is updated on importer start + load_aux_import_data(Default::default(), &aux_store, api).unwrap(); + assert!(aux_store.get_aux(LIGHT_AUTHORITY_SET_KEY).unwrap().is_some()); + assert!(aux_store.get_aux(LIGHT_CONSENSUS_CHANGES_KEY).unwrap().is_some()); + } + + #[test] + fn aux_data_loaded_on_restart() { + let aux_store = InMemoryAuxStore::::new(); + let api = Arc::new(TestApi::new(vec![(AuthorityId::from_raw([1; 32]), 1)])); + + // when aux store is non-empty initially + let mut consensus_changes = ConsensusChanges::::empty(); + consensus_changes.note_change((42, Default::default())); + aux_store.insert_aux( + &[ + ( + LIGHT_AUTHORITY_SET_KEY, + LightAuthoritySet::genesis(vec![(AuthorityId::from_raw([42; 32]), 2)]).encode().as_slice(), + ), + ( + LIGHT_CONSENSUS_CHANGES_KEY, + consensus_changes.encode().as_slice(), + ), + ], + &[], + ).unwrap(); + + // importer uses it on start + let data = load_aux_import_data(Default::default(), &aux_store, api).unwrap(); + assert_eq!(data.authority_set.authorities(), vec![(AuthorityId::from_raw([42; 32]), 2)]); + assert_eq!(data.consensus_changes.pending_changes(), &[(42, Default::default())]); + } +} diff --git a/core/finality-grandpa/src/observer.rs b/core/finality-grandpa/src/observer.rs index 88a0fbbd949a840fb640dc3dd67d92c05566266c..feabf0bc620f6ea35559d77b666352ddb18e8ac5 100644 --- a/core/finality-grandpa/src/observer.rs +++ b/core/finality-grandpa/src/observer.rs @@ -28,16 +28,17 @@ use log::{debug, info, warn}; use consensus_common::SelectChain; use client::{CallExecutor, Client, backend::Backend}; use runtime_primitives::traits::{NumberFor, Block as BlockT}; -use substrate_primitives::{ed25519::Public as AuthorityId, H256, Blake2Hasher}; +use substrate_primitives::{H256, Blake2Hasher}; use crate::{ AuthoritySignature, global_communication, CommandOrError, Config, environment, - Error, LinkHalf, Network, aux_schema::PersistentData, VoterCommand, VoterSetState, + LinkHalf, Network, aux_schema::PersistentData, VoterCommand, VoterSetState, }; use crate::authorities::SharedAuthoritySet; use crate::communication::NetworkBridge; use crate::consensus_changes::SharedConsensusChanges; use crate::environment::{CompletedRound, CompletedRounds, HasVoted}; +use fg_primitives::AuthorityId; struct ObserverChain<'a, Block: BlockT, B, E, RA>(&'a Client); @@ -167,9 +168,15 @@ pub fn run_grandpa_observer, N, RA, SC>( } = link; let PersistentData { authority_set, consensus_changes, set_state } = persistent_data; - let initial_state = (authority_set, consensus_changes, set_state, voter_commands_rx.into_future()); - let (network, network_startup) = NetworkBridge::new(network, config.clone(), on_exit.clone()); + let (network, network_startup) = NetworkBridge::new( + network, + config.clone(), + None, + on_exit.clone(), + ); + + let initial_state = (authority_set, consensus_changes, set_state, voter_commands_rx.into_future()); let observer_work = future::loop_fn(initial_state, move |state| { let (authority_set, consensus_changes, set_state, voter_commands_rx) = state; @@ -186,12 +193,7 @@ pub fn run_grandpa_observer, N, RA, SC>( &network, ); - let chain_info = match client.info() { - Ok(i) => i, - Err(e) => return future::Either::B(future::err(Error::Client(e))), - }; - - let last_finalized_number = chain_info.chain.finalized_number; + let last_finalized_number = client.info().chain.finalized_number; // create observer for the current set let observer = grandpa_observer( @@ -213,6 +215,7 @@ pub fn run_grandpa_observer, N, RA, SC>( let completed_rounds = set_state.read().completed_rounds(); let set_state = VoterSetState::Paused { completed_rounds }; + #[allow(deprecated)] crate::aux_schema::write_voter_set_state(&**client.backend(), &set_state)?; set_state @@ -224,15 +227,20 @@ pub fn run_grandpa_observer, N, RA, SC>( let set_state = VoterSetState::Live:: { // always start at round 0 when changing sets. - completed_rounds: CompletedRounds::new(CompletedRound { - number: 0, - state: genesis_state, - base: (new.canon_hash, new.canon_number), - votes: HistoricalVotes::new(), - }), + completed_rounds: CompletedRounds::new( + CompletedRound { + number: 0, + state: genesis_state, + base: (new.canon_hash, new.canon_number), + votes: HistoricalVotes::new(), + }, + new.set_id, + &*authority_set.inner().read(), + ), current_round: HasVoted::No, }; + #[allow(deprecated)] crate::aux_schema::write_voter_set_state(&**client.backend(), &set_state)?; set_state @@ -243,7 +251,7 @@ pub fn run_grandpa_observer, N, RA, SC>( }; // run observer and listen to commands (switch authorities or pause) - future::Either::A(observer.select2(voter_commands_rx).then(move |res| match res { + observer.select2(voter_commands_rx).then(move |res| match res { Ok(future::Either::A((_, _))) => { // observer commit stream doesn't conclude naturally; this could reasonably be an error. Ok(FutureLoop::Break(())) @@ -268,7 +276,7 @@ pub fn run_grandpa_observer, N, RA, SC>( // some command issued internally handle_voter_command(command, voter_commands_rx) }, - })) + }) }); let observer_work = observer_work diff --git a/core/finality-grandpa/src/service_integration.rs b/core/finality-grandpa/src/service_integration.rs index 168e64183782e881140f1e1c2636dd90a343c595..9f19b9204190bdcc16f3766db3c20a400ed40331 100644 --- a/core/finality-grandpa/src/service_integration.rs +++ b/core/finality-grandpa/src/service_integration.rs @@ -17,7 +17,7 @@ /// Integrate grandpa finality with substrate service use client; -use service::{FullBackend, FullExecutor, ServiceFactory}; +use service::{FullBackend, FullExecutor, LightBackend, LightExecutor, ServiceFactory}; pub type BlockImportForService = crate::GrandpaBlockImport< FullBackend, @@ -25,12 +25,12 @@ pub type BlockImportForService = crate::GrandpaBlockImport< ::Block, ::RuntimeApi, client::Client< - FullBackend, - FullExecutor, - ::Block, - ::RuntimeApi - >, - ::SelectChain + FullBackend, + FullExecutor, + ::Block, + ::RuntimeApi + >, + ::SelectChain, >; pub type LinkHalfForService = crate::LinkHalf< @@ -40,3 +40,10 @@ pub type LinkHalfForService = crate::LinkHalf< ::RuntimeApi, ::SelectChain >; + +pub type BlockImportForLightService = crate::light_import::GrandpaLightBlockImport< + LightBackend, + LightExecutor, + ::Block, + ::RuntimeApi, +>; diff --git a/core/finality-grandpa/src/tests.rs b/core/finality-grandpa/src/tests.rs index 52b23bfcb79f272d5d0c72a8cff3ea046d4b46f7..8afa495334397894492edaefd9688a5b67e8fb09 100644 --- a/core/finality-grandpa/src/tests.rs +++ b/core/finality-grandpa/src/tests.rs @@ -25,21 +25,25 @@ use parking_lot::Mutex; use tokio::runtime::current_thread; use keyring::ed25519::{Keyring as AuthorityKeyring}; use client::{ - BlockchainEvents, error::Result, - blockchain::Backend as BlockchainBackend, + error::Result, runtime_api::{Core, RuntimeVersion, ApiExt}, LongestChain, }; use test_client::{self, runtime::BlockNumber}; use consensus_common::{BlockOrigin, ForkChoiceStrategy, ImportedAux, ImportBlock, ImportResult}; -use consensus_common::import_queue::{SharedBlockImport, SharedJustificationImport}; +use consensus_common::import_queue::{SharedBlockImport, SharedJustificationImport, SharedFinalityProofImport, + SharedFinalityProofRequestBuilder, +}; use std::collections::{HashMap, HashSet}; use std::result; +use parity_codec::Decode; use runtime_primitives::traits::{ApiRef, ProvideRuntimeApi, Header as HeaderT}; use runtime_primitives::generic::BlockId; -use substrate_primitives::{NativeOrEncoded, ExecutionContext, ed25519::Public as AuthorityId}; +use substrate_primitives::{NativeOrEncoded, ExecutionContext}; +use fg_primitives::AuthorityId; use authorities::AuthoritySet; +use finality_proof::{FinalityProofProvider, AuthoritySetForFinalityProver, AuthoritySetForFinalityChecker}; use communication::GRANDPA_ENGINE_ID; use consensus_changes::ConsensusChanges; @@ -72,7 +76,7 @@ impl GrandpaTestNet { }; let config = Self::default_config(); for _ in 0..n_peers { - net.add_peer(&config); + net.add_full_peer(&config); } net } @@ -99,27 +103,68 @@ impl TestNetFactory for GrandpaTestNet { } } - fn make_verifier(&self, _client: Arc, _cfg: &ProtocolConfig) + fn make_verifier(&self, _client: PeersClient, _cfg: &ProtocolConfig) -> Arc { Arc::new(PassThroughVerifier(false)) // use non-instant finality. } - fn make_block_import(&self, client: Arc) - -> (SharedBlockImport, Option>, PeerData) + fn make_block_import(&self, client: PeersClient) + -> ( + SharedBlockImport, + Option>, + Option>, + Option>, + PeerData, + ) { - - let select_chain = LongestChain::new( - client.backend().clone(), - client.import_lock().clone() - ); - let (import, link) = block_import( - client, - Arc::new(self.test_config.clone()), - select_chain, - ).expect("Could not create block import for fresh peer."); - let shared_import = Arc::new(import); - (shared_import.clone(), Some(shared_import), Mutex::new(Some(link))) + match client { + PeersClient::Full(ref client) => { + #[allow(deprecated)] + let select_chain = LongestChain::new( + client.backend().clone() + ); + let (import, link) = block_import( + client.clone(), + Arc::new(self.test_config.clone()), + select_chain, + ).expect("Could not create block import for fresh peer."); + let shared_import = Arc::new(import); + (shared_import.clone(), Some(shared_import), None, None, Mutex::new(Some(link))) + }, + PeersClient::Light(ref client) => { + use crate::light_import::tests::light_block_import_without_justifications; + + let authorities_provider = Arc::new(self.test_config.clone()); + // forbid direct finalization using justification that cames with the block + // => light clients will try to fetch finality proofs + let import = light_block_import_without_justifications( + client.clone(), + authorities_provider, + Arc::new(self.test_config.clone()) + ).expect("Could not create block import for fresh peer."); + let finality_proof_req_builder = import.0.create_finality_proof_request_builder(); + let shared_import = Arc::new(import); + (shared_import.clone(), None, Some(shared_import), Some(finality_proof_req_builder), Mutex::new(None)) + }, + } + } + + fn make_finality_proof_provider( + &self, + client: PeersClient + ) -> Option>> { + match client { + PeersClient::Full(ref client) => { + let authorities_provider = Arc::new(self.test_config.clone()); + Some(Arc::new(FinalityProofProvider::new(client.clone(), authorities_provider))) + }, + PeersClient::Light(_) => None, + } + } + + fn uses_tokio(&self) -> bool { + true } fn peer(&self, i: usize) -> &GrandpaPeer { @@ -159,7 +204,7 @@ impl MessageRouting { } impl Network for MessageRouting { - type In = Box + Send>; + type In = Box + Send>; /// Get a stream of messages for a specific gossip topic. fn messages_for(&self, topic: Hash) -> Self::In { @@ -212,6 +257,11 @@ impl Network for MessageRouting { }) } + fn register_gossip_message(&self, _topic: Hash, _data: Vec) { + // NOTE: only required to restore previous state on startup + // not required for tests currently + } + fn report(&self, _who: network::PeerId, _cost_benefit: i32) { } @@ -234,14 +284,14 @@ impl Future for Exit { } #[derive(Default, Clone)] -struct TestApi { +pub(crate) struct TestApi { genesis_authorities: Vec<(AuthorityId, u64)>, scheduled_changes: Arc>>>, forced_changes: Arc)>>>, } impl TestApi { - fn new(genesis_authorities: Vec<(AuthorityId, u64)>) -> Self { + pub fn new(genesis_authorities: Vec<(AuthorityId, u64)>) -> Self { TestApi { genesis_authorities, scheduled_changes: Arc::new(Mutex::new(HashMap::new())), @@ -250,7 +300,7 @@ impl TestApi { } } -struct RuntimeApi { +pub(crate) struct RuntimeApi { inner: TestApi, } @@ -292,15 +342,6 @@ impl Core for RuntimeApi { ) -> Result> { unimplemented!("Not required for testing!") } - fn Core_authorities_runtime_api_impl( - &self, - _: &BlockId, - _: ExecutionContext, - _: Option<()>, - _: Vec, - ) -> Result>> { - unimplemented!("Not required for testing!") - } } impl ApiExt for RuntimeApi { @@ -327,16 +368,12 @@ impl ApiExt for RuntimeApi { impl GrandpaApi for RuntimeApi { fn GrandpaApi_grandpa_authorities_runtime_api_impl( &self, - at: &BlockId, + _: &BlockId, _: ExecutionContext, _: Option<()>, _: Vec, ) -> Result>> { - if at == &BlockId::Number(0) { - Ok(self.inner.genesis_authorities.clone()).map(NativeOrEncoded::Native) - } else { - panic!("should generally only request genesis authorities") - } + Ok(self.inner.genesis_authorities.clone()).map(NativeOrEncoded::Native) } fn GrandpaApi_grandpa_pending_change_runtime_api_impl( @@ -375,12 +412,39 @@ impl GrandpaApi for RuntimeApi { } } +impl AuthoritySetForFinalityProver for TestApi { + fn authorities(&self, block: &BlockId) -> Result> { + let runtime_api = RuntimeApi { inner: self.clone() }; + runtime_api.GrandpaApi_grandpa_authorities_runtime_api_impl(block, ExecutionContext::Syncing, None, Vec::new()) + .map(|v| match v { + NativeOrEncoded::Native(value) => value, + _ => unreachable!("only providing native values"), + }) + } + + fn prove_authorities(&self, block: &BlockId) -> Result>> { + self.authorities(block).map(|auth| vec![auth.encode()]) + } +} + +impl AuthoritySetForFinalityChecker for TestApi { + fn check_authorities_proof( + &self, + _hash: ::Hash, + _header: ::Header, + proof: Vec>, + ) -> Result> { + Decode::decode(&mut &proof[0][..]) + .ok_or_else(|| unreachable!("incorrect value is passed as GRANDPA authorities proof")) + } +} + const TEST_GOSSIP_DURATION: Duration = Duration::from_millis(500); const TEST_ROUTING_INTERVAL: Duration = Duration::from_millis(50); fn make_ids(keys: &[AuthorityKeyring]) -> Vec<(substrate_primitives::ed25519::Public, u64)> { keys.iter() - .map(|key| AuthorityId(key.to_raw_public())) + .map(|key| AuthorityId::from_raw(key.to_raw_public())) .map(|id| (id, 1)) .collect() } @@ -393,7 +457,7 @@ fn run_to_completion_with( peers: &[AuthorityKeyring], with: F, ) -> u64 where - F: FnOnce(current_thread::Handle) -> Option>> + F: FnOnce(current_thread::Handle) -> Option>> { use parking_lot::RwLock; @@ -470,7 +534,7 @@ fn run_to_completion_with( .map(|_| ()) .map_err(|_| ()); - runtime.block_on(wait_for.select(drive_to_completion).map_err(|_| ())).unwrap(); + let _ = runtime.block_on(wait_for.select(drive_to_completion).map_err(|_| ())).unwrap(); let highest_finalized = *highest_finalized.read(); highest_finalized @@ -491,7 +555,7 @@ fn finalize_3_voters_no_observers() { net.sync(); for i in 0..3 { - assert_eq!(net.peer(i).client().info().unwrap().chain.best_number, 20, + assert_eq!(net.peer(i).client().info().chain.best_number, 20, "Peer #{} failed to sync", i); } @@ -499,7 +563,7 @@ fn finalize_3_voters_no_observers() { run_to_completion(20, net.clone(), peers); // normally there's no justification for finalized blocks - assert!(net.lock().peer(0).client().backend().blockchain().justification(BlockId::Number(20)).unwrap().is_none(), + assert!(net.lock().peer(0).client().justification(&BlockId::Number(20)).unwrap().is_none(), "Extra justification for block#1"); } @@ -564,7 +628,7 @@ fn finalize_3_voters_1_full_observer() { .map(|_| ()) .map_err(|_| ()); - runtime.block_on(wait_for.select(drive_to_completion).map_err(|_| ())).unwrap(); + let _ = runtime.block_on(wait_for.select(drive_to_completion).map_err(|_| ())).unwrap(); } #[test] @@ -602,11 +666,13 @@ fn transition_3_voters_twice_1_full_observer() { net.lock().sync(); for (i, peer) in net.lock().peers().iter().enumerate() { - assert_eq!(peer.client().info().unwrap().chain.best_number, 1, + let full_client = peer.client().as_full().expect("only full clients are used in test"); + assert_eq!(full_client.info().chain.best_number, 1, "Peer #{} failed to sync", i); let set: AuthoritySet = crate::aux_schema::load_authorities( - &**peer.client().backend() + #[allow(deprecated)] + &**full_client.backend() ).unwrap(); assert_eq!(set.current(), (0, make_ids(peers_a).as_slice())); @@ -693,8 +759,10 @@ fn transition_3_voters_twice_1_full_observer() { .take_while(|n| Ok(n.header.number() < &30)) .for_each(move |_| Ok(())) .map(move |()| { + let full_client = client.as_full().expect("only full clients are used in test"); let set: AuthoritySet = crate::aux_schema::load_authorities( - &**client.backend() + #[allow(deprecated)] + &**full_client.backend() ).unwrap(); assert_eq!(set.current(), (2, make_ids(peers_c).as_slice())); @@ -734,7 +802,7 @@ fn transition_3_voters_twice_1_full_observer() { .map(|_| ()) .map_err(|_| ()); - runtime.block_on(wait_for.select(drive_to_completion).map_err(|_| ())).unwrap(); + let _ = runtime.block_on(wait_for.select(drive_to_completion).map_err(|_| ())).unwrap(); } #[test] @@ -749,8 +817,8 @@ fn justification_is_emitted_when_consensus_data_changes() { let net = Arc::new(Mutex::new(net)); run_to_completion(1, net.clone(), peers); - // ... and check that there's no justification for block#1 - assert!(net.lock().peer(0).client().backend().blockchain().justification(BlockId::Number(1)).unwrap().is_some(), + // ... and check that there's justification for block#1 + assert!(net.lock().peer(0).client().justification(&BlockId::Number(1)).unwrap().is_some(), "Missing justification for block#1"); } @@ -769,8 +837,7 @@ fn justification_is_generated_periodically() { // when block#32 (justification_period) is finalized, justification // is required => generated for i in 0..3 { - assert!(net.lock().peer(i).client().backend().blockchain() - .justification(BlockId::Number(32)).unwrap().is_some()); + assert!(net.lock().peer(i).client().justification(&BlockId::Number(32)).unwrap().is_some()); } } @@ -822,7 +889,7 @@ fn sync_justifications_on_change_blocks() { net.sync(); for i in 0..4 { - assert_eq!(net.peer(i).client().info().unwrap().chain.best_number, 25, + assert_eq!(net.peer(i).client().info().chain.best_number, 25, "Peer #{} failed to sync", i); } @@ -893,7 +960,7 @@ fn finalizes_multiple_pending_changes_in_order() { // all peers imported both change blocks for i in 0..6 { - assert_eq!(net.peer(i).client().info().unwrap().chain.best_number, 30, + assert_eq!(net.peer(i).client().info().chain.best_number, 30, "Peer #{} failed to sync", i); } @@ -913,7 +980,7 @@ fn doesnt_vote_on_the_tip_of_the_chain() { net.sync(); for i in 0..3 { - assert_eq!(net.peer(i).client().info().unwrap().chain.best_number, 100, + assert_eq!(net.peer(i).client().info().chain.best_number, 100, "Peer #{} failed to sync", i); } @@ -943,7 +1010,7 @@ fn force_change_to_new_set() { { // add a forced transition at block 12. - let parent_hash = net.lock().peer(0).client().info().unwrap().chain.best_hash; + let parent_hash = net.lock().peer(0).client().info().chain.best_hash; forced_transitions.lock().insert(parent_hash, (0, ScheduledChange { next_authorities: voters.clone(), delay: 10, @@ -960,11 +1027,13 @@ fn force_change_to_new_set() { net.lock().sync(); for (i, peer) in net.lock().peers().iter().enumerate() { - assert_eq!(peer.client().info().unwrap().chain.best_number, 26, + assert_eq!(peer.client().info().chain.best_number, 26, "Peer #{} failed to sync", i); + let full_client = peer.client().as_full().expect("only full clients are used in test"); let set: AuthoritySet = crate::aux_schema::load_authorities( - &**peer.client().backend() + #[allow(deprecated)] + &**full_client.backend() ).unwrap(); assert_eq!(set.current(), (1, voters.as_slice())); @@ -991,7 +1060,8 @@ fn allows_reimporting_change_blocks() { let client = net.peer(0).client().clone(); let (block_import, ..) = net.make_block_import(client.clone()); - let builder = client.new_block_at(&BlockId::Number(0)).unwrap(); + let full_client = client.as_full().unwrap(); + let builder = full_client.new_block_at(&BlockId::Number(0), Default::default()).unwrap(); let block = builder.bake().unwrap(); api.scheduled_changes.lock().insert(*block.header.parent_hash(), ScheduledChange { next_authorities: make_ids(peers_b), @@ -1014,7 +1084,12 @@ fn allows_reimporting_change_blocks() { assert_eq!( block_import.import_block(block(), HashMap::new()).unwrap(), - ImportResult::Imported(ImportedAux { needs_justification: true, clear_justification_requests: false, bad_justification: false }), + ImportResult::Imported(ImportedAux { + needs_justification: true, + clear_justification_requests: false, + bad_justification: false, + needs_finality_proof: false, + }), ); assert_eq!( @@ -1034,7 +1109,8 @@ fn test_bad_justification() { let client = net.peer(0).client().clone(); let (block_import, ..) = net.make_block_import(client.clone()); - let builder = client.new_block_at(&BlockId::Number(0)).unwrap(); + let full_client = client.as_full().expect("only full clients are used in test"); + let builder = full_client.new_block_at(&BlockId::Number(0), Default::default()).unwrap(); let block = builder.bake().unwrap(); api.scheduled_changes.lock().insert(*block.header.parent_hash(), ScheduledChange { next_authorities: make_ids(peers_b), @@ -1057,7 +1133,12 @@ fn test_bad_justification() { assert_eq!( block_import.import_block(block(), HashMap::new()).unwrap(), - ImportResult::Imported(ImportedAux { needs_justification: true, clear_justification_requests: false, bad_justification: true }), + ImportResult::Imported(ImportedAux { + needs_justification: true, + clear_justification_requests: false, + bad_justification: true, + ..Default::default() + }), ); assert_eq!( @@ -1085,7 +1166,7 @@ fn voter_persists_its_votes() { net.peer(0).push_blocks(20, false); net.sync(); - assert_eq!(net.peer(0).client().info().unwrap().chain.best_number, 20, + assert_eq!(net.peer(0).client().info().chain.best_number, 20, "Peer #{} failed to sync", 0); let mut runtime = current_thread::Runtime::new().unwrap(); @@ -1102,7 +1183,7 @@ fn voter_persists_its_votes() { let net = net.clone(); let voter = future::loop_fn(voter_rx, move |rx| { - let (_block_import, _, link) = net.lock().make_block_import(client.clone()); + let (_block_import, _, _, _, link) = net.lock().make_block_import(client.clone()); let link = link.lock().take().unwrap(); let grandpa_params = GrandpaParams { @@ -1164,7 +1245,12 @@ fn voter_persists_its_votes() { name: Some(format!("peer#{}", 1)), }; let routing = MessageRouting::new(net.clone(), 1); - let (network, routing_work) = communication::NetworkBridge::new(routing, config.clone(), Exit); + let (network, routing_work) = communication::NetworkBridge::new( + routing, + config.clone(), + None, + Exit, + ); runtime.block_on(routing_work).unwrap(); let (round_rx, round_tx) = network.round_communication( @@ -1197,11 +1283,12 @@ fn voter_persists_its_votes() { net.lock().peer(0).push_blocks(20, false); net.lock().sync(); - assert_eq!(net.lock().peer(0).client().info().unwrap().chain.best_number, 40, + assert_eq!(net.lock().peer(0).client().info().chain.best_number, 40, "Peer #{} failed to sync", 0); + #[allow(deprecated)] let block_30_hash = - net.lock().peer(0).client().backend().blockchain().hash(30).unwrap().unwrap(); + net.lock().peer(0).client().as_full().unwrap().backend().blockchain().hash(30).unwrap().unwrap(); // we restart alice's voter voter_tx.unbounded_send(()).unwrap(); @@ -1273,7 +1360,7 @@ fn finalize_3_voters_1_light_observer() { net.sync(); for i in 0..4 { - assert_eq!(net.peer(i).client().info().unwrap().chain.best_number, 20, + assert_eq!(net.peer(i).client().info().chain.best_number, 20, "Peer #{} failed to sync", i); } @@ -1302,3 +1389,94 @@ fn finalize_3_voters_1_light_observer() { Some(Box::new(finality_notifications.map(|_| ()))) }); } + +#[test] +fn finality_proof_is_fetched_by_light_client_when_consensus_data_changes() { + let _ = ::env_logger::try_init(); + + let peers = &[AuthorityKeyring::Alice]; + let mut net = GrandpaTestNet::new(TestApi::new(make_ids(peers)), 1); + net.add_light_peer(&GrandpaTestNet::default_config()); + + // import block#1 WITH consensus data change. Light client ignores justification + // && instead fetches finality proof for block #1 + net.peer(0).push_authorities_change_block(vec![substrate_primitives::sr25519::Public::from_raw([42; 32])]); + let net = Arc::new(Mutex::new(net)); + run_to_completion(1, net.clone(), peers); + net.lock().sync_without_disconnects(); + + // check that the block#1 is finalized on light client + while net.lock().peer(1).client().info().chain.finalized_number != 1 { + net.lock().tick_peer(1); + net.lock().sync_without_disconnects(); + } +} + +#[test] +fn empty_finality_proof_is_returned_to_light_client_when_authority_set_is_different() { + // for debug: to ensure that without forced change light client will sync finality proof + const FORCE_CHANGE: bool = true; + + let _ = ::env_logger::try_init(); + + // two of these guys are offline. + let genesis_authorities = if FORCE_CHANGE { + vec![ + AuthorityKeyring::Alice, + AuthorityKeyring::Bob, + AuthorityKeyring::Charlie, + AuthorityKeyring::One, + AuthorityKeyring::Two, + ] + } else { + vec![ + AuthorityKeyring::Alice, + AuthorityKeyring::Bob, + AuthorityKeyring::Charlie, + ] + }; + let peers_a = &[AuthorityKeyring::Alice, AuthorityKeyring::Bob, AuthorityKeyring::Charlie]; + let api = TestApi::new(make_ids(&genesis_authorities)); + + let voters = make_ids(peers_a); + let forced_transitions = api.forced_changes.clone(); + let net = GrandpaTestNet::new(api, 3); + let net = Arc::new(Mutex::new(net)); + + let runner_net = net.clone(); + let add_blocks = move |_| { + net.lock().peer(0).push_blocks(1, false); // best is #1 + + // add a forced transition at block 5. + if FORCE_CHANGE { + let parent_hash = net.lock().peer(0).client().info().chain.best_hash; + forced_transitions.lock().insert(parent_hash, (0, ScheduledChange { + next_authorities: voters.clone(), + delay: 3, + })); + } + + // ensure block#10 enacts authorities set change => justification is generated + // normally it will reach light client, but because of the forced change, it will not + net.lock().peer(0).push_blocks(8, false); // best is #9 + net.lock().peer(0).push_authorities_change_block( + vec![substrate_primitives::sr25519::Public::from_raw([42; 32])] + ); // #10 + net.lock().peer(0).push_blocks(1, false); // best is #11 + net.lock().sync_without_disconnects(); + + None + }; + + // finalize block #11 on full clients + run_to_completion_with(11, runner_net.clone(), peers_a, add_blocks); + // request finalization by light client + runner_net.lock().add_light_peer(&GrandpaTestNet::default_config()); + runner_net.lock().sync_without_disconnects(); + + // check block, finalized on light client + assert_eq!( + runner_net.lock().peer(3).client().info().chain.finalized_number, + if FORCE_CHANGE { 0 } else { 10 }, + ); +} diff --git a/core/finality-grandpa/src/until_imported.rs b/core/finality-grandpa/src/until_imported.rs index 2efb827d378d07a1e7cd12d1f1c4db80d7b8635d..7c981050dd4aea6a850f05636077fad2bd3c5361 100644 --- a/core/finality-grandpa/src/until_imported.rs +++ b/core/finality-grandpa/src/until_imported.rs @@ -28,12 +28,12 @@ use futures::prelude::*; use futures::stream::Fuse; use parking_lot::Mutex; use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, NumberFor}; -use substrate_primitives::ed25519::Public as AuthorityId; use tokio::timer::Interval; use std::collections::{HashMap, VecDeque}; use std::sync::{atomic::{AtomicUsize, Ordering}, Arc}; use std::time::{Duration, Instant}; +use fg_primitives::AuthorityId; const LOG_PENDING_INTERVAL: Duration = Duration::from_secs(15); diff --git a/core/inherents/Cargo.toml b/core/inherents/Cargo.toml index a71661bd1d2b020ac8c2c944556a80b035b75097..606d9c5ae97ba83ade7a633fd7a0f4bf1e3e08a7 100644 --- a/core/inherents/Cargo.toml +++ b/core/inherents/Cargo.toml @@ -5,7 +5,7 @@ authors = ["Parity Technologies "] edition = "2018" [dependencies] -parking_lot = { version = "0.7", optional = true } +parking_lot = { version = "0.8.0", optional = true } rstd = { package = "sr-std", path = "../sr-std", default-features = false } parity-codec = { version = "3.3", default-features = false, features = ["derive"] } runtime_primitives = { package = "sr-primitives", path = "../sr-primitives", default-features = false } diff --git a/core/inherents/src/lib.rs b/core/inherents/src/lib.rs index 87fa39fe06e6cc8aed7eb502fc736d0e8c274aca..7b99c7ba526b24d2ba292a64dec2cb37556ffe48 100644 --- a/core/inherents/src/lib.rs +++ b/core/inherents/src/lib.rs @@ -44,16 +44,13 @@ use parking_lot::RwLock; #[cfg(feature = "std")] use std::{sync::Arc, format}; -#[cfg(feature = "std")] -pub mod pool; - pub use runtime_primitives::RuntimeString; /// An identifier for an inherent. pub type InherentIdentifier = [u8; 8]; /// Inherent data to include in a block. -#[derive(Clone, Default)] +#[derive(Clone, Default, Encode, Decode)] pub struct InherentData { /// All inherent data encoded with parity-codec and an identifier. data: BTreeMap> @@ -69,7 +66,7 @@ impl InherentData { /// /// # Return /// - /// Returns `Ok(())` if the data could be inserted an no data for an inherent with the same + /// Returns `Ok(())` if the data could be inserted and no data for an inherent with the same /// identifier existed, otherwise an error is returned. /// /// Inherent identifiers need to be unique, otherwise decoding of these values will not work! @@ -123,33 +120,6 @@ impl InherentData { } } -impl codec::Encode for InherentData { - fn encode(&self) -> Vec { - let keys = self.data.keys().collect::>(); - let values = self.data.values().collect::>(); - - let mut encoded = keys.encode(); - encoded.extend(values.encode()); - encoded - } -} - -impl codec::Decode for InherentData { - fn decode(value: &mut I) -> Option { - Vec::::decode(value) - .and_then(|i| Vec::>::decode(value).map(|v| (i, v))) - .and_then(|(i, v)| { - if i.len() == v.len() { - Some(Self { - data: i.into_iter().zip(v.into_iter()).collect() - }) - } else { - None - } - }) - } -} - /// The result of checking inherents. /// /// It either returns okay for all checks, stores all occurred errors or just one fatal error. diff --git a/core/inherents/src/pool.rs b/core/inherents/src/pool.rs deleted file mode 100644 index 2c7e953696a55ab9d134615a2371bbc48f902628..0000000000000000000000000000000000000000 --- a/core/inherents/src/pool.rs +++ /dev/null @@ -1,75 +0,0 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. -// This file is part of Substrate. - -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - -//! Inherents Pool - -use std::{fmt, mem, vec}; -use parking_lot::Mutex; - -/// Inherents Pool -/// -/// The pool is responsible to collect inherents asynchronously generated -/// by some other parts of the code and make them ready for the next block production. -pub struct InherentsPool { - data: Mutex>, -} - -impl Default for InherentsPool { - fn default() -> Self { - InherentsPool { - data: Default::default(), - } - } -} - -impl fmt::Debug for InherentsPool { - fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { - let mut builder = fmt.debug_struct("InherentsPool"); - if let Some(data) = self.data.try_lock() { - builder.field("data", &*data); - } - builder.finish() - } -} - -impl InherentsPool { - /// Add inherent extrinsic to the pool. - /// - /// This inherent will be appended to the next produced block. - pub fn add(&self, extrinsic: T) { - self.data.lock().push(extrinsic); - } - - /// Drain all currently queued inherents. - pub fn drain(&self) -> Vec { - mem::replace(&mut *self.data.lock(), vec![]) - } -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn should_drain_inherents_to_given_data() { - let pool = InherentsPool::default(); - pool.add(5); - pool.add(7); - - assert_eq!(pool.drain(), vec![5, 7]); - assert_eq!(pool.drain(), vec![]); - } -} diff --git a/core/keyring/src/sr25519.rs b/core/keyring/src/sr25519.rs index 0097d7b2f9c5c1493dad59cdd0a7d7220550a193..24a83ab798d26442d788b9bc219b1a493bb59496 100644 --- a/core/keyring/src/sr25519.rs +++ b/core/keyring/src/sr25519.rs @@ -68,7 +68,7 @@ impl Keyring { } pub fn to_raw_public_vec(self) -> Vec { - Public::from(self).to_raw_vec() + Public::from(self).into_raw_vec() } pub fn sign(self, msg: &[u8]) -> Signature { diff --git a/core/keystore/Cargo.toml b/core/keystore/Cargo.toml index 4c4a89157b8e35bb52b26c561bc7cc8bc80ea8db..1d4f146b7ed7fc156590dedd4fb825f84deaca8e 100644 --- a/core/keystore/Cargo.toml +++ b/core/keystore/Cargo.toml @@ -5,9 +5,8 @@ authors = ["Parity Technologies "] edition = "2018" [dependencies] +derive_more = "0.14.0" substrate-primitives = { path = "../primitives" } -crypto = { package = "parity-crypto", version = "0.3", default-features = false } -error-chain = "0.12" hex = "0.3" rand = "0.6" serde_json = "1.0" diff --git a/core/keystore/src/lib.rs b/core/keystore/src/lib.rs index ff737535f9a7969d671abd99b5b838c45df555b9..c36c6504c0110163fbf8000a337a368a0e575045 100644 --- a/core/keystore/src/lib.rs +++ b/core/keystore/src/lib.rs @@ -16,40 +16,42 @@ //! Keystore (and session key management) for ed25519 based chains like Polkadot. -// Silence: `use of deprecated item 'std::error::Error::cause': replaced by Error::source, which can support downcasting` -// https://github.com/paritytech/substrate/issues/1547 -#![allow(deprecated)] +#![warn(missing_docs)] use std::collections::HashMap; use std::path::PathBuf; use std::fs::{self, File}; use std::io::{self, Write}; -use error_chain::{bail, error_chain, error_chain_processing, impl_error_chain_processed, - impl_extract_backtrace, impl_error_chain_kind}; - use substrate_primitives::{ed25519::{Pair, Public}, Pair as PairT}; -pub use crypto::KEY_ITERATIONS; +/// Keystore error. +#[derive(Debug, derive_more::Display, derive_more::From)] +pub enum Error { + /// IO error. + Io(io::Error), + /// JSON error. + Json(serde_json::Error), + /// Invalid password. + #[display(fmt="Invalid password")] + InvalidPassword, + /// Invalid BIP39 phrase + #[display(fmt="Invalid recovery phrase (BIP39) data")] + InvalidPhrase, + /// Invalid seed + #[display(fmt="Invalid seed")] + InvalidSeed, +} -error_chain! { - foreign_links { - Io(io::Error); - Json(serde_json::Error); - } +/// Keystore Result +pub type Result = std::result::Result; - errors { - InvalidPassword { - description("Invalid password"), - display("Invalid password"), - } - InvalidPhrase { - description("Invalid recovery phrase (BIP39) data"), - display("Invalid recovery phrase (BIP39) data"), - } - InvalidSeed { - description("Invalid seed"), - display("Invalid seed"), +impl std::error::Error for Error { + fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { + match self { + Error::Io(ref err) => Some(err), + Error::Json(ref err) => Some(err), + _ => None, } } } @@ -69,7 +71,7 @@ impl Store { /// Generate a new key, placing it into the store. pub fn generate(&self, password: &str) -> Result { - let (pair, phrase) = Pair::generate_with_phrase(Some(password)); + let (pair, phrase, _) = Pair::generate_with_phrase(Some(password)); let mut file = File::create(self.key_file_path(&pair.public()))?; ::serde_json::to_writer(&file, &phrase)?; file.flush()?; @@ -79,7 +81,7 @@ impl Store { /// Create a new key from seed. Do not place it into the store. pub fn generate_from_seed(&mut self, seed: &str) -> Result { let pair = Pair::from_string(seed, None) - .map_err(|_| Error::from(ErrorKind::InvalidSeed))?; + .ok().ok_or(Error::InvalidSeed)?; self.additional.insert(pair.public(), pair.clone()); Ok(pair) } @@ -93,10 +95,10 @@ impl Store { let file = File::open(path)?; let phrase: String = ::serde_json::from_reader(&file)?; - let pair = Pair::from_phrase(&phrase, Some(password)) - .map_err(|_| Error::from(ErrorKind::InvalidPhrase))?; + let (pair, _) = Pair::from_phrase(&phrase, Some(password)) + .ok().ok_or(Error::InvalidPhrase)?; if &pair.public() != public { - bail!(ErrorKind::InvalidPassword); + return Err(Error::InvalidPassword); } Ok(pair) } diff --git a/core/network-libp2p/Cargo.toml b/core/network-libp2p/Cargo.toml deleted file mode 100644 index 8ee8caa06a38671db8cd6e6908826027192b60aa..0000000000000000000000000000000000000000 --- a/core/network-libp2p/Cargo.toml +++ /dev/null @@ -1,36 +0,0 @@ -[package] -description = "libp2p implementation of the ethcore network library" -homepage = "http://parity.io" -license = "GPL-3.0" -name = "substrate-network-libp2p" -version = "2.0.0" -authors = ["Parity Technologies "] -edition = "2018" - -[dependencies] -byteorder = "1.3" -bytes = "0.4" -error-chain = { version = "0.12", default-features = false } -fnv = "1.0" -futures = "0.1" -libp2p = { version = "0.7.0", default-features = false, features = ["secio-secp256k1", "libp2p-websocket"] } -parking_lot = "0.7.1" -lazy_static = "1.2" -log = "0.4" -rand = "0.6" -serde = { version = "1.0.70", features = ["derive"] } -serde_json = "1.0.24" -smallvec = "0.6" -substrate-peerset = { path = "../peerset" } -tokio-io = "0.1" -tokio-timer = "0.2" -unsigned-varint = { version = "0.2.1", features = ["codec"] } -void = "1.0" - -slog = { version = "^2", features = ["nested-values"] } -slog_derive = "0.1.1" -erased-serde = "0.3.9" - -[dev-dependencies] -tempdir = "0.3" -tokio = "0.1" diff --git a/core/network-libp2p/src/behaviour.rs b/core/network-libp2p/src/behaviour.rs deleted file mode 100644 index 196988b4f61babedbb026799a0bf5eaa08ebb0c5..0000000000000000000000000000000000000000 --- a/core/network-libp2p/src/behaviour.rs +++ /dev/null @@ -1,455 +0,0 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. -// This file is part of Substrate. - -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - -use crate::custom_proto::{CustomProto, CustomProtoOut, RegisteredProtocol}; -use futures::prelude::*; -use libp2p::NetworkBehaviour; -use libp2p::core::{Multiaddr, PeerId, ProtocolsHandler, PublicKey}; -use libp2p::core::swarm::{ConnectedPoint, NetworkBehaviour, NetworkBehaviourAction}; -use libp2p::core::swarm::{NetworkBehaviourEventProcess, PollParameters}; -#[cfg(not(target_os = "unknown"))] -use libp2p::core::swarm::toggle::Toggle; -use libp2p::identify::{Identify, IdentifyEvent, protocol::IdentifyInfo}; -use libp2p::kad::{Kademlia, KademliaOut}; -#[cfg(not(target_os = "unknown"))] -use libp2p::mdns::{Mdns, MdnsEvent}; -use libp2p::multiaddr::Protocol; -use libp2p::ping::{Ping, PingConfig, PingEvent, PingSuccess}; -use log::{debug, info, trace, warn}; -use std::{borrow::Cow, cmp, time::Duration}; -use tokio_io::{AsyncRead, AsyncWrite}; -use tokio_timer::{Delay, clock::Clock}; -use void; - -/// General behaviour of the network. -#[derive(NetworkBehaviour)] -#[behaviour(out_event = "BehaviourOut", poll_method = "poll")] -pub struct Behaviour { - /// Periodically ping nodes, and close the connection if it's unresponsive. - ping: Ping, - /// Custom protocols (dot, bbq, sub, etc.). - custom_protocols: CustomProto, - /// Discovers nodes of the network. Defined below. - discovery: DiscoveryBehaviour, - /// Periodically identifies the remote and responds to incoming requests. - identify: Identify, - /// Discovers nodes on the local network. - #[cfg(not(target_os = "unknown"))] - mdns: Toggle>, - - /// Queue of events to produce for the outside. - #[behaviour(ignore)] - events: Vec>, -} - -impl Behaviour { - /// Builds a new `Behaviour`. - pub fn new( - user_agent: String, - local_public_key: PublicKey, - protocol: RegisteredProtocol, - known_addresses: Vec<(PeerId, Multiaddr)>, - peerset: substrate_peerset::Peerset, - enable_mdns: bool, - ) -> Self { - let identify = { - let proto_version = "/substrate/1.0".to_string(); - Identify::new(proto_version, user_agent, local_public_key.clone()) - }; - - let custom_protocols = CustomProto::new(protocol, peerset); - - let mut kademlia = Kademlia::new(local_public_key.clone().into_peer_id()); - for (peer_id, addr) in &known_addresses { - kademlia.add_connected_address(peer_id, addr.clone()); - } - - if enable_mdns { - #[cfg(target_os = "unknown")] - warn!(target: "sub-libp2p", "mDNS is not available on this platform"); - } - - let clock = Clock::new(); - Behaviour { - ping: Ping::new(PingConfig::new()), - custom_protocols, - discovery: DiscoveryBehaviour { - user_defined: known_addresses, - kademlia, - next_kad_random_query: Delay::new(clock.now()), - duration_to_next_kad: Duration::from_secs(1), - clock, - local_peer_id: local_public_key.into_peer_id(), - }, - identify, - #[cfg(not(target_os = "unknown"))] - mdns: if enable_mdns { - match Mdns::new() { - Ok(mdns) => Some(mdns).into(), - Err(err) => { - warn!(target: "sub-libp2p", "Failed to initialize mDNS: {:?}", err); - None.into() - } - } - } else { - None.into() - }, - events: Vec::new(), - } - } - - /// Sends a message to a peer. - /// - /// Has no effect if the custom protocol is not open with the given peer. - /// - /// Also note that even we have a valid open substream, it may in fact be already closed - /// without us knowing, in which case the packet will not be received. - #[inline] - pub fn send_custom_message(&mut self, target: &PeerId, data: TMessage) { - self.custom_protocols.send_packet(target, data) - } - - /// Returns the list of nodes that we know exist in the network. - pub fn known_peers(&self) -> impl Iterator { - self.discovery.kademlia.kbuckets_entries() - } - - /// Returns true if we try to open protocols with the given peer. - pub fn is_enabled(&self, peer_id: &PeerId) -> bool { - self.custom_protocols.is_enabled(peer_id) - } - - /// Returns true if we have an open protocol with the given peer. - pub fn is_open(&self, peer_id: &PeerId) -> bool { - self.custom_protocols.is_open(peer_id) - } - - /// Adds a hard-coded address for the given peer, that never expires. - pub fn add_known_address(&mut self, peer_id: PeerId, addr: Multiaddr) { - if self.discovery.user_defined.iter().all(|(p, a)| *p != peer_id && *a != addr) { - self.discovery.user_defined.push((peer_id, addr)); - } - } - - /// Disconnects the custom protocols from a peer. - /// - /// The peer will still be able to use Kademlia or other protocols, but will get disconnected - /// after a few seconds of inactivity. - /// - /// This is asynchronous and does not instantly close the custom protocols. - /// Corresponding closing events will be generated once the closing actually happens. - /// - /// Has no effect if we're not connected to the `PeerId`. - #[inline] - pub fn drop_node(&mut self, peer_id: &PeerId) { - self.custom_protocols.disconnect_peer(peer_id) - } - - /// Returns the state of the peerset manager, for debugging purposes. - pub fn peerset_debug_info(&mut self) -> serde_json::Value { - self.custom_protocols.peerset_debug_info() - } -} - -/// Event that can be emitted by the behaviour. -#[derive(Debug)] -pub enum BehaviourOut { - /// Opened a custom protocol with the remote. - CustomProtocolOpen { - /// Version of the protocol that has been opened. - version: u8, - /// Id of the node we have opened a connection with. - peer_id: PeerId, - /// Endpoint used for this custom protocol. - endpoint: ConnectedPoint, - }, - - /// Closed a custom protocol with the remote. - CustomProtocolClosed { - /// Id of the peer we were connected to. - peer_id: PeerId, - /// Reason why the substream closed, for diagnostic purposes. - reason: Cow<'static, str>, - }, - - /// Receives a message on a custom protocol substream. - CustomMessage { - /// Id of the peer the message came from. - peer_id: PeerId, - /// Message that has been received. - message: TMessage, - }, - - /// A substream with a remote is clogged. We should avoid sending more data to it if possible. - Clogged { - /// Id of the peer the message came from. - peer_id: PeerId, - /// Copy of the messages that are within the buffer, for further diagnostic. - messages: Vec, - }, - - /// We have obtained debug information from a peer. - Identified { - /// Id of the peer that has been identified. - peer_id: PeerId, - /// Information about the peer. - info: IdentifyInfo, - }, - - /// We have successfully pinged a peer. - PingSuccess { - /// Id of the peer that has been pinged. - peer_id: PeerId, - /// Time it took for the ping to come back. - ping_time: Duration, - }, -} - -impl From> for BehaviourOut { - fn from(other: CustomProtoOut) -> BehaviourOut { - match other { - CustomProtoOut::CustomProtocolOpen { version, peer_id, endpoint } => { - BehaviourOut::CustomProtocolOpen { version, peer_id, endpoint } - } - CustomProtoOut::CustomProtocolClosed { peer_id, reason } => { - BehaviourOut::CustomProtocolClosed { peer_id, reason } - } - CustomProtoOut::CustomMessage { peer_id, message } => { - BehaviourOut::CustomMessage { peer_id, message } - } - CustomProtoOut::Clogged { peer_id, messages } => { - BehaviourOut::Clogged { peer_id, messages } - } - } - } -} - -impl NetworkBehaviourEventProcess for Behaviour { - fn inject_event(&mut self, event: void::Void) { - void::unreachable(event) - } -} - -impl NetworkBehaviourEventProcess> for Behaviour { - fn inject_event(&mut self, event: CustomProtoOut) { - self.events.push(event.into()); - } -} - -impl NetworkBehaviourEventProcess for Behaviour { - fn inject_event(&mut self, event: IdentifyEvent) { - match event { - IdentifyEvent::Identified { peer_id, mut info, .. } => { - trace!(target: "sub-libp2p", "Identified {:?} => {:?}", peer_id, info); - // TODO: ideally we would delay the first identification to when we open the custom - // protocol, so that we only report id info to the service about the nodes we - // care about (https://github.com/libp2p/rust-libp2p/issues/876) - if !info.protocol_version.contains("substrate") { - warn!(target: "sub-libp2p", "Connected to a non-Substrate node: {:?}", info); - } - if info.listen_addrs.len() > 30 { - warn!(target: "sub-libp2p", "Node {:?} has reported more than 30 addresses; \ - it is identified by {:?} and {:?}", peer_id, info.protocol_version, - info.agent_version - ); - info.listen_addrs.truncate(30); - } - for addr in &info.listen_addrs { - self.discovery.kademlia.add_connected_address(&peer_id, addr.clone()); - } - self.custom_protocols.add_discovered_nodes(Some(peer_id.clone())); - self.events.push(BehaviourOut::Identified { peer_id, info }); - } - IdentifyEvent::Error { .. } => {} - IdentifyEvent::SendBack { result: Err(ref err), ref peer_id } => - debug!(target: "sub-libp2p", "Error when sending back identify info \ - to {:?} => {}", peer_id, err), - IdentifyEvent::SendBack { .. } => {} - } - } -} - -impl NetworkBehaviourEventProcess for Behaviour { - fn inject_event(&mut self, out: KademliaOut) { - match out { - KademliaOut::Discovered { .. } => {} - KademliaOut::KBucketAdded { peer_id, .. } => { - self.custom_protocols.add_discovered_nodes(Some(peer_id)); - } - KademliaOut::FindNodeResult { key, closer_peers } => { - trace!(target: "sub-libp2p", "Libp2p => Query for {:?} yielded {:?} results", - key, closer_peers.len()); - if closer_peers.is_empty() { - warn!(target: "sub-libp2p", "Libp2p => Random Kademlia query has yielded empty \ - results"); - } - } - // We never start any GET_PROVIDERS query. - KademliaOut::GetProvidersResult { .. } => () - } - } -} - -impl NetworkBehaviourEventProcess for Behaviour { - fn inject_event(&mut self, event: PingEvent) { - match event { - PingEvent { peer, result: Ok(PingSuccess::Ping { rtt }) } => { - trace!(target: "sub-libp2p", "Ping time with {:?}: {:?}", peer, rtt); - self.events.push(BehaviourOut::PingSuccess { peer_id: peer, ping_time: rtt }); - } - _ => () - } - } -} - -#[cfg(not(target_os = "unknown"))] -impl NetworkBehaviourEventProcess for Behaviour { - fn inject_event(&mut self, event: MdnsEvent) { - match event { - MdnsEvent::Discovered(list) => { - self.custom_protocols.add_discovered_nodes(list.into_iter().map(|(peer_id, _)| peer_id)); - }, - MdnsEvent::Expired(_) => {} - } - } -} - -impl Behaviour { - fn poll(&mut self) -> Async>> { - if !self.events.is_empty() { - return Async::Ready(NetworkBehaviourAction::GenerateEvent(self.events.remove(0))) - } - - Async::NotReady - } -} - -/// Implementation of `NetworkBehaviour` that discovers the nodes on the network. -pub struct DiscoveryBehaviour { - /// User-defined list of nodes and their addresses. Typically includes bootstrap nodes and - /// reserved nodes. - user_defined: Vec<(PeerId, Multiaddr)>, - /// Kademlia requests and answers. - kademlia: Kademlia, - /// Stream that fires when we need to perform the next random Kademlia query. - next_kad_random_query: Delay, - /// After `next_kad_random_query` triggers, the next one triggers after this duration. - duration_to_next_kad: Duration, - /// `Clock` instance that uses the current execution context's source of time. - clock: Clock, - /// Identity of our local node. - local_peer_id: PeerId, -} - -impl NetworkBehaviour for DiscoveryBehaviour -where - TSubstream: AsyncRead + AsyncWrite, -{ - type ProtocolsHandler = as NetworkBehaviour>::ProtocolsHandler; - type OutEvent = as NetworkBehaviour>::OutEvent; - - fn new_handler(&mut self) -> Self::ProtocolsHandler { - NetworkBehaviour::new_handler(&mut self.kademlia) - } - - fn addresses_of_peer(&mut self, peer_id: &PeerId) -> Vec { - let mut list = self.user_defined.iter() - .filter_map(|(p, a)| if p == peer_id { Some(a.clone()) } else { None }) - .collect::>(); - list.extend(self.kademlia.addresses_of_peer(peer_id)); - trace!(target: "sub-libp2p", "Addresses of {:?} are {:?}", peer_id, list); - if list.is_empty() { - if self.kademlia.kbuckets_entries().any(|p| p == peer_id) { - debug!(target: "sub-libp2p", "Requested dialing to {:?} (peer in k-buckets), \ - and no address was found", peer_id); - } else { - debug!(target: "sub-libp2p", "Requested dialing to {:?} (peer not in k-buckets), \ - and no address was found", peer_id); - } - } - list - } - - fn inject_connected(&mut self, peer_id: PeerId, endpoint: ConnectedPoint) { - NetworkBehaviour::inject_connected(&mut self.kademlia, peer_id, endpoint) - } - - fn inject_disconnected(&mut self, peer_id: &PeerId, endpoint: ConnectedPoint) { - NetworkBehaviour::inject_disconnected(&mut self.kademlia, peer_id, endpoint) - } - - fn inject_replaced(&mut self, peer_id: PeerId, closed: ConnectedPoint, opened: ConnectedPoint) { - NetworkBehaviour::inject_replaced(&mut self.kademlia, peer_id, closed, opened) - } - - fn inject_node_event( - &mut self, - peer_id: PeerId, - event: ::OutEvent, - ) { - NetworkBehaviour::inject_node_event(&mut self.kademlia, peer_id, event) - } - - fn inject_new_external_addr(&mut self, addr: &Multiaddr) { - let new_addr = addr.clone() - .with(Protocol::P2p(self.local_peer_id.clone().into())); - info!(target: "sub-libp2p", "Discovered external node address: {}", new_addr); - } - - fn inject_expired_listen_addr(&mut self, addr: &Multiaddr) { - info!(target: "sub-libp2p", "No longer listening on {}", addr); - } - - fn poll( - &mut self, - params: &mut PollParameters, - ) -> Async< - NetworkBehaviourAction< - ::InEvent, - Self::OutEvent, - >, - > { - // Poll Kademlia. - match self.kademlia.poll(params) { - Async::Ready(action) => return Async::Ready(action), - Async::NotReady => (), - } - - // Poll the stream that fires when we need to start a random Kademlia query. - loop { - match self.next_kad_random_query.poll() { - Ok(Async::NotReady) => break, - Ok(Async::Ready(_)) => { - let random_peer_id = PeerId::random(); - debug!(target: "sub-libp2p", "Libp2p <= Starting random Kademlia request for \ - {:?}", random_peer_id); - self.kademlia.find_node(random_peer_id); - - // Reset the `Delay` to the next random. - self.next_kad_random_query.reset(self.clock.now() + self.duration_to_next_kad); - self.duration_to_next_kad = cmp::min(self.duration_to_next_kad * 2, - Duration::from_secs(60)); - }, - Err(err) => { - warn!(target: "sub-libp2p", "Kademlia query timer errored: {:?}", err); - break - } - } - } - - Async::NotReady - } -} diff --git a/core/network-libp2p/src/config.rs b/core/network-libp2p/src/config.rs deleted file mode 100644 index 9d74cd73e234308927d3c25a59436ec230f10b8e..0000000000000000000000000000000000000000 --- a/core/network-libp2p/src/config.rs +++ /dev/null @@ -1,290 +0,0 @@ -// Copyright 2015-2019 Parity Technologies (UK) Ltd. -// This file is part of Substrate. - -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - -//! Libp2p network configuration. - -use libp2p::identity::{Keypair, secp256k1, ed25519}; -use libp2p::{Multiaddr, multiaddr::Protocol}; -use std::error::Error; -use std::{io::{self, Write}, iter, fs, net::Ipv4Addr, path::{Path, PathBuf}}; - -/// Network service configuration. -#[derive(Clone)] -pub struct NetworkConfiguration { - /// Directory path to store general network configuration. None means nothing will be saved. - pub config_path: Option, - /// Directory path to store network-specific configuration. None means nothing will be saved. - pub net_config_path: Option, - /// Multiaddresses to listen for incoming connections. - pub listen_addresses: Vec, - /// Multiaddresses to advertise. Detected automatically if empty. - pub public_addresses: Vec, - /// List of initial node addresses - pub boot_nodes: Vec, - /// The node key configuration, which determines the node's network identity keypair. - pub node_key: NodeKeyConfig, - /// Maximum allowed number of incoming connections. - pub in_peers: u32, - /// Number of outgoing connections we're trying to maintain. - pub out_peers: u32, - /// List of reserved node addresses. - pub reserved_nodes: Vec, - /// The non-reserved peer mode. - pub non_reserved_mode: NonReservedPeerMode, - /// Client identifier. Sent over the wire for debugging purposes. - pub client_version: String, - /// Name of the node. Sent over the wire for debugging purposes. - pub node_name: String, - /// If true, the network will use mDNS to discover other libp2p nodes on the local network - /// and connect to them if they support the same chain. - pub enable_mdns: bool, -} - -impl Default for NetworkConfiguration { - fn default() -> Self { - NetworkConfiguration { - config_path: None, - net_config_path: None, - listen_addresses: Vec::new(), - public_addresses: Vec::new(), - boot_nodes: Vec::new(), - node_key: NodeKeyConfig::Ed25519(Secret::New), - in_peers: 25, - out_peers: 75, - reserved_nodes: Vec::new(), - non_reserved_mode: NonReservedPeerMode::Accept, - client_version: "unknown".into(), - node_name: "unknown".into(), - enable_mdns: false, - } - } -} - -impl NetworkConfiguration { - /// Create a new instance of default settings. - pub fn new() -> Self { - Self::default() - } - - /// Create new default configuration for localhost-only connection with random port (useful for testing) - pub fn new_local() -> NetworkConfiguration { - let mut config = NetworkConfiguration::new(); - config.listen_addresses = vec![ - iter::once(Protocol::Ip4(Ipv4Addr::new(127, 0, 0, 1))) - .chain(iter::once(Protocol::Tcp(0))) - .collect() - ]; - config - } -} - -/// The policy for connections to non-reserved peers. -#[derive(Clone, Debug, PartialEq, Eq)] -pub enum NonReservedPeerMode { - /// Accept them. This is the default. - Accept, - /// Deny them. - Deny, -} - -impl NonReservedPeerMode { - /// Attempt to parse the peer mode from a string. - pub fn parse(s: &str) -> Option { - match s { - "accept" => Some(NonReservedPeerMode::Accept), - "deny" => Some(NonReservedPeerMode::Deny), - _ => None, - } - } -} - -/// The configuration of a node's secret key, describing the type of key -/// and how it is obtained. A node's identity keypair is the result of -/// the evaluation of the node key configuration. -#[derive(Clone)] -pub enum NodeKeyConfig { - /// A Secp256k1 secret key configuration. - Secp256k1(Secret), - /// A Ed25519 secret key configuration. - Ed25519(Secret) -} - -/// The options for obtaining a Secp256k1 secret key. -pub type Secp256k1Secret = Secret; - -/// The options for obtaining a Ed25519 secret key. -pub type Ed25519Secret = Secret; - -/// The configuration options for obtaining a secret key `K`. -#[derive(Clone)] -pub enum Secret { - /// Use the given secret key `K`. - Input(K), - /// Read the secret key from a file. If the file does not exist, - /// it is created with a newly generated secret key `K`. The format - /// of the file is determined by `K`: - /// - /// * `secp256k1::SecretKey`: An unencoded 32 bytes Secp256k1 secret key. - /// * `ed25519::SecretKey`: An unencoded 32 bytes Ed25519 secret key. - File(PathBuf), - /// Always generate a new secret key `K`. - New -} - -impl NodeKeyConfig { - /// Evaluate a `NodeKeyConfig` to obtain an identity `Keypair`: - /// - /// * If the secret is configured as input, the corresponding keypair is returned. - /// - /// * If the secret is configured as a file, it is read from that file, if it exists. - /// Otherwise a new secret is generated and stored. In either case, the - /// keypair obtained from the secret is returned. - /// - /// * If the secret is configured to be new, it is generated and the corresponding - /// keypair is returned. - pub fn into_keypair(self) -> io::Result { - use NodeKeyConfig::*; - match self { - Secp256k1(Secret::New) => - Ok(Keypair::generate_secp256k1()), - - Secp256k1(Secret::Input(k)) => - Ok(Keypair::Secp256k1(k.into())), - - Secp256k1(Secret::File(f)) => - get_secret(f, - |mut b| secp256k1::SecretKey::from_bytes(&mut b), - secp256k1::SecretKey::generate) - .map(secp256k1::Keypair::from) - .map(Keypair::Secp256k1), - - Ed25519(Secret::New) => - Ok(Keypair::generate_ed25519()), - - Ed25519(Secret::Input(k)) => - Ok(Keypair::Ed25519(k.into())), - - Ed25519(Secret::File(f)) => - get_secret(f, - |mut b| ed25519::SecretKey::from_bytes(&mut b), - ed25519::SecretKey::generate) - .map(ed25519::Keypair::from) - .map(Keypair::Ed25519), - } - } -} - -/// Load a secret key from a file, if it exists, or generate a -/// new secret key and write it to that file. In either case, -/// the secret key is returned. -fn get_secret(file: P, parse: F, generate: G) -> io::Result -where - P: AsRef, - F: for<'r> FnOnce(&'r mut [u8]) -> Result, - G: FnOnce() -> K, - E: Error + Send + Sync + 'static, - K: AsRef<[u8]> -{ - std::fs::read(&file) - .and_then(|mut sk_bytes| - parse(&mut sk_bytes) - .map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))) - .or_else(|e| { - if e.kind() == io::ErrorKind::NotFound { - file.as_ref().parent().map_or(Ok(()), fs::create_dir_all)?; - let sk = generate(); - write_secret_file(file, sk.as_ref())?; - Ok(sk) - } else { - Err(e) - } - }) -} - -/// Write secret bytes to a file. -fn write_secret_file

(path: P, sk_bytes: &[u8]) -> io::Result<()> -where - P: AsRef -{ - let mut file = open_secret_file(&path)?; - file.write_all(sk_bytes) -} - -/// Opens a file containing a secret key in write mode. -#[cfg(unix)] -fn open_secret_file

(path: P) -> io::Result -where - P: AsRef -{ - use std::os::unix::fs::OpenOptionsExt; - fs::OpenOptions::new() - .write(true) - .create_new(true) - .mode(0o600) - .open(path) -} - -/// Opens a file containing a secret key in write mode. -#[cfg(not(unix))] -fn open_secret_file

(path: P) -> Result -where - P: AsRef -{ - fs::OpenOptions::new() - .write(true) - .create_new(true) - .open(path) -} - -#[cfg(test)] -mod tests { - use super::*; - use tempdir::TempDir; - - fn secret_bytes(kp: &Keypair) -> Vec { - match kp { - Keypair::Ed25519(p) => p.secret().as_ref().iter().cloned().collect(), - Keypair::Secp256k1(p) => p.secret().as_ref().iter().cloned().collect(), - _ => panic!("Unexpected keypair.") - } - } - - #[test] - fn test_secret_file() { - let tmp = TempDir::new("x").unwrap(); - std::fs::remove_dir(tmp.path()).unwrap(); // should be recreated - let file = tmp.path().join("x").to_path_buf(); - let kp1 = NodeKeyConfig::Ed25519(Secret::File(file.clone())).into_keypair().unwrap(); - let kp2 = NodeKeyConfig::Ed25519(Secret::File(file.clone())).into_keypair().unwrap(); - assert!(file.is_file() && secret_bytes(&kp1) == secret_bytes(&kp2)) - } - - #[test] - fn test_secret_input() { - let sk = secp256k1::SecretKey::generate(); - let kp1 = NodeKeyConfig::Secp256k1(Secret::Input(sk.clone())).into_keypair().unwrap(); - let kp2 = NodeKeyConfig::Secp256k1(Secret::Input(sk)).into_keypair().unwrap(); - assert!(secret_bytes(&kp1) == secret_bytes(&kp2)); - } - - #[test] - fn test_secret_new() { - let kp1 = NodeKeyConfig::Ed25519(Secret::New).into_keypair().unwrap(); - let kp2 = NodeKeyConfig::Ed25519(Secret::New).into_keypair().unwrap(); - assert!(secret_bytes(&kp1) != secret_bytes(&kp2)); - } -} - diff --git a/core/network-libp2p/src/lib.rs b/core/network-libp2p/src/lib.rs deleted file mode 100644 index 6e4b2e4784a508dad6528a4a849e6fd16ccb688f..0000000000000000000000000000000000000000 --- a/core/network-libp2p/src/lib.rs +++ /dev/null @@ -1,267 +0,0 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. -// This file is part of Substrate. - -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - -//! Networking layer of Substrate. -//! -//! # Overview -//! -//! This crate handles the following network mechanisms: -//! -//! - Discovering nodes that are part of the network. -//! - Connecting to said nodes and accepting incoming connections. -//! - Encrypting communications between nodes. -//! - Ensure that nodes are really the `PeerId` that they pretend to be. -//! - Ensuring that the nodes belong to the same chain as us before reporting a new connection. -//! -//! From the point of view of our node, each other node on the network has a reputation value in -//! the form of an `i32`. We try to establish connections towards nodes with a higher reputation -//! over nodes with a lower reputation. -//! -//! Establishing connections to other nodes is automatically performed by this crate, and there is -//! no way to influence this, except by adjusting reputations. -//! -//! ## About the term "connecting" -//! -//! The documentation of this crate uses the words "connected" and "disconnected". It is important -//! to note that this doesn't correspond to actual TCP/IP connections and disconnections. Libp2p -//! will maintain connections that aren't reported by the API of this crate, and TCP/IP connections -//! can be kept alive even after we have reported a disconnect in order to potentially reuse them. -//! -//! # Usage -//! -//! > **Important**: This crate is unstable and the API and usage may change. -//! -//! The first step is to crate a [`RegisteredProtocol`] describing the protocol, and a -//! [`NetworkConfiguration`] describing the network. Then call [`start_service`] with them, which -//! returns a [`Service`] object and a [`substrate_peerset::PeersetHandle`]. -//! -//! The former allows you to know what happens on the network and to send messages, while the -//! latter can be used to adjust the reputations of nodes. -//! -//! You must call the `poll` method of [`Service`] in order to make the network progress and in -//! order to update the internal state of the [`Service`]. Calling `poll` will produce -//! [`ServiceEvent`]s, which inform you of what happened on the network. -//! -//! Please keep in mind that the state of the [`Service`] only updates itself in a way -//! corresponding to the [`ServiceEvent`] that `poll` returns. -//! -//! Illustration: -//! -//! - You call [`Service::connected_peers`] to get the list of nodes we are connected to. -//! - If you then call [`Service::connected_peers`] again, the returned list will always be the -//! same, no matter what happened on the wire. -//! - If you then call [`Service::poll`] and a [`ServiceEvent::OpenedCustomProtocol`] event is -//! returned, then the concerned node, and only the concerned node, will be added to the list of -//! nodes we are connected to. -//! - Similarly, if [`Service::poll`] produces a [`ServiceEvent::ClosedCustomProtocol`] event, then -//! only the concerned node will disappear from the list. -//! - And if [`Service::poll`] returns neither [`ServiceEvent::OpenedCustomProtocol`] nor -//! [`ServiceEvent::ClosedCustomProtocol`], then the list of connected nodes doesn't change. -//! -//! ## Example -//! -//! ```no_run -//! # use futures::prelude::*; -//! use substrate_network_libp2p::ServiceEvent; -//! -//! let proto = substrate_network_libp2p::RegisteredProtocol::new(&b"hello"[..], &[0]); -//! let config = substrate_network_libp2p::NetworkConfiguration::default(); -//! let (mut service, _peerset) = substrate_network_libp2p::start_service(config, proto).unwrap(); -//! -//! tokio::run(futures::future::poll_fn(move || { -//! loop { -//! match service.poll().unwrap() { -//! Async::NotReady => return Ok(Async::NotReady), -//! Async::Ready(Some(ServiceEvent::OpenedCustomProtocol { peer_id, .. })) => { -//! println!("now connected to {:?}", peer_id); -//! service.send_custom_message(&peer_id, b"hello world!".to_vec()); -//! } -//! Async::Ready(Some(ServiceEvent::ClosedCustomProtocol { peer_id, .. })) => -//! println!("now disconnected from {:?}", peer_id), -//! Async::Ready(Some(ServiceEvent::CustomMessage { peer_id, message })) => -//! println!("received message from {:?}: {:?}", peer_id, message), -//! Async::Ready(None) => return Ok(Async::Ready(())), -//! _ => {} -//! } -//! } -//! })); -//! ``` -//! - -mod behaviour; -mod config; -mod custom_proto; -mod service_task; -mod transport; - -pub use crate::config::*; -pub use crate::custom_proto::{CustomMessage, RegisteredProtocol}; -pub use crate::config::{NetworkConfiguration, NodeKeyConfig, Secret, NonReservedPeerMode}; -pub use crate::service_task::{start_service, Service, ServiceEvent}; -pub use libp2p::{Multiaddr, multiaddr, build_multiaddr}; -pub use libp2p::{identity, PeerId, core::PublicKey}; - -use libp2p::core::nodes::ConnectedPoint; -use serde::{Deserialize, Serialize}; -use slog_derive::SerdeValue; -use std::{collections::{HashMap, HashSet}, error, fmt, time::Duration}; - -/// Name of a protocol, transmitted on the wire. Should be unique for each chain. -#[derive(Debug, Clone, PartialEq, Eq, Hash)] -pub struct ProtocolId(smallvec::SmallVec<[u8; 6]>); - -impl<'a> From<&'a [u8]> for ProtocolId { - fn from(bytes: &'a [u8]) -> ProtocolId { - ProtocolId(bytes.into()) - } -} - -impl ProtocolId { - /// Exposes the `ProtocolId` as bytes. - pub fn as_bytes(&self) -> &[u8] { - self.0.as_ref() - } -} - -/// Parses a string address and returns the component, if valid. -pub fn parse_str_addr(addr_str: &str) -> Result<(PeerId, Multiaddr), ParseErr> { - let mut addr: Multiaddr = addr_str.parse()?; - - let who = match addr.pop() { - Some(multiaddr::Protocol::P2p(key)) => PeerId::from_multihash(key) - .map_err(|_| ParseErr::InvalidPeerId)?, - _ => return Err(ParseErr::PeerIdMissing), - }; - - Ok((who, addr)) -} - -/// Error that can be generated by `parse_str_addr`. -#[derive(Debug)] -pub enum ParseErr { - /// Error while parsing the multiaddress. - MultiaddrParse(multiaddr::Error), - /// Multihash of the peer ID is invalid. - InvalidPeerId, - /// The peer ID is missing from the address. - PeerIdMissing, -} - -impl fmt::Display for ParseErr { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - ParseErr::MultiaddrParse(err) => write!(f, "{}", err), - ParseErr::InvalidPeerId => write!(f, "Peer id at the end of the address is invalid"), - ParseErr::PeerIdMissing => write!(f, "Peer id is missing from the address"), - } - } -} - -impl error::Error for ParseErr { - fn source(&self) -> Option<&(dyn error::Error + 'static)> { - match self { - ParseErr::MultiaddrParse(err) => Some(err), - ParseErr::InvalidPeerId => None, - ParseErr::PeerIdMissing => None, - } - } -} - -impl From for ParseErr { - fn from(err: multiaddr::Error) -> ParseErr { - ParseErr::MultiaddrParse(err) - } -} - -/// Returns general information about the networking. -/// -/// Meant for general diagnostic purposes. -/// -/// **Warning**: This API is not stable. -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, SerdeValue)] -#[serde(rename_all = "camelCase")] -pub struct NetworkState { - /// PeerId of the local node. - pub peer_id: String, - /// List of addresses the node is currently listening on. - pub listened_addresses: HashSet, - /// List of addresses the node knows it can be reached as. - pub external_addresses: HashSet, - /// List of node we're connected to. - pub connected_peers: HashMap, - /// List of node that we know of but that we're not connected to. - pub not_connected_peers: HashMap, - /// Downloaded bytes per second averaged over the past few seconds. - pub average_download_per_sec: u64, - /// Uploaded bytes per second averaged over the past few seconds. - pub average_upload_per_sec: u64, - /// State of the peerset manager. - pub peerset: serde_json::Value, -} - -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] -#[serde(rename_all = "camelCase")] -pub struct NetworkStatePeer { - /// How we are connected to the node. - pub endpoint: NetworkStatePeerEndpoint, - /// Node information, as provided by the node itself. Can be empty if not known yet. - pub version_string: Option, - /// Latest ping duration with this node. - pub latest_ping_time: Option, - /// If true, the peer is "enabled", which means that we try to open Substrate-related protocols - /// with this peer. If false, we stick to Kademlia and/or other network-only protocols. - pub enabled: bool, - /// If true, the peer is "open", which means that we have a Substrate-related protocol - /// with this peer. - pub open: bool, - /// List of addresses known for this node. - pub known_addresses: HashSet, -} - -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] -#[serde(rename_all = "camelCase")] -pub struct NetworkStateNotConnectedPeer { - /// List of addresses known for this node. - pub known_addresses: HashSet, -} - -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] -#[serde(rename_all = "camelCase")] -pub enum NetworkStatePeerEndpoint { - /// We are dialing the given address. - Dialing(Multiaddr), - /// We are listening. - Listening { - /// Address we're listening on that received the connection. - listen_addr: Multiaddr, - /// Address data is sent back to. - send_back_addr: Multiaddr, - }, -} - -impl From for NetworkStatePeerEndpoint { - fn from(endpoint: ConnectedPoint) -> Self { - match endpoint { - ConnectedPoint::Dialer { address } => - NetworkStatePeerEndpoint::Dialing(address), - ConnectedPoint::Listener { listen_addr, send_back_addr } => - NetworkStatePeerEndpoint::Listening { - listen_addr: listen_addr, - send_back_addr: send_back_addr - } - } - } -} diff --git a/core/network-libp2p/src/service_task.rs b/core/network-libp2p/src/service_task.rs deleted file mode 100644 index af05d92092bed42d8070e3e9d29ad3961067cd20..0000000000000000000000000000000000000000 --- a/core/network-libp2p/src/service_task.rs +++ /dev/null @@ -1,388 +0,0 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. -// This file is part of Substrate. - -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - -use crate::{ - behaviour::Behaviour, behaviour::BehaviourOut, - transport, NetworkState, NetworkStatePeer, NetworkStateNotConnectedPeer -}; -use crate::custom_proto::{CustomMessage, RegisteredProtocol}; -use crate::{NetworkConfiguration, NonReservedPeerMode, parse_str_addr}; -use fnv::FnvHashMap; -use futures::{prelude::*, Stream}; -use libp2p::{Multiaddr, core::swarm::NetworkBehaviour, PeerId}; -use libp2p::core::{Swarm, nodes::Substream, transport::boxed::Boxed, muxing::StreamMuxerBox}; -use libp2p::core::nodes::ConnectedPoint; -use log::{debug, info, warn}; -use std::fs; -use std::io::Error as IoError; -use std::path::Path; -use std::sync::Arc; -use std::time::Duration; - -/// Starts the substrate libp2p service. -/// -/// Returns a stream that must be polled regularly in order for the networking to function. -pub fn start_service( - config: NetworkConfiguration, - registered_custom: RegisteredProtocol, -) -> Result<(Service, substrate_peerset::PeersetHandle), IoError> -where TMessage: CustomMessage + Send + 'static { - - if let Some(ref path) = config.net_config_path { - fs::create_dir_all(Path::new(path))?; - } - - // List of multiaddresses that we know in the network. - let mut known_addresses = Vec::new(); - let mut bootnodes = Vec::new(); - let mut reserved_nodes = Vec::new(); - - // Process the bootnodes. - for bootnode in config.boot_nodes.iter() { - match parse_str_addr(bootnode) { - Ok((peer_id, addr)) => { - bootnodes.push(peer_id.clone()); - known_addresses.push((peer_id, addr)); - }, - Err(_) => warn!(target: "sub-libp2p", "Not a valid bootnode address: {}", bootnode), - } - } - - // Initialize the reserved peers. - for reserved in config.reserved_nodes.iter() { - if let Ok((peer_id, addr)) = parse_str_addr(reserved) { - reserved_nodes.push(peer_id.clone()); - known_addresses.push((peer_id, addr)); - } else { - warn!(target: "sub-libp2p", "Not a valid reserved node address: {}", reserved); - } - } - - // Build the peerset. - let (peerset, peerset_handle) = substrate_peerset::Peerset::from_config(substrate_peerset::PeersetConfig { - in_peers: config.in_peers, - out_peers: config.out_peers, - bootnodes, - reserved_only: config.non_reserved_mode == NonReservedPeerMode::Deny, - reserved_nodes, - }); - - // Private and public keys configuration. - let local_identity = config.node_key.clone().into_keypair()?; - let local_public = local_identity.public(); - let local_peer_id = local_public.clone().into_peer_id(); - info!(target: "sub-libp2p", "Local node identity is: {}", local_peer_id.to_base58()); - - // Build the swarm. - let (mut swarm, bandwidth) = { - let user_agent = format!("{} ({})", config.client_version, config.node_name); - let behaviour = Behaviour::new(user_agent, local_public, registered_custom, known_addresses, peerset, config.enable_mdns); - let (transport, bandwidth) = transport::build_transport(local_identity); - (Swarm::new(transport, behaviour, local_peer_id.clone()), bandwidth) - }; - - // Listen on multiaddresses. - for addr in &config.listen_addresses { - if let Err(err) = Swarm::listen_on(&mut swarm, addr.clone()) { - warn!(target: "sub-libp2p", "Can't listen on {} because: {:?}", addr, err) - } - } - - // Add external addresses. - for addr in &config.public_addresses { - Swarm::add_external_address(&mut swarm, addr.clone()); - } - - let service = Service { - swarm, - bandwidth, - nodes_info: Default::default(), - injected_events: Vec::new(), - }; - - Ok((service, peerset_handle)) -} - -/// Event produced by the service. -#[derive(Debug)] -pub enum ServiceEvent { - /// A custom protocol substream has been opened with a node. - OpenedCustomProtocol { - /// Identity of the node. - peer_id: PeerId, - /// Version of the protocol that was opened. - version: u8, - /// Node debug info - debug_info: String, - }, - - /// A custom protocol substream has been closed. - ClosedCustomProtocol { - /// Identity of the node. - peer_id: PeerId, - /// Node debug info - debug_info: String, - }, - - /// Receives a message on a custom protocol stream. - CustomMessage { - /// Identity of the node. - peer_id: PeerId, - /// Message that has been received. - message: TMessage, - }, - - /// The substream with a node is clogged. We should avoid sending data to it if possible. - Clogged { - /// Index of the node. - peer_id: PeerId, - /// Copy of the messages that are within the buffer, for further diagnostic. - messages: Vec, - }, -} - -/// Network service. Must be polled regularly in order for the networking to work. -pub struct Service where TMessage: CustomMessage { - /// Stream of events of the swarm. - swarm: Swarm, Behaviour>>, - - /// Bandwidth logging system. Can be queried to know the average bandwidth consumed. - bandwidth: Arc, - - /// Information about all the nodes we're connected to. - nodes_info: FnvHashMap, - - /// Events to produce on the Stream. - injected_events: Vec>, -} - -/// Information about a node we're connected to. -#[derive(Debug)] -struct NodeInfo { - /// How we're connected to the node. - endpoint: ConnectedPoint, - /// Version reported by the remote, or `None` if unknown. - client_version: Option, - /// Latest ping time with this node. - latest_ping: Option, -} - -impl Service -where TMessage: CustomMessage + Send + 'static { - /// Returns a struct containing tons of useful information about the network. - pub fn state(&mut self) -> NetworkState { - let connected_peers = { - let swarm = &mut self.swarm; - self.nodes_info.iter().map(move |(peer_id, info)| { - let known_addresses = NetworkBehaviour::addresses_of_peer(&mut **swarm, peer_id) - .into_iter().collect(); - - (peer_id.to_base58(), NetworkStatePeer { - endpoint: info.endpoint.clone().into(), - version_string: info.client_version.clone(), - latest_ping_time: info.latest_ping, - enabled: swarm.is_enabled(&peer_id), - open: swarm.is_open(&peer_id), - known_addresses, - }) - }).collect() - }; - - let not_connected_peers = { - let swarm = &mut self.swarm; - let nodes_info = &self.nodes_info; - let list = swarm.known_peers().filter(|p| !nodes_info.contains_key(p)) - .cloned().collect::>(); - list.into_iter().map(move |peer_id| { - (peer_id.to_base58(), NetworkStateNotConnectedPeer { - known_addresses: NetworkBehaviour::addresses_of_peer(&mut **swarm, &peer_id) - .into_iter().collect(), - }) - }).collect() - }; - - NetworkState { - peer_id: Swarm::local_peer_id(&self.swarm).to_base58(), - listened_addresses: Swarm::listeners(&self.swarm).cloned().collect(), - external_addresses: Swarm::external_addresses(&self.swarm).cloned().collect(), - average_download_per_sec: self.bandwidth.average_download_per_sec(), - average_upload_per_sec: self.bandwidth.average_upload_per_sec(), - connected_peers, - not_connected_peers, - peerset: self.swarm.peerset_debug_info(), - } - } - - /// Returns an iterator that produces the list of addresses we're listening on. - #[inline] - pub fn listeners(&self) -> impl Iterator { - Swarm::listeners(&self.swarm) - } - - /// Returns the downloaded bytes per second averaged over the past few seconds. - #[inline] - pub fn average_download_per_sec(&self) -> u64 { - self.bandwidth.average_download_per_sec() - } - - /// Returns the uploaded bytes per second averaged over the past few seconds. - #[inline] - pub fn average_upload_per_sec(&self) -> u64 { - self.bandwidth.average_upload_per_sec() - } - - /// Returns the peer id of the local node. - #[inline] - pub fn peer_id(&self) -> &PeerId { - Swarm::local_peer_id(&self.swarm) - } - - /// Returns the list of all the peers we are connected to. - #[inline] - pub fn connected_peers<'a>(&'a self) -> impl Iterator + 'a { - self.nodes_info.keys() - } - - /// Returns the way we are connected to a node. - #[inline] - pub fn node_endpoint(&self, peer_id: &PeerId) -> Option<&ConnectedPoint> { - self.nodes_info.get(peer_id).map(|info| &info.endpoint) - } - - /// Returns the client version reported by a node. - pub fn node_client_version(&self, peer_id: &PeerId) -> Option<&str> { - self.nodes_info.get(peer_id) - .and_then(|info| info.client_version.as_ref().map(|s| &s[..])) - } - - /// Sends a message to a peer using the custom protocol. - /// - /// Has no effect if the connection to the node has been closed, or if the node index is - /// invalid. - pub fn send_custom_message( - &mut self, - peer_id: &PeerId, - message: TMessage - ) { - self.swarm.send_custom_message(peer_id, message); - } - - /// Disconnects a peer. - /// - /// This is asynchronous and will not immediately close the peer. - /// Corresponding closing events will be generated once the closing actually happens. - pub fn drop_node(&mut self, peer_id: &PeerId) { - if let Some(info) = self.nodes_info.get(peer_id) { - debug!(target: "sub-libp2p", "Dropping {:?} on purpose ({:?}, {:?})", - peer_id, info.endpoint, info.client_version); - self.swarm.drop_node(peer_id); - } - } - - /// Adds a hard-coded address for the given peer, that never expires. - pub fn add_known_address(&mut self, peer_id: PeerId, addr: Multiaddr) { - self.swarm.add_known_address(peer_id, addr) - } - - /// Get debug info for a given peer. - pub fn peer_debug_info(&self, who: &PeerId) -> String { - if let Some(info) = self.nodes_info.get(who) { - format!("{:?} (version: {:?}) through {:?}", who, info.client_version, info.endpoint) - } else { - "unknown".to_string() - } - } - - /// Polls for what happened on the network. - fn poll_swarm(&mut self) -> Poll>, IoError> { - loop { - match self.swarm.poll() { - Ok(Async::Ready(Some(BehaviourOut::CustomProtocolOpen { peer_id, version, endpoint }))) => { - self.nodes_info.insert(peer_id.clone(), NodeInfo { - endpoint, - client_version: None, - latest_ping: None, - }); - let debug_info = self.peer_debug_info(&peer_id); - break Ok(Async::Ready(Some(ServiceEvent::OpenedCustomProtocol { - peer_id, - version, - debug_info, - }))) - } - Ok(Async::Ready(Some(BehaviourOut::CustomProtocolClosed { peer_id, .. }))) => { - let debug_info = self.peer_debug_info(&peer_id); - self.nodes_info.remove(&peer_id); - break Ok(Async::Ready(Some(ServiceEvent::ClosedCustomProtocol { - peer_id, - debug_info, - }))) - } - Ok(Async::Ready(Some(BehaviourOut::CustomMessage { peer_id, message }))) => { - break Ok(Async::Ready(Some(ServiceEvent::CustomMessage { - peer_id, - message, - }))) - } - Ok(Async::Ready(Some(BehaviourOut::Clogged { peer_id, messages }))) => { - break Ok(Async::Ready(Some(ServiceEvent::Clogged { - peer_id, - messages, - }))) - } - Ok(Async::Ready(Some(BehaviourOut::Identified { peer_id, info }))) => { - // Contrary to the other events, this one can happen even on nodes which don't - // have any open custom protocol slot. Therefore it is not necessarily in the - // list. - if let Some(n) = self.nodes_info.get_mut(&peer_id) { - n.client_version = Some(info.agent_version); - } - } - Ok(Async::Ready(Some(BehaviourOut::PingSuccess { peer_id, ping_time }))) => { - // Contrary to the other events, this one can happen even on nodes which don't - // have any open custom protocol slot. Therefore it is not necessarily in the - // list. - if let Some(n) = self.nodes_info.get_mut(&peer_id) { - n.latest_ping = Some(ping_time); - } - } - Ok(Async::NotReady) => break Ok(Async::NotReady), - Ok(Async::Ready(None)) => unreachable!("The Swarm stream never ends"), - Err(_) => unreachable!("The Swarm never errors"), - } - } - } -} - -impl Stream for Service where TMessage: CustomMessage + Send + 'static { - type Item = ServiceEvent; - type Error = IoError; - - fn poll(&mut self) -> Poll, Self::Error> { - if !self.injected_events.is_empty() { - return Ok(Async::Ready(Some(self.injected_events.remove(0)))); - } - - match self.poll_swarm()? { - Async::Ready(value) => return Ok(Async::Ready(value)), - Async::NotReady => (), - } - - // The only way we reach this is if we went through all the `NotReady` paths above, - // ensuring the current task is registered everywhere. - Ok(Async::NotReady) - } -} diff --git a/core/network-libp2p/src/transport.rs b/core/network-libp2p/src/transport.rs deleted file mode 100644 index 1e8b280f3b089fd49bca1c6775c998fa5b569794..0000000000000000000000000000000000000000 --- a/core/network-libp2p/src/transport.rs +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. -// This file is part of Substrate. - -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - -use futures::prelude::*; -use libp2p::{ - InboundUpgradeExt, OutboundUpgradeExt, PeerId, Transport, - mplex, identity, secio, yamux, websocket, bandwidth -}; -#[cfg(not(target_os = "unknown"))] -use libp2p::{tcp, dns}; -use libp2p::core::{self, transport::boxed::Boxed, muxing::StreamMuxerBox}; -use std::{io, sync::Arc, time::Duration, usize}; - -pub use self::bandwidth::BandwidthSinks; - -/// Builds the transport that serves as a common ground for all connections. -/// -/// Returns a `BandwidthSinks` object that allows querying the average bandwidth produced by all -/// the connections spawned with this transport. -pub fn build_transport( - keypair: identity::Keypair -) -> (Boxed<(PeerId, StreamMuxerBox), io::Error>, Arc) { - let mut mplex_config = mplex::MplexConfig::new(); - mplex_config.max_buffer_len_behaviour(mplex::MaxBufferBehaviour::Block); - mplex_config.max_buffer_len(usize::MAX); - - #[cfg(not(target_os = "unknown"))] - let transport = { - let transport = tcp::TcpConfig::new(); - let transport = websocket::WsConfig::new(transport.clone()).or_transport(transport); - dns::DnsConfig::new(transport) - }; - #[cfg(target_os = "unknown")] - let transport = websocket::BrowserWsConfig::new(); - - let (transport, sinks) = bandwidth::BandwidthLogging::new(transport, Duration::from_secs(5)); - - // TODO: rework the transport creation (https://github.com/libp2p/rust-libp2p/issues/783) - let transport = transport - .with_upgrade(secio::SecioConfig::new(keypair)) - .and_then(move |out, endpoint| { - let peer_id = out.remote_key.into_peer_id(); - let peer_id2 = peer_id.clone(); - let upgrade = core::upgrade::SelectUpgrade::new(yamux::Config::default(), mplex_config) - .map_inbound(move |muxer| (peer_id, muxer)) - .map_outbound(move |muxer| (peer_id2, muxer)); - - core::upgrade::apply(out.stream, upgrade, endpoint) - .map(|(id, muxer)| (id, core::muxing::StreamMuxerBox::new(muxer))) - }) - .with_timeout(Duration::from_secs(20)) - .map_err(|err| io::Error::new(io::ErrorKind::Other, err)) - .boxed(); - - (transport, sinks) -} diff --git a/core/network-libp2p/tests/test.rs b/core/network-libp2p/tests/test.rs deleted file mode 100644 index 04206e66d84e8ab900a5ba5f0e4e47787206de9e..0000000000000000000000000000000000000000 --- a/core/network-libp2p/tests/test.rs +++ /dev/null @@ -1,359 +0,0 @@ -// Copyright 2019 Parity Technologies (UK) Ltd. -// This file is part of Substrate. - -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - -use futures::{future, stream, prelude::*, try_ready}; -use rand::seq::SliceRandom; -use std::{io, time::Duration, time::Instant}; -use substrate_network_libp2p::{CustomMessage, Multiaddr, multiaddr::Protocol, ServiceEvent, build_multiaddr}; - -/// Builds two services. The second one and further have the first one as its bootstrap node. -/// This is to be used only for testing, and a panic will happen if something goes wrong. -fn build_nodes(num: usize, base_port: u16) -> Vec> - where TMsg: CustomMessage + Send + 'static -{ - let mut result: Vec> = Vec::with_capacity(num); - let mut first_addr = None::; - - for index in 0 .. num { - let mut boot_nodes = Vec::new(); - - if let Some(first_addr) = first_addr.as_ref() { - boot_nodes.push(first_addr.clone() - .with(Protocol::P2p(result[0].peer_id().clone().into())) - .to_string()); - } - - let config = substrate_network_libp2p::NetworkConfiguration { - listen_addresses: vec![build_multiaddr![Ip4([127, 0, 0, 1]), Tcp(base_port + index as u16)]], - boot_nodes, - ..substrate_network_libp2p::NetworkConfiguration::default() - }; - - if first_addr.is_none() { - first_addr = Some(config.listen_addresses.iter().next().unwrap().clone()); - } - - let proto = substrate_network_libp2p::RegisteredProtocol::new(&b"tst"[..], &[1]); - result.push(substrate_network_libp2p::start_service(config, proto).unwrap().0); - } - - result -} - -#[test] -fn basic_two_nodes_connectivity() { - let (mut service1, mut service2) = { - let mut l = build_nodes::>(2, 50400).into_iter(); - let a = l.next().unwrap(); - let b = l.next().unwrap(); - (a, b) - }; - - let fut1 = future::poll_fn(move || -> io::Result<_> { - match try_ready!(service1.poll()) { - Some(ServiceEvent::OpenedCustomProtocol { version, .. }) => { - assert_eq!(version, 1); - Ok(Async::Ready(())) - }, - _ => panic!(), - } - }); - - let fut2 = future::poll_fn(move || -> io::Result<_> { - match try_ready!(service2.poll()) { - Some(ServiceEvent::OpenedCustomProtocol { version, .. }) => { - assert_eq!(version, 1); - Ok(Async::Ready(())) - }, - _ => panic!(), - } - }); - - let combined = fut1.select(fut2).map_err(|(err, _)| err); - tokio::runtime::Runtime::new().unwrap().block_on_all(combined).unwrap(); -} - -#[test] -fn two_nodes_transfer_lots_of_packets() { - // We spawn two nodes, then make the first one send lots of packets to the second one. The test - // ends when the second one has received all of them. - - // Note that if we go too high, we will reach the limit to the number of simultaneous - // substreams allowed by the multiplexer. - const NUM_PACKETS: u32 = 5000; - - let (mut service1, mut service2) = { - let mut l = build_nodes::>(2, 50450).into_iter(); - let a = l.next().unwrap(); - let b = l.next().unwrap(); - (a, b) - }; - - let fut1 = future::poll_fn(move || -> io::Result<_> { - loop { - match try_ready!(service1.poll()) { - Some(ServiceEvent::OpenedCustomProtocol { peer_id, .. }) => { - for n in 0 .. NUM_PACKETS { - service1.send_custom_message(&peer_id, vec![(n % 256) as u8]); - } - }, - _ => panic!(), - } - } - }); - - let mut packet_counter = 0u32; - let fut2 = future::poll_fn(move || -> io::Result<_> { - loop { - match try_ready!(service2.poll()) { - Some(ServiceEvent::OpenedCustomProtocol { .. }) => {}, - Some(ServiceEvent::CustomMessage { message, .. }) => { - assert_eq!(message.len(), 1); - packet_counter += 1; - if packet_counter == NUM_PACKETS { - return Ok(Async::Ready(())) - } - } - _ => panic!(), - } - } - }); - - let combined = fut1.select(fut2).map_err(|(err, _)| err); - tokio::runtime::Runtime::new().unwrap().block_on(combined).unwrap(); -} - -#[test] -fn many_nodes_connectivity() { - // Creates many nodes, then make sure that they are all connected to each other. - // Note: if you increase this number, keep in mind that there's a limit to the number of - // simultaneous connections which will make the test fail if it is reached. This can be - // increased in the `NetworkConfiguration`. - const NUM_NODES: usize = 25; - - let mut futures = build_nodes::>(NUM_NODES, 50500) - .into_iter() - .map(move |mut node| { - let mut num_connecs = 0; - stream::poll_fn(move || -> io::Result<_> { - loop { - const MAX_BANDWIDTH: u64 = NUM_NODES as u64 * 1024; // 1kiB/s/node - assert!(node.average_download_per_sec() < MAX_BANDWIDTH); - assert!(node.average_upload_per_sec() < MAX_BANDWIDTH); - - match try_ready!(node.poll()) { - Some(ServiceEvent::OpenedCustomProtocol { .. }) => { - num_connecs += 1; - assert!(num_connecs < NUM_NODES); - if num_connecs == NUM_NODES - 1 { - return Ok(Async::Ready(Some(true))) - } - } - Some(ServiceEvent::ClosedCustomProtocol { .. }) => { - let was_success = num_connecs == NUM_NODES - 1; - num_connecs -= 1; - if was_success && num_connecs < NUM_NODES - 1 { - return Ok(Async::Ready(Some(false))) - } - } - _ => panic!(), - } - } - }) - }) - .collect::>(); - - let mut successes = 0; - let combined = future::poll_fn(move || -> io::Result<_> { - for node in futures.iter_mut() { - match node.poll()? { - Async::Ready(Some(true)) => successes += 1, - Async::Ready(Some(false)) => successes -= 1, - Async::Ready(None) => unreachable!(), - Async::NotReady => () - } - } - - if successes == NUM_NODES { - Ok(Async::Ready(())) - } else { - Ok(Async::NotReady) - } - }); - - tokio::runtime::Runtime::new().unwrap().block_on(combined).unwrap(); -} - -#[test] -fn basic_two_nodes_requests_in_parallel() { - let (mut service1, mut service2) = { - let mut l = build_nodes::>(2, 50550).into_iter(); - let a = l.next().unwrap(); - let b = l.next().unwrap(); - (a, b) - }; - - // Generate random messages with or without a request id. - let mut to_send = { - let mut to_send = Vec::new(); - for _ in 0..200 { // Note: don't make that number too high or the CPU usage will explode. - let msg = (0..10).map(|_| rand::random::()).collect::>(); - to_send.push(msg); - } - to_send - }; - - // Clone `to_send` in `to_receive`. Below we will remove from `to_receive` the messages we - // receive, until the list is empty. - let mut to_receive = to_send.clone(); - to_send.shuffle(&mut rand::thread_rng()); - - let fut1 = future::poll_fn(move || -> io::Result<_> { - loop { - match try_ready!(service1.poll()) { - Some(ServiceEvent::OpenedCustomProtocol { peer_id, .. }) => { - for msg in to_send.drain(..) { - service1.send_custom_message(&peer_id, msg); - } - }, - _ => panic!(), - } - } - }); - - let fut2 = future::poll_fn(move || -> io::Result<_> { - loop { - match try_ready!(service2.poll()) { - Some(ServiceEvent::OpenedCustomProtocol { .. }) => {}, - Some(ServiceEvent::CustomMessage { message, .. }) => { - let pos = to_receive.iter().position(|m| *m == message).unwrap(); - to_receive.remove(pos); - if to_receive.is_empty() { - return Ok(Async::Ready(())) - } - } - _ => panic!(), - } - } - }); - - let combined = fut1.select(fut2).map_err(|(err, _)| err); - tokio::runtime::Runtime::new().unwrap().block_on_all(combined).unwrap(); -} - -#[test] -fn reconnect_after_disconnect() { - // We connect two nodes together, then force a disconnect (through the API of the `Service`), - // check that the disconnect worked, and finally check whether they successfully reconnect. - - let (mut service1, mut service2) = { - let mut l = build_nodes::>(2, 50350).into_iter(); - let a = l.next().unwrap(); - let b = l.next().unwrap(); - (a, b) - }; - - // We use the `current_thread` runtime because it doesn't require us to have `'static` futures. - let mut runtime = tokio::runtime::current_thread::Runtime::new().unwrap(); - - // For this test, the services can be in the following states. - #[derive(Debug, Copy, Clone, PartialEq, Eq)] - enum ServiceState { NotConnected, FirstConnec, Disconnected, ConnectedAgain } - let mut service1_state = ServiceState::NotConnected; - let mut service2_state = ServiceState::NotConnected; - - // Run the events loops. - runtime.block_on(future::poll_fn(|| -> Result<_, io::Error> { - loop { - let mut service1_not_ready = false; - - match service1.poll().unwrap() { - Async::Ready(Some(ServiceEvent::OpenedCustomProtocol { .. })) => { - match service1_state { - ServiceState::NotConnected => { - service1_state = ServiceState::FirstConnec; - if service2_state == ServiceState::FirstConnec { - service1.drop_node(service2.peer_id()); - } - }, - ServiceState::Disconnected => service1_state = ServiceState::ConnectedAgain, - ServiceState::FirstConnec | ServiceState::ConnectedAgain => panic!(), - } - }, - Async::Ready(Some(ServiceEvent::ClosedCustomProtocol { .. })) => { - match service1_state { - ServiceState::FirstConnec => service1_state = ServiceState::Disconnected, - ServiceState::ConnectedAgain| ServiceState::NotConnected | - ServiceState::Disconnected => panic!(), - } - }, - Async::NotReady => service1_not_ready = true, - _ => panic!() - } - - match service2.poll().unwrap() { - Async::Ready(Some(ServiceEvent::OpenedCustomProtocol { .. })) => { - match service2_state { - ServiceState::NotConnected => { - service2_state = ServiceState::FirstConnec; - if service1_state == ServiceState::FirstConnec { - service1.drop_node(service2.peer_id()); - } - }, - ServiceState::Disconnected => service2_state = ServiceState::ConnectedAgain, - ServiceState::FirstConnec | ServiceState::ConnectedAgain => panic!(), - } - }, - Async::Ready(Some(ServiceEvent::ClosedCustomProtocol { .. })) => { - match service2_state { - ServiceState::FirstConnec => service2_state = ServiceState::Disconnected, - ServiceState::ConnectedAgain| ServiceState::NotConnected | - ServiceState::Disconnected => panic!(), - } - }, - Async::NotReady if service1_not_ready => break, - Async::NotReady => {} - _ => panic!() - } - } - - if service1_state == ServiceState::ConnectedAgain && service2_state == ServiceState::ConnectedAgain { - Ok(Async::Ready(())) - } else { - Ok(Async::NotReady) - } - })).unwrap(); - - // Do a second 3-seconds run to make sure we don't get disconnected immediately again. - let mut delay = tokio::timer::Delay::new(Instant::now() + Duration::from_secs(3)); - runtime.block_on(future::poll_fn(|| -> Result<_, io::Error> { - match service1.poll().unwrap() { - Async::NotReady => {}, - _ => panic!() - } - - match service2.poll().unwrap() { - Async::NotReady => {}, - _ => panic!() - } - - if let Async::Ready(()) = delay.poll().unwrap() { - Ok(Async::Ready(())) - } else { - Ok(Async::NotReady) - } - })).unwrap(); -} diff --git a/core/network/Cargo.toml b/core/network/Cargo.toml index ca898eea0783cac318080647fedba5c1b7f2be73..56a69039c380898eca6f818ff8728f0c5e0b6161 100644 --- a/core/network/Cargo.toml +++ b/core/network/Cargo.toml @@ -6,39 +6,54 @@ license = "GPL-3.0" authors = ["Parity Technologies "] edition = "2018" -[lib] - [dependencies] -crossbeam-channel = "0.3.6" +bytes = "0.4" +derive_more = "0.14.0" log = "0.4" -parking_lot = "0.7.1" -error-chain = "0.12" +parking_lot = "0.8.0" bitflags = "1.0" +fnv = "1.0" futures = "0.1.17" linked-hash-map = "0.5" linked_hash_set = "0.1.3" lru-cache = "0.1.1" rustc-hex = "2.0" rand = "0.6" +libp2p = { version = "0.9.1", default-features = false, features = ["secp256k1", "libp2p-websocket"] } fork-tree = { path = "../../core/util/fork-tree" } primitives = { package = "substrate-primitives", path = "../../core/primitives" } consensus = { package = "substrate-consensus-common", path = "../../core/consensus/common" } client = { package = "substrate-client", path = "../../core/client" } runtime_primitives = { package = "sr-primitives", path = "../../core/sr-primitives" } parity-codec = { version = "3.3", features = ["derive"] } -network_libp2p = { package = "substrate-network-libp2p", path = "../../core/network-libp2p" } peerset = { package = "substrate-peerset", path = "../../core/peerset" } -tokio = "0.1.11" +serde = { version = "1.0.70", features = ["derive"] } +serde_json = "1.0.24" +slog = { version = "^2", features = ["nested-values"] } +slog_derive = "0.1.1" +smallvec = "0.6" +tokio-io = "0.1" +tokio-timer = "0.2.11" +tokio = { version = "0.1.11", optional = true } +unsigned-varint = { version = "0.2.1", features = ["codec"] } keyring = { package = "substrate-keyring", path = "../../core/keyring", optional = true } test_client = { package = "substrate-test-client", path = "../../core/test-client", optional = true } +test-client = { package = "substrate-test-runtime-client", path = "../../core/test-runtime/client", optional = true } +erased-serde = "0.3.9" void = "1.0" +zeroize = "0.6.0" [dev-dependencies] env_logger = { version = "0.6" } keyring = { package = "substrate-keyring", path = "../../core/keyring" } -test_client = { package = "substrate-test-client", path = "../../core/test-client" } +quickcheck = "0.8.5" +rand = "0.6.5" +test-client = { package = "substrate-test-runtime-client", path = "../../core/test-runtime/client" } +test_runtime = { package = "substrate-test-runtime", path = "../../core/test-runtime" } consensus = { package = "substrate-consensus-common", path = "../../core/consensus/common", features = ["test-helpers"] } +tempdir = "0.3" +tokio = "0.1.11" [features] default = [] -test-helpers = ["keyring", "test_client", "consensus/test-helpers"] +test-helpers = ["keyring", "test-client", "consensus/test-helpers", "tokio"] diff --git a/core/network/src/behaviour.rs b/core/network/src/behaviour.rs new file mode 100644 index 0000000000000000000000000000000000000000..35684bc2571edbd22200781835a7536b78c9d07b --- /dev/null +++ b/core/network/src/behaviour.rs @@ -0,0 +1,255 @@ +// Copyright 2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +use crate::{debug_info, discovery::DiscoveryBehaviour, discovery::DiscoveryOut, DiscoveryNetBehaviour}; +use futures::prelude::*; +use libp2p::NetworkBehaviour; +use libp2p::core::{Multiaddr, PeerId, ProtocolsHandler, protocols_handler::IntoProtocolsHandler, PublicKey}; +use libp2p::core::swarm::{ConnectedPoint, NetworkBehaviour, NetworkBehaviourAction}; +use libp2p::core::swarm::{NetworkBehaviourEventProcess, PollParameters}; +#[cfg(not(target_os = "unknown"))] +use libp2p::core::swarm::toggle::Toggle; +#[cfg(not(target_os = "unknown"))] +use libp2p::mdns::{Mdns, MdnsEvent}; +use log::warn; +use std::iter; +use void; + +/// General behaviour of the network. +#[derive(NetworkBehaviour)] +#[behaviour(out_event = "TBehaviourEv", poll_method = "poll")] +pub struct Behaviour { + /// Main protocol that handles everything except the discovery and the technicalities. + user_protocol: UserBehaviourWrap, + /// Periodically pings and identifies the nodes we are connected to, and store information in a + /// cache. + debug_info: debug_info::DebugInfoBehaviour, + /// Discovers nodes of the network. Defined below. + discovery: DiscoveryBehaviour, + /// Discovers nodes on the local network. + #[cfg(not(target_os = "unknown"))] + mdns: Toggle>, + + /// Queue of events to produce for the outside. + #[behaviour(ignore)] + events: Vec, +} + +impl Behaviour { + /// Builds a new `Behaviour`. + pub fn new( + user_protocol: TBehaviour, + user_agent: String, + local_public_key: PublicKey, + known_addresses: Vec<(PeerId, Multiaddr)>, + enable_mdns: bool, + ) -> Self { + let debug_info = debug_info::DebugInfoBehaviour::new(user_agent, local_public_key.clone()); + + if enable_mdns { + #[cfg(target_os = "unknown")] + warn!(target: "sub-libp2p", "mDNS is not available on this platform"); + } + + Behaviour { + user_protocol: UserBehaviourWrap(user_protocol), + debug_info, + discovery: DiscoveryBehaviour::new(local_public_key, known_addresses), + #[cfg(not(target_os = "unknown"))] + mdns: if enable_mdns { + match Mdns::new() { + Ok(mdns) => Some(mdns).into(), + Err(err) => { + warn!(target: "sub-libp2p", "Failed to initialize mDNS: {:?}", err); + None.into() + } + } + } else { + None.into() + }, + events: Vec::new(), + } + } + + /// Returns the list of nodes that we know exist in the network. + pub fn known_peers(&mut self) -> impl Iterator { + self.discovery.known_peers() + } + + /// Adds a hard-coded address for the given peer, that never expires. + pub fn add_known_address(&mut self, peer_id: PeerId, addr: Multiaddr) { + self.discovery.add_known_address(peer_id, addr) + } + + /// Borrows `self` and returns a struct giving access to the information about a node. + /// + /// Returns `None` if we don't know anything about this node. Always returns `Some` for nodes + /// we're connected to, meaning that if `None` is returned then we're not connected to that + /// node. + pub fn node(&self, peer_id: &PeerId) -> Option { + self.debug_info.node(peer_id) + } + + /// Returns a shared reference to the user protocol. + pub fn user_protocol(&self) -> &TBehaviour { + &self.user_protocol.0 + } + + /// Returns a mutable reference to the user protocol. + pub fn user_protocol_mut(&mut self) -> &mut TBehaviour { + &mut self.user_protocol.0 + } +} + +impl NetworkBehaviourEventProcess for +Behaviour { + fn inject_event(&mut self, event: void::Void) { + void::unreachable(event) + } +} + +impl NetworkBehaviourEventProcess> for +Behaviour { + fn inject_event(&mut self, event: UserEventWrap) { + self.events.push(event.0); + } +} + +impl NetworkBehaviourEventProcess + for Behaviour + where TBehaviour: DiscoveryNetBehaviour { + fn inject_event(&mut self, event: debug_info::DebugInfoEvent) { + let debug_info::DebugInfoEvent::Identified { peer_id, mut info } = event; + if !info.protocol_version.contains("substrate") { + warn!(target: "sub-libp2p", "Connected to a non-Substrate node: {:?}", info); + } + if info.listen_addrs.len() > 30 { + warn!(target: "sub-libp2p", "Node {:?} has reported more than 30 addresses; \ + it is identified by {:?} and {:?}", peer_id, info.protocol_version, + info.agent_version + ); + info.listen_addrs.truncate(30); + } + for addr in &info.listen_addrs { + self.discovery.add_self_reported_address(&peer_id, addr.clone()); + } + self.user_protocol.0.add_discovered_nodes(iter::once(peer_id.clone())); + } +} + +impl NetworkBehaviourEventProcess + for Behaviour + where TBehaviour: DiscoveryNetBehaviour { + fn inject_event(&mut self, out: DiscoveryOut) { + match out { + DiscoveryOut::Discovered(peer_id) => { + self.user_protocol.0.add_discovered_nodes(iter::once(peer_id)); + } + } + } +} + +#[cfg(not(target_os = "unknown"))] +impl NetworkBehaviourEventProcess for + Behaviour + where TBehaviour: DiscoveryNetBehaviour { + fn inject_event(&mut self, event: MdnsEvent) { + match event { + MdnsEvent::Discovered(list) => { + self.user_protocol.0.add_discovered_nodes(list.into_iter().map(|(peer_id, _)| peer_id)); + }, + MdnsEvent::Expired(_) => {} + } + } +} + +impl Behaviour { + fn poll(&mut self) -> Async> { + if !self.events.is_empty() { + return Async::Ready(NetworkBehaviourAction::GenerateEvent(self.events.remove(0))) + } + + Async::NotReady + } +} + +/// Because of limitations with the network behaviour custom derive and trait impl duplication, we +/// have to wrap the user protocol into a struct. +pub struct UserBehaviourWrap(TInner); +/// Event produced by `UserBehaviourWrap`. +pub struct UserEventWrap(TInner); +impl NetworkBehaviour for UserBehaviourWrap { + type ProtocolsHandler = TInner::ProtocolsHandler; + type OutEvent = UserEventWrap; + fn new_handler(&mut self) -> Self::ProtocolsHandler { self.0.new_handler() } + fn addresses_of_peer(&mut self, peer_id: &PeerId) -> Vec { + self.0.addresses_of_peer(peer_id) + } + fn inject_connected(&mut self, peer_id: PeerId, endpoint: ConnectedPoint) { + self.0.inject_connected(peer_id, endpoint) + } + fn inject_disconnected(&mut self, peer_id: &PeerId, endpoint: ConnectedPoint) { + self.0.inject_disconnected(peer_id, endpoint) + } + fn inject_node_event( + &mut self, + peer_id: PeerId, + event: <::Handler as ProtocolsHandler>::OutEvent + ) { + self.0.inject_node_event(peer_id, event) + } + fn poll( + &mut self, + params: &mut PollParameters + ) -> Async< + NetworkBehaviourAction< + <::Handler as ProtocolsHandler>::InEvent, + Self::OutEvent + > + > { + match self.0.poll(params) { + Async::NotReady => Async::NotReady, + Async::Ready(NetworkBehaviourAction::GenerateEvent(ev)) => + Async::Ready(NetworkBehaviourAction::GenerateEvent(UserEventWrap(ev))), + Async::Ready(NetworkBehaviourAction::DialAddress { address }) => + Async::Ready(NetworkBehaviourAction::DialAddress { address }), + Async::Ready(NetworkBehaviourAction::DialPeer { peer_id }) => + Async::Ready(NetworkBehaviourAction::DialPeer { peer_id }), + Async::Ready(NetworkBehaviourAction::SendEvent { peer_id, event }) => + Async::Ready(NetworkBehaviourAction::SendEvent { peer_id, event }), + Async::Ready(NetworkBehaviourAction::ReportObservedAddr { address }) => + Async::Ready(NetworkBehaviourAction::ReportObservedAddr { address }), + } + } + fn inject_replaced(&mut self, peer_id: PeerId, closed_endpoint: ConnectedPoint, new_endpoint: ConnectedPoint) { + self.0.inject_replaced(peer_id, closed_endpoint, new_endpoint) + } + fn inject_addr_reach_failure(&mut self, peer_id: Option<&PeerId>, addr: &Multiaddr, error: &dyn std::error::Error) { + self.0.inject_addr_reach_failure(peer_id, addr, error) + } + fn inject_dial_failure(&mut self, peer_id: &PeerId) { + self.0.inject_dial_failure(peer_id) + } + fn inject_new_listen_addr(&mut self, addr: &Multiaddr) { + self.0.inject_new_listen_addr(addr) + } + fn inject_expired_listen_addr(&mut self, addr: &Multiaddr) { + self.0.inject_expired_listen_addr(addr) + } + fn inject_new_external_addr(&mut self, addr: &Multiaddr) { + self.0.inject_new_external_addr(addr) + } +} diff --git a/core/network/src/chain.rs b/core/network/src/chain.rs index 92236e7c6384860a58ff93751b1483b306f979cf..76096a44aae6139f08c1489eddf88f9dc338e293 100644 --- a/core/network/src/chain.rs +++ b/core/network/src/chain.rs @@ -28,7 +28,7 @@ use primitives::{H256, Blake2Hasher, storage::StorageKey}; /// Local client abstraction for the network. pub trait Client: Send + Sync { /// Get blockchain info. - fn info(&self) -> Result, Error>; + fn info(&self) -> ClientInfo; /// Get block status. fn block_status(&self, id: &BlockId) -> Result; @@ -68,6 +68,12 @@ pub trait Client: Send + Sync { fn is_descendent_of(&self, base: &Block::Hash, block: &Block::Hash) -> Result; } +/// Finality proof provider. +pub trait FinalityProofProvider: Send + Sync { + /// Prove finality of the block. + fn prove_finality(&self, for_block: Block::Hash, request: &[u8]) -> Result>, Error>; +} + impl Client for SubstrateClient where B: client::backend::Backend + Send + Sync + 'static, E: CallExecutor + Send + Sync + 'static, @@ -75,7 +81,7 @@ impl Client for SubstrateClient where Block: BlockT, RA: Send + Sync { - fn info(&self) -> Result, Error> { + fn info(&self) -> ClientInfo { (self as &SubstrateClient).info() } @@ -128,6 +134,7 @@ impl Client for SubstrateClient where } let tree_route = ::client::blockchain::tree_route( + #[allow(deprecated)] self.backend().blockchain(), BlockId::Hash(*block), BlockId::Hash(*base), diff --git a/core/network/src/config.rs b/core/network/src/config.rs index 2491fc21c4c0746747a6a49d8341a3393a886c88..fd0a3a924eef1c6e6af423db14f11b9b974aa0a4 100644 --- a/core/network/src/config.rs +++ b/core/network/src/config.rs @@ -16,47 +16,46 @@ //! Configuration for the networking layer of Substrate. -pub use network_libp2p::{NonReservedPeerMode, NetworkConfiguration, NodeKeyConfig, Secret}; +pub use crate::protocol::ProtocolConfig; +use crate::ProtocolId; +use crate::chain::{Client, FinalityProofProvider}; +use crate::on_demand_layer::OnDemand; +use crate::service::{ExHashT, TransactionPool}; use bitflags::bitflags; -use crate::chain::Client; +use consensus::import_queue::ImportQueue; use parity_codec; -use crate::on_demand::OnDemandService; use runtime_primitives::traits::{Block as BlockT}; -use crate::service::{ExHashT, TransactionPool}; use std::sync::Arc; +use libp2p::identity::{Keypair, secp256k1, ed25519}; +use libp2p::wasm_ext; +use libp2p::{Multiaddr, multiaddr::Protocol}; +use std::error::Error; +use std::{io::{self, Write}, iter, fs, net::Ipv4Addr, path::{Path, PathBuf}}; +use zeroize::Zeroize; /// Service initialization parameters. pub struct Params { - /// Configuration. - pub config: ProtocolConfig, + /// Assigned roles for our node. + pub roles: Roles, /// Network layer configuration. pub network_config: NetworkConfiguration, /// Substrate relay chain access point. - pub chain: Arc>, + pub chain: Arc>, + /// Finality proof provider. + pub finality_proof_provider: Option>>, /// On-demand service reference. - pub on_demand: Option>>, + pub on_demand: Option>>, /// Transaction pool. - pub transaction_pool: Arc>, + pub transaction_pool: Arc>, + /// Name of the protocol to use on the wire. Should be different for each chain. + pub protocol_id: ProtocolId, + /// Import queue to use. + pub import_queue: Box>, /// Protocol specialization. pub specialization: S, } -/// Configuration for the Substrate-specific part of the networking layer. -#[derive(Clone)] -pub struct ProtocolConfig { - /// Assigned roles. - pub roles: Roles, -} - -impl Default for ProtocolConfig { - fn default() -> ProtocolConfig { - ProtocolConfig { - roles: Roles::FULL, - } - } -} - bitflags! { /// Bitmask of the roles that a node fulfills. pub struct Roles: u8 { @@ -71,6 +70,18 @@ bitflags! { } } +impl Roles { + /// Does this role represents a client that holds full chain data locally? + pub fn is_full(&self) -> bool { + self.intersects(Roles::FULL | Roles::AUTHORITY) + } + + /// Does this role represents a client that does not hold full chain data locally? + pub fn is_light(&self) -> bool { + !self.is_full() + } +} + impl parity_codec::Encode for Roles { fn encode_to(&self, dest: &mut T) { dest.push_byte(self.bits()) @@ -82,3 +93,282 @@ impl parity_codec::Decode for Roles { Self::from_bits(input.read_byte()?) } } + +/// Network service configuration. +#[derive(Clone)] +pub struct NetworkConfiguration { + /// Directory path to store general network configuration. None means nothing will be saved. + pub config_path: Option, + /// Directory path to store network-specific configuration. None means nothing will be saved. + pub net_config_path: Option, + /// Multiaddresses to listen for incoming connections. + pub listen_addresses: Vec, + /// Multiaddresses to advertise. Detected automatically if empty. + pub public_addresses: Vec, + /// List of initial node addresses + pub boot_nodes: Vec, + /// The node key configuration, which determines the node's network identity keypair. + pub node_key: NodeKeyConfig, + /// Maximum allowed number of incoming connections. + pub in_peers: u32, + /// Number of outgoing connections we're trying to maintain. + pub out_peers: u32, + /// List of reserved node addresses. + pub reserved_nodes: Vec, + /// The non-reserved peer mode. + pub non_reserved_mode: NonReservedPeerMode, + /// Client identifier. Sent over the wire for debugging purposes. + pub client_version: String, + /// Name of the node. Sent over the wire for debugging purposes. + pub node_name: String, + /// If true, the network will use mDNS to discover other libp2p nodes on the local network + /// and connect to them if they support the same chain. + pub enable_mdns: bool, + /// Optional external implementation of a libp2p transport. Used in WASM contexts where we need + /// some binding between the networking provided by the operating system or environment and + /// libp2p. + /// + /// This parameter exists whatever the target platform is, but it is expected to be set to + /// `Some` only when compiling for WASM. + pub wasm_external_transport: Option, +} + +impl Default for NetworkConfiguration { + fn default() -> Self { + NetworkConfiguration { + config_path: None, + net_config_path: None, + listen_addresses: Vec::new(), + public_addresses: Vec::new(), + boot_nodes: Vec::new(), + node_key: NodeKeyConfig::Ed25519(Secret::New), + in_peers: 25, + out_peers: 75, + reserved_nodes: Vec::new(), + non_reserved_mode: NonReservedPeerMode::Accept, + client_version: "unknown".into(), + node_name: "unknown".into(), + enable_mdns: false, + wasm_external_transport: None, + } + } +} + +impl NetworkConfiguration { + /// Create a new instance of default settings. + pub fn new() -> Self { + Self::default() + } + + /// Create new default configuration for localhost-only connection with random port (useful for testing) + pub fn new_local() -> NetworkConfiguration { + let mut config = NetworkConfiguration::new(); + config.listen_addresses = vec![ + iter::once(Protocol::Ip4(Ipv4Addr::new(127, 0, 0, 1))) + .chain(iter::once(Protocol::Tcp(0))) + .collect() + ]; + config + } +} + +/// The policy for connections to non-reserved peers. +#[derive(Clone, Debug, PartialEq, Eq)] +pub enum NonReservedPeerMode { + /// Accept them. This is the default. + Accept, + /// Deny them. + Deny, +} + +impl NonReservedPeerMode { + /// Attempt to parse the peer mode from a string. + pub fn parse(s: &str) -> Option { + match s { + "accept" => Some(NonReservedPeerMode::Accept), + "deny" => Some(NonReservedPeerMode::Deny), + _ => None, + } + } +} + +/// The configuration of a node's secret key, describing the type of key +/// and how it is obtained. A node's identity keypair is the result of +/// the evaluation of the node key configuration. +#[derive(Clone)] +pub enum NodeKeyConfig { + /// A Secp256k1 secret key configuration. + Secp256k1(Secret), + /// A Ed25519 secret key configuration. + Ed25519(Secret) +} + +/// The options for obtaining a Secp256k1 secret key. +pub type Secp256k1Secret = Secret; + +/// The options for obtaining a Ed25519 secret key. +pub type Ed25519Secret = Secret; + +/// The configuration options for obtaining a secret key `K`. +#[derive(Clone)] +pub enum Secret { + /// Use the given secret key `K`. + Input(K), + /// Read the secret key from a file. If the file does not exist, + /// it is created with a newly generated secret key `K`. The format + /// of the file is determined by `K`: + /// + /// * `secp256k1::SecretKey`: An unencoded 32 bytes Secp256k1 secret key. + /// * `ed25519::SecretKey`: An unencoded 32 bytes Ed25519 secret key. + File(PathBuf), + /// Always generate a new secret key `K`. + New +} + +impl NodeKeyConfig { + /// Evaluate a `NodeKeyConfig` to obtain an identity `Keypair`: + /// + /// * If the secret is configured as input, the corresponding keypair is returned. + /// + /// * If the secret is configured as a file, it is read from that file, if it exists. + /// Otherwise a new secret is generated and stored. In either case, the + /// keypair obtained from the secret is returned. + /// + /// * If the secret is configured to be new, it is generated and the corresponding + /// keypair is returned. + pub fn into_keypair(self) -> io::Result { + use NodeKeyConfig::*; + match self { + Secp256k1(Secret::New) => + Ok(Keypair::generate_secp256k1()), + + Secp256k1(Secret::Input(k)) => + Ok(Keypair::Secp256k1(k.into())), + + Secp256k1(Secret::File(f)) => + get_secret(f, + |mut b| secp256k1::SecretKey::from_bytes(&mut b), + secp256k1::SecretKey::generate, + |b| b.to_bytes().to_vec()) + .map(secp256k1::Keypair::from) + .map(Keypair::Secp256k1), + + Ed25519(Secret::New) => + Ok(Keypair::generate_ed25519()), + + Ed25519(Secret::Input(k)) => + Ok(Keypair::Ed25519(k.into())), + + Ed25519(Secret::File(f)) => + get_secret(f, + |mut b| ed25519::SecretKey::from_bytes(&mut b), + ed25519::SecretKey::generate, + |b| b.as_ref().to_vec()) + .map(ed25519::Keypair::from) + .map(Keypair::Ed25519), + } + } +} + +/// Load a secret key from a file, if it exists, or generate a +/// new secret key and write it to that file. In either case, +/// the secret key is returned. +fn get_secret(file: P, parse: F, generate: G, serialize: W) -> io::Result +where + P: AsRef, + F: for<'r> FnOnce(&'r mut [u8]) -> Result, + G: FnOnce() -> K, + E: Error + Send + Sync + 'static, + W: Fn(&K) -> Vec, +{ + std::fs::read(&file) + .and_then(|mut sk_bytes| + parse(&mut sk_bytes) + .map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))) + .or_else(|e| { + if e.kind() == io::ErrorKind::NotFound { + file.as_ref().parent().map_or(Ok(()), fs::create_dir_all)?; + let sk = generate(); + let mut sk_vec = serialize(&sk); + write_secret_file(file, &sk_vec)?; + sk_vec.zeroize(); + Ok(sk) + } else { + Err(e) + } + }) +} + +/// Write secret bytes to a file. +fn write_secret_file

(path: P, sk_bytes: &[u8]) -> io::Result<()> +where + P: AsRef +{ + let mut file = open_secret_file(&path)?; + file.write_all(sk_bytes) +} + +/// Opens a file containing a secret key in write mode. +#[cfg(unix)] +fn open_secret_file

(path: P) -> io::Result +where + P: AsRef +{ + use std::os::unix::fs::OpenOptionsExt; + fs::OpenOptions::new() + .write(true) + .create_new(true) + .mode(0o600) + .open(path) +} + +/// Opens a file containing a secret key in write mode. +#[cfg(not(unix))] +fn open_secret_file

(path: P) -> Result +where + P: AsRef +{ + fs::OpenOptions::new() + .write(true) + .create_new(true) + .open(path) +} + +#[cfg(test)] +mod tests { + use super::*; + use tempdir::TempDir; + + fn secret_bytes(kp: &Keypair) -> Vec { + match kp { + Keypair::Ed25519(p) => p.secret().as_ref().iter().cloned().collect(), + Keypair::Secp256k1(p) => p.secret().to_bytes().to_vec(), + _ => panic!("Unexpected keypair.") + } + } + + #[test] + fn test_secret_file() { + let tmp = TempDir::new("x").unwrap(); + std::fs::remove_dir(tmp.path()).unwrap(); // should be recreated + let file = tmp.path().join("x").to_path_buf(); + let kp1 = NodeKeyConfig::Ed25519(Secret::File(file.clone())).into_keypair().unwrap(); + let kp2 = NodeKeyConfig::Ed25519(Secret::File(file.clone())).into_keypair().unwrap(); + assert!(file.is_file() && secret_bytes(&kp1) == secret_bytes(&kp2)) + } + + #[test] + fn test_secret_input() { + let sk = secp256k1::SecretKey::generate(); + let kp1 = NodeKeyConfig::Secp256k1(Secret::Input(sk.clone())).into_keypair().unwrap(); + let kp2 = NodeKeyConfig::Secp256k1(Secret::Input(sk)).into_keypair().unwrap(); + assert!(secret_bytes(&kp1) == secret_bytes(&kp2)); + } + + #[test] + fn test_secret_new() { + let kp1 = NodeKeyConfig::Ed25519(Secret::New).into_keypair().unwrap(); + let kp2 = NodeKeyConfig::Ed25519(Secret::New).into_keypair().unwrap(); + assert!(secret_bytes(&kp1) != secret_bytes(&kp2)); + } +} diff --git a/core/network-libp2p/src/custom_proto/behaviour.rs b/core/network/src/custom_proto/behaviour.rs similarity index 94% rename from core/network-libp2p/src/custom_proto/behaviour.rs rename to core/network/src/custom_proto/behaviour.rs index 590ba42d952385ba196fb2ef7a72dae6a2ec23e5..975a1d2f3a030783afcfbaff2fef34ded42ae017 100644 --- a/core/network-libp2p/src/custom_proto/behaviour.rs +++ b/core/network/src/custom_proto/behaviour.rs @@ -14,6 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . +use crate::{DiscoveryNetBehaviour, ProtocolId}; use crate::custom_proto::handler::{CustomProtoHandlerProto, CustomProtoHandlerOut, CustomProtoHandlerIn}; use crate::custom_proto::upgrade::{CustomMessage, RegisteredProtocol}; use fnv::FnvHashMap; @@ -22,7 +23,8 @@ use libp2p::core::swarm::{ConnectedPoint, NetworkBehaviour, NetworkBehaviourActi use libp2p::core::{Multiaddr, PeerId}; use log::{debug, error, trace, warn}; use smallvec::SmallVec; -use std::{borrow::Cow, collections::hash_map::Entry, cmp, error, marker::PhantomData, mem, time::Duration, time::Instant}; +use std::{borrow::Cow, collections::hash_map::Entry, cmp, error, marker::PhantomData, mem}; +use std::time::{Duration, Instant}; use tokio_io::{AsyncRead, AsyncWrite}; use tokio_timer::clock::Clock; @@ -61,7 +63,7 @@ pub struct CustomProto { protocol: RegisteredProtocol, /// Receiver for instructions about who to connect to or disconnect from. - peerset: substrate_peerset::Peerset, + peerset: peerset::Peerset, /// List of peers in our state. peers: FnvHashMap, @@ -72,7 +74,7 @@ pub struct CustomProto { /// We generate indices to identify incoming connections. This is the next value for the index /// to use when a connection is incoming. - next_incoming_index: substrate_peerset::IncomingIndex, + next_incoming_index: peerset::IncomingIndex, /// Events to produce from `poll()`. events: SmallVec<[NetworkBehaviourAction, CustomProtoOut>; 4]>, @@ -153,6 +155,22 @@ enum PeerState { }, } +impl PeerState { + /// True if we have an open channel with that node. + fn is_open(&self) -> bool { + match self { + PeerState::Poisoned => false, + PeerState::Banned { .. } => false, + PeerState::PendingRequest { .. } => false, + PeerState::Requested => false, + PeerState::Disabled { open, .. } => *open, + PeerState::DisabledPendingEnable { open, .. } => *open, + PeerState::Enabled { open, .. } => *open, + PeerState::Incoming { .. } => false, + } + } +} + /// State of an "incoming" message sent to the peer set manager. #[derive(Debug)] struct IncomingPeer { @@ -162,7 +180,7 @@ struct IncomingPeer { /// connection corresponding to it has been closed or replaced already. alive: bool, /// Id that the we sent to the peerset. - incoming_id: substrate_peerset::IncomingIndex, + incoming_id: peerset::IncomingIndex, } /// Event that can be emitted by the `CustomProto`. @@ -207,21 +225,34 @@ pub enum CustomProtoOut { impl CustomProto { /// Creates a `CustomProtos`. pub fn new( - protocol: RegisteredProtocol, - peerset: substrate_peerset::Peerset, + protocol: impl Into, + versions: &[u8], + peerset: peerset::Peerset, ) -> Self { + let protocol = RegisteredProtocol::new(protocol, versions); + CustomProto { protocol, peerset, peers: FnvHashMap::default(), incoming: SmallVec::new(), - next_incoming_index: substrate_peerset::IncomingIndex(0), + next_incoming_index: peerset::IncomingIndex(0), events: SmallVec::new(), marker: PhantomData, clock: Clock::new(), } } + /// Returns the list of all the peers we have an open channel to. + pub fn open_peers<'a>(&'a self) -> impl Iterator + 'a { + self.peers.iter().filter(|(_, state)| state.is_open()).map(|(id, _)| id) + } + + /// Returns true if we have a channel open with this node. + pub fn is_open(&self, peer_id: &PeerId) -> bool { + self.peers.get(peer_id).map(|p| p.is_open()).unwrap_or(false) + } + /// Disconnects the given peer if we are connected to it. pub fn disconnect_peer(&mut self, peer_id: &PeerId) { debug!(target: "sub-libp2p", "External API => Disconnect {:?}", peer_id); @@ -312,21 +343,6 @@ impl CustomProto { } } - /// Returns true if we have opened a protocol with the given peer. - pub fn is_open(&self, peer_id: &PeerId) -> bool { - match self.peers.get(peer_id) { - None => false, - Some(PeerState::Disabled { open, .. }) => *open, - Some(PeerState::DisabledPendingEnable { open, .. }) => *open, - Some(PeerState::Enabled { open, .. }) => *open, - Some(PeerState::Incoming { .. }) => false, - Some(PeerState::Requested) => false, - Some(PeerState::PendingRequest { .. }) => false, - Some(PeerState::Banned { .. }) => false, - Some(PeerState::Poisoned) => false, - } - } - /// Sends a message to a peer. /// /// Has no effect if the custom protocol is not open with the given peer. @@ -348,14 +364,6 @@ impl CustomProto { }); } - /// Indicates to the peerset that we have discovered new addresses for a given node. - pub fn add_discovered_nodes>(&mut self, peer_ids: I) { - self.peerset.discovered(peer_ids.into_iter().map(|peer_id| { - debug!(target: "sub-libp2p", "PSM <= Discovered({:?})", peer_id); - peer_id - })); - } - /// Returns the state of the peerset manager, for debugging purposes. pub fn peerset_debug_info(&mut self) -> serde_json::Value { self.peerset.debug_info() @@ -408,7 +416,7 @@ impl CustomProto { debug!(target: "sub-libp2p", "Handler({:?}) <= Enable", occ_entry.key()); self.events.push(NetworkBehaviourAction::SendEvent { peer_id: occ_entry.key().clone(), - event: CustomProtoHandlerIn::Enable(connected_point.clone().into()), + event: CustomProtoHandlerIn::Enable, }); *occ_entry.into_mut() = PeerState::Enabled { connected_point, open }; }, @@ -426,7 +434,7 @@ impl CustomProto { debug!(target: "sub-libp2p", "Handler({:?}) <= Enable", occ_entry.key()); self.events.push(NetworkBehaviourAction::SendEvent { peer_id: occ_entry.key().clone(), - event: CustomProtoHandlerIn::Enable(connected_point.clone().into()), + event: CustomProtoHandlerIn::Enable, }); *occ_entry.into_mut() = PeerState::Enabled { connected_point, open: false }; }, @@ -510,7 +518,7 @@ impl CustomProto { } /// Function that is called when the peerset wants us to accept an incoming node. - fn peerset_report_accept(&mut self, index: substrate_peerset::IncomingIndex) { + fn peerset_report_accept(&mut self, index: peerset::IncomingIndex) { let incoming = if let Some(pos) = self.incoming.iter().position(|i| i.incoming_id == index) { self.incoming.remove(pos) } else { @@ -547,14 +555,14 @@ impl CustomProto { debug!(target: "sub-libp2p", "Handler({:?}) <= Enable", incoming.peer_id); self.events.push(NetworkBehaviourAction::SendEvent { peer_id: incoming.peer_id, - event: CustomProtoHandlerIn::Enable(connected_point.clone().into()), + event: CustomProtoHandlerIn::Enable, }); *state = PeerState::Enabled { open: false, connected_point }; } /// Function that is called when the peerset wants us to reject an incoming node. - fn peerset_report_reject(&mut self, index: substrate_peerset::IncomingIndex) { + fn peerset_report_reject(&mut self, index: peerset::IncomingIndex) { let incoming = if let Some(pos) = self.incoming.iter().position(|i| i.incoming_id == index) { self.incoming.remove(pos) } else { @@ -595,6 +603,15 @@ impl CustomProto { } } +impl DiscoveryNetBehaviour for CustomProto { + fn add_discovered_nodes(&mut self, peer_ids: impl Iterator) { + self.peerset.discovered(peer_ids.into_iter().map(|peer_id| { + debug!(target: "sub-libp2p", "PSM <= Discovered({:?})", peer_id); + peer_id + })); + } +} + impl NetworkBehaviour for CustomProto where TSubstream: AsyncRead + AsyncWrite, @@ -621,7 +638,7 @@ where debug!(target: "sub-libp2p", "Handler({:?}) <= Enable", peer_id); self.events.push(NetworkBehaviourAction::SendEvent { peer_id: peer_id.clone(), - event: CustomProtoHandlerIn::Enable(connected_point.clone().into()), + event: CustomProtoHandlerIn::Enable, }); *st = PeerState::Enabled { open: false, connected_point }; } @@ -926,16 +943,16 @@ where // Note that the peerset is a *best effort* crate, and we have to use defensive programming. loop { match self.peerset.poll() { - Ok(Async::Ready(Some(substrate_peerset::Message::Accept(index)))) => { + Ok(Async::Ready(Some(peerset::Message::Accept(index)))) => { self.peerset_report_accept(index); } - Ok(Async::Ready(Some(substrate_peerset::Message::Reject(index)))) => { + Ok(Async::Ready(Some(peerset::Message::Reject(index)))) => { self.peerset_report_reject(index); } - Ok(Async::Ready(Some(substrate_peerset::Message::Connect(id)))) => { + Ok(Async::Ready(Some(peerset::Message::Connect(id)))) => { self.peerset_report_connect(id); } - Ok(Async::Ready(Some(substrate_peerset::Message::Drop(id)))) => { + Ok(Async::Ready(Some(peerset::Message::Drop(id)))) => { self.peerset_report_disconnect(id); } Ok(Async::Ready(None)) => { @@ -972,7 +989,7 @@ where debug!(target: "sub-libp2p", "Handler({:?}) <= Enable now that ban has expired", peer_id); self.events.push(NetworkBehaviourAction::SendEvent { peer_id: peer_id.clone(), - event: CustomProtoHandlerIn::Enable(connected_point.clone().into()), + event: CustomProtoHandlerIn::Enable, }); *peer_state = PeerState::Enabled { connected_point, open }; } diff --git a/core/network-libp2p/src/custom_proto/handler.rs b/core/network/src/custom_proto/handler.rs similarity index 96% rename from core/network-libp2p/src/custom_proto/handler.rs rename to core/network/src/custom_proto/handler.rs index 2cfc1107a96b9b411d040e5a5653a14b5fcaa42a..0ec60e79cd2f87d3e9d52385d0bd8630edecc63b 100644 --- a/core/network-libp2p/src/custom_proto/handler.rs +++ b/core/network/src/custom_proto/handler.rs @@ -18,7 +18,7 @@ use crate::custom_proto::upgrade::{CustomMessage, RegisteredProtocol}; use crate::custom_proto::upgrade::{RegisteredProtocolEvent, RegisteredProtocolSubstream}; use futures::prelude::*; use libp2p::core::{ - PeerId, Endpoint, ProtocolsHandler, ProtocolsHandlerEvent, + ConnectedPoint, PeerId, Endpoint, ProtocolsHandler, ProtocolsHandlerEvent, protocols_handler::IntoProtocolsHandler, protocols_handler::KeepAlive, protocols_handler::ProtocolsHandlerUpgrErr, @@ -114,10 +114,15 @@ where { type Handler = CustomProtoHandler; - fn into_handler(self, remote_peer_id: &PeerId) -> Self::Handler { + fn inbound_protocol(&self) -> RegisteredProtocol { + self.protocol.clone() + } + + fn into_handler(self, remote_peer_id: &PeerId, connected_point: &ConnectedPoint) -> Self::Handler { let clock = Clock::new(); CustomProtoHandler { protocol: self.protocol, + endpoint: connected_point.to_endpoint(), remote_peer_id: remote_peer_id.clone(), state: ProtocolState::Init { substreams: SmallVec::new(), @@ -141,6 +146,10 @@ pub struct CustomProtoHandler { /// any influence on the behaviour. remote_peer_id: PeerId, + /// Whether we are the connection dialer or listener. Used to determine who, between the local + /// node and the remote node, has priority. + endpoint: Endpoint, + /// Queue of events to send to the outside. /// /// This queue must only ever be modified to insert elements at the back, or remove the first @@ -204,9 +213,8 @@ enum ProtocolState { /// Event that can be received by a `CustomProtoHandler`. #[derive(Debug)] pub enum CustomProtoHandlerIn { - /// The node should start using custom protocols. Contains whether we are the dialer or the - /// listener of the connection. - Enable(Endpoint), + /// The node should start using custom protocols. + Enable, /// The node should stop using custom protocols. Disable, @@ -261,7 +269,7 @@ where TMessage: CustomMessage, { /// Enables the handler. - fn enable(&mut self, endpoint: Endpoint) { + fn enable(&mut self) { self.state = match mem::replace(&mut self.state, ProtocolState::Poisoned) { ProtocolState::Poisoned => { error!(target: "sub-libp2p", "Handler with {:?} is in poisoned state", @@ -271,7 +279,7 @@ where ProtocolState::Init { substreams: incoming, .. } => { if incoming.is_empty() { - if let Endpoint::Dialer = endpoint { + if let Endpoint::Dialer = self.endpoint { self.events_queue.push(ProtocolsHandlerEvent::OutboundSubstreamRequest { protocol: SubstreamProtocol::new(self.protocol.clone()), info: (), @@ -553,7 +561,7 @@ where TSubstream: AsyncRead + AsyncWrite, TMessage: CustomMessage { fn inject_event(&mut self, message: CustomProtoHandlerIn) { match message { CustomProtoHandlerIn::Disable => self.disable(), - CustomProtoHandlerIn::Enable(endpoint) => self.enable(endpoint), + CustomProtoHandlerIn::Enable => self.enable(), CustomProtoHandlerIn::SendCustomMessage { message } => self.send_message(message), } @@ -577,7 +585,7 @@ where TSubstream: AsyncRead + AsyncWrite, TMessage: CustomMessage { ProtocolState::Init { .. } | ProtocolState::Opening { .. } | ProtocolState::Normal { .. } => KeepAlive::Yes, ProtocolState::Disabled { .. } | ProtocolState::Poisoned | - ProtocolState::KillAsap => KeepAlive::No, + ProtocolState::KillAsap => KeepAlive::No, } } diff --git a/core/network-libp2p/src/custom_proto/mod.rs b/core/network/src/custom_proto/mod.rs similarity index 93% rename from core/network-libp2p/src/custom_proto/mod.rs rename to core/network/src/custom_proto/mod.rs index 261f710d8d46b47497b32b1410211f2e1de366f0..22c66c1654968c3d1d0f541bc9d17f51859eef1a 100644 --- a/core/network-libp2p/src/custom_proto/mod.rs +++ b/core/network/src/custom_proto/mod.rs @@ -15,8 +15,9 @@ // along with Substrate. If not, see . pub use self::behaviour::{CustomProto, CustomProtoOut}; -pub use self::upgrade::{CustomMessage, RegisteredProtocol}; +pub use self::upgrade::CustomMessage; mod behaviour; mod handler; mod upgrade; +mod tests; diff --git a/core/network/src/custom_proto/tests.rs b/core/network/src/custom_proto/tests.rs new file mode 100644 index 0000000000000000000000000000000000000000..37d4db29e6887d84a71983945e22845ca8d095d5 --- /dev/null +++ b/core/network/src/custom_proto/tests.rs @@ -0,0 +1,392 @@ +// Copyright 2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +#![cfg(test)] + +use futures::{future, prelude::*, try_ready}; +use libp2p::core::{nodes::Substream, swarm::Swarm}; +use libp2p::core::{transport::boxed::Boxed, muxing::StreamMuxerBox}; +use libp2p::core::{ProtocolsHandler, protocols_handler::IntoProtocolsHandler}; +use libp2p::core::swarm::{ConnectedPoint, NetworkBehaviour, NetworkBehaviourAction}; +use libp2p::core::swarm::PollParameters; +use libp2p::{PeerId, Multiaddr, Transport}; +use rand::seq::SliceRandom; +use std::{io, time::Duration, time::Instant}; +use test_client::runtime::Block; +use crate::protocol::message::{Message as MessageAlias, generic::Message}; +use crate::custom_proto::{CustomProto, CustomProtoOut, CustomMessage}; + +/// Builds two nodes that have each other as bootstrap nodes. +/// This is to be used only for testing, and a panic will happen if something goes wrong. +fn build_nodes() +-> ( + Swarm, CustomProtoWithAddr>, + Swarm, CustomProtoWithAddr> +) { + let mut out = Vec::with_capacity(2); + + let keypairs: Vec<_> = (0..2).map(|_| libp2p::identity::Keypair::generate_ed25519()).collect(); + let addrs: Vec = (0..2) + .map(|_| format!("/memory/{}", rand::random::()).parse().unwrap()) + .collect(); + + for index in 0 .. 2 { + let transport = libp2p::core::transport::MemoryTransport + .with_upgrade(libp2p::secio::SecioConfig::new(keypairs[index].clone())) + .and_then(move |out, endpoint| { + let peer_id = out.remote_key.into_peer_id(); + libp2p::core::upgrade::apply(out.stream, libp2p::yamux::Config::default(), endpoint) + .map(|muxer| (peer_id, libp2p::core::muxing::StreamMuxerBox::new(muxer))) + }) + .with_timeout(Duration::from_secs(20)) + .map_err(|err| io::Error::new(io::ErrorKind::Other, err)) + .boxed(); + + let (peerset, _) = peerset::Peerset::from_config(peerset::PeersetConfig { + in_peers: 25, + out_peers: 25, + bootnodes: if index == 0 { + keypairs + .iter() + .skip(1) + .map(|keypair| keypair.public().into_peer_id()) + .collect() + } else { + vec![] + }, + reserved_only: false, + reserved_nodes: Vec::new(), + }); + + let behaviour = CustomProtoWithAddr { + inner: CustomProto::new(&b"test"[..], &[1], peerset), + addrs: addrs + .iter() + .enumerate() + .filter_map(|(n, a)| if n != index { + Some((keypairs[n].public().into_peer_id(), a.clone())) + } else { + None + }) + .collect(), + }; + + let mut swarm = libp2p::core::swarm::Swarm::new( + transport, + behaviour, + keypairs[index].public().into_peer_id() + ); + Swarm::listen_on(&mut swarm, addrs[index].clone()).unwrap(); + out.push(swarm); + } + + // Final output + let mut out_iter = out.into_iter(); + let first = out_iter.next().unwrap(); + let second = out_iter.next().unwrap(); + (first, second) +} + +/// Wraps around the `CustomBehaviour` network behaviour, and adds hardcoded node addresses to it. +struct CustomProtoWithAddr { + inner: CustomProto>, + addrs: Vec<(PeerId, Multiaddr)>, +} + +impl std::ops::Deref for CustomProtoWithAddr { + type Target = CustomProto>; + + fn deref(&self) -> &Self::Target { + &self.inner + } +} + +impl std::ops::DerefMut for CustomProtoWithAddr { + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.inner + } +} + +impl NetworkBehaviour for CustomProtoWithAddr { + type ProtocolsHandler = + > as NetworkBehaviour>::ProtocolsHandler; + type OutEvent = > as NetworkBehaviour>::OutEvent; + + fn new_handler(&mut self) -> Self::ProtocolsHandler { + self.inner.new_handler() + } + + fn addresses_of_peer(&mut self, peer_id: &PeerId) -> Vec { + let mut list = self.inner.addresses_of_peer(peer_id); + for (p, a) in self.addrs.iter() { + if p == peer_id { + list.push(a.clone()); + } + } + list + } + + fn inject_connected(&mut self, peer_id: PeerId, endpoint: ConnectedPoint) { + self.inner.inject_connected(peer_id, endpoint) + } + + fn inject_disconnected(&mut self, peer_id: &PeerId, endpoint: ConnectedPoint) { + self.inner.inject_disconnected(peer_id, endpoint) + } + + fn inject_node_event( + &mut self, + peer_id: PeerId, + event: <::Handler as ProtocolsHandler>::OutEvent + ) { + self.inner.inject_node_event(peer_id, event) + } + + fn poll( + &mut self, + params: &mut PollParameters + ) -> Async< + NetworkBehaviourAction< + <::Handler as ProtocolsHandler>::InEvent, + Self::OutEvent + > + > { + self.inner.poll(params) + } + + fn inject_replaced(&mut self, peer_id: PeerId, closed_endpoint: ConnectedPoint, new_endpoint: ConnectedPoint) { + self.inner.inject_replaced(peer_id, closed_endpoint, new_endpoint) + } + + fn inject_addr_reach_failure(&mut self, peer_id: Option<&PeerId>, addr: &Multiaddr, error: &dyn std::error::Error) { + self.inner.inject_addr_reach_failure(peer_id, addr, error) + } + + fn inject_dial_failure(&mut self, peer_id: &PeerId) { + self.inner.inject_dial_failure(peer_id) + } + + fn inject_new_listen_addr(&mut self, addr: &Multiaddr) { + self.inner.inject_new_listen_addr(addr) + } + + fn inject_expired_listen_addr(&mut self, addr: &Multiaddr) { + self.inner.inject_expired_listen_addr(addr) + } + + fn inject_new_external_addr(&mut self, addr: &Multiaddr) { + self.inner.inject_new_external_addr(addr) + } +} + +#[test] +fn two_nodes_transfer_lots_of_packets() { + // We spawn two nodes, then make the first one send lots of packets to the second one. The test + // ends when the second one has received all of them. + + // Note that if we go too high, we will reach the limit to the number of simultaneous + // substreams allowed by the multiplexer. + const NUM_PACKETS: u32 = 5000; + + let (mut service1, mut service2) = build_nodes::>(); + + let fut1 = future::poll_fn(move || -> io::Result<_> { + loop { + match try_ready!(service1.poll()) { + Some(CustomProtoOut::CustomProtocolOpen { peer_id, .. }) => { + for n in 0 .. NUM_PACKETS { + service1.send_packet( + &peer_id, + Message::ChainSpecific(vec![(n % 256) as u8]) + ); + } + }, + _ => panic!(), + } + } + }); + + let mut packet_counter = 0u32; + let fut2 = future::poll_fn(move || -> io::Result<_> { + loop { + match try_ready!(service2.poll()) { + Some(CustomProtoOut::CustomProtocolOpen { .. }) => {}, + Some(CustomProtoOut::CustomMessage { message: Message::ChainSpecific(message), .. }) => { + assert_eq!(message.len(), 1); + packet_counter += 1; + if packet_counter == NUM_PACKETS { + return Ok(Async::Ready(())) + } + } + _ => panic!(), + } + } + }); + + let combined = fut1.select(fut2).map_err(|(err, _)| err); + let _ = tokio::runtime::Runtime::new().unwrap().block_on(combined).unwrap(); +} + +#[test] +fn basic_two_nodes_requests_in_parallel() { + let (mut service1, mut service2) = build_nodes::>(); + + // Generate random messages with or without a request id. + let mut to_send = { + let mut to_send = Vec::new(); + for _ in 0..200 { // Note: don't make that number too high or the CPU usage will explode. + let msg = (0..10).map(|_| rand::random::()).collect::>(); + to_send.push(Message::ChainSpecific(msg)); + } + to_send + }; + + // Clone `to_send` in `to_receive`. Below we will remove from `to_receive` the messages we + // receive, until the list is empty. + let mut to_receive = to_send.clone(); + to_send.shuffle(&mut rand::thread_rng()); + + let fut1 = future::poll_fn(move || -> io::Result<_> { + loop { + match try_ready!(service1.poll()) { + Some(CustomProtoOut::CustomProtocolOpen { peer_id, .. }) => { + for msg in to_send.drain(..) { + service1.send_packet(&peer_id, msg); + } + }, + _ => panic!(), + } + } + }); + + let fut2 = future::poll_fn(move || -> io::Result<_> { + loop { + match try_ready!(service2.poll()) { + Some(CustomProtoOut::CustomProtocolOpen { .. }) => {}, + Some(CustomProtoOut::CustomMessage { message, .. }) => { + let pos = to_receive.iter().position(|m| *m == message).unwrap(); + to_receive.remove(pos); + if to_receive.is_empty() { + return Ok(Async::Ready(())) + } + } + _ => panic!(), + } + } + }); + + let combined = fut1.select(fut2).map_err(|(err, _)| err); + let _ = tokio::runtime::Runtime::new().unwrap().block_on_all(combined).unwrap(); +} + +#[test] +fn reconnect_after_disconnect() { + // We connect two nodes together, then force a disconnect (through the API of the `Service`), + // check that the disconnect worked, and finally check whether they successfully reconnect. + + let (mut service1, mut service2) = build_nodes::>(); + + // We use the `current_thread` runtime because it doesn't require us to have `'static` futures. + let mut runtime = tokio::runtime::current_thread::Runtime::new().unwrap(); + + // For this test, the services can be in the following states. + #[derive(Debug, Copy, Clone, PartialEq, Eq)] + enum ServiceState { NotConnected, FirstConnec, Disconnected, ConnectedAgain } + let mut service1_state = ServiceState::NotConnected; + let mut service2_state = ServiceState::NotConnected; + + // Run the events loops. + runtime.block_on(future::poll_fn(|| -> Result<_, io::Error> { + loop { + let mut service1_not_ready = false; + + match service1.poll().unwrap() { + Async::Ready(Some(CustomProtoOut::CustomProtocolOpen { .. })) => { + match service1_state { + ServiceState::NotConnected => { + service1_state = ServiceState::FirstConnec; + if service2_state == ServiceState::FirstConnec { + service1.disconnect_peer(Swarm::local_peer_id(&service2)); + } + }, + ServiceState::Disconnected => service1_state = ServiceState::ConnectedAgain, + ServiceState::FirstConnec | ServiceState::ConnectedAgain => panic!(), + } + }, + Async::Ready(Some(CustomProtoOut::CustomProtocolClosed { .. })) => { + match service1_state { + ServiceState::FirstConnec => service1_state = ServiceState::Disconnected, + ServiceState::ConnectedAgain| ServiceState::NotConnected | + ServiceState::Disconnected => panic!(), + } + }, + Async::NotReady => service1_not_ready = true, + _ => panic!() + } + + match service2.poll().unwrap() { + Async::Ready(Some(CustomProtoOut::CustomProtocolOpen { .. })) => { + match service2_state { + ServiceState::NotConnected => { + service2_state = ServiceState::FirstConnec; + if service1_state == ServiceState::FirstConnec { + service1.disconnect_peer(Swarm::local_peer_id(&service2)); + } + }, + ServiceState::Disconnected => service2_state = ServiceState::ConnectedAgain, + ServiceState::FirstConnec | ServiceState::ConnectedAgain => panic!(), + } + }, + Async::Ready(Some(CustomProtoOut::CustomProtocolClosed { .. })) => { + match service2_state { + ServiceState::FirstConnec => service2_state = ServiceState::Disconnected, + ServiceState::ConnectedAgain| ServiceState::NotConnected | + ServiceState::Disconnected => panic!(), + } + }, + Async::NotReady if service1_not_ready => break, + Async::NotReady => {} + _ => panic!() + } + } + + if service1_state == ServiceState::ConnectedAgain && service2_state == ServiceState::ConnectedAgain { + Ok(Async::Ready(())) + } else { + Ok(Async::NotReady) + } + })).unwrap(); + + // Do a second 3-seconds run to make sure we don't get disconnected immediately again. + let mut delay = tokio::timer::Delay::new(Instant::now() + Duration::from_secs(3)); + runtime.block_on(future::poll_fn(|| -> Result<_, io::Error> { + match service1.poll().unwrap() { + Async::NotReady => {}, + _ => panic!() + } + + match service2.poll().unwrap() { + Async::NotReady => {}, + _ => panic!() + } + + if let Async::Ready(()) = delay.poll().unwrap() { + Ok(Async::Ready(())) + } else { + Ok(Async::NotReady) + } + })).unwrap(); +} diff --git a/core/network-libp2p/src/custom_proto/upgrade.rs b/core/network/src/custom_proto/upgrade.rs similarity index 94% rename from core/network-libp2p/src/custom_proto/upgrade.rs rename to core/network/src/custom_proto/upgrade.rs index bc61ff74e89f826b0fed41cc99a8c4ef7ac0ce0a..9ede4753494c6f78312b1e6327ae17137c1bcc26 100644 --- a/core/network-libp2p/src/custom_proto/upgrade.rs +++ b/core/network/src/custom_proto/upgrade.rs @@ -62,11 +62,6 @@ impl RegisteredProtocol { marker: PhantomData, } } - - /// Returns the ID of the protocol. - pub fn id(&self) -> &ProtocolId { - &self.id - } } impl Clone for RegisteredProtocol { @@ -93,8 +88,6 @@ pub struct RegisteredProtocolSubstream { requires_poll_complete: bool, /// The underlying substream. inner: stream::Fuse, UviBytes>>>, - /// Id of the protocol. - protocol_id: ProtocolId, /// Version of the protocol that was negotiated. protocol_version: u8, /// If true, we have sent a "remote is clogged" event recently and shouldn't send another one @@ -105,14 +98,7 @@ pub struct RegisteredProtocolSubstream { } impl RegisteredProtocolSubstream { - /// Returns the protocol id. - #[inline] - pub fn protocol_id(&self) -> &ProtocolId { - &self.protocol_id - } - /// Returns the version of the protocol that was negotiated. - #[inline] pub fn protocol_version(&self) -> u8 { self.protocol_version } @@ -155,19 +141,6 @@ pub trait CustomMessage { where Self: Sized; } -// This trait implementation exist mostly for testing convenience. This should eventually be -// removed. - -impl CustomMessage for Vec { - fn into_bytes(self) -> Vec { - self - } - - fn from_bytes(bytes: &[u8]) -> Result { - Ok(bytes.to_vec()) - } -} - /// Event produced by the `RegisteredProtocolSubstream`. #[derive(Debug, Clone)] pub enum RegisteredProtocolEvent { @@ -310,7 +283,6 @@ where TSubstream: AsyncRead + AsyncWrite, send_queue: VecDeque::new(), requires_poll_complete: false, inner: framed.fuse(), - protocol_id: self.id, protocol_version: info.version, clogged_fuse: false, marker: PhantomData, @@ -338,7 +310,6 @@ where TSubstream: AsyncRead + AsyncWrite, send_queue: VecDeque::new(), requires_poll_complete: false, inner: framed.fuse(), - protocol_id: self.id, protocol_version: info.version, clogged_fuse: false, marker: PhantomData, diff --git a/core/network/src/debug_info.rs b/core/network/src/debug_info.rs new file mode 100644 index 0000000000000000000000000000000000000000..f482f13fc201ebef18ab27dda5fc952d97bf3a4b --- /dev/null +++ b/core/network/src/debug_info.rs @@ -0,0 +1,324 @@ +// Copyright 2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +use fnv::FnvHashMap; +use futures::prelude::*; +use libp2p::Multiaddr; +use libp2p::core::{either::EitherOutput, PeerId, PublicKey}; +use libp2p::core::protocols_handler::{IntoProtocolsHandler, IntoProtocolsHandlerSelect, ProtocolsHandler}; +use libp2p::core::nodes::ConnectedPoint; +use libp2p::core::swarm::{NetworkBehaviour, NetworkBehaviourAction, PollParameters}; +use libp2p::identify::{Identify, IdentifyEvent, protocol::IdentifyInfo}; +use libp2p::ping::{Ping, PingConfig, PingEvent, PingSuccess}; +use log::{debug, trace, error}; +use std::collections::hash_map::Entry; +use std::time::{Duration, Instant}; +use tokio_io::{AsyncRead, AsyncWrite}; +use tokio_timer::Interval; + +/// Time after we disconnect from a node before we purge its information from the cache. +const CACHE_EXPIRE: Duration = Duration::from_secs(10 * 60); +/// Interval at which we perform garbage collection on the node info. +const GARBAGE_COLLECT_INTERVAL: Duration = Duration::from_secs(2 * 60); + +/// Implementation of `NetworkBehaviour` that holds information about nodes in cache for diagnostic +/// purposes. +pub struct DebugInfoBehaviour { + /// Periodically ping nodes, and close the connection if it's unresponsive. + ping: Ping, + /// Periodically identifies the remote and responds to incoming requests. + identify: Identify, + /// Information that we know about all nodes. + nodes_info: FnvHashMap, + /// Interval at which we perform garbage collection in `nodes_info`. + garbage_collect: Interval, +} + +/// Information about a node we're connected to. +#[derive(Debug)] +struct NodeInfo { + /// When we will remove the entry about this node from the list, or `None` if we're connected + /// to the node. + info_expire: Option, + /// How we're connected to the node. + endpoint: ConnectedPoint, + /// Version reported by the remote, or `None` if unknown. + client_version: Option, + /// Latest ping time with this node. + latest_ping: Option, +} + +impl DebugInfoBehaviour { + /// Builds a new `DebugInfoBehaviour`. + pub fn new( + user_agent: String, + local_public_key: PublicKey, + ) -> Self { + let identify = { + let proto_version = "/substrate/1.0".to_string(); + Identify::new(proto_version, user_agent, local_public_key.clone()) + }; + + DebugInfoBehaviour { + ping: Ping::new(PingConfig::new()), + identify, + nodes_info: FnvHashMap::default(), + garbage_collect: Interval::new_interval(GARBAGE_COLLECT_INTERVAL), + } + } + + /// Borrows `self` and returns a struct giving access to the information about a node. + /// + /// Returns `None` if we don't know anything about this node. Always returns `Some` for nodes + /// we're connected to, meaning that if `None` is returned then we're not connected to that + /// node. + pub fn node(&self, peer_id: &PeerId) -> Option { + self.nodes_info.get(peer_id).map(Node) + } + + /// Inserts a ping time in the cache. Has no effect if we don't have any entry for that node, + /// which shouldn't happen. + fn handle_ping_report(&mut self, peer_id: &PeerId, ping_time: Duration) { + trace!(target: "sub-libp2p", "Ping time with {:?}: {:?}", peer_id, ping_time); + if let Some(entry) = self.nodes_info.get_mut(peer_id) { + entry.latest_ping = Some(ping_time); + } else { + error!(target: "sub-libp2p", + "Received ping from node we're not connected to {:?}", peer_id); + } + } + + /// Inserts an identify record in the cache. Has no effect if we don't have any entry for that + /// node, which shouldn't happen. + fn handle_identify_report(&mut self, peer_id: &PeerId, info: &IdentifyInfo) { + trace!(target: "sub-libp2p", "Identified {:?} => {:?}", peer_id, info); + if let Some(entry) = self.nodes_info.get_mut(peer_id) { + entry.client_version = Some(info.agent_version.clone()); + } else { + error!(target: "sub-libp2p", + "Received pong from node we're not connected to {:?}", peer_id); + } + } +} + +/// Gives access to the information about a node. +pub struct Node<'a>(&'a NodeInfo); + +impl<'a> Node<'a> { + /// Returns the endpoint we are connected to or were last connected to. + pub fn endpoint(&self) -> &'a ConnectedPoint { + &self.0.endpoint + } + + /// Returns the latest version information we know of. + pub fn client_version(&self) -> Option<&'a str> { + self.0.client_version.as_ref().map(|s| &s[..]) + } + + /// Returns the latest ping time we know of for this node. `None` if we never successfully + /// pinged this node. + pub fn latest_ping(&self) -> Option { + self.0.latest_ping + } +} + +/// Event that can be emitted by the behaviour. +#[derive(Debug)] +pub enum DebugInfoEvent { + /// We have obtained debug information from a peer, including the addresses it is listening + /// on. + Identified { + /// Id of the peer that has been identified. + peer_id: PeerId, + /// Information about the peer. + info: IdentifyInfo, + }, +} + +impl NetworkBehaviour for DebugInfoBehaviour +where TSubstream: AsyncRead + AsyncWrite { + type ProtocolsHandler = IntoProtocolsHandlerSelect< + as NetworkBehaviour>::ProtocolsHandler, + as NetworkBehaviour>::ProtocolsHandler + >; + type OutEvent = DebugInfoEvent; + + fn new_handler(&mut self) -> Self::ProtocolsHandler { + IntoProtocolsHandler::select(self.ping.new_handler(), self.identify.new_handler()) + } + + fn addresses_of_peer(&mut self, peer_id: &PeerId) -> Vec { + let mut list = self.ping.addresses_of_peer(peer_id); + list.extend_from_slice(&self.identify.addresses_of_peer(peer_id)); + list + } + + fn inject_connected(&mut self, peer_id: PeerId, endpoint: ConnectedPoint) { + self.ping.inject_connected(peer_id.clone(), endpoint.clone()); + self.identify.inject_connected(peer_id.clone(), endpoint.clone()); + + match self.nodes_info.entry(peer_id) { + Entry::Vacant(e) => { + e.insert(NodeInfo { + info_expire: None, + endpoint, + client_version: None, + latest_ping: None, + }); + } + Entry::Occupied(e) => { + let e = e.into_mut(); + if e.info_expire.as_ref().map(|exp| *exp < Instant::now()).unwrap_or(false) { + e.client_version = None; + e.latest_ping = None; + } + e.info_expire = None; + e.endpoint = endpoint; + } + } + } + + fn inject_disconnected(&mut self, peer_id: &PeerId, endpoint: ConnectedPoint) { + self.ping.inject_disconnected(peer_id, endpoint.clone()); + self.identify.inject_disconnected(peer_id, endpoint); + + if let Some(entry) = self.nodes_info.get_mut(peer_id) { + entry.info_expire = Some(Instant::now() + CACHE_EXPIRE); + } else { + error!(target: "sub-libp2p", + "Disconnected from node we were not connected to {:?}", peer_id); + } + } + + fn inject_node_event( + &mut self, + peer_id: PeerId, + event: <::Handler as ProtocolsHandler>::OutEvent + ) { + match event { + EitherOutput::First(event) => self.ping.inject_node_event(peer_id, event), + EitherOutput::Second(event) => self.identify.inject_node_event(peer_id, event), + } + } + + fn inject_replaced(&mut self, peer_id: PeerId, closed_endpoint: ConnectedPoint, new_endpoint: ConnectedPoint) { + self.ping.inject_replaced(peer_id.clone(), closed_endpoint.clone(), new_endpoint.clone()); + self.identify.inject_replaced(peer_id.clone(), closed_endpoint, new_endpoint.clone()); + + if let Some(entry) = self.nodes_info.get_mut(&peer_id) { + entry.endpoint = new_endpoint; + } else { + error!(target: "sub-libp2p", + "Disconnected from node we were not connected to {:?}", peer_id); + } + } + + fn inject_addr_reach_failure(&mut self, peer_id: Option<&PeerId>, addr: &Multiaddr, error: &dyn std::error::Error) { + self.ping.inject_addr_reach_failure(peer_id, addr, error); + self.identify.inject_addr_reach_failure(peer_id, addr, error); + } + + fn inject_dial_failure(&mut self, peer_id: &PeerId) { + self.ping.inject_dial_failure(peer_id); + self.identify.inject_dial_failure(peer_id); + } + + fn inject_new_listen_addr(&mut self, addr: &Multiaddr) { + self.ping.inject_new_listen_addr(addr); + self.identify.inject_new_listen_addr(addr); + } + + fn inject_expired_listen_addr(&mut self, addr: &Multiaddr) { + self.ping.inject_expired_listen_addr(addr); + self.identify.inject_expired_listen_addr(addr); + } + + fn inject_new_external_addr(&mut self, addr: &Multiaddr) { + self.ping.inject_new_external_addr(addr); + self.identify.inject_new_external_addr(addr); + } + + fn poll( + &mut self, + params: &mut PollParameters + ) -> Async< + NetworkBehaviourAction< + <::Handler as ProtocolsHandler>::InEvent, + Self::OutEvent + > + > { + loop { + match self.ping.poll(params) { + Async::NotReady => break, + Async::Ready(NetworkBehaviourAction::GenerateEvent(ev)) => { + if let PingEvent { peer, result: Ok(PingSuccess::Ping { rtt }) } = ev { + self.handle_ping_report(&peer, rtt) + } + }, + Async::Ready(NetworkBehaviourAction::DialAddress { address }) => + return Async::Ready(NetworkBehaviourAction::DialAddress { address }), + Async::Ready(NetworkBehaviourAction::DialPeer { peer_id }) => + return Async::Ready(NetworkBehaviourAction::DialPeer { peer_id }), + Async::Ready(NetworkBehaviourAction::SendEvent { peer_id, event }) => + return Async::Ready(NetworkBehaviourAction::SendEvent { + peer_id, + event: EitherOutput::First(event) + }), + Async::Ready(NetworkBehaviourAction::ReportObservedAddr { address }) => + return Async::Ready(NetworkBehaviourAction::ReportObservedAddr { address }), + } + } + + loop { + match self.identify.poll(params) { + Async::NotReady => break, + Async::Ready(NetworkBehaviourAction::GenerateEvent(event)) => { + match event { + IdentifyEvent::Identified { peer_id, info, .. } => { + self.handle_identify_report(&peer_id, &info); + let event = DebugInfoEvent::Identified { peer_id, info }; + return Async::Ready(NetworkBehaviourAction::GenerateEvent(event)); + } + IdentifyEvent::Error { .. } => {} + IdentifyEvent::SendBack { result: Err(ref err), ref peer_id } => + debug!(target: "sub-libp2p", "Error when sending back identify info \ + to {:?} => {}", peer_id, err), + IdentifyEvent::SendBack { .. } => {} + } + }, + Async::Ready(NetworkBehaviourAction::DialAddress { address }) => + return Async::Ready(NetworkBehaviourAction::DialAddress { address }), + Async::Ready(NetworkBehaviourAction::DialPeer { peer_id }) => + return Async::Ready(NetworkBehaviourAction::DialPeer { peer_id }), + Async::Ready(NetworkBehaviourAction::SendEvent { peer_id, event }) => + return Async::Ready(NetworkBehaviourAction::SendEvent { + peer_id, + event: EitherOutput::Second(event) + }), + Async::Ready(NetworkBehaviourAction::ReportObservedAddr { address }) => + return Async::Ready(NetworkBehaviourAction::ReportObservedAddr { address }), + } + } + + while let Ok(Async::Ready(Some(_))) = self.garbage_collect.poll() { + self.nodes_info.retain(|_, node| { + node.info_expire.as_ref().map(|exp| *exp >= Instant::now()).unwrap_or(true) + }); + } + + Async::NotReady + } +} diff --git a/core/network/src/discovery.rs b/core/network/src/discovery.rs new file mode 100644 index 0000000000000000000000000000000000000000..4e44d9fa9ec732e08eeb4f8bace3515a70194c8f --- /dev/null +++ b/core/network/src/discovery.rs @@ -0,0 +1,302 @@ +// Copyright 2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +use futures::prelude::*; +use libp2p::core::{Multiaddr, PeerId, ProtocolsHandler, PublicKey}; +use libp2p::core::swarm::{ConnectedPoint, NetworkBehaviour, NetworkBehaviourAction}; +use libp2p::core::swarm::PollParameters; +use libp2p::kad::{Kademlia, KademliaOut}; +use libp2p::multiaddr::Protocol; +use log::{debug, info, trace, warn}; +use std::{cmp, time::Duration}; +use tokio_io::{AsyncRead, AsyncWrite}; +use tokio_timer::{Delay, clock::Clock}; + +/// Implementation of `NetworkBehaviour` that discovers the nodes on the network. +pub struct DiscoveryBehaviour { + /// User-defined list of nodes and their addresses. Typically includes bootstrap nodes and + /// reserved nodes. + user_defined: Vec<(PeerId, Multiaddr)>, + /// Kademlia requests and answers. + kademlia: Kademlia, + /// Stream that fires when we need to perform the next random Kademlia query. + next_kad_random_query: Delay, + /// After `next_kad_random_query` triggers, the next one triggers after this duration. + duration_to_next_kad: Duration, + /// `Clock` instance that uses the current execution context's source of time. + clock: Clock, + /// Identity of our local node. + local_peer_id: PeerId, +} + +impl DiscoveryBehaviour { + /// Builds a new `DiscoveryBehaviour`. + /// + /// `user_defined` is a list of known address for nodes that never expire. + pub fn new(local_public_key: PublicKey, user_defined: Vec<(PeerId, Multiaddr)>) -> Self { + let mut kademlia = Kademlia::new(local_public_key.clone().into_peer_id()); + for (peer_id, addr) in &user_defined { + kademlia.add_address(peer_id, addr.clone()); + } + + let clock = Clock::new(); + DiscoveryBehaviour { + user_defined, + kademlia, + next_kad_random_query: Delay::new(clock.now()), + duration_to_next_kad: Duration::from_secs(1), + clock, + local_peer_id: local_public_key.into_peer_id(), + } + } + + /// Returns the list of nodes that we know exist in the network. + pub fn known_peers(&mut self) -> impl Iterator { + self.kademlia.kbuckets_entries() + } + + /// Adds a hard-coded address for the given peer, that never expires. + /// + /// This adds an entry to the parameter that was passed to `new`. + pub fn add_known_address(&mut self, peer_id: PeerId, addr: Multiaddr) { + if self.user_defined.iter().all(|(p, a)| *p != peer_id && *a != addr) { + self.user_defined.push((peer_id, addr)); + } + } + + /// Call this method when a node reports an address for itself. + pub fn add_self_reported_address(&mut self, peer_id: &PeerId, addr: Multiaddr) { + self.kademlia.add_address(peer_id, addr); + } +} + +/// Event generated by the `DiscoveryBehaviour`. +pub enum DiscoveryOut { + /// We have discovered a node. Can be called multiple times with the same identity. + Discovered(PeerId), +} + +impl NetworkBehaviour for DiscoveryBehaviour +where + TSubstream: AsyncRead + AsyncWrite, +{ + type ProtocolsHandler = as NetworkBehaviour>::ProtocolsHandler; + type OutEvent = DiscoveryOut; + + fn new_handler(&mut self) -> Self::ProtocolsHandler { + NetworkBehaviour::new_handler(&mut self.kademlia) + } + + fn addresses_of_peer(&mut self, peer_id: &PeerId) -> Vec { + let mut list = self.user_defined.iter() + .filter_map(|(p, a)| if p == peer_id { Some(a.clone()) } else { None }) + .collect::>(); + list.extend(self.kademlia.addresses_of_peer(peer_id)); + trace!(target: "sub-libp2p", "Addresses of {:?} are {:?}", peer_id, list); + if list.is_empty() { + if self.kademlia.kbuckets_entries().any(|p| p == peer_id) { + debug!(target: "sub-libp2p", "Requested dialing to {:?} (peer in k-buckets), \ + and no address was found", peer_id); + } else { + debug!(target: "sub-libp2p", "Requested dialing to {:?} (peer not in k-buckets), \ + and no address was found", peer_id); + } + } + list + } + + fn inject_connected(&mut self, peer_id: PeerId, endpoint: ConnectedPoint) { + NetworkBehaviour::inject_connected(&mut self.kademlia, peer_id, endpoint) + } + + fn inject_disconnected(&mut self, peer_id: &PeerId, endpoint: ConnectedPoint) { + NetworkBehaviour::inject_disconnected(&mut self.kademlia, peer_id, endpoint) + } + + fn inject_replaced(&mut self, peer_id: PeerId, closed: ConnectedPoint, opened: ConnectedPoint) { + NetworkBehaviour::inject_replaced(&mut self.kademlia, peer_id, closed, opened) + } + + fn inject_node_event( + &mut self, + peer_id: PeerId, + event: ::OutEvent, + ) { + NetworkBehaviour::inject_node_event(&mut self.kademlia, peer_id, event) + } + + fn inject_new_external_addr(&mut self, addr: &Multiaddr) { + let new_addr = addr.clone() + .with(Protocol::P2p(self.local_peer_id.clone().into())); + info!(target: "sub-libp2p", "Discovered new external address for our node: {}", new_addr); + } + + fn inject_expired_listen_addr(&mut self, addr: &Multiaddr) { + info!(target: "sub-libp2p", "No longer listening on {}", addr); + } + + fn poll( + &mut self, + params: &mut PollParameters, + ) -> Async< + NetworkBehaviourAction< + ::InEvent, + Self::OutEvent, + >, + > { + // Poll Kademlia. + match self.kademlia.poll(params) { + Async::NotReady => (), + Async::Ready(NetworkBehaviourAction::GenerateEvent(ev)) => { + match ev { + KademliaOut::Discovered { .. } => {} + KademliaOut::KBucketAdded { peer_id, .. } => { + let ev = DiscoveryOut::Discovered(peer_id); + return Async::Ready(NetworkBehaviourAction::GenerateEvent(ev)); + } + KademliaOut::FindNodeResult { key, closer_peers } => { + trace!(target: "sub-libp2p", "Libp2p => Query for {:?} yielded {:?} results", + key, closer_peers.len()); + if closer_peers.is_empty() { + warn!(target: "sub-libp2p", "Libp2p => Random Kademlia query has yielded empty \ + results"); + } + } + // We never start any other type of query. + KademliaOut::GetProvidersResult { .. } => {} + KademliaOut::GetValueResult(_) => {} + KademliaOut::PutValueResult(_) => {} + } + }, + Async::Ready(NetworkBehaviourAction::DialAddress { address }) => + return Async::Ready(NetworkBehaviourAction::DialAddress { address }), + Async::Ready(NetworkBehaviourAction::DialPeer { peer_id }) => + return Async::Ready(NetworkBehaviourAction::DialPeer { peer_id }), + Async::Ready(NetworkBehaviourAction::SendEvent { peer_id, event }) => + return Async::Ready(NetworkBehaviourAction::SendEvent { peer_id, event }), + Async::Ready(NetworkBehaviourAction::ReportObservedAddr { address }) => + return Async::Ready(NetworkBehaviourAction::ReportObservedAddr { address }), + } + + // Poll the stream that fires when we need to start a random Kademlia query. + loop { + match self.next_kad_random_query.poll() { + Ok(Async::NotReady) => break, + Ok(Async::Ready(_)) => { + let random_peer_id = PeerId::random(); + debug!(target: "sub-libp2p", "Libp2p <= Starting random Kademlia request for \ + {:?}", random_peer_id); + self.kademlia.find_node(random_peer_id); + + // Reset the `Delay` to the next random. + self.next_kad_random_query.reset(self.clock.now() + self.duration_to_next_kad); + self.duration_to_next_kad = cmp::min(self.duration_to_next_kad * 2, + Duration::from_secs(60)); + }, + Err(err) => { + warn!(target: "sub-libp2p", "Kademlia query timer errored: {:?}", err); + break + } + } + } + + Async::NotReady + } +} + +#[cfg(test)] +mod tests { + use futures::prelude::*; + use libp2p::identity::Keypair; + use libp2p::Multiaddr; + use libp2p::core::{upgrade, Swarm}; + use libp2p::core::transport::{Transport, MemoryTransport}; + use libp2p::core::upgrade::{InboundUpgradeExt, OutboundUpgradeExt}; + use std::collections::HashSet; + use super::{DiscoveryBehaviour, DiscoveryOut}; + + #[test] + fn discovery_working() { + let mut user_defined = Vec::new(); + + // Build swarms whose behaviour is `DiscoveryBehaviour`. + let mut swarms = (0..25).map(|_| { + let keypair = Keypair::generate_ed25519(); + + let transport = MemoryTransport + .with_upgrade(libp2p::secio::SecioConfig::new(keypair.clone())) + .and_then(move |out, endpoint| { + let peer_id = out.remote_key.into_peer_id(); + let peer_id2 = peer_id.clone(); + let upgrade = libp2p::yamux::Config::default() + .map_inbound(move |muxer| (peer_id, muxer)) + .map_outbound(move |muxer| (peer_id2, muxer)); + upgrade::apply(out.stream, upgrade, endpoint) + }); + + let behaviour = DiscoveryBehaviour::new(keypair.public(), user_defined.clone()); + let mut swarm = Swarm::new(transport, behaviour, keypair.public().into_peer_id()); + let listen_addr: Multiaddr = format!("/memory/{}", rand::random::()).parse().unwrap(); + + if user_defined.is_empty() { + user_defined.push((keypair.public().into_peer_id(), listen_addr.clone())); + } + + Swarm::listen_on(&mut swarm, listen_addr.clone()).unwrap(); + (swarm, listen_addr) + }).collect::>(); + + // Build a `Vec>` with the list of nodes remaining to be discovered. + let mut to_discover = (0..swarms.len()).map(|n| { + (0..swarms.len()).filter(|p| *p != n) + .map(|p| Swarm::local_peer_id(&swarms[p].0).clone()) + .collect::>() + }).collect::>(); + + let fut = futures::future::poll_fn(move || -> Result<_, ()> { + loop { + let mut keep_polling = false; + + for swarm_n in 0..swarms.len() { + if let Async::Ready(Some(DiscoveryOut::Discovered(other))) = + swarms[swarm_n].0.poll().unwrap() { + if to_discover[swarm_n].remove(&other) { + keep_polling = true; + // Call `add_self_reported_address` to simulate identify happening. + let addr = swarms.iter() + .find(|s| *Swarm::local_peer_id(&s.0) == other) + .unwrap() + .1.clone(); + swarms[swarm_n].0.add_self_reported_address(&other, addr); + } + } + } + + if !keep_polling { + break; + } + } + + if to_discover.iter().all(|l| l.is_empty()) { + Ok(Async::Ready(())) + } else { + Ok(Async::NotReady) + } + }); + + tokio::runtime::Runtime::new().unwrap().block_on(fut).unwrap(); + } +} diff --git a/core/network/src/error.rs b/core/network/src/error.rs index 87b967765cf226bc9ee1d1131d51173f44c04ee9..95a1dc5abe76b42b450835212ba9b823a2020101 100644 --- a/core/network/src/error.rs +++ b/core/network/src/error.rs @@ -14,22 +14,27 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -//! Substrate service possible errors. +//! Substrate network possible errors. -// Silence: `use of deprecated item 'std::error::Error::cause': replaced by Error::source, which can support downcasting` -// https://github.com/paritytech/substrate/issues/1547 -#![allow(deprecated)] - -use error_chain::*; -use std::io::Error as IoError; use client; -error_chain! { - foreign_links { - Io(IoError) #[doc = "IO error."]; - Client(client::error::Error) #[doc="Client error"]; - } +/// Result type alias for the network. +pub type Result = std::result::Result; + +/// Error type for the network. +#[derive(Debug, derive_more::Display, derive_more::From)] +pub enum Error { + /// Io error + Io(std::io::Error), + /// Client error + Client(client::error::Error), +} - errors { +impl std::error::Error for Error { + fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { + match self { + Error::Io(ref err) => Some(err), + Error::Client(ref err) => Some(err), + } } } diff --git a/core/network/src/lib.rs b/core/network/src/lib.rs index 4c538e2cc0ee1c201a66674c0df697336e3720ae..44ca7eab4c133f251a9d88140318c0d868a4ae96 100644 --- a/core/network/src/lib.rs +++ b/core/network/src/lib.rs @@ -17,45 +17,352 @@ #![warn(unused_extern_crates)] #![warn(missing_docs)] -//! Substrate-specific P2P networking: synchronizing blocks, propagating BFT messages. -//! Allows attachment of an optional subprotocol for chain-specific requests. +//! Substrate-specific P2P networking. //! //! **Important**: This crate is unstable and the API and usage may change. //! +//! # Node identities and addresses +//! +//! In a decentralized network, each node possesses a network private key and a network public key. +//! In Substrate, the keys are based on the ed25519 curve. As of the writing of this documentation, +//! the secp256k1 curve can also be used, but is deprecated. Our local node's keypair must be +//! passed as part of the network configuration. +//! +//! From a node's public key, we can derive its *identity*. In Substrate and libp2p, a node's +//! identity is represented with the [`PeerId`] struct. All network communications between nodes on +//! the network use encryption derived from both sides's keys, which means that **identities cannot +//! be faked**. +//! +//! A node's identity uniquely identifies a machine on the network. If you start two or more +//! clients using the same network key, large interferences will happen. +//! +//! # Substrate's network protocol +//! +//! Substrate's networking protocol is based upon libp2p. It is at the moment not possible and not +//! planned to permit using something else than the libp2p network stack and the rust-libp2p +//! library. However the libp2p framework is very flexible and the rust-libp2p library could be +//! extended to support a wider range of protocols than what is offered by libp2p. +//! +//! ## Discovery mechanisms +//! +//! In order for our node to join a peer-to-peer network, it has to know a list of nodes that are +//! part of said network. This includes nodes identities and their address (how to reach them). +//! Building such a list is called the **discovery** mechanism. There are three mechanisms that +//! Substrate uses: +//! +//! - Bootstrap nodes. These are hard-coded node identities and addresses passed alongside with +//! the network configuration. +//! - mDNS. We perform a UDP broadcast on the local network. Nodes that listen may respond with +//! their identity. More info [here](https://github.com/libp2p/specs/blob/master/discovery/mdns.md). +//! mDNS can be disabled in the network configuration. +//! - Kademlia random walk. Once connected, we perform random Kademlia `FIND_NODE` requests in +//! order for nodes to propagate to us their view of the network. More information about Kademlia +//! can be found [on Wikipedia](https://en.wikipedia.org/wiki/Kademlia). +//! +//! ## Connection establishment +//! +//! When node Alice knows node Bob's identity and address, it can establish a connection with Bob. +//! All connections must always use encryption and multiplexing. While some node addresses (eg. +//! addresses using `/quic`) already imply which encryption and/or multiplexing to use, for others +//! the **multistream-select** protocol is used in order to negotiate an encryption layer and/or a +//! multiplexing layer. +//! +//! The connection establishment mechanism is called the **transport**. +//! +//! As of the writing of this documentation, the following base-layer protocols are supported by +//! Substrate: +//! +//! - TCP/IP for addresses of the form `/ip4/1.2.3.4/tcp/5`. Once the TCP connection is open, an +//! encryption and a multiplexing layer are negotiated on top. +//! - WebSockets for addresses of the form `/ip4/1.2.3.4/tcp/5/ws`. A TCP/IP connection is open and +//! the WebSockets protocol is negotiated on top. Communications then happen inside WebSockets data +//! frames. Encryption and multiplexing are additionally negotiated again inside this channel. +//! - DNS for addresses of the form `/dns4/example.com/tcp/5` or `/dns4/example.com/tcp/5/ws`. A +//! node's address can contain a domain name. +//! +//! The following encryption protocols are supported: +//! +//! - [Secio](https://github.com/libp2p/specs/tree/master/secio). A TLS-1.2-like protocol but +//! without certificates. Support for secio will likely be deprecated in the far future. +//! - [Noise](https://noiseprotocol.org/). Support for noise is very experimental. The details are +//! very blurry and may change at any moment. +//! +//! The following multiplexing protocols are supported: +//! +//! - [Mplex](https://github.com/libp2p/specs/tree/master/mplex). Support for mplex will likely +//! be deprecated in the future. +//! - [Yamux](https://github.com/hashicorp/yamux/blob/master/spec.md). +//! +//! ## Substreams +//! +//! Once a connection has been established and uses multiplexing, substreams can be opened. When +//! a substream is open, the **multistream-select** protocol is used to negotiate which protocol to +//! use on that given substream. In practice, Substrate opens the following substreams: +//! +//! - We periodically open an ephemeral substream in order to ping the remote and check whether the +//! connection is still alive. Failure for the remote to reply leads to a disconnection. This uses +//! the libp2p ping protocol. +//! - We periodically open an ephemeral substream in order to ask information from the remote. This +//! is called [the `identify` protocol](https://github.com/libp2p/specs/tree/master/identify). +//! - We periodically open ephemeral substreams for Kademlia random walk queries. Each Kademlia +//! query is done in a new separate substream. This uses the +//! [standard libp2p Kademlia protocol](https://github.com/libp2p/specs/pull/108). +//! - We optionally keep a substream alive for all Substrate-based communications. The name of the +//! protocol negotiated is based on the *protocol ID* passed as part of the network configuration. +//! This protocol ID should be unique for each chain and prevents nodes from different chains from +//! connecting to each other. More information below. +//! +//! ## The Substrate substream +//! +//! Substrate uses a component named the **peerset manager (PSM)**. Through the discovery +//! mechanism, the PSM is aware of the nodes that are part of the network and decides which nodes +//! we should perform Substrate-based communications with. For these nodes, we open a connection +//! if necessary and open a unique substream for Substrate-based communications. If the PSM decides +//! that we should disconnect a node, then that substream is closed. +//! +//! For more information about the PSM, see the *substrate-peerset* crate. +//! +//! Note that at the moment there is no mechanism in place to solve the issues that arise where the +//! two sides of a connection open the unique substream simultaneously. In order to not run into +//! issues, only the dialer of a connection is allowed to open the unique substream. When the +//! substream is closed, the entire connection is closed as well. This is a bug, and should be +//! fixed by improving the protocol. +//! +//! Within the unique Substrate substream, messages encoded using +//! [*parity-scale-codec*](https://github.com/paritytech/parity-scale-codec) are exchanged. +//! The detail of theses messages is not totally in place, but they can be found in the +//! `message.rs` file. +//! +//! Once the substream is open, the first step is an exchange of a *status* message from both +//! sides, containing information such as the chain root hash, head of chain, and so on. +//! +//! Communications within this substream include: +//! +//! - Syncing. Blocks are announced and requested from other nodes. +//! - Light-client requests. When a light client requires information, a random node we have a +//! substream open with is chosen, and the information is requested from it. +//! - Gossiping. Used for example by grandpa. +//! - Network specialization. The network protocol can be specialized through a template parameter +//! of the network service. This specialization is free to send and receive messages with the +//! remote. This is meant to be used by the chain that is being built on top of Substrate +//! (eg. Polkadot). +//! +//! It is intended that in the future each of these components gets more isolated, so that they +//! are free to open and close their own substreams, and so that syncing and light client requests +//! are able to communicate with nodes outside of the range of the PSM. +//! +//! # Usage +//! +//! Using the `substrate-network` crate is done through the [`NetworkWorker`] struct. Create this +//! struct by passing a [`config::Params`], then poll it as if it was a `Future`. You can extract an +//! `Arc` from the `NetworkWorker`, which can be shared amongst multiple places +//! in order to give orders to the networking. +//! +//! More precise usage details are still being worked on and will likely change in the future. +//! -mod service; -mod sync; +mod behaviour; +mod chain; +mod custom_proto; +mod debug_info; +mod discovery; +mod on_demand_layer; #[macro_use] mod protocol; -mod chain; -mod blocks; -mod on_demand; -mod util; +mod protocol_behaviour; +mod service; +mod transport; + pub mod config; -pub mod consensus_gossip; pub mod error; -pub mod message; -pub mod specialization; #[cfg(any(test, feature = "test-helpers"))] pub mod test; -pub use chain::Client as ClientHandle; +pub use chain::{Client as ClientHandle, FinalityProofProvider}; pub use service::{ - Service, FetchFuture, TransactionPool, ManageNetwork, NetworkMsg, - SyncProvider, ExHashT, ReportHandle, -}; -pub use protocol::{ProtocolStatus, PeerInfo, Context}; -pub use sync::{Status as SyncStatus, SyncState}; -pub use network_libp2p::{ - identity, multiaddr, - ProtocolId, Multiaddr, - NetworkState, NetworkStatePeer, NetworkStateNotConnectedPeer, NetworkStatePeerEndpoint, - NodeKeyConfig, Secret, Secp256k1Secret, Ed25519Secret, - build_multiaddr, PeerId, PublicKey + NetworkService, NetworkWorker, FetchFuture, TransactionPool, ManageNetwork, + NetworkMsg, ExHashT, ReportHandle, }; +pub use config::{NodeKeyConfig, Secret, Secp256k1Secret, Ed25519Secret}; +pub use protocol::{PeerInfo, Context, consensus_gossip, message, specialization}; +pub use protocol::sync::SyncState; +pub use libp2p::{Multiaddr, multiaddr, build_multiaddr}; +pub use libp2p::{identity, PeerId, core::PublicKey}; + pub use message::{generic as generic_message, RequestId, Status as StatusMessage}; pub use error::Error; -pub use on_demand::{OnDemand, OnDemandService, RemoteResponse}; +pub use protocol::on_demand::AlwaysBadChecker; +pub use on_demand_layer::{OnDemand, RemoteResponse}; #[doc(hidden)] pub use runtime_primitives::traits::Block as BlockT; + +use libp2p::core::nodes::ConnectedPoint; +use serde::{Deserialize, Serialize}; +use slog_derive::SerdeValue; +use std::{collections::{HashMap, HashSet}, fmt, time::Duration}; + +/// Extension trait for `NetworkBehaviour` that also accepts discovering nodes. +pub trait DiscoveryNetBehaviour { + /// Notify the protocol that we have learned about the existence of nodes. + /// + /// Can (or most likely will) be called multiple times with the same `PeerId`s. + /// + /// Also note that there is no notification for expired nodes. The implementer must add a TTL + /// system, or remove nodes that will fail to reach. + fn add_discovered_nodes(&mut self, nodes: impl Iterator); +} + +/// Name of a protocol, transmitted on the wire. Should be unique for each chain. +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct ProtocolId(smallvec::SmallVec<[u8; 6]>); + +impl<'a> From<&'a [u8]> for ProtocolId { + fn from(bytes: &'a [u8]) -> ProtocolId { + ProtocolId(bytes.into()) + } +} + +impl ProtocolId { + /// Exposes the `ProtocolId` as bytes. + pub fn as_bytes(&self) -> &[u8] { + self.0.as_ref() + } +} + +/// Parses a string address and returns the component, if valid. +pub fn parse_str_addr(addr_str: &str) -> Result<(PeerId, Multiaddr), ParseErr> { + let mut addr: Multiaddr = addr_str.parse()?; + + let who = match addr.pop() { + Some(multiaddr::Protocol::P2p(key)) => PeerId::from_multihash(key) + .map_err(|_| ParseErr::InvalidPeerId)?, + _ => return Err(ParseErr::PeerIdMissing), + }; + + Ok((who, addr)) +} + +/// Error that can be generated by `parse_str_addr`. +#[derive(Debug)] +pub enum ParseErr { + /// Error while parsing the multiaddress. + MultiaddrParse(multiaddr::Error), + /// Multihash of the peer ID is invalid. + InvalidPeerId, + /// The peer ID is missing from the address. + PeerIdMissing, +} + +impl fmt::Display for ParseErr { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + ParseErr::MultiaddrParse(err) => write!(f, "{}", err), + ParseErr::InvalidPeerId => write!(f, "Peer id at the end of the address is invalid"), + ParseErr::PeerIdMissing => write!(f, "Peer id is missing from the address"), + } + } +} + +impl std::error::Error for ParseErr { + fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { + match self { + ParseErr::MultiaddrParse(err) => Some(err), + ParseErr::InvalidPeerId => None, + ParseErr::PeerIdMissing => None, + } + } +} + +impl From for ParseErr { + fn from(err: multiaddr::Error) -> ParseErr { + ParseErr::MultiaddrParse(err) + } +} + +/// Returns general information about the networking. +/// +/// Meant for general diagnostic purposes. +/// +/// **Warning**: This API is not stable. +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, SerdeValue)] +#[serde(rename_all = "camelCase")] +pub struct NetworkState { + /// PeerId of the local node. + pub peer_id: String, + /// List of addresses the node is currently listening on. + pub listened_addresses: HashSet, + /// List of addresses the node knows it can be reached as. + pub external_addresses: HashSet, + /// List of node we're connected to. + pub connected_peers: HashMap, + /// List of node that we know of but that we're not connected to. + pub not_connected_peers: HashMap, + /// Downloaded bytes per second averaged over the past few seconds. + pub average_download_per_sec: u64, + /// Uploaded bytes per second averaged over the past few seconds. + pub average_upload_per_sec: u64, + /// State of the peerset manager. + pub peerset: serde_json::Value, +} + +/// Part of the `NetworkState` struct. Unstable. +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct NetworkStatePeer { + /// How we are connected to the node. + pub endpoint: NetworkStatePeerEndpoint, + /// Node information, as provided by the node itself. Can be empty if not known yet. + pub version_string: Option, + /// Latest ping duration with this node. + pub latest_ping_time: Option, + /// If true, the peer is "enabled", which means that we try to open Substrate-related protocols + /// with this peer. If false, we stick to Kademlia and/or other network-only protocols. + pub enabled: bool, + /// If true, the peer is "open", which means that we have a Substrate-related protocol + /// with this peer. + pub open: bool, + /// List of addresses known for this node. + pub known_addresses: HashSet, +} + +/// Part of the `NetworkState` struct. Unstable. +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct NetworkStateNotConnectedPeer { + /// List of addresses known for this node. + pub known_addresses: HashSet, + /// Node information, as provided by the node itself, if we were ever connected to this node. + pub version_string: Option, + /// Latest ping duration with this node, if we were ever connected to this node. + pub latest_ping_time: Option, +} + +/// Part of the `NetworkState` struct. Unstable. +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub enum NetworkStatePeerEndpoint { + /// We are dialing the given address. + Dialing(Multiaddr), + /// We are listening. + Listening { + /// Address we're listening on that received the connection. + listen_addr: Multiaddr, + /// Address data is sent back to. + send_back_addr: Multiaddr, + }, +} + +impl From for NetworkStatePeerEndpoint { + fn from(endpoint: ConnectedPoint) -> Self { + match endpoint { + ConnectedPoint::Dialer { address } => + NetworkStatePeerEndpoint::Dialing(address), + ConnectedPoint::Listener { listen_addr, send_back_addr } => + NetworkStatePeerEndpoint::Listening { + listen_addr, + send_back_addr + } + } + } +} diff --git a/core/network/src/on_demand.rs b/core/network/src/on_demand.rs deleted file mode 100644 index 080eb7f04638691477921e88537b525cc1e7d2ba..0000000000000000000000000000000000000000 --- a/core/network/src/on_demand.rs +++ /dev/null @@ -1,1109 +0,0 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. -// This file is part of Substrate. - -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - -//! On-demand requests service. - -use std::collections::{HashMap, VecDeque}; -use std::sync::Arc; -use std::time::{Instant, Duration}; -use log::{trace, info}; -use futures::{Async, Future, Poll}; -use futures::sync::oneshot::{channel, Receiver, Sender as OneShotSender}; -use linked_hash_map::LinkedHashMap; -use linked_hash_map::Entry; -use parking_lot::Mutex; -use client::error::Error as ClientError; -use client::light::fetcher::{Fetcher, FetchChecker, RemoteHeaderRequest, - RemoteCallRequest, RemoteReadRequest, RemoteChangesRequest, ChangesProof, - RemoteReadChildRequest}; -use crate::message; -use network_libp2p::PeerId; -use crate::config::Roles; -use crate::service::{NetworkChan, NetworkMsg}; -use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, NumberFor}; - -/// Remote request timeout. -const REQUEST_TIMEOUT: Duration = Duration::from_secs(15); -/// Default request retry count. -const RETRY_COUNT: usize = 1; -/// Reputation change for a peer when a request timed out. -const TIMEOUT_REPUTATION_CHANGE: i32 = -(1 << 8); - -/// On-demand service API. -pub trait OnDemandService: Send + Sync { - /// When new node is connected. - fn on_connect(&self, peer: PeerId, role: Roles, best_number: NumberFor); - - /// When block is announced by the peer. - fn on_block_announce(&self, peer: PeerId, best_number: NumberFor); - - /// When node is disconnected. - fn on_disconnect(&self, peer: PeerId); - - /// Maintain peers requests. - fn maintain_peers(&self); - - /// When header response is received from remote node. - fn on_remote_header_response( - &self, - peer: PeerId, - response: message::RemoteHeaderResponse - ); - - /// When read response is received from remote node. - fn on_remote_read_response(&self, peer: PeerId, response: message::RemoteReadResponse); - - /// When call response is received from remote node. - fn on_remote_call_response(&self, peer: PeerId, response: message::RemoteCallResponse); - - /// When changes response is received from remote node. - fn on_remote_changes_response( - &self, - peer: PeerId, - response: message::RemoteChangesResponse, Block::Hash> - ); -} - -/// On-demand requests service. Dispatches requests to appropriate peers. -pub struct OnDemand { - core: Mutex>, - checker: Arc>, - network_sender: Mutex>>, -} - -/// On-demand remote call response. -pub struct RemoteResponse { - receiver: Receiver>, -} - -#[derive(Default)] -struct OnDemandCore { - next_request_id: u64, - pending_requests: VecDeque>, - active_peers: LinkedHashMap>, - idle_peers: VecDeque, - best_blocks: HashMap>, -} - -struct Request { - id: u64, - timestamp: Instant, - retry_count: usize, - data: RequestData, -} - -enum RequestData { - RemoteHeader(RemoteHeaderRequest, OneShotSender>), - RemoteRead(RemoteReadRequest, OneShotSender>, ClientError>>), - RemoteReadChild( - RemoteReadChildRequest, - OneShotSender>, ClientError>> - ), - RemoteCall(RemoteCallRequest, OneShotSender, ClientError>>), - RemoteChanges(RemoteChangesRequest, OneShotSender, u32)>, ClientError>>), -} - -enum Accept { - Ok, - CheckFailed(ClientError, RequestData), - Unexpected(RequestData), -} - -impl Future for RemoteResponse { - type Item = T; - type Error = ClientError; - - fn poll(&mut self) -> Poll { - self.receiver.poll() - .map_err(|_| ClientError::RemoteFetchCancelled.into()) - .and_then(|r| match r { - Async::Ready(Ok(ready)) => Ok(Async::Ready(ready)), - Async::Ready(Err(error)) => Err(error), - Async::NotReady => Ok(Async::NotReady), - }) - } -} - -impl OnDemand where - B::Header: HeaderT, -{ - /// Creates new on-demand service. - pub fn new(checker: Arc>) -> Self { - OnDemand { - checker, - network_sender: Mutex::new(None), - core: Mutex::new(OnDemandCore { - next_request_id: 0, - pending_requests: VecDeque::new(), - active_peers: LinkedHashMap::new(), - idle_peers: VecDeque::new(), - best_blocks: HashMap::new(), - }) - } - } - - /// Sets weak reference to network service. - pub fn set_network_sender(&self, network_sender: NetworkChan) { - self.network_sender.lock().replace(network_sender); - } - - fn send(&self, msg: NetworkMsg) { - let _ = self.network_sender - .lock() - .as_ref() - .expect("1. OnDemand is passed a network sender upon initialization of the service, 2. it should bet set by now") - .send(msg); - } - - /// Schedule && dispatch all scheduled requests. - fn schedule_request(&self, retry_count: Option, data: RequestData, result: R) -> R { - let mut core = self.core.lock(); - core.insert(retry_count.unwrap_or(RETRY_COUNT), data); - core.dispatch(self); - result - } - - /// Try to accept response from given peer. - fn accept_response) -> Accept>(&self, rtype: &str, peer: PeerId, request_id: u64, try_accept: F) { - let mut core = self.core.lock(); - let request = match core.remove(peer.clone(), request_id) { - Some(request) => request, - None => { - info!("Invalid remote {} response from peer {}", rtype, peer); - self.send(NetworkMsg::ReportPeer(peer.clone(), i32::min_value())); - self.send(NetworkMsg::DisconnectPeer(peer.clone())); - core.remove_peer(peer); - return; - }, - }; - - let retry_count = request.retry_count; - let (retry_count, retry_request_data) = match try_accept(request) { - Accept::Ok => (retry_count, None), - Accept::CheckFailed(error, retry_request_data) => { - info!("Failed to check remote {} response from peer {}: {}", rtype, peer, error); - self.send(NetworkMsg::ReportPeer(peer.clone(), i32::min_value())); - self.send(NetworkMsg::DisconnectPeer(peer.clone())); - core.remove_peer(peer); - - if retry_count > 0 { - (retry_count - 1, Some(retry_request_data)) - } else { - trace!(target: "sync", "Failed to get remote {} response for given number of retries", rtype); - retry_request_data.fail(ClientError::RemoteFetchFailed.into()); - (0, None) - } - }, - Accept::Unexpected(retry_request_data) => { - info!("Unexpected response to remote {} from peer", rtype); - self.send(NetworkMsg::ReportPeer(peer.clone(), i32::min_value())); - self.send(NetworkMsg::DisconnectPeer(peer.clone())); - core.remove_peer(peer); - - (retry_count, Some(retry_request_data)) - }, - }; - - if let Some(request_data) = retry_request_data { - core.insert(retry_count, request_data); - } - - core.dispatch(self); - } -} - -impl OnDemandService for OnDemand where - B: BlockT, - B::Header: HeaderT, -{ - fn on_connect(&self, peer: PeerId, role: Roles, best_number: NumberFor) { - if !role.intersects(Roles::FULL | Roles::AUTHORITY) { - return; - } - - let mut core = self.core.lock(); - core.add_peer(peer, best_number); - core.dispatch(self); - } - - fn on_block_announce(&self, peer: PeerId, best_number: NumberFor) { - let mut core = self.core.lock(); - core.update_peer(peer, best_number); - core.dispatch(self); - } - - fn on_disconnect(&self, peer: PeerId) { - let mut core = self.core.lock(); - core.remove_peer(peer); - core.dispatch(self); - } - - fn maintain_peers(&self) { - let mut core = self.core.lock(); - for bad_peer in core.maintain_peers() { - self.send(NetworkMsg::ReportPeer(bad_peer.clone(), TIMEOUT_REPUTATION_CHANGE)); - self.send(NetworkMsg::DisconnectPeer(bad_peer)); - } - core.dispatch(self); - } - - fn on_remote_header_response(&self, peer: PeerId, response: message::RemoteHeaderResponse) { - self.accept_response("header", peer, response.id, |request| match request.data { - RequestData::RemoteHeader(request, sender) => match self.checker.check_header_proof(&request, response.header, response.proof) { - Ok(response) => { - // we do not bother if receiver has been dropped already - let _ = sender.send(Ok(response)); - Accept::Ok - }, - Err(error) => Accept::CheckFailed(error, RequestData::RemoteHeader(request, sender)), - }, - data => Accept::Unexpected(data), - }) - } - - fn on_remote_read_response(&self, peer: PeerId, response: message::RemoteReadResponse) { - self.accept_response("read", peer, response.id, |request| match request.data { - RequestData::RemoteRead(request, sender) => { - match self.checker.check_read_proof(&request, response.proof) { - Ok(response) => { - // we do not bother if receiver has been dropped already - let _ = sender.send(Ok(response)); - Accept::Ok - }, - Err(error) => Accept::CheckFailed( - error, - RequestData::RemoteRead(request, sender) - ), - }}, - RequestData::RemoteReadChild(request, sender) => { - match self.checker.check_read_child_proof(&request, response.proof) { - Ok(response) => { - // we do not bother if receiver has been dropped already - let _ = sender.send(Ok(response)); - Accept::Ok - }, - Err(error) => Accept::CheckFailed( - error, - RequestData::RemoteReadChild(request, sender) - ), - }}, - data => Accept::Unexpected(data), - }) - } - - fn on_remote_call_response(&self, peer: PeerId, response: message::RemoteCallResponse) { - self.accept_response("call", peer, response.id, |request| match request.data { - RequestData::RemoteCall(request, sender) => match self.checker.check_execution_proof(&request, response.proof) { - Ok(response) => { - // we do not bother if receiver has been dropped already - let _ = sender.send(Ok(response)); - Accept::Ok - }, - Err(error) => Accept::CheckFailed(error, RequestData::RemoteCall(request, sender)), - }, - data => Accept::Unexpected(data), - }) - } - - fn on_remote_changes_response(&self, peer: PeerId, response: message::RemoteChangesResponse, B::Hash>) { - self.accept_response("changes", peer, response.id, |request| match request.data { - RequestData::RemoteChanges(request, sender) => match self.checker.check_changes_proof( - &request, ChangesProof { - max_block: response.max, - proof: response.proof, - roots: response.roots.into_iter().collect(), - roots_proof: response.roots_proof, - }) { - Ok(response) => { - // we do not bother if receiver has been dropped already - let _ = sender.send(Ok(response)); - Accept::Ok - }, - Err(error) => Accept::CheckFailed(error, RequestData::RemoteChanges(request, sender)), - }, - data => Accept::Unexpected(data), - }) - } -} - -impl Fetcher for OnDemand where - B: BlockT, - B::Header: HeaderT, -{ - type RemoteHeaderResult = RemoteResponse; - type RemoteReadResult = RemoteResponse>>; - type RemoteCallResult = RemoteResponse>; - type RemoteChangesResult = RemoteResponse, u32)>>; - - fn remote_header(&self, request: RemoteHeaderRequest) -> Self::RemoteHeaderResult { - let (sender, receiver) = channel(); - self.schedule_request(request.retry_count.clone(), RequestData::RemoteHeader(request, sender), - RemoteResponse { receiver }) - } - - fn remote_read(&self, request: RemoteReadRequest) -> Self::RemoteReadResult { - let (sender, receiver) = channel(); - self.schedule_request( - request.retry_count.clone(), - RequestData::RemoteRead(request, sender), - RemoteResponse { receiver } - ) - } - - fn remote_read_child( - &self, - request: RemoteReadChildRequest - ) -> Self::RemoteReadResult { - let (sender, receiver) = channel(); - self.schedule_request( - request.retry_count.clone(), - RequestData::RemoteReadChild(request, sender), - RemoteResponse { receiver } - ) - } - - fn remote_call(&self, request: RemoteCallRequest) -> Self::RemoteCallResult { - let (sender, receiver) = channel(); - self.schedule_request(request.retry_count.clone(), RequestData::RemoteCall(request, sender), - RemoteResponse { receiver }) - } - - fn remote_changes(&self, request: RemoteChangesRequest) -> Self::RemoteChangesResult { - let (sender, receiver) = channel(); - self.schedule_request(request.retry_count.clone(), RequestData::RemoteChanges(request, sender), - RemoteResponse { receiver }) - } -} - -impl OnDemandCore where - B: BlockT, - B::Header: HeaderT, -{ - pub fn add_peer(&mut self, peer: PeerId, best_number: NumberFor) { - self.idle_peers.push_back(peer.clone()); - self.best_blocks.insert(peer, best_number); - } - - pub fn update_peer(&mut self, peer: PeerId, best_number: NumberFor) { - self.best_blocks.insert(peer, best_number); - } - - pub fn remove_peer(&mut self, peer: PeerId) { - self.best_blocks.remove(&peer); - - if let Some(request) = self.active_peers.remove(&peer) { - self.pending_requests.push_front(request); - return; - } - - if let Some(idle_index) = self.idle_peers.iter().position(|i| *i == peer) { - self.idle_peers.swap_remove_back(idle_index); - } - } - - pub fn maintain_peers(&mut self) -> Vec { - let now = Instant::now(); - let mut bad_peers = Vec::new(); - loop { - match self.active_peers.front() { - Some((_, request)) if now - request.timestamp >= REQUEST_TIMEOUT => (), - _ => return bad_peers, - } - - let (bad_peer, request) = self.active_peers.pop_front().expect("front() is Some as checked above"); - self.pending_requests.push_front(request); - bad_peers.push(bad_peer); - } - } - - pub fn insert(&mut self, retry_count: usize, data: RequestData) { - let request_id = self.next_request_id; - self.next_request_id += 1; - - self.pending_requests.push_back(Request { - id: request_id, - timestamp: Instant::now(), - retry_count, - data, - }); - } - - pub fn remove(&mut self, peer: PeerId, id: u64) -> Option> { - match self.active_peers.entry(peer.clone()) { - Entry::Occupied(entry) => match entry.get().id == id { - true => { - self.idle_peers.push_back(peer); - Some(entry.remove()) - }, - false => None, - }, - Entry::Vacant(_) => None, - } - } - - pub fn dispatch(&mut self, on_demand: &OnDemand) { - - let mut last_peer = self.idle_peers.back().cloned(); - let mut unhandled_requests = VecDeque::new(); - - loop { - let peer = match self.idle_peers.pop_front() { - Some(peer) => peer, - None => break, - }; - - // check if request can (optimistically) be processed by the peer - let can_be_processed_by_peer = { - let request = match self.pending_requests.front() { - Some(r) => r, - None => { - self.idle_peers.push_front(peer); - break; - }, - }; - let peer_best_block = self.best_blocks.get(&peer) - .expect("entries are inserted into best_blocks when peer is connected; - entries are removed from best_blocks when peer is disconnected; - peer is in idle_peers and thus connected; qed"); - request.required_block() <= *peer_best_block - }; - - if !can_be_processed_by_peer { - // return peer to the back of the queue - self.idle_peers.push_back(peer.clone()); - - // we have enumerated all peers and noone can handle request - if Some(peer) == last_peer { - let request = self.pending_requests.pop_front().expect("checked in loop condition; qed"); - unhandled_requests.push_back(request); - last_peer = self.idle_peers.back().cloned(); - } - - continue; - } - - last_peer = self.idle_peers.back().cloned(); - - let mut request = self.pending_requests.pop_front().expect("checked in loop condition; qed"); - request.timestamp = Instant::now(); - trace!(target: "sync", "Dispatching remote request {} to peer {}", request.id, peer); - on_demand.send(NetworkMsg::Outgoing(peer.clone(), request.message())); - self.active_peers.insert(peer, request); - } - - self.pending_requests.append(&mut unhandled_requests); - } -} - -impl Request { - pub fn required_block(&self) -> NumberFor { - match self.data { - RequestData::RemoteHeader(ref data, _) => data.block, - RequestData::RemoteRead(ref data, _) => *data.header.number(), - RequestData::RemoteReadChild(ref data, _) => *data.header.number(), - RequestData::RemoteCall(ref data, _) => *data.header.number(), - RequestData::RemoteChanges(ref data, _) => data.max_block.0, - } - } - - pub fn message(&self) -> message::Message { - match self.data { - RequestData::RemoteHeader(ref data, _) => - message::generic::Message::RemoteHeaderRequest(message::RemoteHeaderRequest { - id: self.id, - block: data.block, - }), - RequestData::RemoteRead(ref data, _) => - message::generic::Message::RemoteReadRequest(message::RemoteReadRequest { - id: self.id, - block: data.block, - key: data.key.clone(), - }), - RequestData::RemoteReadChild(ref data, _) => - message::generic::Message::RemoteReadChildRequest( - message::RemoteReadChildRequest { - id: self.id, - block: data.block, - storage_key: data.storage_key.clone(), - key: data.key.clone(), - }), - RequestData::RemoteCall(ref data, _) => - message::generic::Message::RemoteCallRequest(message::RemoteCallRequest { - id: self.id, - block: data.block, - method: data.method.clone(), - data: data.call_data.clone(), - }), - RequestData::RemoteChanges(ref data, _) => - message::generic::Message::RemoteChangesRequest(message::RemoteChangesRequest { - id: self.id, - first: data.first_block.1.clone(), - last: data.last_block.1.clone(), - min: data.tries_roots.1.clone(), - max: data.max_block.1.clone(), - key: data.key.clone(), - }), - } - } -} - -impl RequestData { - pub fn fail(self, error: ClientError) { - // don't care if anyone is listening - match self { - RequestData::RemoteHeader(_, sender) => { let _ = sender.send(Err(error)); }, - RequestData::RemoteCall(_, sender) => { let _ = sender.send(Err(error)); }, - RequestData::RemoteRead(_, sender) => { let _ = sender.send(Err(error)); }, - RequestData::RemoteReadChild(_, sender) => { let _ = sender.send(Err(error)); }, - RequestData::RemoteChanges(_, sender) => { let _ = sender.send(Err(error)); }, - } - } -} - -#[cfg(test)] -pub mod tests { - use std::sync::Arc; - use std::time::Instant; - use futures::Future; - use runtime_primitives::traits::NumberFor; - use client::{error::{Error as ClientError, Result as ClientResult}}; - use client::light::fetcher::{Fetcher, FetchChecker, RemoteHeaderRequest, - ChangesProof, RemoteCallRequest, RemoteReadRequest, - RemoteReadChildRequest, RemoteChangesRequest}; - use crate::config::Roles; - use crate::message; - use network_libp2p::PeerId; - use crate::service::{network_channel, NetworkPort, NetworkMsg}; - use super::{REQUEST_TIMEOUT, OnDemand, OnDemandService}; - use test_client::runtime::{changes_trie_config, Block, Header}; - - pub struct DummyExecutor; - struct DummyFetchChecker { ok: bool } - - impl FetchChecker for DummyFetchChecker { - fn check_header_proof( - &self, - _request: &RemoteHeaderRequest

, - header: Option
, - _remote_proof: Vec> - ) -> ClientResult
{ - match self.ok { - true if header.is_some() => Ok(header.unwrap()), - _ => Err(ClientError::Backend("Test error".into())), - } - } - - fn check_read_proof(&self, _: &RemoteReadRequest
, _: Vec>) -> ClientResult>> { - match self.ok { - true => Ok(Some(vec![42])), - false => Err(ClientError::Backend("Test error".into())), - } - } - - fn check_read_child_proof( - &self, - _: &RemoteReadChildRequest
, - _: Vec> - ) -> ClientResult>> { - match self.ok { - true => Ok(Some(vec![42])), - false => Err(ClientError::Backend("Test error".into())), - } - } - - fn check_execution_proof(&self, _: &RemoteCallRequest
, _: Vec>) -> ClientResult> { - match self.ok { - true => Ok(vec![42]), - false => Err(ClientError::Backend("Test error".into())), - } - } - - fn check_changes_proof(&self, _: &RemoteChangesRequest
, _: ChangesProof
) -> ClientResult, u32)>> { - match self.ok { - true => Ok(vec![(100, 2)]), - false => Err(ClientError::Backend("Test error".into())), - } - } - } - - fn dummy(ok: bool) -> (Arc, Arc>) { - let executor = Arc::new(DummyExecutor); - let service = Arc::new(OnDemand::new(Arc::new(DummyFetchChecker { ok }))); - (executor, service) - } - - fn total_peers(on_demand: &OnDemand) -> usize { - let core = on_demand.core.lock(); - core.idle_peers.len() + core.active_peers.len() - } - - fn receive_call_response(on_demand: &OnDemand, peer: PeerId, id: message::RequestId) { - on_demand.on_remote_call_response(peer, message::RemoteCallResponse { - id: id, - proof: vec![vec![2]], - }); - } - - fn dummy_header() -> Header { - Header { - parent_hash: Default::default(), - number: 0, - state_root: Default::default(), - extrinsics_root: Default::default(), - digest: Default::default(), - } - } - - fn assert_disconnected_peer(network_port: NetworkPort) { - let mut disconnect_count = 0; - while let Ok(msg) = network_port.receiver().try_recv() { - match msg { - NetworkMsg::DisconnectPeer(_) => disconnect_count = disconnect_count + 1, - _ => {}, - } - } - assert_eq!(disconnect_count, 1); - } - - #[test] - fn knows_about_peers_roles() { - let (_, on_demand) = dummy(true); - let peer0 = PeerId::random(); - let peer1 = PeerId::random(); - let peer2 = PeerId::random(); - on_demand.on_connect(peer0, Roles::LIGHT, 1000); - on_demand.on_connect(peer1.clone(), Roles::FULL, 2000); - on_demand.on_connect(peer2.clone(), Roles::AUTHORITY, 3000); - assert_eq!(vec![peer1.clone(), peer2.clone()], on_demand.core.lock().idle_peers.iter().cloned().collect::>()); - assert_eq!(on_demand.core.lock().best_blocks.get(&peer1), Some(&2000)); - assert_eq!(on_demand.core.lock().best_blocks.get(&peer2), Some(&3000)); - } - - #[test] - fn disconnects_from_idle_peer() { - let peer0 = PeerId::random(); - - let (_, on_demand) = dummy(true); - on_demand.on_connect(peer0.clone(), Roles::FULL, 100); - assert_eq!(1, total_peers(&*on_demand)); - assert!(!on_demand.core.lock().best_blocks.is_empty()); - - on_demand.on_disconnect(peer0); - assert_eq!(0, total_peers(&*on_demand)); - assert!(on_demand.core.lock().best_blocks.is_empty()); - } - - #[test] - fn disconnects_from_timeouted_peer() { - let (_x, on_demand) = dummy(true); - let (network_sender, network_port) = network_channel(); - let peer0 = PeerId::random(); - let peer1 = PeerId::random(); - on_demand.set_network_sender(network_sender.clone()); - on_demand.on_connect(peer0.clone(), Roles::FULL, 1000); - on_demand.on_connect(peer1.clone(), Roles::FULL, 1000); - assert_eq!(vec![peer0.clone(), peer1.clone()], on_demand.core.lock().idle_peers.iter().cloned().collect::>()); - assert!(on_demand.core.lock().active_peers.is_empty()); - - on_demand.remote_call(RemoteCallRequest { - block: Default::default(), - header: dummy_header(), - method: "test".into(), - call_data: vec![], - retry_count: None, - }); - assert_eq!(vec![peer1.clone()], on_demand.core.lock().idle_peers.iter().cloned().collect::>()); - assert_eq!(vec![peer0.clone()], on_demand.core.lock().active_peers.keys().cloned().collect::>()); - - on_demand.core.lock().active_peers[&peer0].timestamp = Instant::now() - REQUEST_TIMEOUT - REQUEST_TIMEOUT; - on_demand.maintain_peers(); - assert!(on_demand.core.lock().idle_peers.is_empty()); - assert_eq!(vec![peer1.clone()], on_demand.core.lock().active_peers.keys().cloned().collect::>()); - assert_disconnected_peer(network_port); - } - - #[test] - fn disconnects_from_peer_on_response_with_wrong_id() { - let (_x, on_demand) = dummy(true); - let peer0 = PeerId::random(); - let (network_sender, network_port) = network_channel(); - on_demand.set_network_sender(network_sender.clone()); - on_demand.on_connect(peer0.clone(), Roles::FULL, 1000); - - on_demand.remote_call(RemoteCallRequest { - block: Default::default(), - header: dummy_header(), - method: "test".into(), - call_data: vec![], - retry_count: None, - }); - receive_call_response(&*on_demand, peer0, 1); - assert_disconnected_peer(network_port); - assert_eq!(on_demand.core.lock().pending_requests.len(), 1); - } - - #[test] - fn disconnects_from_peer_on_incorrect_response() { - let (_x, on_demand) = dummy(false); - let (network_sender, network_port) = network_channel(); - let peer0 = PeerId::random(); - on_demand.set_network_sender(network_sender.clone()); - on_demand.remote_call(RemoteCallRequest { - block: Default::default(), - header: dummy_header(), - method: "test".into(), - call_data: vec![], - retry_count: Some(1), - }); - - on_demand.on_connect(peer0.clone(), Roles::FULL, 1000); - receive_call_response(&*on_demand, peer0.clone(), 0); - assert_disconnected_peer(network_port); - assert_eq!(on_demand.core.lock().pending_requests.len(), 1); - } - - #[test] - fn disconnects_from_peer_on_unexpected_response() { - let (_x, on_demand) = dummy(true); - let (network_sender, network_port) = network_channel(); - let peer0 = PeerId::random(); - on_demand.set_network_sender(network_sender.clone()); - on_demand.on_connect(peer0.clone(), Roles::FULL, 1000); - - receive_call_response(&*on_demand, peer0, 0); - assert_disconnected_peer(network_port); - } - - #[test] - fn disconnects_from_peer_on_wrong_response_type() { - let (_x, on_demand) = dummy(false); - let peer0 = PeerId::random(); - let (network_sender, network_port) = network_channel(); - on_demand.set_network_sender(network_sender.clone()); - on_demand.on_connect(peer0.clone(), Roles::FULL, 1000); - - on_demand.remote_call(RemoteCallRequest { - block: Default::default(), - header: dummy_header(), - method: "test".into(), - call_data: vec![], - retry_count: Some(1), - }); - - on_demand.on_remote_read_response(peer0.clone(), message::RemoteReadResponse { - id: 0, - proof: vec![vec![2]], - }); - assert_disconnected_peer(network_port); - assert_eq!(on_demand.core.lock().pending_requests.len(), 1); - } - - #[test] - fn receives_remote_failure_after_retry_count_failures() { - use parking_lot::{Condvar, Mutex}; - - let retry_count = 2; - let peer_ids = (0 .. retry_count + 1).map(|_| PeerId::random()).collect::>(); - let (_x, on_demand) = dummy(false); - let (network_sender, _network_port) = network_channel(); - on_demand.set_network_sender(network_sender.clone()); - for i in 0..retry_count+1 { - on_demand.on_connect(peer_ids[i].clone(), Roles::FULL, 1000); - } - - let sync = Arc::new((Mutex::new(0), Mutex::new(0), Condvar::new())); - let thread_sync = sync.clone(); - - let response = on_demand.remote_call(RemoteCallRequest { - block: Default::default(), - header: dummy_header(), - method: "test".into(), - call_data: vec![], - retry_count: Some(retry_count) - }); - let thread = ::std::thread::spawn(move || { - let &(ref current, ref finished_at, ref finished) = &*thread_sync; - let _ = response.wait().unwrap_err(); - *finished_at.lock() = *current.lock(); - finished.notify_one(); - }); - - let &(ref current, ref finished_at, ref finished) = &*sync; - for i in 0..retry_count+1 { - let mut current = current.lock(); - *current = *current + 1; - receive_call_response(&*on_demand, peer_ids[i].clone(), i as u64); - } - - let mut finished_at = finished_at.lock(); - assert!(!finished.wait_for(&mut finished_at, ::std::time::Duration::from_millis(1000)).timed_out()); - assert_eq!(*finished_at, retry_count + 1); - - thread.join().unwrap(); - } - - #[test] - fn receives_remote_call_response() { - let (_x, on_demand) = dummy(true); - let (network_sender, _network_port) = network_channel(); - let peer0 = PeerId::random(); - on_demand.set_network_sender(network_sender.clone()); - on_demand.on_connect(peer0.clone(), Roles::FULL, 1000); - - let response = on_demand.remote_call(RemoteCallRequest { - block: Default::default(), - header: dummy_header(), - method: "test".into(), - call_data: vec![], - retry_count: None, - }); - let thread = ::std::thread::spawn(move || { - let result = response.wait().unwrap(); - assert_eq!(result, vec![42]); - }); - - receive_call_response(&*on_demand, peer0.clone(), 0); - thread.join().unwrap(); - } - - #[test] - fn receives_remote_read_response() { - let (_x, on_demand) = dummy(true); - let (network_sender, _network_port) = network_channel(); - let peer0 = PeerId::random(); - on_demand.set_network_sender(network_sender.clone()); - on_demand.on_connect(peer0.clone(), Roles::FULL, 1000); - - let response = on_demand.remote_read(RemoteReadRequest { - header: dummy_header(), - block: Default::default(), - key: b":key".to_vec(), - retry_count: None, - }); - let thread = ::std::thread::spawn(move || { - let result = response.wait().unwrap(); - assert_eq!(result, Some(vec![42])); - }); - - on_demand.on_remote_read_response(peer0.clone(), message::RemoteReadResponse { - id: 0, - proof: vec![vec![2]], - }); - thread.join().unwrap(); - } - - #[test] - fn receives_remote_read_child_response() { - let (_x, on_demand) = dummy(true); - let (network_sender, _network_port) = network_channel(); - let peer0 = PeerId::random(); - on_demand.set_network_sender(network_sender.clone()); - on_demand.on_connect(peer0.clone(), Roles::FULL, 1000); - - let response = on_demand.remote_read_child(RemoteReadChildRequest { - header: dummy_header(), - block: Default::default(), - storage_key: b":child_storage:sub".to_vec(), - key: b":key".to_vec(), - retry_count: None, - }); - let thread = ::std::thread::spawn(move || { - let result = response.wait().unwrap(); - assert_eq!(result, Some(vec![42])); - }); - - on_demand.on_remote_read_response( - peer0.clone(), message::RemoteReadResponse { - id: 0, - proof: vec![vec![2]], - }); - thread.join().unwrap(); - } - - #[test] - fn receives_remote_header_response() { - let (_x, on_demand) = dummy(true); - let (network_sender, _network_port) = network_channel(); - let peer0 = PeerId::random(); - on_demand.set_network_sender(network_sender.clone()); - on_demand.on_connect(peer0.clone(), Roles::FULL, 1000); - - let response = on_demand.remote_header(RemoteHeaderRequest { - cht_root: Default::default(), - block: 1, - retry_count: None, - }); - let thread = ::std::thread::spawn(move || { - let result = response.wait().unwrap(); - assert_eq!( - result.hash(), - "6443a0b46e0412e626363028115a9f2c\ - f963eeed526b8b33e5316f08b50d0dc3".parse().unwrap() - ); - }); - - on_demand.on_remote_header_response(peer0.clone(), message::RemoteHeaderResponse { - id: 0, - header: Some(Header { - parent_hash: Default::default(), - number: 1, - state_root: Default::default(), - extrinsics_root: Default::default(), - digest: Default::default(), - }), - proof: vec![vec![2]], - }); - thread.join().unwrap(); - } - - #[test] - fn receives_remote_changes_response() { - let (_x, on_demand) = dummy(true); - let (network_sender, _network_port) = network_channel(); - let peer0 = PeerId::random(); - on_demand.set_network_sender(network_sender.clone()); - on_demand.on_connect(peer0.clone(), Roles::FULL, 1000); - - let response = on_demand.remote_changes(RemoteChangesRequest { - changes_trie_config: changes_trie_config(), - first_block: (1, Default::default()), - last_block: (100, Default::default()), - max_block: (100, Default::default()), - tries_roots: (1, Default::default(), vec![]), - key: vec![], - retry_count: None, - }); - let thread = ::std::thread::spawn(move || { - let result = response.wait().unwrap(); - assert_eq!(result, vec![(100, 2)]); - }); - - on_demand.on_remote_changes_response(peer0.clone(), message::RemoteChangesResponse { - id: 0, - max: 1000, - proof: vec![vec![2]], - roots: vec![], - roots_proof: vec![], - }); - thread.join().unwrap(); - } - - #[test] - fn does_not_sends_request_to_peer_who_has_no_required_block() { - let (_x, on_demand) = dummy(true); - let (network_sender, _network_port) = network_channel(); - let peer1 = PeerId::random(); - let peer2 = PeerId::random(); - on_demand.set_network_sender(network_sender.clone()); - - on_demand.on_connect(peer1.clone(), Roles::FULL, 100); - - on_demand.remote_header(RemoteHeaderRequest { - cht_root: Default::default(), - block: 200, - retry_count: None, - }); - on_demand.remote_header(RemoteHeaderRequest { - cht_root: Default::default(), - block: 250, - retry_count: None, - }); - on_demand.remote_header(RemoteHeaderRequest { - cht_root: Default::default(), - block: 250, - retry_count: None, - }); - - on_demand.on_connect(peer2.clone(), Roles::FULL, 150); - - assert_eq!(vec![peer1.clone(), peer2.clone()], on_demand.core.lock().idle_peers.iter().cloned().collect::>()); - assert_eq!(on_demand.core.lock().pending_requests.len(), 3); - - on_demand.on_block_announce(peer1.clone(), 250); - - assert_eq!(vec![peer2.clone()], on_demand.core.lock().idle_peers.iter().cloned().collect::>()); - assert_eq!(on_demand.core.lock().pending_requests.len(), 2); - - on_demand.on_block_announce(peer2.clone(), 250); - - assert!(!on_demand.core.lock().idle_peers.iter().any(|_| true)); - assert_eq!(on_demand.core.lock().pending_requests.len(), 1); - - on_demand.on_remote_header_response(peer1.clone(), message::RemoteHeaderResponse { - id: 0, - header: Some(dummy_header()), - proof: vec![], - }); - - assert!(!on_demand.core.lock().idle_peers.iter().any(|_| true)); - assert_eq!(on_demand.core.lock().pending_requests.len(), 0); - } - - #[test] - fn does_not_loop_forever_after_dispatching_request_to_last_peer() { - // this test is a regression for a bug where the dispatch function would - // loop forever after dispatching a request to the last peer, since the - // last peer was not updated - let (_x, on_demand) = dummy(true); - let (network_sender, _network_port) = network_channel(); - let peer1 = PeerId::random(); - let peer2 = PeerId::random(); - let peer3 = PeerId::random(); - on_demand.set_network_sender(network_sender.clone()); - - on_demand.remote_header(RemoteHeaderRequest { - cht_root: Default::default(), - block: 250, - retry_count: None, - }); - on_demand.remote_header(RemoteHeaderRequest { - cht_root: Default::default(), - block: 250, - retry_count: None, - }); - - on_demand.on_connect(peer1.clone(), Roles::FULL, 200); - on_demand.on_connect(peer2.clone(), Roles::FULL, 200); - on_demand.on_connect(peer3.clone(), Roles::FULL, 250); - - assert_eq!(vec![peer1.clone(), peer2.clone()], on_demand.core.lock().idle_peers.iter().cloned().collect::>()); - assert_eq!(on_demand.core.lock().pending_requests.len(), 1); - } - - #[test] - fn tries_to_send_all_pending_requests() { - let (_x, on_demand) = dummy(true); - let (network_sender, _network_port) = network_channel(); - let peer1 = PeerId::random(); - on_demand.set_network_sender(network_sender.clone()); - - on_demand.remote_header(RemoteHeaderRequest { - cht_root: Default::default(), - block: 300, - retry_count: None, - }); - on_demand.remote_header(RemoteHeaderRequest { - cht_root: Default::default(), - block: 250, - retry_count: None, - }); - - on_demand.on_connect(peer1.clone(), Roles::FULL, 250); - - assert!(on_demand.core.lock().idle_peers.iter().cloned().collect::>().is_empty()); - assert_eq!(on_demand.core.lock().pending_requests.len(), 1); - } -} diff --git a/core/network/src/on_demand_layer.rs b/core/network/src/on_demand_layer.rs new file mode 100644 index 0000000000000000000000000000000000000000..86b3d6b7f4a12a304420db5f685539a3cb3b0ce4 --- /dev/null +++ b/core/network/src/on_demand_layer.rs @@ -0,0 +1,149 @@ +// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +//! On-demand requests service. + +use crate::protocol::on_demand::RequestData; +use std::sync::Arc; +use futures::{prelude::*, sync::mpsc, sync::oneshot}; +use parking_lot::Mutex; +use client::error::Error as ClientError; +use client::light::fetcher::{Fetcher, FetchChecker, RemoteHeaderRequest, + RemoteCallRequest, RemoteReadRequest, RemoteChangesRequest, + RemoteReadChildRequest, RemoteBodyRequest}; +use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, NumberFor}; + +/// Implements the `Fetcher` trait of the client. Makes it possible for the light client to perform +/// network requests for some state. +/// +/// This implementation stores all the requests in a queue. The network, in parallel, is then +/// responsible for pulling elements out of that queue and fulfilling them. +pub struct OnDemand { + /// Objects that checks whether what has been retrieved is correct. + checker: Arc>, + + /// Queue of requests. Set to `Some` at initialization, then extracted by the network. + /// + /// Note that a better alternative would be to use a MPMC queue here, and add a `poll` method + /// from the `OnDemand`. However there exists no popular implementation of MPMC channels in + /// asynchronous Rust at the moment + requests_queue: Mutex>>>, + + /// Sending side of `requests_queue`. + requests_send: mpsc::UnboundedSender>, +} + +impl OnDemand where + B::Header: HeaderT, +{ + /// Creates new on-demand service. + pub fn new(checker: Arc>) -> Self { + let (requests_send, requests_queue) = mpsc::unbounded(); + let requests_queue = Mutex::new(Some(requests_queue)); + + OnDemand { + checker, + requests_queue, + requests_send, + } + } + + /// Get checker reference. + pub fn checker(&self) -> &Arc> { + &self.checker + } + + /// Extracts the queue of requests. + /// + /// Whenever one of the methods of the `Fetcher` trait is called, an element is pushed on this + /// channel. + /// + /// If this function returns `None`, that means that the receiver has already been extracted in + /// the past, and therefore that something already handles the requests. + pub(crate) fn extract_receiver(&self) -> Option>> { + self.requests_queue.lock().take() + } +} + +impl Fetcher for OnDemand where + B: BlockT, + B::Header: HeaderT, +{ + type RemoteHeaderResult = RemoteResponse; + type RemoteReadResult = RemoteResponse>>; + type RemoteCallResult = RemoteResponse>; + type RemoteChangesResult = RemoteResponse, u32)>>; + type RemoteBodyResult = RemoteResponse>; + + fn remote_header(&self, request: RemoteHeaderRequest) -> Self::RemoteHeaderResult { + let (sender, receiver) = oneshot::channel(); + let _ = self.requests_send.unbounded_send(RequestData::RemoteHeader(request, sender)); + RemoteResponse { receiver } + } + + fn remote_read(&self, request: RemoteReadRequest) -> Self::RemoteReadResult { + let (sender, receiver) = oneshot::channel(); + let _ = self.requests_send.unbounded_send(RequestData::RemoteRead(request, sender)); + RemoteResponse { receiver } + } + + fn remote_read_child( + &self, + request: RemoteReadChildRequest + ) -> Self::RemoteReadResult { + let (sender, receiver) = oneshot::channel(); + let _ = self.requests_send.unbounded_send(RequestData::RemoteReadChild(request, sender)); + RemoteResponse { receiver } + } + + fn remote_call(&self, request: RemoteCallRequest) -> Self::RemoteCallResult { + let (sender, receiver) = oneshot::channel(); + let _ = self.requests_send.unbounded_send(RequestData::RemoteCall(request, sender)); + RemoteResponse { receiver } + } + + fn remote_changes(&self, request: RemoteChangesRequest) -> Self::RemoteChangesResult { + let (sender, receiver) = oneshot::channel(); + let _ = self.requests_send.unbounded_send(RequestData::RemoteChanges(request, sender)); + RemoteResponse { receiver } + } + + fn remote_body(&self, request: RemoteBodyRequest) -> Self::RemoteBodyResult { + let (sender, receiver) = oneshot::channel(); + let _ = self.requests_send.unbounded_send(RequestData::RemoteBody(request, sender)); + RemoteResponse { receiver } + } +} + +/// Future for an on-demand remote call response. +pub struct RemoteResponse { + receiver: oneshot::Receiver>, +} + +impl Future for RemoteResponse { + type Item = T; + type Error = ClientError; + + fn poll(&mut self) -> Poll { + self.receiver.poll() + .map_err(|_| ClientError::RemoteFetchCancelled.into()) + .and_then(|r| match r { + Async::Ready(Ok(ready)) => Ok(Async::Ready(ready)), + Async::Ready(Err(error)) => Err(error), + Async::NotReady => Ok(Async::NotReady), + }) + } +} diff --git a/core/network/src/protocol.rs b/core/network/src/protocol.rs index c6ae27cb16c39dd9828c35dc785cfc411f8d272e..3038898b09c30821c3d11630b0af6749c2a3107e 100644 --- a/core/network/src/protocol.rs +++ b/core/network/src/protocol.rs @@ -14,29 +14,44 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use futures::{prelude::*, sync::mpsc}; -use network_libp2p::PeerId; +use futures::prelude::*; +use libp2p::PeerId; use primitives::storage::StorageKey; use consensus::{import_queue::IncomingBlock, import_queue::Origin, BlockOrigin}; use runtime_primitives::{generic::BlockId, ConsensusEngineId, Justification}; -use runtime_primitives::traits::{As, Block as BlockT, Header as HeaderT, NumberFor, Zero}; -use crate::message::{self, BlockRequest as BlockRequestMessage, Message}; -use crate::message::generic::{Message as GenericMessage, ConsensusMessage}; -use crate::consensus_gossip::{ConsensusGossip, MessageRecipient as GossipMessageRecipient}; -use crate::on_demand::OnDemandService; -use crate::specialization::NetworkSpecialization; -use crate::sync::{ChainSync, Status as SyncStatus, SyncState}; -use crate::service::{NetworkChan, NetworkMsg, TransactionPool, ExHashT}; -use crate::config::{ProtocolConfig, Roles}; -use parking_lot::RwLock; +use runtime_primitives::traits::{ + Block as BlockT, Header as HeaderT, NumberFor, One, Zero, + CheckedSub, SaturatedConversion +}; +use consensus::import_queue::SharedFinalityProofRequestBuilder; +use message::{ + BlockRequest as BlockRequestMessage, + FinalityProofRequest as FinalityProofRequestMessage, Message, +}; +use message::{BlockAttributes, Direction, FromBlock, RequestId}; +use message::generic::{Message as GenericMessage, ConsensusMessage}; +use consensus_gossip::{ConsensusGossip, MessageRecipient as GossipMessageRecipient}; +use on_demand::{OnDemandCore, OnDemandNetwork, RequestData}; +use specialization::NetworkSpecialization; +use sync::{ChainSync, Context as SyncContext, SyncState}; +use crate::service::{TransactionPool, ExHashT}; +use crate::config::Roles; use rustc_hex::ToHex; use std::collections::{BTreeMap, HashMap}; use std::sync::Arc; use std::{cmp, num::NonZeroUsize, time}; use log::{trace, debug, warn, error}; -use crate::chain::Client; -use client::light::fetcher::ChangesProof; -use crate::{error, util::LruHashSet}; +use crate::chain::{Client, FinalityProofProvider}; +use client::light::fetcher::{FetchChecker, ChangesProof}; +use crate::error; +use util::LruHashSet; + +mod util; +pub mod consensus_gossip; +pub mod message; +pub mod on_demand; +pub mod specialization; +pub mod sync; const REQUEST_TIMEOUT_SEC: u64 = 40; /// Interval at which we perform time based maintenance @@ -72,14 +87,13 @@ const RPC_FAILED_REPUTATION_CHANGE: i32 = -(1 << 12); // Lock must always be taken in order declared here. pub struct Protocol, H: ExHashT> { - network_chan: NetworkChan, - port: mpsc::UnboundedReceiver>, /// Interval at which we call `tick`. - tick_timeout: tokio::timer::Interval, + tick_timeout: tokio_timer::Interval, /// Interval at which we call `propagate_extrinsics`. - propagate_timeout: tokio::timer::Interval, + propagate_timeout: tokio_timer::Interval, config: ProtocolConfig, - on_demand: Option>>, + /// Handler for on-demand requests. + on_demand_core: OnDemandCore, genesis_hash: B::Hash, sync: ChainSync, specialization: S, @@ -87,10 +101,6 @@ pub struct Protocol, H: ExHashT> { context_data: ContextData, // Connected peers pending Status message. handshaking_peers: HashMap, - // Connected peers from whom we received a Status message, - // similar to context_data.peers but shared with the SyncProvider. - connected_peers: Arc>>>, - transaction_pool: Arc>, } /// A peer from whom we have received a Status message. @@ -105,19 +115,8 @@ struct HandshakingPeer { timestamp: time::Instant, } -/// Syncing status and statistics -#[derive(Clone)] -pub struct ProtocolStatus { - /// Sync status. - pub sync: SyncStatus, - /// Total number of connected peers - pub num_peers: usize, - /// Total number of active peers. - pub num_active_peers: usize, -} - /// Peer information -#[derive(Debug)] +#[derive(Debug, Clone)] struct Peer { info: PeerInfo, /// Current block request, if any. @@ -145,11 +144,131 @@ pub struct PeerInfo { pub best_number: ::Number, } +/// Context passed as input to the methods of `protocol.rs` and that is used to communicate back +/// with the network. +pub trait NetworkOut { + /// Adjusts the reputation of the peer. Use this to point out that a peer has been malign or + /// irresponsible or appeared lazy. + fn report_peer(&mut self, who: PeerId, reputation: i32); + + /// Force disconnecting from a peer. + fn disconnect_peer(&mut self, who: PeerId); + + /// Send a message to a peer. + fn send_message(&mut self, who: PeerId, message: Message); +} + +impl<'a, 'b, B: BlockT> OnDemandNetwork for &'a mut &'b mut dyn NetworkOut { + fn report_peer(&mut self, who: &PeerId, reputation: i32) { + NetworkOut::report_peer(**self, who.clone(), reputation) + } + + fn disconnect_peer(&mut self, who: &PeerId) { + NetworkOut::disconnect_peer(**self, who.clone()) + } + + fn send_header_request(&mut self, who: &PeerId, id: RequestId, block: <::Header as HeaderT>::Number) { + let message = message::generic::Message::RemoteHeaderRequest(message::RemoteHeaderRequest { + id, + block, + }); + + NetworkOut::send_message(**self, who.clone(), message) + } + + fn send_read_request(&mut self, who: &PeerId, id: RequestId, block: ::Hash, key: Vec) { + let message = message::generic::Message::RemoteReadRequest(message::RemoteReadRequest { + id, + block, + key, + }); + + NetworkOut::send_message(**self, who.clone(), message) + } + + fn send_read_child_request( + &mut self, + who: &PeerId, + id: RequestId, + block: ::Hash, + storage_key: Vec, + key: Vec + ) { + let message = message::generic::Message::RemoteReadChildRequest(message::RemoteReadChildRequest { + id, + block, + storage_key, + key, + }); + + NetworkOut::send_message(**self, who.clone(), message) + } + + fn send_call_request( + &mut self, + who: &PeerId, + id: RequestId, + block: ::Hash, + method: String, + data: Vec + ) { + let message = message::generic::Message::RemoteCallRequest(message::RemoteCallRequest { + id, + block, + method, + data, + }); + + NetworkOut::send_message(**self, who.clone(), message) + } + + fn send_changes_request( + &mut self, + who: &PeerId, + id: RequestId, + first: ::Hash, + last: ::Hash, + min: ::Hash, + max: ::Hash, + key: Vec + ) { + let message = message::generic::Message::RemoteChangesRequest(message::RemoteChangesRequest { + id, + first, + last, + min, + max, + key, + }); + + NetworkOut::send_message(**self, who.clone(), message) + } + + fn send_body_request( + &mut self, + who: &PeerId, + id: RequestId, + fields: BlockAttributes, + from: FromBlock<::Hash, <::Header as HeaderT>::Number>, + to: Option<::Hash>, + direction: Direction, + max: Option + ) { + let message = message::generic::Message::BlockRequest(message::BlockRequest:: { + id, + fields, + from, + to, + direction, + max, + }); + + NetworkOut::send_message(**self, who.clone(), message) + } +} + /// Context for a network-specific handler. pub trait Context { - /// Get a reference to the client. - fn client(&self) -> &crate::chain::Client; - /// Adjusts the reputation of the peer. Use this to point out that a peer has been malign or /// irresponsible or appeared lazy. fn report_peer(&mut self, who: PeerId, reputation: i32); @@ -157,12 +276,6 @@ pub trait Context { /// Force disconnecting from a peer. Use this when a peer misbehaved. fn disconnect_peer(&mut self, who: PeerId); - /// Get peer info. - fn peer_info(&self, peer: &PeerId) -> Option>; - - /// Request a block from a peer. - fn send_block_request(&mut self, who: PeerId, request: BlockRequestMessage); - /// Send a consensus message to a peer. fn send_consensus(&mut self, who: PeerId, consensus: ConsensusMessage); @@ -172,48 +285,72 @@ pub trait Context { /// Protocol context. struct ProtocolContext<'a, B: 'a + BlockT, H: 'a + ExHashT> { - network_chan: &'a NetworkChan, + network_out: &'a mut dyn NetworkOut, context_data: &'a mut ContextData, } impl<'a, B: BlockT + 'a, H: 'a + ExHashT> ProtocolContext<'a, B, H> { - fn new(context_data: &'a mut ContextData, network_chan: &'a NetworkChan) -> Self { - ProtocolContext { network_chan, context_data } + fn new(context_data: &'a mut ContextData, network_out: &'a mut dyn NetworkOut) -> Self { + ProtocolContext { network_out, context_data } } } impl<'a, B: BlockT + 'a, H: ExHashT + 'a> Context for ProtocolContext<'a, B, H> { fn report_peer(&mut self, who: PeerId, reputation: i32) { - self.network_chan.send(NetworkMsg::ReportPeer(who, reputation)) + self.network_out.report_peer(who, reputation) } fn disconnect_peer(&mut self, who: PeerId) { - self.network_chan.send(NetworkMsg::DisconnectPeer(who)) + self.network_out.disconnect_peer(who) } - fn peer_info(&self, who: &PeerId) -> Option> { - self.context_data.peers.get(who).map(|p| p.info.clone()) + fn send_consensus(&mut self, who: PeerId, consensus: ConsensusMessage) { + send_message( + &mut self.context_data.peers, + self.network_out, + who, + GenericMessage::Consensus(consensus) + ) } - fn client(&self) -> &Client { - &*self.context_data.chain + fn send_chain_specific(&mut self, who: PeerId, message: Vec) { + send_message( + &mut self.context_data.peers, + self.network_out, + who, + GenericMessage::ChainSpecific(message) + ) } +} - fn send_block_request(&mut self, who: PeerId, request: BlockRequestMessage) { - send_message(&mut self.context_data.peers, &self.network_chan, who, - GenericMessage::BlockRequest(request) - ) +impl<'a, B: BlockT + 'a, H: ExHashT + 'a> SyncContext for ProtocolContext<'a, B, H> { + fn report_peer(&mut self, who: PeerId, reputation: i32) { + self.network_out.report_peer(who, reputation) } - fn send_consensus(&mut self, who: PeerId, consensus: ConsensusMessage) { - send_message(&mut self.context_data.peers, &self.network_chan, who, - GenericMessage::Consensus(consensus) + fn disconnect_peer(&mut self, who: PeerId) { + self.network_out.disconnect_peer(who) + } + + fn client(&self) -> &dyn Client { + &*self.context_data.chain + } + + fn send_finality_proof_request(&mut self, who: PeerId, request: FinalityProofRequestMessage) { + send_message( + &mut self.context_data.peers, + self.network_out, + who, + GenericMessage::FinalityProofRequest(request) ) } - fn send_chain_specific(&mut self, who: PeerId, message: Vec) { - send_message(&mut self.context_data.peers, &self.network_chan, who, - GenericMessage::ChainSpecific(message) + fn send_block_request(&mut self, who: PeerId, request: BlockRequestMessage) { + send_message( + &mut self.context_data.peers, + self.network_out, + who, + GenericMessage::BlockRequest(request) ) } } @@ -222,208 +359,116 @@ impl<'a, B: BlockT + 'a, H: ExHashT + 'a> Context for ProtocolContext<'a, B, struct ContextData { // All connected peers peers: HashMap>, - pub chain: Arc>, -} - -/// A task, consisting of a user-provided closure, to be executed on the Protocol thread. -pub trait SpecTask> { - fn call_box(self: Box, spec: &mut S, context: &mut Context); + pub chain: Arc>, } -impl, F: FnOnce(&mut S, &mut Context)> SpecTask for F { - fn call_box(self: Box, spec: &mut S, context: &mut Context) { - (*self)(spec, context) - } -} - -/// A task, consisting of a user-provided closure, to be executed on the Protocol thread. -pub trait GossipTask { - fn call_box(self: Box, gossip: &mut ConsensusGossip, context: &mut Context); +/// Configuration for the Substrate-specific part of the networking layer. +#[derive(Clone)] +pub struct ProtocolConfig { + /// Assigned roles. + pub roles: Roles, } -impl, &mut Context)> GossipTask for F { - fn call_box(self: Box, gossip: &mut ConsensusGossip, context: &mut Context) { - (*self)(gossip, context) +impl Default for ProtocolConfig { + fn default() -> ProtocolConfig { + ProtocolConfig { + roles: Roles::FULL, + } } } -/// Messages sent to Protocol from elsewhere inside the system. -pub enum ProtocolMsg> { - /// A batch of blocks has been processed, with or without errors. - BlocksProcessed(Vec, bool), - /// Tell protocol to restart sync. - RestartSync, - /// Tell protocol to propagate extrinsics. - PropagateExtrinsics, - /// Tell protocol that a block was imported (sent by the import-queue). - BlockImportedSync(B::Hash, NumberFor), - /// Tell protocol to clear all pending justification requests. - ClearJustificationRequests, - /// Tell protocol to request justification for a block. - RequestJustification(B::Hash, NumberFor), - /// Inform protocol whether a justification was successfully imported. - JustificationImportResult(B::Hash, NumberFor, bool), - /// Propagate a block to peers. - AnnounceBlock(B::Hash), - /// A block has been imported (sent by the client). - BlockImported(B::Hash, B::Header), - /// A block has been finalized (sent by the client). - BlockFinalized(B::Hash, B::Header), - /// Execute a closure with the chain-specific network specialization. - ExecuteWithSpec(Box + Send + 'static>), - /// Execute a closure with the consensus gossip. - ExecuteWithGossip(Box + Send + 'static>), - /// Incoming gossip consensus message. - GossipConsensusMessage(B::Hash, ConsensusEngineId, Vec, GossipMessageRecipient), - /// Tell protocol to perform regular maintenance. - #[cfg(any(test, feature = "test-helpers"))] - Tick, - /// Synchronization request. - #[cfg(any(test, feature = "test-helpers"))] - Synchronize, -} - impl, H: ExHashT> Protocol { /// Create a new instance. pub fn new( - connected_peers: Arc>>>, - network_chan: NetworkChan, config: ProtocolConfig, - chain: Arc>, - on_demand: Option>>, - transaction_pool: Arc>, + chain: Arc>, + checker: Arc>, specialization: S, - ) -> error::Result<(Protocol, mpsc::UnboundedSender>)> { - let (protocol_sender, port) = mpsc::unbounded(); - let info = chain.info()?; + ) -> error::Result> { + let info = chain.info(); let sync = ChainSync::new(config.roles, &info); - let protocol = Protocol { - network_chan, - port, - tick_timeout: tokio::timer::Interval::new_interval(TICK_TIMEOUT), - propagate_timeout: tokio::timer::Interval::new_interval(PROPAGATE_TIMEOUT), + Ok(Protocol { + tick_timeout: tokio_timer::Interval::new_interval(TICK_TIMEOUT), + propagate_timeout: tokio_timer::Interval::new_interval(PROPAGATE_TIMEOUT), config: config, context_data: ContextData { peers: HashMap::new(), chain, }, - on_demand, + on_demand_core: OnDemandCore::new(checker), genesis_hash: info.chain.genesis_hash, sync, specialization: specialization, consensus_gossip: ConsensusGossip::new(), handshaking_peers: HashMap::new(), - connected_peers, - transaction_pool: transaction_pool, - }; + }) + } - Ok((protocol, protocol_sender)) + /// Returns the number of peers we're connected to. + pub fn num_connected_peers(&self) -> usize { + self.context_data.peers.values().count() } - /// Returns an object representing the status of the protocol. - pub fn status(&mut self) -> ProtocolStatus { - ProtocolStatus { - sync: self.sync.status(), - num_peers: self.context_data.peers.values().count(), - num_active_peers: self - .context_data - .peers - .values() - .filter(|p| p.block_request.is_some()) - .count(), - } + /// Returns the number of peers we're connected to and that are being queried. + pub fn num_active_peers(&self) -> usize { + self.context_data + .peers + .values() + .filter(|p| p.block_request.is_some()) + .count() } - pub fn is_major_syncing(&self) -> bool { - self.sync.status().is_major_syncing() + /// Current global sync state. + pub fn sync_state(&self) -> SyncState { + self.sync.status().state } - pub fn is_offline(&self) -> bool { - self.sync.status().is_offline() + /// Target sync block number. + pub fn best_seen_block(&self) -> Option> { + self.sync.status().best_seen_block } -} -impl, H: ExHashT> Future for Protocol { - type Item = (); - type Error = void::Void; + /// Number of peers participating in syncing. + pub fn num_sync_peers(&self) -> u32 { + self.sync.status().num_peers + } + + /// Starts a new data demand request. + /// + /// The parameter contains a `Sender` where the result, once received, must be sent. + pub(crate) fn add_on_demand_request(&mut self, mut network_out: &mut dyn NetworkOut, rq: RequestData) { + self.on_demand_core.add_request(&mut network_out, rq); + } - fn poll(&mut self) -> Poll { + pub fn poll( + &mut self, + network_out: &mut dyn NetworkOut, + transaction_pool: &(impl TransactionPool + ?Sized) + ) -> Poll { while let Ok(Async::Ready(_)) = self.tick_timeout.poll() { - self.tick(); + self.tick(network_out); } while let Ok(Async::Ready(_)) = self.propagate_timeout.poll() { - self.propagate_extrinsics(); - } - - loop { - match self.port.poll() { - Ok(Async::Ready(None)) | Err(_) => return Ok(Async::Ready(())), - Ok(Async::Ready(Some(msg))) => if !self.handle_client_msg(msg) { - return Ok(Async::Ready(())) - } - Ok(Async::NotReady) => break, - } + self.propagate_extrinsics(network_out, transaction_pool); } Ok(Async::NotReady) } -} -impl, H: ExHashT> Protocol { - fn handle_client_msg(&mut self, msg: ProtocolMsg) -> bool { - match msg { - ProtocolMsg::BlockImported(hash, header) => self.on_block_imported(hash, &header), - ProtocolMsg::BlockFinalized(hash, header) => self.on_block_finalized(hash, &header), - ProtocolMsg::ExecuteWithSpec(task) => { - let mut context = - ProtocolContext::new(&mut self.context_data, &self.network_chan); - task.call_box(&mut self.specialization, &mut context); - }, - ProtocolMsg::ExecuteWithGossip(task) => { - let mut context = - ProtocolContext::new(&mut self.context_data, &self.network_chan); - task.call_box(&mut self.consensus_gossip, &mut context); - } - ProtocolMsg::GossipConsensusMessage(topic, engine_id, message, recipient) => { - self.gossip_consensus_message(topic, engine_id, message, recipient) - } - ProtocolMsg::BlocksProcessed(hashes, has_error) => { - self.sync.blocks_processed(hashes, has_error); - let mut context = - ProtocolContext::new(&mut self.context_data, &self.network_chan); - self.sync.maintain_sync(&mut context); - }, - ProtocolMsg::RestartSync => { - let mut context = - ProtocolContext::new(&mut self.context_data, &self.network_chan); - self.sync.restart(&mut context); - } - ProtocolMsg::AnnounceBlock(hash) => self.announce_block(hash), - ProtocolMsg::BlockImportedSync(hash, number) => self.sync.block_imported(&hash, number), - ProtocolMsg::ClearJustificationRequests => self.sync.clear_justification_requests(), - ProtocolMsg::RequestJustification(hash, number) => { - let mut context = - ProtocolContext::new(&mut self.context_data, &self.network_chan); - self.sync.request_justification(&hash, number, &mut context); - }, - ProtocolMsg::JustificationImportResult(hash, number, success) => self.sync.justification_import_result(hash, number, success), - ProtocolMsg::PropagateExtrinsics => self.propagate_extrinsics(), - #[cfg(any(test, feature = "test-helpers"))] - ProtocolMsg::Tick => self.tick(), - #[cfg(any(test, feature = "test-helpers"))] - ProtocolMsg::Synchronize => { - trace!(target: "sync", "handle_client_msg: received Synchronize msg"); - self.network_chan.send(NetworkMsg::Synchronized) - } - } - true + fn is_on_demand_response(&self, who: &PeerId, response_id: message::RequestId) -> bool { + self.on_demand_core.is_on_demand_response(&who, response_id) } - fn handle_response(&mut self, who: PeerId, response: &message::BlockResponse) -> Option> { + fn handle_response( + &mut self, + network_out: &mut dyn NetworkOut, + who: PeerId, + response: &message::BlockResponse + ) -> Option> { if let Some(ref mut peer) = self.context_data.peers.get_mut(&who) { if let Some(_) = peer.obsolete_requests.remove(&response.id) { - trace!(target: "sync", "Ignoring obsolete block response packet from {} ({})", who, response.id,); + trace!(target: "sync", "Ignoring obsolete block response packet from {} ({})", who, response.id); return None; } // Clear the request. If the response is invalid peer will be disconnected anyway. @@ -432,8 +477,8 @@ impl, H: ExHashT> Protocol { return request.map(|(_, r)| r) } trace!(target: "sync", "Unexpected response packet from {} ({})", who, response.id); - self.network_chan.send(NetworkMsg::ReportPeer(who.clone(), i32::min_value())); - self.network_chan.send(NetworkMsg::DisconnectPeer(who)); + network_out.report_peer(who.clone(), i32::min_value()); + network_out.disconnect_peer(who); } None } @@ -444,49 +489,74 @@ impl, H: ExHashT> Protocol { peer.info.best_hash = info.best_hash; peer.info.best_number = info.best_number; } - let mut peers = self.connected_peers.write(); - if let Some(ref mut peer) = peers.get_mut(who) { - peer.peer_info.best_hash = info.best_hash; - peer.peer_info.best_number = info.best_number; - } } } - pub fn on_custom_message(&mut self, who: PeerId, message: Message) -> CustomMessageOutcome { + /// Returns information about all the peers we are connected to after the handshake message. + pub fn peers_info(&self) -> impl Iterator)> { + self.context_data.peers.iter().map(|(id, peer)| (id, &peer.info)) + } + + pub fn on_custom_message( + &mut self, + network_out: &mut dyn NetworkOut, + transaction_pool: &(impl TransactionPool + ?Sized), + who: PeerId, + message: Message, + finality_proof_provider: Option<&dyn FinalityProofProvider> + ) -> CustomMessageOutcome { match message { - GenericMessage::Status(s) => self.on_status_message(who, s), - GenericMessage::BlockRequest(r) => self.on_block_request(who, r), + GenericMessage::Status(s) => self.on_status_message(network_out, who, s), + GenericMessage::BlockRequest(r) => self.on_block_request(network_out, who, r), GenericMessage::BlockResponse(r) => { - if let Some(request) = self.handle_response(who.clone(), &r) { - let outcome = self.on_block_response(who.clone(), request, r); - self.update_peer_info(&who); - return outcome + // Note, this is safe because only `ordinary bodies` and `remote bodies` are received in this matter. + if self.is_on_demand_response(&who, r.id) { + self.on_remote_body_response(network_out, who, r); + } else { + if let Some(request) = self.handle_response(network_out, who.clone(), &r) { + let outcome = self.on_block_response(network_out, who.clone(), request, r); + self.update_peer_info(&who); + return outcome + } } }, GenericMessage::BlockAnnounce(announce) => { - self.on_block_announce(who.clone(), announce); + let outcome = self.on_block_announce(network_out, who.clone(), announce); self.update_peer_info(&who); + return outcome; }, - GenericMessage::Transactions(m) => self.on_extrinsics(who, m), - GenericMessage::RemoteCallRequest(request) => self.on_remote_call_request(who, request), - GenericMessage::RemoteCallResponse(response) => self.on_remote_call_response(who, response), - GenericMessage::RemoteReadRequest(request) => self.on_remote_read_request(who, request), - GenericMessage::RemoteReadResponse(response) => self.on_remote_read_response(who, response), - GenericMessage::RemoteHeaderRequest(request) => self.on_remote_header_request(who, request), - GenericMessage::RemoteHeaderResponse(response) => self.on_remote_header_response(who, response), - GenericMessage::RemoteChangesRequest(request) => self.on_remote_changes_request(who, request), - GenericMessage::RemoteChangesResponse(response) => self.on_remote_changes_response(who, response), + GenericMessage::Transactions(m) => + self.on_extrinsics(network_out, transaction_pool, who, m), + GenericMessage::RemoteCallRequest(request) => self.on_remote_call_request(network_out, who, request), + GenericMessage::RemoteCallResponse(response) => + self.on_remote_call_response(network_out, who, response), + GenericMessage::RemoteReadRequest(request) => + self.on_remote_read_request(network_out, who, request), + GenericMessage::RemoteReadResponse(response) => + self.on_remote_read_response(network_out, who, response), + GenericMessage::RemoteHeaderRequest(request) => + self.on_remote_header_request(network_out, who, request), + GenericMessage::RemoteHeaderResponse(response) => + self.on_remote_header_response(network_out, who, response), + GenericMessage::RemoteChangesRequest(request) => + self.on_remote_changes_request(network_out, who, request), + GenericMessage::RemoteChangesResponse(response) => + self.on_remote_changes_response(network_out, who, response), + GenericMessage::FinalityProofRequest(request) => + self.on_finality_proof_request(network_out, who, request, finality_proof_provider), + GenericMessage::FinalityProofResponse(response) => + return self.on_finality_proof_response(network_out, who, response), GenericMessage::Consensus(msg) => { if self.context_data.peers.get(&who).map_or(false, |peer| peer.info.protocol_version > 2) { self.consensus_gossip.on_incoming( - &mut ProtocolContext::new(&mut self.context_data, &self.network_chan), + &mut ProtocolContext::new(&mut self.context_data, network_out), who, msg, ); } } other => self.specialization.on_message( - &mut ProtocolContext::new(&mut self.context_data, &self.network_chan), + &mut ProtocolContext::new(&mut self.context_data, network_out), who, &mut Some(other), ), @@ -495,23 +565,43 @@ impl, H: ExHashT> Protocol { CustomMessageOutcome::None } - fn send_message(&mut self, who: PeerId, message: Message) { + fn send_message(&mut self, network_out: &mut dyn NetworkOut, who: PeerId, message: Message) { send_message::( &mut self.context_data.peers, - &self.network_chan, + network_out, who, message, ); } - fn gossip_consensus_message( + /// Locks `self` and returns a context plus the `ConsensusGossip` struct. + pub fn consensus_gossip_lock<'a>( + &'a mut self, + network_out: &'a mut dyn NetworkOut + ) -> (impl Context + 'a, &'a mut ConsensusGossip) { + let context = ProtocolContext::new(&mut self.context_data, network_out); + (context, &mut self.consensus_gossip) + } + + /// Locks `self` and returns a context plus the network specialization. + pub fn specialization_lock<'a>( + &'a mut self, + network_out: &'a mut dyn NetworkOut + ) -> (impl Context + 'a, &'a mut S) { + let context = ProtocolContext::new(&mut self.context_data, network_out); + (context, &mut self.specialization) + } + + /// Gossip a consensus message to the network. + pub fn gossip_consensus_message( &mut self, + network_out: &mut dyn NetworkOut, topic: B::Hash, engine_id: ConsensusEngineId, message: Vec, recipient: GossipMessageRecipient, ) { - let mut context = ProtocolContext::new(&mut self.context_data, &self.network_chan); + let mut context = ProtocolContext::new(&mut self.context_data, network_out); let message = ConsensusMessage { data: message, engine_id }; match recipient { GossipMessageRecipient::BroadcastToAll => @@ -519,41 +609,40 @@ impl, H: ExHashT> Protocol { GossipMessageRecipient::BroadcastNew => self.consensus_gossip.multicast(&mut context, topic, message, false), GossipMessageRecipient::Peer(who) => - self.send_message(who, GenericMessage::Consensus(message)), + self.send_message(network_out, who, GenericMessage::Consensus(message)), } } /// Called when a new peer is connected - pub fn on_peer_connected(&mut self, who: PeerId, debug_info: String) { - trace!(target: "sync", "Connecting {}: {}", who, debug_info); + pub fn on_peer_connected(&mut self, network_out: &mut dyn NetworkOut, who: PeerId) { + trace!(target: "sync", "Connecting {}", who); self.handshaking_peers.insert(who.clone(), HandshakingPeer { timestamp: time::Instant::now() }); - self.send_status(who); + self.send_status(network_out, who); } /// Called by peer when it is disconnecting - pub fn on_peer_disconnected(&mut self, peer: PeerId, debug_info: String) { - trace!(target: "sync", "Disconnecting {}: {}", peer, debug_info); + pub fn on_peer_disconnected(&mut self, mut network_out: &mut dyn NetworkOut, peer: PeerId) { + trace!(target: "sync", "Disconnecting {}", peer); // lock all the the peer lists so that add/remove peer events are in order let removed = { self.handshaking_peers.remove(&peer); - self.connected_peers.write().remove(&peer); self.context_data.peers.remove(&peer) }; if let Some(peer_data) = removed { - let mut context = ProtocolContext::new(&mut self.context_data, &self.network_chan); + let mut context = ProtocolContext::new(&mut self.context_data, network_out); if peer_data.info.protocol_version > 2 { self.consensus_gossip.peer_disconnected(&mut context, peer.clone()); } self.sync.peer_disconnected(&mut context, peer.clone()); self.specialization.on_disconnect(&mut context, peer.clone()); - self.on_demand.as_ref().map(|s| s.on_disconnect(peer)); + self.on_demand_core.on_disconnect(&mut network_out, peer); } } /// Called as a back-pressure mechanism if the networking detects that the peer cannot process /// our messaging rate fast enough. - pub fn on_clogged_peer(&self, who: PeerId, _msg: Option>) { - self.network_chan.send(NetworkMsg::ReportPeer(who.clone(), CLOGGED_PEER_REPUTATION_CHANGE)); + pub fn on_clogged_peer(&self, network_out: &mut dyn NetworkOut, who: PeerId, _msg: Option>) { + network_out.report_peer(who.clone(), CLOGGED_PEER_REPUTATION_CHANGE); // Print some diagnostics. if let Some(peer) = self.context_data.peers.get(&who) { @@ -566,19 +655,27 @@ impl, H: ExHashT> Protocol { } } - /// Puts the `Synchronized` message on `network_chan`. - #[cfg(any(test, feature = "test-helpers"))] - pub fn synchronize(&self) { - self.network_chan.send(NetworkMsg::Synchronized); - } - - fn on_block_request(&mut self, peer: PeerId, request: message::BlockRequest) { + fn on_block_request( + &mut self, + network_out: &mut dyn NetworkOut, + peer: PeerId, + request: message::BlockRequest + ) { trace!(target: "sync", "BlockRequest {} from {}: from {:?} to {:?} max {:?}", request.id, peer, request.from, request.to, request.max); + + // sending block requests to the node that is unable to serve it is considered a bad behavior + if !self.config.roles.is_full() { + trace!(target: "sync", "Peer {} is trying to sync from the light node", peer); + network_out.disconnect_peer(peer.clone()); + network_out.report_peer(peer, i32::min_value()); + return; + } + let mut blocks = Vec::new(); let mut id = match request.from { message::FromBlock::Hash(h) => BlockId::Hash(h), @@ -619,9 +716,9 @@ impl, H: ExHashT> Protocol { }; blocks.push(block_data); match request.direction { - message::Direction::Ascending => id = BlockId::Number(number + As::sa(1)), + message::Direction::Ascending => id = BlockId::Number(number + One::one()), message::Direction::Descending => { - if number == As::sa(0) { + if number.is_zero() { break; } id = BlockId::Hash(parent_hash) @@ -633,34 +730,38 @@ impl, H: ExHashT> Protocol { blocks: blocks, }; trace!(target: "sync", "Sending BlockResponse with {} blocks", response.blocks.len()); - self.send_message(peer, GenericMessage::BlockResponse(response)) + self.send_message(network_out, peer, GenericMessage::BlockResponse(response)) } fn on_block_response( &mut self, + network_out: &mut dyn NetworkOut, peer: PeerId, request: message::BlockRequest, response: message::BlockResponse, ) -> CustomMessageOutcome { let blocks_range = match ( - response.blocks.first().and_then(|b| b.header.as_ref().map(|h| h.number())), - response.blocks.last().and_then(|b| b.header.as_ref().map(|h| h.number())), - ) { - (Some(first), Some(last)) if first != last => format!(" ({}..{})", first, last), - (Some(first), Some(_)) => format!(" ({})", first), - _ => Default::default(), - }; + response.blocks.first().and_then(|b| b.header.as_ref().map(|h| h.number())), + response.blocks.last().and_then(|b| b.header.as_ref().map(|h| h.number())), + ) { + (Some(first), Some(last)) if first != last => format!(" ({}..{})", first, last), + (Some(first), Some(_)) => format!(" ({})", first), + _ => Default::default(), + }; trace!(target: "sync", "BlockResponse {} from {} with {} blocks {}", - response.id, peer, response.blocks.len(), blocks_range); + response.id, + peer, + response.blocks.len(), + blocks_range + ); // TODO [andre]: move this logic to the import queue so that // justifications are imported asynchronously (#1482) if request.fields == message::BlockAttributes::JUSTIFICATION { let outcome = self.sync.on_block_justification_data( - &mut ProtocolContext::new(&mut self.context_data, &self.network_chan), + &mut ProtocolContext::new(&mut self.context_data, network_out), peer, - request, - response, + response ); if let Some((origin, hash, nb, just)) = outcome { @@ -670,7 +771,12 @@ impl, H: ExHashT> Protocol { } } else { - let outcome = self.sync.on_block_data(&mut ProtocolContext::new(&mut self.context_data, &self.network_chan), peer, request, response); + let outcome = self.sync.on_block_data( + &mut ProtocolContext::new(&mut self.context_data, network_out), + peer, + request, + response + ); if let Some((origin, blocks)) = outcome { CustomMessageOutcome::BlockImport(origin, blocks) } else { @@ -680,16 +786,16 @@ impl, H: ExHashT> Protocol { } /// Perform time based maintenance. - fn tick(&mut self) { - self.consensus_gossip.tick(&mut ProtocolContext::new(&mut self.context_data, &self.network_chan)); - self.maintain_peers(); - self.sync.tick(&mut ProtocolContext::new(&mut self.context_data, &self.network_chan)); - self.on_demand - .as_ref() - .map(|s| s.maintain_peers()); + /// + /// > **Note**: This method normally doesn't have to be called except for testing purposes. + pub fn tick(&mut self, mut network_out: &mut dyn NetworkOut) { + self.consensus_gossip.tick(&mut ProtocolContext::new(&mut self.context_data, network_out)); + self.maintain_peers(network_out); + self.sync.tick(&mut ProtocolContext::new(&mut self.context_data, network_out)); + self.on_demand_core.maintain_peers(&mut network_out); } - fn maintain_peers(&mut self) { + fn maintain_peers(&mut self, network_out: &mut dyn NetworkOut) { let tick = time::Instant::now(); let mut aborting = Vec::new(); { @@ -702,26 +808,28 @@ impl, H: ExHashT> Protocol { aborting.push(who.clone()); } } - for (who, _) in self.handshaking_peers.iter().filter(|(_, handshaking)| (tick - handshaking.timestamp).as_secs() > REQUEST_TIMEOUT_SEC) { + for (who, _) in self.handshaking_peers.iter() + .filter(|(_, handshaking)| (tick - handshaking.timestamp).as_secs() > REQUEST_TIMEOUT_SEC) + { trace!(target: "sync", "Handshake timeout {}", who); aborting.push(who.clone()); } } - self.specialization.maintain_peers(&mut ProtocolContext::new(&mut self.context_data, &self.network_chan)); + self.specialization.maintain_peers(&mut ProtocolContext::new(&mut self.context_data, network_out)); for p in aborting { - let _ = self.network_chan.send(NetworkMsg::DisconnectPeer(p.clone())); - let _ = self.network_chan.send(NetworkMsg::ReportPeer(p, TIMEOUT_REPUTATION_CHANGE)); + network_out.disconnect_peer(p.clone()); + network_out.report_peer(p, TIMEOUT_REPUTATION_CHANGE); } } /// Called by peer to report status - fn on_status_message(&mut self, who: PeerId, status: message::Status) { + fn on_status_message(&mut self, mut network_out: &mut dyn NetworkOut, who: PeerId, status: message::Status) { trace!(target: "sync", "New peer {} {:?}", who, status); let protocol_version = { if self.context_data.peers.contains_key(&who) { debug!("Unexpected status packet from {}", who); - self.network_chan.send(NetworkMsg::ReportPeer(who, UNEXPECTED_STATUS_REPUTATION_CHANGE)); + network_out.report_peer(who, UNEXPECTED_STATUS_REPUTATION_CHANGE); return; } if status.genesis_hash != self.genesis_hash { @@ -730,32 +838,40 @@ impl, H: ExHashT> Protocol { "Peer is on different chain (our genesis: {} theirs: {})", self.genesis_hash, status.genesis_hash ); - self.network_chan.send(NetworkMsg::ReportPeer(who.clone(), i32::min_value())); - self.network_chan.send(NetworkMsg::DisconnectPeer(who)); + network_out.report_peer(who.clone(), i32::min_value()); + network_out.disconnect_peer(who); return; } if status.version < MIN_VERSION && CURRENT_VERSION < status.min_supported_version { trace!(target: "protocol", "Peer {:?} using unsupported protocol version {}", who, status.version); - self.network_chan.send(NetworkMsg::ReportPeer(who.clone(), i32::min_value())); - self.network_chan.send(NetworkMsg::DisconnectPeer(who)); + network_out.report_peer(who.clone(), i32::min_value()); + network_out.disconnect_peer(who); return; } - if self.config.roles & Roles::LIGHT == Roles::LIGHT { + + if self.config.roles.is_light() { + // we're not interested in light peers + if status.roles.is_light() { + debug!(target: "sync", "Peer {} is unable to serve light requests", who); + network_out.report_peer(who.clone(), i32::min_value()); + network_out.disconnect_peer(who); + return; + } + + // we don't interested in peers that are far behind us let self_best_block = self .context_data .chain .info() - .ok() - .and_then(|info| info.best_queued_number) - .unwrap_or_else(|| Zero::zero()); + .chain.best_number; let blocks_difference = self_best_block - .as_() - .checked_sub(status.best_number.as_()) - .unwrap_or(0); + .checked_sub(&status.best_number) + .unwrap_or_else(Zero::zero) + .saturated_into::(); if blocks_difference > LIGHT_MAXIMAL_BLOCKS_DIFFERENCE { debug!(target: "sync", "Peer {} is far behind us and will unable to serve light requests", who); - self.network_chan.send(NetworkMsg::ReportPeer(who.clone(), PEER_BEHIND_US_LIGHT_REPUTATION_CHANGE)); - self.network_chan.send(NetworkMsg::DisconnectPeer(who)); + network_out.report_peer(who.clone(), PEER_BEHIND_US_LIGHT_REPUTATION_CHANGE); + network_out.disconnect_peer(who); return; } } @@ -764,16 +880,12 @@ impl, H: ExHashT> Protocol { let info = match self.handshaking_peers.remove(&who) { Some(_handshaking) => { - let peer_info = PeerInfo { + PeerInfo { protocol_version: status.version, roles: status.roles, best_hash: status.best_hash, best_number: status.best_number - }; - self.connected_peers - .write() - .insert(who.clone(), ConnectedPeer { peer_info: peer_info.clone() }); - peer_info + } }, None => { error!(target: "sync", "Received status from previously unconnected node {}", who); @@ -795,11 +907,10 @@ impl, H: ExHashT> Protocol { status.version }; - let mut context = ProtocolContext::new(&mut self.context_data, &self.network_chan); - self.on_demand - .as_ref() - .map(|s| s.on_connect(who.clone(), status.roles, status.best_number)); - self.sync.new_peer(&mut context, who.clone()); + let info = self.context_data.peers.get(&who).expect("We just inserted above; QED").info.clone(); + self.on_demand_core.on_connect(&mut network_out, who.clone(), status.roles, status.best_number); + let mut context = ProtocolContext::new(&mut self.context_data, network_out); + self.sync.new_peer(&mut context, who.clone(), info); if protocol_version > 2 { self.consensus_gossip.new_peer(&mut context, who.clone(), status.roles); } @@ -807,7 +918,13 @@ impl, H: ExHashT> Protocol { } /// Called when peer sends us new extrinsics - fn on_extrinsics(&mut self, who: PeerId, extrinsics: message::Transactions) { + fn on_extrinsics( + &mut self, + network_out: &mut dyn NetworkOut, + transaction_pool: &(impl TransactionPool + ?Sized), + who: PeerId, + extrinsics: message::Transactions + ) { // Accept extrinsics only when fully synced if self.sync.status().state != SyncState::Idle { trace!(target: "sync", "{} Ignoring extrinsics while syncing", who); @@ -816,8 +933,8 @@ impl, H: ExHashT> Protocol { trace!(target: "sync", "Received {} extrinsics from {}", extrinsics.len(), who); if let Some(ref mut peer) = self.context_data.peers.get_mut(&who) { for t in extrinsics { - if let Some(hash) = self.transaction_pool.import(&t) { - self.network_chan.send(NetworkMsg::ReportPeer(who.clone(), NEW_EXTRINSIC_REPUTATION_CHANGE)); + if let Some(hash) = transaction_pool.import(&t) { + network_out.report_peer(who.clone(), NEW_EXTRINSIC_REPUTATION_CHANGE); peer.known_extrinsics.insert(hash); } else { trace!(target: "sync", "Extrinsic rejected"); @@ -826,8 +943,12 @@ impl, H: ExHashT> Protocol { } } - /// Called when we propagate ready extrinsics to peers. - fn propagate_extrinsics(&mut self) { + /// Call when we must propagate ready extrinsics to peers. + pub fn propagate_extrinsics( + &mut self, + network_out: &mut dyn NetworkOut, + transaction_pool: &(impl TransactionPool + ?Sized) + ) { debug!(target: "sync", "Propagating extrinsics"); // Accept transactions only when fully synced @@ -835,7 +956,7 @@ impl, H: ExHashT> Protocol { return; } - let extrinsics = self.transaction_pool.transactions(); + let extrinsics = transaction_pool.transactions(); let mut propagated_to = HashMap::new(); for (who, peer) in self.context_data.peers.iter_mut() { let (hashes, to_send): (Vec<_>, Vec<_>) = extrinsics @@ -852,17 +973,18 @@ impl, H: ExHashT> Protocol { .push(who.to_base58()); } trace!(target: "sync", "Sending {} transactions to {}", to_send.len(), who); - self.network_chan.send(NetworkMsg::Outgoing(who.clone(), GenericMessage::Transactions(to_send))) + network_out.send_message(who.clone(), GenericMessage::Transactions(to_send)) } } - self.transaction_pool.on_broadcasted(propagated_to); + + transaction_pool.on_broadcasted(propagated_to); } /// Make sure an important block is propagated to peers. /// /// In chain-based consensus, we often need to make sure non-best forks are /// at least temporarily synced. - fn announce_block(&mut self, hash: B::Hash) { + pub fn announce_block(&mut self, network_out: &mut dyn NetworkOut, hash: B::Hash) { let header = match self.context_data.chain.header(&BlockId::Hash(hash)) { Ok(Some(header)) => header, Ok(None) => { @@ -881,27 +1003,32 @@ impl, H: ExHashT> Protocol { for (who, ref mut peer) in self.context_data.peers.iter_mut() { trace!(target: "sync", "Reannouncing block {:?} to {}", hash, who); peer.known_blocks.insert(hash); - self.network_chan.send(NetworkMsg::Outgoing(who.clone(), message.clone())) + network_out.send_message(who.clone(), message.clone()) } } /// Send Status message - fn send_status(&mut self, who: PeerId) { - if let Ok(info) = self.context_data.chain.info() { - let status = message::generic::Status { - version: CURRENT_VERSION, - min_supported_version: MIN_VERSION, - genesis_hash: info.chain.genesis_hash, - roles: self.config.roles.into(), - best_number: info.chain.best_number, - best_hash: info.chain.best_hash, - chain_status: self.specialization.status(), - }; - self.send_message(who, GenericMessage::Status(status)) - } + fn send_status(&mut self, network_out: &mut dyn NetworkOut, who: PeerId) { + let info = self.context_data.chain.info(); + let status = message::generic::Status { + version: CURRENT_VERSION, + min_supported_version: MIN_VERSION, + genesis_hash: info.chain.genesis_hash, + roles: self.config.roles.into(), + best_number: info.chain.best_number, + best_hash: info.chain.best_hash, + chain_status: self.specialization.status(), + }; + + self.send_message(network_out, who, GenericMessage::Status(status)) } - fn on_block_announce(&mut self, who: PeerId, announce: message::BlockAnnounce) { + fn on_block_announce( + &mut self, + mut network_out: &mut dyn NetworkOut, + who: PeerId, + announce: message::BlockAnnounce + ) -> CustomMessageOutcome { let header = announce.header; let hash = header.hash(); { @@ -909,27 +1036,70 @@ impl, H: ExHashT> Protocol { peer.known_blocks.insert(hash.clone()); } } - self.on_demand - .as_ref() - .map(|s| s.on_block_announce(who.clone(), *header.number())); - self.sync.on_block_announce( - &mut ProtocolContext::new(&mut self.context_data, &self.network_chan), + self.on_demand_core.on_block_announce(&mut network_out, who.clone(), *header.number()); + let try_import = self.sync.on_block_announce( + &mut ProtocolContext::new(&mut self.context_data, network_out), who.clone(), hash, &header, ); + + // try_import is only true when we have all data required to import block + // in the BlockAnnounce message. This is only when: + // 1) we're on light client; + // AND + // - EITHER 2.1) announced block is stale; + // - OR 2.2) announced block is NEW and we normally only want to download this single block (i.e. + // there are no ascendants of this block scheduled for retrieval) + if !try_import { + return CustomMessageOutcome::None; + } + + // to import header from announced block let's construct response to request that normally would have + // been sent over network (but it is not in our case) + let blocks_to_import = self.sync.on_block_data( + &mut ProtocolContext::new(&mut self.context_data, network_out), + who.clone(), + message::generic::BlockRequest { + id: 0, + fields: BlockAttributes::HEADER, + from: message::FromBlock::Hash(hash), + to: None, + direction: message::Direction::Ascending, + max: Some(1), + }, + message::generic::BlockResponse { + id: 0, + blocks: vec![ + message::generic::BlockData { + hash: hash, + header: Some(header), + body: None, + receipt: None, + message_queue: None, + justification: None, + }, + ], + }, + ); + match blocks_to_import { + Some((origin, blocks)) => CustomMessageOutcome::BlockImport(origin, blocks), + None => CustomMessageOutcome::None, + } } - fn on_block_imported(&mut self, hash: B::Hash, header: &B::Header) { + /// Call this when a block has been imported in the import queue and we should announce it on + /// the network. + pub fn on_block_imported(&mut self, network_out: &mut dyn NetworkOut, hash: B::Hash, header: &B::Header) { self.sync.update_chain_info(header); self.specialization.on_block_imported( - &mut ProtocolContext::new(&mut self.context_data, &self.network_chan), + &mut ProtocolContext::new(&mut self.context_data, network_out), hash.clone(), header, ); // blocks are not announced by light clients - if self.config.roles & Roles::LIGHT == Roles::LIGHT { + if self.config.roles.is_light() { return; } @@ -940,25 +1110,33 @@ impl, H: ExHashT> Protocol { for (who, ref mut peer) in self.context_data.peers.iter_mut() { if peer.known_blocks.insert(hash.clone()) { trace!(target: "sync", "Announcing block {:?} to {}", hash, who); - self.network_chan.send(NetworkMsg::Outgoing(who.clone(), message.clone())) + network_out.send_message(who.clone(), message.clone()) } } } - fn on_block_finalized(&mut self, hash: B::Hash, header: &B::Header) { + /// Call this when a block has been finalized. The sync layer may have some additional + /// requesting to perform. + pub fn on_block_finalized(&mut self, network_out: &mut dyn NetworkOut, hash: B::Hash, header: &B::Header) { self.sync.on_block_finalized( &hash, *header.number(), - &mut ProtocolContext::new(&mut self.context_data, &self.network_chan), + &mut ProtocolContext::new(&mut self.context_data, network_out), ); } fn on_remote_call_request( &mut self, + network_out: &mut dyn NetworkOut, who: PeerId, request: message::RemoteCallRequest, ) { - trace!(target: "sync", "Remote call request {} from {} ({} at {})", request.id, who, request.method, request.block); + trace!(target: "sync", "Remote call request {} from {} ({} at {})", + request.id, + who, + request.method, + request.block + ); let proof = match self.context_data.chain.execution_proof( &request.block, &request.method, @@ -967,13 +1145,19 @@ impl, H: ExHashT> Protocol { Ok((_, proof)) => proof, Err(error) => { trace!(target: "sync", "Remote call request {} from {} ({} at {}) failed with: {}", - request.id, who, request.method, request.block, error); - self.network_chan.send(NetworkMsg::ReportPeer(who.clone(), RPC_FAILED_REPUTATION_CHANGE)); + request.id, + who, + request.method, + request.block, + error + ); + network_out.report_peer(who.clone(), RPC_FAILED_REPUTATION_CHANGE); Default::default() } }; self.send_message( + network_out, who, GenericMessage::RemoteCallResponse(message::RemoteCallResponse { id: request.id, @@ -982,15 +1166,90 @@ impl, H: ExHashT> Protocol { ); } - fn on_remote_call_response(&mut self, who: PeerId, response: message::RemoteCallResponse) { + /// Request a justification for the given block. + /// + /// Uses `protocol` to queue a new justification request and tries to dispatch all pending + /// requests. + pub fn request_justification(&mut self, network_out: &mut dyn NetworkOut, hash: &B::Hash, number: NumberFor) { + let mut context = + ProtocolContext::new(&mut self.context_data, network_out); + self.sync.request_justification(&hash, number, &mut context); + } + + /// Clears all pending justification requests. + pub fn clear_justification_requests(&mut self) { + self.sync.clear_justification_requests() + } + + /// A batch of blocks have been processed, with or without errors. + /// Call this when a batch of blocks have been processed by the import queue, with or without + /// errors. + pub fn blocks_processed( + &mut self, + network_out: &mut dyn NetworkOut, + processed_blocks: Vec, + has_error: bool + ) { + let mut context = ProtocolContext::new(&mut self.context_data, network_out); + self.sync.blocks_processed(&mut context, processed_blocks, has_error); + } + + /// Restart the sync process. + pub fn restart(&mut self, network_out: &mut dyn NetworkOut) { + let peers = self.context_data.peers.clone(); + let mut context = ProtocolContext::new(&mut self.context_data, network_out); + self.sync.restart(&mut context, |peer_id| peers.get(peer_id).map(|i| i.info.clone())); + } + + /// Notify about successful import of the given block. + pub fn block_imported(&mut self, hash: &B::Hash, number: NumberFor) { + self.sync.block_imported(hash, number) + } + + pub fn set_finality_proof_request_builder(&mut self, request_builder: SharedFinalityProofRequestBuilder) { + self.sync.set_finality_proof_request_builder(request_builder) + } + + /// Call this when a justification has been processed by the import queue, with or without + /// errors. + pub fn justification_import_result(&mut self, hash: B::Hash, number: NumberFor, success: bool) { + self.sync.justification_import_result(hash, number, success) + } + + /// Request a finality proof for the given block. + /// + /// Queues a new finality proof request and tries to dispatch all pending requests. + pub fn request_finality_proof( + &mut self, + network_out: &mut dyn NetworkOut, + hash: &B::Hash, + number: NumberFor + ) { + let mut context = ProtocolContext::new(&mut self.context_data, network_out); + self.sync.request_finality_proof(&hash, number, &mut context); + } + + pub fn finality_proof_import_result( + &mut self, + request_block: (B::Hash, NumberFor), + finalization_result: Result<(B::Hash, NumberFor), ()>, + ) { + self.sync.finality_proof_import_result(request_block, finalization_result) + } + + fn on_remote_call_response( + &mut self, + mut network_out: &mut dyn NetworkOut, + who: PeerId, + response: message::RemoteCallResponse + ) { trace!(target: "sync", "Remote call response {} from {}", response.id, who); - self.on_demand - .as_ref() - .map(|s| s.on_remote_call_response(who, response)); + self.on_demand_core.on_remote_call_response(&mut network_out, who, response); } fn on_remote_read_request( &mut self, + network_out: &mut dyn NetworkOut, who: PeerId, request: message::RemoteReadRequest, ) { @@ -1000,11 +1259,17 @@ impl, H: ExHashT> Protocol { Ok(proof) => proof, Err(error) => { trace!(target: "sync", "Remote read request {} from {} ({} at {}) failed with: {}", - request.id, who, request.key.to_hex::(), request.block, error); + request.id, + who, + request.key.to_hex::(), + request.block, + error + ); Default::default() } }; self.send_message( + network_out, who, GenericMessage::RemoteReadResponse(message::RemoteReadResponse { id: request.id, @@ -1012,15 +1277,20 @@ impl, H: ExHashT> Protocol { }), ); } - fn on_remote_read_response(&mut self, who: PeerId, response: message::RemoteReadResponse) { + + fn on_remote_read_response( + &mut self, + mut network_out: &mut dyn NetworkOut, + who: PeerId, + response: message::RemoteReadResponse + ) { trace!(target: "sync", "Remote read response {} from {}", response.id, who); - self.on_demand - .as_ref() - .map(|s| s.on_remote_read_response(who, response)); + self.on_demand_core.on_remote_read_response(&mut network_out, who, response); } fn on_remote_header_request( &mut self, + network_out: &mut dyn NetworkOut, who: PeerId, request: message::RemoteHeaderRequest>, ) { @@ -1030,11 +1300,16 @@ impl, H: ExHashT> Protocol { Ok((header, proof)) => (Some(header), proof), Err(error) => { trace!(target: "sync", "Remote header proof request {} from {} ({}) failed with: {}", - request.id, who, request.block, error); + request.id, + who, + request.block, + error + ); (Default::default(), Default::default()) } }; self.send_message( + network_out, who, GenericMessage::RemoteHeaderResponse(message::RemoteHeaderResponse { id: request.id, @@ -1046,28 +1321,45 @@ impl, H: ExHashT> Protocol { fn on_remote_header_response( &mut self, + mut network_out: &mut dyn NetworkOut, who: PeerId, response: message::RemoteHeaderResponse, ) { trace!(target: "sync", "Remote header proof response {} from {}", response.id, who); - self.on_demand - .as_ref() - .map(|s| s.on_remote_header_response(who, response)); + self.on_demand_core.on_remote_header_response(&mut network_out, who, response); } fn on_remote_changes_request( &mut self, + network_out: &mut dyn NetworkOut, who: PeerId, request: message::RemoteChangesRequest, ) { trace!(target: "sync", "Remote changes proof request {} from {} for key {} ({}..{})", - request.id, who, request.key.to_hex::(), request.first, request.last); + request.id, + who, + request.key.to_hex::(), + request.first, + request.last + ); let key = StorageKey(request.key); - let proof = match self.context_data.chain.key_changes_proof(request.first, request.last, request.min, request.max, &key) { + let proof = match self.context_data.chain.key_changes_proof( + request.first, + request.last, + request.min, + request.max, + &key + ) { Ok(proof) => proof, Err(error) => { trace!(target: "sync", "Remote changes proof request {} from {} for key {} ({}..{}) failed with: {}", - request.id, who, key.0.to_hex::(), request.first, request.last, error); + request.id, + who, + key.0.to_hex::(), + request.first, + request.last, + error + ); ChangesProof:: { max_block: Zero::zero(), proof: vec![], @@ -1077,6 +1369,7 @@ impl, H: ExHashT> Protocol { } }; self.send_message( + network_out, who, GenericMessage::RemoteChangesResponse(message::RemoteChangesResponse { id: request.id, @@ -1090,14 +1383,80 @@ impl, H: ExHashT> Protocol { fn on_remote_changes_response( &mut self, + mut network_out: &mut dyn NetworkOut, who: PeerId, response: message::RemoteChangesResponse, B::Hash>, ) { trace!(target: "sync", "Remote changes proof response {} from {} (max={})", - response.id, who, response.max); - self.on_demand - .as_ref() - .map(|s| s.on_remote_changes_response(who, response)); + response.id, + who, + response.max + ); + self.on_demand_core.on_remote_changes_response(&mut network_out, who, response); + } + + fn on_finality_proof_request( + &mut self, + network_out: &mut dyn NetworkOut, + who: PeerId, + request: message::FinalityProofRequest, + finality_proof_provider: Option<&dyn FinalityProofProvider> + ) { + trace!(target: "sync", "Finality proof request from {} for {}", who, request.block); + let finality_proof = finality_proof_provider.as_ref() + .ok_or_else(|| String::from("Finality provider is not configured")) + .and_then(|provider| + provider.prove_finality(request.block, &request.request).map_err(|e| e.to_string()) + ); + let finality_proof = match finality_proof { + Ok(finality_proof) => finality_proof, + Err(error) => { + trace!(target: "sync", "Finality proof request from {} for {} failed with: {}", + who, + request.block, + error + ); + None + }, + }; + self.send_message( + network_out, + who, + GenericMessage::FinalityProofResponse(message::FinalityProofResponse { + id: 0, + block: request.block, + proof: finality_proof, + }), + ); + } + + fn on_finality_proof_response( + &mut self, + network_out: &mut dyn NetworkOut, + who: PeerId, + response: message::FinalityProofResponse, + ) -> CustomMessageOutcome { + trace!(target: "sync", "Finality proof response from {} for {}", who, response.block); + let outcome = self.sync.on_block_finality_proof_data( + &mut ProtocolContext::new(&mut self.context_data, network_out), + who, + response, + ); + + if let Some((origin, hash, nb, proof)) = outcome { + CustomMessageOutcome::FinalityProofImport(origin, hash, nb, proof) + } else { + CustomMessageOutcome::None + } + } + + fn on_remote_body_response( + &mut self, + mut network_out: &mut dyn NetworkOut, + peer: PeerId, + response: message::BlockResponse + ) { + self.on_demand_core.on_remote_body_response(&mut network_out, peer, response); } } @@ -1106,12 +1465,13 @@ impl, H: ExHashT> Protocol { pub enum CustomMessageOutcome { BlockImport(BlockOrigin, Vec>), JustificationImport(Origin, B::Hash, NumberFor, Justification), + FinalityProofImport(Origin, B::Hash, NumberFor, Vec), None, } fn send_message( peers: &mut HashMap>, - network_chan: &NetworkChan, + network_out: &mut dyn NetworkOut, who: PeerId, mut message: Message, ) { @@ -1126,5 +1486,5 @@ fn send_message( peer.block_request = Some((time::Instant::now(), r.clone())); } } - network_chan.send(NetworkMsg::Outgoing(who, message)); + network_out.send_message(who, message); } diff --git a/core/network/src/consensus_gossip.rs b/core/network/src/protocol/consensus_gossip.rs similarity index 87% rename from core/network/src/consensus_gossip.rs rename to core/network/src/protocol/consensus_gossip.rs index 95753c54a775bb5e2a70a67b283b39777c365103..a1c9783b91be5fd84d8086e07d837f367c54cd70 100644 --- a/core/network/src/consensus_gossip.rs +++ b/core/network/src/protocol/consensus_gossip.rs @@ -24,7 +24,7 @@ use std::time; use log::{trace, debug}; use futures::sync::mpsc; use lru_cache::LruCache; -use network_libp2p::PeerId; +use libp2p::PeerId; use runtime_primitives::traits::{Block as BlockT, Hash, HashFor}; use runtime_primitives::ConsensusEngineId; pub use crate::message::generic::{Message, ConsensusMessage}; @@ -110,7 +110,7 @@ pub trait ValidatorContext { struct NetworkContext<'g, 'p, B: BlockT> { gossip: &'g mut ConsensusGossip, - protocol: &'p mut Context, + protocol: &'p mut dyn Context, engine_id: ConsensusEngineId, } @@ -145,11 +145,11 @@ impl<'g, 'p, B: BlockT> ValidatorContext for NetworkContext<'g, 'p, B> { } fn propagate<'a, B: BlockT, I>( - protocol: &mut Context, + protocol: &mut dyn Context, messages: I, intent: MessageIntent, peers: &mut HashMap>, - validators: &HashMap>>, + validators: &HashMap>>, ) where I: IntoIterator, // (msg_hash, topic, message) { @@ -200,23 +200,28 @@ fn propagate<'a, B: BlockT, I>( /// Validates consensus messages. pub trait Validator: Send + Sync { /// New peer is connected. - fn new_peer(&self, _context: &mut ValidatorContext, _who: &PeerId, _roles: Roles) { + fn new_peer(&self, _context: &mut dyn ValidatorContext, _who: &PeerId, _roles: Roles) { } /// New connection is dropped. - fn peer_disconnected(&self, _context: &mut ValidatorContext, _who: &PeerId) { + fn peer_disconnected(&self, _context: &mut dyn ValidatorContext, _who: &PeerId) { } /// Validate consensus message. - fn validate(&self, context: &mut ValidatorContext, sender: &PeerId, data: &[u8]) -> ValidationResult; + fn validate( + &self, + context: &mut dyn ValidatorContext, + sender: &PeerId, + data: &[u8] + ) -> ValidationResult; /// Produce a closure for validating messages on a given topic. - fn message_expired<'a>(&'a self) -> Box bool + 'a> { + fn message_expired<'a>(&'a self) -> Box bool + 'a> { Box::new(move |_topic, _data| false) } /// Produce a closure for filtering egress messages. - fn message_allowed<'a>(&'a self) -> Box bool + 'a> { + fn message_allowed<'a>(&'a self) -> Box bool + 'a> { Box::new(move |_who, _intent, _topic, _data| true) } } @@ -227,7 +232,7 @@ pub struct ConsensusGossip { live_message_sinks: HashMap<(ConsensusEngineId, B::Hash), Vec>>, messages: Vec>, known_messages: LruCache, - validators: HashMap>>, + validators: HashMap>>, next_broadcast: time::Instant, } @@ -250,7 +255,12 @@ impl ConsensusGossip { } /// Register message validator for a message type. - pub fn register_validator(&mut self, protocol: &mut Context, engine_id: ConsensusEngineId, validator: Arc>) { + pub fn register_validator( + &mut self, + protocol: &mut dyn Context, + engine_id: ConsensusEngineId, + validator: Arc> + ) { self.register_validator_internal(engine_id, validator.clone()); let peers: Vec<_> = self.peers.iter().map(|(id, peer)| (id.clone(), peer.roles)).collect(); for (id, roles) in peers { @@ -259,14 +269,14 @@ impl ConsensusGossip { } } - fn register_validator_internal(&mut self, engine_id: ConsensusEngineId, validator: Arc>) { + fn register_validator_internal(&mut self, engine_id: ConsensusEngineId, validator: Arc>) { self.validators.insert(engine_id, validator.clone()); } /// Handle new connected peer. - pub fn new_peer(&mut self, protocol: &mut Context, who: PeerId, roles: Roles) { + pub fn new_peer(&mut self, protocol: &mut dyn Context, who: PeerId, roles: Roles) { // light nodes are not valid targets for consensus gossip messages - if !roles.intersects(Roles::FULL | Roles::AUTHORITY) { + if !roles.is_full() { return; } @@ -281,7 +291,7 @@ impl ConsensusGossip { } } - fn register_message( + fn register_message_hashed( &mut self, message_hash: B::Hash, topic: B::Hash, @@ -296,8 +306,22 @@ impl ConsensusGossip { } } + /// Registers a message without propagating it to any peers. The message + /// becomes available to new peers or when the service is asked to gossip + /// the message's topic. No validation is performed on the message, if the + /// message is already expired it should be dropped on the next garbage + /// collection. + pub fn register_message( + &mut self, + topic: B::Hash, + message: ConsensusMessage, + ) { + let message_hash = HashFor::::hash(&message.data[..]); + self.register_message_hashed(message_hash, topic, message); + } + /// Call when a peer has been disconnected to stop tracking gossip status. - pub fn peer_disconnected(&mut self, protocol: &mut Context, who: PeerId) { + pub fn peer_disconnected(&mut self, protocol: &mut dyn Context, who: PeerId) { for (engine_id, v) in self.validators.clone() { let mut context = NetworkContext { gossip: self, protocol, engine_id: engine_id.clone() }; v.peer_disconnected(&mut context, &who); @@ -305,7 +329,7 @@ impl ConsensusGossip { } /// Perform periodic maintenance - pub fn tick(&mut self, protocol: &mut Context) { + pub fn tick(&mut self, protocol: &mut dyn Context) { self.collect_garbage(); if time::Instant::now() >= self.next_broadcast { self.rebroadcast(protocol); @@ -314,14 +338,14 @@ impl ConsensusGossip { } /// Rebroadcast all messages to all peers. - fn rebroadcast(&mut self, protocol: &mut Context) { + fn rebroadcast(&mut self, protocol: &mut dyn Context) { let messages = self.messages.iter() .map(|entry| (&entry.message_hash, &entry.topic, &entry.message)); propagate(protocol, messages, MessageIntent::PeriodicRebroadcast, &mut self.peers, &self.validators); } /// Broadcast all messages with given topic. - pub fn broadcast_topic(&mut self, protocol: &mut Context, topic: B::Hash, force: bool) { + pub fn broadcast_topic(&mut self, protocol: &mut dyn Context, topic: B::Hash, force: bool) { let messages = self.messages.iter() .filter_map(|entry| if entry.topic == topic { Some((&entry.message_hash, &entry.topic, &entry.message)) } else { None } @@ -395,7 +419,7 @@ impl ConsensusGossip { /// in all other cases. pub fn on_incoming( &mut self, - protocol: &mut Context, + protocol: &mut dyn Context, who: PeerId, message: ConsensusMessage, ) { @@ -447,7 +471,7 @@ impl ConsensusGossip { } } if keep { - self.register_message(message_hash, topic, message); + self.register_message_hashed(message_hash, topic, message); } } else { trace!(target:"gossip", "Ignored statement from unregistered peer {}", who); @@ -459,7 +483,14 @@ impl ConsensusGossip { } /// Send all messages with given topic to a peer. - pub fn send_topic(&mut self, protocol: &mut Context, who: &PeerId, topic: B::Hash, engine_id: ConsensusEngineId, force: bool) { + pub fn send_topic( + &mut self, + protocol: &mut dyn Context, + who: &PeerId, + topic: B::Hash, + engine_id: ConsensusEngineId, + force: bool + ) { let validator = self.validators.get(&engine_id); let mut message_allowed = match validator { None => return, // treat all messages with no validator as not allowed @@ -489,13 +520,13 @@ impl ConsensusGossip { /// Multicast a message to all peers. pub fn multicast( &mut self, - protocol: &mut Context, + protocol: &mut dyn Context, topic: B::Hash, message: ConsensusMessage, force: bool, ) { let message_hash = HashFor::::hash(&message.data); - self.register_message(message_hash, topic, message.clone()); + self.register_message_hashed(message_hash, topic, message.clone()); let intent = if force { MessageIntent::ForcedBroadcast } else { MessageIntent::Broadcast }; propagate(protocol, iter::once((&message_hash, &topic, &message)), intent, &mut self.peers, &self.validators); } @@ -504,7 +535,7 @@ impl ConsensusGossip { /// later on. pub fn send_message( &mut self, - protocol: &mut Context, + protocol: &mut dyn Context, who: &PeerId, message: ConsensusMessage, ) { @@ -545,7 +576,12 @@ mod tests { struct AllowAll; impl Validator for AllowAll { - fn validate(&self, _context: &mut ValidatorContext, _sender: &PeerId, _data: &[u8]) -> ValidationResult { + fn validate( + &self, + _context: &mut dyn ValidatorContext, + _sender: &PeerId, + _data: &[u8], + ) -> ValidationResult { ValidationResult::ProcessAndKeep(H256::default()) } } @@ -554,7 +590,12 @@ mod tests { fn collects_garbage() { struct AllowOne; impl Validator for AllowOne { - fn validate(&self, _context: &mut ValidatorContext, _sender: &PeerId, data: &[u8]) -> ValidationResult { + fn validate( + &self, + _context: &mut dyn ValidatorContext, + _sender: &PeerId, + data: &[u8], + ) -> ValidationResult { if data[0] == 1 { ValidationResult::ProcessAndKeep(H256::default()) } else { @@ -562,7 +603,7 @@ mod tests { } } - fn message_expired<'a>(&'a self) -> Box bool + 'a> { + fn message_expired<'a>(&'a self) -> Box bool + 'a> { Box::new(move |_topic, data| data[0] != 1 ) } } @@ -604,11 +645,9 @@ mod tests { consensus.register_validator_internal([0, 0, 0, 0], Arc::new(AllowAll)); let message = ConsensusMessage { data: vec![4, 5, 6], engine_id: [0, 0, 0, 0] }; - - let message_hash = HashFor::::hash(&message.data); let topic = HashFor::::hash(&[1,2,3]); - consensus.register_message(message_hash, topic, message.clone()); + consensus.register_message(topic, message.clone()); let stream = consensus.messages_for([0, 0, 0, 0], topic); assert_eq!(stream.wait().next(), Some(Ok(TopicNotification { message: message.data, sender: None }))); @@ -622,8 +661,8 @@ mod tests { let msg_a = ConsensusMessage { data: vec![1, 2, 3], engine_id: [0, 0, 0, 0] }; let msg_b = ConsensusMessage { data: vec![4, 5, 6], engine_id: [0, 0, 0, 0] }; - consensus.register_message(HashFor::::hash(&msg_a.data), topic,msg_a); - consensus.register_message(HashFor::::hash(&msg_b.data), topic,msg_b); + consensus.register_message(topic, msg_a); + consensus.register_message(topic, msg_b); assert_eq!(consensus.messages.len(), 2); } @@ -634,11 +673,9 @@ mod tests { consensus.register_validator_internal([0, 0, 0, 0], Arc::new(AllowAll)); let message = ConsensusMessage { data: vec![4, 5, 6], engine_id: [0, 0, 0, 0] }; - - let message_hash = HashFor::::hash(&message.data); let topic = HashFor::::hash(&[1,2,3]); - consensus.register_message(message_hash, topic, message.clone()); + consensus.register_message(topic, message.clone()); let stream1 = consensus.messages_for([0, 0, 0, 0], topic); let stream2 = consensus.messages_for([0, 0, 0, 0], topic); @@ -656,8 +693,8 @@ mod tests { let msg_a = ConsensusMessage { data: vec![1, 2, 3], engine_id: [0, 0, 0, 0] }; let msg_b = ConsensusMessage { data: vec![4, 5, 6], engine_id: [0, 0, 0, 1] }; - consensus.register_message(HashFor::::hash(&msg_a.data), topic, msg_a); - consensus.register_message(HashFor::::hash(&msg_b.data), topic, msg_b); + consensus.register_message(topic, msg_a); + consensus.register_message(topic, msg_b); let mut stream = consensus.messages_for([0, 0, 0, 0], topic).wait(); diff --git a/core/network/src/message.rs b/core/network/src/protocol/message.rs similarity index 91% rename from core/network/src/message.rs rename to core/network/src/protocol/message.rs index 85a526be5341c46789ad0d32026f2f8903648e42..7b9b684cd8bfed9dae9a7004cc3681b57d226e94 100644 --- a/core/network/src/message.rs +++ b/core/network/src/protocol/message.rs @@ -23,6 +23,7 @@ pub use self::generic::{ BlockAnnounce, RemoteCallRequest, RemoteReadRequest, RemoteHeaderRequest, RemoteHeaderResponse, RemoteChangesRequest, RemoteChangesResponse, + FinalityProofRequest, FinalityProofResponse, FromBlock, RemoteReadChildRequest, }; @@ -124,8 +125,8 @@ pub struct RemoteReadResponse { /// Generic types. pub mod generic { + use crate::custom_proto::CustomMessage; use parity_codec::{Encode, Decode}; - use network_libp2p::CustomMessage; use runtime_primitives::Justification; use crate::config::Roles; use super::{ @@ -200,7 +201,11 @@ pub mod generic { RemoteChangesResponse(RemoteChangesResponse), /// Remote child storage read request. RemoteReadChildRequest(RemoteReadChildRequest), - /// Chain-specific message + /// Finality proof request. + FinalityProofRequest(FinalityProofRequest), + /// Finality proof reponse. + FinalityProofResponse(FinalityProofResponse), + /// Chain-specific message. #[codec(index = "255")] ChainSpecific(Vec), } @@ -359,4 +364,26 @@ pub mod generic { /// Missing changes tries roots proof. pub roots_proof: Vec>, } + + #[derive(Debug, PartialEq, Eq, Clone, Encode, Decode)] + /// Finality proof request. + pub struct FinalityProofRequest { + /// Unique request id. + pub id: RequestId, + /// Hash of the block to request proof for. + pub block: H, + /// Additional data blob (that both requester and provider understood) required for proving finality. + pub request: Vec, + } + + #[derive(Debug, PartialEq, Eq, Clone, Encode, Decode)] + /// Finality proof response. + pub struct FinalityProofResponse { + /// Id of a request this response was made for. + pub id: RequestId, + /// Hash of the block (the same as in the FinalityProofRequest). + pub block: H, + /// Finality proof (if available). + pub proof: Option>, + } } diff --git a/core/network/src/protocol/on_demand.rs b/core/network/src/protocol/on_demand.rs new file mode 100644 index 0000000000000000000000000000000000000000..76c926df107c868662612bec6c5ae23e1a463e96 --- /dev/null +++ b/core/network/src/protocol/on_demand.rs @@ -0,0 +1,1266 @@ +// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +//! On-demand requests service. + +use std::collections::{HashMap, VecDeque}; +use std::sync::Arc; +use std::time::{Instant, Duration}; +use log::{trace, info}; +use futures::sync::oneshot::{Sender as OneShotSender}; +use linked_hash_map::{Entry, LinkedHashMap}; +use client::error::Error as ClientError; +use client::light::fetcher::{FetchChecker, RemoteHeaderRequest, + RemoteCallRequest, RemoteReadRequest, RemoteChangesRequest, ChangesProof, + RemoteReadChildRequest, RemoteBodyRequest}; +use crate::message::{self, BlockAttributes, Direction, FromBlock, RequestId}; +use libp2p::PeerId; +use crate::config::Roles; +use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, NumberFor}; + +/// Remote request timeout. +const REQUEST_TIMEOUT: Duration = Duration::from_secs(15); +/// Default request retry count. +const RETRY_COUNT: usize = 1; +/// Reputation change for a peer when a request timed out. +const TIMEOUT_REPUTATION_CHANGE: i32 = -(1 << 8); + +/// Trait used by the `OnDemandCore` service to communicate messages back to the network. +pub trait OnDemandNetwork { + /// Adjusts the reputation of the given peer. + fn report_peer(&mut self, who: &PeerId, reputation_change: i32); + + /// Disconnect from the given peer. Used in case of misbehaviour. + fn disconnect_peer(&mut self, who: &PeerId); + + /// Send to `who` a request for a header. + fn send_header_request(&mut self, who: &PeerId, id: RequestId, block: <::Header as HeaderT>::Number); + + /// Send to `who` a read request. + fn send_read_request(&mut self, who: &PeerId, id: RequestId, block: ::Hash, key: Vec); + + /// Send to `who` a child read request. + fn send_read_child_request( + &mut self, + who: &PeerId, + id: RequestId, + block: ::Hash, + storage_key: Vec, + key: Vec + ); + + /// Send to `who` a call request. + fn send_call_request( + &mut self, + who: &PeerId, + id: RequestId, + block: ::Hash, + method: String, + data: Vec + ); + + /// Send to `who` a changes request. + fn send_changes_request( + &mut self, + who: &PeerId, + id: RequestId, + first: ::Hash, + last: ::Hash, + min: ::Hash, + max: ::Hash, + key: Vec + ); + + /// Send to `who` a body request. + fn send_body_request( + &mut self, + who: &PeerId, + id: RequestId, + fields: BlockAttributes, + from: FromBlock<::Hash, <::Header as HeaderT>::Number>, + to: Option, + direction: Direction, + max: Option + ); +} + +/// On-demand requests service. Dispatches requests to appropriate peers. +pub struct OnDemandCore { + checker: Arc>, + next_request_id: u64, + pending_requests: VecDeque>, + active_peers: LinkedHashMap>, + idle_peers: VecDeque, + best_blocks: HashMap>, +} + +struct Request { + id: u64, + timestamp: Instant, + retry_count: usize, + data: RequestData, +} + +/// One request for data made by the `Client`. +/// +/// Contains a `Sender` where to send the result. +pub(crate) enum RequestData { + RemoteBody(RemoteBodyRequest, OneShotSender, ClientError>>), + RemoteHeader(RemoteHeaderRequest, OneShotSender>), + RemoteRead(RemoteReadRequest, OneShotSender>, ClientError>>), + RemoteReadChild( + RemoteReadChildRequest, + OneShotSender>, ClientError>> + ), + RemoteCall(RemoteCallRequest, OneShotSender, ClientError>>), + RemoteChanges( + RemoteChangesRequest, + OneShotSender, u32)>, ClientError>> + ), +} + +enum Accept { + Ok, + CheckFailed(ClientError, RequestData), + Unexpected(RequestData), +} + +/// Dummy implementation of `FetchChecker` that always assumes that responses are bad. +/// +/// Considering that it is the responsibility of the client to build the fetcher, it can use this +/// implementation if it knows that it will never perform any request. +#[derive(Default, Clone)] +pub struct AlwaysBadChecker; + +impl FetchChecker for AlwaysBadChecker { + fn check_header_proof( + &self, + _request: &RemoteHeaderRequest, + _remote_header: Option, + _remote_proof: Vec> + ) -> Result { + Err(ClientError::Msg("AlwaysBadChecker".into())) + } + + fn check_read_proof( + &self, + _request: &RemoteReadRequest, + _remote_proof: Vec> + ) -> Result>, ClientError> { + Err(ClientError::Msg("AlwaysBadChecker".into())) + } + + fn check_read_child_proof( + &self, + _request: &RemoteReadChildRequest, + _remote_proof: Vec> + ) -> Result>, ClientError> { + Err(ClientError::Msg("AlwaysBadChecker".into())) + } + + fn check_execution_proof( + &self, + _request: &RemoteCallRequest, + _remote_proof: Vec> + ) -> Result, ClientError> { + Err(ClientError::Msg("AlwaysBadChecker".into())) + } + + fn check_changes_proof( + &self, + _request: &RemoteChangesRequest, + _remote_proof: ChangesProof + ) -> Result, u32)>, ClientError> { + Err(ClientError::Msg("AlwaysBadChecker".into())) + } + + fn check_body_proof( + &self, + _request: &RemoteBodyRequest, + _body: Vec + ) -> Result, ClientError> { + Err(ClientError::Msg("AlwaysBadChecker".into())) + } +} + +impl OnDemandCore where + B::Header: HeaderT, +{ + /// Creates new on-demand requests processer. + pub fn new(checker: Arc>) -> Self { + OnDemandCore { + checker, + next_request_id: 0, + pending_requests: VecDeque::new(), + active_peers: LinkedHashMap::new(), + idle_peers: VecDeque::new(), + best_blocks: HashMap::new(), + } + } + + /// Inserts a new request in the list of requests to execute. + pub(crate) fn add_request(&mut self, network: impl OnDemandNetwork, data: RequestData) { + self.insert(RETRY_COUNT, data); + self.dispatch(network); + } + + /// Inserts a new request in the list of requests to execute. + fn insert(&mut self, retry_count: usize, data: RequestData) { + let request_id = self.next_request_id; + self.next_request_id += 1; + + self.pending_requests.push_back(Request { + id: request_id, + timestamp: Instant::now(), + retry_count, + data, + }); + } + + /// Try to accept response from given peer. + fn accept_response( + &mut self, + rtype: &str, + mut network: impl OnDemandNetwork, + peer: PeerId, + request_id: u64, + try_accept: impl FnOnce(Request, &Arc>) -> Accept + ) { + let request = match self.remove(peer.clone(), request_id) { + Some(request) => request, + None => { + info!("Invalid remote {} response from peer {}", rtype, peer); + network.report_peer(&peer, i32::min_value()); + network.disconnect_peer(&peer); + self.remove_peer(peer); + return; + }, + }; + + let retry_count = request.retry_count; + let (retry_count, retry_request_data) = match try_accept(request, &self.checker) { + Accept::Ok => (retry_count, None), + Accept::CheckFailed(error, retry_request_data) => { + info!("Failed to check remote {} response from peer {}: {}", rtype, peer, error); + network.report_peer(&peer, i32::min_value()); + network.disconnect_peer(&peer); + self.remove_peer(peer); + + if retry_count > 0 { + (retry_count - 1, Some(retry_request_data)) + } else { + trace!(target: "sync", "Failed to get remote {} response for given number of retries", rtype); + retry_request_data.fail(ClientError::RemoteFetchFailed.into()); + (0, None) + } + }, + Accept::Unexpected(retry_request_data) => { + info!("Unexpected response to remote {} from peer", rtype); + network.report_peer(&peer, i32::min_value()); + network.disconnect_peer(&peer); + self.remove_peer(peer); + + (retry_count, Some(retry_request_data)) + }, + }; + + if let Some(request_data) = retry_request_data { + self.insert(retry_count, request_data); + } + + self.dispatch(network); + } + + pub fn on_connect( + &mut self, + network: impl OnDemandNetwork, + peer: PeerId, + role: Roles, + best_number: NumberFor + ) { + if !role.is_full() { + return; + } + + self.idle_peers.push_back(peer.clone()); + self.best_blocks.insert(peer, best_number); + + self.dispatch(network); + } + + pub fn on_block_announce(&mut self, network: impl OnDemandNetwork, peer: PeerId, best_number: NumberFor) { + self.best_blocks.insert(peer, best_number); + self.dispatch(network); + } + + pub fn on_disconnect(&mut self, network: impl OnDemandNetwork, peer: PeerId) { + self.remove_peer(peer); + self.dispatch(network); + } + + pub fn maintain_peers(&mut self, mut network: impl OnDemandNetwork) { + let now = Instant::now(); + + loop { + match self.active_peers.front() { + Some((_, request)) if now - request.timestamp >= REQUEST_TIMEOUT => (), + _ => break, + } + + let (bad_peer, request) = self.active_peers.pop_front().expect("front() is Some as checked above"); + self.pending_requests.push_front(request); + network.report_peer(&bad_peer, TIMEOUT_REPUTATION_CHANGE); + network.disconnect_peer(&bad_peer); + } + + self.dispatch(network); + } + + pub fn on_remote_header_response( + &mut self, + network: impl OnDemandNetwork, + peer: PeerId, + response: message::RemoteHeaderResponse + ) { + self.accept_response("header", network, peer, response.id, |request, checker| match request.data { + RequestData::RemoteHeader(request, sender) => match checker.check_header_proof( + &request, + response.header, + response.proof + ) { + Ok(response) => { + // we do not bother if receiver has been dropped already + let _ = sender.send(Ok(response)); + Accept::Ok + }, + Err(error) => Accept::CheckFailed(error, RequestData::RemoteHeader(request, sender)), + }, + data => Accept::Unexpected(data), + }) + } + + pub fn on_remote_read_response( + &mut self, + network: impl OnDemandNetwork, + peer: PeerId, + response: message::RemoteReadResponse + ) { + self.accept_response("read", network, peer, response.id, |request, checker| match request.data { + RequestData::RemoteRead(request, sender) => { + match checker.check_read_proof(&request, response.proof) { + Ok(response) => { + // we do not bother if receiver has been dropped already + let _ = sender.send(Ok(response)); + Accept::Ok + }, + Err(error) => Accept::CheckFailed( + error, + RequestData::RemoteRead(request, sender) + ), + }}, + RequestData::RemoteReadChild(request, sender) => { + match checker.check_read_child_proof(&request, response.proof) { + Ok(response) => { + // we do not bother if receiver has been dropped already + let _ = sender.send(Ok(response)); + Accept::Ok + }, + Err(error) => Accept::CheckFailed( + error, + RequestData::RemoteReadChild(request, sender) + ), + }}, + data => Accept::Unexpected(data), + }) + } + + pub fn on_remote_call_response( + &mut self, + network: impl OnDemandNetwork, + peer: PeerId, + response: message::RemoteCallResponse + ) { + self.accept_response("call", network, peer, response.id, |request, checker| match request.data { + RequestData::RemoteCall(request, sender) => match checker.check_execution_proof(&request, response.proof) { + Ok(response) => { + // we do not bother if receiver has been dropped already + let _ = sender.send(Ok(response)); + Accept::Ok + }, + Err(error) => Accept::CheckFailed(error, RequestData::RemoteCall(request, sender)), + }, + data => Accept::Unexpected(data), + }) + } + + pub fn on_remote_changes_response( + &mut self, + network: impl OnDemandNetwork, + peer: PeerId, + response: message::RemoteChangesResponse, B::Hash> + ) { + self.accept_response("changes", network, peer, response.id, |request, checker| match request.data { + RequestData::RemoteChanges(request, sender) => match checker.check_changes_proof( + &request, ChangesProof { + max_block: response.max, + proof: response.proof, + roots: response.roots.into_iter().collect(), + roots_proof: response.roots_proof, + }) { + Ok(response) => { + // we do not bother if receiver has been dropped already + let _ = sender.send(Ok(response)); + Accept::Ok + }, + Err(error) => Accept::CheckFailed(error, RequestData::RemoteChanges(request, sender)), + }, + data => Accept::Unexpected(data), + }) + } + + pub fn on_remote_body_response( + &mut self, + network: impl OnDemandNetwork, + peer: PeerId, + response: message::BlockResponse + ) { + self.accept_response("body", network, peer, response.id, |request, checker| match request.data { + RequestData::RemoteBody(request, sender) => { + let mut bodies: Vec<_> = response + .blocks + .into_iter() + .filter_map(|b| b.body) + .collect(); + + // Number of bodies are hardcoded to 1 for valid `RemoteBodyResponses` + if bodies.len() != 1 { + return Accept::CheckFailed( + "RemoteBodyResponse: invalid number of blocks".into(), + RequestData::RemoteBody(request, sender), + ) + } + let body = bodies.remove(0); + + match checker.check_body_proof(&request, body) { + Ok(body) => { + let _ = sender.send(Ok(body)); + Accept::Ok + } + Err(error) => Accept::CheckFailed(error, RequestData::RemoteBody(request, sender)), + } + } + other => Accept::Unexpected(other), + }) + } + + pub fn is_on_demand_response(&self, peer: &PeerId, request_id: message::RequestId) -> bool { + self.active_peers.get(&peer).map_or(false, |r| r.id == request_id) + } + + fn remove(&mut self, peer: PeerId, id: u64) -> Option> { + match self.active_peers.entry(peer.clone()) { + Entry::Occupied(entry) => match entry.get().id == id { + true => { + self.idle_peers.push_back(peer); + Some(entry.remove()) + }, + false => None, + }, + Entry::Vacant(_) => None, + } + } + + pub fn remove_peer(&mut self, peer: PeerId) { + self.best_blocks.remove(&peer); + + if let Some(request) = self.active_peers.remove(&peer) { + self.pending_requests.push_front(request); + return; + } + + if let Some(idle_index) = self.idle_peers.iter().position(|i| *i == peer) { + self.idle_peers.swap_remove_back(idle_index); + } + } + + /// Dispatches pending requests. + fn dispatch(&mut self, mut network: impl OnDemandNetwork) { + let mut last_peer = self.idle_peers.back().cloned(); + let mut unhandled_requests = VecDeque::new(); + + loop { + let peer = match self.idle_peers.pop_front() { + Some(peer) => peer, + None => break, + }; + + // check if request can (optimistically) be processed by the peer + let can_be_processed_by_peer = { + let request = match self.pending_requests.front() { + Some(r) => r, + None => { + self.idle_peers.push_front(peer); + break; + }, + }; + let peer_best_block = self.best_blocks.get(&peer) + .expect("entries are inserted into best_blocks when peer is connected; + entries are removed from best_blocks when peer is disconnected; + peer is in idle_peers and thus connected; qed"); + request.required_block() <= *peer_best_block + }; + + if !can_be_processed_by_peer { + // return peer to the back of the queue + self.idle_peers.push_back(peer.clone()); + + // we have enumerated all peers and noone can handle request + if Some(peer) == last_peer { + let request = self.pending_requests.pop_front().expect("checked in loop condition; qed"); + unhandled_requests.push_back(request); + last_peer = self.idle_peers.back().cloned(); + } + + continue; + } + + last_peer = self.idle_peers.back().cloned(); + + let mut request = self.pending_requests.pop_front().expect("checked in loop condition; qed"); + request.timestamp = Instant::now(); + trace!(target: "sync", "Dispatching remote request {} to peer {}", request.id, peer); + request.send_to(&mut network, &peer); + self.active_peers.insert(peer, request); + } + + self.pending_requests.append(&mut unhandled_requests); + } +} + +impl Request { + fn required_block(&self) -> NumberFor { + match self.data { + RequestData::RemoteHeader(ref data, _) => data.block, + RequestData::RemoteRead(ref data, _) => *data.header.number(), + RequestData::RemoteReadChild(ref data, _) => *data.header.number(), + RequestData::RemoteCall(ref data, _) => *data.header.number(), + RequestData::RemoteChanges(ref data, _) => data.max_block.0, + RequestData::RemoteBody(ref data, _) => *data.header.number(), + } + } + + fn send_to(&self, out: &mut impl OnDemandNetwork, peer: &PeerId) { + match self.data { + RequestData::RemoteHeader(ref data, _) => + out.send_header_request( + peer, + self.id, + data.block, + ), + RequestData::RemoteRead(ref data, _) => + out.send_read_request( + peer, + self.id, + data.block, + data.key.clone(), + ), + RequestData::RemoteReadChild(ref data, _) => + out.send_read_child_request( + peer, + self.id, + data.block, + data.storage_key.clone(), + data.key.clone(), + ), + RequestData::RemoteCall(ref data, _) => + out.send_call_request( + peer, + self.id, + data.block, + data.method.clone(), + data.call_data.clone(), + ), + RequestData::RemoteChanges(ref data, _) => + out.send_changes_request( + peer, + self.id, + data.first_block.1.clone(), + data.last_block.1.clone(), + data.tries_roots.1.clone(), + data.max_block.1.clone(), + data.key.clone(), + ), + RequestData::RemoteBody(ref data, _) => + out.send_body_request( + peer, + self.id, + message::BlockAttributes::BODY, + message::FromBlock::Hash(data.header.hash()), + None, + message::Direction::Ascending, + Some(1) + ), + } + } +} + +impl RequestData { + fn fail(self, error: ClientError) { + // don't care if anyone is listening + match self { + RequestData::RemoteHeader(_, sender) => { let _ = sender.send(Err(error)); }, + RequestData::RemoteCall(_, sender) => { let _ = sender.send(Err(error)); }, + RequestData::RemoteRead(_, sender) => { let _ = sender.send(Err(error)); }, + RequestData::RemoteReadChild(_, sender) => { let _ = sender.send(Err(error)); }, + RequestData::RemoteChanges(_, sender) => { let _ = sender.send(Err(error)); }, + RequestData::RemoteBody(_, sender) => { let _ = sender.send(Err(error)); }, + } + } +} + +#[cfg(test)] +pub mod tests { + use std::collections::HashSet; + use std::sync::Arc; + use std::time::Instant; + use futures::{Future, sync::oneshot}; + use runtime_primitives::traits::{Block as BlockT, NumberFor, Header as HeaderT}; + use client::{error::{Error as ClientError, Result as ClientResult}}; + use client::light::fetcher::{FetchChecker, RemoteHeaderRequest, + ChangesProof, RemoteCallRequest, RemoteReadRequest, + RemoteReadChildRequest, RemoteChangesRequest, RemoteBodyRequest}; + use crate::config::Roles; + use crate::message::{self, BlockAttributes, Direction, FromBlock, RequestId}; + use libp2p::PeerId; + use super::{REQUEST_TIMEOUT, OnDemandCore, OnDemandNetwork, RequestData}; + use test_client::runtime::{changes_trie_config, Block, Extrinsic, Header}; + + struct DummyFetchChecker { ok: bool } + + impl FetchChecker for DummyFetchChecker { + fn check_header_proof( + &self, + _request: &RemoteHeaderRequest
, + header: Option
, + _remote_proof: Vec> + ) -> ClientResult
{ + match self.ok { + true if header.is_some() => Ok(header.unwrap()), + _ => Err(ClientError::Backend("Test error".into())), + } + } + + fn check_read_proof(&self, _: &RemoteReadRequest
, _: Vec>) -> ClientResult>> { + match self.ok { + true => Ok(Some(vec![42])), + false => Err(ClientError::Backend("Test error".into())), + } + } + + fn check_read_child_proof( + &self, + _: &RemoteReadChildRequest
, + _: Vec> + ) -> ClientResult>> { + match self.ok { + true => Ok(Some(vec![42])), + false => Err(ClientError::Backend("Test error".into())), + } + } + + fn check_execution_proof(&self, _: &RemoteCallRequest
, _: Vec>) -> ClientResult> { + match self.ok { + true => Ok(vec![42]), + false => Err(ClientError::Backend("Test error".into())), + } + } + + fn check_changes_proof( + &self, + _: &RemoteChangesRequest
, + _: ChangesProof
+ ) -> ClientResult, u32)>> { + match self.ok { + true => Ok(vec![(100, 2)]), + false => Err(ClientError::Backend("Test error".into())), + } + } + + fn check_body_proof( + &self, + _: &RemoteBodyRequest
, + body: Vec + ) -> ClientResult> { + match self.ok { + true => Ok(body), + false => Err(ClientError::Backend("Test error".into())), + } + } + } + + fn dummy(ok: bool) -> OnDemandCore { + OnDemandCore::new(Arc::new(DummyFetchChecker { ok })) + } + + fn total_peers(on_demand: &OnDemandCore) -> usize { + on_demand.idle_peers.len() + on_demand.active_peers.len() + } + + fn receive_call_response( + network_interface: impl OnDemandNetwork, + on_demand: &mut OnDemandCore, + peer: PeerId, + id: message::RequestId + ) { + on_demand.on_remote_call_response(network_interface, peer, message::RemoteCallResponse { + id: id, + proof: vec![vec![2]], + }); + } + + fn dummy_header() -> Header { + Header { + parent_hash: Default::default(), + number: 0, + state_root: Default::default(), + extrinsics_root: Default::default(), + digest: Default::default(), + } + } + + #[derive(Default)] + struct DummyNetwork { + disconnected_peers: HashSet, + } + + impl<'a, B: BlockT> OnDemandNetwork for &'a mut DummyNetwork { + fn report_peer(&mut self, _: &PeerId, _: i32) {} + fn disconnect_peer(&mut self, who: &PeerId) { + self.disconnected_peers.insert(who.clone()); + } + fn send_header_request(&mut self, _: &PeerId, _: RequestId, _: <::Header as HeaderT>::Number) {} + fn send_read_request(&mut self, _: &PeerId, _: RequestId, _: ::Hash, _: Vec) {} + fn send_read_child_request(&mut self, _: &PeerId, _: RequestId, _: ::Hash, _: Vec, + _: Vec) {} + fn send_call_request(&mut self, _: &PeerId, _: RequestId, _: ::Hash, _: String, _: Vec) {} + fn send_changes_request(&mut self, _: &PeerId, _: RequestId, _: ::Hash, _: ::Hash, + _: ::Hash, _: ::Hash, _: Vec) {} + fn send_body_request(&mut self, _: &PeerId, _: RequestId, _: BlockAttributes, _: FromBlock<::Hash, + <::Header as HeaderT>::Number>, _: Option, _: Direction, _: Option) {} + } + + fn assert_disconnected_peer(dummy: &DummyNetwork) { + assert_eq!(dummy.disconnected_peers.len(), 1); + } + + #[test] + fn knows_about_peers_roles() { + let mut network_interface = DummyNetwork::default(); + let mut on_demand = dummy(true); + let peer0 = PeerId::random(); + let peer1 = PeerId::random(); + let peer2 = PeerId::random(); + on_demand.on_connect(&mut network_interface, peer0, Roles::LIGHT, 1000); + on_demand.on_connect(&mut network_interface, peer1.clone(), Roles::FULL, 2000); + on_demand.on_connect(&mut network_interface, peer2.clone(), Roles::AUTHORITY, 3000); + assert_eq!(vec![peer1.clone(), peer2.clone()], on_demand.idle_peers.iter().cloned().collect::>()); + assert_eq!(on_demand.best_blocks.get(&peer1), Some(&2000)); + assert_eq!(on_demand.best_blocks.get(&peer2), Some(&3000)); + } + + #[test] + fn disconnects_from_idle_peer() { + let peer0 = PeerId::random(); + + let mut network_interface = DummyNetwork::default(); + let mut on_demand = dummy(true); + on_demand.on_connect(&mut network_interface, peer0.clone(), Roles::FULL, 100); + assert_eq!(1, total_peers(&on_demand)); + assert!(!on_demand.best_blocks.is_empty()); + + on_demand.on_disconnect(&mut network_interface, peer0); + assert_eq!(0, total_peers(&on_demand)); + assert!(on_demand.best_blocks.is_empty()); + } + + #[test] + fn disconnects_from_timeouted_peer() { + let mut on_demand = dummy(true); + let mut network_interface = DummyNetwork::default(); + let peer0 = PeerId::random(); + let peer1 = PeerId::random(); + on_demand.on_connect(&mut network_interface, peer0.clone(), Roles::FULL, 1000); + on_demand.on_connect(&mut network_interface, peer1.clone(), Roles::FULL, 1000); + assert_eq!(vec![peer0.clone(), peer1.clone()], on_demand.idle_peers.iter().cloned().collect::>()); + assert!(on_demand.active_peers.is_empty()); + + on_demand.add_request(&mut network_interface, RequestData::RemoteCall(RemoteCallRequest { + block: Default::default(), + header: dummy_header(), + method: "test".into(), + call_data: vec![], + retry_count: None, + }, oneshot::channel().0)); + assert_eq!(vec![peer1.clone()], on_demand.idle_peers.iter().cloned().collect::>()); + assert_eq!(vec![peer0.clone()], on_demand.active_peers.keys().cloned().collect::>()); + + on_demand.active_peers[&peer0].timestamp = Instant::now() - REQUEST_TIMEOUT - REQUEST_TIMEOUT; + on_demand.maintain_peers(&mut network_interface); + assert!(on_demand.idle_peers.is_empty()); + assert_eq!(vec![peer1.clone()], on_demand.active_peers.keys().cloned().collect::>()); + assert_disconnected_peer(&network_interface); + } + + #[test] + fn disconnects_from_peer_on_response_with_wrong_id() { + let mut on_demand = dummy(true); + let peer0 = PeerId::random(); + let mut network_interface = DummyNetwork::default(); + on_demand.on_connect(&mut network_interface, peer0.clone(), Roles::FULL, 1000); + + on_demand.add_request(&mut network_interface, RequestData::RemoteCall(RemoteCallRequest { + block: Default::default(), + header: dummy_header(), + method: "test".into(), + call_data: vec![], + retry_count: None, + }, oneshot::channel().0)); + receive_call_response(&mut network_interface, &mut on_demand, peer0, 1); + assert_disconnected_peer(&network_interface); + assert_eq!(on_demand.pending_requests.len(), 1); + } + + #[test] + fn disconnects_from_peer_on_incorrect_response() { + let mut on_demand = dummy(false); + let mut network_interface = DummyNetwork::default(); + let peer0 = PeerId::random(); + on_demand.add_request(&mut network_interface, RequestData::RemoteCall(RemoteCallRequest { + block: Default::default(), + header: dummy_header(), + method: "test".into(), + call_data: vec![], + retry_count: Some(1), + }, oneshot::channel().0)); + + on_demand.on_connect(&mut network_interface, peer0.clone(), Roles::FULL, 1000); + receive_call_response(&mut network_interface, &mut on_demand, peer0.clone(), 0); + assert_disconnected_peer(&network_interface); + assert_eq!(on_demand.pending_requests.len(), 1); + } + + #[test] + fn disconnects_from_peer_on_unexpected_response() { + let mut on_demand = dummy(true); + let mut network_interface = DummyNetwork::default(); + let peer0 = PeerId::random(); + on_demand.on_connect(&mut network_interface, peer0.clone(), Roles::FULL, 1000); + + receive_call_response(&mut network_interface, &mut on_demand, peer0, 0); + assert_disconnected_peer(&network_interface); + } + + #[test] + fn disconnects_from_peer_on_wrong_response_type() { + let mut on_demand = dummy(false); + let peer0 = PeerId::random(); + let mut network_interface = DummyNetwork::default(); + on_demand.on_connect(&mut network_interface, peer0.clone(), Roles::FULL, 1000); + + on_demand.add_request(&mut network_interface, RequestData::RemoteCall(RemoteCallRequest { + block: Default::default(), + header: dummy_header(), + method: "test".into(), + call_data: vec![], + retry_count: Some(1), + }, oneshot::channel().0)); + + on_demand.on_remote_read_response(&mut network_interface, peer0.clone(), message::RemoteReadResponse { + id: 0, + proof: vec![vec![2]], + }); + assert_disconnected_peer(&network_interface); + assert_eq!(on_demand.pending_requests.len(), 1); + } + + #[test] + fn receives_remote_failure_after_retry_count_failures() { + use parking_lot::{Condvar, Mutex}; + + let retry_count = 2; + let peer_ids = (0 .. retry_count + 1).map(|_| PeerId::random()).collect::>(); + let mut on_demand = dummy(false); + let mut network_interface = DummyNetwork::default(); + for i in 0..retry_count+1 { + on_demand.on_connect(&mut network_interface, peer_ids[i].clone(), Roles::FULL, 1000); + } + + let sync = Arc::new((Mutex::new(0), Mutex::new(0), Condvar::new())); + let thread_sync = sync.clone(); + + let (tx, response) = oneshot::channel(); + on_demand.add_request(&mut network_interface, RequestData::RemoteCall(RemoteCallRequest { + block: Default::default(), + header: dummy_header(), + method: "test".into(), + call_data: vec![], + retry_count: Some(retry_count) + }, tx)); + let thread = ::std::thread::spawn(move || { + let &(ref current, ref finished_at, ref finished) = &*thread_sync; + let _ = response.wait().unwrap().unwrap_err(); + *finished_at.lock() = *current.lock(); + finished.notify_one(); + }); + + let &(ref current, ref finished_at, ref finished) = &*sync; + for i in 0..retry_count+1 { + let mut current = current.lock(); + *current = *current + 1; + receive_call_response(&mut network_interface, &mut on_demand, peer_ids[i].clone(), i as u64); + } + + let mut finished_at = finished_at.lock(); + assert!(!finished.wait_for(&mut finished_at, ::std::time::Duration::from_millis(1000)).timed_out()); + assert_eq!(*finished_at, retry_count + 1); + + thread.join().unwrap(); + } + + #[test] + fn receives_remote_call_response() { + let mut on_demand = dummy(true); + let mut network_interface = DummyNetwork::default(); + let peer0 = PeerId::random(); + on_demand.on_connect(&mut network_interface, peer0.clone(), Roles::FULL, 1000); + + let (tx, response) = oneshot::channel(); + on_demand.add_request(&mut network_interface, RequestData::RemoteCall(RemoteCallRequest { + block: Default::default(), + header: dummy_header(), + method: "test".into(), + call_data: vec![], + retry_count: None, + }, tx)); + let thread = ::std::thread::spawn(move || { + let result = response.wait().unwrap().unwrap(); + assert_eq!(result, vec![42]); + }); + + receive_call_response(&mut network_interface, &mut on_demand, peer0.clone(), 0); + thread.join().unwrap(); + } + + #[test] + fn receives_remote_read_response() { + let mut on_demand = dummy(true); + let mut network_interface = DummyNetwork::default(); + let peer0 = PeerId::random(); + on_demand.on_connect(&mut network_interface, peer0.clone(), Roles::FULL, 1000); + + let (tx, response) = oneshot::channel(); + on_demand.add_request(&mut network_interface, RequestData::RemoteRead(RemoteReadRequest { + header: dummy_header(), + block: Default::default(), + key: b":key".to_vec(), + retry_count: None, + }, tx)); + let thread = ::std::thread::spawn(move || { + let result = response.wait().unwrap().unwrap(); + assert_eq!(result, Some(vec![42])); + }); + + on_demand.on_remote_read_response(&mut network_interface, peer0.clone(), message::RemoteReadResponse { + id: 0, + proof: vec![vec![2]], + }); + thread.join().unwrap(); + } + + #[test] + fn receives_remote_read_child_response() { + let mut on_demand = dummy(true); + let mut network_interface = DummyNetwork::default(); + let peer0 = PeerId::random(); + on_demand.on_connect(&mut network_interface, peer0.clone(), Roles::FULL, 1000); + + let (tx, response) = oneshot::channel(); + on_demand.add_request(&mut network_interface, RequestData::RemoteReadChild(RemoteReadChildRequest { + header: dummy_header(), + block: Default::default(), + storage_key: b":child_storage:sub".to_vec(), + key: b":key".to_vec(), + retry_count: None, + }, tx)); + let thread = ::std::thread::spawn(move || { + let result = response.wait().unwrap().unwrap(); + assert_eq!(result, Some(vec![42])); + }); + + on_demand.on_remote_read_response(&mut network_interface, + peer0.clone(), message::RemoteReadResponse { + id: 0, + proof: vec![vec![2]], + }); + thread.join().unwrap(); + } + + #[test] + fn receives_remote_header_response() { + let mut on_demand = dummy(true); + let mut network_interface = DummyNetwork::default(); + let peer0 = PeerId::random(); + on_demand.on_connect(&mut network_interface, peer0.clone(), Roles::FULL, 1000); + + let (tx, response) = oneshot::channel(); + on_demand.add_request(&mut network_interface, RequestData::RemoteHeader(RemoteHeaderRequest { + cht_root: Default::default(), + block: 1, + retry_count: None, + }, tx)); + let thread = ::std::thread::spawn(move || { + let result = response.wait().unwrap().unwrap(); + assert_eq!( + result.hash(), + "6443a0b46e0412e626363028115a9f2c\ + f963eeed526b8b33e5316f08b50d0dc3".parse().unwrap() + ); + }); + + on_demand.on_remote_header_response(&mut network_interface, peer0.clone(), message::RemoteHeaderResponse { + id: 0, + header: Some(Header { + parent_hash: Default::default(), + number: 1, + state_root: Default::default(), + extrinsics_root: Default::default(), + digest: Default::default(), + }), + proof: vec![vec![2]], + }); + thread.join().unwrap(); + } + + #[test] + fn receives_remote_changes_response() { + let mut on_demand = dummy(true); + let mut network_interface = DummyNetwork::default(); + let peer0 = PeerId::random(); + on_demand.on_connect(&mut network_interface, peer0.clone(), Roles::FULL, 1000); + + let (tx, response) = oneshot::channel(); + on_demand.add_request(&mut network_interface, RequestData::RemoteChanges(RemoteChangesRequest { + changes_trie_config: changes_trie_config(), + first_block: (1, Default::default()), + last_block: (100, Default::default()), + max_block: (100, Default::default()), + tries_roots: (1, Default::default(), vec![]), + key: vec![], + retry_count: None, + }, tx)); + let thread = ::std::thread::spawn(move || { + let result = response.wait().unwrap().unwrap(); + assert_eq!(result, vec![(100, 2)]); + }); + + on_demand.on_remote_changes_response(&mut network_interface, peer0.clone(), message::RemoteChangesResponse { + id: 0, + max: 1000, + proof: vec![vec![2]], + roots: vec![], + roots_proof: vec![], + }); + thread.join().unwrap(); + } + + #[test] + fn does_not_sends_request_to_peer_who_has_no_required_block() { + let mut on_demand = dummy(true); + let mut network_interface = DummyNetwork::default(); + let peer1 = PeerId::random(); + let peer2 = PeerId::random(); + + on_demand.on_connect(&mut network_interface, peer1.clone(), Roles::FULL, 100); + + on_demand.add_request(&mut network_interface, RequestData::RemoteHeader(RemoteHeaderRequest { + cht_root: Default::default(), + block: 200, + retry_count: None, + }, oneshot::channel().0)); + on_demand.add_request(&mut network_interface, RequestData::RemoteHeader(RemoteHeaderRequest { + cht_root: Default::default(), + block: 250, + retry_count: None, + }, oneshot::channel().0)); + on_demand.add_request(&mut network_interface, RequestData::RemoteHeader(RemoteHeaderRequest { + cht_root: Default::default(), + block: 250, + retry_count: None, + }, oneshot::channel().0)); + + on_demand.on_connect(&mut network_interface, peer2.clone(), Roles::FULL, 150); + + assert_eq!(vec![peer1.clone(), peer2.clone()], on_demand.idle_peers.iter().cloned().collect::>()); + assert_eq!(on_demand.pending_requests.len(), 3); + + on_demand.on_block_announce(&mut network_interface, peer1.clone(), 250); + + assert_eq!(vec![peer2.clone()], on_demand.idle_peers.iter().cloned().collect::>()); + assert_eq!(on_demand.pending_requests.len(), 2); + + on_demand.on_block_announce(&mut network_interface, peer2.clone(), 250); + + assert!(!on_demand.idle_peers.iter().any(|_| true)); + assert_eq!(on_demand.pending_requests.len(), 1); + + on_demand.on_remote_header_response(&mut network_interface, peer1.clone(), message::RemoteHeaderResponse { + id: 0, + header: Some(dummy_header()), + proof: vec![], + }); + + assert!(!on_demand.idle_peers.iter().any(|_| true)); + assert_eq!(on_demand.pending_requests.len(), 0); + } + + #[test] + fn does_not_loop_forever_after_dispatching_request_to_last_peer() { + // this test is a regression for a bug where the dispatch function would + // loop forever after dispatching a request to the last peer, since the + // last peer was not updated + let mut on_demand = dummy(true); + let mut network_interface = DummyNetwork::default(); + let peer1 = PeerId::random(); + let peer2 = PeerId::random(); + let peer3 = PeerId::random(); + + on_demand.add_request(&mut network_interface, RequestData::RemoteHeader(RemoteHeaderRequest { + cht_root: Default::default(), + block: 250, + retry_count: None, + }, oneshot::channel().0)); + on_demand.add_request(&mut network_interface, RequestData::RemoteHeader(RemoteHeaderRequest { + cht_root: Default::default(), + block: 250, + retry_count: None, + }, oneshot::channel().0)); + + on_demand.on_connect(&mut network_interface, peer1.clone(), Roles::FULL, 200); + on_demand.on_connect(&mut network_interface, peer2.clone(), Roles::FULL, 200); + on_demand.on_connect(&mut network_interface, peer3.clone(), Roles::FULL, 250); + + assert_eq!(vec![peer1.clone(), peer2.clone()], on_demand.idle_peers.iter().cloned().collect::>()); + assert_eq!(on_demand.pending_requests.len(), 1); + } + + #[test] + fn tries_to_send_all_pending_requests() { + let mut on_demand = dummy(true); + let mut network_interface = DummyNetwork::default(); + let peer1 = PeerId::random(); + + on_demand.add_request(&mut network_interface, RequestData::RemoteHeader(RemoteHeaderRequest { + cht_root: Default::default(), + block: 300, + retry_count: None, + }, oneshot::channel().0)); + on_demand.add_request(&mut network_interface, RequestData::RemoteHeader(RemoteHeaderRequest { + cht_root: Default::default(), + block: 250, + retry_count: None, + }, oneshot::channel().0)); + + on_demand.on_connect(&mut network_interface, peer1.clone(), Roles::FULL, 250); + + assert!(on_demand.idle_peers.iter().cloned().collect::>().is_empty()); + assert_eq!(on_demand.pending_requests.len(), 1); + } + + #[test] + fn remote_body_with_one_block_body_should_succeed() { + let mut on_demand = dummy(true); + let mut network_interface = DummyNetwork::default(); + let peer1 = PeerId::random(); + + let header = dummy_header(); + on_demand.on_connect(&mut network_interface, peer1.clone(), Roles::FULL, 250); + + on_demand.add_request(&mut network_interface, RequestData::RemoteBody(RemoteBodyRequest { + header: header.clone(), + retry_count: None, + }, oneshot::channel().0)); + + assert!(on_demand.pending_requests.is_empty()); + assert_eq!(on_demand.active_peers.len(), 1); + + let block = message::BlockData:: { + hash: primitives::H256::random(), + header: None, + body: Some(Vec::new()), + message_queue: None, + receipt: None, + justification: None, + }; + + let response = message::generic::BlockResponse { + id: 0, + blocks: vec![block], + }; + + on_demand.on_remote_body_response(&mut network_interface, peer1.clone(), response); + + assert!(on_demand.active_peers.is_empty()); + assert_eq!(on_demand.idle_peers.len(), 1); + } + + #[test] + fn remote_body_with_three_bodies_should_fail() { + let mut on_demand = dummy(true); + let mut network_interface = DummyNetwork::default(); + let peer1 = PeerId::random(); + + let header = dummy_header(); + on_demand.on_connect(&mut network_interface, peer1.clone(), Roles::FULL, 250); + + on_demand.add_request(&mut network_interface, RequestData::RemoteBody(RemoteBodyRequest { + header: header.clone(), + retry_count: None, + }, oneshot::channel().0)); + + assert!(on_demand.pending_requests.is_empty()); + assert_eq!(on_demand.active_peers.len(), 1); + + let response = { + let blocks: Vec<_> = (0..3).map(|_| message::BlockData:: { + hash: primitives::H256::random(), + header: None, + body: Some(Vec::new()), + message_queue: None, + receipt: None, + justification: None, + }).collect(); + + message::generic::BlockResponse { + id: 0, + blocks, + } + }; + + on_demand.on_remote_body_response(&mut network_interface, peer1.clone(), response); + assert!(on_demand.active_peers.is_empty()); + assert!(on_demand.idle_peers.is_empty(), "peer should be disconnected after bad response"); + } +} diff --git a/core/network/src/specialization.rs b/core/network/src/protocol/specialization.rs similarity index 88% rename from core/network/src/specialization.rs rename to core/network/src/protocol/specialization.rs index 58a63bb7a3b53b7357399bab99880769ca28bdd9..41b10bf7079c79c018d918156894aa24f2b80f85 100644 --- a/core/network/src/specialization.rs +++ b/core/network/src/protocol/specialization.rs @@ -16,9 +16,9 @@ //! Specializations of the substrate network protocol to allow more complex forms of communication. -use crate::PeerId; -use runtime_primitives::traits::Block as BlockT; use crate::protocol::Context; +use libp2p::PeerId; +use runtime_primitives::traits::Block as BlockT; /// A specialization of the substrate network protocol. Handles events and sends messages. pub trait NetworkSpecialization: Send + Sync + 'static { @@ -26,23 +26,29 @@ pub trait NetworkSpecialization: Send + Sync + 'static { fn status(&self) -> Vec; /// Called when a peer successfully handshakes. - fn on_connect(&mut self, ctx: &mut Context, who: PeerId, status: crate::message::Status); + fn on_connect(&mut self, ctx: &mut dyn Context, who: PeerId, status: crate::message::Status); /// Called when a peer is disconnected. If the peer ID is unknown, it should be ignored. - fn on_disconnect(&mut self, ctx: &mut Context, who: PeerId); + fn on_disconnect(&mut self, ctx: &mut dyn Context, who: PeerId); /// Called when a network-specific message arrives. - fn on_message(&mut self, ctx: &mut Context, who: PeerId, message: &mut Option>); + fn on_message( + &mut self, + ctx: &mut dyn Context, + who: PeerId, + message: &mut Option> + ); /// Called on abort. + #[deprecated(note = "This method is never called; aborting corresponds to dropping the object")] fn on_abort(&mut self) { } /// Called periodically to maintain peers and handle timeouts. - fn maintain_peers(&mut self, _ctx: &mut Context) { } + fn maintain_peers(&mut self, _ctx: &mut dyn Context) { } /// Called when a block is _imported_ at the head of the chain (not during major sync). /// Not guaranteed to be called for every block, but will be most of the after major sync. - fn on_block_imported(&mut self, _ctx: &mut Context, _hash: B::Hash, _header: &B::Header) { } + fn on_block_imported(&mut self, _ctx: &mut dyn Context, _hash: B::Hash, _header: &B::Header) { } } /// Construct a simple protocol that is composed of several sub protocols. diff --git a/core/network/src/protocol/sync.rs b/core/network/src/protocol/sync.rs new file mode 100644 index 0000000000000000000000000000000000000000..04780862228da032f0f57075bf631390c52d2d6b --- /dev/null +++ b/core/network/src/protocol/sync.rs @@ -0,0 +1,1094 @@ +// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +//! Contains the state of the chain synchronization process +//! +//! At any given point in time, a running node tries as much as possible to be at the head of the +//! chain. This module handles the logic of which blocks to request from remotes, and processing +//! responses. It yields blocks to check and potentially move to the database. +//! +//! # Usage +//! +//! The `ChainSync` struct maintains the state of the block requests. Whenever something happens on +//! the network, or whenever a block has been successfully verified, call the appropriate method in +//! order to update it. You must also regularly call `tick()`. +//! +//! To each of these methods, you must pass a `Context` object that the `ChainSync` will use to +//! send its new outgoing requests. +//! + +use std::cmp::max; +use std::ops::Range; +use std::collections::{HashMap, VecDeque}; +use log::{debug, trace, warn, info, error}; +use crate::protocol::PeerInfo as ProtocolPeerInfo; +use libp2p::PeerId; +use client::{BlockStatus, ClientInfo}; +use consensus::{BlockOrigin, import_queue::{IncomingBlock, SharedFinalityProofRequestBuilder}}; +use client::error::Error as ClientError; +use blocks::BlockCollection; +use extra_requests::ExtraRequests; +use runtime_primitives::traits::{ + Block as BlockT, Header as HeaderT, NumberFor, Zero, One, + CheckedSub, SaturatedConversion +}; +use runtime_primitives::{Justification, generic::BlockId}; +use crate::message; +use crate::config::Roles; +use std::collections::HashSet; + +mod blocks; +mod extra_requests; + +/// Maximum blocks to request in a single packet. +const MAX_BLOCKS_TO_REQUEST: usize = 128; +/// Maximum blocks to store in the import queue. +const MAX_IMPORTING_BLOCKS: usize = 2048; +/// We use a heuristic that with a high likelihood, by the time `MAJOR_SYNC_BLOCKS` have been +/// imported we'll be on the same chain as (or at least closer to) the peer so we want to delay the +/// ancestor search to not waste time doing that when we're so far behind. +const MAJOR_SYNC_BLOCKS: usize = 5; +/// Number of recently announced blocks to track for each peer. +const ANNOUNCE_HISTORY_SIZE: usize = 64; +/// Max number of blocks to download for unknown forks. +const MAX_UNKNOWN_FORK_DOWNLOAD_LEN: u32 = 32; +/// Reputation change when a peer sent us a status message that led to a database read error. +const BLOCKCHAIN_STATUS_READ_ERROR_REPUTATION_CHANGE: i32 = -(1 << 16); +/// Reputation change when a peer failed to answer our legitimate ancestry block search. +const ANCESTRY_BLOCK_ERROR_REPUTATION_CHANGE: i32 = -(1 << 9); +/// Reputation change when a peer sent us a status message with a different genesis than us. +const GENESIS_MISMATCH_REPUTATION_CHANGE: i32 = i32::min_value() + 1; + +/// Context for a network-specific handler. +pub trait Context { + /// Get a reference to the client. + fn client(&self) -> &dyn crate::chain::Client; + + /// Adjusts the reputation of the peer. Use this to point out that a peer has been malign or + /// irresponsible or appeared lazy. + fn report_peer(&mut self, who: PeerId, reputation: i32); + + /// Force disconnecting from a peer. Use this when a peer misbehaved. + fn disconnect_peer(&mut self, who: PeerId); + + /// Request a finality proof from a peer. + fn send_finality_proof_request(&mut self, who: PeerId, request: message::FinalityProofRequest); + + /// Request a block from a peer. + fn send_block_request(&mut self, who: PeerId, request: message::BlockRequest); +} + +#[derive(Debug, Clone)] +/// All the data we have about a Peer that we are trying to sync with +pub(crate) struct PeerSync { + /// The common number is the block number that is a common point of ancestry for both our chains + /// (as far as we know) + pub common_number: NumberFor, + /// The hash of the best block that we've seen for this peer + pub best_hash: B::Hash, + /// The number of the best block that we've seen for this peer + pub best_number: NumberFor, + /// The state of syncing this peer is in for us, generally categories into `Available` or "busy" + /// with something as defined by `PeerSyncState`. + pub state: PeerSyncState, + /// A queue of blocks that this peer has announced to us, should only contain + /// `ANNOUNCE_HISTORY_SIZE` entries. + pub recently_announced: VecDeque, +} + +/// The sync status of a peer we are trying to sync with +#[derive(Debug)] +pub(crate) struct PeerInfo { + /// Their best block hash. + pub best_hash: B::Hash, + /// Their best block number. + pub best_number: NumberFor, +} + +#[derive(Copy, Clone, Eq, PartialEq, Debug)] +/// The ancestor search state expresses which algorithm, and its stateful parameters, we are using to +/// try to find an ancestor block +pub(crate) enum AncestorSearchState { + /// Use exponential backoff to find an ancestor, then switch to binary search. + /// We keep track of the exponent. + ExponentialBackoff(NumberFor), + /// Using binary search to find the best ancestor. + /// We keep track of left and right bounds. + BinarySearch(NumberFor, NumberFor), +} + +#[derive(Copy, Clone, Eq, PartialEq, Debug)] +/// The state of syncing between a Peer and ourselves. Generally two categories, "busy" or +/// `Available`. If busy, the Enum defines what we are busy with. +pub(crate) enum PeerSyncState { + /// Searching for ancestors the Peer has in common with us. + AncestorSearch(NumberFor, AncestorSearchState), + /// Available for sync requests. + Available, + /// Actively downloading new blocks, starting from the given Number. + DownloadingNew(NumberFor), + /// Downloading a stale block with given Hash. Stale means that it's a block with a number that + /// is lower than our best number. It might be from a fork and not necessarily already imported. + DownloadingStale(B::Hash), + /// Downloading justification for given block hash. + DownloadingJustification(B::Hash), + /// Downloading finality proof for given block hash. + DownloadingFinalityProof(B::Hash), +} + +/// The main data structure to contain all the state for a chains active syncing strategy. +pub struct ChainSync { + /// The active peers that we are using to sync and their PeerSync status + peers: HashMap>, + /// A `BlockCollection` of blocks that are being downloaded from peers + blocks: BlockCollection, + /// The best block number in our queue of blocks to import + best_queued_number: NumberFor, + /// The best block hash in our queue of blocks to import + best_queued_hash: B::Hash, + /// The role of this node, e.g. light or full + role: Roles, + /// What block attributes we require for this node, usually derived from what role we are, but + /// could be customized + required_block_attributes: message::BlockAttributes, + extra_finality_proofs: ExtraRequests, + extra_justifications: ExtraRequests, + /// A set of hashes of blocks that are being downloaded or have been downloaded and are queued + /// for import. + queue_blocks: HashSet, + /// The best block number that we are currently importing + best_importing_number: NumberFor, + request_builder: Option>, +} + +/// Reported sync state. +#[derive(Clone, Eq, PartialEq, Debug)] +pub enum SyncState { + /// Initial sync is complete, keep-up sync is active. + Idle, + /// Actively catching up with the chain. + Downloading +} + +/// Syncing status and statistics +#[derive(Clone)] +pub struct Status { + /// Current global sync state. + pub state: SyncState, + /// Target sync block number. + pub best_seen_block: Option>, + /// Number of peers participating in syncing. + pub num_peers: u32, +} + +impl ChainSync { + /// Create a new instance. Pass the initial known state of the chain. + pub(crate) fn new(role: Roles, info: &ClientInfo) -> Self { + let mut required_block_attributes = + message::BlockAttributes::HEADER | message::BlockAttributes::JUSTIFICATION; + + if role.is_full() { + required_block_attributes |= message::BlockAttributes::BODY; + } + + ChainSync { + peers: HashMap::new(), + blocks: BlockCollection::new(), + best_queued_hash: info.chain.best_hash, + best_queued_number: info.chain.best_number, + extra_finality_proofs: ExtraRequests::new(), + extra_justifications: ExtraRequests::new(), + role, + required_block_attributes, + queue_blocks: Default::default(), + best_importing_number: Zero::zero(), + request_builder: None, + } + } + + /// Returns the number for the best seen blocks among connected peers, if any + fn best_seen_block(&self) -> Option> { + self.peers.values().max_by_key(|p| p.best_number).map(|p| p.best_number) + } + + /// Returns the SyncState that we are currently in based on a provided `best_seen` block number. + /// A chain is classified as downloading if the provided best block is more than `MAJOR_SYNC_BLOCKS` + /// behind the best queued block. + fn state(&self, best_seen: &Option>) -> SyncState { + match best_seen { + &Some(n) if n > self.best_queued_number && n - self.best_queued_number > 5.into() => SyncState::Downloading, + _ => SyncState::Idle, + } + } + + /// Returns the state of the sync of the given peer. Returns `None` if the peer is unknown. + pub(crate) fn peer_info(&self, who: &PeerId) -> Option> { + self.peers.get(who).map(|peer| { + PeerInfo { + best_hash: peer.best_hash, + best_number: peer.best_number, + } + }) + } + + /// Returns sync status. + pub(crate) fn status(&self) -> Status { + let best_seen = self.best_seen_block(); + let state = self.state(&best_seen); + Status { + state, + best_seen_block: best_seen, + num_peers: self.peers.len() as u32, + } + } + + /// Handle new connected peer. Call this method whenever we connect to a new peer. + pub(crate) fn new_peer( + &mut self, + protocol: &mut dyn Context, + who: PeerId, + info: ProtocolPeerInfo + ) { + // there's nothing sync can get from the node that has no blockchain data + // (the opposite is not true, but all requests are served at protocol level) + if !info.roles.is_full() { + return; + } + + let status = block_status(&*protocol.client(), &self.queue_blocks, info.best_hash); + match (status, info.best_number) { + (Err(e), _) => { + debug!(target:"sync", "Error reading blockchain: {:?}", e); + protocol.report_peer(who.clone(), BLOCKCHAIN_STATUS_READ_ERROR_REPUTATION_CHANGE); + protocol.disconnect_peer(who); + }, + (Ok(BlockStatus::KnownBad), _) => { + info!("New peer with known bad best block {} ({}).", info.best_hash, info.best_number); + protocol.report_peer(who.clone(), i32::min_value()); + protocol.disconnect_peer(who); + }, + (Ok(BlockStatus::Unknown), b) if b.is_zero() => { + info!("New peer with unknown genesis hash {} ({}).", info.best_hash, info.best_number); + protocol.report_peer(who.clone(), i32::min_value()); + protocol.disconnect_peer(who); + }, + (Ok(BlockStatus::Unknown), _) if self.queue_blocks.len() > MAJOR_SYNC_BLOCKS => { + // If there are more than `MAJOR_SYNC_BLOCKS` in the import queue then we have + // enough to do in the import queue that it's not worth kicking off + // an ancestor search, which is what we do in the next match case below. + debug!( + target:"sync", + "New peer with unknown best hash {} ({}), assuming common block.", + self.best_queued_hash, + self.best_queued_number + ); + self.peers.insert(who, PeerSync { + common_number: self.best_queued_number, + best_hash: info.best_hash, + best_number: info.best_number, + state: PeerSyncState::Available, + recently_announced: Default::default(), + }); + } + (Ok(BlockStatus::Unknown), _) => { + let our_best = self.best_queued_number; + if our_best.is_zero() { + // We are at genesis, just start downloading + debug!(target:"sync", "New peer with best hash {} ({}).", info.best_hash, info.best_number); + self.peers.insert(who.clone(), PeerSync { + common_number: Zero::zero(), + best_hash: info.best_hash, + best_number: info.best_number, + state: PeerSyncState::Available, + recently_announced: Default::default(), + }); + self.download_new(protocol, who) + } else { + let common_best = ::std::cmp::min(our_best, info.best_number); + debug!(target:"sync", + "New peer with unknown best hash {} ({}), searching for common ancestor.", + info.best_hash, + info.best_number + ); + self.peers.insert(who.clone(), PeerSync { + common_number: Zero::zero(), + best_hash: info.best_hash, + best_number: info.best_number, + state: PeerSyncState::AncestorSearch( + common_best, + AncestorSearchState::ExponentialBackoff(One::one()) + ), + recently_announced: Default::default(), + }); + Self::request_ancestry(protocol, who, common_best) + } + }, + (Ok(BlockStatus::Queued), _) | + (Ok(BlockStatus::InChainWithState), _) | + (Ok(BlockStatus::InChainPruned), _) => { + debug!(target:"sync", "New peer with known best hash {} ({}).", info.best_hash, info.best_number); + self.peers.insert(who.clone(), PeerSync { + common_number: info.best_number, + best_hash: info.best_hash, + best_number: info.best_number, + state: PeerSyncState::Available, + recently_announced: Default::default(), + }); + } + } + } + + /// This function handles the ancestor search strategy used. The goal is to find a common point + /// that both our chains agree on that is as close to the tip as possible. + /// The way this works is we first have an exponential backoff strategy, where we try to step + /// forward until we find a block hash mismatch. The size of the step doubles each step we take. + /// + /// When we've found a block hash mismatch we then fall back to a binary search between the two + /// last known points to find the common block closest to the tip. + fn handle_ancestor_search_state( + state: AncestorSearchState, + curr_block_num: NumberFor, + block_hash_match: bool, + ) -> Option<(AncestorSearchState, NumberFor)> { + let two = >::one() + >::one(); + match state { + AncestorSearchState::ExponentialBackoff(next_distance_to_tip) => { + if block_hash_match && next_distance_to_tip == One::one() { + // We found the ancestor in the first step so there is no need to execute binary search. + return None; + } + if block_hash_match { + let left = curr_block_num; + let right = left + next_distance_to_tip / two; + let middle = left + (right - left) / two; + Some((AncestorSearchState::BinarySearch(left, right), middle)) + } else { + let next_block_num = curr_block_num.checked_sub(&next_distance_to_tip) + .unwrap_or_else(Zero::zero); + let next_distance_to_tip = next_distance_to_tip * two; + Some((AncestorSearchState::ExponentialBackoff(next_distance_to_tip), next_block_num)) + } + }, + AncestorSearchState::BinarySearch(mut left, mut right) => { + if left >= curr_block_num { + return None; + } + if block_hash_match { + left = curr_block_num; + } else { + right = curr_block_num; + } + assert!(right >= left); + let middle = left + (right - left) / two; + Some((AncestorSearchState::BinarySearch(left, right), middle)) + }, + } + } + + /// Handle a response from the remote to a block request that we made. + /// + /// `request` must be the original request that triggered `response`. + /// + /// If this corresponds to a valid block, this outputs the block that must be imported in the + /// import queue. + #[must_use] + pub(crate) fn on_block_data( + &mut self, + protocol: &mut dyn Context, + who: PeerId, + request: message::BlockRequest, + response: message::BlockResponse + ) -> Option<(BlockOrigin, Vec>)> { + let new_blocks: Vec> = if let Some(ref mut peer) = self.peers.get_mut(&who) { + let mut blocks = response.blocks; + if request.direction == message::Direction::Descending { + trace!(target: "sync", "Reversing incoming block list"); + blocks.reverse(); + } + let peer_state = peer.state.clone(); + match peer_state { + PeerSyncState::DownloadingNew(start_block) => { + self.blocks.clear_peer_download(&who); + peer.state = PeerSyncState::Available; + self.blocks.insert(start_block, blocks, who); + self.blocks + .drain(self.best_queued_number + One::one()) + .into_iter() + .map(|block_data| { + IncomingBlock { + hash: block_data.block.hash, + header: block_data.block.header, + body: block_data.block.body, + justification: block_data.block.justification, + origin: block_data.origin, + } + }).collect() + }, + PeerSyncState::DownloadingStale(_) => { + peer.state = PeerSyncState::Available; + blocks.into_iter().map(|b| { + IncomingBlock { + hash: b.hash, + header: b.header, + body: b.body, + justification: b.justification, + origin: Some(who.clone()), + } + }).collect() + }, + PeerSyncState::AncestorSearch(num, state) => { + let block_hash_match = match (blocks.get(0), protocol.client().block_hash(num)) { + (Some(ref block), Ok(maybe_our_block_hash)) => { + trace!(target: "sync", "Got ancestry block #{} ({}) from peer {}", num, block.hash, who); + maybe_our_block_hash.map_or(false, |x| x == block.hash) + }, + (None, _) => { + debug!(target: "sync", "Invalid response when searching for ancestor from {}", who); + protocol.report_peer(who.clone(), i32::min_value()); + protocol.disconnect_peer(who); + return None + }, + (_, Err(e)) => { + info!("Error answering legitimate blockchain query: {:?}", e); + protocol.report_peer(who.clone(), ANCESTRY_BLOCK_ERROR_REPUTATION_CHANGE); + protocol.disconnect_peer(who); + return None + }, + }; + if block_hash_match && peer.common_number < num { + peer.common_number = num; + } + if !block_hash_match && num.is_zero() { + trace!(target:"sync", "Ancestry search: genesis mismatch for peer {}", who); + protocol.report_peer(who.clone(), GENESIS_MISMATCH_REPUTATION_CHANGE); + protocol.disconnect_peer(who); + return None + } + if let Some((next_state, next_block_num)) = + Self::handle_ancestor_search_state(state, num, block_hash_match) { + peer.state = PeerSyncState::AncestorSearch(next_block_num, next_state); + Self::request_ancestry(protocol, who, next_block_num); + return None + } else { + peer.state = PeerSyncState::Available; + vec![] + } + }, + PeerSyncState::Available | + PeerSyncState::DownloadingJustification(..) | + PeerSyncState::DownloadingFinalityProof(..) => Vec::new(), + } + } else { + Vec::new() + }; + + let is_recent = new_blocks + .first() + .map(|block| self.peers.iter().any(|(_, peer)| peer.recently_announced.contains(&block.hash))) + .unwrap_or(false); + let origin = if is_recent { BlockOrigin::NetworkBroadcast } else { BlockOrigin::NetworkInitialSync }; + + if let Some((hash, number)) = new_blocks.last() + .and_then(|b| b.header.as_ref().map(|h| (b.hash.clone(), *h.number()))) + { + trace!(target:"sync", "Accepted {} blocks ({:?}) with origin {:?}", new_blocks.len(), hash, origin); + self.block_queued(&hash, number); + } + self.maintain_sync(protocol); + let new_best_importing_number = new_blocks + .last() + .and_then(|b| b.header.as_ref().map(|h| h.number().clone())) + .unwrap_or_else(|| Zero::zero()); + self.queue_blocks + .extend(new_blocks.iter().map(|b| b.hash.clone())); + self.best_importing_number = max(new_best_importing_number, self.best_importing_number); + Some((origin, new_blocks)) + } + + /// Handle a response from the remote to a justification request that we made. + /// + /// `request` must be the original request that triggered `response`. + /// + /// Returns `Some` if this produces a justification that must be imported into the import + /// queue. + #[must_use] + pub(crate) fn on_block_justification_data( + &mut self, + protocol: &mut dyn Context, + who: PeerId, + response: message::BlockResponse, + ) -> Option<(PeerId, B::Hash, NumberFor, Justification)> + { + let peer = if let Some(peer) = self.peers.get_mut(&who) { + peer + } else { + error!(target: "sync", "Called on_block_justification_data with a bad peer ID"); + return None; + }; + + if let PeerSyncState::DownloadingJustification(hash) = peer.state { + peer.state = PeerSyncState::Available; + + // we only request one justification at a time + match response.blocks.into_iter().next() { + Some(response) => { + if hash != response.hash { + info!("Invalid block justification provided by {}: requested: {:?} got: {:?}", + who, hash, response.hash); + protocol.report_peer(who.clone(), i32::min_value()); + protocol.disconnect_peer(who); + return None; + } + return self.extra_justifications.on_response(who, response.justification) + } + None => { + // we might have asked the peer for a justification on a block that we thought it had + // (regardless of whether it had a justification for it or not). + trace!(target: "sync", "Peer {:?} provided empty response for justification request {:?}", + who, + hash, + ); + return None; + } + } + } + + self.maintain_sync(protocol); + None + } + + /// Handle new finality proof data. + pub(crate) fn on_block_finality_proof_data( + &mut self, + protocol: &mut dyn Context, + who: PeerId, + response: message::FinalityProofResponse, + ) -> Option<(PeerId, B::Hash, NumberFor, Vec)> { + let peer = if let Some(peer) = self.peers.get_mut(&who) { + peer + } else { + error!(target: "sync", "Called on_block_finality_proof_data with a bad peer ID"); + return None; + }; + + if let PeerSyncState::DownloadingFinalityProof(hash) = peer.state { + peer.state = PeerSyncState::Available; + + // we only request one finality proof at a time + if hash != response.block { + info!( + "Invalid block finality proof provided: requested: {:?} got: {:?}", + hash, + response.block, + ); + + protocol.report_peer(who.clone(), i32::min_value()); + protocol.disconnect_peer(who); + return None; + } + + return self.extra_finality_proofs.on_response(who, response.proof) + } + + self.maintain_sync(protocol); + None + } + + /// A batch of blocks have been processed, with or without errors. + /// Call this when a batch of blocks have been processed by the import queue, with or without + /// errors. + pub fn blocks_processed(&mut self, protocol: &mut dyn Context, processed_blocks: Vec, has_error: bool) { + for hash in processed_blocks { + self.queue_blocks.remove(&hash); + } + if has_error { + self.best_importing_number = Zero::zero(); + } + self.maintain_sync(protocol) + } + + /// Maintain the sync process (download new blocks, fetch justifications). + fn maintain_sync(&mut self, protocol: &mut dyn Context) { + let peers: Vec = self.peers.keys().map(|p| p.clone()).collect(); + for peer in peers { + self.download_new(protocol, peer); + } + self.tick(protocol) + } + + /// Called periodically to perform any time-based actions. Must be called at a regular + /// interval. + pub fn tick(&mut self, protocol: &mut dyn Context) { + self.send_justification_requests(protocol); + self.send_finality_proof_request(protocol) + } + + fn send_justification_requests(&mut self, protocol: &mut dyn Context) { + let mut matcher = self.extra_justifications.matcher(); + while let Some((peer, request)) = matcher.next(&self.peers) { + self.peers.get_mut(&peer) + .expect("`Matcher::next` guarantees the `PeerId` comes from the given peers; qed") + .state = PeerSyncState::DownloadingJustification(request.0); + protocol.send_block_request(peer, message::generic::BlockRequest { + id: 0, + fields: message::BlockAttributes::JUSTIFICATION, + from: message::FromBlock::Hash(request.0), + to: None, + direction: message::Direction::Ascending, + max: Some(1) + }) + } + } + + fn send_finality_proof_request(&mut self, protocol: &mut dyn Context) { + let mut matcher = self.extra_finality_proofs.matcher(); + while let Some((peer, request)) = matcher.next(&self.peers) { + self.peers.get_mut(&peer) + .expect("`Matcher::next` guarantees the `PeerId` comes from the given peers; qed") + .state = PeerSyncState::DownloadingFinalityProof(request.0); + protocol.send_finality_proof_request(peer, message::generic::FinalityProofRequest { + id: 0, + block: request.0, + request: self.request_builder.as_ref() + .map(|builder| builder.build_request_data(&request.0)) + .unwrap_or_default() + }) + } + } + + /// Request a justification for the given block. + /// + /// Uses `protocol` to queue a new justification request and tries to dispatch all pending + /// requests. + pub fn request_justification(&mut self, hash: &B::Hash, number: NumberFor, protocol: &mut dyn Context) { + self.extra_justifications.schedule((*hash, number), |base, block| { + protocol.client().is_descendent_of(base, block) + }); + self.send_justification_requests(protocol) + } + + /// Clears all pending justification requests. + pub fn clear_justification_requests(&mut self) { + self.extra_justifications.reset() + } + + /// Call this when a justification has been processed by the import queue, with or without + /// errors. + pub fn justification_import_result(&mut self, hash: B::Hash, number: NumberFor, success: bool) { + let finalization_result = if success { Ok((hash, number)) } else { Err(()) }; + if !self.extra_justifications.try_finalize_root((hash, number), finalization_result, true) { + debug!(target: "sync", "Got justification import result for unknown justification {:?} {:?} request.", + hash, + number, + ); + } + } + + /// Request a finality proof for the given block. + /// + /// Queues a new finality proof request and tries to dispatch all pending requests. + pub fn request_finality_proof(&mut self, hash: &B::Hash, number: NumberFor, protocol: &mut dyn Context) { + self.extra_finality_proofs.schedule((*hash, number), |base, block| { + protocol.client().is_descendent_of(base, block) + }); + self.send_finality_proof_request(protocol) + } + + pub fn finality_proof_import_result( + &mut self, + request_block: (B::Hash, NumberFor), + finalization_result: Result<(B::Hash, NumberFor), ()>, + ) { + self.extra_finality_proofs.try_finalize_root(request_block, finalization_result, true); + } + + pub fn set_finality_proof_request_builder(&mut self, builder: SharedFinalityProofRequestBuilder) { + self.request_builder = Some(builder) + } + + /// Log that a block has been successfully imported + pub fn block_imported(&mut self, hash: &B::Hash, number: NumberFor) { + trace!(target: "sync", "Block imported successfully {} ({})", number, hash); + } + + /// Notify about finalization of the given block. + pub fn on_block_finalized(&mut self, hash: &B::Hash, number: NumberFor, protocol: &mut dyn Context) { + let r = self.extra_finality_proofs.on_block_finalized(hash, number, |base, block| { + protocol.client().is_descendent_of(base, block) + }); + + if let Err(err) = r { + warn!(target: "sync", "Error cleaning up pending extra finality proof data requests: {:?}", err); + } + + let r = self.extra_justifications.on_block_finalized(hash, number, |base, block| { + protocol.client().is_descendent_of(base, block) + }); + + if let Err(err) = r { + warn!(target: "sync", "Error cleaning up pending extra justification data requests: {:?}", err); + } + } + + /// Called when a block has been queued for import. Updates our internal state for best queued + /// block and then goes through all peers to update our view of their state as well. + fn block_queued(&mut self, hash: &B::Hash, number: NumberFor) { + if number > self.best_queued_number { + self.best_queued_number = number; + self.best_queued_hash = *hash; + } + // Update common blocks + for (n, peer) in self.peers.iter_mut() { + if let PeerSyncState::AncestorSearch(_, _) = peer.state { + // Abort search. + peer.state = PeerSyncState::Available; + } + let new_common_number = if peer.best_number >= number { + number + } else { + peer.best_number + }; + trace!( + target: "sync", + "Updating peer {} info, ours={}, common={}->{}, their best={}", + n, + number, + peer.common_number, + new_common_number, + peer.best_number, + ); + peer.common_number = new_common_number; + } + } + + /// Signal that `best_header` has been queued for import and update the `ChainSync` state with + /// that information. + pub(crate) fn update_chain_info(&mut self, best_header: &B::Header) { + let hash = best_header.hash(); + self.block_queued(&hash, best_header.number().clone()) + } + + /// Call when a node announces a new block. + /// + /// If true is returned, then the caller MUST try to import passed header (call `on_block_data`). + /// The network request isn't sent in this case. + /// Both hash and header is passed as an optimization to avoid rehashing the header. + #[must_use] + pub(crate) fn on_block_announce( + &mut self, + protocol: &mut dyn Context, + who: PeerId, + hash: B::Hash, + header: &B::Header, + ) -> bool { + let number = *header.number(); + debug!(target: "sync", "Received block announcement with number {:?}", number); + if number.is_zero() { + warn!(target: "sync", "Ignored invalid block announcement from {}: {}", who, hash); + return false; + } + let parent_status = block_status(&*protocol.client(), &self.queue_blocks, header.parent_hash().clone()).ok() + .unwrap_or(BlockStatus::Unknown); + let known_parent = parent_status != BlockStatus::Unknown; + let ancient_parent = parent_status == BlockStatus::InChainPruned; + + let known = self.is_known(protocol, &hash); + let peer = if let Some(peer) = self.peers.get_mut(&who) { + peer + } else { + error!(target: "sync", "Called on_block_announce with a bad peer ID"); + return false; + }; + while peer.recently_announced.len() >= ANNOUNCE_HISTORY_SIZE { + peer.recently_announced.pop_front(); + } + peer.recently_announced.push_back(hash.clone()); + if number > peer.best_number { + // update their best block + peer.best_number = number; + peer.best_hash = hash; + } + if let PeerSyncState::AncestorSearch(_, _) = peer.state { + return false; + } + // We assume that the announced block is the latest they have seen, and so our common number + // is either one further ahead or it's the one they just announced, if we know about it. + if header.parent_hash() == &self.best_queued_hash || known_parent { + peer.common_number = number - One::one(); + } else if known { + peer.common_number = number + } + + // known block case + if known || self.is_already_downloading(&hash) { + trace!(target: "sync", "Known block announce from {}: {}", who, hash); + return false; + } + + // stale block case + let requires_additional_data = !self.role.is_light(); + if number <= self.best_queued_number { + if !(known_parent || self.is_already_downloading(header.parent_hash())) { + if protocol.client().block_status(&BlockId::Number(*header.number())) + .unwrap_or(BlockStatus::Unknown) == BlockStatus::InChainPruned + { + trace!( + target: "sync", + "Ignored unknown ancient block announced from {}: {} {:?}", + who, hash, header + ); + return false; + } + + trace!( + target: "sync", + "Considering new unknown stale block announced from {}: {} {:?}", + who, hash, header + ); + let request = self.download_unknown_stale(&who, &hash); + match request { + Some(request) => if requires_additional_data { + protocol.send_block_request(who, request); + return false; + } else { + return true; + }, + None => return false, + } + } else { + if ancient_parent { + trace!( + target: "sync", + "Ignored ancient stale block announced from {}: {} {:?}", + who, hash, header + ); + return false; + } + + let request = self.download_stale(&who, &hash); + match request { + Some(request) => if requires_additional_data { + protocol.send_block_request(who, request); + return false; + } else { + return true; + }, + None => return false, + } + } + } + + if ancient_parent { + trace!(target: "sync", "Ignored ancient block announced from {}: {} {:?}", who, hash, header); + return false; + } + + trace!(target: "sync", "Considering new block announced from {}: {} {:?}", who, hash, header); + let (range, request) = match self.select_new_blocks(who.clone()) { + Some((range, request)) => (range, request), + None => return false, + }; + let is_required_data_available = + !requires_additional_data && + range.end - range.start == One::one() && + range.start == *header.number(); + if !is_required_data_available { + protocol.send_block_request(who, request); + return false; + } + + true + } + + /// Convenience function to iterate through all peers and see if there are any that we are + /// downloading this hash from. + fn is_already_downloading(&self, hash: &B::Hash) -> bool { + self.peers.iter().any(|(_, p)| p.state == PeerSyncState::DownloadingStale(*hash)) + } + + /// Returns true if the block with given hash exists in the import queue with known status or is + /// already imported. + fn is_known(&self, protocol: &mut dyn Context, hash: &B::Hash) -> bool { + block_status(&*protocol.client(), &self.queue_blocks, *hash).ok().map_or(false, |s| s != BlockStatus::Unknown) + } + + /// Call when a peer has disconnected. + pub(crate) fn peer_disconnected(&mut self, protocol: &mut dyn Context, who: PeerId) { + self.blocks.clear_peer_download(&who); + self.peers.remove(&who); + self.extra_justifications.peer_disconnected(&who); + self.extra_finality_proofs.peer_disconnected(&who); + self.maintain_sync(protocol); + } + + /// Restart the sync process. + pub(crate) fn restart( + &mut self, + protocol: &mut dyn Context, + mut peer_info: impl FnMut(&PeerId) -> Option> + ) { + self.queue_blocks.clear(); + self.best_importing_number = Zero::zero(); + self.blocks.clear(); + let info = protocol.client().info(); + self.best_queued_hash = info.chain.best_hash; + self.best_queued_number = info.chain.best_number; + debug!(target:"sync", "Restarted with {} ({})", self.best_queued_number, self.best_queued_hash); + let ids: Vec = self.peers.drain().map(|(id, _)| id).collect(); + for id in ids { + if let Some(info) = peer_info(&id) { + self.new_peer(protocol, id, info); + } + } + } + + // Download old block with known parent. + fn download_stale( + &mut self, + who: &PeerId, + hash: &B::Hash, + ) -> Option> { + let peer = self.peers.get_mut(who)?; + match peer.state { + PeerSyncState::Available => { + peer.state = PeerSyncState::DownloadingStale(*hash); + Some(message::generic::BlockRequest { + id: 0, + fields: self.required_block_attributes.clone(), + from: message::FromBlock::Hash(*hash), + to: None, + direction: message::Direction::Ascending, + max: Some(1), + }) + }, + _ => None, + } + } + + // Download old block with unknown parent. + fn download_unknown_stale( + &mut self, + who: &PeerId, + hash: &B::Hash, + ) -> Option> { + let peer = self.peers.get_mut(who)?; + match peer.state { + PeerSyncState::Available => { + peer.state = PeerSyncState::DownloadingStale(*hash); + Some(message::generic::BlockRequest { + id: 0, + fields: self.required_block_attributes.clone(), + from: message::FromBlock::Hash(*hash), + to: None, + direction: message::Direction::Descending, + max: Some(MAX_UNKNOWN_FORK_DOWNLOAD_LEN), + }) + }, + _ => None, + } + } + + // Issue a request for a peer to download new blocks, if any are available. + fn download_new(&mut self, protocol: &mut dyn Context, who: PeerId) { + if let Some((_, request)) = self.select_new_blocks(who.clone()) { + protocol.send_block_request(who, request); + } + } + + // Select a range of NEW blocks to download from peer. + fn select_new_blocks(&mut self, who: PeerId) -> Option<(Range>, message::BlockRequest)> { + // when there are too many blocks in the queue => do not try to download new blocks + if self.queue_blocks.len() > MAX_IMPORTING_BLOCKS { + trace!(target: "sync", "Too many blocks in the queue."); + return None; + } + + let peer = self.peers.get_mut(&who)?; + match peer.state { + PeerSyncState::Available => { + trace!( + target: "sync", + "Considering new block download from {}, common block is {}, best is {:?}", + who, + peer.common_number, + peer.best_number, + ); + let range = self.blocks.needed_blocks( + who.clone(), + MAX_BLOCKS_TO_REQUEST, + peer.best_number, + peer.common_number + ); + match range { + Some(range) => { + trace!(target: "sync", "Requesting blocks from {}, ({} to {})", who, range.start, range.end); + let from = message::FromBlock::Number(range.start); + let max = Some((range.end - range.start).saturated_into::()); + peer.state = PeerSyncState::DownloadingNew(range.start); + Some(( + range, + message::generic::BlockRequest { + id: 0, + fields: self.required_block_attributes.clone(), + from, + to: None, + direction: message::Direction::Ascending, + max, + }, + )) + }, + None => { + trace!(target: "sync", "Nothing to request"); + None + }, + } + }, + _ => { + trace!(target: "sync", "Peer {} is busy", who); + None + }, + } + } + + /// Request the ancestry for a block. Sends a request for header and justification for the given + /// block number. Used during ancestry search. + fn request_ancestry(protocol: &mut dyn Context, who: PeerId, block: NumberFor) { + trace!(target: "sync", "Requesting ancestry block #{} from {}", block, who); + let request = message::generic::BlockRequest { + id: 0, + fields: message::BlockAttributes::HEADER | message::BlockAttributes::JUSTIFICATION, + from: message::FromBlock::Number(block), + to: None, + direction: message::Direction::Ascending, + max: Some(1), + }; + protocol.send_block_request(who, request); + } +} + +/// Returns the BlockStatus for given block hash, looking first in the import queue and then in the +/// provided chain. +fn block_status( + chain: &dyn crate::chain::Client, + queue_blocks: &HashSet, + hash: B::Hash) -> Result +{ + if queue_blocks.contains(&hash) { + return Ok(BlockStatus::Queued); + } + + chain.block_status(&BlockId::Hash(hash)) +} diff --git a/core/network/src/blocks.rs b/core/network/src/protocol/sync/blocks.rs similarity index 85% rename from core/network/src/blocks.rs rename to core/network/src/protocol/sync/blocks.rs index 60c6886f09f27c210876825bcc4fa364235676e2..ff8d9907af0cd2bd619d128e79157f9952bf252c 100644 --- a/core/network/src/blocks.rs +++ b/core/network/src/protocol/sync/blocks.rs @@ -20,8 +20,8 @@ use std::ops::Range; use std::collections::{HashMap, BTreeMap}; use std::collections::hash_map::Entry; use log::trace; -use network_libp2p::PeerId; -use runtime_primitives::traits::{Block as BlockT, NumberFor, As}; +use libp2p::PeerId; +use runtime_primitives::traits::{Block as BlockT, NumberFor, One}; use crate::message; const MAX_PARALLEL_DOWNLOADS: u32 = 1; @@ -48,7 +48,7 @@ impl BlockRangeState { pub fn len(&self) -> NumberFor { match *self { BlockRangeState::Downloading { len, .. } => len, - BlockRangeState::Complete(ref blocks) => As::sa(blocks.len() as u64), + BlockRangeState::Complete(ref blocks) => (blocks.len() as u32).into(), } } } @@ -100,17 +100,19 @@ impl BlockCollection { } /// Returns a set of block hashes that require a header download. The returned set is marked as being downloaded. - pub fn needed_blocks(&mut self, who: PeerId, count: usize, peer_best: NumberFor, common: NumberFor) -> Option>> { + pub fn needed_blocks(&mut self, who: PeerId, count: usize, peer_best: NumberFor, common: NumberFor) + -> Option>> { // First block number that we need to download - let first_different = common + As::sa(1); - let count = As::sa(count as u64); + let first_different = common + >::one(); + let count = (count as u32).into(); let (mut range, downloading) = { let mut downloading_iter = self.blocks.iter().peekable(); let mut prev: Option<(&NumberFor, &BlockRangeState)> = None; loop { let next = downloading_iter.next(); break match &(prev, next) { - &(Some((start, &BlockRangeState::Downloading { ref len, downloading })), _) if downloading < MAX_PARALLEL_DOWNLOADS => + &(Some((start, &BlockRangeState::Downloading { ref len, downloading })), _) + if downloading < MAX_PARALLEL_DOWNLOADS => (*start .. *start + *len, downloading), &(Some((start, r)), Some((next_start, _))) if *start + r.len() < *next_start => (*start + r.len() .. cmp::min(*next_start, *start + r.len() + count), 0), // gap @@ -132,11 +134,15 @@ impl BlockCollection { trace!(target: "sync", "Out of range for peer {} ({} vs {})", who, range.start, peer_best); return None; } - range.end = cmp::min(peer_best + As::sa(1), range.end); + range.end = cmp::min(peer_best + One::one(), range.end); self.peer_requests.insert(who, range.start); - self.blocks.insert(range.start, BlockRangeState::Downloading { len: range.end - range.start, downloading: downloading + 1 }); + self.blocks.insert(range.start, BlockRangeState::Downloading { + len: range.end - range.start, + downloading: downloading + 1 + }); if range.end <= range.start { - panic!("Empty range {:?}, count={}, peer_best={}, common={}, blocks={:?}", range, count, peer_best, common, self.blocks); + panic!("Empty range {:?}, count={}, peer_best={}, common={}, blocks={:?}", + range, count, peer_best, common, self.blocks); } Some(range) } @@ -150,7 +156,7 @@ impl BlockCollection { for (start, range_data) in &mut self.blocks { match range_data { &mut BlockRangeState::Complete(ref mut blocks) if *start <= prev => { - prev = *start + As::sa(blocks.len() as u64); + prev = *start + (blocks.len() as u32).into(); let mut blocks = mem::replace(blocks, Vec::new()); drained.append(&mut blocks); ranges.push(*start); @@ -248,14 +254,17 @@ mod test { bc.insert(1, blocks[1..11].to_vec(), peer0.clone()); assert_eq!(bc.needed_blocks(peer0.clone(), 40, 150, 0), Some(11 .. 41)); - assert_eq!(bc.drain(1), blocks[1..11].iter().map(|b| BlockData { block: b.clone(), origin: Some(peer0.clone()) }).collect::>()); + assert_eq!(bc.drain(1), blocks[1..11].iter() + .map(|b| BlockData { block: b.clone(), origin: Some(peer0.clone()) }).collect::>()); bc.clear_peer_download(&peer0); bc.insert(11, blocks[11..41].to_vec(), peer0.clone()); let drained = bc.drain(12); - assert_eq!(drained[..30], blocks[11..41].iter().map(|b| BlockData { block: b.clone(), origin: Some(peer0.clone()) }).collect::>()[..]); - assert_eq!(drained[30..], blocks[41..81].iter().map(|b| BlockData { block: b.clone(), origin: Some(peer1.clone()) }).collect::>()[..]); + assert_eq!(drained[..30], blocks[11..41].iter() + .map(|b| BlockData { block: b.clone(), origin: Some(peer0.clone()) }).collect::>()[..]); + assert_eq!(drained[30..], blocks[41..81].iter() + .map(|b| BlockData { block: b.clone(), origin: Some(peer1.clone()) }).collect::>()[..]); bc.clear_peer_download(&peer2); assert_eq!(bc.needed_blocks(peer2.clone(), 40, 150, 80), Some(81 .. 121)); @@ -266,8 +275,10 @@ mod test { assert_eq!(bc.drain(80), vec![]); let drained = bc.drain(81); - assert_eq!(drained[..40], blocks[81..121].iter().map(|b| BlockData { block: b.clone(), origin: Some(peer2.clone()) }).collect::>()[..]); - assert_eq!(drained[40..], blocks[121..150].iter().map(|b| BlockData { block: b.clone(), origin: Some(peer1.clone()) }).collect::>()[..]); + assert_eq!(drained[..40], blocks[81..121].iter() + .map(|b| BlockData { block: b.clone(), origin: Some(peer2.clone()) }).collect::>()[..]); + assert_eq!(drained[40..], blocks[121..150].iter() + .map(|b| BlockData { block: b.clone(), origin: Some(peer1.clone()) }).collect::>()[..]); } #[test] diff --git a/core/network/src/protocol/sync/extra_requests.rs b/core/network/src/protocol/sync/extra_requests.rs new file mode 100644 index 0000000000000000000000000000000000000000..c4f6de05a224aa8a0b16b52ce5e4ab3053584b71 --- /dev/null +++ b/core/network/src/protocol/sync/extra_requests.rs @@ -0,0 +1,463 @@ +// Copyright 2017-2018 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +use client::error::Error as ClientError; +use crate::protocol::sync::{PeerSync, PeerSyncState}; +use fork_tree::ForkTree; +use libp2p::PeerId; +use log::warn; +use runtime_primitives::traits::{Block as BlockT, NumberFor}; +use std::collections::{HashMap, HashSet, VecDeque}; +use std::time::{Duration, Instant}; + +// Time to wait before trying to get the same extra data from the same peer. +const EXTRA_RETRY_WAIT: Duration = Duration::from_secs(10); + +/// Pending extra data request for the given block (hash and number). +pub(crate) type ExtraRequest = (::Hash, NumberFor); + +/// Manages pending block extra data (e.g. justification) requests. +/// +/// Multiple extras may be requested for competing forks, or for the same branch +/// at different (increasing) heights. This structure will guarantee that extras +/// are fetched in-order, and that obsolete changes are pruned (when finalizing a +/// competing fork). +#[derive(Debug)] +pub(crate) struct ExtraRequests { + tree: ForkTree, ()>, + /// requests which have been queued for later processing + pending_requests: VecDeque>, + /// requests which are currently underway to some peer + active_requests: HashMap>, + /// previous requests without response + failed_requests: HashMap, Vec<(PeerId, Instant)>>, + /// successful requests + importing_requests: HashSet>, +} + +impl ExtraRequests { + pub(crate) fn new() -> Self { + ExtraRequests { + tree: ForkTree::new(), + pending_requests: VecDeque::new(), + active_requests: HashMap::new(), + failed_requests: HashMap::new(), + importing_requests: HashSet::new(), + } + } + + /// Reset all state as if returned from `new`. + pub(crate) fn reset(&mut self) { + self.tree = ForkTree::new(); + self.pending_requests.clear(); + self.active_requests.clear(); + self.failed_requests.clear(); + } + + /// Returns an iterator-like struct that yields peers which extra + /// requests can be sent to. + pub(crate) fn matcher(&mut self) -> Matcher { + Matcher::new(self) + } + + /// Queue an extra data request to be considered by the `Matcher`. + pub(crate) fn schedule(&mut self, request: ExtraRequest, is_descendent_of: F) + where F: Fn(&B::Hash, &B::Hash) -> Result + { + match self.tree.import(request.0, request.1, (), &is_descendent_of) { + Ok(true) => { + // this is a new root so we add it to the current `pending_requests` + self.pending_requests.push_back((request.0, request.1)) + } + Err(err) => { + warn!(target: "sync", "Failed to insert request {:?} into tree: {:?}", request, err); + return + } + _ => () + } + } + + /// Retry any pending request if a peer disconnected. + pub(crate) fn peer_disconnected(&mut self, who: &PeerId) { + if let Some(request) = self.active_requests.remove(who) { + self.pending_requests.push_front(request) + } + } + + /// Processes the response for the request previously sent to the given peer. + pub(crate) fn on_response(&mut self, who: PeerId, resp: Option) -> Option<(PeerId, B::Hash, NumberFor, R)> { + // we assume that the request maps to the given response, this is + // currently enforced by the outer network protocol before passing on + // messages to chain sync. + if let Some(request) = self.active_requests.remove(&who) { + if let Some(r) = resp { + self.importing_requests.insert(request); + return Some((who, request.0, request.1, r)) + } + self.failed_requests.entry(request).or_insert(Vec::new()).push((who, Instant::now())); + self.pending_requests.push_front(request); + } + None + } + + /// Removes any pending extra requests for blocks lower than the given best finalized. + pub(crate) fn on_block_finalized( + &mut self, + best_finalized_hash: &B::Hash, + best_finalized_number: NumberFor, + is_descendent_of: F + ) -> Result<(), fork_tree::Error> + where F: Fn(&B::Hash, &B::Hash) -> Result + { + let request = (*best_finalized_hash, best_finalized_number); + + if self.try_finalize_root::<()>(request, Ok(request), false) { + return Ok(()) + } + + self.tree.finalize(best_finalized_hash, best_finalized_number, &is_descendent_of)?; + + let roots = self.tree.roots().collect::>(); + + self.pending_requests.retain(|(h, n)| roots.contains(&(h, n, &()))); + self.active_requests.retain(|_, (h, n)| roots.contains(&(h, n, &()))); + self.failed_requests.retain(|(h, n), _| roots.contains(&(h, n, &()))); + + Ok(()) + } + + /// Try to finalize pending root. + /// + /// Returns true if import of this request has been scheduled. + pub(crate) fn try_finalize_root( + &mut self, + request: ExtraRequest, + result: Result, E>, + reschedule_on_failure: bool + ) -> bool + { + if !self.importing_requests.remove(&request) { + return false + } + + let (finalized_hash, finalized_number) = match result { + Ok(req) => (req.0, req.1), + Err(_) => { + if reschedule_on_failure { + self.pending_requests.push_front(request); + } + return true + } + }; + + if self.tree.finalize_root(&finalized_hash).is_none() { + warn!(target: "sync", "Imported {:?} {:?} which isn't a root in the tree: {:?}", + finalized_hash, + finalized_number, + self.tree.roots().collect::>() + ); + return true + } + + self.failed_requests.clear(); + self.active_requests.clear(); + self.pending_requests.clear(); + self.pending_requests.extend(self.tree.roots().map(|(&h, &n, _)| (h, n))); + + true + } +} + +/// Matches peers with pending extra requests. +#[derive(Debug)] +pub(crate) struct Matcher<'a, B: BlockT> { + /// Length of pending requests collection. + /// Used to ensure we do not loop more than once over all pending requests. + remaining: usize, + extras: &'a mut ExtraRequests +} + +impl<'a, B: BlockT> Matcher<'a, B> { + fn new(extras: &'a mut ExtraRequests) -> Self { + Matcher { + remaining: extras.pending_requests.len(), + extras + } + } + + /// Finds a peer to which a pending request can be sent. + /// + /// Peers are filtered according to the current known best block (i.e. we won't + /// send an extra request for block #10 to a peer at block #2), and we also + /// throttle requests to the same peer if a previous request yielded no results. + /// + /// This method returns as soon as it finds a peer that should be able to answer + /// our request. If no request is pending or no peer can handle it, `None` is + /// returned instead. + /// + /// # Note + /// + /// The returned `PeerId` (if any) is guaranteed to come from the given `peers` + /// argument. + pub(crate) fn next(&mut self, peers: &HashMap>) -> Option<(PeerId, ExtraRequest)> { + if self.remaining == 0 { + return None + } + + // clean up previously failed requests so we can retry again + for requests in self.extras.failed_requests.values_mut() { + requests.retain(|(_, instant)| instant.elapsed() < EXTRA_RETRY_WAIT); + } + + while let Some(request) = self.extras.pending_requests.pop_front() { + for (peer, sync) in peers.iter().filter(|(_, sync)| sync.state == PeerSyncState::Available) { + // only ask peers that have synced at least up to the block number that we're asking the extra for + if sync.best_number < request.1 { + continue + } + // don't request to any peers that already have pending requests + if self.extras.active_requests.contains_key(peer) { + continue + } + // only ask if the same request has not failed for this peer before + if self.extras.failed_requests.get(&request).map(|rr| rr.iter().any(|i| &i.0 == peer)).unwrap_or(false) { + continue + } + self.extras.active_requests.insert(peer.clone(), request); + return Some((peer.clone(), request)) + } + + self.extras.pending_requests.push_back(request); + self.remaining -= 1; + + if self.remaining == 0 { + break + } + } + + None + } +} + +#[cfg(test)] +mod tests { + use crate::protocol::sync::PeerSync; + use client::error::Error as ClientError; + use quickcheck::{Arbitrary, Gen, QuickCheck, StdThreadGen}; + use rand::Rng; + use std::collections::{HashMap, HashSet}; + use super::*; + use test_client::runtime::{Block, BlockNumber, Hash}; + + #[test] + fn requests_are_processed_in_order() { + fn property(mut peers: ArbitraryPeers) { + let mut requests = ExtraRequests::::new(); + + let num_peers_available = peers.0.values() + .filter(|s| s.state == PeerSyncState::Available).count(); + + for i in 0 .. num_peers_available { + requests.schedule((Hash::random(), i as u64), |a, b| Ok(a[0] >= b[0])) + } + + let pending = requests.pending_requests.clone(); + let mut m = requests.matcher(); + + for p in &pending { + let (peer, r) = m.next(&peers.0).unwrap(); + assert_eq!(p, &r); + peers.0.get_mut(&peer).unwrap().state = PeerSyncState::DownloadingJustification(r.0); + } + } + + QuickCheck::with_gen(StdThreadGen::new(19)) + .quickcheck(property as fn(ArbitraryPeers)) + } + + #[test] + fn new_roots_schedule_new_request() { + fn property(data: Vec) { + let mut requests = ExtraRequests::::new(); + for (i, number) in data.into_iter().enumerate() { + let hash = [i as u8; 32].into(); + let pending = requests.pending_requests.len(); + let is_root = requests.tree.roots().any(|(&h, &n, _)| hash == h && number == n); + requests.schedule((hash, number), |a, b| Ok(a[0] >= b[0])); + if !is_root { + assert_eq!(1 + pending, requests.pending_requests.len()) + } + } + } + QuickCheck::new().quickcheck(property as fn(Vec)) + } + + #[test] + fn disconnecting_implies_rescheduling() { + fn property(mut peers: ArbitraryPeers) -> bool { + let mut requests = ExtraRequests::::new(); + + let num_peers_available = peers.0.values() + .filter(|s| s.state == PeerSyncState::Available).count(); + + for i in 0 .. num_peers_available { + requests.schedule((Hash::random(), i as u64), |a, b| Ok(a[0] >= b[0])) + } + + let mut m = requests.matcher(); + while let Some((peer, r)) = m.next(&peers.0) { + peers.0.get_mut(&peer).unwrap().state = PeerSyncState::DownloadingJustification(r.0); + } + + assert!(requests.pending_requests.is_empty()); + + let active_peers = requests.active_requests.keys().cloned().collect::>(); + let previously_active = requests.active_requests.values().cloned().collect::>(); + + for peer in &active_peers { + requests.peer_disconnected(peer) + } + + assert!(requests.active_requests.is_empty()); + + previously_active == requests.pending_requests.iter().cloned().collect::>() + } + + QuickCheck::with_gen(StdThreadGen::new(19)) + .quickcheck(property as fn(ArbitraryPeers) -> bool) + } + + #[test] + fn no_response_reschedules() { + fn property(mut peers: ArbitraryPeers) { + let mut requests = ExtraRequests::::new(); + + let num_peers_available = peers.0.values() + .filter(|s| s.state == PeerSyncState::Available).count(); + + for i in 0 .. num_peers_available { + requests.schedule((Hash::random(), i as u64), |a, b| Ok(a[0] >= b[0])) + } + + let mut m = requests.matcher(); + while let Some((peer, r)) = m.next(&peers.0) { + peers.0.get_mut(&peer).unwrap().state = PeerSyncState::DownloadingJustification(r.0); + } + + let active = requests.active_requests.iter().map(|(p, &r)| (p.clone(), r)).collect::>(); + + for (peer, req) in &active { + assert!(requests.failed_requests.get(req).is_none()); + assert!(!requests.pending_requests.contains(req)); + assert!(requests.on_response::<()>(peer.clone(), None).is_none()); + assert!(requests.pending_requests.contains(req)); + assert_eq!(1, requests.failed_requests.get(req).unwrap().iter().filter(|(p, _)| p == peer).count()) + } + } + + QuickCheck::with_gen(StdThreadGen::new(19)) + .quickcheck(property as fn(ArbitraryPeers)) + } + + #[test] + fn request_is_rescheduled_when_earlier_block_is_finalized() { + let _ = ::env_logger::try_init(); + + let mut finality_proofs = ExtraRequests::::new(); + + let hash4 = [4; 32].into(); + let hash5 = [5; 32].into(); + let hash6 = [6; 32].into(); + let hash7 = [7; 32].into(); + + fn is_descendent_of(base: &Hash, target: &Hash) -> Result { + Ok(target[0] >= base[0]) + } + + // make #4 last finalized block + finality_proofs.tree.import(hash4, 4, (), &is_descendent_of).unwrap(); + finality_proofs.tree.finalize_root(&hash4); + + // schedule request for #6 + finality_proofs.schedule((hash6, 6), is_descendent_of); + + // receive finality proof for #5 + finality_proofs.importing_requests.insert((hash6, 6)); + finality_proofs.on_block_finalized(&hash5, 5, is_descendent_of).unwrap(); + finality_proofs.try_finalize_root::<()>((hash6, 6), Ok((hash5, 5)), true); + + // ensure that request for #6 is still pending + assert_eq!(finality_proofs.pending_requests.iter().collect::>(), vec![&(hash6, 6)]); + + // receive finality proof for #7 + finality_proofs.importing_requests.insert((hash6, 6)); + finality_proofs.on_block_finalized(&hash6, 6, is_descendent_of).unwrap(); + finality_proofs.on_block_finalized(&hash7, 7, is_descendent_of).unwrap(); + finality_proofs.try_finalize_root::<()>((hash6, 6), Ok((hash7, 7)), true); + + // ensure that there's no request for #6 + assert_eq!(finality_proofs.pending_requests.iter().collect::>(), Vec::<&(Hash, u64)>::new()); + } + + // Some Arbitrary instances to allow easy construction of random peer sets: + + #[derive(Debug, Clone)] + struct ArbitraryPeerSyncState(PeerSyncState); + + impl Arbitrary for ArbitraryPeerSyncState { + fn arbitrary(g: &mut G) -> Self { + let s = match g.gen::() % 5 { + 0 => PeerSyncState::Available, + // TODO: 1 => PeerSyncState::AncestorSearch(g.gen(), AncestorSearchState), + 1 => PeerSyncState::DownloadingNew(g.gen::()), + 2 => PeerSyncState::DownloadingStale(Hash::random()), + 3 => PeerSyncState::DownloadingJustification(Hash::random()), + _ => PeerSyncState::DownloadingFinalityProof(Hash::random()) + }; + ArbitraryPeerSyncState(s) + } + } + + #[derive(Debug, Clone)] + struct ArbitraryPeerSync(PeerSync); + + impl Arbitrary for ArbitraryPeerSync { + fn arbitrary(g: &mut G) -> Self { + let ps = PeerSync { + common_number: g.gen(), + best_hash: Hash::random(), + best_number: g.gen(), + state: ArbitraryPeerSyncState::arbitrary(g).0, + recently_announced: Default::default() + }; + ArbitraryPeerSync(ps) + } + } + + #[derive(Debug, Clone)] + struct ArbitraryPeers(HashMap>); + + impl Arbitrary for ArbitraryPeers { + fn arbitrary(g: &mut G) -> Self { + let mut peers = HashMap::with_capacity(g.size()); + for _ in 0 .. g.size() { + peers.insert(PeerId::random(), ArbitraryPeerSync::arbitrary(g).0); + } + ArbitraryPeers(peers) + } + } + +} diff --git a/core/network/src/util.rs b/core/network/src/protocol/util.rs similarity index 100% rename from core/network/src/util.rs rename to core/network/src/protocol/util.rs diff --git a/core/network/src/protocol_behaviour.rs b/core/network/src/protocol_behaviour.rs new file mode 100644 index 0000000000000000000000000000000000000000..81c0502f602b8313fa49f35deb8c34bb017c10df --- /dev/null +++ b/core/network/src/protocol_behaviour.rs @@ -0,0 +1,463 @@ +// Copyright 2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +//! Implementation of libp2p's `NetworkBehaviour` trait that handles everything Substrate-specific. + +use crate::{ExHashT, DiscoveryNetBehaviour, ProtocolId}; +use crate::custom_proto::{CustomProto, CustomProtoOut}; +use crate::chain::{Client, FinalityProofProvider}; +use crate::protocol::{self, CustomMessageOutcome, Protocol, ProtocolConfig, sync::SyncState}; +use crate::protocol::{PeerInfo, NetworkOut, message::Message, on_demand::RequestData}; +use crate::protocol::consensus_gossip::MessageRecipient as GossipMessageRecipient; +use crate::protocol::specialization::NetworkSpecialization; +use crate::service::TransactionPool; + +use client::light::fetcher::FetchChecker; +use futures::prelude::*; +use consensus::import_queue::SharedFinalityProofRequestBuilder; +use log::debug; +use libp2p::{PeerId, Multiaddr}; +use libp2p::core::swarm::{ConnectedPoint, NetworkBehaviour, NetworkBehaviourAction, PollParameters}; +use libp2p::core::{nodes::Substream, muxing::StreamMuxerBox}; +use libp2p::core::protocols_handler::{ProtocolsHandler, IntoProtocolsHandler}; +use runtime_primitives::{traits::{Block as BlockT, NumberFor}, ConsensusEngineId}; +use std::sync::Arc; + +/// Implementation of `NetworkBehaviour` that handles everything related to Substrate and Polkadot. +pub struct ProtocolBehaviour, H: ExHashT> { + /// Handles opening the unique substream and sending and receiving raw messages. + behaviour: CustomProto, Substream>, + /// Handles the logic behind the raw messages that we receive. + protocol: Protocol, + /// Used to report reputation changes. + peerset_handle: peerset::PeersetHandle, + transaction_pool: Arc>, + /// When asked for a proof of finality, we use this struct to build one. + finality_proof_provider: Option>>, +} + +impl, H: ExHashT> ProtocolBehaviour { + /// Builds a new `ProtocolBehaviour`. + pub fn new( + config: ProtocolConfig, + chain: Arc>, + checker: Arc>, + specialization: S, + transaction_pool: Arc>, + finality_proof_provider: Option>>, + protocol_id: ProtocolId, + versions: &[u8], + peerset: peerset::Peerset, + peerset_handle: peerset::PeersetHandle, + ) -> crate::error::Result { + let protocol = Protocol::new(config, chain, checker, specialization)?; + let behaviour = CustomProto::new(protocol_id, versions, peerset); + + Ok(ProtocolBehaviour { + protocol, + behaviour, + peerset_handle, + transaction_pool, + finality_proof_provider, + }) + } + + /// Returns the list of all the peers we have an open channel to. + pub fn open_peers(&self) -> impl Iterator { + self.behaviour.open_peers() + } + + /// Returns true if we have a channel open with this node. + pub fn is_open(&self, peer_id: &PeerId) -> bool { + self.behaviour.is_open(peer_id) + } + + /// Disconnects the given peer if we are connected to it. + pub fn disconnect_peer(&mut self, peer_id: &PeerId) { + self.behaviour.disconnect_peer(peer_id) + } + + /// Adjusts the reputation of a node. + pub fn report_peer(&mut self, who: PeerId, reputation: i32) { + self.peerset_handle.report_peer(who, reputation) + } + + /// Returns true if we try to open protocols with the given peer. + pub fn is_enabled(&self, peer_id: &PeerId) -> bool { + self.behaviour.is_enabled(peer_id) + } + + /// Sends a message to a peer. + /// + /// Has no effect if the custom protocol is not open with the given peer. + /// + /// Also note that even we have a valid open substream, it may in fact be already closed + /// without us knowing, in which case the packet will not be received. + pub fn send_packet(&mut self, target: &PeerId, message: Message) { + self.behaviour.send_packet(target, message) + } + + /// Returns the state of the peerset manager, for debugging purposes. + pub fn peerset_debug_info(&mut self) -> serde_json::Value { + self.behaviour.peerset_debug_info() + } + + /// Returns the number of peers we're connected to. + pub fn num_connected_peers(&self) -> usize { + self.protocol.num_connected_peers() + } + + /// Returns the number of peers we're connected to and that are being queried. + pub fn num_active_peers(&self) -> usize { + self.protocol.num_active_peers() + } + + /// Current global sync state. + pub fn sync_state(&self) -> SyncState { + self.protocol.sync_state() + } + + /// Target sync block number. + pub fn best_seen_block(&self) -> Option> { + self.protocol.best_seen_block() + } + + /// Number of peers participating in syncing. + pub fn num_sync_peers(&self) -> u32 { + self.protocol.num_sync_peers() + } + + /// Starts a new data demand request. + /// + /// The parameter contains a `Sender` where the result, once received, must be sent. + pub(crate) fn add_on_demand_request(&mut self, rq: RequestData) { + self.protocol.add_on_demand_request( + &mut LocalNetworkOut { inner: &mut self.behaviour, peerset_handle: &self.peerset_handle }, + rq + ); + } + + /// Returns information about all the peers we are connected to after the handshake message. + pub fn peers_info(&self) -> impl Iterator)> { + self.protocol.peers_info() + } + + /// Locks `self` and gives access to the protocol and a context that can be used in order to + /// use `consensus_gossip_lock` or `specialization_lock`. + /// + /// **Important**: ONLY USE THIS FUNCTION TO CALL `consensus_gossip_lock` or `specialization_lock`. + /// This function is a very bad API. + pub fn protocol_context_lock<'a>( + &'a mut self, + ) -> (&'a mut Protocol, LocalNetworkOut<'a, B>) { + let net_out = LocalNetworkOut { inner: &mut self.behaviour, peerset_handle: &self.peerset_handle }; + (&mut self.protocol, net_out) + } + + /// Gossip a consensus message to the network. + pub fn gossip_consensus_message( + &mut self, + topic: B::Hash, + engine_id: ConsensusEngineId, + message: Vec, + recipient: GossipMessageRecipient, + ) { + self.protocol.gossip_consensus_message( + &mut LocalNetworkOut { inner: &mut self.behaviour, peerset_handle: &self.peerset_handle }, + topic, + engine_id, + message, + recipient + ); + } + + /// Call when we must propagate ready extrinsics to peers. + pub fn propagate_extrinsics(&mut self) { + self.protocol.propagate_extrinsics( + &mut LocalNetworkOut { inner: &mut self.behaviour, peerset_handle: &self.peerset_handle }, + &*self.transaction_pool + ) + } + + /// Make sure an important block is propagated to peers. + /// + /// In chain-based consensus, we often need to make sure non-best forks are + /// at least temporarily synced. + pub fn announce_block(&mut self, hash: B::Hash) { + self.protocol.announce_block( + &mut LocalNetworkOut { inner: &mut self.behaviour, peerset_handle: &self.peerset_handle }, + hash + ) + } + + /// Call this when a block has been imported in the import queue and we should announce it on + /// the network. + pub fn on_block_imported(&mut self, hash: B::Hash, header: &B::Header) { + self.protocol.on_block_imported( + &mut LocalNetworkOut { inner: &mut self.behaviour, peerset_handle: &self.peerset_handle }, + hash, + header + ) + } + + /// Call this when a block has been finalized. The sync layer may have some additional + /// requesting to perform. + pub fn on_block_finalized(&mut self, hash: B::Hash, header: &B::Header) { + self.protocol.on_block_finalized( + &mut LocalNetworkOut { inner: &mut self.behaviour, peerset_handle: &self.peerset_handle }, + hash, + header + ) + } + + /// Request a justification for the given block. + /// + /// Uses `protocol` to queue a new justification request and tries to dispatch all pending + /// requests. + pub fn request_justification(&mut self, hash: &B::Hash, number: NumberFor) { + self.protocol.request_justification( + &mut LocalNetworkOut { inner: &mut self.behaviour, peerset_handle: &self.peerset_handle }, + hash, + number + ) + } + + /// Clears all pending justification requests. + pub fn clear_justification_requests(&mut self) { + self.protocol.clear_justification_requests() + } + + /// A batch of blocks have been processed, with or without errors. + /// Call this when a batch of blocks have been processed by the import queue, with or without + /// errors. + pub fn blocks_processed( + &mut self, + processed_blocks: Vec, + has_error: bool, + ) { + self.protocol.blocks_processed( + &mut LocalNetworkOut { inner: &mut self.behaviour, peerset_handle: &self.peerset_handle }, + processed_blocks, + has_error, + ) + } + + /// Restart the sync process. + pub fn restart(&mut self) { + let mut net_out = LocalNetworkOut { inner: &mut self.behaviour, peerset_handle: &self.peerset_handle }; + self.protocol.restart(&mut net_out); + } + + /// Notify about successful import of the given block. + pub fn block_imported(&mut self, hash: &B::Hash, number: NumberFor) { + self.protocol.block_imported(hash, number) + } + + pub fn set_finality_proof_request_builder(&mut self, request_builder: SharedFinalityProofRequestBuilder) { + self.protocol.set_finality_proof_request_builder(request_builder) + } + + /// Call this when a justification has been processed by the import queue, with or without + /// errors. + pub fn justification_import_result(&mut self, hash: B::Hash, number: NumberFor, success: bool) { + self.protocol.justification_import_result(hash, number, success) + } + + /// Request a finality proof for the given block. + /// + /// Queues a new finality proof request and tries to dispatch all pending requests. + pub fn request_finality_proof( + &mut self, + hash: &B::Hash, + number: NumberFor, + ) { + self.protocol.request_finality_proof( + &mut LocalNetworkOut { inner: &mut self.behaviour, peerset_handle: &self.peerset_handle }, + &hash, + number, + ); + } + + pub fn finality_proof_import_result( + &mut self, + request_block: (B::Hash, NumberFor), + finalization_result: Result<(B::Hash, NumberFor), ()>, + ) { + self.protocol.finality_proof_import_result(request_block, finalization_result) + } + + pub fn tick(&mut self) { + self.protocol.tick(&mut LocalNetworkOut { inner: &mut self.behaviour, peerset_handle: &self.peerset_handle }); + } +} + +impl, H: ExHashT> NetworkBehaviour for +ProtocolBehaviour { + type ProtocolsHandler = , Substream> as NetworkBehaviour>::ProtocolsHandler; + type OutEvent = CustomMessageOutcome; + + fn new_handler(&mut self) -> Self::ProtocolsHandler { + self.behaviour.new_handler() + } + + fn addresses_of_peer(&mut self, peer_id: &PeerId) -> Vec { + self.behaviour.addresses_of_peer(peer_id) + } + + fn inject_connected(&mut self, peer_id: PeerId, endpoint: ConnectedPoint) { + self.behaviour.inject_connected(peer_id, endpoint) + } + + fn inject_disconnected(&mut self, peer_id: &PeerId, endpoint: ConnectedPoint) { + self.behaviour.inject_disconnected(peer_id, endpoint) + } + + fn inject_node_event( + &mut self, + peer_id: PeerId, + event: <::Handler as ProtocolsHandler>::OutEvent, + ) { + self.behaviour.inject_node_event(peer_id, event) + } + + fn poll( + &mut self, + params: &mut PollParameters, + ) -> Async< + NetworkBehaviourAction< + <::Handler as ProtocolsHandler>::InEvent, + Self::OutEvent + > + > { + let mut net_out = LocalNetworkOut { inner: &mut self.behaviour, peerset_handle: &self.peerset_handle }; + match self.protocol.poll(&mut net_out, &*self.transaction_pool) { + Ok(Async::Ready(v)) => void::unreachable(v), + Ok(Async::NotReady) => {} + Err(err) => void::unreachable(err), + } + + let event = match self.behaviour.poll(params) { + Async::NotReady => return Async::NotReady, + Async::Ready(NetworkBehaviourAction::GenerateEvent(ev)) => ev, + Async::Ready(NetworkBehaviourAction::DialAddress { address }) => + return Async::Ready(NetworkBehaviourAction::DialAddress { address }), + Async::Ready(NetworkBehaviourAction::DialPeer { peer_id }) => + return Async::Ready(NetworkBehaviourAction::DialPeer { peer_id }), + Async::Ready(NetworkBehaviourAction::SendEvent { peer_id, event }) => + return Async::Ready(NetworkBehaviourAction::SendEvent { peer_id, event }), + Async::Ready(NetworkBehaviourAction::ReportObservedAddr { address }) => + return Async::Ready(NetworkBehaviourAction::ReportObservedAddr { address }), + }; + + let mut network_out = LocalNetworkOut { + inner: &mut self.behaviour, + peerset_handle: &self.peerset_handle, + }; + + let outcome = match event { + CustomProtoOut::CustomProtocolOpen { peer_id, version, .. } => { + debug_assert!( + version <= protocol::CURRENT_VERSION as u8 + && version >= protocol::MIN_VERSION as u8 + ); + self.protocol.on_peer_connected(&mut network_out, peer_id); + CustomMessageOutcome::None + } + CustomProtoOut::CustomProtocolClosed { peer_id, .. } => { + self.protocol.on_peer_disconnected(&mut network_out, peer_id); + CustomMessageOutcome::None + }, + CustomProtoOut::CustomMessage { peer_id, message } => + self.protocol.on_custom_message( + &mut network_out, + &*self.transaction_pool, + peer_id, + message, + self.finality_proof_provider.as_ref().map(|p| &**p) + ), + CustomProtoOut::Clogged { peer_id, messages } => { + debug!(target: "sync", "{} clogging messages:", messages.len()); + for msg in messages.into_iter().take(5) { + debug!(target: "sync", "{:?}", msg); + self.protocol.on_clogged_peer(&mut network_out, peer_id.clone(), Some(msg)); + } + CustomMessageOutcome::None + } + }; + + if let CustomMessageOutcome::None = outcome { + Async::NotReady + } else { + Async::Ready(NetworkBehaviourAction::GenerateEvent(outcome)) + } + } + + fn inject_replaced(&mut self, peer_id: PeerId, closed_endpoint: ConnectedPoint, new_endpoint: ConnectedPoint) { + self.behaviour.inject_replaced(peer_id, closed_endpoint, new_endpoint) + } + + fn inject_addr_reach_failure( + &mut self, + peer_id: Option<&PeerId>, + addr: &Multiaddr, + error: &dyn std::error::Error + ) { + self.behaviour.inject_addr_reach_failure(peer_id, addr, error) + } + + fn inject_dial_failure(&mut self, peer_id: &PeerId) { + self.behaviour.inject_dial_failure(peer_id) + } + + fn inject_new_listen_addr(&mut self, addr: &Multiaddr) { + self.behaviour.inject_new_listen_addr(addr) + } + + fn inject_expired_listen_addr(&mut self, addr: &Multiaddr) { + self.behaviour.inject_expired_listen_addr(addr) + } + + fn inject_new_external_addr(&mut self, addr: &Multiaddr) { + self.behaviour.inject_new_external_addr(addr) + } +} + +impl, H: ExHashT> DiscoveryNetBehaviour + for ProtocolBehaviour { + fn add_discovered_nodes(&mut self, peer_ids: impl Iterator) { + self.behaviour.add_discovered_nodes(peer_ids) + } +} + +/// Has to be public for stupid API reasons. This should be made private again ASAP. +pub struct LocalNetworkOut<'a, B: BlockT> { + inner: &'a mut CustomProto, Substream>, + peerset_handle: &'a peerset::PeersetHandle, +} + +impl<'a, B: BlockT> NetworkOut for LocalNetworkOut<'a, B> { + fn report_peer(&mut self, who: PeerId, reputation: i32) { + self.peerset_handle.report_peer(who, reputation) + } + + fn disconnect_peer(&mut self, who: PeerId) { + self.inner.disconnect_peer(&who) + } + + fn send_message(&mut self, who: PeerId, message: Message) { + self.inner.send_packet(&who, message) + } +} diff --git a/core/network/src/service.rs b/core/network/src/service.rs index f681cc8fe9ec1347d93db5e53e0664eb72532227..eb28573d95d3bf3635666dee1b64ae1a8b6978f5 100644 --- a/core/network/src/service.rs +++ b/core/network/src/service.rs @@ -15,51 +15,42 @@ // along with Substrate. If not, see . use std::collections::HashMap; +use std::{fs, io, path::Path}; use std::sync::Arc; use std::sync::atomic::{AtomicBool, Ordering}; -use std::{io, thread, time::Duration}; +use std::time::Duration; -use log::{warn, debug, error, info}; -use futures::{Async, Future, Stream, sync::oneshot, sync::mpsc}; +use log::{warn, error, info}; +use libp2p::core::swarm::NetworkBehaviour; +use libp2p::core::{nodes::Substream, transport::boxed::Boxed, muxing::StreamMuxerBox}; +use futures::{prelude::*, sync::oneshot, sync::mpsc}; use parking_lot::{Mutex, RwLock}; -use network_libp2p::{ProtocolId, NetworkConfiguration}; -use network_libp2p::{start_service, parse_str_addr, Service as NetworkService, ServiceEvent as NetworkServiceEvent}; -use network_libp2p::{RegisteredProtocol, NetworkState}; +use crate::protocol_behaviour::ProtocolBehaviour; +use crate::{behaviour::Behaviour, parse_str_addr}; +use crate::{NetworkState, NetworkStateNotConnectedPeer, NetworkStatePeer}; +use crate::{transport, config::NodeKeyConfig, config::NonReservedPeerMode}; use peerset::PeersetHandle; -use consensus::import_queue::{ImportQueue, Link}; +use consensus::import_queue::{ImportQueue, Link, SharedFinalityProofRequestBuilder}; use runtime_primitives::{traits::{Block as BlockT, NumberFor}, ConsensusEngineId}; -use crate::consensus_gossip::{ConsensusGossip, MessageRecipient as GossipMessageRecipient}; -use crate::message::Message; -use crate::protocol::{self, Context, CustomMessageOutcome, Protocol, ConnectedPeer, ProtocolMsg, ProtocolStatus, PeerInfo}; +use crate::AlwaysBadChecker; +use crate::protocol::consensus_gossip::{ConsensusGossip, MessageRecipient as GossipMessageRecipient}; +use crate::protocol::message::Message; +use crate::protocol::on_demand::RequestData; +use crate::protocol::{self, Context, CustomMessageOutcome, ConnectedPeer, PeerInfo}; +use crate::protocol::sync::SyncState; use crate::config::Params; use crate::error::Error; -use crate::specialization::NetworkSpecialization; +use crate::protocol::specialization::NetworkSpecialization; -use crossbeam_channel::{self as channel, Receiver, Sender, TryRecvError}; -use tokio::prelude::task::AtomicTask; -use tokio::runtime::Builder as RuntimeBuilder; +/// Interval at which we update the `peers` field on the main thread. +const CONNECTED_PEERS_INTERVAL: Duration = Duration::from_millis(500); -/// Interval at which we send status updates on the SyncProvider status stream. -const STATUS_INTERVAL: Duration = Duration::from_millis(5000); - -pub use network_libp2p::PeerId; +pub use libp2p::PeerId; /// Type that represents fetch completion future. pub type FetchFuture = oneshot::Receiver>; -/// Sync status -pub trait SyncProvider: Send + Sync { - /// Get a stream of sync statuses. - fn status(&self) -> mpsc::UnboundedReceiver>; - /// Get network state. - fn network_state(&self) -> NetworkState; - /// Get currently connected peers - fn peers(&self) -> Vec<(PeerId, PeerInfo)>; - /// Are we in the process of downloading the chain? - fn is_major_syncing(&self) -> bool; -} - /// Minimum Requirements for a Hash within Networking pub trait ExHashT: ::std::hash::Hash + Eq + ::std::fmt::Debug + Clone + Send + Sync + 'static @@ -80,50 +71,6 @@ pub trait TransactionPool: Send + Sync { fn on_broadcasted(&self, propagations: HashMap>); } -/// A link implementation that connects to the network. -#[derive(Clone)] -pub struct NetworkLink> { - /// The protocol sender - pub(crate) protocol_sender: mpsc::UnboundedSender>, - /// The network sender - pub(crate) network_sender: NetworkChan, -} - -impl> Link for NetworkLink { - fn block_imported(&self, hash: &B::Hash, number: NumberFor) { - let _ = self.protocol_sender.unbounded_send(ProtocolMsg::BlockImportedSync(hash.clone(), number)); - } - - fn blocks_processed(&self, processed_blocks: Vec, has_error: bool) { - let _ = self.protocol_sender.unbounded_send(ProtocolMsg::BlocksProcessed(processed_blocks, has_error)); - } - - fn justification_imported(&self, who: PeerId, hash: &B::Hash, number: NumberFor, success: bool) { - let _ = self.protocol_sender.unbounded_send(ProtocolMsg::JustificationImportResult(hash.clone(), number, success)); - if !success { - info!("Invalid justification provided by {} for #{}", who, hash); - let _ = self.network_sender.send(NetworkMsg::ReportPeer(who.clone(), i32::min_value())); - let _ = self.network_sender.send(NetworkMsg::DisconnectPeer(who.clone())); - } - } - - fn clear_justification_requests(&self) { - let _ = self.protocol_sender.unbounded_send(ProtocolMsg::ClearJustificationRequests); - } - - fn request_justification(&self, hash: &B::Hash, number: NumberFor) { - let _ = self.protocol_sender.unbounded_send(ProtocolMsg::RequestJustification(hash.clone(), number)); - } - - fn report_peer(&self, who: PeerId, reputation_change: i32) { - self.network_sender.send(NetworkMsg::ReportPeer(who, reputation_change)); - } - - fn restart(&self) { - let _ = self.protocol_sender.unbounded_send(ProtocolMsg::RestartSync); - } -} - /// A cloneable handle for reporting cost/benefits of peers. #[derive(Clone)] pub struct ReportHandle { @@ -139,100 +86,211 @@ impl ReportHandle { } /// Substrate network service. Handles network IO and manages connectivity. -pub struct Service> { - /// Sinks to propagate status updates. - status_sinks: Arc>>>>, +pub struct NetworkService, H: ExHashT> { /// Are we connected to any peer? is_offline: Arc, /// Are we actively catching up with the chain? is_major_syncing: Arc, /// Peers whom we are connected with. peers: Arc>>>, + /// Channel for networking messages processed by the background thread. + network_chan: mpsc::UnboundedSender>, /// Network service - network: Arc>>>, + network: Arc>>, + /// Bandwidth logging system. Can be queried to know the average bandwidth consumed. + bandwidth: Arc, /// Peerset manager (PSM); manages the reputation of nodes and indicates the network which /// nodes it should be connected to or not. peerset: PeersetHandle, /// Protocol sender protocol_sender: mpsc::UnboundedSender>, - /// Sender for messages to the background service task, and handle for the background thread. - /// Dropping the sender should close the task and the thread. - /// This is an `Option` because we need to extract it in the destructor. - bg_thread: Option<(oneshot::Sender<()>, thread::JoinHandle<()>)>, } -impl> Service { - /// Creates and register protocol with the network service - pub fn new( +impl, H: ExHashT> NetworkWorker { + /// Creates the network service. + /// + /// Returns a `NetworkWorker` that implements `Future` and must be regularly polled in order + /// for the network processing to advance. From it, you can extract a `NetworkService` using + /// `worker.service()`. The `NetworkService` can be shared through the codebase. + pub fn new( params: Params, - protocol_id: ProtocolId, - import_queue: Box>, - ) -> Result<(Arc>, NetworkChan), Error> { - let (network_chan, network_port) = network_channel(); - let status_sinks = Arc::new(Mutex::new(Vec::new())); + ) -> Result, Error> { + let (network_chan, network_port) = mpsc::unbounded(); + let (protocol_sender, protocol_rx) = mpsc::unbounded(); + + if let Some(ref path) = params.network_config.net_config_path { + fs::create_dir_all(Path::new(path))?; + } + + // List of multiaddresses that we know in the network. + let mut known_addresses = Vec::new(); + let mut bootnodes = Vec::new(); + let mut reserved_nodes = Vec::new(); + + // Process the bootnodes. + for bootnode in params.network_config.boot_nodes.iter() { + match parse_str_addr(bootnode) { + Ok((peer_id, addr)) => { + bootnodes.push(peer_id.clone()); + known_addresses.push((peer_id, addr)); + }, + Err(_) => warn!(target: "sub-libp2p", "Not a valid bootnode address: {}", bootnode), + } + } + + // Initialize the reserved peers. + for reserved in params.network_config.reserved_nodes.iter() { + if let Ok((peer_id, addr)) = parse_str_addr(reserved) { + reserved_nodes.push(peer_id.clone()); + known_addresses.push((peer_id, addr)); + } else { + warn!(target: "sub-libp2p", "Not a valid reserved node address: {}", reserved); + } + } + + // Build the peerset. + let (peerset, peerset_handle) = peerset::Peerset::from_config(peerset::PeersetConfig { + in_peers: params.network_config.in_peers, + out_peers: params.network_config.out_peers, + bootnodes, + reserved_only: params.network_config.non_reserved_mode == NonReservedPeerMode::Deny, + reserved_nodes, + }); + + // Private and public keys configuration. + if let NodeKeyConfig::Secp256k1(_) = params.network_config.node_key { + warn!(target: "sub-libp2p", "Secp256k1 keys are deprecated in favour of ed25519"); + } + let local_identity = params.network_config.node_key.clone().into_keypair()?; + let local_public = local_identity.public(); + let local_peer_id = local_public.clone().into_peer_id(); + info!(target: "sub-libp2p", "Local node identity is: {}", local_peer_id.to_base58()); + // Start in off-line mode, since we're not connected to any nodes yet. let is_offline = Arc::new(AtomicBool::new(true)); let is_major_syncing = Arc::new(AtomicBool::new(false)); let peers: Arc>>> = Arc::new(Default::default()); - let (protocol, protocol_sender) = Protocol::new( - peers.clone(), - network_chan.clone(), - params.config, + let protocol = ProtocolBehaviour::new( + protocol::ProtocolConfig { roles: params.roles }, params.chain, - params.on_demand, - params.transaction_pool, + params.on_demand.as_ref().map(|od| od.checker().clone()) + .unwrap_or(Arc::new(AlwaysBadChecker)), params.specialization, - )?; - let versions: Vec<_> = ((protocol::MIN_VERSION as u8)..=(protocol::CURRENT_VERSION as u8)).collect(); - let registered = RegisteredProtocol::new(protocol_id, &versions); - let (thread, network, peerset) = start_thread( - is_offline.clone(), - is_major_syncing.clone(), - protocol, - import_queue.clone(), - network_port, - status_sinks.clone(), - params.network_config, - registered, - )?; - - let service = Arc::new(Service { - status_sinks, - is_offline, - is_major_syncing, - peers, + params.transaction_pool, + params.finality_proof_provider, + params.protocol_id, + &((protocol::MIN_VERSION as u8)..=(protocol::CURRENT_VERSION as u8)).collect::>(), peerset, - network, - protocol_sender: protocol_sender.clone(), - bg_thread: Some(thread), - }); + peerset_handle.clone(), + )?; - // connect the import-queue to the network service. - let link = NetworkLink { - protocol_sender, - network_sender: network_chan.clone(), + // Build the swarm. + let (mut swarm, bandwidth) = { + let user_agent = format!( + "{} ({})", + params.network_config.client_version, + params.network_config.node_name + ); + let behaviour = Behaviour::new( + protocol, + user_agent, + local_public, + known_addresses, + params.network_config.enable_mdns + ); + let (transport, bandwidth) = transport::build_transport( + local_identity, + params.network_config.wasm_external_transport + ); + (Swarm::::new(transport, behaviour, local_peer_id.clone()), bandwidth) }; - import_queue.start(Box::new(link))?; + // Listen on multiaddresses. + for addr in ¶ms.network_config.listen_addresses { + if let Err(err) = Swarm::::listen_on(&mut swarm, addr.clone()) { + warn!(target: "sub-libp2p", "Can't listen on {} because: {:?}", addr, err) + } + } + + // Add external addresses. + for addr in ¶ms.network_config.public_addresses { + Swarm::::add_external_address(&mut swarm, addr.clone()); + } + + let network = Arc::new(Mutex::new(swarm)); + + let service = Arc::new(NetworkService { + bandwidth, + is_offline: is_offline.clone(), + is_major_syncing: is_major_syncing.clone(), + network_chan, + peers: peers.clone(), + peerset: peerset_handle.clone(), + network: network.clone(), + protocol_sender: protocol_sender.clone(), + }); - Ok((service, network_chan)) + Ok(NetworkWorker { + is_offline, + is_major_syncing, + network_service: network, + peerset: peerset_handle, + service, + peers, + import_queue: params.import_queue, + network_port, + protocol_rx, + on_demand_in: params.on_demand.and_then(|od| od.extract_receiver()), + connected_peers_interval: tokio_timer::Interval::new_interval(CONNECTED_PEERS_INTERVAL), + }) } /// Returns the downloaded bytes per second averaged over the past few seconds. - #[inline] pub fn average_download_per_sec(&self) -> u64 { - self.network.lock().average_download_per_sec() + self.service.bandwidth.average_download_per_sec() } /// Returns the uploaded bytes per second averaged over the past few seconds. - #[inline] pub fn average_upload_per_sec(&self) -> u64 { - self.network.lock().average_upload_per_sec() + self.service.bandwidth.average_upload_per_sec() + } + + /// Returns the number of peers we're connected to. + pub fn num_connected_peers(&self) -> usize { + self.network_service.lock().user_protocol_mut().num_connected_peers() + } + + /// Returns the number of peers we're connected to and that are being queried. + pub fn num_active_peers(&self) -> usize { + self.network_service.lock().user_protocol_mut().num_active_peers() + } + + /// Current global sync state. + pub fn sync_state(&self) -> SyncState { + self.network_service.lock().user_protocol_mut().sync_state() + } + + /// Target sync block number. + pub fn best_seen_block(&self) -> Option> { + self.network_service.lock().user_protocol_mut().best_seen_block() } + /// Number of peers participating in syncing. + pub fn num_sync_peers(&self) -> u32 { + self.network_service.lock().user_protocol_mut().num_sync_peers() + } + + /// Return a `NetworkService` that can be shared through the code base and can be used to + /// manipulate the worker. + pub fn service(&self) -> &Arc> { + &self.service + } +} + +impl, H: ExHashT> NetworkService { /// Returns the network identity of the node. pub fn local_peer_id(&self) -> PeerId { - self.network.lock().peer_id().clone() + Swarm::::local_peer_id(&*self.network.lock()).clone() } /// Called when a new block is imported by the client. @@ -283,9 +341,16 @@ impl> Service { self.peerset.report_peer(who, cost_benefit); } + /// Send a message to the given peer. Has no effect if we're not connected to this peer. + /// + /// This method is extremely poor in terms of API and should be eventually removed. + pub fn disconnect_peer(&self, who: PeerId) { + let _ = self.network_chan.unbounded_send(NetworkMsg::DisconnectPeer(who)); + } + /// Execute a closure with the chain-specific network specialization. pub fn with_spec(&self, f: F) - where F: FnOnce(&mut S, &mut Context) + Send + 'static + where F: FnOnce(&mut S, &mut dyn Context) + Send + 'static { let _ = self .protocol_sender @@ -294,7 +359,7 @@ impl> Service { /// Execute a closure with the consensus gossip. pub fn with_gossip(&self, f: F) - where F: FnOnce(&mut ConsensusGossip, &mut Context) + Send + 'static + where F: FnOnce(&mut ConsensusGossip, &mut dyn Context) + Send + 'static { let _ = self .protocol_sender @@ -302,52 +367,88 @@ impl> Service { } /// Are we in the process of downloading the chain? - /// Used by both SyncProvider and SyncOracle. - fn is_major_syncing(&self) -> bool { + pub fn is_major_syncing(&self) -> bool { self.is_major_syncing.load(Ordering::Relaxed) } } -impl> ::consensus::SyncOracle for Service { - fn is_major_syncing(&self) -> bool { - self.is_major_syncing() - } +impl, H: ExHashT> NetworkService { + /// Get network state. + pub fn network_state(&self) -> NetworkState { + let mut swarm = self.network.lock(); + let open = swarm.user_protocol().open_peers().cloned().collect::>(); + + let connected_peers = { + let swarm = &mut *swarm; + open.iter().filter_map(move |peer_id| { + let known_addresses = NetworkBehaviour::addresses_of_peer(&mut **swarm, peer_id) + .into_iter().collect(); + + let endpoint = if let Some(e) = swarm.node(peer_id).map(|i| i.endpoint()) { + e.clone().into() + } else { + error!(target: "sub-libp2p", "Found state inconsistency between custom protocol \ + and debug information about {:?}", peer_id); + return None + }; + + Some((peer_id.to_base58(), NetworkStatePeer { + endpoint, + version_string: swarm.node(peer_id) + .and_then(|i| i.client_version().map(|s| s.to_owned())).clone(), + latest_ping_time: swarm.node(peer_id).and_then(|i| i.latest_ping()), + enabled: swarm.user_protocol().is_enabled(&peer_id), + open: swarm.user_protocol().is_open(&peer_id), + known_addresses, + })) + }).collect() + }; - fn is_offline(&self) -> bool { - self.is_offline.load(Ordering::Relaxed) - } -} + let not_connected_peers = { + let swarm = &mut *swarm; + let list = swarm.known_peers().filter(|p| open.iter().all(|n| n != *p)) + .cloned().collect::>(); + list.into_iter().map(move |peer_id| { + (peer_id.to_base58(), NetworkStateNotConnectedPeer { + version_string: swarm.node(&peer_id) + .and_then(|i| i.client_version().map(|s| s.to_owned())).clone(), + latest_ping_time: swarm.node(&peer_id).and_then(|i| i.latest_ping()), + known_addresses: NetworkBehaviour::addresses_of_peer(&mut **swarm, &peer_id) + .into_iter().collect(), + }) + }).collect() + }; -impl> Drop for Service { - fn drop(&mut self) { - if let Some((sender, join)) = self.bg_thread.take() { - let _ = sender.send(()); - if let Err(e) = join.join() { - error!("Error while waiting on background thread: {:?}", e); - } + NetworkState { + peer_id: Swarm::::local_peer_id(&swarm).to_base58(), + listened_addresses: Swarm::::listeners(&swarm).cloned().collect(), + external_addresses: Swarm::::external_addresses(&swarm).cloned().collect(), + average_download_per_sec: self.bandwidth.average_download_per_sec(), + average_upload_per_sec: self.bandwidth.average_upload_per_sec(), + connected_peers, + not_connected_peers, + peerset: swarm.user_protocol_mut().peerset_debug_info(), } } + + /// Get currently connected peers. + /// + /// > **Warning**: This method can return outdated information and should only ever be used + /// > when obtaining outdated information is acceptable. + pub fn peers_debug_info(&self) -> Vec<(PeerId, PeerInfo)> { + let peers = (*self.peers.read()).clone(); + peers.into_iter().map(|(idx, connected)| (idx, connected.peer_info)).collect() + } } -impl> SyncProvider for Service { +impl, H: ExHashT> + ::consensus::SyncOracle for NetworkService { fn is_major_syncing(&self) -> bool { self.is_major_syncing() } - /// Get sync status - fn status(&self) -> mpsc::UnboundedReceiver> { - let (sink, stream) = mpsc::unbounded(); - self.status_sinks.lock().push(sink); - stream - } - - fn network_state(&self) -> NetworkState { - self.network.lock().state() - } - - fn peers(&self) -> Vec<(PeerId, PeerInfo)> { - let peers = (*self.peers.read()).clone(); - peers.into_iter().map(|(idx, connected)| (idx, connected.peer_info)).collect() + fn is_offline(&self) -> bool { + self.is_offline.load(Ordering::Relaxed) } } @@ -363,7 +464,7 @@ pub trait ManageNetwork { fn add_reserved_peer(&self, peer: String) -> Result<(), String>; } -impl> ManageNetwork for Service { +impl, H: ExHashT> ManageNetwork for NetworkService { fn accept_unreserved_peers(&self) { self.peerset.set_reserved_only(false); } @@ -384,82 +485,7 @@ impl> ManageNetwork for Service } } - -/// Create a NetworkPort/Chan pair. -pub fn network_channel() -> (NetworkChan, NetworkPort) { - let (network_sender, network_receiver) = channel::unbounded(); - let task_notify = Arc::new(AtomicTask::new()); - let network_port = NetworkPort::new(network_receiver, task_notify.clone()); - let network_chan = NetworkChan::new(network_sender, task_notify); - (network_chan, network_port) -} - - -/// A sender of NetworkMsg that notifies a task when a message has been sent. -#[derive(Clone)] -pub struct NetworkChan { - sender: Sender>, - task_notify: Arc, -} - -impl NetworkChan { - /// Create a new network chan. - pub fn new(sender: Sender>, task_notify: Arc) -> Self { - NetworkChan { - sender, - task_notify, - } - } - - /// Send a messaging, to be handled on a stream. Notify the task handling the stream. - pub fn send(&self, msg: NetworkMsg) { - let _ = self.sender.send(msg); - self.task_notify.notify(); - } -} - -impl Drop for NetworkChan { - /// Notifying the task when a sender is dropped(when all are dropped, the stream is finished). - fn drop(&mut self) { - self.task_notify.notify(); - } -} - - -/// A receiver of NetworkMsg that makes the protocol-id available with each message. -pub struct NetworkPort { - receiver: Receiver>, - task_notify: Arc, -} - -impl NetworkPort { - /// Create a new network port for a given protocol-id. - pub fn new(receiver: Receiver>, task_notify: Arc) -> Self { - Self { - receiver, - task_notify, - } - } - - /// Receive a message, if any is currently-enqueued. - /// Register the current tokio task for notification when a new message is available. - pub fn take_one_message(&self) -> Result>, ()> { - self.task_notify.register(); - match self.receiver.try_recv() { - Ok(msg) => Ok(Some(msg)), - Err(TryRecvError::Empty) => Ok(None), - Err(TryRecvError::Disconnected) => Err(()), - } - } - - /// Get a reference to the underlying crossbeam receiver. - #[cfg(any(test, feature = "test-helpers"))] - pub fn receiver(&self) -> &Receiver> { - &self.receiver - } -} - -/// Messages to be handled by NetworkService. +/// Messages to be handled by Libp2pNetService. #[derive(Debug)] pub enum NetworkMsg { /// Send an outgoing custom message. @@ -473,115 +499,253 @@ pub enum NetworkMsg { Synchronized, } -/// Starts the background thread that handles the networking. -fn start_thread, H: ExHashT>( - is_offline: Arc, - is_major_syncing: Arc, - protocol: Protocol, - import_queue: Box>, - network_port: NetworkPort, - status_sinks: Arc>>>>, - config: NetworkConfiguration, - registered: RegisteredProtocol>, -) -> Result<((oneshot::Sender<()>, thread::JoinHandle<()>), Arc>>>, PeersetHandle), Error> { - // Start the main service. - let (service, peerset) = match start_service(config, registered) { - Ok((service, peerset)) => (Arc::new(Mutex::new(service)), peerset), - Err(err) => { - warn!("Error starting network: {}", err); - return Err(err.into()) - }, - }; - - let (close_tx, close_rx) = oneshot::channel(); - let service_clone = service.clone(); - let mut runtime = RuntimeBuilder::new().name_prefix("libp2p-").build()?; - let peerset_clone = peerset.clone(); - let thread = thread::Builder::new().name("network".to_string()).spawn(move || { - let fut = run_thread(is_offline, is_major_syncing, protocol, service_clone, import_queue, network_port, status_sinks, peerset_clone) - .select(close_rx.then(|_| Ok(()))) - .map(|(val, _)| val) - .map_err(|(err,_ )| err); - - // Note that we use `block_on` and not `block_on_all` because we want to kill the thread - // instantly if `close_rx` receives something. - match runtime.block_on(fut) { - Ok(()) => debug!(target: "sub-libp2p", "Networking thread finished"), - Err(err) => error!(target: "sub-libp2p", "Error while running libp2p: {:?}", err), - }; - })?; +/// Messages sent to Protocol from elsewhere inside the system. +pub enum ProtocolMsg> { + /// A batch of blocks has been processed, with or without errors. + BlocksProcessed(Vec, bool), + /// Tell protocol to restart sync. + RestartSync, + /// Tell protocol to propagate extrinsics. + PropagateExtrinsics, + /// Tell protocol that a block was imported (sent by the import-queue). + BlockImportedSync(B::Hash, NumberFor), + /// Tell protocol to clear all pending justification requests. + ClearJustificationRequests, + /// Tell protocol to request justification for a block. + RequestJustification(B::Hash, NumberFor), + /// Inform protocol whether a justification was successfully imported. + JustificationImportResult(B::Hash, NumberFor, bool), + /// Set finality proof request builder. + SetFinalityProofRequestBuilder(SharedFinalityProofRequestBuilder), + /// Tell protocol to request finality proof for a block. + RequestFinalityProof(B::Hash, NumberFor), + /// Inform protocol whether a finality proof was successfully imported. + FinalityProofImportResult((B::Hash, NumberFor), Result<(B::Hash, NumberFor), ()>), + /// Propagate a block to peers. + AnnounceBlock(B::Hash), + /// A block has been imported (sent by the client). + BlockImported(B::Hash, B::Header), + /// A block has been finalized (sent by the client). + BlockFinalized(B::Hash, B::Header), + /// Execute a closure with the chain-specific network specialization. + ExecuteWithSpec(Box + Send + 'static>), + /// Execute a closure with the consensus gossip. + ExecuteWithGossip(Box + Send + 'static>), + /// Incoming gossip consensus message. + GossipConsensusMessage(B::Hash, ConsensusEngineId, Vec, GossipMessageRecipient), + /// Tell protocol to perform regular maintenance. + #[cfg(any(test, feature = "test-helpers"))] + Tick, + /// Synchronization request. + #[cfg(any(test, feature = "test-helpers"))] + Synchronize, +} - Ok(((close_tx, thread), service, peerset)) +/// A task, consisting of a user-provided closure, to be executed on the Protocol thread. +pub trait SpecTask> { + fn call_box(self: Box, spec: &mut S, context: &mut dyn Context); } -/// Runs the background thread that handles the networking. -fn run_thread, H: ExHashT>( +impl, F: FnOnce(&mut S, &mut dyn Context)> SpecTask for F { + fn call_box(self: Box, spec: &mut S, context: &mut dyn Context) { + (*self)(spec, context) + } +} + +/// A task, consisting of a user-provided closure, to be executed on the Protocol thread. +pub trait GossipTask { + fn call_box(self: Box, gossip: &mut ConsensusGossip, context: &mut dyn Context); +} + +impl, &mut dyn Context)> GossipTask for F { + fn call_box(self: Box, gossip: &mut ConsensusGossip, context: &mut dyn Context) { + (*self)(gossip, context) + } +} + +/// Future tied to the `Network` service and that must be polled in order for the network to +/// advance. +#[must_use = "The NetworkWorker must be polled in order for the network to work"] +pub struct NetworkWorker, H: ExHashT> { is_offline: Arc, is_major_syncing: Arc, - mut protocol: Protocol, - network_service: Arc>>>, - import_queue: Box>, - network_port: NetworkPort, - status_sinks: Arc>>>>, + /// The network service that can be extracted and shared through the codebase. + service: Arc>, + network_service: Arc>>, + peers: Arc>>>, + import_queue: Box>, + network_port: mpsc::UnboundedReceiver>, + protocol_rx: mpsc::UnboundedReceiver>, peerset: PeersetHandle, -) -> impl Future { - // Interval at which we send status updates on the `status_sinks`. - let mut status_interval = tokio::timer::Interval::new_interval(STATUS_INTERVAL); - - futures::future::poll_fn(move || { - while let Ok(Async::Ready(_)) = status_interval.poll() { - let status = protocol.status(); - status_sinks.lock().retain(|sink| sink.unbounded_send(status.clone()).is_ok()); + on_demand_in: Option>>, + + /// Interval at which we update the `connected_peers` Arc. + connected_peers_interval: tokio_timer::Interval, +} + +impl, H: ExHashT> Future for NetworkWorker { + type Item = (); + type Error = io::Error; + + fn poll(&mut self) -> Poll { + // Implementation of `import_queue::Link` trait using the available local variables. + struct NetworkLink<'a, B: BlockT, S: NetworkSpecialization, H: ExHashT> { + protocol: &'a mut Swarm, + } + impl<'a, B: BlockT, S: NetworkSpecialization, H: ExHashT> Link for NetworkLink<'a, B, S, H> { + fn block_imported(&mut self, hash: &B::Hash, number: NumberFor) { + self.protocol.user_protocol_mut().block_imported(&hash, number) + } + fn blocks_processed(&mut self, hashes: Vec, has_error: bool) { + self.protocol.user_protocol_mut().blocks_processed(hashes, has_error) + } + fn justification_imported(&mut self, who: PeerId, hash: &B::Hash, number: NumberFor, success: bool) { + self.protocol.user_protocol_mut().justification_import_result(hash.clone(), number, success); + if !success { + info!("Invalid justification provided by {} for #{}", who, hash); + self.protocol.user_protocol_mut().disconnect_peer(&who); + self.protocol.user_protocol_mut().report_peer(who, i32::min_value()); + } + } + fn clear_justification_requests(&mut self) { + self.protocol.user_protocol_mut().clear_justification_requests() + } + fn request_justification(&mut self, hash: &B::Hash, number: NumberFor) { + self.protocol.user_protocol_mut().request_justification(hash, number) + } + fn request_finality_proof(&mut self, hash: &B::Hash, number: NumberFor) { + self.protocol.user_protocol_mut().request_finality_proof(hash, number) + } + fn finality_proof_imported( + &mut self, + who: PeerId, + request_block: (B::Hash, NumberFor), + finalization_result: Result<(B::Hash, NumberFor), ()>, + ) { + let success = finalization_result.is_ok(); + self.protocol.user_protocol_mut().finality_proof_import_result(request_block, finalization_result); + if !success { + info!("Invalid finality proof provided by {} for #{}", who, request_block.0); + self.protocol.user_protocol_mut().disconnect_peer(&who); + self.protocol.user_protocol_mut().report_peer(who, i32::min_value()); + } + } + fn report_peer(&mut self, who: PeerId, reputation_change: i32) { + self.protocol.user_protocol_mut().report_peer(who, reputation_change) + } + fn restart(&mut self) { + self.protocol.user_protocol_mut().restart() + } + fn set_finality_proof_request_builder(&mut self, builder: SharedFinalityProofRequestBuilder) { + self.protocol.user_protocol_mut().set_finality_proof_request_builder(builder) + } + } + + { + let mut network_service = self.network_service.lock(); + let mut link = NetworkLink { + protocol: &mut network_service, + }; + self.import_queue.poll_actions(&mut link); + } + + while let Ok(Async::Ready(_)) = self.connected_peers_interval.poll() { + let mut network_service = self.network_service.lock(); + let infos = network_service.user_protocol_mut().peers_info().map(|(id, info)| { + (id.clone(), ConnectedPeer { peer_info: info.clone() }) + }).collect(); + *self.peers.write() = infos; } - match protocol.poll() { - Ok(Async::Ready(())) => return Ok(Async::Ready(())), - Ok(Async::NotReady) => {} - Err(err) => void::unreachable(err), + // Check for new incoming on-demand requests. + if let Some(on_demand_in) = self.on_demand_in.as_mut() { + while let Ok(Async::Ready(Some(rq))) = on_demand_in.poll() { + let mut network_service = self.network_service.lock(); + network_service.user_protocol_mut().add_on_demand_request(rq); + } } loop { - match network_port.take_one_message() { - Ok(None) => break, - Ok(Some(NetworkMsg::Outgoing(who, outgoing_message))) => - network_service.lock().send_custom_message(&who, outgoing_message), - Ok(Some(NetworkMsg::ReportPeer(who, reputation))) => - peerset.report_peer(who, reputation), - Ok(Some(NetworkMsg::DisconnectPeer(who))) => - network_service.lock().drop_node(&who), + match self.network_port.poll() { + Ok(Async::NotReady) => break, + Ok(Async::Ready(Some(NetworkMsg::Outgoing(who, outgoing_message)))) => + self.network_service.lock().user_protocol_mut().send_packet(&who, outgoing_message), + Ok(Async::Ready(Some(NetworkMsg::ReportPeer(who, reputation)))) => + self.peerset.report_peer(who, reputation), + Ok(Async::Ready(Some(NetworkMsg::DisconnectPeer(who)))) => + self.network_service.lock().user_protocol_mut().disconnect_peer(&who), + #[cfg(any(test, feature = "test-helpers"))] - Ok(Some(NetworkMsg::Synchronized)) => {} + Ok(Async::Ready(Some(NetworkMsg::Synchronized))) => {} - Err(_) => return Ok(Async::Ready(())), + Ok(Async::Ready(None)) | Err(_) => return Ok(Async::Ready(())), } } loop { - let outcome = match network_service.lock().poll() { + let msg = match self.protocol_rx.poll() { + Ok(Async::Ready(Some(msg))) => msg, + Ok(Async::Ready(None)) | Err(_) => return Ok(Async::Ready(())), Ok(Async::NotReady) => break, - Ok(Async::Ready(Some(NetworkServiceEvent::OpenedCustomProtocol { peer_id, version, debug_info, .. }))) => { - debug_assert!( - version <= protocol::CURRENT_VERSION as u8 - && version >= protocol::MIN_VERSION as u8 - ); - protocol.on_peer_connected(peer_id, debug_info); - CustomMessageOutcome::None - } - Ok(Async::Ready(Some(NetworkServiceEvent::ClosedCustomProtocol { peer_id, debug_info, .. }))) => { - protocol.on_peer_disconnected(peer_id, debug_info); - CustomMessageOutcome::None + }; + + let mut network_service = self.network_service.lock(); + + match msg { + ProtocolMsg::BlockImported(hash, header) => + network_service.user_protocol_mut().on_block_imported(hash, &header), + ProtocolMsg::BlockFinalized(hash, header) => + network_service.user_protocol_mut().on_block_finalized(hash, &header), + ProtocolMsg::ExecuteWithSpec(task) => { + let (protocol, mut net_out) = network_service.user_protocol_mut().protocol_context_lock(); + let (mut context, spec) = protocol.specialization_lock(&mut net_out); + task.call_box(spec, &mut context); }, - Ok(Async::Ready(Some(NetworkServiceEvent::CustomMessage { peer_id, message, .. }))) => - protocol.on_custom_message(peer_id, message), - Ok(Async::Ready(Some(NetworkServiceEvent::Clogged { peer_id, messages, .. }))) => { - debug!(target: "sync", "{} clogging messages:", messages.len()); - for msg in messages.into_iter().take(5) { - debug!(target: "sync", "{:?}", msg); - protocol.on_clogged_peer(peer_id.clone(), Some(msg)); - } - CustomMessageOutcome::None + ProtocolMsg::ExecuteWithGossip(task) => { + let (protocol, mut net_out) = network_service.user_protocol_mut().protocol_context_lock(); + let (mut context, gossip) = protocol.consensus_gossip_lock(&mut net_out); + task.call_box(gossip, &mut context); } - Ok(Async::Ready(None)) => return Ok(Async::Ready(())), + ProtocolMsg::GossipConsensusMessage(topic, engine_id, message, recipient) => + network_service.user_protocol_mut().gossip_consensus_message(topic, engine_id, message, recipient), + ProtocolMsg::BlocksProcessed(hashes, has_error) => + network_service.user_protocol_mut().blocks_processed(hashes, has_error), + ProtocolMsg::RestartSync => + network_service.user_protocol_mut().restart(), + ProtocolMsg::AnnounceBlock(hash) => + network_service.user_protocol_mut().announce_block(hash), + ProtocolMsg::BlockImportedSync(hash, number) => + network_service.user_protocol_mut().block_imported(&hash, number), + ProtocolMsg::ClearJustificationRequests => + network_service.user_protocol_mut().clear_justification_requests(), + ProtocolMsg::RequestJustification(hash, number) => + network_service.user_protocol_mut().request_justification(&hash, number), + ProtocolMsg::JustificationImportResult(hash, number, success) => + network_service.user_protocol_mut().justification_import_result(hash, number, success), + ProtocolMsg::SetFinalityProofRequestBuilder(builder) => + network_service.user_protocol_mut().set_finality_proof_request_builder(builder), + ProtocolMsg::RequestFinalityProof(hash, number) => + network_service.user_protocol_mut().request_finality_proof(&hash, number), + ProtocolMsg::FinalityProofImportResult(requested_block, finalziation_result) => + network_service.user_protocol_mut() + .finality_proof_import_result(requested_block, finalziation_result), + ProtocolMsg::PropagateExtrinsics => + network_service.user_protocol_mut().propagate_extrinsics(), + #[cfg(any(test, feature = "test-helpers"))] + ProtocolMsg::Tick => network_service.user_protocol_mut().tick(), + #[cfg(any(test, feature = "test-helpers"))] + ProtocolMsg::Synchronize => {}, + } + } + + loop { + let mut network_service = self.network_service.lock(); + let poll_value = network_service.poll(); + + let outcome = match poll_value { + Ok(Async::NotReady) => break, + Ok(Async::Ready(Some(outcome))) => outcome, + Ok(Async::Ready(None)) => CustomMessageOutcome::None, Err(err) => { error!(target: "sync", "Error in the network: {:?}", err); return Err(err) @@ -590,16 +754,28 @@ fn run_thread, H: ExHashT>( match outcome { CustomMessageOutcome::BlockImport(origin, blocks) => - import_queue.import_blocks(origin, blocks), + self.import_queue.import_blocks(origin, blocks), CustomMessageOutcome::JustificationImport(origin, hash, nb, justification) => - import_queue.import_justification(origin, hash, nb, justification), + self.import_queue.import_justification(origin, hash, nb, justification), + CustomMessageOutcome::FinalityProofImport(origin, hash, nb, proof) => + self.import_queue.import_finality_proof(origin, hash, nb, proof), CustomMessageOutcome::None => {} } } - is_offline.store(protocol.is_offline(), Ordering::Relaxed); - is_major_syncing.store(protocol.is_major_syncing(), Ordering::Relaxed); + let mut network_service = self.network_service.lock(); + self.is_offline.store(network_service.user_protocol_mut().num_connected_peers() == 0, Ordering::Relaxed); + self.is_major_syncing.store(match network_service.user_protocol_mut().sync_state() { + SyncState::Idle => false, + SyncState::Downloading => true, + }, Ordering::Relaxed); Ok(Async::NotReady) - }) + } } + +/// The libp2p swarm, customized for our needs. +type Swarm = libp2p::core::Swarm< + Boxed<(PeerId, StreamMuxerBox), io::Error>, + Behaviour, CustomMessageOutcome, Substream> +>; diff --git a/core/network/src/sync.rs b/core/network/src/sync.rs deleted file mode 100644 index 151d13e829bb222c37e52f87ce2f28ab9618d501..0000000000000000000000000000000000000000 --- a/core/network/src/sync.rs +++ /dev/null @@ -1,1045 +0,0 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. -// This file is part of Substrate. - -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - -//! Contains the state of the chain synchronization process -//! -//! At any given point in time, a running node tries as much as possible to be at the head of the -//! chain. This module handles the logic of which blocks to request from remotes, and processing -//! responses. It yields blocks to check and potentially move to the database. -//! -//! # Usage -//! -//! The `ChainSync` struct maintains the state of the block requests. Whenever something happens on -//! the network, or whenever a block has been successfully verified, call the appropriate method in -//! order to update it. You must also regularly call `tick()`. -//! -//! To each of these methods, you must pass a `Context` object that the `ChainSync` will use to -//! send its new outgoing requests. -//! - -use std::cmp::max; -use std::collections::{HashMap, VecDeque}; -use std::time::{Duration, Instant}; -use log::{debug, trace, info, warn}; -use crate::protocol::Context; -use fork_tree::ForkTree; -use network_libp2p::PeerId; -use client::{BlockStatus, ClientInfo}; -use consensus::{BlockOrigin, import_queue::IncomingBlock}; -use client::error::Error as ClientError; -use crate::blocks::BlockCollection; -use runtime_primitives::Justification; -use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, As, NumberFor, Zero, CheckedSub}; -use runtime_primitives::generic::BlockId; -use crate::message; -use crate::config::Roles; -use std::collections::HashSet; - -// Maximum blocks to request in a single packet. -const MAX_BLOCKS_TO_REQUEST: usize = 128; -// Maximum blocks to store in the import queue. -const MAX_IMPORTING_BLOCKS: usize = 2048; -// Number of blocks in the queue that prevents ancestry search. -const MAJOR_SYNC_BLOCKS: usize = 5; -// Time to wait before trying to get a justification from the same peer. -const JUSTIFICATION_RETRY_WAIT: Duration = Duration::from_secs(10); -// Number of recently announced blocks to track for each peer. -const ANNOUNCE_HISTORY_SIZE: usize = 64; -// Max number of blocks to download for unknown forks. -const MAX_UNKNOWN_FORK_DOWNLOAD_LEN: u32 = 32; -/// Reputation change when a peer sent us a status message that led to a database read error. -const BLOCKCHAIN_STATUS_READ_ERROR_REPUTATION_CHANGE: i32 = -(1 << 16); -/// Reputation change when a peer failed to answer our legitimate ancestry block search. -const ANCESTRY_BLOCK_ERROR_REPUTATION_CHANGE: i32 = -(1 << 9); -/// Reputation change when a peer sent us a status message with a different genesis than us. -const GENESIS_MISMATCH_REPUTATION_CHANGE: i32 = i32::min_value() + 1; - -#[derive(Debug)] -struct PeerSync { - pub common_number: NumberFor, - pub best_hash: B::Hash, - pub best_number: NumberFor, - pub state: PeerSyncState, - pub recently_announced: VecDeque, -} - -#[derive(Debug)] -/// Peer sync status. -pub(crate) struct PeerInfo { - /// Their best block hash. - pub best_hash: B::Hash, - /// Their best block number. - pub best_number: NumberFor, -} - -#[derive(Copy, Clone, Eq, PartialEq, Debug)] -enum AncestorSearchState { - /// Use exponential backoff to find an ancestor, then switch to binary search. - /// We keep track of the exponent. - ExponentialBackoff(NumberFor), - /// Using binary search to find the best ancestor. - /// We keep track of left and right bounds. - BinarySearch(NumberFor, NumberFor), -} - -#[derive(Copy, Clone, Eq, PartialEq, Debug)] -enum PeerSyncState { - AncestorSearch(NumberFor, AncestorSearchState), - Available, - DownloadingNew(NumberFor), - DownloadingStale(B::Hash), - DownloadingJustification(B::Hash), -} - -/// Pending justification request for the given block (hash and number). -type PendingJustification = (::Hash, NumberFor); - -/// Manages pending block justification requests. Multiple justifications may be -/// requested for competing forks, or for the same branch at different -/// (increasing) heights. This structure will guarantee that justifications are -/// fetched in-order, and that obsolete changes are pruned (when finalizing a -/// competing fork). -struct PendingJustifications { - justifications: ForkTree, ()>, - pending_requests: VecDeque>, - peer_requests: HashMap>, - previous_requests: HashMap, Vec<(PeerId, Instant)>>, - importing_requests: HashSet>, -} - -impl PendingJustifications { - fn new() -> PendingJustifications { - PendingJustifications { - justifications: ForkTree::new(), - pending_requests: VecDeque::new(), - peer_requests: HashMap::new(), - previous_requests: HashMap::new(), - importing_requests: HashSet::new(), - } - } - - /// Dispatches all possible pending requests to the given peers. Peers are - /// filtered according to the current known best block (i.e. we won't send a - /// justification request for block #10 to a peer at block #2), and we also - /// throttle requests to the same peer if a previous justification request - /// yielded no results. - fn dispatch(&mut self, peers: &mut HashMap>, protocol: &mut Context) { - if self.pending_requests.is_empty() { - return; - } - - let initial_pending_requests = self.pending_requests.len(); - - // clean up previous failed requests so we can retry again - for (_, requests) in self.previous_requests.iter_mut() { - requests.retain(|(_, instant)| instant.elapsed() < JUSTIFICATION_RETRY_WAIT); - } - - let mut available_peers = peers.iter().filter_map(|(peer, sync)| { - // don't request to any peers that already have pending requests or are unavailable - if sync.state != PeerSyncState::Available || self.peer_requests.contains_key(&peer) { - None - } else { - Some((peer.clone(), sync.best_number)) - } - }).collect::>(); - - let mut last_peer = available_peers.back().map(|p| p.0.clone()); - let mut unhandled_requests = VecDeque::new(); - - loop { - let (peer, peer_best_number) = match available_peers.pop_front() { - Some(p) => p, - _ => break, - }; - - // only ask peers that have synced past the block number that we're - // asking the justification for and to whom we haven't already made - // the same request recently - let peer_eligible = { - let request = match self.pending_requests.front() { - Some(r) => r.clone(), - _ => break, - }; - - peer_best_number >= request.1 && - !self.previous_requests - .get(&request) - .map(|requests| requests.iter().any(|i| i.0 == peer)) - .unwrap_or(false) - }; - - if !peer_eligible { - available_peers.push_back((peer.clone(), peer_best_number)); - - // we tried all peers and none can answer this request - if Some(peer) == last_peer { - last_peer = available_peers.back().map(|p| p.0.clone()); - - let request = self.pending_requests.pop_front() - .expect("verified to be Some in the beginning of the loop; qed"); - - unhandled_requests.push_back(request); - } - - continue; - } - - last_peer = available_peers.back().map(|p| p.0.clone()); - - let request = self.pending_requests.pop_front() - .expect("verified to be Some in the beginning of the loop; qed"); - - self.peer_requests.insert(peer.clone(), request); - - peers.get_mut(&peer) - .expect("peer was is taken from available_peers; available_peers is a subset of peers; qed") - .state = PeerSyncState::DownloadingJustification(request.0); - - trace!(target: "sync", "Requesting justification for block #{} from {}", request.0, peer); - let request = message::generic::BlockRequest { - id: 0, - fields: message::BlockAttributes::JUSTIFICATION, - from: message::FromBlock::Hash(request.0), - to: None, - direction: message::Direction::Ascending, - max: Some(1), - }; - - protocol.send_block_request(peer, request); - } - - self.pending_requests.append(&mut unhandled_requests); - - trace!(target: "sync", "Dispatched {} justification requests ({} pending)", - initial_pending_requests - self.pending_requests.len(), - self.pending_requests.len(), - ); - } - - /// Queue a justification request (without dispatching it). - fn queue_request( - &mut self, - justification: &PendingJustification, - is_descendent_of: F, - ) where F: Fn(&B::Hash, &B::Hash) -> Result { - match self.justifications.import(justification.0.clone(), justification.1.clone(), (), &is_descendent_of) { - Ok(true) => { - // this is a new root so we add it to the current `pending_requests` - self.pending_requests.push_back((justification.0, justification.1)); - }, - Err(err) => { - warn!(target: "sync", "Failed to insert requested justification {:?} {:?} into tree: {:?}", - justification.0, - justification.1, - err, - ); - return; - }, - _ => {}, - }; - } - - /// Retry any pending request if a peer disconnected. - fn peer_disconnected(&mut self, who: PeerId) { - if let Some(request) = self.peer_requests.remove(&who) { - self.pending_requests.push_front(request); - } - } - - /// Process the import of a justification. - /// Queues a retry in case the import failed. - fn justification_import_result(&mut self, hash: B::Hash, number: NumberFor, success: bool) { - let request = (hash, number); - - if !self.importing_requests.remove(&request) { - debug!(target: "sync", "Got justification import result for unknown justification {:?} {:?} request.", - request.0, - request.1, - ); - - return; - }; - - if success { - if self.justifications.finalize_root(&request.0).is_none() { - warn!(target: "sync", "Imported justification for {:?} {:?} which isn't a root in the tree: {:?}", - request.0, - request.1, - self.justifications.roots().collect::>(), - ); - - return; - }; - - self.previous_requests.clear(); - self.peer_requests.clear(); - self.pending_requests = - self.justifications.roots().map(|(h, n, _)| (h.clone(), n.clone())).collect(); - - return; - } - self.pending_requests.push_front(request); - } - - /// Processes the response for the request previously sent to the given - /// peer. Queues a retry in case the given justification - /// was `None`. - /// - /// Returns `Some` if this produces a justification that must be imported in the import queue. - #[must_use] - fn on_response( - &mut self, - who: PeerId, - justification: Option, - ) -> Option<(PeerId, B::Hash, NumberFor, Justification)> { - // we assume that the request maps to the given response, this is - // currently enforced by the outer network protocol before passing on - // messages to chain sync. - if let Some(request) = self.peer_requests.remove(&who) { - if let Some(justification) = justification { - self.importing_requests.insert(request); - return Some((who, request.0, request.1, justification)) - } - - self.previous_requests - .entry(request) - .or_insert(Vec::new()) - .push((who, Instant::now())); - - self.pending_requests.push_front(request); - } - - None - } - - /// Removes any pending justification requests for blocks lower than the - /// given best finalized. - fn on_block_finalized( - &mut self, - best_finalized_hash: &B::Hash, - best_finalized_number: NumberFor, - is_descendent_of: F, - ) -> Result<(), fork_tree::Error> - where F: Fn(&B::Hash, &B::Hash) -> Result - { - if self.importing_requests.contains(&(*best_finalized_hash, best_finalized_number)) { - // we imported this justification ourselves, so we should get back a response - // from the import queue through `justification_import_result` - return Ok(()); - } - - self.justifications.finalize(best_finalized_hash, best_finalized_number, &is_descendent_of)?; - - let roots = self.justifications.roots().collect::>(); - - self.pending_requests.retain(|(h, n)| roots.contains(&(h, n, &()))); - self.peer_requests.retain(|_, (h, n)| roots.contains(&(h, n, &()))); - self.previous_requests.retain(|(h, n), _| roots.contains(&(h, n, &()))); - - Ok(()) - } - - /// Clear all data. - fn clear(&mut self) { - self.justifications = ForkTree::new(); - self.pending_requests.clear(); - self.peer_requests.clear(); - self.previous_requests.clear(); - } -} - -/// Relay chain sync strategy. -pub struct ChainSync { - genesis_hash: B::Hash, - peers: HashMap>, - blocks: BlockCollection, - best_queued_number: NumberFor, - best_queued_hash: B::Hash, - required_block_attributes: message::BlockAttributes, - justifications: PendingJustifications, - queue_blocks: HashSet, - best_importing_number: NumberFor, -} - -/// Reported sync state. -#[derive(Clone, Eq, PartialEq, Debug)] -pub enum SyncState { - /// Initial sync is complete, keep-up sync is active. - Idle, - /// Actively catching up with the chain. - Downloading -} - -/// Syncing status and statistics -#[derive(Clone)] -pub struct Status { - /// Current global sync state. - pub state: SyncState, - /// Target sync block number. - pub best_seen_block: Option>, - /// Number of peers participating in syncing. - pub num_peers: u32, -} - -impl Status { - /// Whether the synchronization status is doing major downloading work or - /// is near the head of the chain. - pub fn is_major_syncing(&self) -> bool { - match self.state { - SyncState::Idle => false, - SyncState::Downloading => true, - } - } - - /// Are we all alone? - pub fn is_offline(&self) -> bool { - self.num_peers == 0 - } -} - -impl ChainSync { - /// Create a new instance. Pass the initial known state of the chain. - pub(crate) fn new( - role: Roles, - info: &ClientInfo, - ) -> Self { - let mut required_block_attributes = message::BlockAttributes::HEADER | message::BlockAttributes::JUSTIFICATION; - if role.intersects(Roles::FULL | Roles::AUTHORITY) { - required_block_attributes |= message::BlockAttributes::BODY; - } - - ChainSync { - genesis_hash: info.chain.genesis_hash, - peers: HashMap::new(), - blocks: BlockCollection::new(), - best_queued_hash: info.best_queued_hash.unwrap_or(info.chain.best_hash), - best_queued_number: info.best_queued_number.unwrap_or(info.chain.best_number), - justifications: PendingJustifications::new(), - required_block_attributes, - queue_blocks: Default::default(), - best_importing_number: Zero::zero(), - } - } - - fn best_seen_block(&self) -> Option> { - self.peers.values().max_by_key(|p| p.best_number).map(|p| p.best_number) - } - - fn state(&self, best_seen: &Option>) -> SyncState { - match best_seen { - &Some(n) if n > self.best_queued_number && n - self.best_queued_number > As::sa(5) => SyncState::Downloading, - _ => SyncState::Idle, - } - } - - /// Returns the state of the sync of the given peer. Returns `None` if the peer is unknown. - pub(crate) fn peer_info(&self, who: &PeerId) -> Option> { - self.peers.get(who).map(|peer| { - PeerInfo { - best_hash: peer.best_hash, - best_number: peer.best_number, - } - }) - } - - /// Returns sync status. - pub(crate) fn status(&self) -> Status { - let best_seen = self.best_seen_block(); - let state = self.state(&best_seen); - Status { - state: state, - best_seen_block: best_seen, - num_peers: self.peers.len() as u32, - } - } - - /// Handle new connected peer. Call this method whenever we connect to a new peer. - pub(crate) fn new_peer(&mut self, protocol: &mut Context, who: PeerId) { - if let Some(info) = protocol.peer_info(&who) { - let status = block_status(&*protocol.client(), &self.queue_blocks, info.best_hash); - match (status, info.best_number) { - (Err(e), _) => { - debug!(target:"sync", "Error reading blockchain: {:?}", e); - protocol.report_peer(who.clone(), BLOCKCHAIN_STATUS_READ_ERROR_REPUTATION_CHANGE); - protocol.disconnect_peer(who); - }, - (Ok(BlockStatus::KnownBad), _) => { - info!("New peer with known bad best block {} ({}).", info.best_hash, info.best_number); - protocol.report_peer(who.clone(), i32::min_value()); - protocol.disconnect_peer(who); - }, - (Ok(BlockStatus::Unknown), b) if b == As::sa(0) => { - info!("New peer with unknown genesis hash {} ({}).", info.best_hash, info.best_number); - protocol.report_peer(who.clone(), i32::min_value()); - protocol.disconnect_peer(who); - }, - (Ok(BlockStatus::Unknown), _) if self.queue_blocks.len() > MAJOR_SYNC_BLOCKS => { - // when actively syncing the common point moves too fast. - debug!(target:"sync", "New peer with unknown best hash {} ({}), assuming common block.", self.best_queued_hash, self.best_queued_number); - self.peers.insert(who, PeerSync { - common_number: self.best_queued_number, - best_hash: info.best_hash, - best_number: info.best_number, - state: PeerSyncState::Available, - recently_announced: Default::default(), - }); - } - (Ok(BlockStatus::Unknown), _) => { - let our_best = self.best_queued_number; - if our_best > As::sa(0) { - let common_best = ::std::cmp::min(our_best, info.best_number); - debug!(target:"sync", "New peer with unknown best hash {} ({}), searching for common ancestor.", info.best_hash, info.best_number); - self.peers.insert(who.clone(), PeerSync { - common_number: As::sa(0), - best_hash: info.best_hash, - best_number: info.best_number, - state: PeerSyncState::AncestorSearch(common_best, AncestorSearchState::ExponentialBackoff(As::sa(1))), - recently_announced: Default::default(), - }); - Self::request_ancestry(protocol, who, common_best) - } else { - // We are at genesis, just start downloading - debug!(target:"sync", "New peer with best hash {} ({}).", info.best_hash, info.best_number); - self.peers.insert(who.clone(), PeerSync { - common_number: As::sa(0), - best_hash: info.best_hash, - best_number: info.best_number, - state: PeerSyncState::Available, - recently_announced: Default::default(), - }); - self.download_new(protocol, who) - } - }, - (Ok(BlockStatus::Queued), _) | (Ok(BlockStatus::InChainWithState), _) | (Ok(BlockStatus::InChainPruned), _) => { - debug!(target:"sync", "New peer with known best hash {} ({}).", info.best_hash, info.best_number); - self.peers.insert(who.clone(), PeerSync { - common_number: info.best_number, - best_hash: info.best_hash, - best_number: info.best_number, - state: PeerSyncState::Available, - recently_announced: Default::default(), - }); - } - } - } - } - - fn handle_ancestor_search_state( - state: AncestorSearchState, - curr_block_num: NumberFor, - block_hash_match: bool, - ) -> Option<(AncestorSearchState, NumberFor)> { - match state { - AncestorSearchState::ExponentialBackoff(next_distance_to_tip) => { - if block_hash_match && next_distance_to_tip == As::sa(1) { - // We found the ancestor in the first step so there is no need to execute binary search. - return None; - } - if block_hash_match { - let left = curr_block_num; - let right = left + next_distance_to_tip / As::sa(2); - let middle = left + (right - left) / As::sa(2); - Some((AncestorSearchState::BinarySearch(left, right), middle)) - } else { - let next_block_num = curr_block_num.checked_sub(&next_distance_to_tip).unwrap_or(As::sa(0)); - let next_distance_to_tip = next_distance_to_tip * As::sa(2); - Some((AncestorSearchState::ExponentialBackoff(next_distance_to_tip), next_block_num)) - } - }, - AncestorSearchState::BinarySearch(mut left, mut right) => { - if left >= curr_block_num { - return None; - } - if block_hash_match { - left = curr_block_num; - } else { - right = curr_block_num; - } - assert!(right >= left); - let middle = left + (right - left) / As::sa(2); - Some((AncestorSearchState::BinarySearch(left, right), middle)) - }, - } - } - - /// Handle a response from the remote to a block request that we made. - /// - /// `request` must be the original request that triggered `response`. - /// - /// If this corresponds to a valid block, this outputs the block that must be imported in the - /// import queue. - #[must_use] - pub(crate) fn on_block_data( - &mut self, - protocol: &mut Context, - who: PeerId, - request: message::BlockRequest, - response: message::BlockResponse - ) -> Option<(BlockOrigin, Vec>)> { - let new_blocks: Vec> = if let Some(ref mut peer) = self.peers.get_mut(&who) { - let mut blocks = response.blocks; - if request.direction == message::Direction::Descending { - trace!(target: "sync", "Reversing incoming block list"); - blocks.reverse(); - } - let peer_state = peer.state.clone(); - match peer_state { - PeerSyncState::DownloadingNew(start_block) => { - self.blocks.clear_peer_download(&who); - peer.state = PeerSyncState::Available; - self.blocks.insert(start_block, blocks, who); - self.blocks - .drain(self.best_queued_number + As::sa(1)) - .into_iter() - .map(|block_data| { - IncomingBlock { - hash: block_data.block.hash, - header: block_data.block.header, - body: block_data.block.body, - justification: block_data.block.justification, - origin: block_data.origin, - } - }).collect() - }, - PeerSyncState::DownloadingStale(_) => { - peer.state = PeerSyncState::Available; - blocks.into_iter().map(|b| { - IncomingBlock { - hash: b.hash, - header: b.header, - body: b.body, - justification: b.justification, - origin: Some(who.clone()), - } - }).collect() - }, - PeerSyncState::AncestorSearch(num, state) => { - let block_hash_match = match (blocks.get(0), protocol.client().block_hash(num)) { - (Some(ref block), Ok(maybe_our_block_hash)) => { - trace!(target: "sync", "Got ancestry block #{} ({}) from peer {}", num, block.hash, who); - maybe_our_block_hash.map_or(false, |x| x == block.hash) - }, - (None, _) => { - debug!(target: "sync", "Invalid response when searching for ancestor from {}", who); - protocol.report_peer(who.clone(), i32::min_value()); - protocol.disconnect_peer(who); - return None - }, - (_, Err(e)) => { - info!("Error answering legitimate blockchain query: {:?}", e); - protocol.report_peer(who.clone(), ANCESTRY_BLOCK_ERROR_REPUTATION_CHANGE); - protocol.disconnect_peer(who); - return None - }, - }; - if block_hash_match && peer.common_number < num { - peer.common_number = num; - } - if !block_hash_match && num == As::sa(0) { - trace!(target:"sync", "Ancestry search: genesis mismatch for peer {}", who); - protocol.report_peer(who.clone(), GENESIS_MISMATCH_REPUTATION_CHANGE); - protocol.disconnect_peer(who); - return None - } - if let Some((next_state, next_block_num)) = Self::handle_ancestor_search_state(state, num, block_hash_match) { - peer.state = PeerSyncState::AncestorSearch(next_block_num, next_state); - Self::request_ancestry(protocol, who, next_block_num); - return None - } else { - peer.state = PeerSyncState::Available; - vec![] - } - }, - PeerSyncState::Available | PeerSyncState::DownloadingJustification(..) => Vec::new(), - } - } else { - Vec::new() - }; - - let is_recent = new_blocks - .first() - .map(|block| self.peers.iter().any(|(_, peer)| peer.recently_announced.contains(&block.hash))) - .unwrap_or(false); - let origin = if is_recent { BlockOrigin::NetworkBroadcast } else { BlockOrigin::NetworkInitialSync }; - - if let Some((hash, number)) = new_blocks.last() - .and_then(|b| b.header.as_ref().map(|h| (b.hash.clone(), *h.number()))) - { - trace!(target:"sync", "Accepted {} blocks ({:?}) with origin {:?}", new_blocks.len(), hash, origin); - self.block_queued(&hash, number); - } - self.maintain_sync(protocol); - let new_best_importing_number = new_blocks - .last() - .and_then(|b| b.header.as_ref().map(|h| h.number().clone())) - .unwrap_or_else(|| Zero::zero()); - self.queue_blocks - .extend(new_blocks.iter().map(|b| b.hash.clone())); - self.best_importing_number = max(new_best_importing_number, self.best_importing_number); - Some((origin, new_blocks)) - } - - /// Handle a response from the remote to a justification request that we made. - /// - /// `request` must be the original request that triggered `response`. - /// - /// Returns `Some` if this produces a justification that must be imported into the import - /// queue. - #[must_use] - pub(crate) fn on_block_justification_data( - &mut self, - protocol: &mut Context, - who: PeerId, - _request: message::BlockRequest, - response: message::BlockResponse, - ) -> Option<(PeerId, B::Hash, NumberFor, Justification)> { - if let Some(ref mut peer) = self.peers.get_mut(&who) { - if let PeerSyncState::DownloadingJustification(hash) = peer.state { - peer.state = PeerSyncState::Available; - - // we only request one justification at a time - match response.blocks.into_iter().next() { - Some(response) => { - if hash != response.hash { - info!("Invalid block justification provided by {}: requested: {:?} got: {:?}", - who, hash, response.hash); - protocol.report_peer(who.clone(), i32::min_value()); - protocol.disconnect_peer(who); - return None; - } - - return self.justifications.on_response( - who, - response.justification, - ); - }, - None => { - // we might have asked the peer for a justification on a block that we thought it had - // (regardless of whether it had a justification for it or not). - trace!(target: "sync", "Peer {:?} provided empty response for justification request {:?}", - who, - hash, - ); - return None; - }, - } - } - } - - self.maintain_sync(protocol); - None - } - - /// Call this when a batch of blocks have been processed by the import queue, with or without - /// errors. - pub fn blocks_processed(&mut self, processed_blocks: Vec, has_error: bool) { - for hash in processed_blocks { - self.queue_blocks.remove(&hash); - } - if has_error { - self.best_importing_number = Zero::zero(); - } - } - - /// Maintain the sync process (download new blocks, fetch justifications). - pub fn maintain_sync(&mut self, protocol: &mut Context) { - let peers: Vec = self.peers.keys().map(|p| p.clone()).collect(); - for peer in peers { - self.download_new(protocol, peer); - } - self.justifications.dispatch(&mut self.peers, protocol); - } - - /// Called periodically to perform any time-based actions. Must be called at a regular - /// interval. - pub fn tick(&mut self, protocol: &mut Context) { - self.justifications.dispatch(&mut self.peers, protocol); - } - - /// Request a justification for the given block. - /// - /// Uses `protocol` to queue a new justification request and tries to dispatch all pending - /// requests. - pub fn request_justification(&mut self, hash: &B::Hash, number: NumberFor, protocol: &mut Context) { - self.justifications.queue_request( - &(*hash, number), - |base, block| protocol.client().is_descendent_of(base, block), - ); - - self.justifications.dispatch(&mut self.peers, protocol); - } - - /// Clears all pending justification requests. - pub fn clear_justification_requests(&mut self) { - self.justifications.clear(); - } - - /// Call this when a justification has been processed by the import queue, with or without - /// errors. - pub fn justification_import_result(&mut self, hash: B::Hash, number: NumberFor, success: bool) { - self.justifications.justification_import_result(hash, number, success); - } - - /// Notify about successful import of the given block. - pub fn block_imported(&mut self, hash: &B::Hash, number: NumberFor) { - trace!(target: "sync", "Block imported successfully {} ({})", number, hash); - } - - /// Notify about finalization of the given block. - pub fn on_block_finalized(&mut self, hash: &B::Hash, number: NumberFor, protocol: &mut Context) { - if let Err(err) = self.justifications.on_block_finalized( - hash, - number, - |base, block| protocol.client().is_descendent_of(base, block), - ) { - warn!(target: "sync", "Error cleaning up pending justification requests: {:?}", err); - }; - } - - fn block_queued(&mut self, hash: &B::Hash, number: NumberFor) { - if number > self.best_queued_number { - self.best_queued_number = number; - self.best_queued_hash = *hash; - } - // Update common blocks - for (n, peer) in self.peers.iter_mut() { - if let PeerSyncState::AncestorSearch(_, _) = peer.state { - // Abort search. - peer.state = PeerSyncState::Available; - } - trace!(target: "sync", "Updating peer {} info, ours={}, common={}, their best={}", n, number, peer.common_number, peer.best_number); - if peer.best_number >= number { - peer.common_number = number; - } else { - peer.common_number = peer.best_number; - } - } - } - - /// Sets the new head of chain. - pub(crate) fn update_chain_info(&mut self, best_header: &B::Header) { - let hash = best_header.hash(); - self.block_queued(&hash, best_header.number().clone()) - } - - /// Call when a node announces a new block. - pub(crate) fn on_block_announce(&mut self, protocol: &mut Context, who: PeerId, hash: B::Hash, header: &B::Header) { - let number = *header.number(); - debug!(target: "sync", "Received block announcement with number {:?}", number); - if number <= As::sa(0) { - warn!(target: "sync", "Ignored invalid block announcement from {}: {}", who, hash); - return; - } - let parent_status = block_status(&*protocol.client(), &self.queue_blocks, header.parent_hash().clone()).ok() - .unwrap_or(BlockStatus::Unknown); - let known_parent = parent_status != BlockStatus::Unknown; - let ancient_parent = parent_status == BlockStatus::InChainPruned; - - let known = self.is_known(protocol, &hash); - if let Some(ref mut peer) = self.peers.get_mut(&who) { - while peer.recently_announced.len() >= ANNOUNCE_HISTORY_SIZE { - peer.recently_announced.pop_front(); - } - peer.recently_announced.push_back(hash.clone()); - if number > peer.best_number { - // update their best block - peer.best_number = number; - peer.best_hash = hash; - } - if let PeerSyncState::AncestorSearch(_, _) = peer.state { - return; - } - if header.parent_hash() == &self.best_queued_hash || known_parent { - peer.common_number = number - As::sa(1); - } else if known { - peer.common_number = number - } - } else { - return; - } - - if !(known || self.is_already_downloading(&hash)) { - let stale = number <= self.best_queued_number; - if stale { - if !(known_parent || self.is_already_downloading(header.parent_hash())) { - if protocol.client().block_status(&BlockId::Number(*header.number())) - .unwrap_or(BlockStatus::Unknown) == BlockStatus::InChainPruned - { - trace!(target: "sync", "Ignored unknown ancient block announced from {}: {} {:?}", who, hash, header); - } else { - trace!(target: "sync", "Considering new unknown stale block announced from {}: {} {:?}", who, hash, header); - self.download_unknown_stale(protocol, who, &hash); - } - } else { - if ancient_parent { - trace!(target: "sync", "Ignored ancient stale block announced from {}: {} {:?}", who, hash, header); - } else { - self.download_stale(protocol, who, &hash); - } - } - } else { - if ancient_parent { - trace!(target: "sync", "Ignored ancient block announced from {}: {} {:?}", who, hash, header); - } else { - trace!(target: "sync", "Considering new block announced from {}: {} {:?}", who, hash, header); - self.download_new(protocol, who); - } - } - } else { - trace!(target: "sync", "Known block announce from {}: {}", who, hash); - } - } - - fn is_already_downloading(&self, hash: &B::Hash) -> bool { - self.peers.iter().any(|(_, p)| p.state == PeerSyncState::DownloadingStale(*hash)) - } - - fn is_known(&self, protocol: &mut Context, hash: &B::Hash) -> bool { - block_status(&*protocol.client(), &self.queue_blocks, *hash).ok().map_or(false, |s| s != BlockStatus::Unknown) - } - - /// Call when a peer has disconnected. - pub(crate) fn peer_disconnected(&mut self, protocol: &mut Context, who: PeerId) { - self.blocks.clear_peer_download(&who); - self.peers.remove(&who); - self.justifications.peer_disconnected(who); - self.maintain_sync(protocol); - } - - /// Restart the sync process. - pub(crate) fn restart(&mut self, protocol: &mut Context) { - self.queue_blocks.clear(); - self.best_importing_number = Zero::zero(); - self.blocks.clear(); - match protocol.client().info() { - Ok(info) => { - self.best_queued_hash = info.best_queued_hash.unwrap_or(info.chain.best_hash); - self.best_queued_number = info.best_queued_number.unwrap_or(info.chain.best_number); - debug!(target:"sync", "Restarted with {} ({})", self.best_queued_number, self.best_queued_hash); - }, - Err(e) => { - debug!(target:"sync", "Error reading blockchain: {:?}", e); - self.best_queued_hash = self.genesis_hash; - self.best_queued_number = As::sa(0); - } - } - let ids: Vec = self.peers.drain().map(|(id, _)| id).collect(); - for id in ids { - self.new_peer(protocol, id); - } - } - - // Download old block with known parent. - fn download_stale(&mut self, protocol: &mut Context, who: PeerId, hash: &B::Hash) { - if let Some(ref mut peer) = self.peers.get_mut(&who) { - match peer.state { - PeerSyncState::Available => { - let request = message::generic::BlockRequest { - id: 0, - fields: self.required_block_attributes.clone(), - from: message::FromBlock::Hash(*hash), - to: None, - direction: message::Direction::Ascending, - max: Some(1), - }; - peer.state = PeerSyncState::DownloadingStale(*hash); - protocol.send_block_request(who, request); - }, - _ => (), - } - } - } - - // Download old block with unknown parent. - fn download_unknown_stale(&mut self, protocol: &mut Context, who: PeerId, hash: &B::Hash) { - if let Some(ref mut peer) = self.peers.get_mut(&who) { - match peer.state { - PeerSyncState::Available => { - let request = message::generic::BlockRequest { - id: 0, - fields: self.required_block_attributes.clone(), - from: message::FromBlock::Hash(*hash), - to: None, - direction: message::Direction::Descending, - max: Some(MAX_UNKNOWN_FORK_DOWNLOAD_LEN), - }; - peer.state = PeerSyncState::DownloadingStale(*hash); - protocol.send_block_request(who, request); - }, - _ => (), - } - } - } - - // Issue a request for a peer to download new blocks, if any are available - fn download_new(&mut self, protocol: &mut Context, who: PeerId) { - if let Some(ref mut peer) = self.peers.get_mut(&who) { - // when there are too many blocks in the queue => do not try to download new blocks - if self.queue_blocks.len() > MAX_IMPORTING_BLOCKS { - trace!(target: "sync", "Too many blocks in the queue."); - return; - } - match peer.state { - PeerSyncState::Available => { - trace!(target: "sync", "Considering new block download from {}, common block is {}, best is {:?}", who, peer.common_number, peer.best_number); - if let Some(range) = self.blocks.needed_blocks(who.clone(), MAX_BLOCKS_TO_REQUEST, peer.best_number, peer.common_number) { - trace!(target: "sync", "Requesting blocks from {}, ({} to {})", who, range.start, range.end); - let request = message::generic::BlockRequest { - id: 0, - fields: self.required_block_attributes.clone(), - from: message::FromBlock::Number(range.start), - to: None, - direction: message::Direction::Ascending, - max: Some((range.end - range.start).as_() as u32), - }; - peer.state = PeerSyncState::DownloadingNew(range.start); - protocol.send_block_request(who, request); - } else { - trace!(target: "sync", "Nothing to request"); - } - }, - _ => trace!(target: "sync", "Peer {} is busy", who), - } - } - } - - fn request_ancestry(protocol: &mut Context, who: PeerId, block: NumberFor) { - trace!(target: "sync", "Requesting ancestry block #{} from {}", block, who); - let request = message::generic::BlockRequest { - id: 0, - fields: message::BlockAttributes::HEADER | message::BlockAttributes::JUSTIFICATION, - from: message::FromBlock::Number(block), - to: None, - direction: message::Direction::Ascending, - max: Some(1), - }; - protocol.send_block_request(who, request); - } -} - -/// Get block status, taking into account import queue. -fn block_status( - chain: &crate::chain::Client, - queue_blocks: &HashSet, - hash: B::Hash) -> Result -{ - if queue_blocks.contains(&hash) { - return Ok(BlockStatus::Queued); - } - - chain.block_status(&BlockId::Hash(hash)) -} diff --git a/core/network/src/test/block_import.rs b/core/network/src/test/block_import.rs index 3b5e44cc47e5a76d1b2b65de3ded66a0f78abdfa..b5a03ae23a5a3be53c6404252024b55c77b14da1 100644 --- a/core/network/src/test/block_import.rs +++ b/core/network/src/test/block_import.rs @@ -17,7 +17,7 @@ //! Testing block import logic. use consensus::import_queue::{import_single_block, BasicQueue, BlockImportError, BlockImportResult}; -use test_client::{self, TestClient}; +use test_client::{self, prelude::*}; use test_client::runtime::{Block, Hash}; use runtime_primitives::generic::BlockId; use super::*; @@ -26,9 +26,9 @@ struct TestLink {} impl Link for TestLink {} -fn prepare_good_block() -> (client::Client, Hash, u64, PeerId, IncomingBlock) { +fn prepare_good_block() -> (TestClient, Hash, u64, PeerId, IncomingBlock) { let client = test_client::new(); - let block = client.new_block().unwrap().bake().unwrap(); + let block = client.new_block(Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::File, block).unwrap(); let (hash, number) = (client.block_hash(1).unwrap().unwrap(), 1); @@ -77,8 +77,7 @@ fn async_import_queue_drops() { // Perform this test multiple times since it exhibits non-deterministic behavior. for _ in 0..100 { let verifier = Arc::new(PassThroughVerifier(true)); - let queue = BasicQueue::new(verifier, Arc::new(test_client::new()), None); - queue.start(Box::new(TestLink{})).unwrap(); + let mut queue = BasicQueue::new(verifier, Arc::new(test_client::new()), None, None, None); drop(queue); } } diff --git a/core/network/src/test/mod.rs b/core/network/src/test/mod.rs index f8d0ce9e3b01c8db004abd950228c770b7f5b9da..58d8a91c2e5dea20aecb23930455d8eea9229fba 100644 --- a/core/network/src/test/mod.rs +++ b/core/network/src/test/mod.rs @@ -23,34 +23,43 @@ mod sync; use std::collections::{HashMap, HashSet, VecDeque}; use std::sync::Arc; -use std::sync::atomic::{AtomicBool, Ordering}; +use crate::AlwaysBadChecker; use log::trace; -use client; +use crate::chain::FinalityProofProvider; +use client::{self, ClientInfo, BlockchainEvents, FinalityNotifications}; +use client::{in_mem::Backend as InMemoryBackend, error::Result as ClientResult}; use client::block_builder::BlockBuilder; -use crate::config::ProtocolConfig; +use client::backend::AuxStore; +use crate::config::Roles; use consensus::import_queue::{BasicQueue, ImportQueue, IncomingBlock}; -use consensus::import_queue::{Link, SharedBlockImport, SharedJustificationImport, Verifier}; -use consensus::{Error as ConsensusError, ErrorKind as ConsensusErrorKind}; +use consensus::import_queue::{ + Link, SharedBlockImport, SharedJustificationImport, Verifier, SharedFinalityProofImport, + SharedFinalityProofRequestBuilder, +}; +use consensus::{Error as ConsensusError, well_known_cache_keys::{self, Id as CacheKeyId}}; use consensus::{BlockOrigin, ForkChoiceStrategy, ImportBlock, JustificationImport}; use crate::consensus_gossip::{ConsensusGossip, MessageRecipient as GossipMessageRecipient, TopicNotification}; -use crossbeam_channel::RecvError; use futures::{prelude::*, sync::{mpsc, oneshot}}; +use log::info; use crate::message::Message; -use network_libp2p::PeerId; +use libp2p::PeerId; use parking_lot::{Mutex, RwLock}; -use primitives::{H256, sr25519::Public as AuthorityId}; -use crate::protocol::{ConnectedPeer, Context, Protocol, ProtocolMsg, CustomMessageOutcome}; -use runtime_primitives::generic::BlockId; -use runtime_primitives::traits::{AuthorityIdFor, Block as BlockT, Digest, DigestItem, Header, NumberFor}; +use primitives::{H256, Blake2Hasher}; +use crate::SyncState; +use crate::protocol::{Context, Protocol, ProtocolConfig, CustomMessageOutcome, NetworkOut}; +use runtime_primitives::generic::{BlockId, OpaqueDigestItemId}; +use runtime_primitives::traits::{Block as BlockT, Header, NumberFor}; use runtime_primitives::{Justification, ConsensusEngineId}; -use crate::service::{network_channel, NetworkChan, NetworkLink, NetworkMsg, NetworkPort, TransactionPool}; +use crate::service::{NetworkMsg, ProtocolMsg, TransactionPool}; use crate::specialization::NetworkSpecialization; use test_client::{self, AccountKeyring}; pub use test_client::runtime::{Block, Extrinsic, Hash, Transfer}; pub use test_client::TestClient; +type AuthorityId = primitives::sr25519::Public; + #[cfg(any(test, feature = "test-helpers"))] /// A Verifier that accepts all blocks and passes them on with the configured /// finality to be imported. @@ -65,9 +74,12 @@ impl Verifier for PassThroughVerifier { header: B::Header, justification: Option, body: Option> - ) -> Result<(ImportBlock, Option>>), String> { - let new_authorities = header.digest().log(DigestItem::as_authorities_change) - .map(|auth| auth.iter().cloned().collect()); + ) -> Result<(ImportBlock, Option)>>), String> { + let maybe_keys = header.digest() + .log(|l| l.try_as_raw(OpaqueDigestItemId::Consensus(b"aura")) + .or_else(|| l.try_as_raw(OpaqueDigestItemId::Consensus(b"babe"))) + ) + .map(|blob| vec![(well_known_cache_keys::AUTHORITIES, blob.to_vec())]); Ok((ImportBlock { origin, @@ -78,7 +90,7 @@ impl Verifier for PassThroughVerifier { post_digests: vec![], auxiliary: Vec::new(), fork_choice: ForkChoiceStrategy::LongestChain, - }, new_authorities)) + }, maybe_keys)) } } @@ -87,6 +99,79 @@ pub struct NoopLink { } impl Link for NoopLink { } +/// A link implementation that connects to the network. +#[derive(Clone)] +pub struct NetworkLink> { + /// The protocol sender + pub(crate) protocol_sender: mpsc::UnboundedSender>, + /// The network sender + pub(crate) network_sender: mpsc::UnboundedSender>, +} + +impl> Link for NetworkLink { + fn block_imported(&mut self, hash: &B::Hash, number: NumberFor) { + let _ = self.protocol_sender.unbounded_send(ProtocolMsg::BlockImportedSync(hash.clone(), number)); + } + + fn blocks_processed(&mut self, processed_blocks: Vec, has_error: bool) { + let _ = self.protocol_sender.unbounded_send(ProtocolMsg::BlocksProcessed(processed_blocks, has_error)); + } + + fn justification_imported(&mut self, who: PeerId, hash: &B::Hash, number: NumberFor, success: bool) { + let _ = self.protocol_sender.unbounded_send(ProtocolMsg::JustificationImportResult(hash.clone(), number, success)); + if !success { + info!("Invalid justification provided by {} for #{}", who, hash); + let _ = self.network_sender.unbounded_send(NetworkMsg::ReportPeer(who.clone(), i32::min_value())); + let _ = self.network_sender.unbounded_send(NetworkMsg::DisconnectPeer(who.clone())); + } + } + + fn clear_justification_requests(&mut self) { + let _ = self.protocol_sender.unbounded_send(ProtocolMsg::ClearJustificationRequests); + } + + fn request_justification(&mut self, hash: &B::Hash, number: NumberFor) { + let _ = self.protocol_sender.unbounded_send(ProtocolMsg::RequestJustification(hash.clone(), number)); + } + + fn request_finality_proof(&mut self, hash: &B::Hash, number: NumberFor) { + let _ = self.protocol_sender.unbounded_send(ProtocolMsg::RequestFinalityProof( + hash.clone(), + number, + )); + } + + fn finality_proof_imported( + &mut self, + who: PeerId, + request_block: (B::Hash, NumberFor), + finalization_result: Result<(B::Hash, NumberFor), ()>, + ) { + let success = finalization_result.is_ok(); + let _ = self.protocol_sender.unbounded_send(ProtocolMsg::FinalityProofImportResult( + request_block, + finalization_result, + )); + if !success { + info!("Invalid finality proof provided by {} for #{}", who, request_block.0); + let _ = self.network_sender.unbounded_send(NetworkMsg::ReportPeer(who.clone(), i32::min_value())); + let _ = self.network_sender.unbounded_send(NetworkMsg::DisconnectPeer(who.clone())); + } + } + + fn report_peer(&mut self, who: PeerId, reputation_change: i32) { + let _ = self.network_sender.unbounded_send(NetworkMsg::ReportPeer(who, reputation_change)); + } + + fn restart(&mut self) { + let _ = self.protocol_sender.unbounded_send(ProtocolMsg::RestartSync); + } + + fn set_finality_proof_request_builder(&mut self, request_builder: SharedFinalityProofRequestBuilder) { + let _ = self.protocol_sender.unbounded_send(ProtocolMsg::SetFinalityProofRequestBuilder(request_builder)); + } +} + /// The test specialization. #[derive(Clone)] pub struct DummySpecialization; @@ -96,22 +181,105 @@ impl NetworkSpecialization for DummySpecialization { vec![] } - fn on_connect(&mut self, _ctx: &mut Context, _peer_id: PeerId, _status: crate::message::Status) { - } + fn on_connect( + &mut self, + _ctx: &mut dyn Context, + _peer_id: PeerId, + _status: crate::message::Status + ) {} - fn on_disconnect(&mut self, _ctx: &mut Context, _peer_id: PeerId) { - } + fn on_disconnect(&mut self, _ctx: &mut dyn Context, _peer_id: PeerId) {} fn on_message( &mut self, - _ctx: &mut Context, + _ctx: &mut dyn Context, _peer_id: PeerId, _message: &mut Option>, - ) { - } + ) {} +} + +pub type PeersFullClient = + client::Client; +pub type PeersLightClient = + client::Client; + +#[derive(Clone)] +pub enum PeersClient { + Full(Arc), + Light(Arc), } -pub type PeersClient = client::Client; +impl PeersClient { + pub fn as_full(&self) -> Option> { + match *self { + PeersClient::Full(ref client) => Some(client.clone()), + _ => None, + } + } + + pub fn as_block_import(&self) -> SharedBlockImport { + match *self { + PeersClient::Full(ref client) => client.clone() as _, + PeersClient::Light(ref client) => client.clone() as _, + } + } + + pub fn as_in_memory_backend(&self) -> InMemoryBackend { + #[allow(deprecated)] + match *self { + PeersClient::Full(ref client) => client.backend().as_in_memory(), + PeersClient::Light(_) => unimplemented!("TODO"), + } + } + + pub fn get_aux(&self, key: &[u8]) -> ClientResult>> { + #[allow(deprecated)] + match *self { + PeersClient::Full(ref client) => client.backend().get_aux(key), + PeersClient::Light(ref client) => client.backend().get_aux(key), + } + } + + pub fn info(&self) -> ClientInfo { + match *self { + PeersClient::Full(ref client) => client.info(), + PeersClient::Light(ref client) => client.info(), + } + } + + pub fn header(&self, block: &BlockId) -> ClientResult::Header>> { + match *self { + PeersClient::Full(ref client) => client.header(block), + PeersClient::Light(ref client) => client.header(block), + } + } + + pub fn justification(&self, block: &BlockId) -> ClientResult> { + match *self { + PeersClient::Full(ref client) => client.justification(block), + PeersClient::Light(ref client) => client.justification(block), + } + } + + pub fn finality_notification_stream(&self) -> FinalityNotifications { + match *self { + PeersClient::Full(ref client) => client.finality_notification_stream(), + PeersClient::Light(ref client) => client.finality_notification_stream(), + } + } + + pub fn finalize_block( + &self, + id: BlockId, + justification: Option, + notify: bool + ) -> ClientResult<()> { + match *self { + PeersClient::Full(ref client) => client.finalize_block(id, justification, notify), + PeersClient::Light(ref client) => client.finalize_block(id, justification, notify), + } + } +} /// A Link that can wait for a block to have been imported. pub struct TestLink> { @@ -125,7 +293,7 @@ impl> TestLink { fn new( protocol_sender: mpsc::UnboundedSender>, _network_to_protocol_sender: mpsc::UnboundedSender>, - network_sender: NetworkChan + network_sender: mpsc::UnboundedSender> ) -> TestLink { TestLink { #[cfg(any(test, feature = "test-helpers"))] @@ -139,27 +307,44 @@ impl> TestLink { } impl> Link for TestLink { - fn block_imported(&self, hash: &Hash, number: NumberFor) { + fn block_imported(&mut self, hash: &Hash, number: NumberFor) { self.link.block_imported(hash, number); } - fn blocks_processed(&self, processed_blocks: Vec, has_error: bool) { + fn blocks_processed(&mut self, processed_blocks: Vec, has_error: bool) { self.link.blocks_processed(processed_blocks, has_error); } - fn justification_imported(&self, who: PeerId, hash: &Hash, number:NumberFor, success: bool) { + fn justification_imported(&mut self, who: PeerId, hash: &Hash, number:NumberFor, success: bool) { self.link.justification_imported(who, hash, number, success); } - fn request_justification(&self, hash: &Hash, number: NumberFor) { + fn request_justification(&mut self, hash: &Hash, number: NumberFor) { self.link.request_justification(hash, number); } - fn report_peer(&self, who: PeerId, reputation_change: i32) { + fn finality_proof_imported( + &mut self, + who: PeerId, + request_block: (Hash, NumberFor), + finalization_result: Result<(Hash, NumberFor), ()>, + ) { + self.link.finality_proof_imported(who, request_block, finalization_result); + } + + fn request_finality_proof(&mut self, hash: &Hash, number: NumberFor) { + self.link.request_finality_proof(hash, number); + } + + fn set_finality_proof_request_builder(&mut self, request_builder: SharedFinalityProofRequestBuilder) { + self.link.set_finality_proof_request_builder(request_builder); + } + + fn report_peer(&mut self, who: PeerId, reputation_change: i32) { self.link.report_peer(who, reputation_change); } - fn restart(&self) { + fn restart(&mut self) { self.link.restart(); } @@ -168,31 +353,34 @@ impl> Link for TestLink { /// The caller should wait for the `Link::synchronized` call to ensure that it has synchronized /// with `ImportQueue`. #[cfg(any(test, feature = "test-helpers"))] - fn synchronized(&self) { + fn synchronized(&mut self) { drop(self.network_to_protocol_sender.unbounded_send(FromNetworkMsg::Synchronize)) } } pub struct Peer> { - pub is_offline: Arc, - pub is_major_syncing: Arc, - pub peers: Arc>>>, - pub peer_id: PeerId, - client: Arc, + peer_id: PeerId, + client: PeersClient, net_proto_channel: ProtocolChannel, - pub import_queue: Box>, + /// This field is used only in test code, but maintaining different + /// instantiation paths or field names is too much hassle, hence + /// we allow it to be unused. + #[cfg_attr(not(test), allow(unused))] + /// `(is_offline, is_major_syncing, num_peers)` + protocol_status: Arc>, + import_queue: Arc>>>, pub data: D, best_hash: Mutex>, finalized_hash: Mutex>, } -type MessageFilter = Fn(&NetworkMsg) -> bool; +type MessageFilter = dyn Fn(&NetworkMsg) -> bool; -enum FromNetworkMsg { - /// A peer connected, with debug info. - PeerConnected(PeerId, String), - /// A peer disconnected, with debug info. - PeerDisconnected(PeerId, String), +pub enum FromNetworkMsg { + /// A peer connected. + PeerConnected(PeerId), + /// A peer disconnected. + PeerDisconnected(PeerId), /// A custom message from another peer. CustomMessage(PeerId, Message), /// Synchronization request. @@ -200,24 +388,28 @@ enum FromNetworkMsg { } struct ProtocolChannel> { + /// If true, we expect a tokio executor to be available. If false, we spawn our own. + use_tokio: bool, buffered_messages: Mutex>>, network_to_protocol_sender: mpsc::UnboundedSender>, client_to_protocol_sender: mpsc::UnboundedSender>, - protocol_to_network_receiver: NetworkPort, + protocol_to_network_receiver: Mutex>>, } impl> ProtocolChannel { /// Create new buffered network port. pub fn new( + use_tokio: bool, network_to_protocol_sender: mpsc::UnboundedSender>, client_to_protocol_sender: mpsc::UnboundedSender>, - protocol_to_network_receiver: NetworkPort, + protocol_to_network_receiver: mpsc::UnboundedReceiver>, ) -> Self { ProtocolChannel { + use_tokio, buffered_messages: Mutex::new(VecDeque::new()), network_to_protocol_sender, client_to_protocol_sender, - protocol_to_network_receiver, + protocol_to_network_receiver: Mutex::new(protocol_to_network_receiver), } } @@ -238,13 +430,23 @@ impl> ProtocolChannel { } /// Wait until synchronization response is generated by the protocol. - pub fn wait_sync(&self) -> Result<(), RecvError> { - loop { - match self.protocol_to_network_receiver.receiver().recv() { - Ok(NetworkMsg::Synchronized) => return Ok(()), - Err(error) => return Err(error), - Ok(msg) => self.buffered_messages.lock().push_back(msg), + pub fn wait_sync(&self) -> Result<(), ()> { + let fut = futures::future::poll_fn(|| { + loop { + let mut protocol_to_network_receiver = self.protocol_to_network_receiver.lock(); + match protocol_to_network_receiver.poll() { + Ok(Async::Ready(Some(NetworkMsg::Synchronized))) => return Ok(Async::Ready(())), + Ok(Async::Ready(None)) | Err(_) => return Err(()), + Ok(Async::NotReady) => return Ok(Async::NotReady), + Ok(Async::Ready(Some(msg))) => self.buffered_messages.lock().push_back(msg), + } } + }); + + if self.use_tokio { + fut.wait() + } else { + tokio::runtime::current_thread::block_on_all(fut) } } @@ -267,8 +469,13 @@ impl> ProtocolChannel { /// Whether this peer is done syncing (has no messages to send). fn is_done(&self) -> bool { - self.buffered_messages.lock().is_empty() - && self.protocol_to_network_receiver.receiver().is_empty() + let mut buffered_messages = self.buffered_messages.lock(); + if let Some(msg) = self.channel_message() { + buffered_messages.push_back(msg); + false + } else { + buffered_messages.is_empty() + } } /// Return oldest buffered message if it exists. @@ -285,38 +492,43 @@ impl> ProtocolChannel { /// Receive message from the channel. fn channel_message(&self) -> Option> { - self.protocol_to_network_receiver.receiver().try_recv().ok() + let fut = futures::future::poll_fn(|| -> Result<_, ()> { + Ok(Async::Ready(match self.protocol_to_network_receiver.lock().poll() { + Ok(Async::Ready(Some(m))) => Some(m), + Ok(Async::NotReady) => None, + Err(_) => None, + Ok(Async::Ready(None)) => None, + })) + }); + + if self.use_tokio { + fut.wait() + } else { + tokio::runtime::current_thread::block_on_all(fut) + }.ok().and_then(|a| a) } } impl> Peer { fn new( - is_offline: Arc, - is_major_syncing: Arc, - peers: Arc>>>, - client: Arc, - import_queue: Box>, + protocol_status: Arc>, + client: PeersClient, + import_queue: Arc>>>, + use_tokio: bool, network_to_protocol_sender: mpsc::UnboundedSender>, protocol_sender: mpsc::UnboundedSender>, - network_sender: NetworkChan, - network_port: NetworkPort, + _network_sender: mpsc::UnboundedSender>, + network_port: mpsc::UnboundedReceiver>, data: D, ) -> Self { let net_proto_channel = ProtocolChannel::new( + use_tokio, network_to_protocol_sender.clone(), protocol_sender.clone(), network_port, ); - let network_link = TestLink::new( - protocol_sender.clone(), - network_to_protocol_sender.clone(), - network_sender.clone(), - ); - import_queue.start(Box::new(network_link)).expect("Test ImportQueue always starts"); Peer { - is_offline, - is_major_syncing, - peers, + protocol_status, peer_id: PeerId::random(), client, import_queue, @@ -329,7 +541,7 @@ impl> Peer { /// Called after blockchain has been populated to updated current state. fn start(&self) { // Update the sync state to the latest chain state. - let info = self.client.info().expect("In-mem client does not fail"); + let info = self.client.info(); let header = self .client .header(&BlockId::Hash(info.chain.best_hash)) @@ -338,7 +550,8 @@ impl> Peer { self.net_proto_channel.send_from_client(ProtocolMsg::BlockImported(info.chain.best_hash, header)); } - pub fn on_block_imported( + #[cfg(test)] + fn on_block_imported( &self, hash: ::Hash, header: &::Header, @@ -348,24 +561,30 @@ impl> Peer { /// SyncOracle: are we connected to any peer? #[cfg(test)] - pub fn is_offline(&self) -> bool { - self.is_offline.load(std::sync::atomic::Ordering::Relaxed) + fn is_offline(&self) -> bool { + self.protocol_status.read().0 } /// SyncOracle: are we in the process of catching-up with the chain? #[cfg(test)] - pub fn is_major_syncing(&self) -> bool { - self.is_major_syncing.load(std::sync::atomic::Ordering::Relaxed) + fn is_major_syncing(&self) -> bool { + self.protocol_status.read().1 + } + + /// Get protocol status. + #[cfg(test)] + fn num_peers(&self) -> usize { + self.protocol_status.read().2 } /// Called on connection to other indicated peer. fn on_connect(&self, other: &Self) { - self.net_proto_channel.send_from_net(FromNetworkMsg::PeerConnected(other.peer_id.clone(), String::new())); + self.net_proto_channel.send_from_net(FromNetworkMsg::PeerConnected(other.peer_id.clone())); } /// Called on disconnect from other indicated peer. fn on_disconnect(&self, other: &Self) { - self.net_proto_channel.send_from_net(FromNetworkMsg::PeerDisconnected(other.peer_id.clone(), String::new())); + self.net_proto_channel.send_from_net(FromNetworkMsg::PeerDisconnected(other.peer_id.clone())); } /// Receive a message from another peer. Return a set of peers to disconnect. @@ -385,8 +604,8 @@ impl> Peer { /// Synchronize with import queue. #[cfg(any(test, feature = "test-helpers"))] - fn import_queue_sync(&self) { - self.import_queue.synchronize(); + pub fn import_queue_sync(&self) { + self.import_queue.lock().synchronize(); let _ = self.net_proto_channel.wait_sync(); } @@ -397,7 +616,7 @@ impl> Peer { /// Send block import notifications. fn send_import_notifications(&self) { - let info = self.client.info().expect("In-mem client does not fail"); + let info = self.client.info(); let mut best_hash = self.best_hash.lock(); match *best_hash { @@ -412,8 +631,8 @@ impl> Peer { } /// Send block finalization notifications. - pub fn send_finality_notifications(&self) { - let info = self.client.info().expect("In-mem client does not fail"); + fn send_finality_notifications(&self) { + let info = self.client.info(); let mut finalized_hash = self.finalized_hash.lock(); match *finalized_hash { @@ -423,7 +642,9 @@ impl> Peer { } let header = self.client.header(&BlockId::Hash(info.chain.finalized_hash)).unwrap().unwrap(); - self.net_proto_channel.send_from_client(ProtocolMsg::BlockFinalized(info.chain.finalized_hash, header.clone())); + self.net_proto_channel.send_from_client( + ProtocolMsg::BlockFinalized(info.chain.finalized_hash, header.clone()) + ); *finalized_hash = Some(info.chain.finalized_hash); } @@ -446,10 +667,6 @@ impl> Peer { ); } - pub fn consensus_gossip_collect_garbage_for_topic(&self, _topic: ::Hash) { - self.with_gossip(move |gossip, _| gossip.collect_garbage()) - } - /// access the underlying consensus gossip handler pub fn consensus_gossip_messages_for( &self, @@ -466,13 +683,14 @@ impl> Peer { /// Execute a closure with the consensus gossip. pub fn with_gossip(&self, f: F) - where F: FnOnce(&mut ConsensusGossip, &mut Context) + Send + 'static + where F: FnOnce(&mut ConsensusGossip, &mut dyn Context) + Send + 'static { self.net_proto_channel.send_from_client(ProtocolMsg::ExecuteWithGossip(Box::new(f))); } /// Announce a block to peers. - pub fn announce_block(&self, block: Hash) { + #[cfg(test)] + fn announce_block(&self, block: Hash) { self.net_proto_channel.send_from_client(ProtocolMsg::AnnounceBlock(block)); } @@ -484,20 +702,26 @@ impl> Peer { /// Add blocks to the peer -- edit the block before adding pub fn generate_blocks(&self, count: usize, origin: BlockOrigin, edit_block: F) -> H256 - where F: FnMut(BlockBuilder) -> Block + where F: FnMut(BlockBuilder) -> Block { - let best_hash = self.client.info().unwrap().chain.best_hash; + let best_hash = self.client.info().chain.best_hash; self.generate_blocks_at(BlockId::Hash(best_hash), count, origin, edit_block) } /// Add blocks to the peer -- edit the block before adding. The chain will /// start at the given block iD. - pub fn generate_blocks_at(&self, at: BlockId, count: usize, origin: BlockOrigin, mut edit_block: F) -> H256 - where F: FnMut(BlockBuilder) -> Block - { - let mut at = self.client.header(&at).unwrap().unwrap().hash(); + fn generate_blocks_at( + &self, + at: BlockId, + count: usize, + origin: BlockOrigin, + mut edit_block: F + ) -> H256 where F: FnMut(BlockBuilder) -> Block { + let full_client = self.client.as_full().expect("blocks could only be generated by full clients"); + let mut at = full_client.header(&at).unwrap().unwrap().hash(); for _ in 0..count { - let builder = self.client.new_block_at(&BlockId::Hash(at)).unwrap(); + let builder = full_client.new_block_at(&BlockId::Hash(at), Default::default() + ).unwrap(); let block = edit_block(builder); let hash = block.header.hash(); trace!( @@ -509,7 +733,7 @@ impl> Peer { ); let header = block.header.clone(); at = hash; - self.import_queue.import_blocks( + self.import_queue.lock().import_blocks( origin, vec![IncomingBlock { origin: None, @@ -529,7 +753,7 @@ impl> Peer { /// Push blocks to the peer (simplified: with or without a TX) pub fn push_blocks(&self, count: usize, with_tx: bool) -> H256 { - let best_hash = self.client.info().unwrap().chain.best_hash; + let best_hash = self.client.info().chain.best_hash; self.push_blocks_at(BlockId::Hash(best_hash), count, with_tx) } @@ -562,7 +786,7 @@ impl> Peer { } /// Get a reference to the client. - pub fn client(&self) -> &Arc { + pub fn client(&self) -> &PeersClient { &self.client } } @@ -598,7 +822,7 @@ pub trait TestNetFactory: Sized { /// These two need to be implemented! fn from_config(config: &ProtocolConfig) -> Self; - fn make_verifier(&self, client: Arc, config: &ProtocolConfig) -> Arc; + fn make_verifier(&self, client: PeersClient, config: &ProtocolConfig) -> Arc; /// Get reference to peer. fn peer(&self, i: usize) -> &Peer; @@ -609,16 +833,32 @@ pub trait TestNetFactory: Sized { fn set_started(&mut self, now: bool); /// Get custom block import handle for fresh client, along with peer data. - fn make_block_import(&self, client: Arc) - -> (SharedBlockImport, Option>, Self::PeerData) + fn make_block_import(&self, client: PeersClient) + -> ( + SharedBlockImport, + Option>, + Option>, + Option>, + Self::PeerData, + ) { - (client, None, Default::default()) + (client.as_block_import(), None, None, None, Default::default()) + } + + /// Get finality proof provider (if supported). + fn make_finality_proof_provider(&self, _client: PeersClient) -> Option>> { + None } fn default_config() -> ProtocolConfig { ProtocolConfig::default() } + /// Must return true if the testnet is going to be used from within a tokio context. + fn uses_tokio(&self) -> bool { + false + } + /// Create new test network with this many peers. fn new(n: usize) -> Self { trace!(target: "test_network", "Creating test network"); @@ -627,100 +867,281 @@ pub trait TestNetFactory: Sized { for i in 0..n { trace!(target: "test_network", "Adding peer {}", i); - net.add_peer(&config); + net.add_full_peer(&config); } net } - /// Add a peer. - fn add_peer(&mut self, config: &ProtocolConfig) { - let client = Arc::new(test_client::new()); - let tx_pool = Arc::new(EmptyTransactionPool); - let verifier = self.make_verifier(client.clone(), config); - let (block_import, justification_import, data) = self.make_block_import(client.clone()); - let (network_sender, network_port) = network_channel(); - - let import_queue = Box::new(BasicQueue::new(verifier, block_import, justification_import)); - let is_offline = Arc::new(AtomicBool::new(true)); - let is_major_syncing = Arc::new(AtomicBool::new(false)); - let specialization = self::SpecializationFactory::create(); - let peers: Arc>>> = Arc::new(Default::default()); - - let (network_to_protocol_sender, mut network_to_protocol_rx) = mpsc::unbounded(); - - let (mut protocol, protocol_sender) = Protocol::new( - peers.clone(), - network_sender.clone(), - config.clone(), - client.clone(), - None, - tx_pool, - specialization, - ).unwrap(); - - let is_offline2 = is_offline.clone(); - let is_major_syncing2 = is_major_syncing.clone(); - let import_queue2 = import_queue.clone(); - + /// Add created peer. + fn add_peer( + &mut self, + protocol_status: Arc>, + import_queue: Arc>>>, + tx_pool: EmptyTransactionPool, + finality_proof_provider: Option>>, + mut protocol: Protocol, + protocol_sender: mpsc::UnboundedSender>, + network_to_protocol_sender: mpsc::UnboundedSender>, + network_sender: mpsc::UnboundedSender>, + mut network_to_protocol_rx: mpsc::UnboundedReceiver>, + mut protocol_rx: mpsc::UnboundedReceiver>, + peer: Arc>, + ) { std::thread::spawn(move || { + // Implementation of `protocol::NetworkOut` using the available local variables. + struct Ctxt<'a, B: BlockT>(&'a mpsc::UnboundedSender>); + impl<'a, B: BlockT> NetworkOut for Ctxt<'a, B> { + fn report_peer(&mut self, who: PeerId, reputation: i32) { + let _ = self.0.unbounded_send(NetworkMsg::ReportPeer(who, reputation)); + } + fn disconnect_peer(&mut self, who: PeerId) { + let _ = self.0.unbounded_send(NetworkMsg::DisconnectPeer(who)); + } + fn send_message(&mut self, who: PeerId, message: Message) { + let _ = self.0.unbounded_send(NetworkMsg::Outgoing(who, message)); + } + } + tokio::runtime::current_thread::run(futures::future::poll_fn(move || { + import_queue.lock().poll_actions(&mut TestLink::new( + protocol_sender.clone(), + network_to_protocol_sender.clone(), + network_sender.clone(), + )); + while let Async::Ready(msg) = network_to_protocol_rx.poll().unwrap() { let outcome = match msg { - Some(FromNetworkMsg::PeerConnected(peer_id, debug_msg)) => { - protocol.on_peer_connected(peer_id, debug_msg); + Some(FromNetworkMsg::PeerConnected(peer_id)) => { + protocol.on_peer_connected(&mut Ctxt(&network_sender), peer_id); CustomMessageOutcome::None }, - Some(FromNetworkMsg::PeerDisconnected(peer_id, debug_msg)) => { - protocol.on_peer_disconnected(peer_id, debug_msg); + Some(FromNetworkMsg::PeerDisconnected(peer_id)) => { + protocol.on_peer_disconnected(&mut Ctxt(&network_sender), peer_id); CustomMessageOutcome::None }, Some(FromNetworkMsg::CustomMessage(peer_id, message)) => - protocol.on_custom_message(peer_id, message), + protocol.on_custom_message( + &mut Ctxt(&network_sender), + &tx_pool, + peer_id, + message, + finality_proof_provider.as_ref().map(|p| &**p) + ), Some(FromNetworkMsg::Synchronize) => { - protocol.synchronize(); + let _ = network_sender.unbounded_send(NetworkMsg::Synchronized); CustomMessageOutcome::None }, - None => return Ok(Async::Ready(())) + None => return Ok(Async::Ready(())), }; match outcome { CustomMessageOutcome::BlockImport(origin, blocks) => - import_queue2.import_blocks(origin, blocks), + import_queue.lock().import_blocks(origin, blocks), CustomMessageOutcome::JustificationImport(origin, hash, nb, justification) => - import_queue2.import_justification(origin, hash, nb, justification), + import_queue.lock().import_justification(origin, hash, nb, justification), + CustomMessageOutcome::FinalityProofImport(origin, hash, nb, proof) => + import_queue.lock().import_finality_proof(origin, hash, nb, proof), CustomMessageOutcome::None => {} } } - if let Async::Ready(_) = protocol.poll().unwrap() { - return Ok(Async::Ready(())) + loop { + let msg = match protocol_rx.poll() { + Ok(Async::Ready(Some(msg))) => msg, + Ok(Async::Ready(None)) | Err(_) => return Ok(Async::Ready(())), + Ok(Async::NotReady) => break, + }; + + match msg { + ProtocolMsg::BlockImported(hash, header) => + protocol.on_block_imported(&mut Ctxt(&network_sender), hash, &header), + ProtocolMsg::BlockFinalized(hash, header) => + protocol.on_block_finalized(&mut Ctxt(&network_sender), hash, &header), + ProtocolMsg::ExecuteWithSpec(task) => { + let mut ctxt = Ctxt(&network_sender); + let (mut context, spec) = protocol.specialization_lock(&mut ctxt); + task.call_box(spec, &mut context); + }, + ProtocolMsg::ExecuteWithGossip(task) => { + let mut ctxt = Ctxt(&network_sender); + let (mut context, gossip) = protocol.consensus_gossip_lock(&mut ctxt); + task.call_box(gossip, &mut context); + } + ProtocolMsg::GossipConsensusMessage(topic, engine_id, message, recipient) => + protocol.gossip_consensus_message( + &mut Ctxt(&network_sender), + topic, + engine_id, + message, + recipient + ), + ProtocolMsg::BlocksProcessed(hashes, has_error) => + protocol.blocks_processed(&mut Ctxt(&network_sender), hashes, has_error), + ProtocolMsg::RestartSync => + protocol.restart(&mut Ctxt(&network_sender)), + ProtocolMsg::AnnounceBlock(hash) => + protocol.announce_block(&mut Ctxt(&network_sender), hash), + ProtocolMsg::BlockImportedSync(hash, number) => + protocol.block_imported(&hash, number), + ProtocolMsg::ClearJustificationRequests => + protocol.clear_justification_requests(), + ProtocolMsg::RequestJustification(hash, number) => + protocol.request_justification(&mut Ctxt(&network_sender), &hash, number), + ProtocolMsg::JustificationImportResult(hash, number, success) => + protocol.justification_import_result(hash, number, success), + ProtocolMsg::SetFinalityProofRequestBuilder(builder) => + protocol.set_finality_proof_request_builder(builder), + ProtocolMsg::RequestFinalityProof(hash, number) => + protocol.request_finality_proof(&mut Ctxt(&network_sender), &hash, number), + ProtocolMsg::FinalityProofImportResult(requested_block, finalziation_result) => + protocol.finality_proof_import_result(requested_block, finalziation_result), + ProtocolMsg::PropagateExtrinsics => + protocol.propagate_extrinsics(&mut Ctxt(&network_sender), &tx_pool), + #[cfg(any(test, feature = "test-helpers"))] + ProtocolMsg::Tick => protocol.tick(&mut Ctxt(&network_sender)), + #[cfg(any(test, feature = "test-helpers"))] + ProtocolMsg::Synchronize => { + trace!(target: "sync", "handle_client_msg: received Synchronize msg"); + let _ = network_sender.unbounded_send(NetworkMsg::Synchronized); + } + } } - is_offline2.store(protocol.is_offline(), Ordering::Relaxed); - is_major_syncing2.store(protocol.is_major_syncing(), Ordering::Relaxed); + if let Async::Ready(_) = protocol.poll(&mut Ctxt(&network_sender), &tx_pool).unwrap() { + return Ok(Async::Ready(())) + } + *protocol_status.write() = ( + protocol.num_connected_peers() == 0, + protocol.sync_state() == SyncState::Downloading, + protocol.num_connected_peers() + ); Ok(Async::NotReady) })); }); - let peer = Arc::new(Peer::new( - is_offline, - is_major_syncing, - peers, - client, - import_queue, - network_to_protocol_sender, - protocol_sender, - network_sender, - network_port, - data, - )); + if self.started() { + peer.start(); + self.peers().iter().for_each(|other| { + other.on_connect(&*peer); + peer.on_connect(other); + }); + } self.mut_peers(|peers| { peers.push(peer) }); } + /// Add a full peer. + fn add_full_peer(&mut self, config: &ProtocolConfig) { + let client = Arc::new(test_client::new()); + let verifier = self.make_verifier(PeersClient::Full(client.clone()), config); + let (block_import, justification_import, finality_proof_import, finality_proof_request_builder, data) + = self.make_block_import(PeersClient::Full(client.clone())); + let (network_sender, network_port) = mpsc::unbounded(); + + let import_queue = Arc::new(Mutex::new(Box::new(BasicQueue::new( + verifier, + block_import, + justification_import, + finality_proof_import, + finality_proof_request_builder, + )))); + let specialization = self::SpecializationFactory::create(); + + let (network_to_protocol_sender, network_to_protocol_rx) = mpsc::unbounded(); + let (protocol_sender, protocol_rx) = mpsc::unbounded(); + + let protocol = Protocol::new( + config.clone(), + client.clone(), + Arc::new(AlwaysBadChecker), + specialization, + ).unwrap(); + + let protocol_status = Arc::new(RwLock::new((true, false, 0))); + self.add_peer( + protocol_status.clone(), + import_queue.clone(), + EmptyTransactionPool, + self.make_finality_proof_provider(PeersClient::Full(client.clone())), + protocol, + protocol_sender.clone(), + network_to_protocol_sender.clone(), + network_sender.clone(), + network_to_protocol_rx, + protocol_rx, + Arc::new(Peer::new( + protocol_status, + PeersClient::Full(client), + import_queue, + self.uses_tokio(), + network_to_protocol_sender, + protocol_sender, + network_sender, + network_port, + data, + )), + ); + } + + /// Add a light peer. + fn add_light_peer(&mut self, config: &ProtocolConfig) { + let mut config = config.clone(); + config.roles = Roles::LIGHT; + + let client = Arc::new(test_client::new_light()); + let verifier = self.make_verifier(PeersClient::Light(client.clone()), &config); + let (block_import, justification_import, finality_proof_import, finality_proof_request_builder, data) + = self.make_block_import(PeersClient::Light(client.clone())); + let (network_sender, network_port) = mpsc::unbounded(); + + let import_queue = Arc::new(Mutex::new(Box::new(BasicQueue::new( + verifier, + block_import, + justification_import, + finality_proof_import, + finality_proof_request_builder, + )))); + let specialization = self::SpecializationFactory::create(); + + let (network_to_protocol_sender, network_to_protocol_rx) = mpsc::unbounded(); + let (protocol_sender, protocol_rx) = mpsc::unbounded(); + + let protocol = Protocol::new( + config, + client.clone(), + Arc::new(AlwaysBadChecker), + specialization, + ).unwrap(); + + let protocol_status = Arc::new(RwLock::new((true, false, 0))); + self.add_peer( + protocol_status.clone(), + import_queue.clone(), + EmptyTransactionPool, + self.make_finality_proof_provider(PeersClient::Light(client.clone())), + protocol, + protocol_sender.clone(), + network_to_protocol_sender.clone(), + network_sender.clone(), + network_to_protocol_rx, + protocol_rx, + Arc::new(Peer::new( + protocol_status, + PeersClient::Light(client), + import_queue, + self.uses_tokio(), + network_to_protocol_sender, + protocol_sender, + network_sender, + network_port, + data, + )), + ); + } + /// Start network. fn start(&mut self) { if self.started() { @@ -832,6 +1253,11 @@ pub trait TestNetFactory: Sized { self.route_single(true, None, &|_| true); } + /// Maintain sync for a peer. + fn tick_peer(&mut self, i: usize) { + self.peers()[i].sync_step(); + } + /// Deliver pending messages until there are no more. fn sync(&mut self) { self.sync_with(true, None) @@ -866,7 +1292,7 @@ impl TestNetFactory for TestNet { } } - fn make_verifier(&self, _client: Arc, _config: &ProtocolConfig) + fn make_verifier(&self, _client: PeersClient, _config: &ProtocolConfig) -> Arc { Arc::new(PassThroughVerifier(false)) @@ -893,7 +1319,7 @@ impl TestNetFactory for TestNet { } } -pub struct ForceFinalized(Arc); +pub struct ForceFinalized(PeersClient); impl JustificationImport for ForceFinalized { type Error = ConsensusError; @@ -905,7 +1331,7 @@ impl JustificationImport for ForceFinalized { justification: Justification, ) -> Result<(), Self::Error> { self.0.finalize_block(BlockId::Hash(hash), Some(justification), true) - .map_err(|_| ConsensusErrorKind::InvalidJustification.into()) + .map_err(|_| ConsensusError::InvalidJustification.into()) } } @@ -920,7 +1346,7 @@ impl TestNetFactory for JustificationTestNet { JustificationTestNet(TestNet::from_config(config)) } - fn make_verifier(&self, client: Arc, config: &ProtocolConfig) + fn make_verifier(&self, client: PeersClient, config: &ProtocolConfig) -> Arc { self.0.make_verifier(client, config) @@ -934,7 +1360,7 @@ impl TestNetFactory for JustificationTestNet { self.0.peers() } - fn mut_peers>>)>(&mut self, closure: F ) { + fn mut_peers>>)>(&mut self, closure: F) { self.0.mut_peers(closure) } @@ -946,9 +1372,15 @@ impl TestNetFactory for JustificationTestNet { self.0.set_started(new) } - fn make_block_import(&self, client: Arc) - -> (SharedBlockImport, Option>, Self::PeerData) + fn make_block_import(&self, client: PeersClient) + -> ( + SharedBlockImport, + Option>, + Option>, + Option>, + Self::PeerData, + ) { - (client.clone(), Some(Arc::new(ForceFinalized(client))), Default::default()) + (client.as_block_import(), Some(Arc::new(ForceFinalized(client))), None, None, Default::default()) } } diff --git a/core/network/src/test/sync.rs b/core/network/src/test/sync.rs index 6d582d858fe17dd7174378054d6d27a13d39ad73..15b866c168b45baf29ecded770db553f98e439c9 100644 --- a/core/network/src/test/sync.rs +++ b/core/network/src/test/sync.rs @@ -14,9 +14,9 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use client::backend::Backend; -use client::blockchain::HeaderBackend as BlockchainHeaderBackend; +use client::{backend::Backend, blockchain::HeaderBackend}; use crate::config::Roles; +use crate::message; use consensus::BlockOrigin; use std::collections::HashSet; use super::*; @@ -34,8 +34,8 @@ fn test_ancestor_search_when_common_is(n: usize) { net.peer(2).push_blocks(100, false); net.sync(); - assert!(net.peer(0).client.backend().as_in_memory().blockchain() - .canon_equals_to(net.peer(1).client.backend().as_in_memory().blockchain())); + assert!(net.peer(0).client.as_in_memory_backend().blockchain() + .canon_equals_to(net.peer(1).client.as_in_memory_backend().blockchain())); } #[test] @@ -45,7 +45,7 @@ fn sync_peers_works() { net.sync(); for peer in 0..3 { // Assert peers is up to date. - assert_eq!(net.peer(peer).peers.read().len(), 2); + assert_eq!(net.peer(peer).num_peers(), 2); // And then disconnect. for other in 0..3 { if other != peer { @@ -56,8 +56,7 @@ fn sync_peers_works() { net.sync(); // Now peers are disconnected. for peer in 0..3 { - let peers = net.peer(peer).peers.read(); - assert_eq!(peers.len(), 0); + assert_eq!(net.peer(peer).num_peers(), 0); } } @@ -130,8 +129,8 @@ fn sync_from_two_peers_works() { net.peer(1).push_blocks(100, false); net.peer(2).push_blocks(100, false); net.sync(); - assert!(net.peer(0).client.backend().as_in_memory().blockchain() - .equals_to(net.peer(1).client.backend().as_in_memory().blockchain())); + assert!(net.peer(0).client.as_in_memory_backend().blockchain() + .equals_to(net.peer(1).client.as_in_memory_backend().blockchain())); assert!(!net.peer(0).is_major_syncing()); } @@ -143,8 +142,8 @@ fn sync_from_two_peers_with_ancestry_search_works() { net.peer(1).push_blocks(100, false); net.peer(2).push_blocks(100, false); net.sync(); - assert!(net.peer(0).client.backend().as_in_memory().blockchain() - .canon_equals_to(net.peer(1).client.backend().as_in_memory().blockchain())); + assert!(net.peer(0).client.as_in_memory_backend().blockchain() + .canon_equals_to(net.peer(1).client.as_in_memory_backend().blockchain())); } #[test] @@ -157,8 +156,8 @@ fn ancestry_search_works_when_backoff_is_one() { net.peer(2).push_blocks(2, false); net.sync(); - assert!(net.peer(0).client.backend().as_in_memory().blockchain() - .canon_equals_to(net.peer(1).client.backend().as_in_memory().blockchain())); + assert!(net.peer(0).client.as_in_memory_backend().blockchain() + .canon_equals_to(net.peer(1).client.as_in_memory_backend().blockchain())); } #[test] @@ -171,8 +170,8 @@ fn ancestry_search_works_when_ancestor_is_genesis() { net.peer(2).push_blocks(100, false); net.sync(); - assert!(net.peer(0).client.backend().as_in_memory().blockchain() - .canon_equals_to(net.peer(1).client.backend().as_in_memory().blockchain())); + assert!(net.peer(0).client.as_in_memory_backend().blockchain() + .canon_equals_to(net.peer(1).client.as_in_memory_backend().blockchain())); } #[test] @@ -195,8 +194,8 @@ fn sync_long_chain_works() { let mut net = TestNet::new(2); net.peer(1).push_blocks(500, false); net.sync(); - assert!(net.peer(0).client.backend().as_in_memory().blockchain() - .equals_to(net.peer(1).client.backend().as_in_memory().blockchain())); + assert!(net.peer(0).client.as_in_memory_backend().blockchain() + .equals_to(net.peer(1).client.as_in_memory_backend().blockchain())); } #[test] @@ -206,8 +205,8 @@ fn sync_no_common_longer_chain_fails() { net.peer(0).push_blocks(20, true); net.peer(1).push_blocks(20, false); net.sync(); - assert!(!net.peer(0).client.backend().as_in_memory().blockchain() - .canon_equals_to(net.peer(1).client.backend().as_in_memory().blockchain())); + assert!(!net.peer(0).client.as_in_memory_backend().blockchain() + .canon_equals_to(net.peer(1).client.as_in_memory_backend().blockchain())); } #[test] @@ -285,11 +284,11 @@ fn sync_after_fork_works() { net.peer(2).push_blocks(1, false); // peer 1 has the best chain - let peer1_chain = net.peer(1).client.backend().as_in_memory().blockchain().clone(); + let peer1_chain = net.peer(1).client.as_in_memory_backend().blockchain().clone(); net.sync(); - assert!(net.peer(0).client.backend().as_in_memory().blockchain().canon_equals_to(&peer1_chain)); - assert!(net.peer(1).client.backend().as_in_memory().blockchain().canon_equals_to(&peer1_chain)); - assert!(net.peer(2).client.backend().as_in_memory().blockchain().canon_equals_to(&peer1_chain)); + assert!(net.peer(0).client.as_in_memory_backend().blockchain().canon_equals_to(&peer1_chain)); + assert!(net.peer(1).client.as_in_memory_backend().blockchain().canon_equals_to(&peer1_chain)); + assert!(net.peer(2).client.as_in_memory_backend().blockchain().canon_equals_to(&peer1_chain)); } #[test] @@ -305,8 +304,8 @@ fn syncs_all_forks() { net.sync(); // Check that all peers have all of the blocks. - assert_eq!(9, net.peer(0).client.backend().as_in_memory().blockchain().blocks_count()); - assert_eq!(9, net.peer(1).client.backend().as_in_memory().blockchain().blocks_count()); + assert_eq!(9, net.peer(0).client.as_in_memory_backend().blockchain().blocks_count()); + assert_eq!(9, net.peer(1).client.as_in_memory_backend().blockchain().blocks_count()); } #[test] @@ -320,11 +319,11 @@ fn own_blocks_are_announced() { net.peer(0).on_block_imported(header.hash(), &header); net.sync(); - assert_eq!(net.peer(0).client.backend().blockchain().info().unwrap().best_number, 1); - assert_eq!(net.peer(1).client.backend().blockchain().info().unwrap().best_number, 1); - let peer0_chain = net.peer(0).client.backend().as_in_memory().blockchain().clone(); - assert!(net.peer(1).client.backend().as_in_memory().blockchain().canon_equals_to(&peer0_chain)); - assert!(net.peer(2).client.backend().as_in_memory().blockchain().canon_equals_to(&peer0_chain)); + assert_eq!(net.peer(0).client.as_in_memory_backend().blockchain().info().best_number, 1); + assert_eq!(net.peer(1).client.as_in_memory_backend().blockchain().info().best_number, 1); + let peer0_chain = net.peer(0).client.as_in_memory_backend().blockchain().clone(); + assert!(net.peer(1).client.as_in_memory_backend().blockchain().canon_equals_to(&peer0_chain)); + assert!(net.peer(2).client.as_in_memory_backend().blockchain().canon_equals_to(&peer0_chain)); } #[test] @@ -336,9 +335,9 @@ fn blocks_are_not_announced_by_light_nodes() { // light peer1 is connected to full peer2 let mut light_config = ProtocolConfig::default(); light_config.roles = Roles::LIGHT; - net.add_peer(&ProtocolConfig::default()); - net.add_peer(&light_config); - net.add_peer(&ProtocolConfig::default()); + net.add_full_peer(&ProtocolConfig::default()); + net.add_full_peer(&light_config); + net.add_full_peer(&ProtocolConfig::default()); net.peer(0).push_blocks(1, false); net.peer(0).start(); @@ -356,9 +355,9 @@ fn blocks_are_not_announced_by_light_nodes() { // peer 0 has the best chain // peer 1 has the best chain // peer 2 has genesis-chain only - assert_eq!(net.peer(0).client.backend().blockchain().info().unwrap().best_number, 1); - assert_eq!(net.peer(1).client.backend().blockchain().info().unwrap().best_number, 1); - assert_eq!(net.peer(2).client.backend().blockchain().info().unwrap().best_number, 0); + assert_eq!(net.peer(0).client.info().chain.best_number, 1); + assert_eq!(net.peer(1).client.info().chain.best_number, 1); + assert_eq!(net.peer(2).client.info().chain.best_number, 0); } #[test] @@ -371,13 +370,13 @@ fn can_sync_small_non_best_forks() { // small fork + reorg on peer 1. net.peer(0).push_blocks_at(BlockId::Number(30), 2, true); - let small_hash = net.peer(0).client().info().unwrap().chain.best_hash; + let small_hash = net.peer(0).client().info().chain.best_hash; net.peer(0).push_blocks_at(BlockId::Number(30), 10, false); - assert_eq!(net.peer(0).client().info().unwrap().chain.best_number, 40); + assert_eq!(net.peer(0).client().info().chain.best_number, 40); // peer 1 only ever had the long fork. net.peer(1).push_blocks(10, false); - assert_eq!(net.peer(1).client().info().unwrap().chain.best_number, 40); + assert_eq!(net.peer(1).client().info().chain.best_number, 40); assert!(net.peer(0).client().header(&BlockId::Hash(small_hash)).unwrap().is_some()); assert!(net.peer(1).client().header(&BlockId::Hash(small_hash)).unwrap().is_none()); @@ -386,7 +385,7 @@ fn can_sync_small_non_best_forks() { // synchronization: 0 synced to longer chain and 1 didn't sync to small chain. - assert_eq!(net.peer(0).client().info().unwrap().chain.best_number, 40); + assert_eq!(net.peer(0).client().info().chain.best_number, 40); assert!(net.peer(0).client().header(&BlockId::Hash(small_hash)).unwrap().is_some()); assert!(!net.peer(1).client().header(&BlockId::Hash(small_hash)).unwrap().is_some()); @@ -399,3 +398,89 @@ fn can_sync_small_non_best_forks() { assert!(net.peer(0).client().header(&BlockId::Hash(small_hash)).unwrap().is_some()); assert!(net.peer(1).client().header(&BlockId::Hash(small_hash)).unwrap().is_some()); } + +#[test] +fn can_not_sync_from_light_peer() { + let _ = ::env_logger::try_init(); + + // given the network with 1 full nodes (#0) and 1 light node (#1) + let mut net = TestNet::new(1); + net.add_light_peer(&Default::default()); + + // generate some blocks on #0 + net.peer(0).push_blocks(1, false); + + // and let the light client sync from this node + // (mind the #1 is disconnected && not syncing) + net.sync(); + + // ensure #0 && #1 have the same best block + let full0_info = net.peer(0).client.info().chain; + let light_info = net.peer(1).client.info().chain; + assert_eq!(full0_info.best_number, 1); + assert_eq!(light_info.best_number, 1); + assert_eq!(light_info.best_hash, full0_info.best_hash); + + // add new full client (#2) && sync without #0 + net.add_full_peer(&Default::default()); + net.peer(1).on_connect(net.peer(2)); + net.peer(2).on_connect(net.peer(1)); + net.peer(1).announce_block(light_info.best_hash); + net.sync_with(true, Some(vec![0].into_iter().collect())); + + // ensure that the #2 has failed to sync block #1 + assert_eq!(net.peer(2).client.info().chain.best_number, 0); + // and that the #1 is still connected to #2 + // (because #2 has not tried to fetch block data from the #1 light node) + assert_eq!(net.peer(1).num_peers(), 2); + + // and now try to fetch block data from light peer #1 + // (this should result in disconnect) + net.peer(1).receive_message( + &net.peer(2).peer_id, + message::generic::Message::BlockRequest(message::generic::BlockRequest { + id: 0, + fields: message::BlockAttributes::HEADER, + from: message::FromBlock::Hash(light_info.best_hash), + to: None, + direction: message::Direction::Ascending, + max: Some(1), + }), + ); + net.sync(); + // check that light #1 has disconnected from #2 + assert_eq!(net.peer(1).num_peers(), 1); +} + +#[test] +fn light_peer_imports_header_from_announce() { + let _ = ::env_logger::try_init(); + + fn import_with_announce(net: &mut TestNet, hash: H256) { + let header = net.peer(0).client().header(&BlockId::Hash(hash)).unwrap().unwrap(); + net.peer(1).receive_message( + &net.peer(0).peer_id, + message::generic::Message::BlockAnnounce(message::generic::BlockAnnounce { + header, + }), + ); + + net.peer(1).import_queue_sync(); + assert!(net.peer(1).client().header(&BlockId::Hash(hash)).unwrap().is_some()); + } + + // given the network with 1 full nodes (#0) and 1 light node (#1) + let mut net = TestNet::new(1); + net.add_light_peer(&Default::default()); + + // let them connect to each other + net.sync(); + + // check that NEW block is imported from announce message + let new_hash = net.peer(0).push_blocks(1, false); + import_with_announce(&mut net, new_hash); + + // check that KNOWN STALE block is imported from announce message + let known_stale_hash = net.peer(0).push_blocks_at(BlockId::Number(0), 1, true); + import_with_announce(&mut net, known_stale_hash); +} diff --git a/core/network/src/transport.rs b/core/network/src/transport.rs new file mode 100644 index 0000000000000000000000000000000000000000..ac6cc633a8c017c60bafb47d8f8db14258664ec7 --- /dev/null +++ b/core/network/src/transport.rs @@ -0,0 +1,119 @@ +// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +use futures::prelude::*; +use libp2p::{ + InboundUpgradeExt, OutboundUpgradeExt, PeerId, Transport, + mplex, identity, secio, yamux, bandwidth, wasm_ext +}; +#[cfg(not(target_os = "unknown"))] +use libp2p::{tcp, dns, websocket, noise}; +#[cfg(not(target_os = "unknown"))] +use libp2p::core::{upgrade, either::EitherError, either::EitherOutput}; +use libp2p::core::{self, transport::boxed::Boxed, transport::OptionalTransport, muxing::StreamMuxerBox}; +use std::{io, sync::Arc, time::Duration, usize}; + +pub use self::bandwidth::BandwidthSinks; + +/// Builds the transport that serves as a common ground for all connections. +/// +/// Returns a `BandwidthSinks` object that allows querying the average bandwidth produced by all +/// the connections spawned with this transport. +pub fn build_transport( + keypair: identity::Keypair, + wasm_external_transport: Option +) -> (Boxed<(PeerId, StreamMuxerBox), io::Error>, Arc) { + // Build configuration objects for encryption mechanisms. + #[cfg(not(target_os = "unknown"))] + let noise_config = { + let noise_keypair = noise::Keypair::new().into_authentic(&keypair) + // For more information about this panic, see in "On the Importance of Checking + // Cryptographic Protocols for Faults" by Dan Boneh, Richard A. DeMillo, + // and Richard J. Lipton. + .expect("can only fail in case of a hardware bug; since this signing is performed only \ + once and at initialization, we're taking the bet that the inconvenience of a very \ + rare panic here is basically zero"); + noise::NoiseConfig::ix(noise_keypair) + }; + let secio_config = secio::SecioConfig::new(keypair); + + // Build configuration objects for multiplexing mechanisms. + let mut mplex_config = mplex::MplexConfig::new(); + mplex_config.max_buffer_len_behaviour(mplex::MaxBufferBehaviour::Block); + mplex_config.max_buffer_len(usize::MAX); + let yamux_config = yamux::Config::default(); + + // Build the base layer of the transport. + let transport = if let Some(t) = wasm_external_transport { + OptionalTransport::some(t) + } else { + OptionalTransport::none() + }; + #[cfg(not(target_os = "unknown"))] + let transport = { + let desktop_trans = tcp::TcpConfig::new(); + let desktop_trans = websocket::WsConfig::new(desktop_trans.clone()) + .or_transport(desktop_trans); + transport.or_transport(dns::DnsConfig::new(desktop_trans)) + }; + let (transport, sinks) = bandwidth::BandwidthLogging::new(transport, Duration::from_secs(5)); + + // Encryption + + // For non-WASM, we support both secio and noise. + #[cfg(not(target_os = "unknown"))] + let transport = transport.and_then(move |stream, endpoint| { + let upgrade = core::upgrade::SelectUpgrade::new(noise_config, secio_config); + core::upgrade::apply(stream, upgrade, endpoint) + .and_then(|out| match out { + // We negotiated noise + EitherOutput::First((remote_id, out)) => { + let remote_key = match remote_id { + noise::RemoteIdentity::IdentityKey(key) => key, + _ => return Err(upgrade::UpgradeError::Apply(EitherError::A(noise::NoiseError::InvalidKey))) + }; + Ok((EitherOutput::First(out), remote_key.into_peer_id())) + } + // We negotiated secio + EitherOutput::Second(out) => + Ok((EitherOutput::Second(out.stream), out.remote_key.into_peer_id())) + }) + }); + + // For WASM, we only support secio for now. + #[cfg(target_os = "unknown")] + let transport = transport.and_then(move |stream, endpoint| { + core::upgrade::apply(stream, secio_config, endpoint) + .and_then(|out| Ok((out.stream, out.remote_key.into_peer_id()))) + }); + + // Multiplexing + let transport = transport.and_then(move |(stream, peer_id), endpoint| { + let peer_id2 = peer_id.clone(); + let upgrade = core::upgrade::SelectUpgrade::new(yamux_config, mplex_config) + .map_inbound(move |muxer| (peer_id, muxer)) + .map_outbound(move |muxer| (peer_id2, muxer)); + + core::upgrade::apply(stream, upgrade, endpoint) + .map(|(id, muxer)| (id, core::muxing::StreamMuxerBox::new(muxer))) + }) + + .with_timeout(Duration::from_secs(20)) + .map_err(|err| io::Error::new(io::ErrorKind::Other, err)) + .boxed(); + + (transport, sinks) +} diff --git a/core/offchain/Cargo.toml b/core/offchain/Cargo.toml index 241edfea9f4d1e8e108463fb748152f79a043009..a7b94bdc567e81c797dafe055d85a8d161e0393f 100644 --- a/core/offchain/Cargo.toml +++ b/core/offchain/Cargo.toml @@ -10,10 +10,10 @@ edition = "2018" client = { package = "substrate-client", path = "../../core/client" } consensus = { package = "substrate-consensus-common", path = "../../core/consensus/common" } futures = "0.1.25" -inherents = { package = "substrate-inherents", path = "../../core/inherents" } log = "0.4" offchain-primitives = { package = "substrate-offchain-primitives", path = "./primitives" } parity-codec = { version = "3.3", features = ["derive"] } +parking_lot = "0.8.0" primitives = { package = "substrate-primitives", path = "../../core/primitives" } runtime_primitives = { package = "sr-primitives", path = "../../core/sr-primitives" } tokio = "0.1.7" @@ -21,7 +21,7 @@ transaction_pool = { package = "substrate-transaction-pool", path = "../../core/ [dev-dependencies] env_logger = "0.6" -test_client = { package = "substrate-test-client", path = "../../core/test-client" } +test-client = { package = "substrate-test-runtime-client", path = "../../core/test-runtime/client" } [features] default = [] diff --git a/core/offchain/src/api.rs b/core/offchain/src/api.rs index 5d2a636be3924d82a18453750ae94130fdc95aa5..d2c7630c249d8adaebd770899b5d0a802e85f5c6 100644 --- a/core/offchain/src/api.rs +++ b/core/offchain/src/api.rs @@ -16,10 +16,13 @@ use std::sync::Arc; use futures::{Stream, Future, sync::mpsc}; -use inherents::pool::InherentsPool; -use log::{info, debug, warn}; +use log::{info, debug, warn, error}; use parity_codec::Decode; -use primitives::OffchainExt; +use primitives::offchain::{ + Timestamp, HttpRequestId, HttpRequestStatus, HttpError, + Externalities as OffchainExt, + CryptoKind, CryptoKeyId, +}; use runtime_primitives::{ generic::BlockId, traits::{self, Extrinsic}, @@ -36,9 +39,122 @@ enum ExtMessage { /// NOTE this is done to prevent recursive calls into the runtime (which are not supported currently). pub(crate) struct AsyncApi(mpsc::UnboundedSender); +fn unavailable_yet(name: &str) -> R { + error!("This {:?} API is not available for offchain workers yet. Follow + https://github.com/paritytech/substrate/issues/1458 for details", name); + Default::default() +} + impl OffchainExt for AsyncApi { - fn submit_extrinsic(&mut self, ext: Vec) { - let _ = self.0.unbounded_send(ExtMessage::SubmitExtrinsic(ext)); + fn submit_transaction(&mut self, ext: Vec) -> Result<(), ()> { + self.0.unbounded_send(ExtMessage::SubmitExtrinsic(ext)) + .map(|_| ()) + .map_err(|_| ()) + } + + fn new_crypto_key(&mut self, _crypto: CryptoKind) -> Result { + unavailable_yet::<()>("new_crypto_key"); + Err(()) + } + + fn encrypt(&mut self, _key: Option, _data: &[u8]) -> Result, ()> { + unavailable_yet::<()>("encrypt"); + Err(()) + } + + fn decrypt(&mut self, _key: Option, _data: &[u8]) -> Result, ()> { + unavailable_yet::<()>("decrypt"); + Err(()) + } + + fn sign(&mut self, _key: Option, _data: &[u8]) -> Result, ()> { + unavailable_yet::<()>("sign"); + Err(()) + } + + fn verify(&mut self, _key: Option, _msg: &[u8], _signature: &[u8]) -> Result { + unavailable_yet::<()>("verify"); + Err(()) + } + + fn timestamp(&mut self) -> Timestamp { + unavailable_yet("timestamp") + } + + fn sleep_until(&mut self, _deadline: Timestamp) { + unavailable_yet::<()>("sleep_until") + } + + fn random_seed(&mut self) -> [u8; 32] { + unavailable_yet("random_seed") + } + + fn local_storage_set(&mut self, _key: &[u8], _value: &[u8]) { + unavailable_yet("local_storage_set") + } + + fn local_storage_compare_and_set(&mut self, _key: &[u8], _old_value: &[u8], _new_value: &[u8]) { + unavailable_yet("local_storage_compare_and_set") + } + + fn local_storage_get(&mut self, _key: &[u8]) -> Option> { + unavailable_yet("local_storage_get") + } + + fn http_request_start( + &mut self, + _method: &str, + _uri: &str, + _meta: &[u8] + ) -> Result { + unavailable_yet::<()>("http_request_start"); + Err(()) + } + + fn http_request_add_header( + &mut self, + _request_id: HttpRequestId, + _name: &str, + _value: &str + ) -> Result<(), ()> { + unavailable_yet::<()>("http_request_add_header"); + Err(()) + } + + fn http_request_write_body( + &mut self, + _request_id: HttpRequestId, + _chunk: &[u8], + _deadline: Option + ) -> Result<(), HttpError> { + unavailable_yet::<()>("http_request_write_body"); + Err(HttpError::IoError) + } + + fn http_response_wait( + &mut self, + ids: &[HttpRequestId], + _deadline: Option + ) -> Vec { + unavailable_yet::<()>("http_response_wait"); + ids.iter().map(|_| HttpRequestStatus::Unknown).collect() + } + + fn http_response_headers( + &mut self, + _request_id: HttpRequestId + ) -> Vec<(Vec, Vec)> { + unavailable_yet("http_response_headers") + } + + fn http_response_read_body( + &mut self, + _request_id: HttpRequestId, + _buffer: &mut [u8], + _deadline: Option + ) -> Result { + unavailable_yet::<()>("http_response_read_body"); + Err(HttpError::IoError) } } @@ -46,21 +162,18 @@ impl OffchainExt for AsyncApi { pub(crate) struct Api { receiver: Option>, transaction_pool: Arc>, - inherents_pool: Arc::Extrinsic>>, at: BlockId, } impl Api { pub fn new( transaction_pool: Arc>, - inherents_pool: Arc::Extrinsic>>, at: BlockId, ) -> (AsyncApi, Self) { let (tx, rx) = mpsc::unbounded(); let api = Self { receiver: Some(rx), transaction_pool, - inherents_pool, at, }; (AsyncApi(tx), api) @@ -90,9 +203,8 @@ impl Api { info!("Submitting to the pool: {:?} (isSigned: {:?})", xt, xt.is_signed()); match self.transaction_pool.submit_one(&self.at, xt.clone()) { Ok(hash) => debug!("[{:?}] Offchain transaction added to the pool.", hash), - Err(_) => { - debug!("Offchain inherent added to the pool."); - self.inherents_pool.add(xt); + Err(e) => { + debug!("Couldn't submit transaction: {:?}", e); }, } } diff --git a/core/offchain/src/lib.rs b/core/offchain/src/lib.rs index cac960f2506f26ec409791065b68efdd8d565407..081ae61a5bcaeecc975bab74f911a4f2cfa7a41f 100644 --- a/core/offchain/src/lib.rs +++ b/core/offchain/src/lib.rs @@ -19,8 +19,8 @@ //! The offchain workers is a special function of the runtime that //! gets executed after block is imported. During execution //! it's able to asynchronously submit extrinsics that will either -//! be propagated to other nodes (transactions) or will be -//! added to the next block produced by the node as inherents. +//! be propagated to other nodes added to the next block +//! produced by the node as unsigned transactions. //! //! Offchain workers can be used for computation-heavy tasks //! that are not feasible for execution during regular block processing. @@ -39,7 +39,6 @@ use std::{ }; use client::runtime_api::ApiExt; -use inherents::pool::InherentsPool; use log::{debug, warn}; use primitives::ExecutionContext; use runtime_primitives::{ @@ -51,13 +50,14 @@ use transaction_pool::txpool::{Pool, ChainApi}; mod api; +pub mod testing; + pub use offchain_primitives::OffchainWorkerApi; /// An offchain workers manager. #[derive(Debug)] pub struct OffchainWorkers { client: Arc, - inherents_pool: Arc::Extrinsic>>, executor: TaskExecutor, _block: PhantomData, } @@ -66,12 +66,10 @@ impl OffchainWorkers { /// Creates new `OffchainWorkers`. pub fn new( client: Arc, - inherents_pool: Arc::Extrinsic>>, executor: TaskExecutor, ) -> Self { Self { client, - inherents_pool, executor, _block: PhantomData, } @@ -93,11 +91,11 @@ impl OffchainWorkers where { let runtime = self.client.runtime_api(); let at = BlockId::number(*number); - let has_api = runtime.has_api::>(&at); + let has_api = runtime.has_api::>(&at); debug!("Checking offchain workers at {:?}: {:?}", at, has_api); if has_api.unwrap_or(false) { - let (api, runner) = api::Api::new(pool.clone(), self.inherents_pool.clone(), at.clone()); + let (api, runner) = api::Api::new(pool.clone(), at.clone()); self.executor.spawn(runner.process()); debug!("Running offchain workers at {:?}", at); @@ -119,14 +117,14 @@ mod tests { let runtime = tokio::runtime::Runtime::new().unwrap(); let client = Arc::new(test_client::new()); let pool = Arc::new(Pool::new(Default::default(), ::transaction_pool::ChainApi::new(client.clone()))); - let inherents = Arc::new(InherentsPool::default()); // when - let offchain = OffchainWorkers::new(client, inherents.clone(), runtime.executor()); + let offchain = OffchainWorkers::new(client, runtime.executor()); offchain.on_block_imported(&0u64, &pool); // then runtime.shutdown_on_idle().wait().unwrap(); - assert_eq!(inherents.drain().len(), 1); + assert_eq!(pool.status().ready, 1); + assert_eq!(pool.ready().next().unwrap().is_propagateable(), false); } } diff --git a/core/offchain/src/testing.rs b/core/offchain/src/testing.rs new file mode 100644 index 0000000000000000000000000000000000000000..3419665d0a2f2873693168d89950eceb7eb363d8 --- /dev/null +++ b/core/offchain/src/testing.rs @@ -0,0 +1,244 @@ +// Copyright 2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +//! Offchain Externalities implementation for tests. + +use std::{ + collections::BTreeMap, + sync::Arc, +}; +use parking_lot::RwLock; +use primitives::offchain::{ + self, + HttpError, + HttpRequestId as RequestId, + HttpRequestStatus as RequestStatus, + Timestamp, + CryptoKind, + CryptoKeyId, +}; + +/// Pending request. +#[derive(Debug, Default, PartialEq, Eq)] +pub struct PendingRequest { + /// HTTP method + pub method: String, + /// URI + pub uri: String, + /// Encoded Metadata + pub meta: Vec, + /// Request headers + pub headers: Vec<(String, String)>, + /// Request body + pub body: Vec, + /// Has the request been sent already. + pub sent: bool, + /// Response body + pub response: Vec, + /// Number of bytes already read from the response body. + pub read: usize, + /// Response headers + pub response_headers: Vec<(String, String)>, +} + +/// Internal state of the externalities. +/// +/// This can be used in tests to respond or assert stuff about interactions. +#[derive(Debug, Default)] +pub struct State { + /// A list of pending requests. + pub requests: BTreeMap, +} + +impl State { + /// Asserts that pending request has been submitted and fills it's response. + pub fn fulfill_pending_request( + &mut self, + id: u16, + expected: PendingRequest, + response: impl Into>, + response_headers: impl IntoIterator, + ) { + match self.requests.get_mut(&RequestId(id)) { + None => { + panic!("Missing expected request: {:?}.\n\nAll: {:?}", id, self.requests); + } + Some(req) => { + assert_eq!( + *req, + expected, + ); + req.response = response.into(); + req.response_headers = response_headers.into_iter().collect(); + } + } + } +} + +/// Implementation of offchain externalities used for tests. +#[derive(Clone, Default, Debug)] +pub struct TestOffchainExt(pub Arc>); + +impl offchain::Externalities for TestOffchainExt { + fn submit_transaction(&mut self, _ex: Vec) -> Result<(), ()> { + unimplemented!("not needed in tests so far") + } + + fn new_crypto_key(&mut self, _crypto: CryptoKind) -> Result { + unimplemented!("not needed in tests so far") + } + + fn encrypt(&mut self, _key: Option, _data: &[u8]) -> Result, ()> { + unimplemented!("not needed in tests so far") + } + + fn decrypt(&mut self, _key: Option, _data: &[u8]) -> Result, ()> { + unimplemented!("not needed in tests so far") + } + + fn sign(&mut self, _key: Option, _data: &[u8]) -> Result, ()> { + unimplemented!("not needed in tests so far") + } + + fn verify(&mut self, _key: Option, _msg: &[u8], _signature: &[u8]) -> Result { + unimplemented!("not needed in tests so far") + } + + fn timestamp(&mut self) -> Timestamp { + unimplemented!("not needed in tests so far") + } + + fn sleep_until(&mut self, _deadline: Timestamp) { + unimplemented!("not needed in tests so far") + } + + fn random_seed(&mut self) -> [u8; 32] { + unimplemented!("not needed in tests so far") + } + + fn local_storage_set(&mut self, _key: &[u8], _value: &[u8]) { + unimplemented!("not needed in tests so far") + } + + fn local_storage_compare_and_set( + &mut self, + _key: &[u8], + _old_value: &[u8], + _new_value: &[u8] + ) { + unimplemented!("not needed in tests so far") + } + + fn local_storage_get(&mut self, _key: &[u8]) -> Option> { + unimplemented!("not needed in tests so far") + } + + fn http_request_start(&mut self, method: &str, uri: &str, meta: &[u8]) -> Result { + let mut state = self.0.write(); + let id = RequestId(state.requests.len() as u16); + state.requests.insert(id.clone(), PendingRequest { + method: method.into(), + uri: uri.into(), + meta: meta.into(), + ..Default::default() + }); + Ok(id) + } + + fn http_request_add_header( + &mut self, + request_id: RequestId, + name: &str, + value: &str, + ) -> Result<(), ()> { + let mut state = self.0.write(); + if let Some(req) = state.requests.get_mut(&request_id) { + req.headers.push((name.into(), value.into())); + Ok(()) + } else { + Err(()) + } + } + + fn http_request_write_body( + &mut self, + request_id: RequestId, + chunk: &[u8], + _deadline: Option + ) -> Result<(), HttpError> { + let mut state = self.0.write(); + if let Some(req) = state.requests.get_mut(&request_id) { + if chunk.is_empty() { + req.sent = true; + } + req.body.extend(chunk); + Ok(()) + } else { + Err(HttpError::IoError) + } + } + + fn http_response_wait( + &mut self, + ids: &[RequestId], + _deadline: Option, + ) -> Vec { + let state = self.0.read(); + + ids.iter().map(|id| match state.requests.get(id) { + Some(req) if req.response.is_empty() => RequestStatus::DeadlineReached, + None => RequestStatus::Unknown, + _ => RequestStatus::Finished(200), + }).collect() + } + + fn http_response_headers(&mut self, request_id: RequestId) -> Vec<(Vec, Vec)> { + let state = self.0.read(); + if let Some(req) = state.requests.get(&request_id) { + req.response_headers + .clone() + .into_iter() + .map(|(k, v)| (k.into_bytes(), v.into_bytes())) + .collect() + } else { + Default::default() + } + } + + fn http_response_read_body( + &mut self, + request_id: RequestId, + buffer: &mut [u8], + _deadline: Option + ) -> Result { + let mut state = self.0.write(); + if let Some(req) = state.requests.get_mut(&request_id) { + if req.read >= req.response.len() { + // Remove the pending request as per spec. + state.requests.remove(&request_id); + Ok(0) + } else { + let read = std::cmp::min(buffer.len(), req.response[req.read..].len()); + buffer[0..read].copy_from_slice(&req.response[req.read..read]); + req.read += read; + Ok(read) + } + } else { + Err(HttpError::IoError) + } + } +} + diff --git a/core/peerset/Cargo.toml b/core/peerset/Cargo.toml index efa115f5be3decc9117597925aec7079e7f48a56..aa08c8ca997a5d32546567bbb806cf778bac6d7a 100644 --- a/core/peerset/Cargo.toml +++ b/core/peerset/Cargo.toml @@ -9,8 +9,12 @@ edition = "2018" [dependencies] futures = "0.1" -libp2p = { version = "0.7.0", default-features = false } +libp2p = { version = "0.9.0", default-features = false } linked-hash-map = "0.5" log = "0.4" lru-cache = "0.1.2" -serde_json = "1.0.24" \ No newline at end of file +serde_json = "1.0.24" + +[dev-dependencies] +rand = "0.6" +tokio = "0.1" diff --git a/core/peerset/src/lib.rs b/core/peerset/src/lib.rs index 97200c64373615eefca3237f3094b368eb19a8cf..aa3ce02076d56d5cf42605d6a8aa76cd444df581 100644 --- a/core/peerset/src/lib.rs +++ b/core/peerset/src/lib.rs @@ -19,14 +19,18 @@ mod peersstate; -use std::{collections::HashMap, collections::VecDeque, time::Instant}; +use std::{collections::{HashSet, HashMap}, collections::VecDeque, time::Instant}; use futures::{prelude::*, sync::mpsc, try_ready}; use libp2p::PeerId; use log::{debug, error, trace}; use serde_json::json; +/// We don't accept nodes whose reputation is under this value. +const BANNED_THRESHOLD: i32 = 82 * (i32::min_value() / 100); /// Reputation change for a node when we get disconnected from it. const DISCONNECT_REPUTATION_CHANGE: i32 = -10; +/// Reserved peers group ID +const RESERVED_NODES: &'static str = "reserved"; #[derive(Debug)] enum Action { @@ -34,6 +38,9 @@ enum Action { RemoveReservedPeer(PeerId), SetReservedOnly(bool), ReportPeer(PeerId, i32), + SetPriorityGroup(String, HashSet), + AddToPriorityGroup(String, PeerId), + RemoveFromPriorityGroup(String, PeerId), } /// Shared handle to the peer set manager (PSM). Distributed around the code. @@ -70,6 +77,21 @@ impl PeersetHandle { pub fn report_peer(&self, peer_id: PeerId, score_diff: i32) { let _ = self.tx.unbounded_send(Action::ReportPeer(peer_id, score_diff)); } + + /// Modify a priority group. + pub fn set_priority_group(&self, group_id: String, peers: HashSet) { + let _ = self.tx.unbounded_send(Action::SetPriorityGroup(group_id, peers)); + } + + /// Add a peer to a priority group. + pub fn add_to_priority_group(&self, group_id: String, peer_id: PeerId) { + let _ = self.tx.unbounded_send(Action::AddToPriorityGroup(group_id, peer_id)); + } + + /// Remove a peer from a priority group. + pub fn remove_from_priority_group(&self, group_id: String, peer_id: PeerId) { + let _ = self.tx.unbounded_send(Action::RemoveFromPriorityGroup(group_id, peer_id)); + } } /// Message that can be sent by the peer set manager (PSM). @@ -90,7 +112,7 @@ pub enum Message { } /// Opaque identifier for an incoming connection. Allocated by the network. -#[derive(Debug, Copy, Clone, PartialEq, Eq)] +#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] pub struct IncomingIndex(pub u64); impl From for IncomingIndex { @@ -159,14 +181,7 @@ impl Peerset { latest_time_update: Instant::now(), }; - for peer_id in config.reserved_nodes { - if let peersstate::Peer::Unknown(entry) = peerset.data.peer(&peer_id) { - entry.discover().set_reserved(true); - } else { - debug!(target: "peerset", "Duplicate reserved node in config: {:?}", peer_id); - } - } - + peerset.data.set_priority_group(RESERVED_NODES, config.reserved_nodes.into_iter().collect()); for peer_id in config.bootnodes { if let peersstate::Peer::Unknown(entry) = peerset.data.peer(&peer_id) { entry.discover(); @@ -180,32 +195,25 @@ impl Peerset { } fn on_add_reserved_peer(&mut self, peer_id: PeerId) { - let mut entry = match self.data.peer(&peer_id) { - peersstate::Peer::Connected(mut connected) => { - connected.set_reserved(true); - return - } - peersstate::Peer::NotConnected(entry) => entry, - peersstate::Peer::Unknown(entry) => entry.discover(), - }; - - // We reach this point if and only if we were not connected to the node. - entry.set_reserved(true); - entry.force_outgoing(); - self.message_queue.push_back(Message::Connect(peer_id)); + let mut reserved = self.data.get_priority_group(RESERVED_NODES).unwrap_or_default(); + reserved.insert(peer_id); + self.data.set_priority_group(RESERVED_NODES, reserved); + self.alloc_slots(); } fn on_remove_reserved_peer(&mut self, peer_id: PeerId) { + let mut reserved = self.data.get_priority_group(RESERVED_NODES).unwrap_or_default(); + reserved.remove(&peer_id); + self.data.set_priority_group(RESERVED_NODES, reserved); match self.data.peer(&peer_id) { - peersstate::Peer::Connected(mut peer) => { - peer.set_reserved(false); + peersstate::Peer::Connected(peer) => { if self.reserved_only { peer.disconnect(); self.message_queue.push_back(Message::Drop(peer_id)); } } - peersstate::Peer::NotConnected(mut peer) => peer.set_reserved(false), - peersstate::Peer::Unknown(_) => {} + peersstate::Peer::NotConnected(_) => {}, + peersstate::Peer::Unknown(_) => {}, } } @@ -213,26 +221,47 @@ impl Peerset { // Disconnect non-reserved nodes. self.reserved_only = reserved_only; if self.reserved_only { + let reserved = self.data.get_priority_group(RESERVED_NODES).unwrap_or_default(); for peer_id in self.data.connected_peers().cloned().collect::>().into_iter() { let peer = self.data.peer(&peer_id).into_connected() .expect("We are enumerating connected peers, therefore the peer is connected; qed"); - if !peer.is_reserved() { + if !reserved.contains(&peer_id) { peer.disconnect(); self.message_queue.push_back(Message::Drop(peer_id)); } } - } else { self.alloc_slots(); } } + fn on_set_priority_group(&mut self, group_id: &str, peers: HashSet) { + self.data.set_priority_group(group_id, peers); + self.alloc_slots(); + } + + fn on_add_to_priority_group(&mut self, group_id: &str, peer_id: PeerId) { + self.data.add_to_priority_group(group_id, peer_id); + self.alloc_slots(); + } + + fn on_remove_from_priority_group(&mut self, group_id: &str, peer_id: PeerId) { + self.data.remove_from_priority_group(group_id, &peer_id); + self.alloc_slots(); + } + fn on_report_peer(&mut self, peer_id: PeerId, score_diff: i32) { // We want reputations to be up-to-date before adjusting them. self.update_time(); match self.data.peer(&peer_id) { - peersstate::Peer::Connected(mut peer) => peer.add_reputation(score_diff), + peersstate::Peer::Connected(mut peer) => { + peer.add_reputation(score_diff); + if peer.reputation() < BANNED_THRESHOLD { + peer.disconnect(); + self.message_queue.push_back(Message::Drop(peer_id)); + } + }, peersstate::Peer::NotConnected(mut peer) => peer.add_reputation(score_diff), peersstate::Peer::Unknown(peer) => peer.discover().add_reputation(score_diff), } @@ -283,22 +312,33 @@ impl Peerset { fn alloc_slots(&mut self) { self.update_time(); + // Try to grab the next node to attempt to connect to. + while let Some(next) = { + if self.reserved_only { + self.data.priority_not_connected_peer_from_group(RESERVED_NODES) + } else { + self.data.priority_not_connected_peer() + } + } { + match next.try_outgoing() { + Ok(conn) => self.message_queue.push_back(Message::Connect(conn.into_peer_id())), + Err(_) => break, // No more slots available. + } + } + loop { + if self.reserved_only { + break + } + // Try to grab the next node to attempt to connect to. - let next = match self.data.reserved_not_connected_peer() { + let next = match self.data.highest_not_connected_peer() { Some(p) => p, - None => if self.reserved_only { - break // No known node to add. - } else { - match self.data.highest_not_connected_peer() { - Some(p) => p, - None => break, // No known node to add. - } - } + None => break, // No known node to add. }; // Don't connect to nodes with an abysmal reputation. - if next.reputation() == i32::min_value() { + if next.reputation() < BANNED_THRESHOLD { break; } @@ -316,10 +356,12 @@ impl Peerset { /// connection implicitely means `Connect`, but incoming connections aren't cancelled by /// `dropped`. /// - /// Because of concurrency issues, it is acceptable to call `incoming` with a `PeerId` the - /// peerset is already connected to, in which case it must not answer. + // Implementation note: because of concurrency issues, it is possible that we push a `Connect` + // message to the output channel with a `PeerId`, and that `incoming` gets called with the same + // `PeerId` before that message has been read by the user. In this situation we must not answer. pub fn incoming(&mut self, peer_id: PeerId, index: IncomingIndex) { trace!(target: "peerset", "Incoming {:?}", peer_id); + self.update_time(); let not_connected = match self.data.peer(&peer_id) { // If we're already connected, don't answer, as the docs mention. @@ -328,6 +370,11 @@ impl Peerset { peersstate::Peer::Unknown(entry) => entry.discover(), }; + if not_connected.reputation() < BANNED_THRESHOLD { + self.message_queue.push_back(Message::Reject(index)); + return + } + match not_connected.try_accept_incoming() { Ok(_) => self.message_queue.push_back(Message::Accept(index)), Err(_) => self.message_queue.push_back(Message::Reject(index)), @@ -401,6 +448,11 @@ impl Peerset { "message_queue": self.message_queue.len(), }) } + + /// Returns priority group by id. + pub fn get_priority_group(&self, group_id: &str) -> Option> { + self.data.get_priority_group(group_id) + } } impl Stream for Peerset { @@ -413,12 +465,15 @@ impl Stream for Peerset { return Ok(Async::Ready(Some(message))); } match try_ready!(self.rx.poll()) { - None => return Ok(Async::Ready(None)), + None => return Ok(Async::NotReady), Some(action) => match action { Action::AddReservedPeer(peer_id) => self.on_add_reserved_peer(peer_id), Action::RemoveReservedPeer(peer_id) => self.on_remove_reserved_peer(peer_id), Action::SetReservedOnly(reserved) => self.on_set_reserved_only(reserved), Action::ReportPeer(peer_id, score_diff) => self.on_report_peer(peer_id, score_diff), + Action::SetPriorityGroup(group_id, peers) => self.on_set_priority_group(&group_id, peers), + Action::AddToPriorityGroup(group_id, peer_id) => self.on_add_to_priority_group(&group_id, peer_id), + Action::RemoveFromPriorityGroup(group_id, peer_id) => self.on_remove_from_priority_group(&group_id, peer_id), } } } @@ -429,7 +484,8 @@ impl Stream for Peerset { mod tests { use libp2p::PeerId; use futures::prelude::*; - use super::{PeersetConfig, Peerset, Message, IncomingIndex}; + use super::{PeersetConfig, Peerset, Message, IncomingIndex, BANNED_THRESHOLD}; + use std::{thread, time::Duration}; fn assert_messages(mut peerset: Peerset, messages: Vec) -> Peerset { for expected_message in messages { @@ -527,4 +583,46 @@ mod tests { Message::Connect(discovered), ]); } + + #[test] + fn test_peerset_banned() { + let (mut peerset, handle) = Peerset::from_config(PeersetConfig { + in_peers: 25, + out_peers: 25, + bootnodes: vec![], + reserved_only: false, + reserved_nodes: vec![], + }); + + // We ban a node by setting its reputation under the threshold. + let peer_id = PeerId::random(); + handle.report_peer(peer_id.clone(), BANNED_THRESHOLD - 1); + + let fut = futures::future::poll_fn(move || -> Result<_, ()> { + // We need one polling for the message to be processed. + assert_eq!(peerset.poll().unwrap(), Async::NotReady); + + // Check that an incoming connection from that node gets refused. + peerset.incoming(peer_id.clone(), IncomingIndex(1)); + if let Async::Ready(msg) = peerset.poll().unwrap() { + assert_eq!(msg.unwrap(), Message::Reject(IncomingIndex(1))); + } else { + panic!() + } + + // Wait a bit for the node's reputation to go above the threshold. + thread::sleep(Duration::from_millis(1500)); + + // Try again. This time the node should be accepted. + peerset.incoming(peer_id.clone(), IncomingIndex(2)); + while let Async::Ready(msg) = peerset.poll().unwrap() { + assert_eq!(msg.unwrap(), Message::Accept(IncomingIndex(2))); + } + + Ok(Async::Ready(())) + }); + + tokio::runtime::current_thread::Runtime::new().unwrap().block_on(fut).unwrap(); + } } + diff --git a/core/peerset/src/peersstate.rs b/core/peerset/src/peersstate.rs index 4907ccf6e523a7d8a870c654f4cf8a70ebdb664f..e02d6304046bc6f74b9a69e8a1cfbc2dc322f5ab 100644 --- a/core/peerset/src/peersstate.rs +++ b/core/peerset/src/peersstate.rs @@ -17,7 +17,8 @@ //! Contains the state storage behind the peerset. use libp2p::PeerId; -use std::{borrow::Cow, collections::HashMap}; +use std::{borrow::Cow, collections::{HashSet, HashMap}}; +use log::warn; /// State storage behind the peerset. /// @@ -35,17 +36,20 @@ pub struct PeersState { /// sort, to make the logic easier. nodes: HashMap, - /// Number of non-reserved nodes for which the `ConnectionState` is `In`. + /// Number of non-priority nodes for which the `ConnectionState` is `In`. num_in: u32, - /// Number of non-reserved nodes for which the `ConnectionState` is `In`. + /// Number of non-priority nodes for which the `ConnectionState` is `In`. num_out: u32, - /// Maximum allowed number of non-reserved nodes for which the `ConnectionState` is `In`. + /// Maximum allowed number of non-priority nodes for which the `ConnectionState` is `In`. max_in: u32, - /// Maximum allowed number of non-reserved nodes for which the `ConnectionState` is `Out`. + /// Maximum allowed number of non-priority nodes for which the `ConnectionState` is `Out`. max_out: u32, + + /// Priority groups. Each group is identified by a string ID and contains a set of peer IDs. + priority_nodes: HashMap>, } /// State of a single node that we know about. @@ -54,14 +58,20 @@ struct Node { /// Whether we are connected to this node. connection_state: ConnectionState, - /// If true, this node is reserved and should always be connected to. - reserved: bool, - /// Reputation value of the node, between `i32::min_value` (we hate that node) and /// `i32::max_value` (we love that node). reputation: i32, } +impl Default for Node { + fn default() -> Node { + Node { + connection_state: ConnectionState::NotConnected, + reputation: 0, + } + } +} + /// Whether we are connected to a node. #[derive(Debug, Copy, Clone, PartialEq, Eq)] enum ConnectionState { @@ -93,42 +103,30 @@ impl PeersState { num_out: 0, max_in: in_peers, max_out: out_peers, + priority_nodes: HashMap::new(), } } /// Returns an object that grants access to the state of a peer. pub fn peer<'a>(&'a mut self, peer_id: &'a PeerId) -> Peer<'a> { - // Note: the Rust borrow checker still has some issues. In particular, we can't put this - // block as an `else` below (as the obvious solution would be here), or it will complain - // that we borrow `self` while it is already borrowed. - if !self.nodes.contains_key(peer_id) { - return Peer::Unknown(UnknownPeer { + match self.nodes.get_mut(peer_id) { + None => return Peer::Unknown(UnknownPeer { parent: self, peer_id: Cow::Borrowed(peer_id), - }); - } - - let state = self.nodes.get_mut(peer_id) - .expect("We check that the value is present right above; QED"); - - if state.connection_state.is_connected() { - Peer::Connected(ConnectedPeer { - state, - peer_id: Cow::Borrowed(peer_id), - num_in: &mut self.num_in, - num_out: &mut self.num_out, - max_in: self.max_in, - max_out: self.max_out, - }) - } else { - Peer::NotConnected(NotConnectedPeer { - state, - peer_id: Cow::Borrowed(peer_id), - num_in: &mut self.num_in, - num_out: &mut self.num_out, - max_in: self.max_in, - max_out: self.max_out, - }) + }), + Some(peer) => { + if peer.connection_state.is_connected() { + Peer::Connected(ConnectedPeer { + state: self, + peer_id: Cow::Borrowed(peer_id), + }) + } else { + Peer::NotConnected(NotConnectedPeer { + state: self, + peer_id: Cow::Borrowed(peer_id), + }) + } + } } } @@ -148,28 +146,32 @@ impl PeersState { .map(|(p, _)| p) } - /// Returns the first reserved peer that we are not connected to. + /// Returns the first priority peer that we are not connected to. /// - /// If multiple nodes are reserved, which one is returned is unspecified. - pub fn reserved_not_connected_peer(&mut self) -> Option { - let outcome = self.nodes.iter_mut() - .find(|(_, &mut Node { connection_state, reserved, .. })| { - reserved && !connection_state.is_connected() - }) - .map(|(peer_id, node)| (peer_id.clone(), node)); - - if let Some((peer_id, state)) = outcome { - Some(NotConnectedPeer { - state, - peer_id: Cow::Owned(peer_id), - num_in: &mut self.num_in, - num_out: &mut self.num_out, - max_in: self.max_in, - max_out: self.max_out, - }) - } else { - None - } + /// If multiple nodes are prioritized, which one is returned is unspecified. + pub fn priority_not_connected_peer(&mut self) -> Option { + let id = self.priority_nodes.values() + .flatten() + .find(|id| self.nodes.get(id).map_or(false, |node| !node.connection_state.is_connected())) + .cloned(); + id.map(move |id| NotConnectedPeer { + state: self, + peer_id: Cow::Owned(id), + }) + } + + /// Returns the first priority peer that we are not connected to. + /// + /// If multiple nodes are prioritized, which one is returned is unspecified. + pub fn priority_not_connected_peer_from_group(&mut self, group_id: &str) -> Option { + let id = self.priority_nodes.get(group_id) + .and_then(|group| group.iter() + .find(|id| self.nodes.get(id).map_or(false, |node| !node.connection_state.is_connected())) + .cloned()); + id.map(move |id| NotConnectedPeer { + state: self, + peer_id: Cow::Owned(id), + }) } /// Returns the peer with the highest reputation and that we are not connected to. @@ -187,21 +189,160 @@ impl PeersState { } Some(to_try) }) - .map(|(peer_id, state)| (peer_id.clone(), state)); + .map(|(peer_id, _)| peer_id.clone()); - if let Some((peer_id, state)) = outcome { + if let Some(peer_id) = outcome { Some(NotConnectedPeer { - state, + state: self, peer_id: Cow::Owned(peer_id), - num_in: &mut self.num_in, - num_out: &mut self.num_out, - max_in: self.max_in, - max_out: self.max_out, }) } else { None } } + + fn disconnect(&mut self, peer_id: &PeerId) { + let is_priority = self.is_priority(peer_id); + if let Some(mut node) = self.nodes.get_mut(peer_id) { + if !is_priority { + match node.connection_state { + ConnectionState::In => self.num_in -= 1, + ConnectionState::Out => self.num_out -= 1, + ConnectionState::NotConnected => + debug_assert!(false, "State inconsistency: disconnecting a disconnected node") + } + } + node.connection_state = ConnectionState::NotConnected; + } else { + warn!(target: "peerset", "Attempting to disconnect unknown peer {}", peer_id); + } + } + + /// Sets the peer as connected with an outgoing connection. + fn try_outgoing(&mut self, peer_id: &PeerId) -> bool { + // Note that it is possible for num_out to be strictly superior to the max, in case we were + // connected to reserved node then marked them as not reserved. + let is_priority = self.is_priority(peer_id); + if self.num_out >= self.max_out && !is_priority { + return false; + } + + if let Some(mut peer) = self.nodes.get_mut(peer_id) { + peer.connection_state = ConnectionState::Out; + if !is_priority { + self.num_out += 1; + } + return true; + } + false + } + + /// Tries to accept the peer as an incoming connection. + /// + /// If there are enough slots available, switches the node to "connected" and returns `Ok`. If + /// the slots are full, the node stays "not connected" and we return `Err`. + /// + /// Note that reserved nodes don't count towards the number of slots. + fn try_accept_incoming(&mut self, peer_id: &PeerId) -> bool { + let is_priority = self.is_priority(peer_id); + // Note that it is possible for num_in to be strictly superior to the max, in case we were + // connected to reserved node then marked them as not reserved. + if self.num_in >= self.max_in && !is_priority { + return false; + } + if let Some(mut peer) = self.nodes.get_mut(peer_id) { + peer.connection_state = ConnectionState::In; + if !is_priority { + self.num_in += 1; + } + return true; + } + false + } + + /// Sets priority group + pub fn set_priority_group(&mut self, group_id: &str, peers: HashSet) { + // update slot counters + let all_other_groups: HashSet<_> = self.priority_nodes + .iter() + .filter(|(g, _)| *g != group_id) + .flat_map(|(_, id)| id.clone()) + .collect(); + let existing_group = self.priority_nodes.remove(group_id).unwrap_or_default(); + for id in existing_group { + // update slots for nodes that are no longer priority + if !all_other_groups.contains(&id) { + if let Some(peer) = self.nodes.get_mut(&id) { + match peer.connection_state { + ConnectionState::In => self.num_in += 1, + ConnectionState::Out => self.num_out += 1, + ConnectionState::NotConnected => {}, + } + } + } + } + + for id in &peers { + // update slots for nodes that become priority + if !all_other_groups.contains(&id) { + let peer = self.nodes.entry(id.clone()).or_default(); + match peer.connection_state { + ConnectionState::In => self.num_in -= 1, + ConnectionState::Out => self.num_out -= 1, + ConnectionState::NotConnected => {}, + } + } + } + self.priority_nodes.insert(group_id.into(), peers); + } + + /// Add a peer to a priority group. + pub fn add_to_priority_group(&mut self, group_id: &str, peer_id: PeerId) { + let mut peers = self.priority_nodes.get(group_id).cloned().unwrap_or_default(); + peers.insert(peer_id); + self.set_priority_group(group_id, peers); + } + + /// Remove a peer from a priority group. + pub fn remove_from_priority_group(&mut self, group_id: &str, peer_id: &PeerId) { + let mut peers = self.priority_nodes.get(group_id).cloned().unwrap_or_default(); + peers.remove(&peer_id); + self.set_priority_group(group_id, peers); + } + + /// Get priority group content. + pub fn get_priority_group(&self, group_id: &str) -> Option> { + self.priority_nodes.get(group_id).cloned() + } + + /// Check that node is any priority group. + fn is_priority(&self, peer_id: &PeerId) -> bool { + self.priority_nodes.iter().any(|(_, group)| group.contains(peer_id)) + } + + /// Returns the reputation value of the node. + fn reputation(&self, peer_id: &PeerId) -> i32 { + self.nodes.get(peer_id).map_or(0, |p| p.reputation) + } + + /// Sets the reputation of the peer. + fn set_reputation(&mut self, peer_id: &PeerId, value: i32) { + let node = self.nodes + .entry(peer_id.clone()) + .or_default(); + node.reputation = value; + } + + /// Performs an arithmetic addition on the reputation score of that peer. + /// + /// In case of overflow, the value will be capped. + /// If the peer is unknown to us, we insert it and consider that it has a reputation of 0. + fn add_reputation(&mut self, peer_id: &PeerId, modifier: i32) { + let node = self.nodes + .entry(peer_id.clone()) + .or_default(); + node.reputation = node.reputation.saturating_add(modifier); + } } /// Grants access to the state of a peer in the `PeersState`. @@ -250,12 +391,8 @@ impl<'a> Peer<'a> { /// A peer that is connected to us. pub struct ConnectedPeer<'a> { - state: &'a mut Node, + state: &'a mut PeersState, peer_id: Cow<'a, PeerId>, - num_in: &'a mut u32, - num_out: &'a mut u32, - max_in: u32, - max_out: u32, } impl<'a> ConnectedPeer<'a> { @@ -266,81 +403,36 @@ impl<'a> ConnectedPeer<'a> { /// Switches the peer to "not connected". pub fn disconnect(self) -> NotConnectedPeer<'a> { - let connec_state = &mut self.state.connection_state; - - match *connec_state { - ConnectionState::In => *self.num_in -= 1, - ConnectionState::Out => *self.num_out -= 1, - ConnectionState::NotConnected => - debug_assert!(false, "State inconsistency: disconnecting a disconnected node") - } - - *connec_state = ConnectionState::NotConnected; - + self.state.disconnect(&self.peer_id); NotConnectedPeer { state: self.state, peer_id: self.peer_id, - num_in: self.num_in, - num_out: self.num_out, - max_in: self.max_in, - max_out: self.max_out, } } - /// Sets whether or not the node is reserved. - pub fn set_reserved(&mut self, reserved: bool) { - if reserved { - self.state.reserved = true; - match self.state.connection_state { - ConnectionState::In => *self.num_in -= 1, - ConnectionState::Out => *self.num_out -= 1, - ConnectionState::NotConnected => debug_assert!(false, "State inconsistency: \ - connected node is in fact not connected"), - } - - } else { - self.state.reserved = false; - match self.state.connection_state { - ConnectionState::In => *self.num_in += 1, - ConnectionState::Out => *self.num_out += 1, - ConnectionState::NotConnected => debug_assert!(false, "State inconsistency: \ - connected node is in fact not connected"), - } - } - } - - /// Returns whether or not the node is reserved. - pub fn is_reserved(&self) -> bool { - self.state.reserved - } - /// Returns the reputation value of the node. pub fn reputation(&self) -> i32 { - self.state.reputation + self.state.reputation(&self.peer_id) } /// Sets the reputation of the peer. pub fn set_reputation(&mut self, value: i32) { - self.state.reputation = value; + self.state.set_reputation(&self.peer_id, value) } /// Performs an arithmetic addition on the reputation score of that peer. /// /// In case of overflow, the value will be capped. pub fn add_reputation(&mut self, modifier: i32) { - let reputation = &mut self.state.reputation; - *reputation = reputation.saturating_add(modifier); + self.state.add_reputation(&self.peer_id, modifier) } } /// A peer that is not connected to us. +#[derive(Debug)] pub struct NotConnectedPeer<'a> { - state: &'a mut Node, + state: &'a mut PeersState, peer_id: Cow<'a, PeerId>, - num_in: &'a mut u32, - num_out: &'a mut u32, - max_in: u32, - max_out: u32, } impl<'a> NotConnectedPeer<'a> { @@ -354,41 +446,16 @@ impl<'a> NotConnectedPeer<'a> { /// /// If there are enough slots available, switches the node to "connected" and returns `Ok`. If /// the slots are full, the node stays "not connected" and we return `Err`. - /// If the node is reserved, this method always succeeds. /// - /// Note that reserved nodes don't count towards the number of slots. + /// Note that priority nodes don't count towards the number of slots. pub fn try_outgoing(self) -> Result, NotConnectedPeer<'a>> { - if self.is_reserved() { - return Ok(self.force_outgoing()) - } - - // Note that it is possible for num_out to be strictly superior to the max, in case we were - // connected to reserved node then marked them as not reserved, or if the user used - // `force_outgoing`. - if *self.num_out >= self.max_out { - return Err(self); - } - - Ok(self.force_outgoing()) - } - - /// Sets the peer as connected as an outgoing connection. - pub fn force_outgoing(self) -> ConnectedPeer<'a> { - let connec_state = &mut self.state.connection_state; - debug_assert!(!connec_state.is_connected()); - *connec_state = ConnectionState::Out; - - if !self.state.reserved { - *self.num_out += 1; - } - - ConnectedPeer { - state: self.state, - peer_id: self.peer_id, - num_in: self.num_in, - num_out: self.num_out, - max_in: self.max_in, - max_out: self.max_out, + if self.state.try_outgoing(&self.peer_id) { + Ok(ConnectedPeer { + state: self.state, + peer_id: self.peer_id, + }) + } else { + Err(self) } } @@ -397,59 +464,26 @@ impl<'a> NotConnectedPeer<'a> { /// If there are enough slots available, switches the node to "connected" and returns `Ok`. If /// the slots are full, the node stays "not connected" and we return `Err`. /// - /// Note that reserved nodes don't count towards the number of slots. + /// Note that priority nodes don't count towards the number of slots. pub fn try_accept_incoming(self) -> Result, NotConnectedPeer<'a>> { - if self.is_reserved() { - return Ok(self.force_ingoing()) - } - - // Note that it is possible for num_in to be strictly superior to the max, in case we were - // connected to reserved node then marked them as not reserved. - if *self.num_in >= self.max_in { - return Err(self); - } - - Ok(self.force_ingoing()) - } - - /// Sets the peer as connected as an ingoing connection. - pub fn force_ingoing(self) -> ConnectedPeer<'a> { - let connec_state = &mut self.state.connection_state; - debug_assert!(!connec_state.is_connected()); - *connec_state = ConnectionState::In; - - if !self.state.reserved { - *self.num_in += 1; - } - - ConnectedPeer { - state: self.state, - peer_id: self.peer_id, - num_in: self.num_in, - num_out: self.num_out, - max_in: self.max_in, - max_out: self.max_out, + if self.state.try_accept_incoming(&self.peer_id) { + Ok(ConnectedPeer { + state: self.state, + peer_id: self.peer_id, + }) + } else { + Err(self) } } - /// Sets whether or not the node is reserved. - pub fn set_reserved(&mut self, reserved: bool) { - self.state.reserved = reserved; - } - - /// Returns true if the the node is reserved. - pub fn is_reserved(&self) -> bool { - self.state.reserved - } - /// Returns the reputation value of the node. pub fn reputation(&self) -> i32 { - self.state.reputation + self.state.reputation(&self.peer_id) } /// Sets the reputation of the peer. pub fn set_reputation(&mut self, value: i32) { - self.state.reputation = value; + self.state.set_reputation(&self.peer_id, value) } /// Performs an arithmetic addition on the reputation score of that peer. @@ -457,8 +491,7 @@ impl<'a> NotConnectedPeer<'a> { /// In case of overflow, the value will be capped. /// If the peer is unknown to us, we insert it and consider that it has a reputation of 0. pub fn add_reputation(&mut self, modifier: i32) { - let reputation = &mut self.state.reputation; - *reputation = reputation.saturating_add(modifier); + self.state.add_reputation(&self.peer_id, modifier) } } @@ -471,25 +504,18 @@ pub struct UnknownPeer<'a> { impl<'a> UnknownPeer<'a> { /// Inserts the peer identity in our list. /// - /// The node is not reserved and starts with a reputation of 0. You can adjust these default + /// The node starts with a reputation of 0. You can adjust these default /// values using the `NotConnectedPeer` that this method returns. pub fn discover(self) -> NotConnectedPeer<'a> { self.parent.nodes.insert(self.peer_id.clone().into_owned(), Node { connection_state: ConnectionState::NotConnected, reputation: 0, - reserved: false, }); - let state = self.parent.nodes.get_mut(&self.peer_id) - .expect("We insert that key into the HashMap right above; QED"); - + let state = self.parent; NotConnectedPeer { state, peer_id: self.peer_id, - num_in: &mut self.parent.num_in, - num_out: &mut self.parent.num_out, - max_in: self.parent.max_in, - max_out: self.parent.max_out, } } } @@ -515,14 +541,13 @@ mod tests { } #[test] - fn reserved_node_doesnt_use_slot() { + fn priority_node_doesnt_use_slot() { let mut peers_state = PeersState::new(1, 1); let id1 = PeerId::random(); let id2 = PeerId::random(); - if let Peer::Unknown(e) = peers_state.peer(&id1) { - let mut p = e.discover(); - p.set_reserved(true); + peers_state.set_priority_group("test", vec![id1.clone()].into_iter().collect()); + if let Peer::NotConnected(p) = peers_state.peer(&id1) { assert!(p.try_accept_incoming().is_ok()); } else { panic!() } @@ -544,23 +569,22 @@ mod tests { } #[test] - fn reserved_not_connected_peer() { + fn priority_not_connected_peer() { let mut peers_state = PeersState::new(25, 25); let id1 = PeerId::random(); let id2 = PeerId::random(); - assert!(peers_state.reserved_not_connected_peer().is_none()); + assert!(peers_state.priority_not_connected_peer().is_none()); peers_state.peer(&id1).into_unknown().unwrap().discover(); peers_state.peer(&id2).into_unknown().unwrap().discover(); - assert!(peers_state.reserved_not_connected_peer().is_none()); - peers_state.peer(&id1).into_not_connected().unwrap().set_reserved(true); - assert!(peers_state.reserved_not_connected_peer().is_some()); - peers_state.peer(&id2).into_not_connected().unwrap().set_reserved(true); - peers_state.peer(&id1).into_not_connected().unwrap().set_reserved(false); - assert!(peers_state.reserved_not_connected_peer().is_some()); - peers_state.peer(&id2).into_not_connected().unwrap().set_reserved(false); - assert!(peers_state.reserved_not_connected_peer().is_none()); + assert!(peers_state.priority_not_connected_peer().is_none()); + peers_state.set_priority_group("test", vec![id1.clone()].into_iter().collect()); + assert!(peers_state.priority_not_connected_peer().is_some()); + peers_state.set_priority_group("test", vec![id2.clone(), id2.clone()].into_iter().collect()); + assert!(peers_state.priority_not_connected_peer().is_some()); + peers_state.set_priority_group("test", vec![].into_iter().collect()); + assert!(peers_state.priority_not_connected_peer().is_none()); } #[test] @@ -575,7 +599,7 @@ mod tests { assert_eq!(peers_state.highest_not_connected_peer().map(|p| p.into_peer_id()), Some(id1.clone())); peers_state.peer(&id2).into_not_connected().unwrap().set_reputation(75); assert_eq!(peers_state.highest_not_connected_peer().map(|p| p.into_peer_id()), Some(id2.clone())); - peers_state.peer(&id2).into_not_connected().unwrap().force_ingoing(); + peers_state.peer(&id2).into_not_connected().unwrap().try_accept_incoming().unwrap(); assert_eq!(peers_state.highest_not_connected_peer().map(|p| p.into_peer_id()), Some(id1.clone())); peers_state.peer(&id1).into_not_connected().unwrap().set_reputation(100); peers_state.peer(&id2).into_connected().unwrap().disconnect(); @@ -583,4 +607,33 @@ mod tests { peers_state.peer(&id1).into_not_connected().unwrap().set_reputation(-100); assert_eq!(peers_state.highest_not_connected_peer().map(|p| p.into_peer_id()), Some(id2.clone())); } + + #[test] + fn disconnect_priority_doesnt_panic() { + let mut peers_state = PeersState::new(1, 1); + let id = PeerId::random(); + peers_state.set_priority_group("test", vec![id.clone()].into_iter().collect()); + let peer = peers_state.peer(&id).into_not_connected().unwrap().try_outgoing().unwrap(); + peer.disconnect(); + } + + #[test] + fn multiple_priority_groups_slot_count() { + let mut peers_state = PeersState::new(1, 1); + let id = PeerId::random(); + + if let Peer::Unknown(p) = peers_state.peer(&id) { + assert!(p.discover().try_accept_incoming().is_ok()); + } else { panic!() } + + assert_eq!(peers_state.num_in, 1); + peers_state.set_priority_group("test1", vec![id.clone()].into_iter().collect()); + assert_eq!(peers_state.num_in, 0); + peers_state.set_priority_group("test2", vec![id.clone()].into_iter().collect()); + assert_eq!(peers_state.num_in, 0); + peers_state.set_priority_group("test1", vec![].into_iter().collect()); + assert_eq!(peers_state.num_in, 0); + peers_state.set_priority_group("test2", vec![].into_iter().collect()); + assert_eq!(peers_state.num_in, 1); + } } diff --git a/core/peerset/tests/fuzz.rs b/core/peerset/tests/fuzz.rs new file mode 100644 index 0000000000000000000000000000000000000000..42a7f2770cc9ccfe64d5d455a1a1046be254bfd1 --- /dev/null +++ b/core/peerset/tests/fuzz.rs @@ -0,0 +1,138 @@ +// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +use futures::prelude::*; +use libp2p::PeerId; +use rand::distributions::{Distribution, Uniform, WeightedIndex}; +use rand::seq::IteratorRandom; +use std::{collections::HashMap, collections::HashSet, iter}; +use substrate_peerset::{IncomingIndex, Message, PeersetConfig, Peerset}; + +#[test] +fn run() { + for _ in 0..50 { + test_once(); + } +} + +fn test_once() { + // PRNG to use. + let mut rng = rand::thread_rng(); + + // Nodes that the peerset knows about. + let mut known_nodes = HashSet::::new(); + // Nodes that we have reserved. Always a subset of `known_nodes`. + let mut reserved_nodes = HashSet::::new(); + + let (mut peerset, peerset_handle) = Peerset::from_config(PeersetConfig { + bootnodes: (0 .. Uniform::new_inclusive(0, 4).sample(&mut rng)).map(|_| { + let id = PeerId::random(); + known_nodes.insert(id.clone()); + id + }).collect(), + reserved_nodes: (0 .. Uniform::new_inclusive(0, 2).sample(&mut rng)).map(|_| { + let id = PeerId::random(); + known_nodes.insert(id.clone()); + reserved_nodes.insert(id.clone()); + id + }).collect(), + reserved_only: Uniform::new_inclusive(0, 10).sample(&mut rng) == 0, + in_peers: Uniform::new_inclusive(0, 25).sample(&mut rng), + out_peers: Uniform::new_inclusive(0, 25).sample(&mut rng), + }); + + tokio::runtime::current_thread::Runtime::new().unwrap().block_on(futures::future::poll_fn(move || -> Result<_, ()> { + // List of nodes the user of `peerset` assumes it's connected to. Always a subset of + // `known_nodes`. + let mut connected_nodes = HashSet::::new(); + // List of nodes the user of `peerset` called `incoming` with and that haven't been + // accepted or rejected yet. + let mut incoming_nodes = HashMap::::new(); + // Next id for incoming connections. + let mut next_incoming_id = IncomingIndex(0); + + // Perform a certain number of actions while checking that the state is consistent. If we + // reach the end of the loop, the run has succeeded. + for _ in 0 .. 2500 { + // Each of these weights corresponds to an action that we may perform. + let action_weights = [150, 90, 90, 30, 30, 1, 1, 4, 4]; + match WeightedIndex::new(&action_weights).unwrap().sample(&mut rng) { + // If we generate 0, poll the peerset. + 0 => match peerset.poll().unwrap() { + Async::Ready(Some(Message::Connect(id))) => { + if let Some(id) = incoming_nodes.iter().find(|(_, v)| **v == id).map(|(&id, _)| id) { + incoming_nodes.remove(&id); + } + assert!(connected_nodes.insert(id)); + } + Async::Ready(Some(Message::Drop(id))) => { connected_nodes.remove(&id); } + Async::Ready(Some(Message::Accept(n))) => + assert!(connected_nodes.insert(incoming_nodes.remove(&n).unwrap())), + Async::Ready(Some(Message::Reject(n))) => + assert!(!connected_nodes.contains(&incoming_nodes.remove(&n).unwrap())), + Async::Ready(None) => panic!(), + Async::NotReady => {} + } + + // If we generate 1, discover a new node. + 1 => { + let new_id = PeerId::random(); + known_nodes.insert(new_id.clone()); + peerset.discovered(iter::once(new_id)); + } + + // If we generate 2, adjust a random reputation. + 2 => if let Some(id) = known_nodes.iter().choose(&mut rng) { + let val = Uniform::new_inclusive(i32::min_value(), i32::max_value()).sample(&mut rng); + peerset_handle.report_peer(id.clone(), val); + } + + // If we generate 3, disconnect from a random node. + 3 => if let Some(id) = connected_nodes.iter().choose(&mut rng).cloned() { + connected_nodes.remove(&id); + peerset.dropped(id); + } + + // If we generate 4, connect to a random node. + 4 => if let Some(id) = known_nodes.iter() + .filter(|n| incoming_nodes.values().all(|m| m != *n) && !connected_nodes.contains(n)) + .choose(&mut rng) { + peerset.incoming(id.clone(), next_incoming_id.clone()); + incoming_nodes.insert(next_incoming_id.clone(), id.clone()); + next_incoming_id.0 += 1; + } + + // 5 and 6 are the reserved-only mode. + 5 => peerset_handle.set_reserved_only(true), + 6 => peerset_handle.set_reserved_only(false), + + // 7 and 8 are about switching a random node in or out of reserved mode. + 7 => if let Some(id) = known_nodes.iter().filter(|n| !reserved_nodes.contains(n)).choose(&mut rng) { + peerset_handle.add_reserved_peer(id.clone()); + reserved_nodes.insert(id.clone()); + } + 8 => if let Some(id) = reserved_nodes.iter().choose(&mut rng).cloned() { + reserved_nodes.remove(&id); + peerset_handle.remove_reserved_peer(id); + } + + _ => unreachable!() + } + } + + Ok(Async::Ready(())) + })).unwrap(); +} diff --git a/core/primitives/Cargo.toml b/core/primitives/Cargo.toml index 8eb62ddf8431ba755029b69d94e7173130767f5d..ab34cfcd1336081448f37778d98e888931c248af 100644 --- a/core/primitives/Cargo.toml +++ b/core/primitives/Cargo.toml @@ -11,7 +11,7 @@ rustc-hex = { version = "2.0", default-features = false } serde = { version = "1.0", optional = true, features = ["derive"] } twox-hash = { version = "1.2.0", optional = true } byteorder = { version = "1.3.1", default-features = false } -primitive-types = { version = "0.2", default-features = false, features = ["codec"] } +primitive-types = { version = "0.2.3", default-features = false, features = ["codec"] } impl-serde = { version = "0.1", optional = true } wasmi = { version = "0.4.3", optional = true } hash-db = { version = "0.12", default-features = false } @@ -25,7 +25,8 @@ sha2 = { version = "0.8", optional = true } substrate-bip39 = { git = "https://github.com/paritytech/substrate-bip39", optional = true } tiny-bip39 = { version = "0.6.1", optional = true } hex = { version = "0.3", optional = true } -regex = {version = "1.1", optional = true } +regex = { version = "1.1", optional = true } +num-traits = { version = "0.2", default-features = false } [dev-dependencies] substrate-serializer = { path = "../serializer" } @@ -71,4 +72,5 @@ std = [ "sha2", "schnorrkel", "regex", + "num-traits/std", ] diff --git a/core/primitives/benches/benches.rs b/core/primitives/benches/benches.rs index 4a003257e2b6d2630c933de2e2dfb00513ccfe1b..4a0e08978fcef7aba8e98f9b2c2a65d91efb171d 100644 --- a/core/primitives/benches/benches.rs +++ b/core/primitives/benches/benches.rs @@ -71,7 +71,7 @@ fn bench_ed25519(c: &mut Criterion) { let msg = (0..msg_size) .map(|_| rand::random::()) .collect::>(); - let key = substrate_primitives::ed25519::Pair::generate(); + let key = substrate_primitives::ed25519::Pair::generate().0; b.iter(|| key.sign(&msg)) }, vec![32, 1024, 1024 * 1024]); @@ -79,7 +79,7 @@ fn bench_ed25519(c: &mut Criterion) { let msg = (0..msg_size) .map(|_| rand::random::()) .collect::>(); - let key = substrate_primitives::ed25519::Pair::generate(); + let key = substrate_primitives::ed25519::Pair::generate().0; let sig = key.sign(&msg); let public = key.public(); b.iter(|| substrate_primitives::ed25519::Pair::verify(&sig, &msg, &public)) diff --git a/core/primitives/src/changes_trie.rs b/core/primitives/src/changes_trie.rs index 2fa11f5641d59090673a618f04a97cee958ca560..eb6a75454fe41d3ebd9fd5d363e20ac920dad630 100644 --- a/core/primitives/src/changes_trie.rs +++ b/core/primitives/src/changes_trie.rs @@ -19,6 +19,7 @@ #[cfg(any(feature = "std", test))] use serde::{Serialize, Deserialize}; use parity_codec::{Encode, Decode}; +use num_traits::Zero; /// Substrate changes trie configuration. #[cfg_attr(any(feature = "std", test), derive(Serialize, Deserialize))] @@ -26,10 +27,14 @@ use parity_codec::{Encode, Decode}; pub struct ChangesTrieConfiguration { /// Interval (in blocks) at which level1-digests are created. Digests are not /// created when this is less or equal to 1. - pub digest_interval: u64, + pub digest_interval: u32, /// Maximal number of digest levels in hierarchy. 0 means that digests are not /// created at all (even level1 digests). 1 means only level1-digests are created. /// 2 means that every digest_interval^2 there will be a level2-digest, and so on. + /// Please ensure that maximum digest interval (i.e. digest_interval^digest_levels) + /// is within `u32` limits. Otherwise you'll never see digests covering such intervals + /// && maximal digests interval will be truncated to the last interval that fits + /// `u32` limits. pub digest_levels: u32, } @@ -40,20 +45,30 @@ impl ChangesTrieConfiguration { } /// Do we need to build digest at given block? - pub fn is_digest_build_required_at_block(&self, block: u64) -> bool { - block != 0 + pub fn is_digest_build_required_at_block(&self, block: Number) -> bool + where + Number: From + PartialEq + ::rstd::ops::Rem + Zero, + { + block != 0.into() && self.is_digest_build_enabled() - && block % self.digest_interval == 0 + && (block % self.digest_interval.into()).is_zero() } /// Returns max digest interval. One if digests are not created at all. - /// Returns ::std::u64::MAX instead of panic in the case of overflow. - pub fn max_digest_interval(&self) -> u64 { + pub fn max_digest_interval(&self) -> u32 { if !self.is_digest_build_enabled() { return 1; } - self.digest_interval.saturating_pow(self.digest_levels) + // we'll get >1 loop iteration only when bad configuration parameters are selected + let mut current_level = self.digest_levels; + loop { + if let Some(max_digest_interval) = self.digest_interval.checked_pow(current_level) { + return max_digest_interval; + } + + current_level = current_level - 1; + } } /// Returns Some if digest must be built at given block number. @@ -63,17 +78,21 @@ impl ChangesTrieConfiguration { /// digest interval (in blocks) /// step between blocks we're interested in when digest is built /// ) - pub fn digest_level_at_block(&self, block: u64) -> Option<(u32, u64, u64)> { - if !self.is_digest_build_required_at_block(block) { + pub fn digest_level_at_block(&self, block: Number) -> Option<(u32, u32, u32)> + where + Number: Clone + From + PartialEq + ::rstd::ops::Rem + Zero, + { + if !self.is_digest_build_required_at_block(block.clone()) { return None; } let mut digest_interval = self.digest_interval; let mut current_level = 1u32; - let mut digest_step = 1u64; + let mut digest_step = 1u32; while current_level < self.digest_levels { let new_digest_interval = match digest_interval.checked_mul(self.digest_interval) { - Some(new_digest_interval) if block % new_digest_interval == 0 => new_digest_interval, + Some(new_digest_interval) if (block.clone() % new_digest_interval.into()).is_zero() + => new_digest_interval, _ => break, }; @@ -94,7 +113,7 @@ impl ChangesTrieConfiguration { mod tests { use super::ChangesTrieConfiguration; - fn config(interval: u64, levels: u32) -> ChangesTrieConfiguration { + fn config(interval: u32, levels: u32) -> ChangesTrieConfiguration { ChangesTrieConfiguration { digest_interval: interval, digest_levels: levels, @@ -112,31 +131,31 @@ mod tests { #[test] fn is_digest_build_required_at_block_works() { - assert!(!config(8, 4).is_digest_build_required_at_block(0)); - assert!(!config(8, 4).is_digest_build_required_at_block(1)); - assert!(!config(8, 4).is_digest_build_required_at_block(2)); - assert!(!config(8, 4).is_digest_build_required_at_block(4)); - assert!(config(8, 4).is_digest_build_required_at_block(8)); - assert!(!config(8, 4).is_digest_build_required_at_block(9)); - assert!(config(8, 4).is_digest_build_required_at_block(64)); - assert!(config(8, 4).is_digest_build_required_at_block(64)); - assert!(config(8, 4).is_digest_build_required_at_block(512)); - assert!(config(8, 4).is_digest_build_required_at_block(4096)); - assert!(!config(8, 4).is_digest_build_required_at_block(4103)); - assert!(config(8, 4).is_digest_build_required_at_block(4104)); - assert!(!config(8, 4).is_digest_build_required_at_block(4108)); + assert!(!config(8, 4).is_digest_build_required_at_block(0u64)); + assert!(!config(8, 4).is_digest_build_required_at_block(1u64)); + assert!(!config(8, 4).is_digest_build_required_at_block(2u64)); + assert!(!config(8, 4).is_digest_build_required_at_block(4u64)); + assert!(config(8, 4).is_digest_build_required_at_block(8u64)); + assert!(!config(8, 4).is_digest_build_required_at_block(9u64)); + assert!(config(8, 4).is_digest_build_required_at_block(64u64)); + assert!(config(8, 4).is_digest_build_required_at_block(64u64)); + assert!(config(8, 4).is_digest_build_required_at_block(512u64)); + assert!(config(8, 4).is_digest_build_required_at_block(4096u64)); + assert!(!config(8, 4).is_digest_build_required_at_block(4103u64)); + assert!(config(8, 4).is_digest_build_required_at_block(4104u64)); + assert!(!config(8, 4).is_digest_build_required_at_block(4108u64)); } #[test] fn digest_level_at_block_works() { - assert_eq!(config(8, 4).digest_level_at_block(0), None); - assert_eq!(config(8, 4).digest_level_at_block(7), None); - assert_eq!(config(8, 4).digest_level_at_block(63), None); - assert_eq!(config(8, 4).digest_level_at_block(8), Some((1, 8, 1))); - assert_eq!(config(8, 4).digest_level_at_block(64), Some((2, 64, 8))); - assert_eq!(config(8, 4).digest_level_at_block(512), Some((3, 512, 64))); - assert_eq!(config(8, 4).digest_level_at_block(4096), Some((4, 4096, 512))); - assert_eq!(config(8, 4).digest_level_at_block(4112), Some((1, 8, 1))); + assert_eq!(config(8, 4).digest_level_at_block(0u64), None); + assert_eq!(config(8, 4).digest_level_at_block(7u64), None); + assert_eq!(config(8, 4).digest_level_at_block(63u64), None); + assert_eq!(config(8, 4).digest_level_at_block(8u64), Some((1, 8, 1))); + assert_eq!(config(8, 4).digest_level_at_block(64u64), Some((2, 64, 8))); + assert_eq!(config(8, 4).digest_level_at_block(512u64), Some((3, 512, 64))); + assert_eq!(config(8, 4).digest_level_at_block(4096u64), Some((4, 4096, 512))); + assert_eq!(config(8, 4).digest_level_at_block(4112u64), Some((1, 8, 1))); } #[test] @@ -144,6 +163,6 @@ mod tests { assert_eq!(config(0, 0).max_digest_interval(), 1); assert_eq!(config(2, 2).max_digest_interval(), 4); assert_eq!(config(8, 4).max_digest_interval(), 4096); - assert_eq!(config(::std::u64::MAX, 1024).max_digest_interval(), ::std::u64::MAX); + assert_eq!(config(::std::u32::MAX, 1024).max_digest_interval(), ::std::u32::MAX); } } diff --git a/core/primitives/src/crypto.rs b/core/primitives/src/crypto.rs index 9cd71bb9b2a390145e7123764e72c9462922def6..9ddc9a93f773c9e083138dc529a7274443399e08 100644 --- a/core/primitives/src/crypto.rs +++ b/core/primitives/src/crypto.rs @@ -18,6 +18,8 @@ //! Cryptographic utilities. // end::description[] +#[cfg(feature = "std")] +use rand::{RngCore, rngs::OsRng}; #[cfg(feature = "std")] use parity_codec::{Encode, Decode}; #[cfg(feature = "std")] @@ -294,7 +296,7 @@ pub trait Pair: Sized + 'static { /// The type used to (minimally) encode the data required to securely create /// a new key pair. - type Seed; + type Seed: Default + AsRef<[u8]> + AsMut<[u8]> + Clone; /// The type used to represent a signature. Can be created from a key pair and a message /// and verified with the message and a public key. @@ -307,7 +309,12 @@ pub trait Pair: Sized + 'static { /// /// This is only for ephemeral keys really, since you won't have access to the secret key /// for storage. If you want a persistent key pair, use `generate_with_phrase` instead. - fn generate() -> Self; + fn generate() -> (Self, Self::Seed) { + let mut csprng: OsRng = OsRng::new().expect("OS random generator works; qed"); + let mut seed = Self::Seed::default(); + csprng.fill_bytes(seed.as_mut()); + (Self::from_seed(&seed), seed) + } /// Generate new secure (random) key pair and provide the recovery phrase. /// @@ -315,10 +322,10 @@ pub trait Pair: Sized + 'static { /// /// This is generally slower than `generate()`, so prefer that unless you need to persist /// the key from the current session. - fn generate_with_phrase(password: Option<&str>) -> (Self, String); + fn generate_with_phrase(password: Option<&str>) -> (Self, String, Self::Seed); /// Returns the KeyPair from the English BIP39 seed `phrase`, or `None` if it's invalid. - fn from_phrase(phrase: &str, password: Option<&str>) -> Result; + fn from_phrase(phrase: &str, password: Option<&str>) -> Result<(Self, Self::Seed), SecretStringError>; /// Derive a child key from a series of given junctions. fn derive>(&self, path: Iter) -> Result; @@ -327,7 +334,7 @@ pub trait Pair: Sized + 'static { /// /// @WARNING: THIS WILL ONLY BE SECURE IF THE `seed` IS SECURE. If it can be guessed /// by an attacker then they can also derive your key. - fn from_seed(seed: Self::Seed) -> Self; + fn from_seed(seed: &Self::Seed) -> Self; /// Make a new key pair from secret seed material. The slice must be the correct size or /// it will return `None`. @@ -424,27 +431,54 @@ mod tests { impl Pair for TestPair { type Public = (); - type Seed = (); + type Seed = [u8; 0]; type Signature = (); type DeriveError = (); - fn generate() -> Self { TestPair::Generated } - fn generate_with_phrase(_password: Option<&str>) -> (Self, String) { (TestPair::GeneratedWithPhrase, "".into()) } - fn from_phrase(phrase: &str, password: Option<&str>) -> Result { - Ok(TestPair::GeneratedFromPhrase{ phrase: phrase.to_owned(), password: password.map(Into::into) }) + fn generate() -> (Self, ::Seed) { (TestPair::Generated, []) } + fn generate_with_phrase(_password: Option<&str>) -> (Self, String, ::Seed) { + (TestPair::GeneratedWithPhrase, "".into(), []) + } + fn from_phrase(phrase: &str, password: Option<&str>) + -> Result<(Self, ::Seed), SecretStringError> + { + Ok((TestPair::GeneratedFromPhrase { + phrase: phrase.to_owned(), + password: password.map(Into::into) + }, [])) } - fn derive>(&self, _path: Iter) -> Result { + fn derive>(&self, _path: Iter) + -> Result + { Err(()) } - fn from_seed(_seed: ::Seed) -> Self { TestPair::Seed(vec![]) } + fn from_seed(_seed: &::Seed) -> Self { TestPair::Seed(vec![]) } fn sign(&self, _message: &[u8]) -> Self::Signature { () } - fn verify, M: AsRef<[u8]>>(_sig: &Self::Signature, _message: M, _pubkey: P) -> bool { true } - fn verify_weak, M: AsRef<[u8]>>(_sig: &[u8], _message: M, _pubkey: P) -> bool { true } + fn verify, M: AsRef<[u8]>>( + _sig: &Self::Signature, + _message: M, + _pubkey: P + ) -> bool { true } + fn verify_weak, M: AsRef<[u8]>>( + _sig: &[u8], + _message: M, + _pubkey: P + ) -> bool { true } fn public(&self) -> Self::Public { () } - fn from_standard_components>(phrase: &str, password: Option<&str>, path: I) -> Result { - Ok(TestPair::Standard { phrase: phrase.to_owned(), password: password.map(ToOwned::to_owned), path: path.collect() }) + fn from_standard_components>( + phrase: &str, + password: Option<&str>, + path: I + ) -> Result { + Ok(TestPair::Standard { + phrase: phrase.to_owned(), + password: password.map(ToOwned::to_owned), + path: path.collect() + }) } - fn from_seed_slice(seed: &[u8]) -> Result { + fn from_seed_slice(seed: &[u8]) + -> Result + { Ok(TestPair::Seed(seed.to_owned())) } } diff --git a/core/primitives/src/ed25519.rs b/core/primitives/src/ed25519.rs index 135c551e454b794f3358982e1a9a0e012992ae21..26086816a3e5a23335e31f423101a4a22544d8d1 100644 --- a/core/primitives/src/ed25519.rs +++ b/core/primitives/src/ed25519.rs @@ -29,8 +29,6 @@ use substrate_bip39::seed_from_entropy; #[cfg(feature = "std")] use bip39::{Mnemonic, Language, MnemonicType}; #[cfg(feature = "std")] -use rand::Rng; -#[cfg(feature = "std")] use crate::crypto::{Pair as TraitPair, DeriveJunction, SecretStringError, Derive, Ss58Codec}; #[cfg(feature = "std")] use serde::{de, Serializer, Serialize, Deserializer, Deserialize}; @@ -355,46 +353,38 @@ impl TraitPair for Pair { type Signature = Signature; type DeriveError = DeriveError; - /// Generate new secure (random) key pair. - /// - /// This is only for ephemeral keys really, since you won't have access to the secret key - /// for storage. If you want a persistent key pair, use `generate_with_phrase` instead. - fn generate() -> Pair { - let mut seed: Seed = Default::default(); - rand::rngs::EntropyRng::new().fill(seed.as_mut()); - Self::from_seed(seed) - } - /// Generate new secure (random) key pair and provide the recovery phrase. /// /// You can recover the same key later with `from_phrase`. - fn generate_with_phrase(password: Option<&str>) -> (Pair, String) { + fn generate_with_phrase(password: Option<&str>) -> (Pair, String, Seed) { let mnemonic = Mnemonic::new(MnemonicType::Words12, Language::English); let phrase = mnemonic.phrase(); + let (pair, seed) = Self::from_phrase(phrase, password) + .expect("All phrases generated by Mnemonic are valid; qed"); ( - Self::from_phrase(phrase, password).expect("All phrases generated by Mnemonic are valid; qed"), + pair, phrase.to_owned(), + seed, ) } /// Generate key pair from given recovery phrase and password. - fn from_phrase(phrase: &str, password: Option<&str>) -> Result { + fn from_phrase(phrase: &str, password: Option<&str>) -> Result<(Pair, Seed), SecretStringError> { let big_seed = seed_from_entropy( Mnemonic::from_phrase(phrase, Language::English) .map_err(|_| SecretStringError::InvalidPhrase)?.entropy(), password.unwrap_or(""), ).map_err(|_| SecretStringError::InvalidSeed)?; - Self::from_seed_slice(&big_seed[0..32]) + let mut seed = Seed::default(); + seed.copy_from_slice(&big_seed[0..32]); + Self::from_seed_slice(&big_seed[0..32]).map(|x| (x, seed)) } /// Make a new key pair from secret seed material. /// /// You should never need to use this; generate(), generate_with_phrasee - fn from_seed(seed: Seed) -> Pair { - let secret = ed25519_dalek::SecretKey::from_bytes(&seed[..]) - .expect("seed has valid length; qed"); - let public = ed25519_dalek::PublicKey::from(&secret); - Pair(ed25519_dalek::Keypair { secret, public }) + fn from_seed(seed: &Seed) -> Pair { + Self::from_seed_slice(&seed[..]).expect("seed has valid length; qed") } /// Make a new key pair from secret seed material. The slice must be 32 bytes long or it @@ -402,30 +392,33 @@ impl TraitPair for Pair { /// /// You should never need to use this; generate(), generate_with_phrase fn from_seed_slice(seed_slice: &[u8]) -> Result { - if seed_slice.len() != 32 { - Err(SecretStringError::InvalidSeedLength) - } else { - let mut seed = [0u8; 32]; - seed.copy_from_slice(&seed_slice); - Ok(Self::from_seed(seed)) - } + let secret = ed25519_dalek::SecretKey::from_bytes(seed_slice) + .map_err(|_| SecretStringError::InvalidSeedLength)?; + let public = ed25519_dalek::PublicKey::from(&secret); + Ok(Pair(ed25519_dalek::Keypair { secret, public })) } /// Derive a child key from a series of given junctions. fn derive>(&self, path: Iter) -> Result { - let mut acc = self.0.public.to_bytes(); + let mut acc = self.0.secret.to_bytes(); for j in path { match j { DeriveJunction::Soft(_cc) => return Err(DeriveError::SoftKeyInPath), DeriveJunction::Hard(cc) => acc = derive_hard_junction(&acc, &cc), } } - Ok(Self::from_seed(acc)) + Ok(Self::from_seed(&acc)) } /// Generate a key from the phrase, password and derivation path. - fn from_standard_components>(phrase: &str, password: Option<&str>, path: I) -> Result { - Self::from_phrase(phrase, password)?.derive(path).map_err(|_| SecretStringError::InvalidPath) + fn from_standard_components>( + phrase: &str, + password: Option<&str>, + path: I + ) -> Result { + Self::from_phrase(phrase, password)?.0 + .derive(path) + .map_err(|_| SecretStringError::InvalidPath) } /// Get the public key. @@ -473,7 +466,7 @@ impl TraitPair for Pair { impl Pair { /// Get the seed for this key. pub fn seed(&self) -> &Seed { - self.0.public.as_bytes() + self.0.secret.as_bytes() } /// Exactly as `from_string` except that if no matches are found then, the the first 32 @@ -483,7 +476,7 @@ impl Pair { let mut padded_seed: Seed = [' ' as u8; 32]; let len = s.len().min(32); padded_seed[..len].copy_from_slice(&s.as_bytes()[..len]); - Self::from_seed(padded_seed) + Self::from_seed(&padded_seed) }) } } @@ -502,31 +495,55 @@ mod test { ); } + #[test] + fn seed_and_derive_should_work() { + let seed = hex!("9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60"); + let pair = Pair::from_seed(&seed); + assert_eq!(pair.seed(), &seed); + let path = vec![DeriveJunction::Hard([0u8; 32])]; + let derived = pair.derive(path.into_iter()).ok().unwrap(); + assert_eq!( + derived.seed(), + &hex!("ede3354e133f9c8e337ddd6ee5415ed4b4ffe5fc7d21e933f4930a3730e5b21c") + ); + } + #[test] fn test_vector_should_work() { - let pair: Pair = Pair::from_seed(hex!("9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60")); + let pair = Pair::from_seed( + &hex!("9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60") + ); let public = pair.public(); - assert_eq!(public, Public::from_raw(hex!("d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a"))); + assert_eq!(public, Public::from_raw( + hex!("d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a") + )); let message = b""; - let signature = Signature::from_raw(hex!("e5564300c360ac729086e2cc806e828a84877f1eb8e5d974d873e065224901555fb8821590a33bacc61e39701cf9b46bd25bf5f0595bbe24655141438e7a100b")); + let signature = hex!("e5564300c360ac729086e2cc806e828a84877f1eb8e5d974d873e065224901555fb8821590a33bacc61e39701cf9b46bd25bf5f0595bbe24655141438e7a100b"); + let signature = Signature::from_raw(signature); assert!(&pair.sign(&message[..]) == &signature); assert!(Pair::verify(&signature, &message[..], &public)); } #[test] fn test_vector_by_string_should_work() { - let pair: Pair = Pair::from_string("0x9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60", None).unwrap(); + let pair = Pair::from_string( + "0x9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60", + None + ).unwrap(); let public = pair.public(); - assert_eq!(public, Public::from_raw(hex!("d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a"))); + assert_eq!(public, Public::from_raw( + hex!("d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a") + )); let message = b""; - let signature = Signature::from_raw(hex!("e5564300c360ac729086e2cc806e828a84877f1eb8e5d974d873e065224901555fb8821590a33bacc61e39701cf9b46bd25bf5f0595bbe24655141438e7a100b")); + let signature = hex!("e5564300c360ac729086e2cc806e828a84877f1eb8e5d974d873e065224901555fb8821590a33bacc61e39701cf9b46bd25bf5f0595bbe24655141438e7a100b"); + let signature = Signature::from_raw(signature); assert!(&pair.sign(&message[..]) == &signature); assert!(Pair::verify(&signature, &message[..], &public)); } #[test] fn generated_pair_should_work() { - let pair = Pair::generate(); + let (pair, _) = Pair::generate(); let public = pair.public(); let message = b"Something important"; let signature = pair.sign(&message[..]); @@ -536,9 +553,11 @@ mod test { #[test] fn seeded_pair_should_work() { - let pair = Pair::from_seed(*b"12345678901234567890123456789012"); + let pair = Pair::from_seed(b"12345678901234567890123456789012"); let public = pair.public(); - assert_eq!(public, Public::from_raw(hex!("2f8c6129d816cf51c374bc7f08c3e63ed156cf78aefb4a6550d97b87997977ee"))); + assert_eq!(public, Public::from_raw( + hex!("2f8c6129d816cf51c374bc7f08c3e63ed156cf78aefb4a6550d97b87997977ee") + )); let message = hex!("2f8c6129d816cf51c374bc7f08c3e63ed156cf78aefb4a6550d97b87997977ee00000000000000000200d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a4500000000000000"); let signature = pair.sign(&message[..]); println!("Correct signature: {:?}", signature); @@ -548,31 +567,31 @@ mod test { #[test] fn generate_with_phrase_recovery_possible() { - let (pair1, phrase) = Pair::generate_with_phrase(None); - let pair2 = Pair::from_phrase(&phrase, None).unwrap(); + let (pair1, phrase, _) = Pair::generate_with_phrase(None); + let (pair2, _) = Pair::from_phrase(&phrase, None).unwrap(); assert_eq!(pair1.public(), pair2.public()); } #[test] fn generate_with_password_phrase_recovery_possible() { - let (pair1, phrase) = Pair::generate_with_phrase(Some("password")); - let pair2 = Pair::from_phrase(&phrase, Some("password")).unwrap(); + let (pair1, phrase, _) = Pair::generate_with_phrase(Some("password")); + let (pair2, _) = Pair::from_phrase(&phrase, Some("password")).unwrap(); assert_eq!(pair1.public(), pair2.public()); } #[test] fn password_does_something() { - let (pair1, phrase) = Pair::generate_with_phrase(Some("password")); - let pair2 = Pair::from_phrase(&phrase, None).unwrap(); + let (pair1, phrase, _) = Pair::generate_with_phrase(Some("password")); + let (pair2, _) = Pair::from_phrase(&phrase, None).unwrap(); assert_ne!(pair1.public(), pair2.public()); } #[test] fn ss58check_roundtrip_works() { - let pair = Pair::from_seed(*b"12345678901234567890123456789012"); + let pair = Pair::from_seed(b"12345678901234567890123456789012"); let public = pair.public(); let s = public.to_ss58check(); println!("Correct: {}", s); diff --git a/core/primitives/src/hexdisplay.rs b/core/primitives/src/hexdisplay.rs index d748208d0e09ff911be9245a4588ece343191d59..cd2b6c18cb7fed04ecb08a2a6ac936c7853a1762 100644 --- a/core/primitives/src/hexdisplay.rs +++ b/core/primitives/src/hexdisplay.rs @@ -21,7 +21,7 @@ pub struct HexDisplay<'a>(&'a [u8]); impl<'a> HexDisplay<'a> { /// Create new instance that will display `d` as a hex string when displayed. - pub fn from(d: &'a AsBytesRef) -> Self { HexDisplay(d.as_bytes_ref()) } + pub fn from(d: &'a dyn AsBytesRef) -> Self { HexDisplay(d.as_bytes_ref()) } } impl<'a> ::core::fmt::Display for HexDisplay<'a> { @@ -79,7 +79,7 @@ pub fn ascii_format(asciish: &[u8]) -> String { let mut latch = false; for c in asciish { match (latch, *c) { - (false, 32...127) => r.push(*c as char), + (false, 32..=127) => r.push(*c as char), _ => { if !latch { r.push('#'); diff --git a/core/primitives/src/lib.rs b/core/primitives/src/lib.rs index c9008171df94376893596b39790d15db3d8bffe4..7c0fd324fe0e1aaa25403dd6a920f2f526205d19 100644 --- a/core/primitives/src/lib.rs +++ b/core/primitives/src/lib.rs @@ -56,6 +56,7 @@ pub mod ed25519; pub mod sr25519; pub mod hash; mod hasher; +pub mod offchain; pub mod sandbox; pub mod storage; pub mod uint; @@ -85,25 +86,11 @@ pub enum ExecutionContext { /// Context used for block construction. BlockConstruction, /// Offchain worker context. - OffchainWorker(Box), + OffchainWorker(Box), /// Context used for other calls. Other, } -/// An extended externalities for offchain workers. -pub trait OffchainExt { - /// Submits an extrinsics. - /// - /// The extrinsic will either go to the pool (signed) - /// or to the next produced block (inherent). - fn submit_extrinsic(&mut self, extrinsic: Vec); -} -impl OffchainExt for Box { - fn submit_extrinsic(&mut self, ex: Vec) { - (&mut **self).submit_extrinsic(ex) - } -} - /// Hex-serialized shim for `Vec`. #[derive(PartialEq, Eq, Clone)] #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug, Hash, PartialOrd, Ord))] diff --git a/core/primitives/src/offchain.rs b/core/primitives/src/offchain.rs new file mode 100644 index 0000000000000000000000000000000000000000..7d54c9d61eb31d47d8e3bca8232544ca915203b2 --- /dev/null +++ b/core/primitives/src/offchain.rs @@ -0,0 +1,410 @@ +// Copyright 2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +//! Offchain workers types + +use rstd::prelude::{Vec, Box}; +use rstd::convert::TryFrom; + +/// A type of supported crypto. +#[derive(Clone, Copy, PartialEq, Eq)] +#[cfg_attr(feature = "std", derive(Debug))] +#[repr(C)] +pub enum CryptoKind { + /// SR25519 crypto (Schnorrkel) + Sr25519 = 1, + /// ED25519 crypto (Edwards) + Ed25519 = 2, +} + +impl TryFrom for CryptoKind { + type Error = (); + + fn try_from(kind: u32) -> Result { + match kind { + e if e == u32::from(CryptoKind::Sr25519 as u8) => Ok(CryptoKind::Sr25519), + e if e == u32::from(CryptoKind::Ed25519 as u8) => Ok(CryptoKind::Ed25519), + _ => Err(()) + } + } +} + +/// Opaque type for created crypto keys. +#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] +#[cfg_attr(feature = "std", derive(Debug))] +pub struct CryptoKeyId(pub u16); + +/// Opaque type for offchain http requests. +#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] +#[cfg_attr(feature = "std", derive(Debug))] +pub struct HttpRequestId(pub u16); + +/// An error enum returned by some http methods. +#[derive(Clone, Copy, PartialEq, Eq)] +#[cfg_attr(feature = "std", derive(Debug))] +#[repr(C)] +pub enum HttpError { + /// The requested action couldn't been completed within a deadline. + DeadlineReached = 1, + /// There was an IO Error while processing the request. + IoError = 2, +} + +impl TryFrom for HttpError { + type Error = (); + + fn try_from(error: u32) -> Result { + match error { + e if e == HttpError::DeadlineReached as u8 as u32 => Ok(HttpError::DeadlineReached), + e if e == HttpError::IoError as u8 as u32 => Ok(HttpError::IoError), + _ => Err(()) + } + } +} + +/// Status of the HTTP request +#[derive(Clone, Copy, PartialEq, Eq)] +#[cfg_attr(feature = "std", derive(Debug))] +pub enum HttpRequestStatus { + /// Deadline was reached while we waited for this request to finish. + /// + /// Note the deadline is controlled by the calling part, it not necessarily means + /// that the request has timed out. + DeadlineReached, + /// Request timed out. + /// + /// This means that the request couldn't be completed by the host environment + /// within a reasonable time (according to the host), has now been terminated + /// and is considered finished. + /// To retry the request you need to construct it again. + Timeout, + /// Request status of this ID is not known. + Unknown, + /// The request has finished with given status code. + Finished(u16), +} + +impl From for u32 { + fn from(status: HttpRequestStatus) -> Self { + match status { + HttpRequestStatus::Unknown => 0, + HttpRequestStatus::DeadlineReached => 10, + HttpRequestStatus::Timeout => 20, + HttpRequestStatus::Finished(code) => u32::from(code), + } + } +} + +impl TryFrom for HttpRequestStatus { + type Error = (); + + fn try_from(status: u32) -> Result { + match status { + 0 => Ok(HttpRequestStatus::Unknown), + 10 => Ok(HttpRequestStatus::DeadlineReached), + 20 => Ok(HttpRequestStatus::Timeout), + 100..=999 => u16::try_from(status).map(HttpRequestStatus::Finished).map_err(|_| ()), + _ => Err(()), + } + } +} + +/// Opaque timestamp type +#[derive(Clone, Copy, PartialEq, Eq, Ord, PartialOrd, Default)] +#[cfg_attr(feature = "std", derive(Debug))] +pub struct Timestamp(u64); + +/// Duration type +#[derive(Clone, Copy, PartialEq, Eq, Ord, PartialOrd, Default)] +#[cfg_attr(feature = "std", derive(Debug))] +pub struct Duration(u64); + +impl Duration { + /// Create new duration representing given number of milliseconds. + pub fn from_millis(millis: u64) -> Self { + Duration(millis) + } + + /// Returns number of milliseconds this Duration represents. + pub fn millis(&self) -> u64 { + self.0 + } +} + +impl Timestamp { + /// Creates new `Timestamp` given unix timestamp in miliseconds. + pub fn from_unix_millis(millis: u64) -> Self { + Timestamp(millis) + } + + /// Increase the timestamp by given `Duration`. + pub fn add(&self, duration: Duration) -> Timestamp { + Timestamp(self.0.saturating_add(duration.0)) + } + + /// Decrease the timestamp by given `Duration` + pub fn sub(&self, duration: Duration) -> Timestamp { + Timestamp(self.0.saturating_sub(duration.0)) + } + + /// Returns a saturated difference (Duration) between two Timestamps. + pub fn diff(&self, other: &Self) -> Duration { + Duration(self.0.saturating_sub(other.0)) + } + + /// Return number of milliseconds since UNIX epoch. + pub fn unix_millis(&self) -> u64 { + self.0 + } +} + +/// An extended externalities for offchain workers. +pub trait Externalities { + /// Submit transaction. + /// + /// The transaction will end up in the pool and be propagated to others. + fn submit_transaction(&mut self, extrinsic: Vec) -> Result<(), ()>; + + /// Create new key(pair) for signing/encryption/decryption. + /// + /// Returns an error if given crypto kind is not supported. + fn new_crypto_key(&mut self, crypto: CryptoKind) -> Result; + + /// Encrypt a piece of data using given crypto key. + /// + /// If `key` is `None`, it will attempt to use current authority key. + /// + /// Returns an error if `key` is not available or does not exist. + fn encrypt(&mut self, key: Option, data: &[u8]) -> Result, ()>; + + /// Decrypt a piece of data using given crypto key. + /// + /// If `key` is `None`, it will attempt to use current authority key. + /// + /// Returns an error if data cannot be decrypted or the `key` is not available or does not exist. + fn decrypt(&mut self, key: Option, data: &[u8]) -> Result, ()>; + + /// Sign a piece of data using given crypto key. + /// + /// If `key` is `None`, it will attempt to use current authority key. + /// + /// Returns an error if `key` is not available or does not exist. + fn sign(&mut self, key: Option, data: &[u8]) -> Result, ()>; + + /// Verifies that `signature` for `msg` matches given `key`. + /// + /// Returns an `Ok` with `true` in case it does, `false` in case it doesn't. + /// Returns an error in case the key is not available or does not exist or the parameters + /// lengths are incorrect. + fn verify(&mut self, key: Option, msg: &[u8], signature: &[u8]) -> Result; + + /// Returns current UNIX timestamp (in millis) + fn timestamp(&mut self) -> Timestamp; + + /// Pause the execution until `deadline` is reached. + fn sleep_until(&mut self, deadline: Timestamp); + + /// Returns a random seed. + /// + /// This is a trully random non deterministic seed generated by host environment. + /// Obviously fine in the off-chain worker context. + fn random_seed(&mut self) -> [u8; 32]; + + /// Sets a value in the local storage. + /// + /// Note this storage is not part of the consensus, it's only accessible by + /// offchain worker tasks running on the same machine. It IS persisted between runs. + fn local_storage_set(&mut self, key: &[u8], value: &[u8]); + + /// Sets a value in the local storage if it matches current value. + /// + /// Since multiple offchain workers may be running concurrently, to prevent + /// data races use CAS to coordinate between them. + /// + /// Note this storage is not part of the consensus, it's only accessible by + /// offchain worker tasks running on the same machine. It IS persisted between runs. + fn local_storage_compare_and_set(&mut self, key: &[u8], old_value: &[u8], new_value: &[u8]); + + /// Gets a value from the local storage. + /// + /// If the value does not exist in the storage `None` will be returned. + /// Note this storage is not part of the consensus, it's only accessible by + /// offchain worker tasks running on the same machine. It IS persisted between runs. + fn local_storage_get(&mut self, key: &[u8]) -> Option>; + + /// Initiaties a http request given HTTP verb and the URL. + /// + /// Meta is a future-reserved field containing additional, parity-codec encoded parameters. + /// Returns the id of newly started request. + fn http_request_start( + &mut self, + method: &str, + uri: &str, + meta: &[u8] + ) -> Result; + + /// Append header to the request. + fn http_request_add_header( + &mut self, + request_id: HttpRequestId, + name: &str, + value: &str + ) -> Result<(), ()>; + + /// Write a chunk of request body. + /// + /// Writing an empty chunks finalises the request. + /// Passing `None` as deadline blocks forever. + /// + /// Returns an error in case deadline is reached or the chunk couldn't be written. + fn http_request_write_body( + &mut self, + request_id: HttpRequestId, + chunk: &[u8], + deadline: Option + ) -> Result<(), HttpError>; + + /// Block and wait for the responses for given requests. + /// + /// Returns a vector of request statuses (the len is the same as ids). + /// Note that if deadline is not provided the method will block indefinitely, + /// otherwise unready responses will produce `DeadlineReached` status. + /// + /// Passing `None` as deadline blocks forever. + fn http_response_wait( + &mut self, + ids: &[HttpRequestId], + deadline: Option + ) -> Vec; + + /// Read all response headers. + /// + /// Returns a vector of pairs `(HeaderKey, HeaderValue)`. + fn http_response_headers( + &mut self, + request_id: HttpRequestId + ) -> Vec<(Vec, Vec)>; + + /// Read a chunk of body response to given buffer. + /// + /// Returns the number of bytes written or an error in case a deadline + /// is reached or server closed the connection. + /// Passing `None` as a deadline blocks forever. + fn http_response_read_body( + &mut self, + request_id: HttpRequestId, + buffer: &mut [u8], + deadline: Option + ) -> Result; + +} +impl Externalities for Box { + fn submit_transaction(&mut self, ex: Vec) -> Result<(), ()> { + (&mut **self).submit_transaction(ex) + } + + fn new_crypto_key(&mut self, crypto: CryptoKind) -> Result { + (&mut **self).new_crypto_key(crypto) + } + + fn encrypt(&mut self, key: Option, data: &[u8]) -> Result, ()> { + (&mut **self).encrypt(key, data) + } + + fn decrypt(&mut self, key: Option, data: &[u8]) -> Result, ()> { + (&mut **self).decrypt(key, data) + } + + fn sign(&mut self, key: Option, data: &[u8]) -> Result, ()> { + (&mut **self).sign(key, data) + } + + fn verify(&mut self, key: Option, msg: &[u8], signature: &[u8]) -> Result { + (&mut **self).verify(key, msg, signature) + } + + fn timestamp(&mut self) -> Timestamp { + (&mut **self).timestamp() + } + + fn sleep_until(&mut self, deadline: Timestamp) { + (&mut **self).sleep_until(deadline) + } + + fn random_seed(&mut self) -> [u8; 32] { + (&mut **self).random_seed() + } + + fn local_storage_set(&mut self, key: &[u8], value: &[u8]) { + (&mut **self).local_storage_set(key, value) + } + + fn local_storage_compare_and_set(&mut self, key: &[u8], old_value: &[u8], new_value: &[u8]) { + (&mut **self).local_storage_compare_and_set(key, old_value, new_value) + } + + fn local_storage_get(&mut self, key: &[u8]) -> Option> { + (&mut **self).local_storage_get(key) + } + + fn http_request_start(&mut self, method: &str, uri: &str, meta: &[u8]) -> Result { + (&mut **self).http_request_start(method, uri, meta) + } + + fn http_request_add_header(&mut self, request_id: HttpRequestId, name: &str, value: &str) -> Result<(), ()> { + (&mut **self).http_request_add_header(request_id, name, value) + } + + fn http_request_write_body( + &mut self, + request_id: HttpRequestId, + chunk: &[u8], + deadline: Option + ) -> Result<(), HttpError> { + (&mut **self).http_request_write_body(request_id, chunk, deadline) + } + + fn http_response_wait(&mut self, ids: &[HttpRequestId], deadline: Option) -> Vec { + (&mut **self).http_response_wait(ids, deadline) + } + + fn http_response_headers(&mut self, request_id: HttpRequestId) -> Vec<(Vec, Vec)> { + (&mut **self).http_response_headers(request_id) + } + + fn http_response_read_body( + &mut self, + request_id: HttpRequestId, + buffer: &mut [u8], + deadline: Option + ) -> Result { + (&mut **self).http_response_read_body(request_id, buffer, deadline) + } +} + + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn timestamp_ops() { + let t = Timestamp(5); + assert_eq!(t.add(Duration::from_millis(10)), Timestamp(15)); + assert_eq!(t.sub(Duration::from_millis(10)), Timestamp(0)); + assert_eq!(t.diff(&Timestamp(3)), Duration(2)); + } +} diff --git a/core/primitives/src/sr25519.rs b/core/primitives/src/sr25519.rs index 8f309ec0306a1523ae9223efc3df8976c94f6e74..aa2db2dc1263cb8a3897ad51a1848b161c8e0f1b 100644 --- a/core/primitives/src/sr25519.rs +++ b/core/primitives/src/sr25519.rs @@ -21,8 +21,6 @@ //! for this to work. // end::description[] -#[cfg(feature = "std")] -use rand::rngs::OsRng; #[cfg(feature = "std")] use schnorrkel::{signing_context, Keypair, SecretKey, MiniSecretKey, PublicKey, derive::{Derivation, ChainCode, CHAIN_CODE_LENGTH} @@ -204,16 +202,16 @@ impl From for Signature { } #[cfg(feature = "std")] -impl ::std::fmt::Debug for Signature { +impl std::fmt::Debug for Signature { fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { write!(f, "{}", crate::hexdisplay::HexDisplay::from(&self.0)) } } #[cfg(feature = "std")] -impl ::std::hash::Hash for Signature { - fn hash(&self, state: &mut H) { - ::std::hash::Hash::hash(&self.0[..], state); +impl std::hash::Hash for Signature { + fn hash(&self, state: &mut H) { + std::hash::Hash::hash(&self.0[..], state); } } @@ -304,15 +302,13 @@ impl Public { /// Return a `Vec` filled with raw data. #[cfg(feature = "std")] - pub fn to_raw_vec(self) -> Vec { - let r: &[u8; 32] = self.as_ref(); - r.to_vec() + pub fn into_raw_vec(self) -> Vec { + self.0.to_vec() } /// Return a slice filled with raw data. pub fn as_slice(&self) -> &[u8] { - let r: &[u8; 32] = self.as_ref(); - &r[..] + &self.0 } /// Return a slice filled with raw data. @@ -379,23 +375,14 @@ impl TraitPair for Pair { type Signature = Signature; type DeriveError = Infallible; - /// Generate new secure (random) key pair. - fn generate() -> Pair { - let mut csprng: OsRng = OsRng::new().expect("os random generator works; qed"); - let key_pair: Keypair = Keypair::generate(&mut csprng); - Pair(key_pair) - } - /// Make a new key pair from raw secret seed material. /// /// This is generated using schnorrkel's Mini-Secret-Keys. /// /// A MiniSecretKey is literally what Ed25519 calls a SecretKey, which is just 32 random bytes. - fn from_seed(seed: Seed) -> Pair { - let mini_key: MiniSecretKey = MiniSecretKey::from_bytes(&seed[..]) - .expect("32 bytes can always build a key; qed"); - let kp = mini_key.expand_to_keypair(); - Pair(kp) + fn from_seed(seed: &Seed) -> Pair { + Self::from_seed_slice(&seed[..]) + .expect("32 bytes can always build a key; qed") } /// Get the public key. @@ -422,22 +409,29 @@ impl TraitPair for Pair { } /// Generate a key from the phrase, password and derivation path. - fn from_standard_components>(phrase: &str, password: Option<&str>, path: I) -> Result { - Self::from_phrase(phrase, password)? + fn from_standard_components>( + phrase: &str, + password: Option<&str>, + path: I + ) -> Result { + Self::from_phrase(phrase, password)?.0 .derive(path) .map_err(|_| SecretStringError::InvalidPath) } - fn generate_with_phrase(password: Option<&str>) -> (Pair, String) { + fn generate_with_phrase(password: Option<&str>) -> (Pair, String, Seed) { let mnemonic = Mnemonic::new(MnemonicType::Words12, Language::English); let phrase = mnemonic.phrase(); + let (pair, seed) = Self::from_phrase(phrase, password) + .expect("All phrases generated by Mnemonic are valid; qed"); ( - Self::from_phrase(phrase, password).expect("All phrases generated by Mnemonic are valid; qed"), + pair, phrase.to_owned(), + seed, ) } - fn from_phrase(phrase: &str, password: Option<&str>) -> Result { + fn from_phrase(phrase: &str, password: Option<&str>) -> Result<(Pair, Seed), SecretStringError> { Mnemonic::from_phrase(phrase, Language::English) .map_err(|_| SecretStringError::InvalidPhrase) .map(|m| Self::from_entropy(m.entropy(), password)) @@ -492,11 +486,12 @@ impl Pair { /// /// This uses a key derivation function to convert the entropy into a seed, then returns /// the pair generated from it. - pub fn from_entropy(entropy: &[u8], password: Option<&str>) -> Pair { + pub fn from_entropy(entropy: &[u8], password: Option<&str>) -> (Pair, Seed) { let mini_key: MiniSecretKey = mini_secret_from_entropy(entropy, password.unwrap_or("")) .expect("32 bytes can always build a key; qed"); + let kp = mini_key.expand_to_keypair(); - Pair(kp) + (Pair(kp), mini_key.to_bytes()) } } @@ -540,7 +535,7 @@ mod test { #[test] fn derive_soft_should_work() { - let pair: Pair = Pair::from_seed(hex!( + let pair = Pair::from_seed(&hex!( "9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60" )); let derive_1 = pair.derive(Some(DeriveJunction::soft(1)).into_iter()).unwrap(); @@ -552,7 +547,7 @@ mod test { #[test] fn derive_hard_should_work() { - let pair: Pair = Pair::from_seed(hex!( + let pair = Pair::from_seed(&hex!( "9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60" )); let derive_1 = pair.derive(Some(DeriveJunction::hard(1)).into_iter()).unwrap(); @@ -564,7 +559,7 @@ mod test { #[test] fn derive_soft_public_should_work() { - let pair: Pair = Pair::from_seed(hex!( + let pair = Pair::from_seed(&hex!( "9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60" )); let path = Some(DeriveJunction::soft(1)); @@ -575,7 +570,7 @@ mod test { #[test] fn derive_hard_public_should_fail() { - let pair: Pair = Pair::from_seed(hex!( + let pair = Pair::from_seed(&hex!( "9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60" )); let path = Some(DeriveJunction::hard(1)); @@ -584,7 +579,7 @@ mod test { #[test] fn sr_test_vector_should_work() { - let pair: Pair = Pair::from_seed(hex!( + let pair = Pair::from_seed(&hex!( "9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60" )); let public = pair.public(); @@ -601,7 +596,7 @@ mod test { #[test] fn generated_pair_should_work() { - let pair = Pair::generate(); + let (pair, _) = Pair::generate(); let public = pair.public(); let message = b"Something important"; let signature = pair.sign(&message[..]); @@ -611,7 +606,7 @@ mod test { #[test] fn seeded_pair_should_work() { - let pair = Pair::from_seed(*b"12345678901234567890123456789012"); + let pair = Pair::from_seed(b"12345678901234567890123456789012"); let public = pair.public(); assert_eq!( public, @@ -626,7 +621,7 @@ mod test { #[test] fn ss58check_roundtrip_works() { - let pair = Pair::generate(); + let (pair, _) = Pair::generate(); let public = pair.public(); let s = public.to_ss58check(); println!("Correct: {}", s); @@ -637,11 +632,15 @@ mod test { #[test] fn verify_from_wasm_works() { // The values in this test case are compared to the output of `node-test.js` in schnorrkel-js. - // + // // This is to make sure that the wasm library is compatible. - let pk = Pair::from_seed(hex!("0000000000000000000000000000000000000000000000000000000000000000")); + let pk = Pair::from_seed( + &hex!("0000000000000000000000000000000000000000000000000000000000000000") + ); let public = pk.public(); - let js_signature = Signature::from_raw(hex!("28a854d54903e056f89581c691c1f7d2ff39f8f896c9e9c22475e60902cc2b3547199e0e91fa32902028f2ca2355e8cdd16cfe19ba5e8b658c94aa80f3b81a00")); + let js_signature = Signature::from_raw( + hex!("28a854d54903e056f89581c691c1f7d2ff39f8f896c9e9c22475e60902cc2b3547199e0e91fa32902028f2ca2355e8cdd16cfe19ba5e8b658c94aa80f3b81a00") + ); assert!(Pair::verify(&js_signature, b"SUBSTRATE", public)); } } diff --git a/core/primitives/src/storage.rs b/core/primitives/src/storage.rs index 4746d230d08070e188cf756fab628629016a1e8c..8fdb7bdcc40c03618ea1eb3f02f7356676452c1e 100644 --- a/core/primitives/src/storage.rs +++ b/core/primitives/src/storage.rs @@ -58,24 +58,9 @@ pub mod well_known_keys { /// The type of this value is encoded `u64`. pub const HEAP_PAGES: &'static [u8] = b":heappages"; - /// Number of authorities. - /// - /// The type of this value is encoded `u32`. Required by substrate. - pub const AUTHORITY_COUNT: &'static [u8] = b":auth:len"; - - /// Prefix under which authorities are storied. - /// - /// The full key for N-th authority is generated as: - /// - /// `(n as u32).to_keyed_vec(AUTHORITY_PREFIX)`. - pub const AUTHORITY_PREFIX: &'static [u8] = b":auth:"; - /// Current extrinsic index (u32) is stored under this key. pub const EXTRINSIC_INDEX: &'static [u8] = b":extrinsic_index"; - /// Sum of all lengths of executed extrinsics (u32). - pub const ALL_EXTRINSICS_LEN: &'static [u8] = b":all_extrinsics_len"; - /// Changes trie configuration is stored under this key. pub const CHANGES_TRIE_CONFIG: &'static [u8] = b":changes_trie"; diff --git a/core/primitives/src/u32_trait.rs b/core/primitives/src/u32_trait.rs index 3fcdceac4cbbfacea532c498648ccee980a0e36c..d8fac34c301ab4ee78417c1d8c8755e89b53795a 100644 --- a/core/primitives/src/u32_trait.rs +++ b/core/primitives/src/u32_trait.rs @@ -21,6 +21,7 @@ pub trait Value { /// The actual value represented by the impl'ing type. const VALUE: u32; } + /// Type representing the value 0 for the `Value` trait. pub struct _0; impl Value for _0 { const VALUE: u32 = 0; } /// Type representing the value 1 for the `Value` trait. @@ -55,22 +56,174 @@ pub struct _14; impl Value for _14 { const VALUE: u32 = 14; } pub struct _15; impl Value for _15 { const VALUE: u32 = 15; } /// Type representing the value 16 for the `Value` trait. pub struct _16; impl Value for _16 { const VALUE: u32 = 16; } +/// Type representing the value 17 for the `Value` trait. +pub struct _17; impl Value for _17 { const VALUE: u32 = 17; } +/// Type representing the value 18 for the `Value` trait. +pub struct _18; impl Value for _18 { const VALUE: u32 = 18; } +/// Type representing the value 19 for the `Value` trait. +pub struct _19; impl Value for _19 { const VALUE: u32 = 19; } +/// Type representing the value 20 for the `Value` trait. +pub struct _20; impl Value for _20 { const VALUE: u32 = 20; } +/// Type representing the value 21 for the `Value` trait. +pub struct _21; impl Value for _21 { const VALUE: u32 = 21; } +/// Type representing the value 22 for the `Value` trait. +pub struct _22; impl Value for _22 { const VALUE: u32 = 22; } +/// Type representing the value 23 for the `Value` trait. +pub struct _23; impl Value for _23 { const VALUE: u32 = 23; } /// Type representing the value 24 for the `Value` trait. pub struct _24; impl Value for _24 { const VALUE: u32 = 24; } +/// Type representing the value 25 for the `Value` trait. +pub struct _25; impl Value for _25 { const VALUE: u32 = 25; } +/// Type representing the value 26 for the `Value` trait. +pub struct _26; impl Value for _26 { const VALUE: u32 = 26; } +/// Type representing the value 27 for the `Value` trait. +pub struct _27; impl Value for _27 { const VALUE: u32 = 27; } +/// Type representing the value 28 for the `Value` trait. +pub struct _28; impl Value for _28 { const VALUE: u32 = 28; } +/// Type representing the value 29 for the `Value` trait. +pub struct _29; impl Value for _29 { const VALUE: u32 = 29; } +/// Type representing the value 30 for the `Value` trait. +pub struct _30; impl Value for _30 { const VALUE: u32 = 30; } +/// Type representing the value 31 for the `Value` trait. +pub struct _31; impl Value for _31 { const VALUE: u32 = 31; } /// Type representing the value 32 for the `Value` trait. pub struct _32; impl Value for _32 { const VALUE: u32 = 32; } +/// Type representing the value 33 for the `Value` trait. +pub struct _33; impl Value for _33 { const VALUE: u32 = 33; } +/// Type representing the value 34 for the `Value` trait. +pub struct _34; impl Value for _34 { const VALUE: u32 = 34; } +/// Type representing the value 35 for the `Value` trait. +pub struct _35; impl Value for _35 { const VALUE: u32 = 35; } +/// Type representing the value 36 for the `Value` trait. +pub struct _36; impl Value for _36 { const VALUE: u32 = 36; } +/// Type representing the value 37 for the `Value` trait. +pub struct _37; impl Value for _37 { const VALUE: u32 = 37; } +/// Type representing the value 38 for the `Value` trait. +pub struct _38; impl Value for _38 { const VALUE: u32 = 38; } +/// Type representing the value 39 for the `Value` trait. +pub struct _39; impl Value for _39 { const VALUE: u32 = 39; } /// Type representing the value 40 for the `Value` trait. pub struct _40; impl Value for _40 { const VALUE: u32 = 40; } +/// Type representing the value 41 for the `Value` trait. +pub struct _41; impl Value for _41 { const VALUE: u32 = 41; } +/// Type representing the value 42 for the `Value` trait. +pub struct _42; impl Value for _42 { const VALUE: u32 = 42; } +/// Type representing the value 43 for the `Value` trait. +pub struct _43; impl Value for _43 { const VALUE: u32 = 43; } +/// Type representing the value 44 for the `Value` trait. +pub struct _44; impl Value for _44 { const VALUE: u32 = 44; } +/// Type representing the value 45 for the `Value` trait. +pub struct _45; impl Value for _45 { const VALUE: u32 = 45; } +/// Type representing the value 46 for the `Value` trait. +pub struct _46; impl Value for _46 { const VALUE: u32 = 46; } +/// Type representing the value 47 for the `Value` trait. +pub struct _47; impl Value for _47 { const VALUE: u32 = 47; } /// Type representing the value 48 for the `Value` trait. pub struct _48; impl Value for _48 { const VALUE: u32 = 48; } +/// Type representing the value 49 for the `Value` trait. +pub struct _49; impl Value for _49 { const VALUE: u32 = 49; } +/// Type representing the value 50 for the `Value` trait. +pub struct _50; impl Value for _50 { const VALUE: u32 = 50; } +/// Type representing the value 51 for the `Value` trait. +pub struct _51; impl Value for _51 { const VALUE: u32 = 51; } +/// Type representing the value 52 for the `Value` trait. +pub struct _52; impl Value for _52 { const VALUE: u32 = 52; } +/// Type representing the value 53 for the `Value` trait. +pub struct _53; impl Value for _53 { const VALUE: u32 = 53; } +/// Type representing the value 54 for the `Value` trait. +pub struct _54; impl Value for _54 { const VALUE: u32 = 54; } +/// Type representing the value 55 for the `Value` trait. +pub struct _55; impl Value for _55 { const VALUE: u32 = 55; } /// Type representing the value 56 for the `Value` trait. pub struct _56; impl Value for _56 { const VALUE: u32 = 56; } +/// Type representing the value 57 for the `Value` trait. +pub struct _57; impl Value for _57 { const VALUE: u32 = 57; } +/// Type representing the value 58 for the `Value` trait. +pub struct _58; impl Value for _58 { const VALUE: u32 = 58; } +/// Type representing the value 59 for the `Value` trait. +pub struct _59; impl Value for _59 { const VALUE: u32 = 59; } +/// Type representing the value 60 for the `Value` trait. +pub struct _60; impl Value for _60 { const VALUE: u32 = 60; } +/// Type representing the value 61 for the `Value` trait. +pub struct _61; impl Value for _61 { const VALUE: u32 = 61; } +/// Type representing the value 62 for the `Value` trait. +pub struct _62; impl Value for _62 { const VALUE: u32 = 62; } +/// Type representing the value 63 for the `Value` trait. +pub struct _63; impl Value for _63 { const VALUE: u32 = 63; } /// Type representing the value 64 for the `Value` trait. pub struct _64; impl Value for _64 { const VALUE: u32 = 64; } +/// Type representing the value 65 for the `Value` trait. +pub struct _65; impl Value for _65 { const VALUE: u32 = 65; } +/// Type representing the value 66 for the `Value` trait. +pub struct _66; impl Value for _66 { const VALUE: u32 = 66; } +/// Type representing the value 67 for the `Value` trait. +pub struct _67; impl Value for _67 { const VALUE: u32 = 67; } +/// Type representing the value 68 for the `Value` trait. +pub struct _68; impl Value for _68 { const VALUE: u32 = 68; } +/// Type representing the value 69 for the `Value` trait. +pub struct _69; impl Value for _69 { const VALUE: u32 = 69; } +/// Type representing the value 70 for the `Value` trait. +pub struct _70; impl Value for _70 { const VALUE: u32 = 70; } +/// Type representing the value 71 for the `Value` trait. +pub struct _71; impl Value for _71 { const VALUE: u32 = 71; } +/// Type representing the value 72 for the `Value` trait. +pub struct _72; impl Value for _72 { const VALUE: u32 = 72; } +/// Type representing the value 73 for the `Value` trait. +pub struct _73; impl Value for _73 { const VALUE: u32 = 73; } +/// Type representing the value 74 for the `Value` trait. +pub struct _74; impl Value for _74 { const VALUE: u32 = 74; } +/// Type representing the value 75 for the `Value` trait. +pub struct _75; impl Value for _75 { const VALUE: u32 = 75; } +/// Type representing the value 76 for the `Value` trait. +pub struct _76; impl Value for _76 { const VALUE: u32 = 76; } +/// Type representing the value 77 for the `Value` trait. +pub struct _77; impl Value for _77 { const VALUE: u32 = 77; } +/// Type representing the value 78 for the `Value` trait. +pub struct _78; impl Value for _78 { const VALUE: u32 = 78; } +/// Type representing the value 79 for the `Value` trait. +pub struct _79; impl Value for _79 { const VALUE: u32 = 79; } /// Type representing the value 80 for the `Value` trait. pub struct _80; impl Value for _80 { const VALUE: u32 = 80; } +/// Type representing the value 81 for the `Value` trait. +pub struct _81; impl Value for _81 { const VALUE: u32 = 81; } +/// Type representing the value 82 for the `Value` trait. +pub struct _82; impl Value for _82 { const VALUE: u32 = 82; } +/// Type representing the value 83 for the `Value` trait. +pub struct _83; impl Value for _83 { const VALUE: u32 = 83; } +/// Type representing the value 84 for the `Value` trait. +pub struct _84; impl Value for _84 { const VALUE: u32 = 84; } +/// Type representing the value 85 for the `Value` trait. +pub struct _85; impl Value for _85 { const VALUE: u32 = 85; } +/// Type representing the value 86 for the `Value` trait. +pub struct _86; impl Value for _86 { const VALUE: u32 = 86; } +/// Type representing the value 87 for the `Value` trait. +pub struct _87; impl Value for _87 { const VALUE: u32 = 87; } +/// Type representing the value 88 for the `Value` trait. +pub struct _88; impl Value for _88 { const VALUE: u32 = 88; } +/// Type representing the value 89 for the `Value` trait. +pub struct _89; impl Value for _89 { const VALUE: u32 = 89; } +/// Type representing the value 90 for the `Value` trait. +pub struct _90; impl Value for _90 { const VALUE: u32 = 90; } +/// Type representing the value 91 for the `Value` trait. +pub struct _91; impl Value for _91 { const VALUE: u32 = 91; } +/// Type representing the value 92 for the `Value` trait. +pub struct _92; impl Value for _92 { const VALUE: u32 = 92; } +/// Type representing the value 93 for the `Value` trait. +pub struct _93; impl Value for _93 { const VALUE: u32 = 93; } +/// Type representing the value 94 for the `Value` trait. +pub struct _94; impl Value for _94 { const VALUE: u32 = 94; } +/// Type representing the value 95 for the `Value` trait. +pub struct _95; impl Value for _95 { const VALUE: u32 = 95; } /// Type representing the value 96 for the `Value` trait. pub struct _96; impl Value for _96 { const VALUE: u32 = 96; } +/// Type representing the value 97 for the `Value` trait. +pub struct _97; impl Value for _97 { const VALUE: u32 = 97; } +/// Type representing the value 98 for the `Value` trait. +pub struct _98; impl Value for _98 { const VALUE: u32 = 98; } +/// Type representing the value 99 for the `Value` trait. +pub struct _99; impl Value for _99 { const VALUE: u32 = 99; } +/// Type representing the value 100 for the `Value` trait. +pub struct _100; impl Value for _100 { const VALUE: u32 = 100; } /// Type representing the value 112 for the `Value` trait. pub struct _112; impl Value for _112 { const VALUE: u32 = 112; } /// Type representing the value 128 for the `Value` trait. @@ -87,3 +240,4 @@ pub struct _256; impl Value for _256 { const VALUE: u32 = 256; } pub struct _384; impl Value for _384 { const VALUE: u32 = 384; } /// Type representing the value 512 for the `Value` trait. pub struct _512; impl Value for _512 { const VALUE: u32 = 512; } + diff --git a/core/rpc-servers/Cargo.toml b/core/rpc-servers/Cargo.toml index 41cfb6aeea15f6a6de3720254ebf88b986621059..bca094b572d5f1d6ed6f5a143f8eaa27d1168bed 100644 --- a/core/rpc-servers/Cargo.toml +++ b/core/rpc-servers/Cargo.toml @@ -5,9 +5,9 @@ authors = ["Parity Technologies "] edition = "2018" [dependencies] -http = { package = "jsonrpc-http-server", version = "10.0.1" } -pubsub = { package = "jsonrpc-pubsub", version = "10.0.1" } -ws = { package = "jsonrpc-ws-server", version = "10.0.1" } +http = { package = "jsonrpc-http-server", version = "12.0.0" } +pubsub = { package = "jsonrpc-pubsub", version = "12.0.0" } +ws = { package = "jsonrpc-ws-server", version = "12.0.0" } log = "0.4" serde = "1.0" substrate-rpc = { path = "../rpc" } diff --git a/core/rpc-servers/src/lib.rs b/core/rpc-servers/src/lib.rs index b37895c503f22cc3d1e1486528005948e0a11e01..adf560ce5a6375eeee780ecace7ef6c42908959a 100644 --- a/core/rpc-servers/src/lib.rs +++ b/core/rpc-servers/src/lib.rs @@ -24,9 +24,12 @@ use std::io; use log::error; use sr_primitives::{traits::{Block as BlockT, NumberFor}, generic::SignedBlock}; -/// Maximal payload accepted by RPC servers +/// Maximal payload accepted by RPC servers. const MAX_PAYLOAD: usize = 15 * 1024 * 1024; +/// Default maximum number of connections for WS RPC servers. +const WS_MAX_CONNECTIONS: usize = 100; + type Metadata = apis::metadata::Metadata; type RpcHandler = pubsub::PubSubHandler; pub type HttpServer = http::Server; @@ -76,17 +79,19 @@ pub fn start_http( /// Start WS server listening on given address. pub fn start_ws( addr: &std::net::SocketAddr, + max_connections: Option, cors: Option<&Vec>, io: RpcHandler, ) -> io::Result { ws::ServerBuilder::with_meta_extractor(io, |context: &ws::RequestContext| Metadata::new(context.sender())) .max_payload(MAX_PAYLOAD) + .max_connections(max_connections.unwrap_or(WS_MAX_CONNECTIONS)) .allowed_origins(map_cors(cors)) .start(addr) .map_err(|err| match err { - ws::Error(ws::ErrorKind::Io(io), _) => io, - ws::Error(ws::ErrorKind::ConnectionClosed, _) => io::ErrorKind::BrokenPipe.into(), - ws::Error(e, _) => { + ws::Error::Io(io) => io, + ws::Error::ConnectionClosed => io::ErrorKind::BrokenPipe.into(), + e => { error!("{}", e); io::ErrorKind::Other.into() } diff --git a/core/rpc/Cargo.toml b/core/rpc/Cargo.toml index d0ead8224e93720ce3f4bf9a53d4ddd0bc956e09..e72f62e5000ca26c80a8e42761a6f1e44e43bdd0 100644 --- a/core/rpc/Cargo.toml +++ b/core/rpc/Cargo.toml @@ -5,12 +5,14 @@ authors = ["Parity Technologies "] edition = "2018" [dependencies] -error-chain = "0.12" -jsonrpc-core = "10.0.1" -jsonrpc-pubsub = "10.0.1" -jsonrpc-derive = "10.0.2" +derive_more = "0.14.0" +futures = "0.1" +jsonrpc-core = "12.0.0" +jsonrpc-core-client = "12.0.0" +jsonrpc-pubsub = "12.0.0" +jsonrpc-derive = "12.0.0" log = "0.4" -parking_lot = "0.7.1" +parking_lot = "0.8.0" parity-codec = "3.3" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" @@ -28,7 +30,5 @@ tokio = "0.1.7" assert_matches = "1.1" futures = "0.1.17" sr-io = { path = "../sr-io" } -test_client = { package = "substrate-test-client", path = "../test-client" } -test_runtime = { package = "substrate-test-runtime", path = "../test-runtime" } -consensus = { package = "substrate-consensus-common", path = "../consensus/common" } +test-client = { package = "substrate-test-runtime-client", path = "../test-runtime/client" } rustc-hex = "2.0" diff --git a/core/rpc/src/author/error.rs b/core/rpc/src/author/error.rs index 0084c4da8fc0e0b7473244d2adb85e7f841a8d13..82ace88b84b997122eeefbf69db326a87f0e2e85 100644 --- a/core/rpc/src/author/error.rs +++ b/core/rpc/src/author/error.rs @@ -16,35 +16,37 @@ //! Authoring RPC module errors. -use error_chain::*; use client; use transaction_pool::txpool; use crate::rpc; use crate::errors; -error_chain! { - foreign_links { - Client(client::error::Error) #[doc = "Client error"]; - } - links { - Pool(txpool::error::Error, txpool::error::ErrorKind) #[doc = "Pool error"]; - } - errors { - /// Not implemented yet - Unimplemented { - description("not yet implemented"), - display("Method Not Implemented"), - } - /// Incorrect extrinsic format. - BadFormat { - description("bad format"), - display("Invalid extrinsic format"), - } - /// Verification error - Verification(e: Box<::std::error::Error + Send>) { - description("extrinsic verification error"), - display("Extrinsic verification error: {}", e.description()), +/// Author RPC Result type. +pub type Result = std::result::Result; + +/// Author RPC errors. +#[derive(Debug, derive_more::Display, derive_more::From)] +pub enum Error { + /// Client error. + Client(client::error::Error), + /// Transaction pool error, + Pool(txpool::error::Error), + /// Verification error + #[display(fmt="Extrinsic verification error: {}", _0)] + Verification(Box), + /// Incorrect extrinsic format. + #[display(fmt="Invalid extrinsic format")] + BadFormat, +} + +impl std::error::Error for Error { + fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { + match self { + Error::Client(ref err) => Some(err), + Error::Pool(ref err) => Some(err), + Error::Verification(ref err) => Some(&**err), + _ => None, } } } @@ -73,49 +75,50 @@ const POOL_IMMEDIATELY_DROPPED: i64 = POOL_INVALID_TX + 6; impl From for rpc::Error { fn from(e: Error) -> Self { + use txpool::error::{Error as PoolError}; + match e { - Error(ErrorKind::Unimplemented, _) => errors::unimplemented(), - Error(ErrorKind::BadFormat, _) => rpc::Error { + Error::BadFormat => rpc::Error { code: rpc::ErrorCode::ServerError(BAD_FORMAT), message: "Extrinsic has invalid format.".into(), data: None, }, - Error(ErrorKind::Verification(e), _) => rpc::Error { + Error::Verification(e) => rpc::Error { code: rpc::ErrorCode::ServerError(VERIFICATION_ERROR), - message: e.description().into(), + message: format!("Verification Error: {}", e).into(), data: Some(format!("{:?}", e).into()), }, - Error(ErrorKind::Pool(txpool::error::ErrorKind::InvalidTransaction(code)), _) => rpc::Error { + Error::Pool(PoolError::InvalidTransaction(code)) => rpc::Error { code: rpc::ErrorCode::ServerError(POOL_INVALID_TX), message: "Invalid Transaction".into(), data: Some(code.into()), }, - Error(ErrorKind::Pool(txpool::error::ErrorKind::UnknownTransactionValidity(code)), _) => rpc::Error { + Error::Pool(PoolError::UnknownTransactionValidity(code)) => rpc::Error { code: rpc::ErrorCode::ServerError(POOL_UNKNOWN_VALIDITY), message: "Unknown Transaction Validity".into(), data: Some(code.into()), }, - Error(ErrorKind::Pool(txpool::error::ErrorKind::TemporarilyBanned), _) => rpc::Error { + Error::Pool(PoolError::TemporarilyBanned) => rpc::Error { code: rpc::ErrorCode::ServerError(POOL_TEMPORARILY_BANNED), message: "Transaction is temporarily banned".into(), data: None, }, - Error(ErrorKind::Pool(txpool::error::ErrorKind::AlreadyImported(hash)), _) => rpc::Error { + Error::Pool(PoolError::AlreadyImported(hash)) => rpc::Error { code: rpc::ErrorCode::ServerError(POOL_ALREADY_IMPORTED), message: "Transaction Already Imported".into(), data: Some(format!("{:?}", hash).into()), }, - Error(ErrorKind::Pool(txpool::error::ErrorKind::TooLowPriority(old, new)), _) => rpc::Error { + Error::Pool(PoolError::TooLowPriority { old, new }) => rpc::Error { code: rpc::ErrorCode::ServerError(POOL_TOO_LOW_PRIORITY), message: format!("Priority is too low: ({} vs {})", old, new), data: Some("The transaction has too low priority to replace another transaction already in the pool.".into()), }, - Error(ErrorKind::Pool(txpool::error::ErrorKind::CycleDetected), _) => rpc::Error { + Error::Pool(PoolError::CycleDetected) => rpc::Error { code: rpc::ErrorCode::ServerError(POOL_CYCLE_DETECTED), message: "Cycle Detected".into(), data: None, }, - Error(ErrorKind::Pool(txpool::error::ErrorKind::ImmediatelyDropped), _) => rpc::Error { + Error::Pool(PoolError::ImmediatelyDropped) => rpc::Error { code: rpc::ErrorCode::ServerError(POOL_IMMEDIATELY_DROPPED), message: "Immediately Dropped" .into(), data: Some("The transaction couldn't enter the pool because of the limit".into()), diff --git a/node/cli/src/error.rs b/core/rpc/src/author/hash.rs similarity index 59% rename from node/cli/src/error.rs rename to core/rpc/src/author/hash.rs index dd5448ac8ad6366813387e7694a4f69872117ff7..a01e26de3c94b27c269c6dc6e65dbc780ac5cc05 100644 --- a/node/cli/src/error.rs +++ b/core/rpc/src/author/hash.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2019 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify @@ -14,19 +14,19 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -//! Initialization errors. +//! Extrinsic helpers for author RPC module. -use client; -use error_chain::{ - error_chain, error_chain_processing, impl_error_chain_processed -}; +use primitives::Bytes; +use serde::{Serialize, Deserialize}; -error_chain! { - foreign_links { - Io(::std::io::Error) #[doc="IO error"]; - Cli(::clap::Error) #[doc="CLI error"]; - } - links { - Client(client::error::Error, client::error::ErrorKind) #[doc="Client error"]; - } +/// RPC Extrinsic or hash +/// +/// Allows to refer to extrinsic either by its raw representation or its hash. +#[derive(Debug, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub enum ExtrinsicOrHash { + /// The hash of the extrinsic. + Hash(Hash), + /// Raw extrinsic bytes. + Extrinsic(Bytes), } diff --git a/core/rpc/src/author/mod.rs b/core/rpc/src/author/mod.rs index acd500ba0bfe309ddec5c36c698f0cb5a71473e0..5594984d0ea7f016461f49b507e8d65b783a1f50 100644 --- a/core/rpc/src/author/mod.rs +++ b/core/rpc/src/author/mod.rs @@ -16,11 +16,24 @@ //! Substrate block-author/full-node API. +pub mod error; +pub mod hash; + +#[cfg(test)] +mod tests; + use std::sync::Arc; -use log::warn; use client::{self, Client}; +use crate::rpc::futures::{Sink, Stream, Future}; +use crate::subscriptions::Subscriptions; +use jsonrpc_derive::rpc; +use jsonrpc_pubsub::{typed::Subscriber, SubscriptionId}; +use log::warn; use parity_codec::{Encode, Decode}; +use primitives::{Bytes, Blake2Hasher, H256}; +use runtime_primitives::{generic, traits}; +use self::error::Result; use transaction_pool::{ txpool::{ ChainApi as PoolChainApi, @@ -31,19 +44,8 @@ use transaction_pool::{ watcher::Status, }, }; -use jsonrpc_derive::rpc; -use jsonrpc_pubsub::{typed::Subscriber, SubscriptionId}; -use primitives::{Bytes, Blake2Hasher, H256}; -use crate::rpc::futures::{Sink, Stream, Future}; -use runtime_primitives::{generic, traits}; -use crate::subscriptions::Subscriptions; - -pub mod error; -#[cfg(test)] -mod tests; - -use self::error::Result; +pub use self::gen_client::Client as AuthorClient; /// Substrate authoring RPC API #[rpc] @@ -59,6 +61,10 @@ pub trait AuthorApi { #[rpc(name = "author_pendingExtrinsics")] fn pending_extrinsics(&self) -> Result>; + /// Remove given extrinsic from the pool and temporarily ban it to prevent reimporting. + #[rpc(name = "author_removeExtrinsic")] + fn remove_extrinsic(&self, bytes_or_hash: Vec>) -> Result>; + /// Submit an extrinsic to watch. #[pubsub(subscription = "author_extrinsicUpdate", subscribe, name = "author_submitAndWatchExtrinsic")] fn watch_extrinsic(&self, metadata: Self::Metadata, subscriber: Subscriber>, bytes: Bytes); @@ -72,7 +78,7 @@ pub trait AuthorApi { pub struct Author where P: PoolChainApi + Sync + Send + 'static { /// Substrate client client: Arc::Block, RA>>, - /// Extrinsic pool + /// Transactions pool pool: Arc>, /// Subscriptions manager subscriptions: Subscriptions, @@ -104,13 +110,13 @@ impl AuthorApi, BlockHash

> for Author whe type Metadata = crate::metadata::Metadata; fn submit_extrinsic(&self, ext: Bytes) -> Result> { - let xt = Decode::decode(&mut &ext[..]).ok_or(error::Error::from(error::ErrorKind::BadFormat))?; - let best_block_hash = self.client.info()?.chain.best_hash; + let xt = Decode::decode(&mut &ext[..]).ok_or(error::Error::BadFormat)?; + let best_block_hash = self.client.info().chain.best_hash; self.pool .submit_one(&generic::BlockId::hash(best_block_hash), xt) .map_err(|e| e.into_pool_error() .map(Into::into) - .unwrap_or_else(|e| error::ErrorKind::Verification(Box::new(e)).into()) + .unwrap_or_else(|e| error::Error::Verification(Box::new(e)).into()) ) } @@ -118,15 +124,35 @@ impl AuthorApi, BlockHash

> for Author whe Ok(self.pool.ready().map(|tx| tx.data.encode().into()).collect()) } + fn remove_extrinsic(&self, bytes_or_hash: Vec>>) -> Result>> { + let hashes = bytes_or_hash.into_iter() + .map(|x| match x { + hash::ExtrinsicOrHash::Hash(h) => Ok(h), + hash::ExtrinsicOrHash::Extrinsic(bytes) => { + let xt = Decode::decode(&mut &bytes[..]).ok_or(error::Error::BadFormat)?; + Ok(self.pool.hash_of(&xt)) + }, + }) + .collect::>>()?; + + Ok( + self.pool.remove_invalid(&hashes) + .into_iter() + .map(|tx| tx.hash.clone()) + .collect() + ) + } + fn watch_extrinsic(&self, _metadata: Self::Metadata, subscriber: Subscriber, BlockHash

>>, xt: Bytes) { let submit = || -> Result<_> { - let best_block_hash = self.client.info()?.chain.best_hash; - let dxt = <

::Block as traits::Block>::Extrinsic::decode(&mut &xt[..]).ok_or(error::Error::from(error::ErrorKind::BadFormat))?; + let best_block_hash = self.client.info().chain.best_hash; + let dxt = <

::Block as traits::Block>::Extrinsic::decode(&mut &xt[..]) + .ok_or(error::Error::BadFormat)?; self.pool .submit_and_watch(&generic::BlockId::hash(best_block_hash), dxt) .map_err(|e| e.into_pool_error() .map(Into::into) - .unwrap_or_else(|e| error::ErrorKind::Verification(Box::new(e)).into()) + .unwrap_or_else(|e| error::Error::Verification(Box::new(e)).into()) ) }; diff --git a/core/rpc/src/author/tests.rs b/core/rpc/src/author/tests.rs index 4d0277f7d656a2ec770dbdb8d84df8f23133181d..4c6a724acd5ae35bbf4ccbfbe71e7999a7d684e6 100644 --- a/core/rpc/src/author/tests.rs +++ b/core/rpc/src/author/tests.rs @@ -137,3 +137,31 @@ fn should_return_pending_extrinsics() { Ok(ref expected) if *expected == vec![Bytes(ex.encode())] ); } + +#[test] +fn should_remove_extrinsics() { + let runtime = runtime::Runtime::new().unwrap(); + let client = Arc::new(test_client::new()); + let pool = Arc::new(Pool::new(Default::default(), ChainApi::new(client.clone()))); + let p = Author { + client, + pool: pool.clone(), + subscriptions: Subscriptions::new(runtime.executor()), + }; + let ex1 = uxt(AccountKeyring::Alice, 0); + p.submit_extrinsic(ex1.encode().into()).unwrap(); + let ex2 = uxt(AccountKeyring::Alice, 1); + p.submit_extrinsic(ex2.encode().into()).unwrap(); + let ex3 = uxt(AccountKeyring::Bob, 0); + let hash3 = p.submit_extrinsic(ex3.encode().into()).unwrap(); + assert_eq!(pool.status().ready, 3); + + // now remove all 3 + let removed = p.remove_extrinsic(vec![ + hash::ExtrinsicOrHash::Hash(hash3), + // Removing this one will also remove ex2 + hash::ExtrinsicOrHash::Extrinsic(ex1.encode().into()), + ]).unwrap(); + + assert_eq!(removed.len(), 3); +} diff --git a/core/rpc/src/chain/error.rs b/core/rpc/src/chain/error.rs index 723a21d7732b7848277a964e37dfa21a0a831035..ad63af9add0510731df2083916551555b4df105a 100644 --- a/core/rpc/src/chain/error.rs +++ b/core/rpc/src/chain/error.rs @@ -14,33 +14,45 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use error_chain::*; + +//! Error helpers for Chain RPC module. + use client; use crate::rpc; use crate::errors; -pub use internal_errors::*; - -#[allow(deprecated)] -mod internal_errors { - use super::*; - error_chain! { - foreign_links { - Client(client::error::Error) #[doc = "Client error"]; - } - errors { - /// Not implemented yet - Unimplemented { - description("not yet implemented"), - display("Method Not Implemented"), - } + +/// Chain RPC Result type. +pub type Result = std::result::Result; + +/// Chain RPC errors. +#[derive(Debug, derive_more::Display, derive_more::From)] +pub enum Error { + /// Client error. + Client(client::error::Error), + /// Other error type. + Other(String), +} + +impl std::error::Error for Error { + fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { + match self { + Error::Client(ref err) => Some(err), + _ => None, } } } +/// Base error code for all chain errors. +const BASE_ERROR: i64 = 3000; + impl From for rpc::Error { fn from(e: Error) -> Self { match e { - Error(ErrorKind::Unimplemented, _) => errors::unimplemented(), + Error::Other(message) => rpc::Error { + code: rpc::ErrorCode::ServerError(BASE_ERROR + 1), + message, + data: None, + }, e => errors::internal(e), } } diff --git a/core/rpc/src/chain/mod.rs b/core/rpc/src/chain/mod.rs index ab930d00763ff623ab96d7f312e2be990ba6c7e8..3594ed48e3aaf990919131c3779c096c400cb779 100644 --- a/core/rpc/src/chain/mod.rs +++ b/core/rpc/src/chain/mod.rs @@ -16,27 +16,28 @@ //! Substrate blockchain API. +pub mod error; +pub mod number; + +#[cfg(test)] +mod tests; + use std::sync::Arc; -use log::warn; use client::{self, Client, BlockchainEvents}; +use crate::rpc::Result as RpcResult; +use crate::rpc::futures::{stream, Future, Sink, Stream}; +use crate::subscriptions::Subscriptions; use jsonrpc_derive::rpc; use jsonrpc_pubsub::{typed::Subscriber, SubscriptionId}; +use log::warn; use primitives::{H256, Blake2Hasher}; -use crate::rpc::Result as RpcResult; -use crate::rpc::futures::{stream, Future, Sink, Stream}; use runtime_primitives::generic::{BlockId, SignedBlock}; use runtime_primitives::traits::{Block as BlockT, Header, NumberFor}; - -use crate::subscriptions::Subscriptions; - -mod error; -#[cfg(test)] -mod tests; -mod number; - use self::error::Result; +pub use self::gen_client::Client as ChainClient; + /// Substrate blockchain API #[rpc] pub trait ChainApi { @@ -124,7 +125,7 @@ impl Chain where { fn unwrap_or_best(&self, hash: Option) -> Result { Ok(match hash.into() { - None => self.client.info()?.chain.best_hash, + None => self.client.info().chain.best_hash, Some(hash) => hash, }) } @@ -145,7 +146,7 @@ impl Chain where let header = best_block_hash() .and_then(|hash| self.header(hash.into())) .and_then(|header| { - header.ok_or_else(|| self::error::ErrorKind::Unimplemented.into()) + header.ok_or_else(|| "Best header missing.".to_owned().into()) }) .map_err(Into::into); @@ -188,13 +189,13 @@ impl ChainApi, Block::Hash, Block::Header, Sig fn block_hash(&self, number: Option>>) -> Result> { Ok(match number { - None => Some(self.client.info()?.chain.best_hash), + None => Some(self.client.info().chain.best_hash), Some(num_or_hex) => self.client.header(&BlockId::number(num_or_hex.to_number()?))?.map(|h| h.hash()), }) } fn finalized_head(&self) -> Result { - Ok(self.client.info()?.chain.finalized_hash) + Ok(self.client.info().chain.finalized_hash) } fn subscribe_new_head(&self, _metadata: Self::Metadata, subscriber: Subscriber) { @@ -214,7 +215,7 @@ impl ChainApi, Block::Hash, Block::Header, Sig fn subscribe_finalized_heads(&self, _meta: Self::Metadata, subscriber: Subscriber) { self.subscribe_headers( subscriber, - || Ok(Some(self.client.info()?.chain.finalized_hash)), + || Ok(Some(self.client.info().chain.finalized_hash)), || self.client.finality_notification_stream() .map(|notification| notification.header), ) diff --git a/core/rpc/src/chain/number.rs b/core/rpc/src/chain/number.rs index 2e5af190ea94f36bd38b890242696e9c575861a4..df796d5e6d9911c2f952dc344cd69b23eef0a3b9 100644 --- a/core/rpc/src/chain/number.rs +++ b/core/rpc/src/chain/number.rs @@ -14,9 +14,11 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use serde::Deserialize; +//! Chain RPC Block number type. + +use serde::{Serialize, Deserialize}; +use std::{convert::TryFrom, fmt::Debug}; use primitives::U256; -use runtime_primitives::traits; /// RPC Block number type /// @@ -25,7 +27,7 @@ use runtime_primitives::traits; /// or we attempt to parse given hex value. /// We do that for consistency with the returned type, default generic header /// serializes block number as hex to avoid overflows in JavaScript. -#[derive(Deserialize)] +#[derive(Serialize, Deserialize)] #[serde(untagged)] pub enum NumberOrHex { /// The original header number type of block. @@ -34,30 +36,28 @@ pub enum NumberOrHex { Hex(U256), } -impl> NumberOrHex { +impl + From + Debug + PartialOrd> NumberOrHex { /// Attempts to convert into concrete block number. /// /// Fails in case hex number is too big. pub fn to_number(self) -> Result { - let num: u64 = match self { - NumberOrHex::Number(n) => n.as_(), + let num = match self { + NumberOrHex::Number(n) => n, NumberOrHex::Hex(h) => { - // FIXME #1377 this only supports `u64` since `BlockNumber` - // is `As` we could possibly go with `u128`. let l = h.low_u64(); if U256::from(l) != h { - return Err(format!("`{}` does not fit into the block number type.", h)); + return Err(format!("`{}` does not fit into u64 type; unsupported for now.", h)) } else { - l + Number::try_from(l) + .map_err(|_| format!("`{}` does not fit into block number type.", h))? } }, }; // FIXME <2329>: Database seems to limit the block number to u32 for no reason - if num > u32::max_value() as u64 { - Err(format!("`{}` > u32::max_value(), the max block number is u32.", num)) - } else { - Ok(traits::As::sa(num)) + if num > Number::from(u32::max_value()) { + return Err(format!("`{:?}` > u32::max_value(), the max block number is u32.", num)) } + Ok(num) } } diff --git a/core/rpc/src/chain/tests.rs b/core/rpc/src/chain/tests.rs index 26b7202305b16745ba0d516cb442765085e97ac5..eed9ae836b8b5cbdb88da859cb58a54b9ae16207 100644 --- a/core/rpc/src/chain/tests.rs +++ b/core/rpc/src/chain/tests.rs @@ -16,9 +16,11 @@ use super::*; use assert_matches::assert_matches; -use test_client::{self, TestClient}; -use test_client::runtime::{H256, Block, Header}; -use consensus::BlockOrigin; +use test_client::{ + prelude::*, + consensus::BlockOrigin, + runtime::{H256, Block, Header}, +}; #[test] fn should_return_header() { @@ -68,7 +70,7 @@ fn should_return_a_block() { subscriptions: Subscriptions::new(remote), }; - let block = api.client.new_block().unwrap().bake().unwrap(); + let block = api.client.new_block(Default::default()).unwrap().bake().unwrap(); let block_hash = block.hash(); api.client.import(BlockOrigin::Own, block).unwrap(); @@ -138,7 +140,7 @@ fn should_return_block_hash() { Ok(None) ); - let block = client.client.new_block().unwrap().bake().unwrap(); + let block = client.client.new_block(Default::default()).unwrap().bake().unwrap(); client.client.import(BlockOrigin::Own, block.clone()).unwrap(); assert_matches!( @@ -172,7 +174,7 @@ fn should_return_finalized_hash() { ); // import new block - let builder = client.client.new_block().unwrap(); + let builder = client.client.new_block(Default::default()).unwrap(); client.client.import(BlockOrigin::Own, builder.bake().unwrap()).unwrap(); // no finalization yet assert_matches!( @@ -205,7 +207,7 @@ fn should_notify_about_latest_block() { // assert id assigned assert_eq!(core.block_on(id), Ok(Ok(SubscriptionId::Number(1)))); - let builder = api.client.new_block().unwrap(); + let builder = api.client.new_block(Default::default()).unwrap(); api.client.import(BlockOrigin::Own, builder.bake().unwrap()).unwrap(); } @@ -236,7 +238,7 @@ fn should_notify_about_finalized_block() { // assert id assigned assert_eq!(core.block_on(id), Ok(Ok(SubscriptionId::Number(1)))); - let builder = api.client.new_block().unwrap(); + let builder = api.client.new_block(Default::default()).unwrap(); api.client.import(BlockOrigin::Own, builder.bake().unwrap()).unwrap(); api.client.finalize_block(BlockId::number(1), None, true).unwrap(); } diff --git a/core/rpc/src/errors.rs b/core/rpc/src/errors.rs index a709013ad26801a471f7dd99d94c6ed10390b78b..da910de76215ae18339f942a40394b5cdbae7404 100644 --- a/core/rpc/src/errors.rs +++ b/core/rpc/src/errors.rs @@ -17,14 +17,6 @@ use crate::rpc; use log::warn; -pub fn unimplemented() -> rpc::Error { - rpc::Error { - code: rpc::ErrorCode::ServerError(1), - message: "Not implemented yet".into(), - data: None, - } -} - pub fn internal(e: E) -> rpc::Error { warn!("Unknown error: {:?}", e); rpc::Error { diff --git a/core/rpc/src/helpers.rs b/core/rpc/src/helpers.rs index e579c743acdad202caedfd39e760559129c6109f..ccfde6afb5cfc17dd6db483b38cec6c989ec7f57 100644 --- a/core/rpc/src/helpers.rs +++ b/core/rpc/src/helpers.rs @@ -14,6 +14,21 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . +use futures::{prelude::*, sync::oneshot}; + +/// Wraps around `oneshot::Receiver` and adjusts the error type to produce an internal error if the +/// sender gets dropped. +pub struct Receiver(pub oneshot::Receiver); + +impl Future for Receiver { + type Item = T; + type Error = jsonrpc_core::Error; + + fn poll(&mut self) -> Poll { + self.0.poll().map_err(|_| jsonrpc_core::Error::internal_error()) + } +} + /// Unwraps the trailing parameter or falls back with the closure result. pub fn unwrap_or_else(or_else: F, optional: Option) -> Result where F: FnOnce() -> Result, diff --git a/core/rpc/src/state/error.rs b/core/rpc/src/state/error.rs index d4b3013abb2c079d2e3d1e7267f80c0a04ce1ee0..4b9d30b36b2043ef130492db91eb74004d12aba5 100644 --- a/core/rpc/src/state/error.rs +++ b/core/rpc/src/state/error.rs @@ -14,34 +14,52 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use error_chain::*; +//! State RPC errors. + use client; use crate::rpc; use crate::errors; -error_chain! { - foreign_links { - Client(client::error::Error) #[doc = "Client error"]; - } +/// State RPC Result type. +pub type Result = std::result::Result; - errors { - /// Provided block range couldn't be resolved to a list of blocks. - InvalidBlockRange(from: String, to: String, details: String) { - description("Invalid block range"), - display("Cannot resolve a block range ['{:?}' ... '{:?}]. {}", from, to, details), - } - /// Not implemented yet - Unimplemented { - description("not implemented yet"), - display("Method Not Implemented"), +/// State RPC errors. +#[derive(Debug, derive_more::Display, derive_more::From)] +pub enum Error { + /// Client error. + Client(client::error::Error), + /// Provided block range couldn't be resolved to a list of blocks. + #[display(fmt = "Cannot resolve a block range ['{:?}' ... '{:?}]. {}", from, to, details)] + InvalidBlockRange { + /// Beginning of the block range. + from: String, + /// End of the block range. + to: String, + /// Details of the error message. + details: String, + }, +} + +impl std::error::Error for Error { + fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { + match self { + Error::Client(ref err) => Some(err), + _ => None, } } } +/// Base code for all state errors. +const BASE_ERROR: i64 = 4000; + impl From for rpc::Error { fn from(e: Error) -> Self { match e { - Error(ErrorKind::Unimplemented, _) => errors::unimplemented(), + Error::InvalidBlockRange { .. } => rpc::Error { + code: rpc::ErrorCode::ServerError(BASE_ERROR + 1), + message: format!("{}", e), + data: None, + }, e => errors::internal(e), } } diff --git a/core/rpc/src/state/mod.rs b/core/rpc/src/state/mod.rs index 168c0bd692732dbc564f04a511f11d0f288da3ec..0b3b93885e16cf4f1dc3338f172643fcb73d2698 100644 --- a/core/rpc/src/state/mod.rs +++ b/core/rpc/src/state/mod.rs @@ -16,34 +16,37 @@ //! Substrate state API. +pub mod error; + +#[cfg(test)] +mod tests; + use std::{ collections::{BTreeMap, HashMap}, ops::Range, sync::Arc, }; -use error_chain::bail; -use log::{warn, trace}; use client::{self, Client, CallExecutor, BlockchainEvents, runtime_api::Metadata}; +use crate::rpc::Result as RpcResult; +use crate::rpc::futures::{stream, Future, Sink, Stream}; +use crate::subscriptions::Subscriptions; use jsonrpc_derive::rpc; use jsonrpc_pubsub::{typed::Subscriber, SubscriptionId}; -use primitives::{H256, Blake2Hasher, Bytes}; +use log::{warn, trace}; use primitives::hexdisplay::HexDisplay; use primitives::storage::{self, StorageKey, StorageData, StorageChangeSet}; -use crate::rpc::Result as RpcResult; -use crate::rpc::futures::{stream, Future, Sink, Stream}; +use primitives::{H256, Blake2Hasher, Bytes}; use runtime_primitives::generic::BlockId; -use runtime_primitives::traits::{Block as BlockT, Header, ProvideRuntimeApi, As, NumberFor}; +use runtime_primitives::traits::{ + Block as BlockT, Header, ProvideRuntimeApi, NumberFor, + SaturatedConversion +}; use runtime_version::RuntimeVersion; +use self::error::Result; use state_machine::{self, ExecutionStrategy}; -use crate::subscriptions::Subscriptions; - -mod error; -#[cfg(test)] -mod tests; - -use self::error::Result; +pub use self::gen_client::Client as StateClient; /// Substrate state API #[rpc] @@ -57,7 +60,7 @@ pub trait StateApi { /// Returns the keys with prefix, leave empty to get all the keys #[rpc(name = "state_getKeys")] - fn storage_keys(&self, key: StorageKey, hash: Option) -> Result>; + fn storage_keys(&self, prefix: StorageKey, hash: Option) -> Result>; /// Returns a storage entry at a specific block's state. #[rpc(name = "state_getStorage", alias("state_getStorageAt"))] @@ -71,6 +74,42 @@ pub trait StateApi { #[rpc(name = "state_getStorageSize", alias("state_getStorageSizeAt"))] fn storage_size(&self, key: StorageKey, hash: Option) -> Result>; + /// Returns the keys with prefix from a child storage, leave empty to get all the keys + #[rpc(name = "state_getChildKeys")] + fn child_storage_keys( + &self, + child_storage_key: StorageKey, + prefix: StorageKey, + hash: Option + ) -> Result>; + + /// Returns a child storage entry at a specific block's state. + #[rpc(name = "state_getChildStorage")] + fn child_storage( + &self, + child_storage_key: StorageKey, + key: StorageKey, + hash: Option + ) -> Result>; + + /// Returns the hash of a child storage entry at a block's state. + #[rpc(name = "state_getChildStorageHash")] + fn child_storage_hash( + &self, + child_storage_key: StorageKey, + key: StorageKey, + hash: Option + ) -> Result>; + + /// Returns the size of a child storage entry at a block's state. + #[rpc(name = "state_getChildStorageSize")] + fn child_storage_size( + &self, + child_storage_key: StorageKey, + key: StorageKey, + hash: Option + ) -> Result>; + /// Returns the runtime metadata as an opaque blob. #[rpc(name = "state_getMetadata")] fn metadata(&self, hash: Option) -> Result; @@ -84,7 +123,12 @@ pub trait StateApi { /// NOTE This first returned result contains the initial state of storage for all keys. /// Subsequent values in the vector represent changes to the previous state (diffs). #[rpc(name = "state_queryStorage")] - fn query_storage(&self, keys: Vec, block: Hash, hash: Option) -> Result>>; + fn query_storage( + &self, + keys: Vec, + block: Hash, + hash: Option + ) -> Result>>; /// New runtime version subscription #[pubsub( @@ -106,11 +150,15 @@ pub trait StateApi { /// New storage subscription #[pubsub(subscription = "state_storage", subscribe, name = "state_subscribeStorage")] - fn subscribe_storage(&self, metadata: Self::Metadata, subscriber: Subscriber>, keys: Option>); + fn subscribe_storage( + &self, metadata: Self::Metadata, subscriber: Subscriber>, keys: Option> + ); /// Unsubscribe from storage subscription #[pubsub(subscription = "state_storage", unsubscribe, name = "state_unsubscribeStorage")] - fn unsubscribe_storage(&self, metadata: Option, id: SubscriptionId) -> RpcResult; + fn unsubscribe_storage( + &self, metadata: Option, id: SubscriptionId + ) -> RpcResult; } /// State API with subscriptions support. @@ -171,7 +219,7 @@ impl State where blocks.push(hdr.hash()); last = hdr; } else { - bail!(invalid_block_range( + return Err(invalid_block_range( Some(from), Some(to), format!("Parent of {} ({}) not found", last.number(), last.hash()), @@ -179,7 +227,7 @@ impl State where } } if last.hash() != from.hash() { - bail!(invalid_block_range( + return Err(invalid_block_range( Some(from), Some(to), format!("Expected to reach `from`, got {} ({})", last.number(), last.hash()), @@ -190,7 +238,7 @@ impl State where }; // check if we can filter blocks-with-changes from some (sub)range using changes tries let changes_trie_range = self.client.max_key_changes_range(from_number, BlockId::Hash(to.hash()))?; - let filtered_range_begin = changes_trie_range.map(|(begin, _)| (begin - from_number).as_() as usize); + let filtered_range_begin = changes_trie_range.map(|(begin, _)| (begin - from_number).saturated_into::()); let (unfiltered_range, filtered_range) = split_range(blocks.len(), filtered_range_begin); Ok(QueryStorageRange { hashes: blocks, @@ -199,7 +247,7 @@ impl State where filtered_range, }) }, - (from, to) => bail!( + (from, to) => Err( invalid_block_range(from.as_ref(), to.as_ref(), "Invalid range or unknown block".into()) ), } @@ -210,9 +258,9 @@ impl State where &self, range: &QueryStorageRange, keys: &[StorageKey], + last_values: &mut HashMap>, changes: &mut Vec>, ) -> Result<()> { - let mut last_state: HashMap<_, Option<_>> = Default::default(); for block in range.unfiltered_range.start..range.unfiltered_range.end { let block_hash = range.hashes[block].clone(); let mut block_changes = StorageChangeSet { block: block_hash.clone(), changes: Vec::new() }; @@ -220,15 +268,19 @@ impl State where for key in keys { let (has_changed, data) = { let curr_data = self.client.storage(&id, key)?; - let prev_data = last_state.get(key).and_then(|x| x.as_ref()); - (curr_data.as_ref() != prev_data, curr_data) + match last_values.get(key) { + Some(prev_data) => (curr_data != *prev_data, curr_data), + None => (true, curr_data), + } }; if has_changed { block_changes.changes.push((key.clone(), data.clone())); } - last_state.insert(key.clone(), data); + last_values.insert(key.clone(), data); + } + if !block_changes.changes.is_empty() { + changes.push(block_changes); } - changes.push(block_changes); } Ok(()) } @@ -238,11 +290,12 @@ impl State where &self, range: &QueryStorageRange, keys: &[StorageKey], + last_values: &HashMap>, changes: &mut Vec>, ) -> Result<()> { let (begin, end) = match range.filtered_range { Some(ref filtered_range) => ( - range.first_number + As::sa(filtered_range.start as u64), + range.first_number + filtered_range.start.saturated_into(), BlockId::Hash(range.hashes[filtered_range.end - 1].clone()) ), None => return Ok(()), @@ -250,17 +303,24 @@ impl State where let mut changes_map: BTreeMap, StorageChangeSet> = BTreeMap::new(); for key in keys { let mut last_block = None; - for (block, _) in self.client.key_changes(begin, end, key)? { + let mut last_value = last_values.get(key).cloned().unwrap_or_default(); + for (block, _) in self.client.key_changes(begin, end, key)?.into_iter().rev() { if last_block == Some(block) { continue; } - let block_hash = range.hashes[(block - range.first_number).as_() as usize].clone(); + + let block_hash = range.hashes[(block - range.first_number).saturated_into::()].clone(); let id = BlockId::Hash(block_hash); let value_at_block = self.client.storage(&id, key)?; + if last_value == value_at_block { + continue; + } + changes_map.entry(block) .or_insert_with(|| StorageChangeSet { block: block_hash, changes: Vec::new() }) - .changes.push((key.clone(), value_at_block)); + .changes.push((key.clone(), value_at_block.clone())); last_block = Some(block); + last_value = value_at_block; } } if let Some(additional_capacity) = changes_map.len().checked_sub(changes.len()) { @@ -277,7 +337,7 @@ impl State where E: CallExecutor, { fn unwrap_or_best(&self, hash: Option) -> Result { - crate::helpers::unwrap_or_else(|| Ok(self.client.info()?.chain.best_hash), hash) + crate::helpers::unwrap_or_else(|| Ok(self.client.info().chain.best_hash), hash) } } @@ -316,14 +376,61 @@ impl StateApi for State where } fn storage_hash(&self, key: StorageKey, block: Option) -> Result> { - use runtime_primitives::traits::{Hash, Header as HeaderT}; - Ok(self.storage(key, block)?.map(|x| ::Hashing::hash(&x.0))) + let block = self.unwrap_or_best(block)?; + trace!(target: "rpc", "Querying storage hash at {:?} for key {}", block, HexDisplay::from(&key.0)); + Ok(self.client.storage_hash(&BlockId::Hash(block), &key)?) } fn storage_size(&self, key: StorageKey, block: Option) -> Result> { Ok(self.storage(key, block)?.map(|x| x.0.len() as u64)) } + fn child_storage( + &self, + child_storage_key: StorageKey, + key: StorageKey, + block: Option + ) -> Result> { + let block = self.unwrap_or_best(block)?; + trace!(target: "rpc", "Querying child storage at {:?} for key {}", block, HexDisplay::from(&key.0)); + Ok(self.client.child_storage(&BlockId::Hash(block), &child_storage_key, &key)?) + } + + fn child_storage_keys( + &self, + child_storage_key: StorageKey, + key_prefix: StorageKey, + block: Option + ) -> Result> { + let block = self.unwrap_or_best(block)?; + trace!(target: "rpc", "Querying child storage keys at {:?}", block); + Ok(self.client.child_storage_keys(&BlockId::Hash(block), &child_storage_key, &key_prefix)?) + } + + fn child_storage_hash( + &self, + child_storage_key: StorageKey, + key: StorageKey, + block: Option + ) -> Result> { + let block = self.unwrap_or_best(block)?; + trace!( + target: "rpc", "Querying child storage hash at {:?} for key {}", + block, + HexDisplay::from(&key.0), + ); + Ok(self.client.child_storage_hash(&BlockId::Hash(block), &child_storage_key, &key)?) + } + + fn child_storage_size( + &self, + child_storage_key: StorageKey, + key: StorageKey, + block: Option + ) -> Result> { + Ok(self.child_storage(child_storage_key, key, block)?.map(|x| x.0.len() as u64)) + } + fn metadata(&self, block: Option) -> Result { let block = self.unwrap_or_best(block)?; self.client.runtime_api().metadata(&BlockId::Hash(block)).map(Into::into).map_err(Into::into) @@ -337,8 +444,9 @@ impl StateApi for State where ) -> Result>> { let range = self.split_query_storage_range(from, to)?; let mut changes = Vec::new(); - self.query_storage_unfiltered(&range, &keys, &mut changes)?; - self.query_storage_filtered(&range, &keys, &mut changes)?; + let mut last_values = HashMap::new(); + self.query_storage_unfiltered(&range, &keys, &mut last_values, &mut changes)?; + self.query_storage_filtered(&range, &keys, &last_values, &mut changes)?; Ok(changes) } @@ -349,7 +457,10 @@ impl StateApi for State where keys: Option> ) { let keys = Into::>>::into(keys); - let stream = match self.client.storage_changes_notification_stream(keys.as_ref().map(|x| &**x)) { + let stream = match self.client.storage_changes_notification_stream( + keys.as_ref().map(|x| &**x), + None + ) { Ok(stream) => stream, Err(err) => { let _ = subscriber.reject(error::Error::from(err).into()); @@ -360,7 +471,7 @@ impl StateApi for State where // initial values let initial = stream::iter_result(keys .map(|keys| { - let block = self.client.info().map(|info| info.chain.best_hash).unwrap_or_default(); + let block = self.client.info().chain.best_hash; let changes = keys .into_iter() .map(|key| self.storage(key.clone(), Some(block.clone()).into()) @@ -376,7 +487,10 @@ impl StateApi for State where .map_err(|e| warn!("Error creating storage notification stream: {:?}", e)) .map(|(block, changes)| Ok(StorageChangeSet { block, - changes: changes.iter().cloned().collect(), + changes: changes.iter() + .filter_map(|(o_sk, k, v)| if o_sk.is_none() { + Some((k.clone(),v.cloned())) + } else { None }).collect(), })); sink @@ -397,7 +511,10 @@ impl StateApi for State where } fn subscribe_runtime_version(&self, _meta: Self::Metadata, subscriber: Subscriber) { - let stream = match self.client.storage_changes_notification_stream(Some(&[StorageKey(storage::well_known_keys::CODE.to_vec())])) { + let stream = match self.client.storage_changes_notification_stream( + Some(&[StorageKey(storage::well_known_keys::CODE.to_vec())]), + None, + ) { Ok(stream) => stream, Err(err) => { let _ = subscriber.reject(error::Error::from(err).into()); @@ -415,9 +532,9 @@ impl StateApi for State where let stream = stream .map_err(|e| warn!("Error creating storage notification stream: {:?}", e)) .filter_map(move |_| { - let version = client.info().and_then(|info| { - client.runtime_version_at(&BlockId::hash(info.chain.best_hash)) - }) + let info = client.info(); + let version = client + .runtime_version_at(&BlockId::hash(info.chain.best_hash)) .map_err(error::Error::from) .map_err(Into::into); if previous_version != version { @@ -465,11 +582,15 @@ pub(crate) fn split_range(size: usize, middle: Option) -> (Range, (range1, range2) } -fn invalid_block_range(from: Option<&H>, to: Option<&H>, reason: String) -> error::ErrorKind { +fn invalid_block_range(from: Option<&H>, to: Option<&H>, reason: String) -> error::Error { let to_string = |x: Option<&H>| match x { None => "unknown hash".into(), Some(h) => format!("{} ({})", h.number(), h.hash()), }; - error::ErrorKind::InvalidBlockRange(to_string(from), to_string(to), reason) + error::Error::InvalidBlockRange { + from: to_string(from), + to: to_string(to), + details: reason, + } } diff --git a/core/rpc/src/state/tests.rs b/core/rpc/src/state/tests.rs index 5321116c95267b65b93424ae06ded3b782f7edc9..f8cb19451337aae09b0c475aa67a9cb04f386791 100644 --- a/core/rpc/src/state/tests.rs +++ b/core/rpc/src/state/tests.rs @@ -15,42 +15,84 @@ // along with Substrate. If not, see . use super::*; -use self::error::{Error, ErrorKind}; +use self::error::Error; -use sr_io::blake2_256; use assert_matches::assert_matches; -use consensus::BlockOrigin; -use test_client::{self, runtime, AccountKeyring, TestClient, BlockBuilderExt}; +use primitives::storage::well_known_keys; +use sr_io::blake2_256; +use test_client::{ + prelude::*, + consensus::BlockOrigin, + runtime, +}; +use substrate_executor::NativeExecutionDispatch; #[test] fn should_return_storage() { - let core = ::tokio::runtime::Runtime::new().unwrap(); + let core = tokio::runtime::Runtime::new().unwrap(); let client = Arc::new(test_client::new()); let genesis_hash = client.genesis_hash(); let client = State::new(client, Subscriptions::new(core.executor())); + let key = StorageKey(b":code".to_vec()); + assert_eq!( + client.storage(key.clone(), Some(genesis_hash).into()) + .map(|x| x.map(|x| x.0.len())).unwrap().unwrap() as usize, + LocalExecutor::native_equivalent().len(), + ); assert_matches!( - client.storage(StorageKey(vec![10]), Some(genesis_hash).into()), - Ok(None) - ) + client.storage_hash(key.clone(), Some(genesis_hash).into()).map(|x| x.is_some()), + Ok(true) + ); + assert_eq!( + client.storage_size(key.clone(), None).unwrap().unwrap() as usize, + LocalExecutor::native_equivalent().len(), + ); +} + +#[test] +fn should_return_child_storage() { + let core = tokio::runtime::Runtime::new().unwrap(); + let client = Arc::new(test_client::TestClientBuilder::new() + .add_child_storage("test", "key", vec![42_u8]) + .build()); + let genesis_hash = client.genesis_hash(); + let client = State::new(client, Subscriptions::new(core.executor())); + let child_key = StorageKey(well_known_keys::CHILD_STORAGE_KEY_PREFIX.iter().chain(b"test").cloned().collect()); + let key = StorageKey(b"key".to_vec()); + + + assert_matches!( + client.child_storage(child_key.clone(), key.clone(), Some(genesis_hash).into()), + Ok(Some(StorageData(ref d))) if d[0] == 42 && d.len() == 1 + ); + assert_matches!( + client.child_storage_hash(child_key.clone(), key.clone(), Some(genesis_hash).into()) + .map(|x| x.is_some()), + Ok(true) + ); + assert_matches!( + client.child_storage_size(child_key.clone(), key.clone(), None), + Ok(Some(1)) + ); } #[test] fn should_call_contract() { - let core = ::tokio::runtime::Runtime::new().unwrap(); + let core = tokio::runtime::Runtime::new().unwrap(); let client = Arc::new(test_client::new()); let genesis_hash = client.genesis_hash(); let client = State::new(client, Subscriptions::new(core.executor())); assert_matches!( client.call("balanceOf".into(), Bytes(vec![1,2,3]), Some(genesis_hash).into()), - Err(Error(ErrorKind::Client(client::error::Error::Execution(_)), _)) + Err(Error::Client(client::error::Error::Execution(_))) ) } #[test] fn should_notify_about_storage_changes() { - let mut core = ::tokio::runtime::Runtime::new().unwrap(); + let mut core = tokio::runtime::Runtime::new().unwrap(); let remote = core.executor(); let (subscriber, id, transport) = Subscriber::new_test("test"); @@ -62,7 +104,7 @@ fn should_notify_about_storage_changes() { // assert id assigned assert_eq!(core.block_on(id), Ok(Ok(SubscriptionId::Number(1)))); - let mut builder = api.client.new_block().unwrap(); + let mut builder = api.client.new_block(Default::default()).unwrap(); builder.push_transfer(runtime::Transfer { from: AccountKeyring::Alice.into(), to: AccountKeyring::Ferdie.into(), @@ -81,14 +123,14 @@ fn should_notify_about_storage_changes() { #[test] fn should_send_initial_storage_changes_and_notifications() { - let mut core = ::tokio::runtime::Runtime::new().unwrap(); + let mut core = tokio::runtime::Runtime::new().unwrap(); let remote = core.executor(); let (subscriber, id, transport) = Subscriber::new_test("test"); { let api = State::new(Arc::new(test_client::new()), Subscriptions::new(remote)); - let alice_balance_key = blake2_256(&test_runtime::system::balance_of_key(AccountKeyring::Alice.into())); + let alice_balance_key = blake2_256(&runtime::system::balance_of_key(AccountKeyring::Alice.into())); api.subscribe_storage(Default::default(), subscriber, Some(vec![ StorageKey(alice_balance_key.to_vec()), @@ -97,7 +139,7 @@ fn should_send_initial_storage_changes_and_notifications() { // assert id assigned assert_eq!(core.block_on(id), Ok(Ok(SubscriptionId::Number(1)))); - let mut builder = api.client.new_block().unwrap(); + let mut builder = api.client.new_block(Default::default()).unwrap(); builder.push_transfer(runtime::Transfer { from: AccountKeyring::Alice.into(), to: AccountKeyring::Ferdie.into(), @@ -119,25 +161,22 @@ fn should_send_initial_storage_changes_and_notifications() { #[test] fn should_query_storage() { - type TestClient = test_client::client::Client< - test_client::Backend, - test_client::Executor, - runtime::Block, - runtime::RuntimeApi - >; - fn run_tests(client: Arc) { - let core = ::tokio::runtime::Runtime::new().unwrap(); + let core = tokio::runtime::Runtime::new().unwrap(); let api = State::new(client.clone(), Subscriptions::new(core.executor())); let add_block = |nonce| { - let mut builder = client.new_block().unwrap(); - builder.push_transfer(runtime::Transfer { - from: AccountKeyring::Alice.into(), - to: AccountKeyring::Ferdie.into(), - amount: 42, - nonce, - }).unwrap(); + let mut builder = client.new_block(Default::default()).unwrap(); + // fake change: None -> None -> None + builder.push_storage_change(vec![1], None).unwrap(); + // fake change: None -> Some(value) -> Some(value) + builder.push_storage_change(vec![2], Some(vec![2])).unwrap(); + // actual change: None -> Some(value) -> None + builder.push_storage_change(vec![3], if nonce == 0 { Some(vec![3]) } else { None }).unwrap(); + // actual change: None -> Some(value) + builder.push_storage_change(vec![4], if nonce == 0 { None } else { Some(vec![4]) }).unwrap(); + // actual change: Some(value1) -> Some(value2) + builder.push_storage_change(vec![5], Some(vec![nonce as u8])).unwrap(); let block = builder.bake().unwrap(); let hash = block.header.hash(); client.import(BlockOrigin::Own, block).unwrap(); @@ -147,32 +186,31 @@ fn should_query_storage() { let block2_hash = add_block(1); let genesis_hash = client.genesis_hash(); - let alice_balance_key = blake2_256(&test_runtime::system::balance_of_key(AccountKeyring::Alice.into())); - let mut expected = vec![ StorageChangeSet { block: genesis_hash, changes: vec![ - ( - StorageKey(alice_balance_key.to_vec()), - Some(StorageData(vec![232, 3, 0, 0, 0, 0, 0, 0])) - ), + (StorageKey(vec![1]), None), + (StorageKey(vec![2]), None), + (StorageKey(vec![3]), None), + (StorageKey(vec![4]), None), + (StorageKey(vec![5]), None), ], }, StorageChangeSet { block: block1_hash, changes: vec![ - ( - StorageKey(alice_balance_key.to_vec()), - Some(StorageData(vec![190, 3, 0, 0, 0, 0, 0, 0])) - ), + (StorageKey(vec![2]), Some(StorageData(vec![2]))), + (StorageKey(vec![3]), Some(StorageData(vec![3]))), + (StorageKey(vec![5]), Some(StorageData(vec![0]))), ], }, ]; // Query changes only up to block1 + let keys = (1..6).map(|k| StorageKey(vec![k])).collect::>(); let result = api.query_storage( - vec![StorageKey(alice_balance_key.to_vec())], + keys.clone(), genesis_hash, Some(block1_hash).into(), ); @@ -181,7 +219,7 @@ fn should_query_storage() { // Query all changes let result = api.query_storage( - vec![StorageKey(alice_balance_key.to_vec())], + keys.clone(), genesis_hash, None.into(), ); @@ -189,17 +227,16 @@ fn should_query_storage() { expected.push(StorageChangeSet { block: block2_hash, changes: vec![ - ( - StorageKey(alice_balance_key.to_vec()), - Some(StorageData(vec![148, 3, 0, 0, 0, 0, 0, 0])) - ), + (StorageKey(vec![3]), None), + (StorageKey(vec![4]), Some(StorageData(vec![4]))), + (StorageKey(vec![5]), Some(StorageData(vec![1]))), ], }); assert_eq!(result.unwrap(), expected); } run_tests(Arc::new(test_client::new())); - run_tests(Arc::new(test_client::new_with_changes_trie())); + run_tests(Arc::new(TestClientBuilder::new().set_support_changes_trie(true).build())); } #[test] @@ -214,20 +251,25 @@ fn should_split_ranges() { #[test] fn should_return_runtime_version() { - let core = ::tokio::runtime::Runtime::new().unwrap(); + let core = tokio::runtime::Runtime::new().unwrap(); let client = Arc::new(test_client::new()); let api = State::new(client.clone(), Subscriptions::new(core.executor())); + let result = "{\"specName\":\"test\",\"implName\":\"parity-test\",\"authoringVersion\":1,\ + \"specVersion\":1,\"implVersion\":1,\"apis\":[[\"0xdf6acb689907609b\",2],\ + [\"0x37e397fc7c91f5e4\",1],[\"0xd2bc9897eed08f15\",1],[\"0x40fe3ad401f8959a\",3],\ + [\"0xc6e9a76309f39b09\",1],[\"0xdd718d5cc53262d4\",1],[\"0xcbca25e39f142387\",1],\ + [\"0xf78b278be53f454c\",1]]}"; assert_eq!( - ::serde_json::to_string(&api.runtime_version(None.into()).unwrap()).unwrap(), - r#"{"specName":"test","implName":"parity-test","authoringVersion":1,"specVersion":1,"implVersion":1,"apis":[["0xdf6acb689907609b",2],["0x37e397fc7c91f5e4",1],["0xd2bc9897eed08f15",1],["0x40fe3ad401f8959a",3],["0xc6e9a76309f39b09",1],["0xdd718d5cc53262d4",1],["0xcbca25e39f142387",1],["0xf78b278be53f454c",1],["0x7801759919ee83e5",1]]}"# + serde_json::to_string(&api.runtime_version(None.into()).unwrap()).unwrap(), + result, ); } #[test] fn should_notify_on_runtime_version_initially() { - let mut core = ::tokio::runtime::Runtime::new().unwrap(); + let mut core = tokio::runtime::Runtime::new().unwrap(); let (subscriber, id, transport) = Subscriber::new_test("test"); { @@ -246,4 +288,3 @@ fn should_notify_on_runtime_version_initially() { // no more notifications on this channel assert_eq!(core.block_on(next.into_future()).unwrap().0, None); } - diff --git a/core/rpc/src/system/error.rs b/core/rpc/src/system/error.rs index d3c7e8b33387048385abcad3e620a615646f0dc5..bdd4cbe667e59a084d3b83f41b62e88f1518d5cd 100644 --- a/core/rpc/src/system/error.rs +++ b/core/rpc/src/system/error.rs @@ -16,40 +16,33 @@ //! System RPC module errors. -use error_chain::*; - use crate::rpc; -use crate::errors; use crate::system::helpers::Health; -error_chain! { - errors { - /// Node is not fully functional - NotHealthy(h: Health) { - description("node is not healthy"), - display("Node is not fully functional: {}", h) - } +/// System RPC Result type. +pub type Result = std::result::Result; - /// Not implemented yet - Unimplemented { - description("not yet implemented"), - display("Method Not Implemented"), - } - } +/// System RPC errors. +#[derive(Debug, derive_more::Display, derive_more::From)] +pub enum Error { + /// Provided block range couldn't be resolved to a list of blocks. + #[display(fmt = "Node is not fully functional: {}", _0)] + NotHealthy(Health), } -const ERROR: i64 = 2000; +impl std::error::Error for Error {} + +/// Base code for all system errors. +const BASE_ERROR: i64 = 2000; impl From for rpc::Error { fn from(e: Error) -> Self { match e { - Error(ErrorKind::Unimplemented, _) => errors::unimplemented(), - Error(ErrorKind::NotHealthy(h), _) => rpc::Error { - code: rpc::ErrorCode::ServerError(ERROR + 1), - message: "node is not healthy".into(), - data:serde_json::to_value(h).ok(), + Error::NotHealthy(ref h) => rpc::Error { + code: rpc::ErrorCode::ServerError(BASE_ERROR + 1), + message: format!("{}", e), + data: serde_json::to_value(h).ok(), }, - e => errors::internal(e), } } } diff --git a/core/rpc/src/system/helpers.rs b/core/rpc/src/system/helpers.rs index 82c7773b5b919ed152559a857f4288b8cbe6672d..00e2ba9f408b7658ccb45a10d62642bbfed1209c 100644 --- a/core/rpc/src/system/helpers.rs +++ b/core/rpc/src/system/helpers.rs @@ -17,7 +17,7 @@ //! Substrate system API helpers. use std::fmt; -use serde::Serialize; +use serde::{Serialize, Deserialize}; use serde_json::{Value, map::Map}; /// Node properties @@ -37,7 +37,7 @@ pub struct SystemInfo { } /// Health struct returned by the RPC -#[derive(Debug, PartialEq, Serialize)] +#[derive(Debug, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct Health { /// Number of connected peers @@ -51,7 +51,7 @@ pub struct Health { } /// Network Peer information -#[derive(Debug, PartialEq, Serialize)] +#[derive(Debug, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct PeerInfo { /// Peer ID diff --git a/core/rpc/src/system/mod.rs b/core/rpc/src/system/mod.rs index 331d9cd85ba61739c3833c5ec2497f2cf2331988..d0578590ae5e5a4d0b5d547588034ced5497c4f3 100644 --- a/core/rpc/src/system/mod.rs +++ b/core/rpc/src/system/mod.rs @@ -17,12 +17,13 @@ //! Substrate system API. pub mod error; +pub mod helpers; -mod helpers; #[cfg(test)] mod tests; -use std::sync::Arc; +use crate::helpers::Receiver; +use futures::sync::{mpsc, oneshot}; use jsonrpc_derive::rpc; use network; use runtime_primitives::traits::{self, Header as HeaderT}; @@ -30,6 +31,8 @@ use runtime_primitives::traits::{self, Header as HeaderT}; use self::error::Result; pub use self::helpers::{Properties, SystemInfo, Health, PeerInfo}; +pub use self::gen_client::Client as SystemClient; + /// Substrate system RPC API #[rpc] pub trait SystemApi { @@ -54,39 +57,49 @@ pub trait SystemApi { /// Node is considered healthy if it is: /// - connected to some peers (unless running in dev mode) /// - not performing a major sync - #[rpc(name = "system_health")] - fn system_health(&self) -> Result; + #[rpc(name = "system_health", returns = "Health")] + fn system_health(&self) -> Receiver; /// Returns currently connected peers - #[rpc(name = "system_peers")] - fn system_peers(&self) -> Result>>; + #[rpc(name = "system_peers", returns = "Vec>")] + fn system_peers(&self) -> Receiver>>; /// Returns current state of the network. /// /// **Warning**: This API is not stable. // TODO: make this stable and move structs https://github.com/paritytech/substrate/issues/1890 - #[rpc(name = "system_networkState")] - fn system_network_state(&self) -> Result; + #[rpc(name = "system_networkState", returns = "network::NetworkState")] + fn system_network_state(&self) -> Receiver; } /// System API implementation pub struct System { info: SystemInfo, - sync: Arc>, - should_have_peers: bool, + send_back: mpsc::UnboundedSender>, +} + +/// Request to be processed. +pub enum Request { + /// Must return the health of the network. + Health(oneshot::Sender), + /// Must return information about the peers we are connected to. + Peers(oneshot::Sender::Number>>>), + /// Must return the state of the network. + NetworkState(oneshot::Sender), } impl System { - /// Creates new `System` given the `SystemInfo`. + /// Creates new `System`. + /// + /// The `send_back` will be used to transmit some of the requests. The user is responsible for + /// reading from that channel and answering the requests. pub fn new( info: SystemInfo, - sync: Arc>, - should_have_peers: bool, + send_back: mpsc::UnboundedSender> ) -> Self { System { info, - should_have_peers, - sync, + send_back, } } } @@ -108,25 +121,21 @@ impl SystemApi::Number> for Sy Ok(self.info.properties.clone()) } - fn system_health(&self) -> Result { - Ok(Health { - peers: self.sync.peers().len(), - is_syncing: self.sync.is_major_syncing(), - should_have_peers: self.should_have_peers, - }) + fn system_health(&self) -> Receiver { + let (tx, rx) = oneshot::channel(); + let _ = self.send_back.unbounded_send(Request::Health(tx)); + Receiver(rx) } - fn system_peers(&self) -> Result::Number>>> { - Ok(self.sync.peers().into_iter().map(|(peer_id, p)| PeerInfo { - peer_id: peer_id.to_base58(), - roles: format!("{:?}", p.roles), - protocol_version: p.protocol_version, - best_hash: p.best_hash, - best_number: p.best_number, - }).collect()) + fn system_peers(&self) -> Receiver::Number>>> { + let (tx, rx) = oneshot::channel(); + let _ = self.send_back.unbounded_send(Request::Peers(tx)); + Receiver(rx) } - fn system_network_state(&self) -> Result { - Ok(self.sync.network_state()) + fn system_network_state(&self) -> Receiver { + let (tx, rx) = oneshot::channel(); + let _ = self.send_back.unbounded_send(Request::NetworkState(tx)); + Receiver(rx) } } diff --git a/core/rpc/src/system/tests.rs b/core/rpc/src/system/tests.rs index b4b71a7937af16e988e6e156a1bdecde1b05ecca..2dc4139da301928235db071cf78acb0be295a184 100644 --- a/core/rpc/src/system/tests.rs +++ b/core/rpc/src/system/tests.rs @@ -16,11 +16,12 @@ use super::*; -use network::{self, ProtocolStatus, PeerId, PeerInfo as NetworkPeerInfo}; +use network::{self, PeerId}; use network::config::Roles; use test_client::runtime::Block; use assert_matches::assert_matches; -use futures::sync::mpsc; +use futures::{prelude::*, sync::mpsc}; +use std::thread; struct Status { pub peers: usize, @@ -40,55 +41,61 @@ impl Default for Status { } } -impl network::SyncProvider for Status { - fn status(&self) -> mpsc::UnboundedReceiver> { - let (_sink, stream) = mpsc::unbounded(); - stream - } - - fn network_state(&self) -> network::NetworkState { - network::NetworkState { - peer_id: String::new(), - listened_addresses: Default::default(), - external_addresses: Default::default(), - connected_peers: Default::default(), - not_connected_peers: Default::default(), - average_download_per_sec: 0, - average_upload_per_sec: 0, - peerset: serde_json::Value::Null, - } - } - - fn peers(&self) -> Vec<(PeerId, NetworkPeerInfo)> { - let mut peers = vec![]; - for _peer in 0..self.peers { - peers.push( - (self.peer_id.clone(), NetworkPeerInfo { - roles: Roles::FULL, - protocol_version: 1, - best_hash: Default::default(), - best_number: 1 - }) - ); - } - peers - } - - fn is_major_syncing(&self) -> bool { - self.is_syncing - } -} - - fn api>>(sync: T) -> System { let status = sync.into().unwrap_or_default(); let should_have_peers = !status.is_dev; + let (tx, rx) = mpsc::unbounded(); + thread::spawn(move || { + tokio::run(rx.for_each(move |request| { + match request { + Request::Health(sender) => { + let _ = sender.send(Health { + peers: status.peers, + is_syncing: status.is_syncing, + should_have_peers, + }); + }, + Request::Peers(sender) => { + let mut peers = vec![]; + for _peer in 0..status.peers { + peers.push(PeerInfo { + peer_id: status.peer_id.to_base58(), + roles: format!("{:?}", Roles::FULL), + protocol_version: 1, + best_hash: Default::default(), + best_number: 1, + }); + } + let _ = sender.send(peers); + } + Request::NetworkState(sender) => { + let _ = sender.send(network::NetworkState { + peer_id: String::new(), + listened_addresses: Default::default(), + external_addresses: Default::default(), + connected_peers: Default::default(), + not_connected_peers: Default::default(), + average_download_per_sec: 0, + average_upload_per_sec: 0, + peerset: serde_json::Value::Null, + }); + } + }; + + Ok(()) + })) + }); System::new(SystemInfo { impl_name: "testclient".into(), impl_version: "0.2.0".into(), chain_name: "testchain".into(), properties: Default::default(), - }, Arc::new(status), should_have_peers) + }, tx) +} + +fn wait_receiver(rx: Receiver) -> T { + let mut runtime = tokio::runtime::current_thread::Runtime::new().unwrap(); + runtime.block_on(rx).unwrap() } #[test] @@ -126,7 +133,7 @@ fn system_properties_works() { #[test] fn system_health() { assert_matches!( - api(None).system_health().unwrap(), + wait_receiver(api(None).system_health()), Health { peers: 0, is_syncing: false, @@ -135,12 +142,12 @@ fn system_health() { ); assert_matches!( - api(Status { + wait_receiver(api(Status { peer_id: PeerId::random(), peers: 5, is_syncing: true, is_dev: true, - }).system_health().unwrap(), + }).system_health()), Health { peers: 5, is_syncing: true, @@ -149,12 +156,12 @@ fn system_health() { ); assert_eq!( - api(Status { + wait_receiver(api(Status { peer_id: PeerId::random(), peers: 5, is_syncing: false, is_dev: false, - }).system_health().unwrap(), + }).system_health()), Health { peers: 5, is_syncing: false, @@ -163,12 +170,12 @@ fn system_health() { ); assert_eq!( - api(Status { + wait_receiver(api(Status { peer_id: PeerId::random(), peers: 0, is_syncing: false, is_dev: true, - }).system_health().unwrap(), + }).system_health()), Health { peers: 0, is_syncing: false, @@ -181,12 +188,12 @@ fn system_health() { fn system_peers() { let peer_id = PeerId::random(); assert_eq!( - api(Status { + wait_receiver(api(Status { peer_id: peer_id.clone(), peers: 1, is_syncing: false, is_dev: true, - }).system_peers().unwrap(), + }).system_peers()), vec![PeerInfo { peer_id: peer_id.to_base58(), roles: "FULL".into(), @@ -200,7 +207,7 @@ fn system_peers() { #[test] fn system_network_state() { assert_eq!( - api(None).system_network_state().unwrap(), + wait_receiver(api(None).system_network_state()), network::NetworkState { peer_id: String::new(), listened_addresses: Default::default(), diff --git a/core/service/Cargo.toml b/core/service/Cargo.toml index 46a1b85fa2bbe9ffc65f863278786029c06dd12a..5a81022362872c8dd9ec1e9316ce2d2215d5bde6 100644 --- a/core/service/Cargo.toml +++ b/core/service/Cargo.toml @@ -5,18 +5,19 @@ authors = ["Parity Technologies "] edition = "2018" [dependencies] +derive_more = "0.14.0" futures = "0.1.17" -parking_lot = "0.7.1" -error-chain = "0.12" +parking_lot = "0.8.0" lazy_static = "1.0" log = "0.4" slog = {version = "^2", features = ["nested-values"]} tokio = "0.1.7" +tokio-timer = "0.2" exit-future = "0.1" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" +sysinfo = "0.8.0" target_info = "0.1" -inherents = { package = "substrate-inherents", path = "../../core/inherents" } keystore = { package = "substrate-keystore", path = "../../core/keystore" } sr-io = { path = "../../core/sr-io" } runtime_primitives = { package = "sr-primitives", path = "../../core/sr-primitives" } @@ -24,7 +25,7 @@ primitives = { package = "substrate-primitives", path = "../../core/primitives" consensus_common = { package = "substrate-consensus-common", path = "../../core/consensus/common" } network = { package = "substrate-network", path = "../../core/network" } client = { package = "substrate-client", path = "../../core/client" } -client_db = { package = "substrate-client-db", path = "../../core/client/db" } +client_db = { package = "substrate-client-db", path = "../../core/client/db", features = ["kvdb-rocksdb"] } parity-codec = "3.3" substrate-executor = { path = "../../core/executor" } transaction_pool = { package = "substrate-transaction-pool", path = "../../core/transaction-pool" } @@ -33,4 +34,8 @@ tel = { package = "substrate-telemetry", path = "../../core/telemetry" } offchain = { package = "substrate-offchain", path = "../../core/offchain" } [dev-dependencies] -substrate-test-client = { path = "../test-client" } +substrate-test-runtime-client = { path = "../test-runtime/client" } +node-executor = { path = "../../node/executor" } +node-primitives = { path = "../../node/primitives" } +node-runtime = { path = "../../node/runtime" } +grandpa = { package = "substrate-finality-grandpa", path = "../../core/finality-grandpa" } diff --git a/core/service/src/chain_ops.rs b/core/service/src/chain_ops.rs index 9f39e8088e7f8074b57383b0be9e4477480d6eb4..6c4a03ee7b003e38d39fc33b85504d4d9725b9ac 100644 --- a/core/service/src/chain_ops.rs +++ b/core/service/src/chain_ops.rs @@ -17,11 +17,11 @@ //! Chain utilities. use std::{self, io::{Read, Write}}; -use futures::Future; +use futures::prelude::*; use log::{info, warn}; use runtime_primitives::generic::{SignedBlock, BlockId}; -use runtime_primitives::traits::{As, Block, Header, NumberFor}; +use runtime_primitives::traits::{SaturatedConversion, Zero, One, Block, Header, NumberFor}; use consensus_common::import_queue::{ImportQueue, IncomingBlock, Link}; use network::message; @@ -50,9 +50,9 @@ pub fn export_blocks( let mut block = from; let last = match to { - Some(v) if v == As::sa(0) => As::sa(1), + Some(v) if v.is_zero() => One::one(), Some(v) => v, - None => client.info()?.chain.best_number, + None => client.info().chain.best_number, }; if last < block { @@ -66,8 +66,8 @@ pub fn export_blocks( }); info!("Exporting blocks from #{} to #{}", block, last); if !json { - let last_: u64 = last.as_(); - let block_: u64 = block.as_(); + let last_: u64 = last.saturated_into::(); + let block_: u64 = block.saturated_into::(); let len: u64 = last_ - block_ + 1; output.write(&len.encode())?; } @@ -87,33 +87,32 @@ pub fn export_blocks( }, None => break, } - if block.as_() % 10000 == 0 { + if (block % 10000.into()).is_zero() { info!("#{}", block); } if block == last { break; } - block += As::sa(1); + block += One::one(); } Ok(()) } struct WaitLink { - wait_send: std::sync::mpsc::Sender<()>, + imported_blocks: u64, } impl WaitLink { - fn new(wait_send: std::sync::mpsc::Sender<()>) -> WaitLink { + fn new() -> WaitLink { WaitLink { - wait_send, + imported_blocks: 0, } } } impl Link for WaitLink { - fn block_imported(&self, _hash: &B::Hash, _number: NumberFor) { - self.wait_send.send(()) - .expect("Unable to notify main process; if the main process panicked then this thread would already be dead as well. qed."); + fn block_imported(&mut self, _hash: &B::Hash, _number: NumberFor) { + self.imported_blocks += 1; } } @@ -128,11 +127,7 @@ pub fn import_blocks( let client = new_client::(&config)?; // FIXME #1134 this shouldn't need a mutable config. let select_chain = components::FullComponents::::build_select_chain(&mut config, client.clone())?; - let queue = components::FullComponents::::build_import_queue(&mut config, client.clone(), select_chain)?; - - let (wait_send, wait_recv) = std::sync::mpsc::channel(); - let wait_link = WaitLink::new(wait_send); - queue.start(Box::new(wait_link))?; + let mut queue = components::FullComponents::::build_import_queue(&mut config, client.clone(), select_chain)?; let (exit_send, exit_recv) = std::sync::mpsc::channel(); ::std::thread::spawn(move || { @@ -151,7 +146,7 @@ pub fn import_blocks( let (header, extrinsics) = signed.block.deconstruct(); let hash = header.hash(); let block = message::BlockData:: { - hash: hash, + hash, justification: signed.justification, header: Some(header), body: Some(extrinsics), @@ -175,18 +170,29 @@ pub fn import_blocks( block_count = b; if b % 1000 == 0 { - info!("#{}", b); + info!("#{} blocks were added to the queue", b); } } - let mut blocks_imported = 0; - while blocks_imported < count { - wait_recv.recv() - .expect("Importing thread has panicked. Then the main process will die before this can be reached. qed."); - blocks_imported += 1; - } + let mut link = WaitLink::new(); + tokio::run(futures::future::poll_fn(move || { + let blocks_before = link.imported_blocks; + queue.poll_actions(&mut link); + if link.imported_blocks / 1000 != blocks_before / 1000 { + info!( + "#{} blocks were imported (#{} left)", + link.imported_blocks, + count - link.imported_blocks + ); + } + if link.imported_blocks >= count { + Ok(Async::Ready(())) + } else { + Ok(Async::NotReady) + } + })); - info!("Imported {} blocks. Best: #{}", block_count, client.info()?.chain.best_number); + info!("Imported {} blocks. Best: #{}", block_count, client.info().chain.best_number); Ok(()) } @@ -200,9 +206,9 @@ pub fn revert_chain( { let client = new_client::(&config)?; let reverted = client.revert(blocks)?; - let info = client.info()?.chain; + let info = client.info().chain; - if reverted.as_() == 0 { + if reverted.is_zero() { info!("There aren't any non-finalized blocks to revert."); } else { info!("Reverted {} blocks. Best: #{} ({})", reverted, info.best_number, info.best_hash); diff --git a/core/service/src/components.rs b/core/service/src/components.rs index 7e76a8f201a9b922e99b61dca66cb810963c367e..a41f9e94fff40f647d1ac37bbb3cc9f4eb0642ee 100644 --- a/core/service/src/components.rs +++ b/core/service/src/components.rs @@ -24,7 +24,7 @@ use client_db; use client::{self, Client, runtime_api}; use crate::{error, Service, maybe_start_server}; use consensus_common::{import_queue::ImportQueue, SelectChain}; -use network::{self, OnDemand}; +use network::{self, OnDemand, FinalityProofProvider}; use substrate_executor::{NativeExecutor, NativeExecutionDispatch}; use transaction_pool::txpool::{self, Options as TransactionPoolOptions, Pool as TransactionPool}; use runtime_primitives::{ @@ -34,11 +34,17 @@ use crate::config::Configuration; use primitives::{Blake2Hasher, H256}; use rpc::{self, apis::system::SystemInfo}; use parking_lot::Mutex; +use futures::sync::mpsc; // Type aliases. // These exist mainly to avoid typing `::Foo` all over the code. -/// Network service type for a factory. -pub type NetworkService = network::Service<::Block, ::NetworkProtocol>; + +/// Network service type for `Components`. +pub type NetworkService = network::NetworkService< + ComponentBlock, + <::Factory as ServiceFactory>::NetworkProtocol, + ComponentExHash +>; /// Code executor type for a factory. pub type CodeExecutor = NativeExecutor<::RuntimeDispatch>; @@ -72,7 +78,7 @@ pub type LightExecutor = client::light::call_executor::RemoteOrLocalCallExecu client_db::light::LightStorage<::Block>, network::OnDemand<::Block> >, - network::OnDemand<::Block> + network::OnDemand<::Block>, >, client::LocalCallExecutor< client::light::backend::Backend< @@ -138,11 +144,11 @@ pub trait StartRPC { fn start_rpc( client: Arc>, - network: Arc>>, - should_have_peers: bool, + system_send_back: mpsc::UnboundedSender>>, system_info: SystemInfo, rpc_http: Option, rpc_ws: Option, + rpc_ws_max_connections: Option, rpc_cors: Option>, task_executor: TaskExecutor, transaction_pool: Arc>, @@ -157,11 +163,11 @@ impl StartRPC for C where fn start_rpc( client: Arc>, - network: Arc>>, - should_have_peers: bool, + system_send_back: mpsc::UnboundedSender>>, rpc_system_info: SystemInfo, rpc_http: Option, rpc_ws: Option, + rpc_ws_max_connections: Option, rpc_cors: Option>, task_executor: TaskExecutor, transaction_pool: Arc>, @@ -175,7 +181,7 @@ impl StartRPC for C where client.clone(), transaction_pool.clone(), subscriptions ); let system = rpc::apis::system::System::new( - rpc_system_info.clone(), network.clone(), should_have_peers + rpc_system_info.clone(), system_send_back.clone() ); rpc::rpc_handler::, ComponentExHash, _, _, _, _>( state, @@ -186,8 +192,19 @@ impl StartRPC for C where }; Ok(( - maybe_start_server(rpc_http, |address| rpc::start_http(address, rpc_cors.as_ref(), handler()))?, - maybe_start_server(rpc_ws, |address| rpc::start_ws(address, rpc_cors.as_ref(), handler()))?.map(Mutex::new), + maybe_start_server( + rpc_http, + |address| rpc::start_http(address, rpc_cors.as_ref(), handler()), + )?, + maybe_start_server( + rpc_ws, + |address| rpc::start_ws( + address, + rpc_ws_max_connections, + rpc_cors.as_ref(), + handler(), + ), + )?.map(Mutex::new), )) } } @@ -322,10 +339,15 @@ pub trait ServiceFactory: 'static + Sized { fn build_network_protocol(config: &FactoryFullConfiguration) -> Result; + /// Build finality proof provider for serving network requests on full node. + fn build_finality_proof_provider( + client: Arc> + ) -> Result>>, error::Error>; + /// Build the Fork Choice algorithm for full client fn build_select_chain( config: &mut FactoryFullConfiguration, - client: Arc>, + client: Arc>, ) -> Result; /// Build full service. @@ -339,7 +361,7 @@ pub trait ServiceFactory: 'static + Sized { fn build_full_import_queue( config: &mut FactoryFullConfiguration, _client: Arc>, - _select_chain: Self::SelectChain + _select_chain: Self::SelectChain, ) -> Result { if let Some(name) = config.chain_spec.consensus_engine() { match name { @@ -410,15 +432,19 @@ pub trait Components: Sized + 'static { fn build_import_queue( config: &mut FactoryFullConfiguration, client: Arc>, - select_chain: Self::SelectChain, + select_chain: Option, ) -> Result; + /// Finality proof provider for serving network requests. + fn build_finality_proof_provider( + client: Arc> + ) -> Result::Block>>>, error::Error>; + /// Build fork choice selector fn build_select_chain( config: &mut FactoryFullConfiguration, client: Arc> - ) -> Result; - + ) -> Result, error::Error>; } /// A struct that implement `Components` for the full client. @@ -476,6 +502,8 @@ impl Components for FullComponents { let db_settings = client_db::DatabaseSettings { cache_size: config.database_cache_size.map(|u| u as usize), state_cache_size: config.state_cache_size, + state_cache_child_ratio: + config.state_cache_child_ratio.map(|v| (v, 100)), path: config.database_path.as_str().into(), pruning: config.pruning.clone(), }; @@ -488,7 +516,7 @@ impl Components for FullComponents { } fn build_transaction_pool( - config: TransactionPoolOptions, + config: TransactionPoolOptions, client: Arc> ) -> Result, error::Error> { Factory::build_full_transaction_pool(config, client) @@ -497,18 +525,25 @@ impl Components for FullComponents { fn build_import_queue( config: &mut FactoryFullConfiguration, client: Arc>, - select_chain: Self::SelectChain, + select_chain: Option, ) -> Result { + let select_chain = select_chain + .ok_or(error::Error::SelectChainRequired)?; Factory::build_full_import_queue(config, client, select_chain) } fn build_select_chain( config: &mut FactoryFullConfiguration, client: Arc> - ) -> Result { - Self::Factory::build_select_chain(config, client) + ) -> Result, error::Error> { + Self::Factory::build_select_chain(config, client).map(Some) + } + + fn build_finality_proof_provider( + client: Arc> + ) -> Result::Block>>>, error::Error> { + Factory::build_finality_proof_provider(client) } - } /// A struct that implement `Components` for the light client. @@ -561,6 +596,8 @@ impl Components for LightComponents { let db_settings = client_db::DatabaseSettings { cache_size: None, state_cache_size: config.state_cache_size, + state_cache_child_ratio: + config.state_cache_child_ratio.map(|v| (v, 100)), path: config.database_path.as_str().into(), pruning: config.pruning.clone(), }; @@ -582,31 +619,34 @@ impl Components for LightComponents { fn build_import_queue( config: &mut FactoryFullConfiguration, client: Arc>, - _select_chain: Self::SelectChain, + _select_chain: Option, ) -> Result { Factory::build_light_import_queue(config, client) } - /// Build fork choice selector + fn build_finality_proof_provider( + _client: Arc> + ) -> Result::Block>>>, error::Error> { + Ok(None) + } fn build_select_chain( _config: &mut FactoryFullConfiguration, _client: Arc> - ) -> Result { - Err("Fork choice doesn't happen on light clients.".into()) + ) -> Result, error::Error> { + Ok(None) } - } #[cfg(test)] mod tests { use super::*; use consensus_common::BlockOrigin; - use client::LongestChain; - use substrate_test_client::{self, TestClient, AccountKeyring, runtime::Transfer}; + use substrate_test_runtime_client::{prelude::*, runtime::Transfer}; #[test] fn should_remove_transactions_from_the_pool() { - let client = Arc::new(substrate_test_client::new()); + let (client, longest_chain) = TestClientBuilder::new().build_with_longest_chain(); + let client = Arc::new(client); let pool = TransactionPool::new(Default::default(), ::transaction_pool::ChainApi::new(client.clone())); let transaction = Transfer { amount: 5, @@ -614,14 +654,13 @@ mod tests { from: AccountKeyring::Alice.into(), to: Default::default(), }.into_signed_tx(); - let best = LongestChain::new(client.backend().clone(), client.import_lock()) - .best_chain().unwrap(); + let best = longest_chain.best_chain().unwrap(); // store the transaction in the pool pool.submit_one(&BlockId::hash(best.hash()), transaction.clone()).unwrap(); // import the block - let mut builder = client.new_block().unwrap(); + let mut builder = client.new_block(Default::default()).unwrap(); builder.push(transaction.clone()).unwrap(); let block = builder.bake().unwrap(); let id = BlockId::hash(block.header().hash()); diff --git a/core/service/src/config.rs b/core/service/src/config.rs index 20134c788d170b56866e51475069684e5e32a516..3a49630898d42c4eff7c815db4461c986d5b17f9 100644 --- a/core/service/src/config.rs +++ b/core/service/src/config.rs @@ -50,6 +50,8 @@ pub struct Configuration { pub database_cache_size: Option, /// Size of internal state cache in Bytes pub state_cache_size: usize, + /// Size in percent of cache size dedicated to child tries + pub state_cache_child_ratio: Option, /// Pruning settings. pub pruning: PruningMode, /// Additional key seeds. @@ -66,6 +68,8 @@ pub struct Configuration { pub rpc_http: Option, /// RPC over Websockets binding address. `None` if disabled. pub rpc_ws: Option, + /// Maximum number of connections for WebSockets RPC server. `None` if default. + pub rpc_ws_max_connections: Option, /// CORS settings for HTTP & WS servers. `None` if all origins are allowed. pub rpc_cors: Option>, /// Telemetry service URL. `None` if disabled. @@ -78,6 +82,8 @@ pub struct Configuration { pub force_authoring: bool, /// Disable GRANDPA when running in validator mode pub disable_grandpa: bool, + /// Node keystore's password + pub password: String, } impl Configuration { @@ -96,18 +102,21 @@ impl Configuration = std::result::Result; - links { - Consensus(consensus_common::Error, consensus_common::ErrorKind) #[doc="Consensus error"]; - Network(network::error::Error, network::error::ErrorKind) #[doc="Network error"]; - Keystore(keystore::Error, keystore::ErrorKind) #[doc="Keystore error"]; +/// Service errors. +#[derive(Debug, derive_more::Display, derive_more::From)] +pub enum Error { + /// Client error. + Client(client::error::Error), + /// IO error. + Io(std::io::Error), + /// Consensus error. + Consensus(consensus_common::Error), + /// Network error. + Network(network::error::Error), + /// Keystore error. + Keystore(keystore::Error), + /// Best chain selection strategy is missing. + #[display(fmt="Best chain selection strategy (SelectChain) is not provided.")] + SelectChainRequired, + /// Other error. + Other(String), +} + +impl<'a> From<&'a str> for Error { + fn from(s: &'a str) -> Self { + Error::Other(s.into()) } +} - errors { +impl std::error::Error for Error { + fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { + match self { + Error::Client(ref err) => Some(err), + Error::Io(ref err) => Some(err), + Error::Consensus(ref err) => Some(err), + Error::Network(ref err) => Some(err), + Error::Keystore(ref err) => Some(err), + _ => None, + } } } diff --git a/core/service/src/lib.rs b/core/service/src/lib.rs index aed14568cb682889a4cfe4fcbf29a1fd3c6ee936..f66b083fd0b910a16d979cc8925d51238b5c4755 100644 --- a/core/service/src/lib.rs +++ b/core/service/src/lib.rs @@ -20,32 +20,32 @@ #![warn(missing_docs)] mod components; -mod error; mod chain_spec; pub mod config; pub mod chain_ops; +pub mod error; use std::io; use std::net::SocketAddr; use std::collections::HashMap; +use std::time::Duration; use futures::sync::mpsc; use parking_lot::Mutex; -use client::BlockchainEvents; +use client::{BlockchainEvents, backend::Backend}; use exit_future::Signal; use futures::prelude::*; -use inherents::pool::InherentsPool; use keystore::Store as Keystore; use log::{info, warn, debug}; use parity_codec::{Encode, Decode}; use primitives::Pair; use runtime_primitives::generic::BlockId; -use runtime_primitives::traits::{Header, As}; +use runtime_primitives::traits::{Header, NumberFor, SaturatedConversion}; use substrate_executor::NativeExecutor; -use consensus_common::SelectChain; +use sysinfo::{get_current_pid, ProcessExt, System, SystemExt}; use tel::{telemetry, SUBSTRATE_INFO}; -pub use self::error::{ErrorKind, Error}; +pub use self::error::Error; pub use config::{Configuration, Roles, PruningMode}; pub use chain_spec::{ChainSpec, Properties}; pub use transaction_pool::txpool::{ @@ -65,7 +65,7 @@ use components::{StartRPC, MaintainTransactionPool, OffchainWorker}; #[doc(hidden)] pub use std::{ops::Deref, result::Result, sync::Arc}; #[doc(hidden)] -pub use network::OnDemand; +pub use network::{FinalityProofProvider, OnDemand}; #[doc(hidden)] pub use tokio::runtime::TaskExecutor; @@ -74,17 +74,18 @@ const DEFAULT_PROTOCOL_ID: &str = "sup"; /// Substrate service. pub struct Service { client: Arc>, - select_chain: ::SelectChain, - network: Option>>, + select_chain: Option<::SelectChain>, + network: Arc>, + /// Sinks to propagate network status updates. + network_status_sinks: Arc>>>>>, transaction_pool: Arc>, - inherents_pool: Arc>>, keystore: Keystore, exit: ::exit_future::Exit, signal: Option, /// Configuration of this Service pub config: FactoryFullConfiguration, - _rpc: Box<::std::any::Any + Send + Sync>, - _telemetry: Option>, + _rpc: Box, + _telemetry: Option, _offchain_workers: Option, ComponentBlock>>>, _telemetry_on_connect_sinks: Arc>>>, } @@ -107,7 +108,7 @@ pub type TelemetryOnConnectNotifications = mpsc::UnboundedReceiver<()>; /// Used to hook on telemetry connection established events. pub struct TelemetryOnConnect<'a> { /// Handle to a future that will resolve on exit. - pub on_exit: Box + Send + 'static>, + pub on_exit: Box + Send + 'static>, /// Event stream. pub telemetry_connection_sinks: TelemetryOnConnectNotifications, /// Executor to which the hook is spawned. @@ -143,7 +144,7 @@ impl Service { let public_key = match keystore.contents()?.get(0) { Some(public_key) => public_key.clone(), None => { - let key = keystore.generate("")?; + let key = keystore.generate(&config.password)?; let public_key = key.public(); info!("Generated a new keypair: {:?}", public_key); @@ -156,33 +157,28 @@ impl Service { let import_queue = Box::new(Components::build_import_queue( &mut config, client.clone(), - select_chain.clone() + select_chain.clone(), )?); - let best_header = select_chain.best_chain()?; + let finality_proof_provider = Components::build_finality_proof_provider(client.clone())?; + let chain_info = client.info().chain; let version = config.full_version(); - info!("Best block: #{}", best_header.number()); - telemetry!(SUBSTRATE_INFO; "node.start"; "height" => best_header.number().as_(), "best" => ?best_header.hash()); + info!("Highest known block at #{}", chain_info.best_number); + telemetry!(SUBSTRATE_INFO; "node.start"; + "height" => chain_info.best_number.saturated_into::(), + "best" => ?chain_info.best_hash + ); let network_protocol = ::build_network_protocol(&config)?; let transaction_pool = Arc::new( Components::build_transaction_pool(config.transaction_pool.clone(), client.clone())? ); let transaction_pool_adapter = Arc::new(TransactionPoolAdapter:: { - imports_external_transactions: !(config.roles == Roles::LIGHT), + imports_external_transactions: !config.roles.is_light(), pool: transaction_pool.clone(), client: client.clone(), }); - let network_params = network::config::Params { - config: network::config::ProtocolConfig { roles: config.roles }, - network_config: config.network.clone(), - chain: client.clone(), - on_demand: on_demand.as_ref().map(|d| d.clone() as _), - transaction_pool: transaction_pool_adapter.clone() as _, - specialization: network_protocol, - }; - let protocol_id = { let protocol_id_full = match config.chain_spec.protocol_id() { Some(pid) => pid, @@ -196,19 +192,31 @@ impl Service { network::ProtocolId::from(protocol_id_full) }; - let has_bootnodes = !network_params.network_config.boot_nodes.is_empty(); - let (network, network_chan) = network::Service::new( - network_params, + let network_params = network::config::Params { + roles: config.roles, + network_config: config.network.clone(), + chain: client.clone(), + finality_proof_provider, + on_demand, + transaction_pool: transaction_pool_adapter.clone() as _, + import_queue, protocol_id, - import_queue - )?; - on_demand.map(|on_demand| on_demand.set_network_sender(network_chan)); + specialization: network_protocol, + }; + + let has_bootnodes = !network_params.network_config.boot_nodes.is_empty(); + let network_mut = network::NetworkWorker::new(network_params)?; + let network = network_mut.service().clone(); + let network_status_sinks = Arc::new(Mutex::new(Vec::new())); + + task_executor.spawn(build_network_future(network_mut, network_status_sinks.clone()) + .map_err(|_| ()) + .select(exit.clone()) + .then(|_| Ok(()))); - let inherents_pool = Arc::new(InherentsPool::default()); let offchain_workers = if config.offchain_worker { Some(Arc::new(offchain::OffchainWorkers::new( client.clone(), - inherents_pool.clone(), task_executor.clone(), ))) } else { @@ -302,11 +310,17 @@ impl Service { { // extrinsic notifications let network = Arc::downgrade(&network); + let transaction_pool_ = transaction_pool.clone(); let events = transaction_pool.import_notification_stream() .for_each(move |_| { if let Some(network) = network.upgrade() { network.trigger_repropagate(); } + let status = transaction_pool_.status(); + telemetry!(SUBSTRATE_INFO; "txpool.import"; + "ready" => status.ready, + "future" => status.future + ); Ok(()) }) .select(exit.clone()) @@ -315,6 +329,58 @@ impl Service { task_executor.spawn(events); } + // Periodically notify the telemetry. + let transaction_pool_ = transaction_pool.clone(); + let client_ = client.clone(); + let network_ = network.clone(); + let mut sys = System::new(); + let self_pid = get_current_pid(); + let (netstat_tx, netstat_rx) = mpsc::unbounded(); + network_status_sinks.lock().push(netstat_tx); + task_executor.spawn(netstat_rx.for_each(move |net_status| { + let info = client_.info(); + let best_number = info.chain.best_number.saturated_into::(); + let best_hash = info.chain.best_hash; + let num_peers = net_status.num_connected_peers; + let txpool_status = transaction_pool_.status(); + let finalized_number: u64 = info.chain.finalized_number.saturated_into::(); + let bandwidth_download = net_status.average_download_per_sec; + let bandwidth_upload = net_status.average_upload_per_sec; + + #[allow(deprecated)] + let backend = (*client_).backend(); + let used_state_cache_size = match backend.used_state_cache_size(){ + Some(size) => size, + None => 0, + }; + + // get cpu usage and memory usage of this process + let (cpu_usage, memory) = if sys.refresh_process(self_pid) { + let proc = sys.get_process(self_pid).expect("Above refresh_process succeeds, this should be Some(), qed"); + (proc.cpu_usage(), proc.memory()) + } else { (0.0, 0) }; + + let network_state = network_.network_state(); + + telemetry!( + SUBSTRATE_INFO; + "system.interval"; + "network_state" => network_state, + "peers" => num_peers, + "height" => best_number, + "best" => ?best_hash, + "txcount" => txpool_status.ready, + "cpu" => cpu_usage, + "memory" => memory, + "finalized_height" => finalized_number, + "finalized_hash" => ?info.chain.finalized_hash, + "bandwidth_download" => bandwidth_download, + "bandwidth_upload" => bandwidth_upload, + "used_state_cache_size" => used_state_cache_size, + ); + + Ok(()) + }).select(exit.clone()).then(|_| Ok(()))); // RPC let system_info = rpc::apis::system::SystemInfo { @@ -323,10 +389,23 @@ impl Service { impl_version: config.impl_version.into(), properties: config.chain_spec.properties(), }; + let (system_rpc_tx, system_rpc_rx) = mpsc::unbounded(); let rpc = Components::RuntimeServices::start_rpc( - client.clone(), network.clone(), has_bootnodes, system_info, config.rpc_http, - config.rpc_ws, config.rpc_cors.clone(), task_executor.clone(), transaction_pool.clone(), + client.clone(), + system_rpc_tx, + system_info, + config.rpc_http, + config.rpc_ws, + config.rpc_ws_max_connections, + config.rpc_cors.clone(), + task_executor.clone(), + transaction_pool.clone(), )?; + task_executor.spawn(build_system_rpc_handler::( + network.clone(), + system_rpc_rx, + has_bootnodes + )); let telemetry_connection_sinks: Arc>>> = Default::default(); @@ -340,9 +419,15 @@ impl Service { let version = version.clone(); let chain_name = config.chain_spec.name().to_owned(); let telemetry_connection_sinks_ = telemetry_connection_sinks.clone(); - Arc::new(tel::init_telemetry(tel::TelemetryConfig { + let telemetry = tel::init_telemetry(tel::TelemetryConfig { endpoints, - on_connect: Box::new(move || { + wasm_external_transport: None, + }); + let future = telemetry.clone() + .for_each(move |event| { + // Safe-guard in case we add more events in the future. + let tel::TelemetryEvent::Connected = event; + telemetry!(SUBSTRATE_INFO; "system.connected"; "name" => name.clone(), "implementation" => impl_name.clone(), @@ -357,16 +442,20 @@ impl Service { telemetry_connection_sinks_.lock().retain(|sink| { sink.unbounded_send(()).is_ok() }); - }), - })) + Ok(()) + }); + task_executor.spawn(future + .select(exit.clone()) + .then(|_| Ok(()))); + telemetry }); Ok(Service { client, - network: Some(network), + network, + network_status_sinks, select_chain, transaction_pool, - inherents_pool, signal: Some(signal), keystore, config, @@ -383,7 +472,7 @@ impl Service { if self.config.roles != Roles::AUTHORITY { return None } let keystore = &self.keystore; if let Ok(Some(Ok(key))) = keystore.contents().map(|keys| keys.get(0) - .map(|k| keystore.load(k, ""))) + .map(|k| keystore.load(k, &self.config.password))) { Some(key) } else { @@ -392,7 +481,7 @@ impl Service { } /// return a shared instance of Telemetry (if enabled) - pub fn telemetry(&self) -> Option> { + pub fn telemetry(&self) -> Option { self._telemetry.as_ref().map(|t| t.clone()) } } @@ -404,13 +493,20 @@ impl Service where Components: components::Components { } /// Get clone of select chain. - pub fn select_chain(&self) -> ::SelectChain { + pub fn select_chain(&self) -> Option<::SelectChain> { self.select_chain.clone() } /// Get shared network instance. - pub fn network(&self) -> Arc> { - self.network.as_ref().expect("self.network always Some").clone() + pub fn network(&self) -> Arc> { + self.network.clone() + } + + /// Returns a receiver that periodically receives a status of the network. + pub fn network_status(&self) -> mpsc::UnboundedReceiver>> { + let (sink, stream) = mpsc::unbounded(); + self.network_status_sinks.lock().push(sink); + stream } /// Get shared transaction pool instance. @@ -418,11 +514,6 @@ impl Service where Components: components::Components { self.transaction_pool.clone() } - /// Get shared inherents pool instance. - pub fn inherents_pool(&self) -> Arc>> { - self.inherents_pool.clone() - } - /// Get shared keystore. pub fn keystore(&self) -> &Keystore { &self.keystore @@ -434,13 +525,61 @@ impl Service where Components: components::Components { } } +/// Builds a never-ending future that continuously polls the network. +/// +/// The `status_sink` contain a list of senders to send a periodic network status to. +fn build_network_future, H: network::ExHashT>( + mut network: network::NetworkWorker, + status_sinks: Arc>>>>, +) -> impl Future { + // Interval at which we send status updates on the status stream. + const STATUS_INTERVAL: Duration = Duration::from_millis(5000); + let mut status_interval = tokio_timer::Interval::new_interval(STATUS_INTERVAL); + + futures::future::poll_fn(move || { + while let Ok(Async::Ready(_)) = status_interval.poll() { + let status = NetworkStatus { + sync_state: network.sync_state(), + best_seen_block: network.best_seen_block(), + num_sync_peers: network.num_sync_peers(), + num_connected_peers: network.num_connected_peers(), + num_active_peers: network.num_active_peers(), + average_download_per_sec: network.average_download_per_sec(), + average_upload_per_sec: network.average_upload_per_sec(), + }; + + status_sinks.lock().retain(|sink| sink.unbounded_send(status.clone()).is_ok()); + } + + network.poll() + .map_err(|err| { + warn!(target: "service", "Error in network: {:?}", err); + }) + }) +} + +/// Overview status of the network. +#[derive(Clone)] +pub struct NetworkStatus { + /// Current global sync state. + pub sync_state: network::SyncState, + /// Target sync block number. + pub best_seen_block: Option>, + /// Number of peers participating in syncing. + pub num_sync_peers: u32, + /// Total number of connected peers + pub num_connected_peers: usize, + /// Total number of active peers. + pub num_active_peers: usize, + /// Downloaded bytes per second averaged over the past few seconds. + pub average_download_per_sec: u64, + /// Uploaded bytes per second averaged over the past few seconds. + pub average_upload_per_sec: u64, +} impl Drop for Service where Components: components::Components { fn drop(&mut self) { debug!(target: "service", "Substrate service shutdown"); - - drop(self.network.take()); - if let Some(signal) = self.signal.take() { signal.fire(); } @@ -474,26 +613,36 @@ pub struct TransactionPoolAdapter { impl TransactionPoolAdapter { fn best_block_id(&self) -> Option>> { - self.client.info() - .map(|info| BlockId::hash(info.chain.best_hash)) - .map_err(|e| { - debug!("Error getting best block: {:?}", e); - }) - .ok() + Some(BlockId::hash(self.client.info().chain.best_hash)) } } +/// Get transactions for propagation. +/// +/// Function extracted to simplify the test and prevent creating `ServiceFactory`. +fn transactions_to_propagate(pool: &TransactionPool) + -> Vec<(H, B::Extrinsic)> +where + PoolApi: ChainApi, + B: BlockT, + H: std::hash::Hash + Eq + runtime_primitives::traits::Member + serde::Serialize, + E: txpool::error::IntoPoolError + From, +{ + pool.ready() + .filter(|t| t.is_propagateable()) + .map(|t| { + let hash = t.hash.clone(); + let ex: B::Extrinsic = t.data.clone(); + (hash, ex) + }) + .collect() +} + impl network::TransactionPool, ComponentBlock> for TransactionPoolAdapter where ::RuntimeApi: Send + Sync { fn transactions(&self) -> Vec<(ComponentExHash, ComponentExtrinsic)> { - self.pool.ready() - .map(|t| { - let hash = t.hash.clone(); - let ex: ComponentExtrinsic = t.data.clone(); - (hash, ex) - }) - .collect() + transactions_to_propagate(&self.pool) } fn import(&self, transaction: &ComponentExtrinsic) -> Option> { @@ -508,7 +657,7 @@ impl network::TransactionPool, ComponentBlock< match self.pool.submit_one(&best_block_id, uxt) { Ok(hash) => Some(hash), Err(e) => match e.into_pool_error() { - Ok(txpool::error::Error(txpool::error::ErrorKind::AlreadyImported(hash), _)) => { + Ok(txpool::error::Error::AlreadyImported(hash)) => { hash.downcast::>().ok() .map(|x| x.as_ref().clone()) }, @@ -533,6 +682,39 @@ impl network::TransactionPool, ComponentBlock< } } +/// Builds a never-ending `Future` that answers the RPC requests coming on the receiver. +fn build_system_rpc_handler( + network: Arc>, + rx: mpsc::UnboundedReceiver>>, + should_have_peers: bool, +) -> impl Future { + rx.for_each(move |request| { + match request { + rpc::apis::system::Request::Health(sender) => { + let _ = sender.send(rpc::apis::system::Health { + peers: network.peers_debug_info().len(), + is_syncing: network.is_major_syncing(), + should_have_peers, + }); + }, + rpc::apis::system::Request::Peers(sender) => { + let _ = sender.send(network.peers_debug_info().into_iter().map(|(peer_id, p)| rpc::apis::system::PeerInfo { + peer_id: peer_id.to_base58(), + roles: format!("{:?}", p.roles), + protocol_version: p.protocol_version, + best_hash: p.best_hash, + best_number: p.best_number, + }).collect()); + } + rpc::apis::system::Request::NetworkState(sender) => { + let _ = sender.send(network.network_state()); + } + }; + + Ok(()) + }) +} + /// Constructs a service factory with the given name that implements the `ServiceFactory` trait. /// The required parameters are required to be given in the exact order. Some parameters are followed /// by `{}` blocks. These blocks are required and used to initialize the given parameter. @@ -541,33 +723,78 @@ impl network::TransactionPool, ComponentBlock< /// /// # Example /// -/// ```nocompile +/// ``` +/// # use substrate_service::{ +/// # construct_service_factory, Service, FullBackend, FullExecutor, LightBackend, LightExecutor, +/// # FullComponents, LightComponents, FactoryFullConfiguration, FullClient, TaskExecutor +/// # }; +/// # use transaction_pool::{self, txpool::{Pool as TransactionPool}}; +/// # use network::construct_simple_protocol; +/// # use client::{self, LongestChain}; +/// # use primitives::{Pair as PairT, ed25519}; +/// # use consensus_common::import_queue::{BasicQueue, Verifier}; +/// # use consensus_common::{BlockOrigin, ImportBlock, well_known_cache_keys::Id as CacheKeyId}; +/// # use node_runtime::{GenesisConfig, RuntimeApi}; +/// # use std::sync::Arc; +/// # use node_primitives::Block; +/// # use runtime_primitives::Justification; +/// # use runtime_primitives::traits::Block as BlockT; +/// # use grandpa; +/// # construct_simple_protocol! { +/// # pub struct NodeProtocol where Block = Block { } +/// # } +/// # struct MyVerifier; +/// # impl Verifier for MyVerifier { +/// # fn verify( +/// # &self, +/// # origin: BlockOrigin, +/// # header: B::Header, +/// # justification: Option, +/// # body: Option>, +/// # ) -> Result<(ImportBlock, Option)>>), String> { +/// # unimplemented!(); +/// # } +/// # } +/// type FullChainApi = transaction_pool::ChainApi< +/// client::Client, FullExecutor, Block, RuntimeApi>, Block>; +/// type LightChainApi = transaction_pool::ChainApi< +/// client::Client, LightExecutor, Block, RuntimeApi>, Block>; +/// /// construct_service_factory! { /// struct Factory { -/// // Declare the block type +/// // Declare the block type /// Block = Block, -/// // Declare the network protocol and give an initializer. +/// RuntimeApi = RuntimeApi, +/// // Declare the network protocol and give an initializer. /// NetworkProtocol = NodeProtocol { |config| Ok(NodeProtocol::new()) }, /// RuntimeDispatch = node_executor::Executor, -/// FullTransactionPoolApi = transaction_pool::ChainApi, FullExecutor, Block> +/// FullTransactionPoolApi = FullChainApi /// { |config, client| Ok(TransactionPool::new(config, transaction_pool::ChainApi::new(client))) }, -/// LightTransactionPoolApi = transaction_pool::ChainApi, LightExecutor, Block> +/// LightTransactionPoolApi = LightChainApi /// { |config, client| Ok(TransactionPool::new(config, transaction_pool::ChainApi::new(client))) }, /// Genesis = GenesisConfig, /// Configuration = (), -/// FullService = Service> -/// { |config, executor| Service::>::new(config, executor) }, -/// // Setup as Consensus Authority (if the role and key are given) +/// FullService = FullComponents +/// { |config, executor| >::new(config, executor) }, +/// // Setup as Consensus Authority (if the role and key are given) /// AuthoritySetup = { -/// |service: Self::FullService, executor: TaskExecutor, key: Arc| { Ok(service) }}, -/// LightService = Service> -/// { |config, executor| Service::>::new(config, executor) }, -/// // Declare the import queue. The import queue is special as it takes two initializers. -/// // The first one is for the initializing the full import queue and the second for the -/// // light import queue. -/// ImportQueue = BasicQueue -/// { |_, client| Ok(BasicQueue::new(Arc::new(NoneVerifier {}, client))) } -/// { |_, client| Ok(BasicQueue::new(Arc::new(NoneVerifier {}, client))) }, +/// |service: Self::FullService, executor: TaskExecutor, key: Option>| { +/// Ok(service) +/// }}, +/// LightService = LightComponents +/// { |config, executor| >::new(config, executor) }, +/// FullImportQueue = BasicQueue +/// { |_, client, _| Ok(BasicQueue::new(Arc::new(MyVerifier), client, None, None, None)) }, +/// LightImportQueue = BasicQueue +/// { |_, client| Ok(BasicQueue::new(Arc::new(MyVerifier), client, None, None, None)) }, +/// SelectChain = LongestChain, Self::Block> +/// { |config: &FactoryFullConfiguration, client: Arc>| { +/// #[allow(deprecated)] +/// Ok(LongestChain::new(client.backend().clone())) +/// }}, +/// FinalityProofProvider = { |client: Arc>| { +/// Ok(Some(Arc::new(grandpa::FinalityProofProvider::new(client.clone(), client)) as _)) +/// }}, /// } /// } /// ``` @@ -593,6 +820,7 @@ macro_rules! construct_service_factory { { $( $light_import_queue_init:tt )* }, SelectChain = $select_chain:ty { $( $select_chain_init:tt )* }, + FinalityProofProvider = { $( $finality_proof_provider_init:tt )* }, } ) => { $( #[$attr] )* @@ -658,6 +886,12 @@ macro_rules! construct_service_factory { ( $( $light_import_queue_init )* ) (config, client) } + fn build_finality_proof_provider( + client: Arc<$crate::FullClient> + ) -> Result>>, $crate::Error> { + ( $( $finality_proof_provider_init )* ) (client) + } + fn new_light( config: $crate::FactoryFullConfiguration, executor: $crate::TaskExecutor @@ -679,3 +913,41 @@ macro_rules! construct_service_factory { } } } + +#[cfg(test)] +mod tests { + use super::*; + use consensus_common::SelectChain; + use runtime_primitives::traits::BlindCheckable; + use substrate_test_runtime_client::{prelude::*, runtime::{Extrinsic, Transfer}}; + + #[test] + fn should_not_propagate_transactions_that_are_marked_as_such() { + // given + let (client, longest_chain) = TestClientBuilder::new().build_with_longest_chain(); + let client = Arc::new(client); + let pool = Arc::new(TransactionPool::new( + Default::default(), + transaction_pool::ChainApi::new(client.clone()) + )); + let best = longest_chain.best_chain().unwrap(); + let transaction = Transfer { + amount: 5, + nonce: 0, + from: AccountKeyring::Alice.into(), + to: Default::default(), + }.into_signed_tx(); + pool.submit_one(&BlockId::hash(best.hash()), transaction.clone()).unwrap(); + pool.submit_one(&BlockId::hash(best.hash()), Extrinsic::IncludeData(vec![1])).unwrap(); + assert_eq!(pool.status().ready, 2); + + // when + let transactions = transactions_to_propagate(&pool); + + // then + assert_eq!(transactions.len(), 1); + assert!(transactions[0].1.clone().check().is_ok()); + // this should not panic + let _ = transactions[0].1.transfer(); + } +} diff --git a/core/service/test/src/lib.rs b/core/service/test/src/lib.rs index 95cd0173b48ab73666731b616529d44591f517e1..d3d9677bb241028e528d78714c745860354699e3 100644 --- a/core/service/test/src/lib.rs +++ b/core/service/test/src/lib.rs @@ -24,7 +24,7 @@ use std::collections::HashMap; use log::info; use futures::{Future, Stream}; use tempdir::TempDir; -use tokio::runtime::Runtime; +use tokio::{runtime::Runtime, prelude::FutureExt}; use tokio::timer::Interval; use service::{ ServiceFactory, @@ -34,33 +34,58 @@ use service::{ Roles, FactoryExtrinsic, }; -use network::{multiaddr, Multiaddr, SyncProvider, ManageNetwork}; +use network::{multiaddr, Multiaddr, ManageNetwork}; use network::config::{NetworkConfiguration, NodeKeyConfig, Secret, NonReservedPeerMode}; -use sr_primitives::traits::As; use sr_primitives::generic::BlockId; use consensus::{ImportBlock, BlockImport}; +/// Maximum duration of single wait call. +const MAX_WAIT_TIME: Duration = Duration::from_secs(60 * 3); + struct TestNet { runtime: Runtime, authority_nodes: Vec<(u32, Arc, Multiaddr)>, full_nodes: Vec<(u32, Arc, Multiaddr)>, - _light_nodes: Vec<(u32, Arc)>, + light_nodes: Vec<(u32, Arc, Multiaddr)>, chain_spec: FactoryChainSpec, base_port: u16, nodes: usize, } impl TestNet { - pub fn run_until_all_full bool + 'static>(&mut self, predicate: P) { + pub fn run_until_all_full( + &mut self, + full_predicate: FP, + light_predicate: LP, + ) + where + FP: Send + Sync + Fn(u32, &F::FullService) -> bool + 'static, + LP: Send + Sync + Fn(u32, &F::LightService) -> bool + 'static, + { let full_nodes = self.full_nodes.clone(); - let interval = Interval::new_interval(Duration::from_millis(100)).map_err(|_| ()).for_each(move |_| { - if full_nodes.iter().all(|&(ref id, ref service, _)| predicate(*id, service)) { + let light_nodes = self.light_nodes.clone(); + let interval = Interval::new_interval(Duration::from_millis(100)) + .map_err(|_| ()) + .for_each(move |_| { + let full_ready = full_nodes.iter().all(|&(ref id, ref service, _)| full_predicate(*id, service)); + if !full_ready { + return Ok(()); + } + + let light_ready = light_nodes.iter().all(|&(ref id, ref service, _)| light_predicate(*id, service)); + if !light_ready { + return Ok(()); + } + Err(()) - } else { - Ok(()) - } - }); - self.runtime.block_on(interval).ok(); + }) + .timeout(MAX_WAIT_TIME); + + match self.runtime.block_on(interval) { + Ok(()) => unreachable!("interval always fails; qed"), + Err(ref err) if err.is_inner() => (), + Err(_) => panic!("Waited for too long"), + } } } @@ -100,6 +125,7 @@ fn node_config ( client_version: "network/test/0.1".to_owned(), node_name: "unknown".to_owned(), enable_mdns: false, + wasm_external_transport: None, }; Configuration { @@ -113,6 +139,7 @@ fn node_config ( database_path: root.join("db").to_str().unwrap().into(), database_cache_size: None, state_cache_size: 16777216, + state_cache_child_ratio: None, pruning: Default::default(), keys: keys, chain_spec: (*spec).clone(), @@ -121,12 +148,14 @@ fn node_config ( execution_strategies: Default::default(), rpc_http: None, rpc_ws: None, + rpc_ws_max_connections: None, rpc_cors: None, telemetry_endpoints: None, default_heap_pages: None, offchain_worker: false, force_authoring: false, disable_grandpa: false, + password: "".to_string(), } } @@ -139,7 +168,7 @@ impl TestNet { runtime, authority_nodes: Default::default(), full_nodes: Default::default(), - _light_nodes: Default::default(), + light_nodes: Default::default(), chain_spec: spec.clone(), base_port, nodes: 0, @@ -173,28 +202,46 @@ impl TestNet { })); nodes += full as usize; - self._light_nodes.extend((nodes..nodes + light as usize).map(|index| (index as u32, - Arc::new(F::new_light(node_config::(index as u32, &spec, Roles::LIGHT, None, base_port, &temp), executor.clone()) - .expect("Error creating test node service"))) - )); + self.light_nodes.extend((nodes..nodes + light as usize).map(|index| { + let node_config = node_config::(index as u32, &spec, Roles::LIGHT, None, base_port, &temp); + let addr = node_config.network.listen_addresses.iter().next().unwrap().clone(); + let service = Arc::new(F::new_light(node_config, executor.clone()) + .expect("Error creating test node service")); + let addr = addr.with(multiaddr::Protocol::P2p(service.network().local_peer_id().into())); + (index as u32, service, addr) + })); nodes += light as usize; + self.nodes = nodes; } } pub fn connectivity(spec: FactoryChainSpec) { - const NUM_NODES: u32 = 10; + const NUM_FULL_NODES: u32 = 5; + const NUM_LIGHT_NODES: u32 = 5; { let temp = TempDir::new("substrate-connectivity-test").expect("Error creating test dir"); let runtime = { - let mut network = TestNet::::new(&temp, spec.clone(), NUM_NODES, 0, vec![], 30400); + let mut network = TestNet::::new( + &temp, + spec.clone(), + NUM_FULL_NODES, + NUM_LIGHT_NODES, + vec![], + 30400, + ); info!("Checking star topology"); let first_address = network.full_nodes[0].2.clone(); for (_, service, _) in network.full_nodes.iter().skip(1) { service.network().add_reserved_peer(first_address.to_string()).expect("Error adding reserved peer"); } - network.run_until_all_full(|_index, service| - service.network().peers().len() == NUM_NODES as usize - 1 + for (_, service, _) in network.light_nodes.iter() { + service.network().add_reserved_peer(first_address.to_string()).expect("Error adding reserved peer"); + } + network.run_until_all_full( + |_index, service| service.network().peers_debug_info().len() == NUM_FULL_NODES as usize - 1 + + NUM_LIGHT_NODES as usize, + |_index, service| service.network().peers_debug_info().len() == NUM_FULL_NODES as usize, ); network.runtime }; @@ -206,31 +253,62 @@ pub fn connectivity(spec: FactoryChainSpec) { { let temp = TempDir::new("substrate-connectivity-test").expect("Error creating test dir"); { - let mut network = TestNet::::new(&temp, spec, NUM_NODES, 0, vec![], 30400); + let mut network = TestNet::::new( + &temp, + spec, + NUM_FULL_NODES, + NUM_LIGHT_NODES, + vec![], + 30400, + ); info!("Checking linked topology"); let mut address = network.full_nodes[0].2.clone(); - for (_, service, node_id) in network.full_nodes.iter().skip(1) { - service.network().add_reserved_peer(address.to_string()).expect("Error adding reserved peer"); - address = node_id.clone(); + let max_nodes = ::std::cmp::max(NUM_FULL_NODES, NUM_LIGHT_NODES); + for i in 0..max_nodes { + if i != 0 { + if let Some((_, service, node_id)) = network.full_nodes.get(i as usize) { + service.network().add_reserved_peer(address.to_string()).expect("Error adding reserved peer"); + address = node_id.clone(); + } + } + + if let Some((_, service, node_id)) = network.light_nodes.get(i as usize) { + service.network().add_reserved_peer(address.to_string()).expect("Error adding reserved peer"); + address = node_id.clone(); + } } - network.run_until_all_full(|_index, service| { - service.network().peers().len() == NUM_NODES as usize - 1 - }); + network.run_until_all_full( + |_index, service| service.network().peers_debug_info().len() == NUM_FULL_NODES as usize - 1 + + NUM_LIGHT_NODES as usize, + |_index, service| service.network().peers_debug_info().len() == NUM_FULL_NODES as usize, + ); } temp.close().expect("Error removing temp dir"); } } -pub fn sync(spec: FactoryChainSpec, block_factory: B, extrinsic_factory: E) +pub fn sync( + spec: FactoryChainSpec, + mut block_factory: B, + mut extrinsic_factory: E, +) where F: ServiceFactory, - B: Fn(&F::FullService) -> ImportBlock, - E: Fn(&F::FullService) -> FactoryExtrinsic, + B: FnMut(&F::FullService) -> ImportBlock, + E: FnMut(&F::FullService) -> FactoryExtrinsic, { - const NUM_NODES: u32 = 10; - const NUM_BLOCKS: usize = 512; + const NUM_FULL_NODES: u32 = 10; + const NUM_LIGHT_NODES: u32 = 10; + const NUM_BLOCKS: u32 = 512; let temp = TempDir::new("substrate-sync-test").expect("Error creating test dir"); - let mut network = TestNet::::new(&temp, spec.clone(), NUM_NODES, 0, vec![], 30500); + let mut network = TestNet::::new( + &temp, + spec.clone(), + NUM_FULL_NODES, + NUM_LIGHT_NODES, + vec![], + 30500, + ); info!("Checking block sync"); let first_address = { let first_service = &network.full_nodes[0].1; @@ -247,15 +325,22 @@ where for (_, service, _) in network.full_nodes.iter().skip(1) { service.network().add_reserved_peer(first_address.to_string()).expect("Error adding reserved peer"); } - network.run_until_all_full(|_index, service| - service.client().info().unwrap().chain.best_number == As::sa(NUM_BLOCKS as u64) + for (_, service, _) in network.light_nodes.iter() { + service.network().add_reserved_peer(first_address.to_string()).expect("Error adding reserved peer"); + } + network.run_until_all_full( + |_index, service| + service.client().info().chain.best_number == NUM_BLOCKS.into(), + |_index, service| + service.client().info().chain.best_number == NUM_BLOCKS.into(), ); info!("Checking extrinsic propagation"); let first_service = network.full_nodes[0].1.clone(); - let best_block = BlockId::number(first_service.client().info().unwrap().chain.best_number); + let best_block = BlockId::number(first_service.client().info().chain.best_number); first_service.transaction_pool().submit_one(&best_block, extrinsic_factory(&first_service)).unwrap(); - network.run_until_all_full(|_index, service| - service.transaction_pool().ready().count() == 1 + network.run_until_all_full( + |_index, service| service.transaction_pool().ready().count() == 1, + |_index, _service| true, ); } @@ -263,27 +348,47 @@ pub fn consensus(spec: FactoryChainSpec, authorities: Vec) where F: ServiceFactory, { - const NUM_NODES: u32 = 20; - const NUM_BLOCKS: u64 = 200; + const NUM_FULL_NODES: u32 = 10; + const NUM_LIGHT_NODES: u32 = 0; + const NUM_BLOCKS: u32 = 10; // 10 * 2 sec block production time = ~20 seconds let temp = TempDir::new("substrate-conensus-test").expect("Error creating test dir"); - let mut network = TestNet::::new(&temp, spec.clone(), NUM_NODES / 2, 0, authorities, 30600); + let mut network = TestNet::::new( + &temp, + spec.clone(), + NUM_FULL_NODES / 2, + NUM_LIGHT_NODES / 2, + authorities, + 30600, + ); info!("Checking consensus"); let first_address = network.authority_nodes[0].2.clone(); for (_, service, _) in network.full_nodes.iter() { service.network().add_reserved_peer(first_address.to_string()).expect("Error adding reserved peer"); } + for (_, service, _) in network.light_nodes.iter() { + service.network().add_reserved_peer(first_address.to_string()).expect("Error adding reserved peer"); + } for (_, service, _) in network.authority_nodes.iter().skip(1) { service.network().add_reserved_peer(first_address.to_string()).expect("Error adding reserved peer"); } - network.run_until_all_full(|_index, service| { - service.client().info().unwrap().chain.finalized_number >= As::sa(NUM_BLOCKS / 2) - }); + network.run_until_all_full( + |_index, service| + service.client().info().chain.finalized_number >= (NUM_BLOCKS / 2).into(), + |_index, service| + service.client().info().chain.best_number >= (NUM_BLOCKS / 2).into(), + ); info!("Adding more peers"); - network.insert_nodes(&temp, NUM_NODES / 2, 0, vec![]); + network.insert_nodes(&temp, NUM_FULL_NODES / 2, NUM_LIGHT_NODES / 2, vec![]); for (_, service, _) in network.full_nodes.iter() { service.network().add_reserved_peer(first_address.to_string()).expect("Error adding reserved peer"); } - network.run_until_all_full(|_index, service| - service.client().info().unwrap().chain.finalized_number >= As::sa(NUM_BLOCKS) + for (_, service, _) in network.light_nodes.iter() { + service.network().add_reserved_peer(first_address.to_string()).expect("Error adding reserved peer"); + } + network.run_until_all_full( + |_index, service| + service.client().info().chain.finalized_number >= NUM_BLOCKS.into(), + |_index, service| + service.client().info().chain.best_number >= NUM_BLOCKS.into(), ); } diff --git a/core/sr-api-macros/Cargo.toml b/core/sr-api-macros/Cargo.toml index 5aace4b62a61f48b791b581b46371251a09b5885..9f2145d958eee31d72bc3817ff1f2c14991ae4bb 100644 --- a/core/sr-api-macros/Cargo.toml +++ b/core/sr-api-macros/Cargo.toml @@ -16,7 +16,7 @@ proc-macro-crate = "0.1.3" [dev-dependencies] client = { package = "substrate-client", path = "../client" } -test_client = { package = "substrate-test-client", path = "../test-client" } +test-client = { package = "substrate-test-runtime-client", path = "../test-runtime/client" } state_machine = { package = "substrate-state-machine", path = "../state-machine" } runtime_primitives = { package = "sr-primitives", path = "../sr-primitives" } sr-version = { path = "../sr-version" } @@ -24,6 +24,7 @@ substrate-primitives = { path = "../primitives" } criterion = "0.2" consensus_common = { package = "substrate-consensus-common", path = "../consensus/common" } codec = { package = "parity-codec", version = "3.5.1" } +trybuild = "1.0" [[bench]] name = "bench" diff --git a/core/sr-api-macros/benches/bench.rs b/core/sr-api-macros/benches/bench.rs index f4677217897924ef532adca0f2bac520f569c2ee..054f73c3d4fbf841c6b6e70729e57b6407050979 100644 --- a/core/sr-api-macros/benches/bench.rs +++ b/core/sr-api-macros/benches/bench.rs @@ -15,7 +15,10 @@ // along with Substrate. If not, see . use criterion::{Criterion, criterion_group, criterion_main}; -use test_client::runtime::TestAPI; +use test_client::{ + DefaultTestClientBuilderExt, TestClientBuilder, + TestClientBuilderExt, runtime::TestAPI, +}; use runtime_primitives::{generic::BlockId, traits::ProvideRuntimeApi}; use state_machine::ExecutionStrategy; @@ -23,14 +26,14 @@ fn sr_api_benchmark(c: &mut Criterion) { c.bench_function("add one with same runtime api", |b| { let client = test_client::new(); let runtime_api = client.runtime_api(); - let block_id = BlockId::Number(client.info().unwrap().chain.best_number); + let block_id = BlockId::Number(client.info().chain.best_number); b.iter(|| runtime_api.benchmark_add_one(&block_id, &1)) }); c.bench_function("add one with recreating runtime api", |b| { let client = test_client::new(); - let block_id = BlockId::Number(client.info().unwrap().chain.best_number); + let block_id = BlockId::Number(client.info().chain.best_number); b.iter(|| client.runtime_api().benchmark_add_one(&block_id, &1)) }); @@ -38,7 +41,7 @@ fn sr_api_benchmark(c: &mut Criterion) { c.bench_function("vector add one with same runtime api", |b| { let client = test_client::new(); let runtime_api = client.runtime_api(); - let block_id = BlockId::Number(client.info().unwrap().chain.best_number); + let block_id = BlockId::Number(client.info().chain.best_number); let data = vec![0; 1000]; b.iter_with_large_drop(|| runtime_api.benchmark_vector_add_one(&block_id, &data)) @@ -46,21 +49,21 @@ fn sr_api_benchmark(c: &mut Criterion) { c.bench_function("vector add one with recreating runtime api", |b| { let client = test_client::new(); - let block_id = BlockId::Number(client.info().unwrap().chain.best_number); + let block_id = BlockId::Number(client.info().chain.best_number); let data = vec![0; 1000]; b.iter_with_large_drop(|| client.runtime_api().benchmark_vector_add_one(&block_id, &data)) }); c.bench_function("calling function by function pointer in wasm", |b| { - let client = test_client::new_with_execution_strategy(ExecutionStrategy::AlwaysWasm); - let block_id = BlockId::Number(client.info().unwrap().chain.best_number); + let client = TestClientBuilder::new().set_execution_strategy(ExecutionStrategy::AlwaysWasm).build(); + let block_id = BlockId::Number(client.info().chain.best_number); b.iter(|| client.runtime_api().benchmark_indirect_call(&block_id).unwrap()) }); c.bench_function("calling function in wasm", |b| { - let client = test_client::new_with_execution_strategy(ExecutionStrategy::AlwaysWasm); - let block_id = BlockId::Number(client.info().unwrap().chain.best_number); + let client = TestClientBuilder::new().set_execution_strategy(ExecutionStrategy::AlwaysWasm).build(); + let block_id = BlockId::Number(client.info().chain.best_number); b.iter(|| client.runtime_api().benchmark_direct_call(&block_id).unwrap()) }); } diff --git a/core/sr-api-macros/src/compile_fail_tests.rs b/core/sr-api-macros/src/compile_fail_tests.rs deleted file mode 100644 index e562f8b2fe598a7e7a994b3c46748ec0952a0ad6..0000000000000000000000000000000000000000 --- a/core/sr-api-macros/src/compile_fail_tests.rs +++ /dev/null @@ -1,412 +0,0 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. -// This file is part of Substrate. - -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - -//! Compile fail tests. - -mod declaring_own_block { - /*! - ```compile_fail - #[macro_use] - extern crate client; - extern crate sr_primitives as runtime_primitives; - - use runtime_primitives::traits::Block as BlockT; - - decl_runtime_apis! { - pub trait Api { - fn test(); - } - } - - fn main() {} - ``` - */ -} - -mod declaring_own_block_with_different_name { - /*! - ```compile_fail - #[macro_use] - extern crate client; - extern crate sr_primitives as runtime_primitives; - - use runtime_primitives::traits::Block as BlockT; - - decl_runtime_apis! { - pub trait Api { - fn test(); - } - } - - fn main() {} - ``` - */ -} - -mod adding_self_parameter { - /*! - ```compile_fail - #[macro_use] - extern crate client; - extern crate sr_primitives as runtime_primitives; - - decl_runtime_apis! { - pub trait Api { - fn test(&self); - } - } - - fn main() {} - ``` - */ -} - -mod adding_at_parameter { - /*! - ```compile_fail - #[macro_use] - extern crate client; - extern crate sr_primitives as runtime_primitives; - - decl_runtime_apis! { - pub trait Api { - fn test(at: u64); - } - } - - fn main() {} - ``` - */ -} - -mod invalid_api_version { - /*! - ```compile_fail - #[macro_use] - extern crate client; - extern crate sr_primitives as runtime_primitives; - - decl_runtime_apis! { - #[api_version] - pub trait Api { - fn test(data: u64); - } - } - - fn main() {} - ``` - */ -} - -mod invalid_api_version_2 { - /*! - ```compile_fail - #[macro_use] - extern crate client; - extern crate sr_primitives as runtime_primitives; - - decl_runtime_apis! { - #[api_version("1")] - pub trait Api { - fn test(data: u64); - } - } - - fn main() {} - ``` - */ -} - -mod invalid_api_version_3 { - /*! - ```compile_fail - #[macro_use] - extern crate client; - extern crate sr_primitives as runtime_primitives; - - decl_runtime_apis! { - #[api_version()] - pub trait Api { - fn test(data: u64); - } - } - - fn main() {} - ``` - */ -} - -mod missing_block_generic_parameter { - /*! - ```compile_fail - #[macro_use] - extern crate client; - extern crate substrate_test_client as test_client; - extern crate sr_primitives as runtime_primitives; - extern crate substrate_primitives as primitives; - - use runtime_primitives::traits::GetNodeBlockType; - use test_client::runtime::Block; - - /// The declaration of the `Runtime` type and the implementation of the `GetNodeBlockType` - /// trait are done by the `construct_runtime!` macro in a real runtime. - struct Runtime {} - impl GetNodeBlockType for Runtime { - type NodeBlock = Block; - } - - decl_runtime_apis! { - pub trait Api { - fn test(data: u64); - } - } - - impl_runtime_apis! { - impl self::Api for Runtime { - fn test(data: u64) { - unimplemented!() - } - } - } - - fn main() {} - ``` - */ -} - -mod missing_path_for_trait { - /*! - ```compile_fail - #[macro_use] - extern crate client; - extern crate substrate_test_client as test_client; - extern crate sr_primitives as runtime_primitives; - extern crate substrate_primitives as primitives; - - use runtime_primitives::traits::GetNodeBlockType; - use test_client::runtime::Block; - - /// The declaration of the `Runtime` type and the implementation of the `GetNodeBlockType` - /// trait are done by the `construct_runtime!` macro in a real runtime. - struct Runtime {} - impl GetNodeBlockType for Runtime { - type NodeBlock = Block; - } - - decl_runtime_apis! { - pub trait Api { - fn test(data: u64); - } - } - - impl_runtime_apis! { - impl Api for Runtime { - fn test(data: u64) { - unimplemented!() - } - } - } - - fn main() {} - ``` - */ -} - -mod empty_impl_runtime_apis_call { - /*! - ```compile_fail - #[macro_use] - extern crate client; - extern crate substrate_test_client as test_client; - extern crate sr_primitives as runtime_primitives; - extern crate substrate_primitives as primitives; - - use runtime_primitives::traits::GetNodeBlockType; - use test_client::runtime::Block; - - /// The declaration of the `Runtime` type and the implementation of the `GetNodeBlockType` - /// trait are done by the `construct_runtime!` macro in a real runtime. - struct Runtime {} - impl GetNodeBlockType for Runtime { - type NodeBlock = Block; - } - - decl_runtime_apis! { - pub trait Api { - fn test(data: u64); - } - } - - impl_runtime_apis! {} - - fn main() {} - ``` - */ -} - -mod type_reference_in_impl_runtime_apis_call { - /*! - ```compile_fail - #[macro_use] - extern crate client; - extern crate substrate_test_client as test_client; - extern crate sr_primitives as runtime_primitives; - extern crate substrate_primitives as primitives; - - use runtime_primitives::traits::GetNodeBlockType; - use test_client::runtime::Block; - - /// The declaration of the `Runtime` type and the implementation of the `GetNodeBlockType` - /// trait are done by the `construct_runtime!` macro in a real runtime. - struct Runtime {} - impl GetNodeBlockType for Runtime { - type NodeBlock = Block; - } - - decl_runtime_apis! { - pub trait Api { - fn test(data: u64); - } - } - - impl_runtime_apis! { - impl self::Api for Runtime { - fn test(data: &u64) { - unimplemented!() - } - } - } - - fn main() {} - ``` - */ -} - -mod impl_incorrect_method_signature { - /*! - ```compile_fail - #[macro_use] - extern crate client; - extern crate substrate_test_client as test_client; - extern crate sr_primitives as runtime_primitives; - extern crate substrate_primitives as primitives; - - use runtime_primitives::traits::GetNodeBlockType; - use test_client::runtime::Block; - - /// The declaration of the `Runtime` type and the implementation of the `GetNodeBlockType` - /// trait are done by the `construct_runtime!` macro in a real runtime. - struct Runtime {} - impl GetNodeBlockType for Runtime { - type NodeBlock = Block; - } - - decl_runtime_apis! { - pub trait Api { - fn test(data: u64); - } - } - - impl_runtime_apis! { - impl self::Api for Runtime { - fn test(data: String) {} - } - } - - fn main() {} - ``` - */ -} - -mod impl_two_traits_with_same_name { - /*! - ```compile_fail - #[macro_use] - extern crate client; - extern crate substrate_test_client as test_client; - extern crate sr_primitives as runtime_primitives; - extern crate substrate_primitives as primitives; - - use runtime_primitives::traits::GetNodeBlockType; - use test_client::runtime::Block; - - /// The declaration of the `Runtime` type and the implementation of the `GetNodeBlockType` - /// trait are done by the `construct_runtime!` macro in a real runtime. - struct Runtime {} - impl GetNodeBlockType for Runtime { - type NodeBlock = Block; - } - - decl_runtime_apis! { - pub trait Api { - fn test(data: u64); - } - } - - mod second { - decl_runtime_apis! { - pub trait Api { - fn test2(data: u64); - } - } - } - - impl_runtime_apis! { - impl self::Api for Runtime { - fn test(data: u64) {} - } - - impl second::Api for Runtime { - fn test2(data: u64) {} - } - } - - fn main() {} - ``` - */ -} - -mod changed_at_unknown_version { - /*! - ```compile_fail - #[macro_use] - extern crate client; - extern crate substrate_test_client as test_client; - extern crate sr_primitives as runtime_primitives; - extern crate substrate_primitives as primitives; - - use runtime_primitives::traits::GetNodeBlockType; - use test_client::runtime::Block; - - /// The declaration of the `Runtime` type and the implementation of the `GetNodeBlockType` - /// trait are done by the `construct_runtime!` macro in a real runtime. - struct Runtime {} - impl GetNodeBlockType for Runtime { - type NodeBlock = Block; - } - - decl_runtime_apis! { - pub trait Api { - #[changed_in(2)] - fn test(data: u64); - fn test(data: u64); - } - } - - fn main() {} - ``` - */ -} diff --git a/core/sr-api-macros/src/lib.rs b/core/sr-api-macros/src/lib.rs index 72e143eb1a0088a2e16dcae9ae955b6c4a3faf43..1a315f44ddd5d37e40f82e66da2fd5a121543d4a 100644 --- a/core/sr-api-macros/src/lib.rs +++ b/core/sr-api-macros/src/lib.rs @@ -24,7 +24,6 @@ use proc_macro::TokenStream; mod impl_runtime_apis; mod decl_runtime_apis; mod utils; -mod compile_fail_tests; /// Tags given trait implementations as runtime apis. /// @@ -55,11 +54,11 @@ mod compile_fail_tests; /// # extern crate substrate_primitives; /// # /// # use runtime_primitives::traits::GetNodeBlockType; -/// # use test_client::runtime::Block; +/// # use test_client::runtime::{Block, Header}; /// # /// # /// The declaration of the `Runtime` type and the implementation of the `GetNodeBlockType` /// # /// trait are done by the `construct_runtime!` macro in a real runtime. -/// # struct Runtime {} +/// # pub struct Runtime {} /// # impl GetNodeBlockType for Runtime { /// # type NodeBlock = Block; /// # } @@ -79,6 +78,14 @@ mod compile_fail_tests; /// /// /// All runtime api implementations need to be done in one call of the macro! /// impl_runtime_apis! { +/// # impl client::runtime_api::Core for Runtime { +/// # fn version() -> client::runtime_api::RuntimeVersion { +/// # unimplemented!() +/// # } +/// # fn execute_block(_block: Block) {} +/// # fn initialize_block(_header: &Header) {} +/// # } +/// /// impl self::Balance for Runtime { /// fn get_balance() -> u64 { /// 1 @@ -177,7 +184,7 @@ pub fn impl_runtime_apis(input: TokenStream) -> TokenStream { /// /// /// /// Is callable by `set_balance_before_version_2`. /// #[changed_in(2)] -/// fn set_balance(val: u8); +/// fn set_balance(val: u16); /// /// In version 2, we added this new function. /// fn increase_balance(val: u64); /// } diff --git a/core/sr-api-macros/tests/decl_and_impl.rs b/core/sr-api-macros/tests/decl_and_impl.rs index 51f95d51b16dd6be173af59806c459f2c6ecc2ce..ba7ef23b99c983c16e9850da0c8317887aa2e181 100644 --- a/core/sr-api-macros/tests/decl_and_impl.rs +++ b/core/sr-api-macros/tests/decl_and_impl.rs @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use runtime_primitives::traits::{GetNodeBlockType, Block as BlockT, AuthorityIdFor}; +use runtime_primitives::traits::{GetNodeBlockType, Block as BlockT}; use runtime_primitives::generic::BlockId; use client::runtime_api::{self, RuntimeApiInfo}; use client::{error::Result, decl_runtime_apis, impl_runtime_apis}; @@ -74,9 +74,6 @@ impl_runtime_apis! { fn initialize_block(_: &::Header) { unimplemented!() } - fn authorities() -> Vec> { - unimplemented!() - } } } @@ -122,7 +119,7 @@ fn check_runtime_api_versions_contains() { #[test] fn check_runtime_api_versions() { - check_runtime_api_versions_contains::>(); - check_runtime_api_versions_contains::>(); - check_runtime_api_versions_contains::>(); + check_runtime_api_versions_contains::>(); + check_runtime_api_versions_contains::>(); + check_runtime_api_versions_contains::>(); } diff --git a/core/sr-api-macros/tests/runtime_calls.rs b/core/sr-api-macros/tests/runtime_calls.rs index fb3cad3238e6ff7247f4c94d64b631bfa6ffb94c..6fa155437b83371ce29abe52b2f97c1ffd7631a8 100644 --- a/core/sr-api-macros/tests/runtime_calls.rs +++ b/core/sr-api-macros/tests/runtime_calls.rs @@ -15,8 +15,8 @@ // along with Substrate. If not, see . use test_client::{ - AccountKeyring, runtime::{TestAPI, DecodeFails, Transfer, Header}, - NativeExecutor, LocalExecutor, + prelude::*, + runtime::{TestAPI, DecodeFails, Transfer, Header}, }; use runtime_primitives::{ generic::BlockId, @@ -27,14 +27,13 @@ use state_machine::{ execution_proof_check_on_trie_backend, }; -use client::LongestChain; use consensus_common::SelectChain; use codec::Encode; fn calling_function_with_strat(strat: ExecutionStrategy) { - let client = test_client::new_with_execution_strategy(strat); + let client = TestClientBuilder::new().set_execution_strategy(strat).build(); let runtime_api = client.runtime_api(); - let block_id = BlockId::Number(client.info().unwrap().chain.best_number); + let block_id = BlockId::Number(client.info().chain.best_number); assert_eq!(runtime_api.benchmark_add_one(&block_id, &1).unwrap(), 2); } @@ -52,35 +51,35 @@ fn calling_wasm_runtime_function() { #[test] #[should_panic(expected = "Could not convert parameter `param` between node and runtime!")] fn calling_native_runtime_function_with_non_decodable_parameter() { - let client = test_client::new_with_execution_strategy(ExecutionStrategy::NativeWhenPossible); + let client = TestClientBuilder::new().set_execution_strategy(ExecutionStrategy::NativeWhenPossible).build(); let runtime_api = client.runtime_api(); - let block_id = BlockId::Number(client.info().unwrap().chain.best_number); + let block_id = BlockId::Number(client.info().chain.best_number); runtime_api.fail_convert_parameter(&block_id, DecodeFails::new()).unwrap(); } #[test] #[should_panic(expected = "Could not convert return value from runtime to node!")] fn calling_native_runtime_function_with_non_decodable_return_value() { - let client = test_client::new_with_execution_strategy(ExecutionStrategy::NativeWhenPossible); + let client = TestClientBuilder::new().set_execution_strategy(ExecutionStrategy::NativeWhenPossible).build(); let runtime_api = client.runtime_api(); - let block_id = BlockId::Number(client.info().unwrap().chain.best_number); + let block_id = BlockId::Number(client.info().chain.best_number); runtime_api.fail_convert_return_value(&block_id).unwrap(); } #[test] fn calling_native_runtime_signature_changed_function() { - let client = test_client::new_with_execution_strategy(ExecutionStrategy::NativeWhenPossible); + let client = TestClientBuilder::new().set_execution_strategy(ExecutionStrategy::NativeWhenPossible).build(); let runtime_api = client.runtime_api(); - let block_id = BlockId::Number(client.info().unwrap().chain.best_number); + let block_id = BlockId::Number(client.info().chain.best_number); assert_eq!(runtime_api.function_signature_changed(&block_id).unwrap(), 1); } #[test] fn calling_wasm_runtime_signature_changed_old_function() { - let client = test_client::new_with_execution_strategy(ExecutionStrategy::AlwaysWasm); + let client = TestClientBuilder::new().set_execution_strategy(ExecutionStrategy::AlwaysWasm).build(); let runtime_api = client.runtime_api(); - let block_id = BlockId::Number(client.info().unwrap().chain.best_number); + let block_id = BlockId::Number(client.info().chain.best_number); #[allow(deprecated)] let res = runtime_api.function_signature_changed_before_version_2(&block_id).unwrap(); @@ -89,77 +88,78 @@ fn calling_wasm_runtime_signature_changed_old_function() { #[test] fn calling_with_both_strategy_and_fail_on_wasm_should_return_error() { - let client = test_client::new_with_execution_strategy(ExecutionStrategy::Both); + let client = TestClientBuilder::new().set_execution_strategy(ExecutionStrategy::Both).build(); let runtime_api = client.runtime_api(); - let block_id = BlockId::Number(client.info().unwrap().chain.best_number); + let block_id = BlockId::Number(client.info().chain.best_number); assert!(runtime_api.fail_on_wasm(&block_id).is_err()); } #[test] fn calling_with_both_strategy_and_fail_on_native_should_work() { - let client = test_client::new_with_execution_strategy(ExecutionStrategy::Both); + let client = TestClientBuilder::new().set_execution_strategy(ExecutionStrategy::Both).build(); let runtime_api = client.runtime_api(); - let block_id = BlockId::Number(client.info().unwrap().chain.best_number); + let block_id = BlockId::Number(client.info().chain.best_number); assert_eq!(runtime_api.fail_on_native(&block_id).unwrap(), 1); } #[test] fn calling_with_native_else_wasm_and_faild_on_wasm_should_work() { - let client = test_client::new_with_execution_strategy(ExecutionStrategy::NativeElseWasm); + let client = TestClientBuilder::new().set_execution_strategy(ExecutionStrategy::NativeElseWasm).build(); let runtime_api = client.runtime_api(); - let block_id = BlockId::Number(client.info().unwrap().chain.best_number); + let block_id = BlockId::Number(client.info().chain.best_number); assert_eq!(runtime_api.fail_on_wasm(&block_id).unwrap(), 1); } #[test] fn calling_with_native_else_wasm_and_fail_on_native_should_work() { - let client = test_client::new_with_execution_strategy(ExecutionStrategy::NativeElseWasm); + let client = TestClientBuilder::new().set_execution_strategy(ExecutionStrategy::NativeElseWasm).build(); let runtime_api = client.runtime_api(); - let block_id = BlockId::Number(client.info().unwrap().chain.best_number); + let block_id = BlockId::Number(client.info().chain.best_number); assert_eq!(runtime_api.fail_on_native(&block_id).unwrap(), 1); } #[test] fn use_trie_function() { - let client = test_client::new_with_execution_strategy(ExecutionStrategy::AlwaysWasm); + let client = TestClientBuilder::new().set_execution_strategy(ExecutionStrategy::AlwaysWasm).build(); let runtime_api = client.runtime_api(); - let block_id = BlockId::Number(client.info().unwrap().chain.best_number); + let block_id = BlockId::Number(client.info().chain.best_number); assert_eq!(runtime_api.use_trie(&block_id).unwrap(), 2); } #[test] fn initialize_block_works() { - let client = test_client::new_with_execution_strategy(ExecutionStrategy::Both); + let client = TestClientBuilder::new().set_execution_strategy(ExecutionStrategy::Both).build(); let runtime_api = client.runtime_api(); - let block_id = BlockId::Number(client.info().unwrap().chain.best_number); + let block_id = BlockId::Number(client.info().chain.best_number); assert_eq!(runtime_api.get_block_number(&block_id).unwrap(), 1); } #[test] fn initialize_block_is_called_only_once() { - let client = test_client::new_with_execution_strategy(ExecutionStrategy::Both); + let client = TestClientBuilder::new().set_execution_strategy(ExecutionStrategy::Both).build(); let runtime_api = client.runtime_api(); - let block_id = BlockId::Number(client.info().unwrap().chain.best_number); + let block_id = BlockId::Number(client.info().chain.best_number); assert_eq!(runtime_api.take_block_number(&block_id).unwrap(), Some(1)); assert_eq!(runtime_api.take_block_number(&block_id).unwrap(), None); } #[test] fn initialize_block_is_skipped() { - let client = test_client::new_with_execution_strategy(ExecutionStrategy::Both); + let client = TestClientBuilder::new().set_execution_strategy(ExecutionStrategy::Both).build(); let runtime_api = client.runtime_api(); - let block_id = BlockId::Number(client.info().unwrap().chain.best_number); + let block_id = BlockId::Number(client.info().chain.best_number); assert!(runtime_api.without_initialize_block(&block_id).unwrap()); } #[test] fn record_proof_works() { - let client = test_client::new_with_execution_strategy(ExecutionStrategy::Both); + let (client, longest_chain) = TestClientBuilder::new() + .set_execution_strategy(ExecutionStrategy::Both) + .build_with_longest_chain(); - let block_id = BlockId::Number(client.info().unwrap().chain.best_number); - let storage_root = LongestChain::new(client.backend().clone(), client.import_lock()) - .best_chain().unwrap().state_root().clone(); + let block_id = BlockId::Number(client.info().chain.best_number); + let storage_root = longest_chain.best_chain().unwrap().state_root().clone(); let transaction = Transfer { amount: 1000, @@ -170,7 +170,7 @@ fn record_proof_works() { // Build the block and record proof let mut builder = client - .new_block_at_with_proof_recording(&block_id) + .new_block_at_with_proof_recording(&block_id, Default::default()) .expect("Creates block builder"); builder.push(transaction.clone()).unwrap(); let (block, proof) = builder.bake_and_extract_proof().expect("Bake block"); @@ -190,4 +190,4 @@ fn record_proof_works() { "Core_execute_block", &block.encode(), ).expect("Executes block while using the proof backend"); -} \ No newline at end of file +} diff --git a/core/sr-api-macros/tests/trybuild.rs b/core/sr-api-macros/tests/trybuild.rs new file mode 100644 index 0000000000000000000000000000000000000000..e04c67737a486835e7818aa98bfaea46d6b975c6 --- /dev/null +++ b/core/sr-api-macros/tests/trybuild.rs @@ -0,0 +1,5 @@ +#[test] +fn ui() { + let t = trybuild::TestCases::new(); + t.compile_fail("tests/ui/*.rs"); +} diff --git a/core/sr-api-macros/tests/ui/adding_at_parameter.rs b/core/sr-api-macros/tests/ui/adding_at_parameter.rs new file mode 100644 index 0000000000000000000000000000000000000000..d4757e256f024514613090300169440258d70ee3 --- /dev/null +++ b/core/sr-api-macros/tests/ui/adding_at_parameter.rs @@ -0,0 +1,9 @@ +use client::decl_runtime_apis; + +decl_runtime_apis! { + pub trait Api { + fn test(at: u64); + } +} + +fn main() {} diff --git a/core/sr-api-macros/tests/ui/adding_at_parameter.stderr b/core/sr-api-macros/tests/ui/adding_at_parameter.stderr new file mode 100644 index 0000000000000000000000000000000000000000..1c7e07a418c0a250b57e5a758b8ec4678d415f34 --- /dev/null +++ b/core/sr-api-macros/tests/ui/adding_at_parameter.stderr @@ -0,0 +1,5 @@ +error: `decl_runtime_apis!` adds automatically a parameter `at: &BlockId`. Please rename/remove your parameter. + --> $DIR/adding_at_parameter.rs:5:11 + | +5 | fn test(at: u64); + | ^^ diff --git a/core/sr-api-macros/tests/ui/adding_self_parameter.rs b/core/sr-api-macros/tests/ui/adding_self_parameter.rs new file mode 100644 index 0000000000000000000000000000000000000000..fb048211adac3792390926c6c2be2ecb9947e297 --- /dev/null +++ b/core/sr-api-macros/tests/ui/adding_self_parameter.rs @@ -0,0 +1,9 @@ +use client::decl_runtime_apis; + +decl_runtime_apis! { + pub trait Api { + fn test(&self); + } +} + +fn main() {} diff --git a/core/sr-api-macros/tests/ui/adding_self_parameter.stderr b/core/sr-api-macros/tests/ui/adding_self_parameter.stderr new file mode 100644 index 0000000000000000000000000000000000000000..e7249e9f732f55fe84707266da3eac32d3835141 --- /dev/null +++ b/core/sr-api-macros/tests/ui/adding_self_parameter.stderr @@ -0,0 +1,5 @@ +error: Self values are not supported. + --> $DIR/adding_self_parameter.rs:5:11 + | +5 | fn test(&self); + | ^ diff --git a/core/sr-api-macros/tests/ui/changed_in_unknown_version.rs b/core/sr-api-macros/tests/ui/changed_in_unknown_version.rs new file mode 100644 index 0000000000000000000000000000000000000000..27aa60c624e63be142bcc5fbe0cb9ddfcbe1dcc5 --- /dev/null +++ b/core/sr-api-macros/tests/ui/changed_in_unknown_version.rs @@ -0,0 +1,20 @@ +use runtime_primitives::traits::GetNodeBlockType; +use test_client::runtime::Block; +use client::decl_runtime_apis; + +/// The declaration of the `Runtime` type and the implementation of the `GetNodeBlockType` +/// trait are done by the `construct_runtime!` macro in a real runtime. +struct Runtime {} +impl GetNodeBlockType for Runtime { + type NodeBlock = Block; +} + +decl_runtime_apis! { + pub trait Api { + #[changed_in(2)] + fn test(data: u64); + fn test(data: u64); + } +} + +fn main() {} diff --git a/core/sr-api-macros/tests/ui/changed_in_unknown_version.stderr b/core/sr-api-macros/tests/ui/changed_in_unknown_version.stderr new file mode 100644 index 0000000000000000000000000000000000000000..c62befbab362a0b846624283d8f216857e92c991 --- /dev/null +++ b/core/sr-api-macros/tests/ui/changed_in_unknown_version.stderr @@ -0,0 +1,5 @@ +error: `changed_in` version can not be greater than the `api_version` + --> $DIR/changed_in_unknown_version.rs:15:3 + | +15 | fn test(data: u64); + | ^^ diff --git a/core/sr-api-macros/tests/ui/declaring_old_block.rs b/core/sr-api-macros/tests/ui/declaring_old_block.rs new file mode 100644 index 0000000000000000000000000000000000000000..6b7f380ef208a31ff0af5f6f0d7d4e9e485856bd --- /dev/null +++ b/core/sr-api-macros/tests/ui/declaring_old_block.rs @@ -0,0 +1,10 @@ +use runtime_primitives::traits::Block as BlockT; +use client::decl_runtime_apis; + +decl_runtime_apis! { + pub trait Api { + fn test(); + } +} + +fn main() {} diff --git a/core/sr-api-macros/tests/ui/declaring_old_block.stderr b/core/sr-api-macros/tests/ui/declaring_old_block.stderr new file mode 100644 index 0000000000000000000000000000000000000000..2ab1cc675d109e146d766ea7f355e9cc16a54213 --- /dev/null +++ b/core/sr-api-macros/tests/ui/declaring_old_block.stderr @@ -0,0 +1,19 @@ +error: `Block: BlockT` generic parameter will be added automatically by the `decl_runtime_apis!` macro! + --> $DIR/declaring_old_block.rs:5:16 + | +5 | pub trait Api { + | ^^^^^ + +error: `Block: BlockT` generic parameter will be added automatically by the `decl_runtime_apis!` macro! If you try to use a different trait than the substrate `Block` trait, please rename it locally. + --> $DIR/declaring_old_block.rs:5:23 + | +5 | pub trait Api { + | ^^^^^^ + +warning: unused import: `runtime_primitives::traits::Block as BlockT` + --> $DIR/declaring_old_block.rs:1:5 + | +1 | use runtime_primitives::traits::Block as BlockT; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: #[warn(unused_imports)] on by default diff --git a/core/sr-api-macros/tests/ui/declaring_own_block_with_different_name.rs b/core/sr-api-macros/tests/ui/declaring_own_block_with_different_name.rs new file mode 100644 index 0000000000000000000000000000000000000000..1371295cc0ebb89f55ecc70d489502c807336b4b --- /dev/null +++ b/core/sr-api-macros/tests/ui/declaring_own_block_with_different_name.rs @@ -0,0 +1,10 @@ +use runtime_primitives::traits::Block as BlockT; +use client::decl_runtime_apis; + +decl_runtime_apis! { + pub trait Api { + fn test(); + } +} + +fn main() {} diff --git a/core/sr-api-macros/tests/ui/declaring_own_block_with_different_name.stderr b/core/sr-api-macros/tests/ui/declaring_own_block_with_different_name.stderr new file mode 100644 index 0000000000000000000000000000000000000000..cf5fe0f53ff5af3425e9bb7da29767808f2ac9a3 --- /dev/null +++ b/core/sr-api-macros/tests/ui/declaring_own_block_with_different_name.stderr @@ -0,0 +1,13 @@ +error: `Block: BlockT` generic parameter will be added automatically by the `decl_runtime_apis!` macro! If you try to use a different trait than the substrate `Block` trait, please rename it locally. + --> $DIR/declaring_own_block_with_different_name.rs:5:19 + | +5 | pub trait Api { + | ^^^^^^ + +warning: unused import: `runtime_primitives::traits::Block as BlockT` + --> $DIR/declaring_own_block_with_different_name.rs:1:5 + | +1 | use runtime_primitives::traits::Block as BlockT; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: #[warn(unused_imports)] on by default diff --git a/core/sr-api-macros/tests/ui/empty_impl_runtime_apis_call.rs b/core/sr-api-macros/tests/ui/empty_impl_runtime_apis_call.rs new file mode 100644 index 0000000000000000000000000000000000000000..4cf56bf54bdd1d601bf20df6fc2c37a594e334c5 --- /dev/null +++ b/core/sr-api-macros/tests/ui/empty_impl_runtime_apis_call.rs @@ -0,0 +1,20 @@ +use runtime_primitives::traits::GetNodeBlockType; +use test_client::runtime::Block; +use client::{decl_runtime_apis, impl_runtime_apis}; + +/// The declaration of the `Runtime` type and the implementation of the `GetNodeBlockType` +/// trait are done by the `construct_runtime!` macro in a real runtime. +struct Runtime {} +impl GetNodeBlockType for Runtime { + type NodeBlock = Block; +} + +decl_runtime_apis! { + pub trait Api { + fn test(data: u64); + } +} + +impl_runtime_apis! {} + +fn main() {} diff --git a/core/sr-api-macros/tests/ui/empty_impl_runtime_apis_call.stderr b/core/sr-api-macros/tests/ui/empty_impl_runtime_apis_call.stderr new file mode 100644 index 0000000000000000000000000000000000000000..61527a34803613b50089674ef24540d48deb6336 --- /dev/null +++ b/core/sr-api-macros/tests/ui/empty_impl_runtime_apis_call.stderr @@ -0,0 +1,5 @@ +error: No api implementation given! + --> $DIR/empty_impl_runtime_apis_call.rs:18:1 + | +18 | impl_runtime_apis! {} + | ^^^^^^^^^^^^^^^^^^^^^ diff --git a/core/sr-api-macros/tests/ui/impl_incorrect_method_signature.rs b/core/sr-api-macros/tests/ui/impl_incorrect_method_signature.rs new file mode 100644 index 0000000000000000000000000000000000000000..91ffdd798ad0499783ac21320ad6a19227adbd3e --- /dev/null +++ b/core/sr-api-macros/tests/ui/impl_incorrect_method_signature.rs @@ -0,0 +1,24 @@ +use runtime_primitives::traits::GetNodeBlockType; +use test_client::runtime::Block; +use client::{decl_runtime_apis, impl_runtime_apis}; + +/// The declaration of the `Runtime` type and the implementation of the `GetNodeBlockType` +/// trait are done by the `construct_runtime!` macro in a real runtime. +struct Runtime {} +impl GetNodeBlockType for Runtime { + type NodeBlock = Block; +} + +decl_runtime_apis! { + pub trait Api { + fn test(data: u64); + } +} + +impl_runtime_apis! { + impl self::Api for Runtime { + fn test(data: String) {} + } +} + +fn main() {} diff --git a/core/sr-api-macros/tests/ui/impl_incorrect_method_signature.stderr b/core/sr-api-macros/tests/ui/impl_incorrect_method_signature.stderr new file mode 100644 index 0000000000000000000000000000000000000000..6d5d484efe0954ff752b865ec78788b63a2c5f6c --- /dev/null +++ b/core/sr-api-macros/tests/ui/impl_incorrect_method_signature.stderr @@ -0,0 +1,13 @@ +error[E0053]: method `test` has an incompatible type for trait + --> $DIR/impl_incorrect_method_signature.rs:20:17 + | +14 | fn test(data: u64); + | --- type in trait +... +20 | fn test(data: String) {} + | ^^^^^^ expected u64, found struct `std::string::String` + | + = note: expected type `fn(u64)` + found type `fn(std::string::String)` + +For more information about this error, try `rustc --explain E0053`. diff --git a/core/sr-api-macros/tests/ui/impl_two_traits_with_same_name.rs b/core/sr-api-macros/tests/ui/impl_two_traits_with_same_name.rs new file mode 100644 index 0000000000000000000000000000000000000000..0871b0ff3398eeb80c82fccdbc4534a6c3c36f3c --- /dev/null +++ b/core/sr-api-macros/tests/ui/impl_two_traits_with_same_name.rs @@ -0,0 +1,36 @@ +use runtime_primitives::traits::GetNodeBlockType; +use test_client::runtime::Block; +use client::{decl_runtime_apis, impl_runtime_apis}; + +/// The declaration of the `Runtime` type and the implementation of the `GetNodeBlockType` +/// trait are done by the `construct_runtime!` macro in a real runtime. +struct Runtime {} +impl GetNodeBlockType for Runtime { + type NodeBlock = Block; +} + +decl_runtime_apis! { + pub trait Api { + fn test(data: u64); + } +} + +mod second { + decl_runtime_apis! { + pub trait Api { + fn test2(data: u64); + } + } +} + +impl_runtime_apis! { + impl self::Api for Runtime { + fn test(data: u64) {} + } + + impl second::Api for Runtime { + fn test2(data: u64) {} + } +} + +fn main() {} diff --git a/core/sr-api-macros/tests/ui/impl_two_traits_with_same_name.stderr b/core/sr-api-macros/tests/ui/impl_two_traits_with_same_name.stderr new file mode 100644 index 0000000000000000000000000000000000000000..355db2864bb784a7011b5c0b8376a713371f88b2 --- /dev/null +++ b/core/sr-api-macros/tests/ui/impl_two_traits_with_same_name.stderr @@ -0,0 +1,25 @@ +error: Two traits with the same name detected! The trait name is used to generate its ID. Please rename one trait at the declaration! + --> $DIR/impl_two_traits_with_same_name.rs:31:15 + | +31 | impl second::Api for Runtime { + | ^^^ + +error: cannot find macro `decl_runtime_apis!` in this scope + --> $DIR/impl_two_traits_with_same_name.rs:19:2 + | +19 | decl_runtime_apis! { + | ^^^^^^^^^^^^^^^^^ + +error[E0433]: failed to resolve: could not find `runtime_decl_for_Api` in `second` + --> $DIR/impl_two_traits_with_same_name.rs:26:1 + | +26 | / impl_runtime_apis! { +27 | | impl self::Api for Runtime { +28 | | fn test(data: u64) {} +29 | | } +... | +33 | | } +34 | | } + | |_^ could not find `runtime_decl_for_Api` in `second` + +For more information about this error, try `rustc --explain E0433`. diff --git a/core/sr-api-macros/tests/ui/invalid_api_version.rs b/core/sr-api-macros/tests/ui/invalid_api_version.rs new file mode 100644 index 0000000000000000000000000000000000000000..b5afa1d6998efe374fb67cf268aed23f2102a554 --- /dev/null +++ b/core/sr-api-macros/tests/ui/invalid_api_version.rs @@ -0,0 +1,10 @@ +use client::decl_runtime_apis; + +decl_runtime_apis! { + #[api_version] + pub trait Api { + fn test(data: u64); + } +} + +fn main() {} diff --git a/core/sr-api-macros/tests/ui/invalid_api_version.stderr b/core/sr-api-macros/tests/ui/invalid_api_version.stderr new file mode 100644 index 0000000000000000000000000000000000000000..e7d6aa0ed133f64453b675fb552504ceb6895bc1 --- /dev/null +++ b/core/sr-api-macros/tests/ui/invalid_api_version.stderr @@ -0,0 +1,29 @@ +error: can't qualify macro invocation with `pub` + --> $DIR/invalid_api_version.rs:3:1 + | +3 | / decl_runtime_apis! { +4 | | #[api_version] +5 | | pub trait Api { +6 | | fn test(data: u64); +7 | | } +8 | | } + | |_^ + | + = help: try adjusting the macro to put `pub` inside the invocation + +error: Unexpected `api_version` attribute. The supported format is `api_version(1)` + --> $DIR/invalid_api_version.rs:3:1 + | +3 | / decl_runtime_apis! { +4 | | #[api_version] +5 | | pub trait Api { +6 | | fn test(data: u64); +7 | | } +8 | | } + | |_^ + +error: Unexpected `api_version` attribute. The supported format is `api_version(1)` + --> $DIR/invalid_api_version.rs:4:4 + | +4 | #[api_version] + | ^^^^^^^^^^^ diff --git a/core/sr-api-macros/tests/ui/invalid_api_version_2.rs b/core/sr-api-macros/tests/ui/invalid_api_version_2.rs new file mode 100644 index 0000000000000000000000000000000000000000..b8870838009bf2132318ebd7b2a97b547f63b9dc --- /dev/null +++ b/core/sr-api-macros/tests/ui/invalid_api_version_2.rs @@ -0,0 +1,10 @@ +use client::decl_runtime_apis; + +decl_runtime_apis! { + #[api_version("1")] + pub trait Api { + fn test(data: u64); + } +} + +fn main() {} diff --git a/core/sr-api-macros/tests/ui/invalid_api_version_2.stderr b/core/sr-api-macros/tests/ui/invalid_api_version_2.stderr new file mode 100644 index 0000000000000000000000000000000000000000..3e46efb258052c873240a42e92fd23d42627b9bc --- /dev/null +++ b/core/sr-api-macros/tests/ui/invalid_api_version_2.stderr @@ -0,0 +1,29 @@ +error: can't qualify macro invocation with `pub` + --> $DIR/invalid_api_version_2.rs:3:1 + | +3 | / decl_runtime_apis! { +4 | | #[api_version("1")] +5 | | pub trait Api { +6 | | fn test(data: u64); +7 | | } +8 | | } + | |_^ + | + = help: try adjusting the macro to put `pub` inside the invocation + +error: Unexpected `api_version` attribute. The supported format is `api_version(1)` + --> $DIR/invalid_api_version_2.rs:3:1 + | +3 | / decl_runtime_apis! { +4 | | #[api_version("1")] +5 | | pub trait Api { +6 | | fn test(data: u64); +7 | | } +8 | | } + | |_^ + +error: Unexpected `api_version` attribute. The supported format is `api_version(1)` + --> $DIR/invalid_api_version_2.rs:4:4 + | +4 | #[api_version("1")] + | ^^^^^^^^^^^ diff --git a/core/sr-api-macros/tests/ui/invalid_api_version_3.rs b/core/sr-api-macros/tests/ui/invalid_api_version_3.rs new file mode 100644 index 0000000000000000000000000000000000000000..6f365b146b222c906881eb40225f4140efa2c75c --- /dev/null +++ b/core/sr-api-macros/tests/ui/invalid_api_version_3.rs @@ -0,0 +1,10 @@ +use client::decl_runtime_apis; + +decl_runtime_apis! { + #[api_version()] + pub trait Api { + fn test(data: u64); + } +} + +fn main() {} diff --git a/core/sr-api-macros/tests/ui/invalid_api_version_3.stderr b/core/sr-api-macros/tests/ui/invalid_api_version_3.stderr new file mode 100644 index 0000000000000000000000000000000000000000..661221f28e89290f792ea2c227195bc8920132d4 --- /dev/null +++ b/core/sr-api-macros/tests/ui/invalid_api_version_3.stderr @@ -0,0 +1,29 @@ +error: can't qualify macro invocation with `pub` + --> $DIR/invalid_api_version_3.rs:3:1 + | +3 | / decl_runtime_apis! { +4 | | #[api_version()] +5 | | pub trait Api { +6 | | fn test(data: u64); +7 | | } +8 | | } + | |_^ + | + = help: try adjusting the macro to put `pub` inside the invocation + +error: Unexpected `api_version` attribute. The supported format is `api_version(1)` + --> $DIR/invalid_api_version_3.rs:3:1 + | +3 | / decl_runtime_apis! { +4 | | #[api_version()] +5 | | pub trait Api { +6 | | fn test(data: u64); +7 | | } +8 | | } + | |_^ + +error: Unexpected `api_version` attribute. The supported format is `api_version(1)` + --> $DIR/invalid_api_version_3.rs:4:4 + | +4 | #[api_version()] + | ^^^^^^^^^^^ diff --git a/core/sr-api-macros/tests/ui/missing_block_generic_parameter.rs b/core/sr-api-macros/tests/ui/missing_block_generic_parameter.rs new file mode 100644 index 0000000000000000000000000000000000000000..eafe53e23b875e5728a22b4f9fa20c743206aab1 --- /dev/null +++ b/core/sr-api-macros/tests/ui/missing_block_generic_parameter.rs @@ -0,0 +1,26 @@ +use runtime_primitives::traits::GetNodeBlockType; +use test_client::runtime::Block; +use client::{decl_runtime_apis, impl_runtime_apis}; + +/// The declaration of the `Runtime` type and the implementation of the `GetNodeBlockType` +/// trait are done by the `construct_runtime!` macro in a real runtime. +struct Runtime {} +impl GetNodeBlockType for Runtime { + type NodeBlock = Block; +} + +decl_runtime_apis! { + pub trait Api { + fn test(data: u64); + } +} + +impl_runtime_apis! { + impl self::Api for Runtime { + fn test(data: u64) { + unimplemented!() + } + } +} + +fn main() {} diff --git a/core/sr-api-macros/tests/ui/missing_block_generic_parameter.stderr b/core/sr-api-macros/tests/ui/missing_block_generic_parameter.stderr new file mode 100644 index 0000000000000000000000000000000000000000..5c8563a8b89d01d12e904380e7c4e62a1138a042 --- /dev/null +++ b/core/sr-api-macros/tests/ui/missing_block_generic_parameter.stderr @@ -0,0 +1,13 @@ +error: Missing `Block` generic parameter. + --> $DIR/missing_block_generic_parameter.rs:19:13 + | +19 | impl self::Api for Runtime { + | ^^^ + +error[E0107]: wrong number of type arguments: expected 1, found 0 + --> $DIR/missing_block_generic_parameter.rs:19:7 + | +19 | impl self::Api for Runtime { + | ^^^^^^^^^ expected 1 type argument + +For more information about this error, try `rustc --explain E0107`. diff --git a/core/sr-api-macros/tests/ui/missing_path_for_trait.rs b/core/sr-api-macros/tests/ui/missing_path_for_trait.rs new file mode 100644 index 0000000000000000000000000000000000000000..cbf339e73bd3b3b9adcc58b1f233cd1995c75469 --- /dev/null +++ b/core/sr-api-macros/tests/ui/missing_path_for_trait.rs @@ -0,0 +1,26 @@ +use runtime_primitives::traits::GetNodeBlockType; +use test_client::runtime::Block; +use client::{decl_runtime_apis, impl_runtime_apis}; + +/// The declaration of the `Runtime` type and the implementation of the `GetNodeBlockType` +/// trait are done by the `construct_runtime!` macro in a real runtime. +struct Runtime {} +impl GetNodeBlockType for Runtime { + type NodeBlock = Block; +} + +decl_runtime_apis! { + pub trait Api { + fn test(data: u64); + } +} + +impl_runtime_apis! { + impl Api for Runtime { + fn test(data: u64) { + unimplemented!() + } + } +} + +fn main() {} diff --git a/core/sr-api-macros/tests/ui/missing_path_for_trait.stderr b/core/sr-api-macros/tests/ui/missing_path_for_trait.stderr new file mode 100644 index 0000000000000000000000000000000000000000..4018712e3f5b3be57316b3001a74eab66b5828aa --- /dev/null +++ b/core/sr-api-macros/tests/ui/missing_path_for_trait.stderr @@ -0,0 +1,5 @@ +error: The implemented trait has to be referenced with a path, e.g. `impl client::Core for Runtime`. + --> $DIR/missing_path_for_trait.rs:19:7 + | +19 | impl Api for Runtime { + | ^^^ diff --git a/core/sr-api-macros/tests/ui/type_reference_in_impl_runtime_apis_call.rs b/core/sr-api-macros/tests/ui/type_reference_in_impl_runtime_apis_call.rs new file mode 100644 index 0000000000000000000000000000000000000000..014b7bd1e84f51e63298314c35024cab83d98e0c --- /dev/null +++ b/core/sr-api-macros/tests/ui/type_reference_in_impl_runtime_apis_call.rs @@ -0,0 +1,26 @@ +use runtime_primitives::traits::GetNodeBlockType; +use test_client::runtime::Block; +use client::{decl_runtime_apis, impl_runtime_apis}; + +/// The declaration of the `Runtime` type and the implementation of the `GetNodeBlockType` +/// trait are done by the `construct_runtime!` macro in a real runtime. +struct Runtime {} +impl GetNodeBlockType for Runtime { + type NodeBlock = Block; +} + +decl_runtime_apis! { + pub trait Api { + fn test(data: u64); + } +} + +impl_runtime_apis! { + impl self::Api for Runtime { + fn test(data: &u64) { + unimplemented!() + } + } +} + +fn main() {} diff --git a/core/sr-api-macros/tests/ui/type_reference_in_impl_runtime_apis_call.stderr b/core/sr-api-macros/tests/ui/type_reference_in_impl_runtime_apis_call.stderr new file mode 100644 index 0000000000000000000000000000000000000000..12ec399972efa763784b24e5243368cd10ae6641 --- /dev/null +++ b/core/sr-api-macros/tests/ui/type_reference_in_impl_runtime_apis_call.stderr @@ -0,0 +1,13 @@ +error[E0053]: method `test` has an incompatible type for trait + --> $DIR/type_reference_in_impl_runtime_apis_call.rs:20:17 + | +14 | fn test(data: u64); + | --- type in trait +... +20 | fn test(data: &u64) { + | ^^^^ expected u64, found &u64 + | + = note: expected type `fn(u64)` + found type `fn(&u64)` + +For more information about this error, try `rustc --explain E0053`. diff --git a/core/sr-io/Cargo.toml b/core/sr-io/Cargo.toml index dbe699b4b5ec2c197126505642e91e81ae4cfa82..0c97ba8050d2d8f9990ee540f40dfca4ceef7da9 100644 --- a/core/sr-io/Cargo.toml +++ b/core/sr-io/Cargo.toml @@ -19,6 +19,9 @@ environmental = { version = "1.0.1", optional = true } substrate-state-machine = { path = "../state-machine", optional = true } trie = { package = "substrate-trie", path = "../trie", optional = true } +[dev-dependencies] +substrate-offchain = { path = "../offchain" } + [features] default = ["std"] std = [ diff --git a/core/sr-io/src/lib.rs b/core/sr-io/src/lib.rs index 47af4de98ba642133a0069ceccf0e97a90114daa..cd9b43798b3d1d7f59ea13ed2e1464ef949fb0de 100644 --- a/core/sr-io/src/lib.rs +++ b/core/sr-io/src/lib.rs @@ -33,6 +33,7 @@ use rstd::vec::Vec; pub use codec; pub use primitives::Blake2Hasher; +use primitives::offchain::{Timestamp, HttpRequestId, HttpRequestStatus, HttpError, CryptoKind, CryptoKeyId}; /// Error verifying ECDSA signature pub enum EcdsaVerifyError { @@ -44,6 +45,8 @@ pub enum EcdsaVerifyError { BadSignature, } +pub mod offchain; + /// Trait for things which can be printed. pub trait Printable { /// Print the object. @@ -138,7 +141,7 @@ export_api! { fn child_storage_root(storage_key: &[u8]) -> Vec; /// "Commit" all existing operations and get the resultant storage change root. - fn storage_changes_root(parent_hash: [u8; 32], parent_num: u64) -> Option<[u8; 32]>; + fn storage_changes_root(parent_hash: [u8; 32]) -> Option<[u8; 32]>; /// A trie root formed from the enumerated items. /// TODO [#2382] remove (just use `ordered_trie_root` (NOTE currently not implemented for without_std)) @@ -226,12 +229,140 @@ export_api! { export_api! { pub(crate) trait OffchainApi { - /// Submit extrinsic from the runtime. + /// Submit transaction to the pool. + /// + /// The transaction will end up in the pool. + fn submit_transaction(data: &T) -> Result<(), ()>; + + /// Create new key(pair) for signing/encryption/decryption. + /// + /// Returns an error if given crypto kind is not supported. + fn new_crypto_key(crypto: CryptoKind) -> Result; + + /// Encrypt a piece of data using given crypto key. /// - /// Depending on the kind of extrinsic it will either be: - /// 1. scheduled to be included in the next produced block (inherent) - /// 2. added to the pool and propagated (transaction) - fn submit_extrinsic(data: &T); + /// If `key` is `None`, it will attempt to use current authority key. + /// + /// Returns an error if `key` is not available or does not exist. + fn encrypt(key: Option, data: &[u8]) -> Result, ()>; + + /// Decrypt a piece of data using given crypto key. + /// + /// If `key` is `None`, it will attempt to use current authority key. + /// + /// Returns an error if data cannot be decrypted or the `key` is not available or does not exist. + fn decrypt(key: Option, data: &[u8]) -> Result, ()>; + + /// Sign a piece of data using given crypto key. + /// + /// If `key` is `None`, it will attempt to use current authority key. + /// + /// Returns an error if `key` is not available or does not exist. + fn sign(key: Option, data: &[u8]) -> Result, ()>; + + /// Verifies that `signature` for `msg` matches given `key`. + /// + /// Returns an `Ok` with `true` in case it does, `false` in case it doesn't. + /// Returns an error in case the key is not available or does not exist or the parameters + /// lengths are incorrect. + fn verify(key: Option, msg: &[u8], signature: &[u8]) -> Result; + + /// Returns current UNIX timestamp (in millis) + fn timestamp() -> Timestamp; + + /// Pause the execution until `deadline` is reached. + fn sleep_until(deadline: Timestamp); + + /// Returns a random seed. + /// + /// This is a trully random non deterministic seed generated by host environment. + /// Obviously fine in the off-chain worker context. + fn random_seed() -> [u8; 32]; + + /// Sets a value in the local storage. + /// + /// Note this storage is not part of the consensus, it's only accessible by + /// offchain worker tasks running on the same machine. It IS persisted between runs. + fn local_storage_set(key: &[u8], value: &[u8]); + + /// Sets a value in the local storage if it matches current value. + /// + /// Since multiple offchain workers may be running concurrently, to prevent + /// data races use CAS to coordinate between them. + /// + /// Note this storage is not part of the consensus, it's only accessible by + /// offchain worker tasks running on the same machine. It IS persisted between runs. + fn local_storage_compare_and_set(key: &[u8], old_value: &[u8], new_value: &[u8]); + + /// Gets a value from the local storage. + /// + /// If the value does not exist in the storage `None` will be returned. + /// Note this storage is not part of the consensus, it's only accessible by + /// offchain worker tasks running on the same machine. It IS persisted between runs. + fn local_storage_get(key: &[u8]) -> Option>; + + /// Initiaties a http request given HTTP verb and the URL. + /// + /// Meta is a future-reserved field containing additional, parity-codec encoded parameters. + /// Returns the id of newly started request. + fn http_request_start( + method: &str, + uri: &str, + meta: &[u8] + ) -> Result; + + /// Append header to the request. + fn http_request_add_header( + request_id: HttpRequestId, + name: &str, + value: &str + ) -> Result<(), ()>; + + /// Write a chunk of request body. + /// + /// Writing an empty chunks finalises the request. + /// Passing `None` as deadline blocks forever. + /// + /// Returns an error in case deadline is reached or the chunk couldn't be written. + fn http_request_write_body( + request_id: HttpRequestId, + chunk: &[u8], + deadline: Option + ) -> Result<(), HttpError>; + + /// Block and wait for the responses for given requests. + /// + /// Returns a vector of request statuses (the len is the same as ids). + /// Note that if deadline is not provided the method will block indefinitely, + /// otherwise unready responses will produce `DeadlineReached` status. + /// + /// Passing `None` as deadline blocks forever. + fn http_response_wait( + ids: &[HttpRequestId], + deadline: Option + ) -> Vec; + + /// Read all response headers. + /// + /// Returns a vector of pairs `(HeaderKey, HeaderValue)`. + /// NOTE response headers have to be read before response body. + fn http_response_headers( + request_id: HttpRequestId + ) -> Vec<(Vec, Vec)>; + + /// Read a chunk of body response to given buffer. + /// + /// Returns the number of bytes written or an error in case a deadline + /// is reached or server closed the connection. + /// If `0` is returned it means that the response has been fully consumed + /// and the `request_id` is now invalid. + /// NOTE this implies that response headers must be read before draining the body. + /// Passing `None` as a deadline blocks forever. + fn http_response_read_body( + request_id: HttpRequestId, + buffer: &mut [u8], + deadline: Option + ) -> Result; } } @@ -251,6 +382,10 @@ mod imp { } #[cfg(feature = "std")] -pub use self::imp::{StorageOverlay, ChildrenStorageOverlay, with_storage, with_externalities, TestExternalities}; +pub use self::imp::{StorageOverlay, ChildrenStorageOverlay, with_storage, with_externalities}; #[cfg(not(feature = "std"))] pub use self::imp::ext::*; + +/// Type alias for Externalities implementation used in tests. +#[cfg(feature = "std")] +pub type TestExternalities = self::imp::TestExternalities; diff --git a/core/sr-io/src/offchain/http.rs b/core/sr-io/src/offchain/http.rs new file mode 100644 index 0000000000000000000000000000000000000000..0708f837179ed3072001e5308050dd318c9fe0ad --- /dev/null +++ b/core/sr-io/src/offchain/http.rs @@ -0,0 +1,571 @@ +// Copyright 2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +//! A non-std set of HTTP types. + +use rstd::str; +use rstd::prelude::Vec; +#[cfg(not(feature = "std"))] +use rstd::prelude::vec; +use primitives::offchain::{ + Timestamp, + HttpRequestId as RequestId, + HttpRequestStatus as RequestStatus, + HttpError, +}; + +/// Request method (HTTP verb) +#[derive(Clone, PartialEq, Eq)] +#[cfg_attr(feature = "std", derive(Debug))] +pub enum Method { + /// GET request + Get, + /// POST request + Post, + /// PUT request + Put, + /// PATCH request + Patch, + /// DELETE request + Delete, + /// Custom verb + Other(&'static str), +} + +impl AsRef for Method { + fn as_ref(&self) -> &str { + match *self { + Method::Get => "GET", + Method::Post => "POST", + Method::Put => "PUT", + Method::Patch => "PATCH", + Method::Delete => "DELETE", + Method::Other(m) => m, + } + } +} + +mod header { + use super::*; + + /// A header type. + #[derive(Clone, PartialEq, Eq)] + #[cfg_attr(feature = "std", derive(Debug))] + pub struct Header { + name: Vec, + value: Vec, + } + + impl Header { + /// Creates new header given it's name and value. + pub fn new(name: &str, value: &str) -> Self { + Header { + name: name.as_bytes().to_vec(), + value: value.as_bytes().to_vec(), + } + } + + /// Returns the name of this header. + pub fn name(&self) -> &str { + // Header keys are always produced from `&str` so this is safe. + // we don't store them as `Strings` to avoid bringing `alloc::String` to rstd + // or here. + unsafe { str::from_utf8_unchecked(&self.name) } + } + + /// Returns the value of this header. + pub fn value(&self) -> &str { + // Header values are always produced from `&str` so this is safe. + // we don't store them as `Strings` to avoid bringing `alloc::String` to rstd + // or here. + unsafe { str::from_utf8_unchecked(&self.value) } + } + } +} + +/// An HTTP request builder. +#[derive(Clone, PartialEq, Eq)] +#[cfg_attr(feature = "std", derive(Debug))] +pub struct Request<'a, T = Vec<&'static [u8]>> { + /// Request method + pub method: Method, + /// Request URL + pub url: &'a str, + /// Body of the request + pub body: T, + /// Deadline to finish sending the request + pub deadline: Option, + /// Request list of headers. + headers: Vec, +} + +impl Default for Request<'static, T> { + fn default() -> Self { + Request { + method: Method::Get, + url: "http://localhost", + headers: Vec::new(), + body: Default::default(), + deadline: None, + } + } +} + +impl<'a> Request<'a> { + /// Start a simple GET request + pub fn get(url: &'a str) -> Self { + Self::new(url) + } +} + +impl<'a, T> Request<'a, T> { + /// Create new POST request with given body. + pub fn post(url: &'a str, body: T) -> Self { + let req: Request = Request::default(); + + Request { + url, + body, + method: Method::Post, + headers: req.headers, + deadline: req.deadline, + } + } +} + +impl<'a, T: Default> Request<'a, T> { + /// Create new Request builder with given URL and body. + pub fn new(url: &'a str) -> Self { + Request::default().url(url) + } + + /// Change the method of the request + pub fn method(mut self, method: Method) -> Self { + self.method = method; + self + } + + /// Change the URL of the request. + pub fn url(mut self, url: &'a str) -> Self { + self.url = url; + self + } + + /// Set the body of the request. + pub fn body(mut self, body: T) -> Self { + self.body = body; + self + } + + /// Add a header. + pub fn add_header(mut self, name: &str, value: &str) -> Self { + self.headers.push(header::Header::new(name, value)); + self + } + + /// Set the deadline of the request. + pub fn deadline(mut self, deadline: Timestamp) -> Self { + self.deadline = Some(deadline); + self + } +} + +impl<'a, I: AsRef<[u8]>, T: IntoIterator> Request<'a, T> { + /// Send the request and return a handle. + /// + /// Err is returned in case the deadline is reached + /// or the request timeouts. + pub fn send(self) -> Result { + let meta = &[]; + + // start an http request. + let id = crate::http_request_start(self.method.as_ref(), self.url, meta).map_err(|_| HttpError::IoError)?; + + // add custom headers + for header in &self.headers { + crate::http_request_add_header( + id, + header.name(), + header.value(), + ).map_err(|_| HttpError::IoError)? + } + + // write body + for chunk in self.body { + crate::http_request_write_body(id, chunk.as_ref(), self.deadline)?; + } + + // finalise the request + crate::http_request_write_body(id, &[], self.deadline)?; + + Ok(PendingRequest { + id, + }) + } +} + +/// A request error +#[derive(Clone, PartialEq, Eq)] +#[cfg_attr(feature = "std", derive(Debug))] +pub enum Error { + /// Deadline has been reached. + DeadlineReached, + /// Request had timed out. + Timeout, + /// Unknown error has been ecountered. + Unknown, +} + +/// A struct representing an uncompleted http request. +#[derive(PartialEq, Eq)] +#[cfg_attr(feature = "std", derive(Debug))] +pub struct PendingRequest { + /// Request ID + pub id: RequestId, +} + +/// A result of waiting for a pending request. +pub type HttpResult = Result; + +impl PendingRequest { + /// Wait for the request to complete. + /// + /// NOTE this waits for the request indefinitely. + pub fn wait(self) -> HttpResult { + match self.try_wait(None) { + Ok(res) => res, + Err(_) => panic!("Since `None` is passed we will never get a deadline error; qed"), + } + } + + /// Attempts to wait for the request to finish, + /// but will return `Err` in case the deadline is reached. + pub fn try_wait(self, deadline: impl Into>) -> Result { + Self::try_wait_all(vec![self], deadline).pop().expect("One request passed, one status received; qed") + } + + /// Wait for all provided requests. + pub fn wait_all(requests: Vec) -> Vec { + Self::try_wait_all(requests, None) + .into_iter() + .map(|r| match r { + Ok(r) => r, + Err(_) => panic!("Since `None` is passed we will never get a deadline error; qed"), + }) + .collect() + } + + /// Attempt to wait for all provided requests, but up to given deadline. + /// + /// Requests that are complete will resolve to an `Ok` others will return a `DeadlineReached` error. + pub fn try_wait_all( + requests: Vec, + deadline: impl Into> + ) -> Vec> { + let ids = requests.iter().map(|r| r.id).collect::>(); + let statuses = crate::http_response_wait(&ids, deadline.into()); + + statuses + .into_iter() + .zip(requests.into_iter()) + .map(|(status, req)| match status { + RequestStatus::DeadlineReached => Err(req), + RequestStatus::Timeout => Ok(Err(Error::Timeout)), + RequestStatus::Unknown => Ok(Err(Error::Unknown)), + RequestStatus::Finished(code) => Ok(Ok(Response::new(req.id, code))), + }) + .collect() + } +} + +/// A HTTP response. +#[cfg_attr(feature = "std", derive(Debug))] +pub struct Response { + /// Request id + pub id: RequestId, + /// Response status code + pub code: u16, + /// A collection of headers. + headers: Option, +} + +impl Response { + fn new(id: RequestId, code: u16) -> Self { + Self { + id, + code, + headers: None, + } + } + + /// Retrieve the headers for this response. + pub fn headers(&mut self) -> &Headers { + if self.headers.is_none() { + self.headers = Some(Headers { raw: crate::http_response_headers(self.id) }); + } + self.headers.as_ref().expect("Headers were just set; qed") + } + + /// Retrieve the body of this response. + pub fn body(&self) -> ResponseBody { + ResponseBody::new(self.id) + } +} + +/// A buffered byte iterator over response body. +/// +/// Note that reading the body may return `None` in following cases: +/// 1. Either the deadline you've set is reached (check via `#error`; +/// In such case you can resume the reader by setting a new deadline) +/// 2. Or because of IOError. In such case the reader is not resumable and will keep +/// returning `None`. +/// 3. The body has been returned. The reader will keep returning `None`. +#[derive(Clone)] +pub struct ResponseBody { + id: RequestId, + error: Option, + buffer: [u8; 4096], + filled_up_to: Option, + position: usize, + deadline: Option, +} + +#[cfg(feature = "std")] +impl std::fmt::Debug for ResponseBody { + fn fmt(&self, fmt: &mut std::fmt::Formatter) -> std::fmt::Result { + fmt.debug_struct("ResponseBody") + .field("id", &self.id) + .field("error", &self.error) + .field("buffer", &self.buffer.len()) + .field("filled_up_to", &self.filled_up_to) + .field("position", &self.position) + .field("deadline", &self.deadline) + .finish() + } +} + +impl ResponseBody { + fn new(id: RequestId) -> Self { + ResponseBody { + id, + error: None, + buffer: [0_u8; 4096], + filled_up_to: None, + position: 0, + deadline: None, + } + } + + /// Set the deadline for reading the body. + pub fn deadline(&mut self, deadline: impl Into>) { + self.deadline = deadline.into(); + self.error = None; + } + + /// Return an error that caused the iterator to return `None`. + /// + /// If the error is `DeadlineReached` you can resume the iterator by setting + /// a new deadline. + pub fn error(&self) -> &Option { + &self.error + } +} + +impl Iterator for ResponseBody { + type Item = u8; + + fn next(&mut self) -> Option { + if self.error.is_some() { + return None; + } + + if self.filled_up_to.is_none() { + let result = crate::http_response_read_body(self.id, &mut self.buffer, self.deadline); + match result { + Err(e) => { + self.error = Some(e); + return None; + } + Ok(0) => { + return None; + } + Ok(size) => { + self.position = 0; + self.filled_up_to = Some(size); + } + } + } + + if Some(self.position) == self.filled_up_to { + self.filled_up_to = None; + return self.next(); + } + + let result = self.buffer[self.position]; + self.position += 1; + Some(result) + } +} + +/// A collection of Headers in the response. +#[derive(Clone, PartialEq, Eq)] +#[cfg_attr(feature = "std", derive(Debug))] +pub struct Headers { + /// Raw headers + pub raw: Vec<(Vec, Vec)>, +} + +impl Headers { + /// Retrieve a single header from the list of headers. + /// + /// Note this method is linearly looking from all the headers + /// comparing them with the needle byte-by-byte. + /// If you want to consume multiple headers it's better to iterate + /// and collect them on your own. + pub fn find(&self, name: &str) -> Option<&str> { + let raw = name.as_bytes(); + for &(ref key, ref val) in &self.raw { + if &**key == raw { + return str::from_utf8(&val).ok() + } + } + None + } + + /// Convert this headers into an iterator. + pub fn into_iter(&self) -> HeadersIterator { + HeadersIterator { collection: &self.raw, index: None } + } +} + +/// A custom iterator traversing all the headers. +#[derive(Clone)] +#[cfg_attr(feature = "std", derive(Debug))] +pub struct HeadersIterator<'a> { + collection: &'a [(Vec, Vec)], + index: Option, +} + +impl<'a> HeadersIterator<'a> { + /// Move the iterator to the next position. + /// + /// Returns `true` is `current` has been set by this call. + pub fn next(&mut self) -> bool { + let index = self.index.map(|x| x + 1).unwrap_or(0); + self.index = Some(index); + index < self.collection.len() + } + + /// Returns current element (if any). + /// + /// Note that you have to call `next` prior to calling this + pub fn current(&self) -> Option<(&str, &str)> { + self.collection.get(self.index?) + .map(|val| (str::from_utf8(&val.0).unwrap_or(""), str::from_utf8(&val.1).unwrap_or(""))) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::{TestExternalities, with_externalities}; + use substrate_offchain::testing; + + #[test] + fn should_send_a_basic_request_and_get_response() { + let offchain = testing::TestOffchainExt::default(); + let mut t = TestExternalities::default(); + let state = offchain.0.clone(); + t.set_offchain_externalities(offchain); + + with_externalities(&mut t, || { + let request: Request = Request::get("http://localhost:1234"); + let pending = request + .add_header("X-Auth", "hunter2") + .send() + .unwrap(); + // make sure it's sent correctly + state.write().fulfill_pending_request( + 0, + testing::PendingRequest { + method: "GET".into(), + uri: "http://localhost:1234".into(), + headers: vec![("X-Auth".into(), "hunter2".into())], + sent: true, + ..Default::default() + }, + b"1234".to_vec(), + None, + ); + + // wait + let mut response = pending.wait().unwrap(); + + // then check the response + let mut headers = response.headers().into_iter(); + assert_eq!(headers.current(), None); + assert_eq!(headers.next(), false); + assert_eq!(headers.current(), None); + + let body = response.body(); + assert_eq!(body.clone().collect::>(), b"1234".to_vec()); + assert_eq!(body.error(), &None); + }) + } + + #[test] + fn should_send_a_post_request() { + let offchain = testing::TestOffchainExt::default(); + let mut t = TestExternalities::default(); + let state = offchain.0.clone(); + t.set_offchain_externalities(offchain); + + with_externalities(&mut t, || { + let pending = Request::default() + .method(Method::Post) + .url("http://localhost:1234") + .body(vec![b"1234"]) + .send() + .unwrap(); + // make sure it's sent correctly + state.write().fulfill_pending_request( + 0, + testing::PendingRequest { + method: "POST".into(), + uri: "http://localhost:1234".into(), + body: b"1234".to_vec(), + sent: true, + ..Default::default() + }, + b"1234".to_vec(), + Some(("Test".to_owned(), "Header".to_owned())), + ); + + // wait + let mut response = pending.wait().unwrap(); + + // then check the response + let mut headers = response.headers().into_iter(); + assert_eq!(headers.current(), None); + assert_eq!(headers.next(), true); + assert_eq!(headers.current(), Some(("Test", "Header"))); + + let body = response.body(); + assert_eq!(body.clone().collect::>(), b"1234".to_vec()); + assert_eq!(body.error(), &None); + }) + } +} diff --git a/core/consensus/authorities/src/lib.rs b/core/sr-io/src/offchain/mod.rs similarity index 67% rename from core/consensus/authorities/src/lib.rs rename to core/sr-io/src/offchain/mod.rs index a5ad974f5b40e833c3677c14e2fa332751c06eb7..6b82f771119997afd17924dc93e23122a9c5cd79 100644 --- a/core/consensus/authorities/src/lib.rs +++ b/core/sr-io/src/offchain/mod.rs @@ -14,18 +14,6 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -//! Authorities API. +//! A collection of higher lever helpers for offchain workers. -#![cfg_attr(not(feature = "std"), no_std)] - -use substrate_client::decl_runtime_apis; -use runtime_primitives::traits::AuthorityIdFor; -use rstd::vec::Vec; - -decl_runtime_apis! { - /// Authorities API. - pub trait AuthoritiesApi { - /// Returns the authorities at the given block. - fn authorities() -> Vec>; - } -} +pub mod http; diff --git a/core/sr-io/with_std.rs b/core/sr-io/with_std.rs index d73ccf4b6615c1eaaf05fdb23bb4dfa7109bb1b7..34bfc22b9db1544571739135ca955517ae2350d1 100644 --- a/core/sr-io/with_std.rs +++ b/core/sr-io/with_std.rs @@ -28,7 +28,7 @@ pub use substrate_state_machine::{ }; use environmental::environmental; -use primitives::{hexdisplay::HexDisplay, H256}; +use primitives::{offchain, hexdisplay::HexDisplay, H256}; #[cfg(feature = "std")] use std::collections::HashMap; @@ -158,10 +158,10 @@ impl StorageApi for () { }).expect("child_storage_root cannot be called outside of an Externalities-provided environment.") } - fn storage_changes_root(parent_hash: [u8; 32], parent_num: u64) -> Option<[u8; 32]> { + fn storage_changes_root(parent_hash: [u8; 32]) -> Option<[u8; 32]> { ext::with(|ext| - ext.storage_changes_root(parent_hash.into(), parent_num).map(Into::into) - ).unwrap_or(None) + ext.storage_changes_root(parent_hash.into()).map(|h| h.map(|h| h.into())) + ).unwrap_or(Ok(None)).expect("Invalid parent hash passed to storage_changes_root") } fn enumerated_trie_root(input: &[&[u8]]) -> H::Out @@ -216,9 +216,12 @@ impl CryptoApi for () { } fn secp256k1_ecdsa_recover(sig: &[u8; 65], msg: &[u8; 32]) -> Result<[u8; 64], EcdsaVerifyError> { - let rs = secp256k1::Signature::parse_slice(&sig[0..64]).map_err(|_| EcdsaVerifyError::BadRS)?; - let v = secp256k1::RecoveryId::parse(if sig[64] > 26 { sig[64] - 27 } else { sig[64] } as u8).map_err(|_| EcdsaVerifyError::BadV)?; - let pubkey = secp256k1::recover(&secp256k1::Message::parse(msg), &rs, &v).map_err(|_| EcdsaVerifyError::BadSignature)?; + let rs = secp256k1::Signature::parse_slice(&sig[0..64]) + .map_err(|_| EcdsaVerifyError::BadRS)?; + let v = secp256k1::RecoveryId::parse(if sig[64] > 26 { sig[64] - 27 } else { sig[64] } as u8) + .map_err(|_| EcdsaVerifyError::BadV)?; + let pubkey = secp256k1::recover(&secp256k1::Message::parse(msg), &rs, &v) + .map_err(|_| EcdsaVerifyError::BadSignature)?; let mut res = [0u8; 64]; res.copy_from_slice(&pubkey.serialize()[1..65]); Ok(res) @@ -251,12 +254,142 @@ impl HashingApi for () { } } +fn with_offchain(f: impl FnOnce(&mut dyn offchain::Externalities) -> R, msg: &'static str) -> R { + ext::with(|ext| ext + .offchain() + .map(|ext| f(ext)) + .expect(msg) + ).expect("offchain-worker functions cannot be called outside of an Externalities-provided environment.") +} + impl OffchainApi for () { - fn submit_extrinsic(data: &T) { - ext::with(|ext| ext - .submit_extrinsic(codec::Encode::encode(data)) - .expect("submit_extrinsic can be called only in offchain worker context") - ).expect("submit_extrinsic cannot be called outside of an Externalities-provided environment.") + fn submit_transaction(data: &T) -> Result<(), ()> { + with_offchain(|ext| { + ext.submit_transaction(codec::Encode::encode(data)) + }, "submit_transaction can be called only in the offchain worker context") + } + + fn new_crypto_key(crypto: offchain::CryptoKind) -> Result { + with_offchain(|ext| { + ext.new_crypto_key(crypto) + }, "new_crypto_key can be called only in the offchain worker context") + } + + fn encrypt(key: Option, data: &[u8]) -> Result, ()> { + with_offchain(|ext| { + ext.encrypt(key, data) + }, "encrypt can be called only in the offchain worker context") + } + + fn decrypt(key: Option, data: &[u8]) -> Result, ()> { + with_offchain(|ext| { + ext.decrypt(key, data) + }, "decrypt can be called only in the offchain worker context") + } + + fn sign(key: Option, data: &[u8]) -> Result, ()> { + with_offchain(|ext| { + ext.sign(key, data) + }, "sign can be called only in the offchain worker context") + } + + fn verify(key: Option, msg: &[u8], signature: &[u8]) -> Result { + with_offchain(|ext| { + ext.verify(key, msg, signature) + }, "verify can be called only in the offchain worker context") + } + + fn timestamp() -> offchain::Timestamp { + with_offchain(|ext| { + ext.timestamp() + }, "timestamp can be called only in the offchain worker context") + } + + fn sleep_until(deadline: Timestamp) { + with_offchain(|ext| { + ext.sleep_until(deadline) + }, "sleep_until can be called only in the offchain worker context") + } + + fn random_seed() -> [u8; 32] { + with_offchain(|ext| { + ext.random_seed() + }, "random_seed can be called only in the offchain worker context") + } + + fn local_storage_set(key: &[u8], value: &[u8]) { + with_offchain(|ext| { + ext.local_storage_set(key, value) + }, "local_storage_set can be called only in the offchain worker context") + } + + fn local_storage_compare_and_set(key: &[u8], old_value: &[u8], new_value: &[u8]) { + with_offchain(|ext| { + ext.local_storage_compare_and_set(key, old_value, new_value) + }, "local_storage_compare_and_set can be called only in the offchain worker context") + } + + fn local_storage_get(key: &[u8]) -> Option> { + with_offchain(|ext| { + ext.local_storage_get(key) + }, "local_storage_get can be called only in the offchain worker context") + } + + fn http_request_start( + method: &str, + uri: &str, + meta: &[u8] + ) -> Result { + with_offchain(|ext| { + ext.http_request_start(method, uri, meta) + }, "http_request_start can be called only in the offchain worker context") + } + + fn http_request_add_header( + request_id: offchain::HttpRequestId, + name: &str, + value: &str + ) -> Result<(), ()> { + with_offchain(|ext| { + ext.http_request_add_header(request_id, name, value) + }, "http_request_add_header can be called only in the offchain worker context") + } + + fn http_request_write_body( + request_id: offchain::HttpRequestId, + chunk: &[u8], + deadline: Option + ) -> Result<(), offchain::HttpError> { + with_offchain(|ext| { + ext.http_request_write_body(request_id, chunk, deadline) + }, "http_request_write_body can be called only in the offchain worker context") + } + + fn http_response_wait( + ids: &[offchain::HttpRequestId], + deadline: Option + ) -> Vec { + with_offchain(|ext| { + ext.http_response_wait(ids, deadline) + }, "http_response_wait can be called only in the offchain worker context") + } + + fn http_response_headers( + request_id: offchain::HttpRequestId + ) -> Vec<(Vec, Vec)> { + with_offchain(|ext| { + ext.http_response_headers(request_id) + }, "http_response_headers can be called only in the offchain worker context") + } + + fn http_response_read_body( + request_id: offchain::HttpRequestId, + buffer: &mut [u8], + deadline: Option + ) -> Result { + with_offchain(|ext| { + ext.http_response_read_body(request_id, buffer, deadline) + }, "http_response_read_body can be called only in the offchain worker context") } } @@ -265,7 +398,7 @@ impl Api for () {} /// Execute the given closure with global function available whose functionality routes into the /// externalities `ext`. Forwards the value that the closure returns. // NOTE: need a concrete hasher here due to limitations of the `environmental!` macro, otherwise a type param would have been fine I think. -pub fn with_externalities R>(ext: &mut Externalities, f: F) -> R { +pub fn with_externalities R>(ext: &mut dyn Externalities, f: F) -> R { ext::using(ext, f) } diff --git a/core/sr-io/without_std.rs b/core/sr-io/without_std.rs index 2f2b482f5e0cdb4f2282603e15e00e4a0a85367b..b1dc10d1b88eb4d0cf92c51197b7f44c402eb402 100644 --- a/core/sr-io/without_std.rs +++ b/core/sr-io/without_std.rs @@ -19,8 +19,8 @@ pub use rstd; pub use rstd::{mem, slice}; use core::{intrinsics, panic::PanicInfo}; -use rstd::{vec::Vec, cell::Cell}; -use primitives::Blake2Hasher; +use rstd::{vec::Vec, cell::Cell, convert::TryInto}; +use primitives::{offchain, Blake2Hasher}; #[cfg(not(feature = "no_panic_handler"))] #[panic_handler] @@ -219,7 +219,6 @@ pub mod ext { /// # Returns /// /// - `0` if no value exists to the given key. `written_out` is set to `u32::max_value()`. - /// /// - Otherwise, pointer to the value in memory. `written_out` contains the length of the value. fn ext_get_allocated_storage(key_data: *const u8, key_len: u32, written_out: *mut u32) -> *mut u8; /// Gets the value of the given key from storage. @@ -233,7 +232,13 @@ pub mod ext { /// - `u32::max_value()` if the value does not exists. /// /// - Otherwise, the number of bytes written for value. - fn ext_get_storage_into(key_data: *const u8, key_len: u32, value_data: *mut u8, value_len: u32, value_offset: u32) -> u32; + fn ext_get_storage_into( + key_data: *const u8, + key_len: u32, + value_data: *mut u8, + value_len: u32, + value_offset: u32 + ) -> u32; /// Gets the trie root of the storage. fn ext_storage_root(result: *mut u8); /// Get the change trie root of the current storage overlay at a block with given parent. @@ -242,26 +247,44 @@ pub mod ext { /// /// - `1` if the change trie root was found. /// - `0` if the change trie root was not found. - fn ext_storage_changes_root(parent_hash_data: *const u8, parent_hash_len: u32, parent_num: u64, result: *mut u8) -> u32; + fn ext_storage_changes_root( + parent_hash_data: *const u8, parent_hash_len: u32, result: *mut u8) -> u32; /// A child storage function. /// /// See [`ext_set_storage`] for details. /// /// A child storage is used e.g. by a contract. - fn ext_set_child_storage(storage_key_data: *const u8, storage_key_len: u32, key_data: *const u8, key_len: u32, value_data: *const u8, value_len: u32); + fn ext_set_child_storage( + storage_key_data: *const u8, + storage_key_len: u32, + key_data: *const u8, + key_len: u32, + value_data: *const u8, + value_len: u32 + ); /// A child storage function. /// /// See [`ext_clear_storage`] for details. /// /// A child storage is used e.g. by a contract. - fn ext_clear_child_storage(storage_key_data: *const u8, storage_key_len: u32, key_data: *const u8, key_len: u32); + fn ext_clear_child_storage( + storage_key_data: *const u8, + storage_key_len: u32, + key_data: *const u8, + key_len: u32 + ); /// A child storage function. /// /// See [`ext_exists_storage`] for details. /// /// A child storage is used e.g. by a contract. - fn ext_exists_child_storage(storage_key_data: *const u8, storage_key_len: u32, key_data: *const u8, key_len: u32) -> u32; + fn ext_exists_child_storage( + storage_key_data: *const u8, + storage_key_len: u32, + key_data: *const u8, + key_len: u32 + ) -> u32; /// A child storage function. /// /// See [`ext_kill_storage`] for details. @@ -301,13 +324,22 @@ pub mod ext { /// # Returns /// /// - The pointer to the result vector and `written_out` contains its length. - fn ext_child_storage_root(storage_key_data: *const u8, storage_key_len: u32, written_out: *mut u32) -> *mut u8; + fn ext_child_storage_root( + storage_key_data: *const u8, + storage_key_len: u32, + written_out: *mut u32 + ) -> *mut u8; /// The current relay chain identifier. fn ext_chain_id() -> u64; /// Calculate a blake2_256 merkle trie root. - fn ext_blake2_256_enumerated_trie_root(values_data: *const u8, lens_data: *const u32, lens_len: u32, result: *mut u8); + fn ext_blake2_256_enumerated_trie_root( + values_data: *const u8, + lens_data: *const u32, + lens_len: u32, + result: *mut u8 + ); /// BLAKE2_128 hash fn ext_blake2_128(data: *const u8, len: u32, out: *mut u8); /// BLAKE2_256 hash @@ -321,18 +353,230 @@ pub mod ext { /// Keccak256 hash fn ext_keccak_256(data: *const u8, len: u32, out: *mut u8); /// Note: ext_ed25519_verify returns 0 if the signature is correct, nonzero otherwise. - fn ext_ed25519_verify(msg_data: *const u8, msg_len: u32, sig_data: *const u8, pubkey_data: *const u8) -> u32; + fn ext_ed25519_verify( + msg_data: *const u8, + msg_len: u32, + sig_data: *const u8, + pubkey_data: *const u8 + ) -> u32; /// Note: ext_sr25519_verify returns 0 if the signature is correct, nonzero otherwise. - fn ext_sr25519_verify(msg_data: *const u8, msg_len: u32, sig_data: *const u8, pubkey_data: *const u8) -> u32; + fn ext_sr25519_verify( + msg_data: *const u8, + msg_len: u32, + sig_data: *const u8, + pubkey_data: *const u8 + ) -> u32; /// Note: ext_secp256k1_ecdsa_recover returns 0 if the signature is correct, nonzero otherwise. - fn ext_secp256k1_ecdsa_recover(msg_data: *const u8, sig_data: *const u8, pubkey_data: *mut u8) -> u32; + fn ext_secp256k1_ecdsa_recover( + msg_data: *const u8, + sig_data: *const u8, + pubkey_data: *mut u8 + ) -> u32; //================================ // Offchain-worker Context //================================ - /// Submit extrinsic. - fn ext_submit_extrinsic(data: *const u8, len: u32); + /// Submit transaction. + /// + /// # Returns + /// + /// - 0 if it was successfuly added to the pool + /// - nonzero otherwise. + fn ext_submit_transaction(data: *const u8, len: u32) -> u32; + + /// Create new key(pair) for signing/encryption/decryption. + /// + /// # Returns + /// + /// - A crypto key id (if the value is less than u16::max_value) + /// - `u32::max_value` in case the crypto is not supported + fn ext_new_crypto_key(crypto: u32) -> u32; + + /// Encrypt a piece of data using given crypto key. + /// + /// If `key` is `0`, it will attempt to use current authority key. + /// + /// # Returns + /// + /// - `0` in case the key is invalid, `msg_len` is set to `u32::max_value` + /// - Otherwise, pointer to the encrypted message in memory, + /// `msg_len` contains the length of the message. + fn ext_encrypt(key: u32, data: *const u8, data_len: u32, msg_len: *mut u32) -> *mut u8; + + /// Decrypt a piece of data using given crypto key. + /// + /// If `key `is `0`, it will attempt to use current authority key. + /// + /// # Returns + /// + /// - `0` in case the key is invalid or data couldn't be decrypted, + /// `msg_len` is set to `u32::max_value` + /// - Otherwise, pointer to the decrypted message in memory, + /// `msg_len` contains the length of the message. + fn ext_decrypt(key: u32, data: *const u8, data_len: u32, msg_len: *mut u32) -> *mut u8; + + /// Sign a piece of data using given crypto key. + /// + /// If `key` is `0`, it will attempt to use current authority key. + /// + /// # Returns + /// + /// - `0` in case the key is invalid, + /// `sig_data_len` is set to `u32::max_value` + /// - Otherwise, pointer to the signature in memory, + /// `sig_data_len` contains the length of the signature. + fn ext_sign(key: u32, data: *const u8, data_len: u32, sig_data_len: *mut u32) -> *mut u8; + + /// Verifies that `signature` for `msg` matches given `key`. + /// + /// If `key` is `0`, it will attempt to use current authority key. + /// + /// # Returns + /// - `0` in case the signature is correct + /// - `1` in case it doesn't match the key + /// - `u32::max_value` if the key is invalid. + fn ext_verify( + key: u32, + msg: *const u8, + msg_len: u32, + signature: *const u8, + signature_len: u32 + ) -> u32; + + /// Returns current UNIX timestamp (milliseconds) + fn ext_timestamp() -> u64; + + /// Pause execution until given timestamp (milliseconds; `deadline`) is reached. + /// + /// The deadline is obtained by querying the current timestamp via `ext_timestamp` + /// and then adding some time to it. + fn ext_sleep_until(deadline: u64); + + /// Generate a random seed + /// + /// `data` has to be a pointer to a slice of 32 bytes. + fn ext_random_seed(data: *mut u8); + + /// Write a value to local storage. + fn ext_local_storage_set(key: *const u8, key_len: u32, value: *const u8, value_len: u32); + + /// Write a value to local storage in atomic fashion. + fn ext_local_storage_compare_and_set( + key: *const u8, + key_len: u32, + old_value: *const u8, + old_value_len: u32, + new_value: *const u8, + new_value_len: u32 + ); + + /// Read a value from local storage. + /// + /// + /// # Returns + /// + /// - 0 if the value has not been found, the `value_len` is set to `u32::max_value`. + /// - Otherwise, pointer to the value in memory. `value_len` contains the length of the value. + fn ext_local_storage_get(key: *const u8, key_len: u32, value_len: *mut u32) -> *mut u8; + + /// Initiaties a http request. + /// + /// `meta` is parity-codec encoded additional parameters to the request (like redirection policy, + /// timeouts, certificates policy, etc). The format is not yet specified and the field is currently + /// only reserved for future use. + /// + /// # Returns + /// + /// `RequestId(u16)` of initiated request, any value beyond `u16::max_value` + /// signifies an error. + fn ext_http_request_start( + method: *const u8, + method_len: u32, + url: *const u8, + url_len: u32, + meta: *const u8, + meta_len: u32 + ) -> u32; + + /// Add a header to the request. + /// + /// # Returns + /// + /// - `0` if successful (and the request id exists) + /// - nonzero otherwise + fn ext_http_request_add_header( + request_id: u32, + name: *const u8, + name_len: u32, + value: *const u8, + value_len: u32 + ) -> u32; + + /// Write a chunk of request body. + /// + /// Writing an empty chunks finalises the request. + /// Passing `0` as deadline blocks forever. + /// + /// # Returns + /// + /// - `0` if successful, + /// - nonzero otherwise (see HttpError for the codes) + fn ext_http_request_write_body( + request_id: u32, + chunk: *const u8, + chunk_len: u32, + deadline: u64 + ) -> u32; + + /// Block and wait for the responses for given requests. + /// + /// Note that if deadline is 0 the method will block indefinitely, + /// otherwise unready responses will produce `DeadlineReached` status. + /// (see #primitives::offchain::HttpRequestStatus) + /// + /// Make sure that `statuses` have the same length as ids. + fn ext_http_response_wait( + ids: *const u32, + ids_len: u32, + statuses: *mut u32, + deadline: u64 + ); + + /// Read all response headers. + /// + /// Note the headers are only available before response body is fully consumed. + /// + /// # Returns + /// + /// - A pointer to parity-codec encoded vector of pairs `(HeaderKey, HeaderValue)`. + /// - In case invalid `id` is passed it returns a pointer to parity-encoded empty vector. + fn ext_http_response_headers( + id: u32, + written_out: *mut u32 + ) -> *mut u8; + + /// Read a chunk of body response to given buffer. + /// + /// Passing `0` as deadline blocks forever. + /// + /// # Returns + /// + /// The number of bytes written if successful, + /// - if it's `0` it means response has been fully consumed, + /// - if it's greater than `u32::max_value() - 255` it means reading body failed. + /// + /// In case of failure, the error code should be mapped to `HttpError` + /// in a following manner: + /// - `u32::max_value()` HttpError code 1 (DeadlineReached) + /// - `u32::max_value() - 1` HttpError code 2 (IoError) + /// The rest is reserved for potential future errors. + fn ext_http_response_read_body( + id: u32, + buffer: *mut u8, + buffer_len: u32, + deadline: u64 + ) -> u32; } } @@ -343,14 +587,7 @@ impl StorageApi for () { let mut length: u32 = 0; unsafe { let ptr = ext_get_allocated_storage.get()(key.as_ptr(), key.len() as u32, &mut length); - if length == u32::max_value() { - None - } else { - // Invariants required by Vec::from_raw_parts are not formally fulfilled. - // We don't allocate via String/Vec, but use a custom allocator instead. - // See #300 for more details. - Some(>::from_raw_parts(ptr, length as usize, length as usize)) - } + from_raw_parts(ptr, length) } } @@ -364,14 +601,7 @@ impl StorageApi for () { key.len() as u32, &mut length ); - if length == u32::max_value() { - None - } else { - // Invariants required by Vec::from_raw_parts are not formally fulfilled. - // We don't allocate via String/Vec, but use a custom allocator instead. - // See #300 for more details. - Some(>::from_raw_parts(ptr, length as usize, length as usize)) - } + from_raw_parts(ptr, length) } } @@ -491,17 +721,14 @@ impl StorageApi for () { storage_key.len() as u32, &mut length ); - // Invariants required by Vec::from_raw_parts are not formally fulfilled. - // We don't allocate via String/Vec, but use a custom allocator instead. - // See #300 for more details. - >::from_raw_parts(ptr, length as usize, length as usize) + from_raw_parts(ptr, length).expect("ext_child_storage_root never returns u32::max_value; qed") } } - fn storage_changes_root(parent_hash: [u8; 32], parent_num: u64) -> Option<[u8; 32]> { + fn storage_changes_root(parent_hash: [u8; 32]) -> Option<[u8; 32]> { let mut result: [u8; 32] = Default::default(); let is_set = unsafe { - ext_storage_changes_root.get()(parent_hash.as_ptr(), parent_hash.len() as u32, parent_num, result.as_mut_ptr()) + ext_storage_changes_root.get()(parent_hash.as_ptr(), parent_hash.len() as u32, result.as_mut_ptr()) }; if is_set != 0 { @@ -624,12 +851,273 @@ impl CryptoApi for () { } impl OffchainApi for () { - fn submit_extrinsic(data: &T) { + fn submit_transaction(data: &T) -> Result<(), ()> { let encoded_data = codec::Encode::encode(data); + let ret = unsafe { + ext_submit_transaction.get()(encoded_data.as_ptr(), encoded_data.len() as u32) + }; + + if ret == 0 { + Ok(()) + } else { + Err(()) + } + } + + fn new_crypto_key(crypto: offchain::CryptoKind) -> Result { + let crypto = crypto as u8 as u32; + let ret = unsafe { + ext_new_crypto_key.get()(crypto) + }; + + if ret > u16::max_value() as u32 { + Err(()) + } else { + Ok(offchain::CryptoKeyId(ret as u16)) + } + } + + fn encrypt(key: Option, data: &[u8]) -> Result, ()> { + let key = key.map(|x| x.0 as u32).unwrap_or(0); + let mut len = 0_u32; + unsafe { + let ptr = ext_encrypt.get()(key, data.as_ptr(), data.len() as u32, &mut len); + + from_raw_parts(ptr, len).ok_or(()) + } + } + + fn decrypt(key: Option, data: &[u8]) -> Result, ()> { + let key = key.map(|x| x.0 as u32).unwrap_or(0); + let mut len = 0_u32; + unsafe { + let ptr = ext_decrypt.get()(key, data.as_ptr(), data.len() as u32, &mut len); + + from_raw_parts(ptr, len).ok_or(()) + } + } + + fn sign(key: Option, data: &[u8]) -> Result, ()> { + let key = key.map(|x| x.0 as u32).unwrap_or(0); + let mut len = 0_u32; + unsafe { + let ptr = ext_sign.get()(key, data.as_ptr(), data.len() as u32, &mut len); + + from_raw_parts(ptr, len).ok_or(()) + } + } + + fn verify(key: Option, msg: &[u8], signature: &[u8]) -> Result { + let key = key.map(|x| x.0 as u32).unwrap_or(0); + let val = unsafe { + ext_verify.get()( + key, + msg.as_ptr(), + msg.len() as u32, + signature.as_ptr(), + signature.len() as u32, + ) + }; + + match val { + 0 => Ok(true), + 1 => Ok(false), + _ => Err(()), + } + } + + fn timestamp() -> offchain::Timestamp { + offchain::Timestamp::from_unix_millis(unsafe { + ext_timestamp.get()() + }) + } + + fn sleep_until(deadline: Timestamp) { unsafe { - ext_submit_extrinsic.get()(encoded_data.as_ptr(), encoded_data.len() as u32) + ext_sleep_until.get()(deadline.unix_millis()) } } + + fn random_seed() -> [u8; 32] { + let mut result = [0_u8; 32]; + unsafe { + ext_random_seed.get()(result.as_mut_ptr()) + } + result + } + + fn local_storage_set(key: &[u8], value: &[u8]) { + unsafe { + ext_local_storage_set.get()( + key.as_ptr(), + key.len() as u32, + value.as_ptr(), + value.len() as u32, + ) + } + } + + fn local_storage_compare_and_set(key: &[u8], old_value: &[u8], new_value: &[u8]) { + unsafe { + ext_local_storage_compare_and_set.get()( + key.as_ptr(), + key.len() as u32, + old_value.as_ptr(), + old_value.len() as u32, + new_value.as_ptr(), + new_value.len() as u32, + ) + } + } + + fn local_storage_get(key: &[u8]) -> Option> { + let mut len = 0u32; + unsafe { + let ptr = ext_local_storage_get.get()( + key.as_ptr(), + key.len() as u32, + &mut len, + ); + + from_raw_parts(ptr, len) + } + } + + fn http_request_start(method: &str, url: &str, meta: &[u8]) -> Result { + let method = method.as_bytes(); + let url = url.as_bytes(); + + let result = unsafe { + ext_http_request_start.get()( + method.as_ptr(), + method.len() as u32, + url.as_ptr(), + url.len() as u32, + meta.as_ptr(), + meta.len() as u32, + ) + }; + + if result > u16::max_value() as u32 { + Err(()) + } else { + Ok(offchain::HttpRequestId(result as u16)) + } + } + + fn http_request_add_header(request_id: offchain::HttpRequestId, name: &str, value: &str) -> Result<(), ()> { + let name = name.as_bytes(); + let value = value.as_bytes(); + + let result = unsafe { + ext_http_request_add_header.get()( + request_id.0 as u32, + name.as_ptr(), + name.len() as u32, + value.as_ptr(), + value.len() as u32, + ) + }; + + if result == 0 { + Ok(()) + } else { + Err(()) + } + } + + fn http_request_write_body( + request_id: offchain::HttpRequestId, + chunk: &[u8], + deadline: Option + ) -> Result<(), offchain::HttpError> { + let res = unsafe { + ext_http_request_write_body.get()( + request_id.0 as u32, + chunk.as_ptr(), + chunk.len() as u32, + deadline.map_or(0, |x| x.unix_millis()), + ) + }; + + if res == 0 { + Ok(()) + } else { + Err(res.try_into().unwrap_or(offchain::HttpError::IoError)) + } + } + + fn http_response_wait( + ids: &[offchain::HttpRequestId], + deadline: Option + ) -> Vec { + let ids = ids.iter().map(|x| x.0 as u32).collect::>(); + let mut statuses = Vec::new(); + statuses.resize(ids.len(), 0u32); + + unsafe { + ext_http_response_wait.get()( + ids.as_ptr(), + ids.len() as u32, + statuses.as_mut_ptr(), + deadline.map_or(0, |x| x.unix_millis()), + ) + } + + statuses + .into_iter() + .map(|status| status.try_into().unwrap_or(offchain::HttpRequestStatus::Unknown)) + .collect() + } + + fn http_response_headers( + request_id: offchain::HttpRequestId, + ) -> Vec<(Vec, Vec)> { + let mut len = 0u32; + let raw_result = unsafe { + let ptr = ext_http_response_headers.get()( + request_id.0 as u32, + &mut len, + ); + + from_raw_parts(ptr, len).expect("ext_http_response_headers never return u32::max_value; qed") + }; + + codec::Decode::decode(&mut &*raw_result).unwrap_or_default() + } + + fn http_response_read_body( + request_id: offchain::HttpRequestId, + buffer: &mut [u8], + deadline: Option, + ) -> Result { + let res = unsafe { + ext_http_response_read_body.get()( + request_id.0 as u32, + buffer.as_mut_ptr(), + buffer.len() as u32, + deadline.map_or(0, |x| x.unix_millis()), + ) + }; + + if res >= u32::max_value() - 255 { + let code = (u32::max_value() - res) + 1; + code.try_into().map_err(|_| offchain::HttpError::IoError) + } else { + Ok(res as usize) + } + } +} + +unsafe fn from_raw_parts(ptr: *mut u8, len: u32) -> Option> { + if len == u32::max_value() { + None + } else { + // Invariants required by Vec::from_raw_parts are not formally fulfilled. + // We don't allocate via String/Vec, but use a custom allocator instead. + // See #300 for more details. + Some(>::from_raw_parts(ptr, len as usize, len as usize)) + } } impl Api for () {} diff --git a/core/sr-primitives/Cargo.toml b/core/sr-primitives/Cargo.toml index 39ee3d1e85929d075ba3c47275601c921dc81e88..b549b4c71e0a69d9ed570d61dec6bb47b770e89b 100644 --- a/core/sr-primitives/Cargo.toml +++ b/core/sr-primitives/Cargo.toml @@ -8,7 +8,7 @@ edition = "2018" num-traits = { version = "0.2", default-features = false } integer-sqrt = { version = "0.1.2" } serde = { version = "1.0", optional = true, features = ["derive"] } -parity-codec = { version = "3.3", default-features = false, features = ["derive"] } +codec = { package = "parity-codec", version = "3.5.1", default-features = false, features = ["derive"] } substrate-primitives = { path = "../primitives", default-features = false } rstd = { package = "sr-std", path = "../sr-std", default-features = false } runtime_io = { package = "sr-io", path = "../sr-io", default-features = false } @@ -16,6 +16,7 @@ log = { version = "0.4", optional = true } [dev-dependencies] serde_json = "1.0" +primitive-types = "0.2" [features] default = ["std"] @@ -25,6 +26,6 @@ std = [ "log", "rstd/std", "runtime_io/std", - "parity-codec/std", + "codec/std", "substrate-primitives/std", ] diff --git a/core/sr-primitives/src/generic/checked_extrinsic.rs b/core/sr-primitives/src/generic/checked_extrinsic.rs index c0548c26e598ea51ce692fe4402e2fdb74cb86da..ee43b3af2e951ef78e63ff396d22edd3c0a5f2ea 100644 --- a/core/sr-primitives/src/generic/checked_extrinsic.rs +++ b/core/sr-primitives/src/generic/checked_extrinsic.rs @@ -18,6 +18,7 @@ //! stage. use crate::traits::{self, Member, SimpleArithmetic, MaybeDisplay}; +use crate::weights::{Weighable, Weight}; /// Definition of something that the external world might want to say; its /// existence implies that it has been checked and is good, particularly with @@ -32,8 +33,7 @@ pub struct CheckedExtrinsic { pub function: Call, } -impl traits::Applyable - for CheckedExtrinsic +impl traits::Applyable for CheckedExtrinsic where AccountId: Member + MaybeDisplay, Index: Member + MaybeDisplay + SimpleArithmetic, @@ -55,3 +55,12 @@ where (self.function, self.signed.map(|x| x.0)) } } + +impl Weighable for CheckedExtrinsic +where + Call: Weighable, +{ + fn weight(&self, len: usize) -> Weight { + self.function.weight(len) + } +} diff --git a/core/sr-primitives/src/generic/digest.rs b/core/sr-primitives/src/generic/digest.rs index 265ceb5941a3d71ae30278dff781c467ebabb542..5edb370e50c4e14e651512be20c2defe824a89d8 100644 --- a/core/sr-primitives/src/generic/digest.rs +++ b/core/sr-primitives/src/generic/digest.rs @@ -22,69 +22,87 @@ use serde::Serialize; use rstd::prelude::*; use crate::ConsensusEngineId; -use crate::codec::{Decode, Encode, Codec, Input}; -use crate::traits::{self, Member, DigestItem as DigestItemT, MaybeHash}; +use crate::codec::{Decode, Encode, Input}; /// Generic header digest. #[derive(PartialEq, Eq, Clone, Encode, Decode)] #[cfg_attr(feature = "std", derive(Debug, Serialize))] -pub struct Digest { +pub struct Digest { /// A list of logs in the digest. - pub logs: Vec, + pub logs: Vec>, } -impl Default for Digest { +impl Default for Digest { fn default() -> Self { Digest { logs: Vec::new(), } } } -impl traits::Digest for Digest where - Item: DigestItemT + Codec -{ - type Hash = Item::Hash; - type Item = Item; - - fn logs(&self) -> &[Self::Item] { +impl Digest { + /// Get reference to all digest items. + pub fn logs(&self) -> &[DigestItem] { &self.logs } - fn push(&mut self, item: Self::Item) { + /// Push new digest item. + pub fn push(&mut self, item: DigestItem) { self.logs.push(item); } - fn pop(&mut self) -> Option { + /// Pop a digest item. + pub fn pop(&mut self) -> Option> { self.logs.pop() } + + /// Get reference to the first digest item that matches the passed predicate. + pub fn log) -> Option<&T>>(&self, predicate: F) -> Option<&T> { + self.logs().iter() + .filter_map(predicate) + .next() + } + + /// Get a conversion of the first digest item that successfully converts using the function. + pub fn convert_first) -> Option>(&self, predicate: F) -> Option { + self.logs().iter() + .filter_map(predicate) + .next() + } } + /// Digest item that is able to encode/decode 'system' digest items and /// provide opaque access to other items. #[derive(PartialEq, Eq, Clone)] #[cfg_attr(feature = "std", derive(Debug))] -#[allow(deprecated)] -pub enum DigestItem { - /// System digest item announcing that authorities set has been changed - /// in the block. Contains the new set of authorities. - AuthoritiesChange(Vec), +pub enum DigestItem { /// System digest item that contains the root of changes trie at given /// block. It is created for every block iff runtime supports changes /// trie creation. ChangesTrieRoot(Hash), - /// The old way to put a Seal on it. Deprecated. - #[deprecated( - since = "1.0", - note = "New versions of Substrate will never generate this, and it will be rejected on new blockchains.", - )] - Seal(u64, SealSignature), - /// Put a Seal on it + + /// A pre-runtime digest. + /// + /// These are messages from the consensus engine to the runtime, although + /// the consensus engine can (and should) read them itself to avoid + /// code and state duplication. It is erroneous for a runtime to produce + /// these, but this is not (yet) checked. + PreRuntime(ConsensusEngineId, Vec), + + /// A message from the runtime to the consensus engine. This should *never* + /// be generated by the native code of any consensus engine, but this is not + /// checked (yet). Consensus(ConsensusEngineId, Vec), - /// Any 'non-system' digest item, opaque to the native code. + + /// Put a Seal on it. This is only used by native code, and is never seen + /// by runtimes. + Seal(ConsensusEngineId, Vec), + + /// Some other thing. Unsupported and experimental. Other(Vec), } #[cfg(feature = "std")] -impl ::serde::Serialize for DigestItem { +impl ::serde::Serialize for DigestItem { fn serialize(&self, seq: S) -> Result where S: ::serde::Serializer { self.using_encoded(|bytes| { ::substrate_primitives::bytes::serialize(bytes, seq) @@ -92,25 +110,29 @@ impl ::serde::Serializ } } - /// A 'referencing view' for digest item. Does not own its contents. Used by /// final runtime implementations for encoding/decoding its log items. #[derive(PartialEq, Eq, Clone)] #[cfg_attr(feature = "std", derive(Debug))] -#[allow(deprecated)] -pub enum DigestItemRef<'a, Hash: 'a, AuthorityId: 'a, SealSignature: 'a> { - /// Reference to `DigestItem::AuthoritiesChange`. - AuthoritiesChange(&'a [AuthorityId]), +pub enum DigestItemRef<'a, Hash: 'a> { /// Reference to `DigestItem::ChangesTrieRoot`. ChangesTrieRoot(&'a Hash), - /// A deprecated sealed signature for testing - #[deprecated] - Seal(&'a u64, &'a SealSignature), - /// A sealed signature for testing - Consensus(&'a ConsensusEngineId, &'a [u8]), + /// A pre-runtime digest. + /// + /// These are messages from the consensus engine to the runtime, although + /// the consensus engine can (and should) read them itself to avoid + /// code and state duplication. It is erroneous for a runtime to produce + /// these, but this is not (yet) checked. + PreRuntime(&'a ConsensusEngineId, &'a Vec), + /// A message from the runtime to the consensus engine. This should *never* + /// be generated by the native code of any consensus engine, but this is not + /// checked (yet). + Consensus(&'a ConsensusEngineId, &'a Vec), + /// Put a Seal on it. This is only used by native code, and is never seen + /// by runtimes. + Seal(&'a ConsensusEngineId, &'a Vec), /// Any 'non-system' digest item, opaque to the native code. - /// Reference to `DigestItem::Other`. - Other(&'a [u8]), + Other(&'a Vec), } /// Type of the digest item. Used to gain explicit control over `DigestItem` encoding @@ -119,78 +141,106 @@ pub enum DigestItemRef<'a, Hash: 'a, AuthorityId: 'a, SealSignature: 'a> { /// trait for `DigestItemRef`. #[repr(u32)] #[derive(Encode, Decode)] -enum DigestItemType { - Other = 0, - AuthoritiesChange = 1, +pub enum DigestItemType { ChangesTrieRoot = 2, - Seal = 3, + PreRuntime = 6, Consensus = 4, + Seal = 5, + Other = 0, } -impl DigestItem { - /// Returns Some if `self` is a `DigestItem::Other`. - pub fn as_other(&self) -> Option<&Vec> { - match *self { - DigestItem::Other(ref v) => Some(v), - _ => None, - } - } +/// Type of a digest item that contains raw data; this also names the consensus engine ID where +/// applicable. Used to identify one or more digest items of interest. +#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd)] +pub enum OpaqueDigestItemId<'a> { + /// Type corresponding to DigestItem::PreRuntime. + PreRuntime(&'a ConsensusEngineId), + /// Type corresponding to DigestItem::Consensus. + Consensus(&'a ConsensusEngineId), + /// Type corresponding to DigestItem::Seal. + Seal(&'a ConsensusEngineId), + /// Some other (non-prescribed) type. + Other, +} +impl DigestItem { /// Returns a 'referencing view' for this digest item. - #[allow(deprecated)] - fn dref<'a>(&'a self) -> DigestItemRef<'a, Hash, AuthorityId, SealSignature> { + pub fn dref<'a>(&'a self) -> DigestItemRef<'a, Hash> { match *self { - DigestItem::AuthoritiesChange(ref v) => DigestItemRef::AuthoritiesChange(v), DigestItem::ChangesTrieRoot(ref v) => DigestItemRef::ChangesTrieRoot(v), - DigestItem::Seal(ref v, ref s) => DigestItemRef::Seal(v, s), + DigestItem::PreRuntime(ref v, ref s) => DigestItemRef::PreRuntime(v, s), DigestItem::Consensus(ref v, ref s) => DigestItemRef::Consensus(v, s), + DigestItem::Seal(ref v, ref s) => DigestItemRef::Seal(v, s), DigestItem::Other(ref v) => DigestItemRef::Other(v), } } -} -impl< - Hash: Codec + Member, - AuthorityId: Codec + Member + MaybeHash, - SealSignature: Codec + Member, -> traits::DigestItem for DigestItem { - type Hash = Hash; - type AuthorityId = AuthorityId; + /// Returns `Some` if the entry is the `ChangesTrieRoot` entry. + pub fn as_changes_trie_root(&self) -> Option<&Hash> { + self.dref().as_changes_trie_root() + } + + /// Returns `Some` if this entry is the `PreRuntime` entry. + pub fn as_pre_runtime(&self) -> Option<(ConsensusEngineId, &[u8])> { + self.dref().as_pre_runtime() + } - fn as_authorities_change(&self) -> Option<&[Self::AuthorityId]> { - self.dref().as_authorities_change() + /// Returns `Some` if this entry is the `Consensus` entry. + pub fn as_consensus(&self) -> Option<(ConsensusEngineId, &[u8])> { + self.dref().as_consensus() } - fn as_changes_trie_root(&self) -> Option<&Self::Hash> { - self.dref().as_changes_trie_root() + /// Returns `Some` if this entry is the `Seal` entry. + pub fn as_seal(&self) -> Option<(ConsensusEngineId, &[u8])> { + self.dref().as_seal() + } + + /// Returns Some if `self` is a `DigestItem::Other`. + pub fn as_other(&self) -> Option<&[u8]> { + match *self { + DigestItem::Other(ref v) => Some(&v[..]), + _ => None, + } + } + + /// Returns the opaque data contained in the item if `Some` if this entry has the id given. + pub fn try_as_raw(&self, id: OpaqueDigestItemId) -> Option<&[u8]> { + self.dref().try_as_raw(id) + } + + /// Returns the data contained in the item if `Some` if this entry has the id given, decoded + /// to the type provided `T`. + pub fn try_to(&self, id: OpaqueDigestItemId) -> Option { + self.dref().try_to::(id) } } -impl Encode for DigestItem { +impl Encode for DigestItem { fn encode(&self) -> Vec { self.dref().encode() } } -impl Decode for DigestItem { +impl Decode for DigestItem { #[allow(deprecated)] fn decode(input: &mut I) -> Option { let item_type: DigestItemType = Decode::decode(input)?; match item_type { - DigestItemType::AuthoritiesChange => Some(DigestItem::AuthoritiesChange( - Decode::decode(input)?, - )), DigestItemType::ChangesTrieRoot => Some(DigestItem::ChangesTrieRoot( Decode::decode(input)?, )), - DigestItemType::Seal => { - let vals: (u64, SealSignature) = Decode::decode(input)?; - Some(DigestItem::Seal(vals.0, vals.1)) + DigestItemType::PreRuntime => { + let vals: (ConsensusEngineId, Vec) = Decode::decode(input)?; + Some(DigestItem::PreRuntime(vals.0, vals.1)) }, DigestItemType::Consensus => { let vals: (ConsensusEngineId, Vec) = Decode::decode(input)?; Some(DigestItem::Consensus(vals.0, vals.1)) } + DigestItemType::Seal => { + let vals: (ConsensusEngineId, Vec) = Decode::decode(input)?; + Some(DigestItem::Seal(vals.0, vals.1)) + }, DigestItemType::Other => Some(DigestItem::Other( Decode::decode(input)?, )), @@ -198,45 +248,87 @@ impl Decode for Digest } } -impl<'a, Hash: Codec + Member, AuthorityId: Codec + Member, SealSignature: Codec + Member> DigestItemRef<'a, Hash, AuthorityId, SealSignature> { - /// Cast this digest item into `AuthoritiesChange`. - pub fn as_authorities_change(&self) -> Option<&'a [AuthorityId]> { +impl<'a, Hash> DigestItemRef<'a, Hash> { + /// Cast this digest item into `ChangesTrieRoot`. + pub fn as_changes_trie_root(&self) -> Option<&'a Hash> { + match *self { + DigestItemRef::ChangesTrieRoot(ref changes_trie_root) => Some(changes_trie_root), + _ => None, + } + } + + /// Cast this digest item into `PreRuntime` + pub fn as_pre_runtime(&self) -> Option<(ConsensusEngineId, &'a [u8])> { match *self { - DigestItemRef::AuthoritiesChange(ref authorities) => Some(authorities), + DigestItemRef::PreRuntime(consensus_engine_id, ref data) => Some((*consensus_engine_id, data)), _ => None, } } - /// Cast this digest item into `ChangesTrieRoot`. - pub fn as_changes_trie_root(&self) -> Option<&'a Hash> { + /// Cast this digest item into `Consensus` + pub fn as_consensus(&self) -> Option<(ConsensusEngineId, &'a [u8])> { match *self { - DigestItemRef::ChangesTrieRoot(ref changes_trie_root) => Some(changes_trie_root), + DigestItemRef::Consensus(consensus_engine_id, ref data) => Some((*consensus_engine_id, data)), + _ => None, + } + } + + /// Cast this digest item into `Seal` + pub fn as_seal(&self) -> Option<(ConsensusEngineId, &'a [u8])> { + match *self { + DigestItemRef::Seal(consensus_engine_id, ref data) => Some((*consensus_engine_id, data)), + _ => None, + } + } + + /// Cast this digest item into `PreRuntime` + pub fn as_other(&self) -> Option<&'a [u8]> { + match *self { + DigestItemRef::Other(ref data) => Some(data), + _ => None, + } + } + + /// Try to match this digest item to the given opaque item identifier; if it matches, then + /// return the opaque data it contains. + pub fn try_as_raw(&self, id: OpaqueDigestItemId) -> Option<&'a [u8]> { + match (id, self) { + (OpaqueDigestItemId::Consensus(w), &DigestItemRef::Consensus(v, s)) | + (OpaqueDigestItemId::Seal(w), &DigestItemRef::Seal(v, s)) | + (OpaqueDigestItemId::PreRuntime(w), &DigestItemRef::PreRuntime(v, s)) + if v == w => Some(&s[..]), + (OpaqueDigestItemId::Other, &DigestItemRef::Other(s)) => Some(&s[..]), _ => None, } } + + /// Try to match this digest item to the given opaque item identifier; if it matches, then + /// try to cast to the given datatype; if that works, return it. + pub fn try_to(&self, id: OpaqueDigestItemId) -> Option { + self.try_as_raw(id).and_then(|mut x| Decode::decode(&mut x)) + } } -#[allow(deprecated)] -impl<'a, Hash: Encode, AuthorityId: Encode, SealSignature: Encode> Encode for DigestItemRef<'a, Hash, AuthorityId, SealSignature> { +impl<'a, Hash: Encode> Encode for DigestItemRef<'a, Hash> { fn encode(&self) -> Vec { let mut v = Vec::new(); match *self { - DigestItemRef::AuthoritiesChange(authorities) => { - DigestItemType::AuthoritiesChange.encode_to(&mut v); - authorities.encode_to(&mut v); - }, DigestItemRef::ChangesTrieRoot(changes_trie_root) => { DigestItemType::ChangesTrieRoot.encode_to(&mut v); changes_trie_root.encode_to(&mut v); }, + DigestItemRef::Consensus(val, data) => { + DigestItemType::Consensus.encode_to(&mut v); + (val, data).encode_to(&mut v); + }, DigestItemRef::Seal(val, sig) => { DigestItemType::Seal.encode_to(&mut v); (val, sig).encode_to(&mut v); }, - DigestItemRef::Consensus(val, sig) => { - DigestItemType::Consensus.encode_to(&mut v); - (val, sig).encode_to(&mut v); + DigestItemRef::PreRuntime(val, data) => { + DigestItemType::PreRuntime.encode_to(&mut v); + (val, data).encode_to(&mut v); }, DigestItemRef::Other(val) => { DigestItemType::Other.encode_to(&mut v); @@ -251,23 +343,20 @@ impl<'a, Hash: Encode, AuthorityId: Encode, SealSignature: Encode> Encode for Di #[cfg(test)] mod tests { use super::*; - use substrate_primitives::hash::H512 as Signature; #[test] - #[allow(deprecated)] fn should_serialize_digest() { let digest = Digest { logs: vec![ - DigestItem::AuthoritiesChange(vec![1]), DigestItem::ChangesTrieRoot(4), - DigestItem::Seal(1, Signature::from_low_u64_be(15)), DigestItem::Other(vec![1, 2, 3]), + DigestItem::Seal(*b"test", vec![1, 2, 3]) ], }; assert_eq!( ::serde_json::to_string(&digest).unwrap(), - r#"{"logs":["0x010401000000","0x0204000000","0x0301000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f","0x000c010203"]}"# + r#"{"logs":["0x0204000000","0x000c010203","0x05746573740c010203"]}"# ); } } diff --git a/core/sr-primitives/src/generic/era.rs b/core/sr-primitives/src/generic/era.rs index 22f47b6769df403549da754d50c115065b892367..c41d3eedfc24ecb7c64906ce67778618e87faad8 100644 --- a/core/sr-primitives/src/generic/era.rs +++ b/core/sr-primitives/src/generic/era.rs @@ -21,7 +21,10 @@ use serde::{Serialize, Deserialize}; use crate::codec::{Decode, Encode, Input, Output}; +/// Era period pub type Period = u64; + +/// Era phase pub type Phase = u64; /// An era to describe the longevity of a transaction. diff --git a/core/sr-primitives/src/generic/header.rs b/core/sr-primitives/src/generic/header.rs index efcc7614ed7c8e725f57796691b2ba3bf5c5ed4a..887aedc81807deae1a8913b95a5d6db8941d6fe0 100644 --- a/core/sr-primitives/src/generic/header.rs +++ b/core/sr-primitives/src/generic/header.rs @@ -18,9 +18,13 @@ #[cfg(feature = "std")] use serde::Serialize; +#[cfg(feature = "std")] +use log::debug; use crate::codec::{Decode, Encode, Codec, Input, Output, HasCompact, EncodeAsRef}; -use crate::traits::{self, Member, SimpleArithmetic, SimpleBitOps, MaybeDisplay, - Hash as HashT, DigestItem as DigestItemT, MaybeSerializeDebug, MaybeSerializeDebugButNotDeserialize}; +use crate::traits::{ + self, Member, SimpleArithmetic, SimpleBitOps, MaybeDisplay, Hash as HashT, MaybeSerializeDebug, + MaybeSerializeDebugButNotDeserialize +}; use crate::generic::Digest; /// Abstraction over a block header for a substrate chain. @@ -28,7 +32,7 @@ use crate::generic::Digest; #[cfg_attr(feature = "std", derive(Debug, Serialize))] #[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] #[cfg_attr(feature = "std", serde(deny_unknown_fields))] -pub struct Header, Hash: HashT, DigestItem> { +pub struct Header, Hash: HashT> { /// The parent hash. pub parent_hash: ::Output, /// The block number. @@ -39,7 +43,7 @@ pub struct Header, Hash: HashT, DigestItem> { /// The merkle root of the extrinsics. pub extrinsics_root: ::Output, /// A chain-specific digest of data useful for light clients or referencing auxiliary data. - pub digest: Digest, + pub digest: Digest<::Output>, } #[cfg(feature = "std")] @@ -51,11 +55,10 @@ pub fn serialize_number>(val: &T, s: S) -> Result Decode for Header where +impl Decode for Header where Number: HasCompact + Copy + Into, Hash: HashT, Hash::Output: Decode, - DigestItem: DigestItemT + Decode, { fn decode(input: &mut I) -> Option { Some(Header { @@ -68,11 +71,10 @@ impl Decode for Header where } } -impl Encode for Header where +impl Encode for Header where Number: HasCompact + Copy + Into, Hash: HashT, Hash::Output: Encode, - DigestItem: DigestItemT + Encode, { fn encode_to(&self, dest: &mut T) { dest.push(&self.parent_hash); @@ -83,16 +85,14 @@ impl Encode for Header where } } -impl traits::Header for Header where +impl traits::Header for Header where Number: Member + MaybeSerializeDebug + ::rstd::hash::Hash + MaybeDisplay + SimpleArithmetic + Codec + Copy + Into, Hash: HashT, - DigestItem: DigestItemT + Codec, Hash::Output: Default + ::rstd::hash::Hash + Copy + Member + MaybeSerializeDebugButNotDeserialize + MaybeDisplay + SimpleBitOps + Codec, { type Number = Number; type Hash = ::Output; type Hashing = Hash; - type Digest = Digest; fn number(&self) -> &Self::Number { &self.number } fn set_number(&mut self, num: Self::Number) { self.number = num } @@ -106,31 +106,37 @@ impl traits::Header for Header &Self::Hash { &self.parent_hash } fn set_parent_hash(&mut self, hash: Self::Hash) { self.parent_hash = hash } - fn digest(&self) -> &Self::Digest { &self.digest } - fn digest_mut(&mut self) -> &mut Self::Digest { &mut self.digest } - fn set_digest(&mut self, digest: Self::Digest) { self.digest = digest } + fn digest(&self) -> &Digest { &self.digest } + + #[cfg(feature = "std")] + fn digest_mut(&mut self) -> &mut Digest { + debug!(target: "header", "Retrieving mutable reference to digest"); + &mut self.digest + } + + #[cfg(not(feature = "std"))] + fn digest_mut(&mut self) -> &mut Digest { &mut self.digest } fn new( number: Self::Number, extrinsics_root: Self::Hash, state_root: Self::Hash, parent_hash: Self::Hash, - digest: Self::Digest + digest: Digest, ) -> Self { Header { number, extrinsics_root, state_root, parent_hash, - digest + digest, } } } -impl Header where +impl Header where Number: Member + ::rstd::hash::Hash + Copy + MaybeDisplay + SimpleArithmetic + Codec + Into, Hash: HashT, - DigestItem: DigestItemT + Codec, Hash::Output: Default + ::rstd::hash::Hash + Copy + Member + MaybeDisplay + SimpleBitOps + Codec, { /// Convenience helper for computing the hash of the header without having diff --git a/core/sr-primitives/src/generic/mod.rs b/core/sr-primitives/src/generic/mod.rs index b0f86f959fe6285b037826dd7e27da1d50ee8adb..a4e4106780efcf4c58926a9cc5c5f8a05438268c 100644 --- a/core/sr-primitives/src/generic/mod.rs +++ b/core/sr-primitives/src/generic/mod.rs @@ -32,11 +32,13 @@ mod tests; pub use self::unchecked_extrinsic::UncheckedExtrinsic; pub use self::unchecked_mortal_extrinsic::UncheckedMortalExtrinsic; pub use self::unchecked_mortal_compact_extrinsic::UncheckedMortalCompactExtrinsic; -pub use self::era::Era; +pub use self::era::{Era, Phase}; pub use self::checked_extrinsic::CheckedExtrinsic; pub use self::header::Header; pub use self::block::{Block, SignedBlock, BlockId}; -pub use self::digest::{Digest, DigestItem, DigestItemRef}; +pub use self::digest::{ + Digest, DigestItem, DigestItemRef, OpaqueDigestItemId +}; use crate::codec::Encode; use rstd::prelude::*; @@ -44,8 +46,8 @@ use rstd::prelude::*; fn encode_with_vec_prefix)>(encoder: F) -> Vec { let size = ::rstd::mem::size_of::(); let reserve = match size { - 0...0b00111111 => 1, - 0...0b00111111_11111111 => 2, + 0..=0b00111111 => 1, + 0..=0b00111111_11111111 => 2, _ => 4, }; let mut v = Vec::with_capacity(reserve + size); diff --git a/core/sr-primitives/src/generic/tests.rs b/core/sr-primitives/src/generic/tests.rs index b42c05ea4cd4293960a241fd2f325df074bb28f2..fe2ec2fe56ea5b530df16bb59186f2972f9a408e 100644 --- a/core/sr-primitives/src/generic/tests.rs +++ b/core/sr-primitives/src/generic/tests.rs @@ -17,31 +17,34 @@ //! Tests for the generic implementations of Extrinsic/Header/Block. use crate::codec::{Decode, Encode}; -use substrate_primitives::{H256, H512}; +use substrate_primitives::H256; use super::DigestItem; #[test] fn system_digest_item_encoding() { - let item = DigestItem::AuthoritiesChange::(vec![10, 20, 30]); + let item = DigestItem::ChangesTrieRoot::(H256::default()); let encoded = item.encode(); assert_eq!(encoded, vec![ - // type = DigestItemType::AuthoritiesChange - 1, - // number of items in authorities set - 12, - // authorities - 10, 0, 0, 0, - 20, 0, 0, 0, - 30, 0, 0, 0, + // type = DigestItemType::ChangesTrieRoot + 2, + // trie root + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, ]); - let decoded: DigestItem = Decode::decode(&mut &encoded[..]).unwrap(); + let decoded: DigestItem = Decode::decode(&mut &encoded[..]).unwrap(); assert_eq!(item, decoded); } #[test] fn non_system_digest_item_encoding() { - let item = DigestItem::Other::(vec![10, 20, 30]); + let item = DigestItem::Other::(vec![10, 20, 30]); let encoded = item.encode(); assert_eq!(encoded, vec![ // type = DigestItemType::Other @@ -52,6 +55,6 @@ fn non_system_digest_item_encoding() { 10, 20, 30, ]); - let decoded: DigestItem = Decode::decode(&mut &encoded[..]).unwrap(); + let decoded: DigestItem = Decode::decode(&mut &encoded[..]).unwrap(); assert_eq!(item, decoded); } diff --git a/core/sr-primitives/src/generic/unchecked_mortal_compact_extrinsic.rs b/core/sr-primitives/src/generic/unchecked_mortal_compact_extrinsic.rs index ea9dad2a5023b5f09eb4b2cfe5a99d39848a61e6..36e17fc277cdeed0ef742cb1da20e3203263739e 100644 --- a/core/sr-primitives/src/generic/unchecked_mortal_compact_extrinsic.rs +++ b/core/sr-primitives/src/generic/unchecked_mortal_compact_extrinsic.rs @@ -22,8 +22,8 @@ use std::fmt; use rstd::prelude::*; use runtime_io::blake2_256; use crate::codec::{Decode, Encode, Input, Compact}; -use crate::traits::{self, Member, SimpleArithmetic, MaybeDisplay, CurrentHeight, BlockNumberToHash, Lookup, - Checkable, Extrinsic}; +use crate::traits::{self, Member, SimpleArithmetic, MaybeDisplay, CurrentHeight, BlockNumberToHash, + Lookup, Checkable, Extrinsic, SaturatedConversion}; use super::{CheckedExtrinsic, Era}; const TRANSACTION_VERSION: u8 = 1; @@ -84,7 +84,8 @@ where fn check(self, context: &Context) -> Result { Ok(match self.signature { Some((signed, signature, index, era)) => { - let h = context.block_number_to_hash(BlockNumber::sa(era.birth(context.current_height().as_()))) + let current_u64 = context.current_height().saturated_into::(); + let h = context.block_number_to_hash(era.birth(current_u64).saturated_into()) .ok_or("transaction birth block ancient")?; let signed = context.lookup(signed)?; let raw_payload = (index, self.function, era, h); diff --git a/core/sr-primitives/src/generic/unchecked_mortal_extrinsic.rs b/core/sr-primitives/src/generic/unchecked_mortal_extrinsic.rs index a91f4461fffa2796942524e4087c45ceec06b161..7f92b20edd0c3143e3b35d1dc47327d9f575ec62 100644 --- a/core/sr-primitives/src/generic/unchecked_mortal_extrinsic.rs +++ b/core/sr-primitives/src/generic/unchecked_mortal_extrinsic.rs @@ -22,8 +22,10 @@ use std::fmt; use rstd::prelude::*; use runtime_io::blake2_256; use crate::codec::{Decode, Encode, Input}; -use crate::traits::{self, Member, SimpleArithmetic, MaybeDisplay, CurrentHeight, BlockNumberToHash, Lookup, - Checkable, Extrinsic}; +use crate::traits::{ + self, Member, SimpleArithmetic, MaybeDisplay, CurrentHeight, BlockNumberToHash, + Lookup, Checkable, Extrinsic, SaturatedConversion +}; use super::{CheckedExtrinsic, Era}; const TRANSACTION_VERSION: u8 = 1; @@ -83,7 +85,8 @@ where fn check(self, context: &Context) -> Result { Ok(match self.signature { Some((signed, signature, index, era)) => { - let h = context.block_number_to_hash(BlockNumber::sa(era.birth(context.current_height().as_()))) + let current_u64 = context.current_height().saturated_into::(); + let h = context.block_number_to_hash(era.birth(current_u64).saturated_into()) .ok_or("transaction birth block ancient")?; let signed = context.lookup(signed)?; let raw_payload = (index, self.function, era, h); diff --git a/core/sr-primitives/src/lib.rs b/core/sr-primitives/src/lib.rs index 08c6b3c9a9d38d26a35d82c89f77986e7630b315..007010bc53da16b9d00e650c9bc44e66779b99da 100644 --- a/core/sr-primitives/src/lib.rs +++ b/core/sr-primitives/src/lib.rs @@ -21,25 +21,33 @@ #![cfg_attr(not(feature = "std"), no_std)] #[doc(hidden)] -pub use parity_codec as codec; +pub use codec; #[cfg(feature = "std")] #[doc(hidden)] pub use serde; +#[doc(hidden)] +pub use rstd; #[cfg(feature = "std")] pub use runtime_io::{StorageOverlay, ChildrenStorageOverlay}; -use rstd::prelude::*; +use rstd::{prelude::*, ops}; use substrate_primitives::{crypto, ed25519, sr25519, hash::{H256, H512}}; use codec::{Encode, Decode}; #[cfg(feature = "std")] pub mod testing; +pub mod weights; pub mod traits; +use traits::{SaturatedConversion, UniqueSaturatedInto}; + pub mod generic; pub mod transaction_validity; +/// Re-export these since they're only "kind of" generic. +pub use generic::{DigestItem, Digest}; + /// A message indicating an invalid signature in extrinsic. pub const BAD_SIGNATURE: &str = "bad signature in extrinsic"; @@ -101,12 +109,32 @@ impl BuildStorage for StorageOverlay { fn build_storage(self) -> Result<(StorageOverlay, ChildrenStorageOverlay), String> { Ok((self, Default::default())) } - fn assimilate_storage(self, storage: &mut StorageOverlay, _child_storage: &mut ChildrenStorageOverlay) -> Result<(), String> { + fn assimilate_storage( + self, + storage: &mut StorageOverlay, + _child_storage: &mut ChildrenStorageOverlay + ) -> Result<(), String> { storage.extend(self); Ok(()) } } +#[cfg(feature = "std")] +impl BuildStorage for (StorageOverlay, ChildrenStorageOverlay) { + fn build_storage(self) -> Result<(StorageOverlay, ChildrenStorageOverlay), String> { + Ok(self) + } + fn assimilate_storage( + self, + storage: &mut StorageOverlay, + child_storage: &mut ChildrenStorageOverlay + )-> Result<(), String> { + storage.extend(self.0); + child_storage.extend(self.1); + Ok(()) + } +} + /// Consensus engine unique ID. pub type ConsensusEngineId = [u8; 4]; @@ -116,24 +144,70 @@ pub type ConsensusEngineId = [u8; 4]; pub struct Permill(u32); impl Permill { - /// Wraps the argument into `Permill` type. - pub fn from_millionths(x: u32) -> Permill { Permill(x) } + /// Nothing. + pub fn zero() -> Self { Self(0) } - /// Converts percents into `Permill`. - pub fn from_percent(x: u32) -> Permill { Permill(x * 10_000) } + /// `true` if this is nothing. + pub fn is_zero(&self) -> bool { self.0 == 0 } + + /// Everything. + pub fn one() -> Self { Self(1_000_000) } + + /// From an explicitly defined number of parts per maximum of the type. + pub fn from_parts(x: u32) -> Self { Self(x.min(1_000_000)) } + + /// Converts from a percent. Equal to `x / 100`. + pub fn from_percent(x: u32) -> Self { Self(x.min(100) * 10_000) } /// Converts a fraction into `Permill`. #[cfg(feature = "std")] - pub fn from_fraction(x: f64) -> Permill { Permill((x * 1_000_000.0) as u32) } + pub fn from_fraction(x: f64) -> Self { Self((x * 1_000_000.0) as u32) } + + /// Approximate the fraction `p/q` into a per million fraction + pub fn from_rational_approximation(p: N, q: N) -> Self + where N: traits::SimpleArithmetic + Clone + { + let p = p.min(q.clone()); + let factor = (q.clone() / 1_000_000u32.into()).max(1u32.into()); + + // Conversion can't overflow as p < q so ( p / (q/million)) < million + let p_reduce: u32 = (p / factor.clone()).try_into().unwrap_or_else(|_| panic!()); + let q_reduce: u32 = (q / factor.clone()).try_into().unwrap_or_else(|_| panic!()); + let part = p_reduce as u64 * 1_000_000u64 / q_reduce as u64; + + Permill(part as u32) + } } -impl ::rstd::ops::Mul for Permill +impl ops::Mul for Permill where - N: traits::As + N: Clone + From + UniqueSaturatedInto + ops::Rem + + ops::Div + ops::Mul + ops::Add, { type Output = N; fn mul(self, b: N) -> Self::Output { - >::sa(b.as_().saturating_mul(self.0 as u64) / 1_000_000) + let million: N = 1_000_000.into(); + let part: N = self.0.into(); + + let rem_multiplied_divided = { + let rem = b.clone().rem(million.clone()); + + // `rem` is inferior to one million, thus it fits into u32 + let rem_u32 = rem.saturated_into::(); + + // `self` and `rem` are inferior to one million, thus the product is less than 10^12 + // and fits into u64 + let rem_multiplied_u64 = rem_u32 as u64 * self.0 as u64; + + // `rem_multiplied_u64` is less than 10^12 therefore divided by a million it fits into + // u32 + let rem_multiplied_divided_u32 = (rem_multiplied_u64 / 1_000_000) as u32; + + // `rem_multiplied_divided` is inferior to b, thus it can be converted back to N type + rem_multiplied_divided_u32.into() + }; + + (b / million) * part + rem_multiplied_divided } } @@ -175,39 +249,72 @@ pub struct Perbill(u32); impl Perbill { /// Nothing. - pub fn zero() -> Perbill { Perbill(0) } + pub fn zero() -> Self { Self(0) } /// `true` if this is nothing. pub fn is_zero(&self) -> bool { self.0 == 0 } /// Everything. - pub fn one() -> Perbill { Perbill(1_000_000_000) } + pub fn one() -> Self { Self(1_000_000_000) } - /// Construct new instance where `x` is in billionths. Value equivalent to `x / 1,000,000,000`. - pub fn from_billionths(x: u32) -> Perbill { Perbill(x.min(1_000_000_000)) } + /// From an explicitly defined number of parts per maximum of the type. + pub fn from_parts(x: u32) -> Self { Self(x.min(1_000_000_000)) } - /// Construct new instance where `x` is in millionths. Value equivalent to `x / 1,000,000`. - pub fn from_millionths(x: u32) -> Perbill { Perbill(x.min(1_000_000) * 1000) } + /// Converts from a percent. Equal to `x / 100`. + pub fn from_percent(x: u32) -> Self { Self(x.min(100) * 10_000_000) } - /// Construct new instance where `x` is a percent. Value equivalent to `x%`. - pub fn from_percent(x: u32) -> Perbill { Perbill(x.min(100) * 10_000_000) } + /// Construct new instance where `x` is in millionths. Value equivalent to `x / 1,000,000`. + pub fn from_millionths(x: u32) -> Self { Self(x.min(1_000_000) * 1000) } #[cfg(feature = "std")] /// Construct new instance whose value is equal to `x` (between 0 and 1). - pub fn from_fraction(x: f64) -> Perbill { Perbill((x.max(0.0).min(1.0) * 1_000_000_000.0) as u32) } + pub fn from_fraction(x: f64) -> Self { Self((x.max(0.0).min(1.0) * 1_000_000_000.0) as u32) } - #[cfg(feature = "std")] - /// Construct new instance whose value is equal to `n / d` (between 0 and 1). - pub fn from_rational(n: f64, d: f64) -> Perbill { Perbill(((n / d).max(0.0).min(1.0) * 1_000_000_000.0) as u32) } + /// Approximate the fraction `p/q` into a per billion fraction + pub fn from_rational_approximation(p: N, q: N) -> Self + where N: traits::SimpleArithmetic + Clone + { + let p = p.min(q.clone()); + let factor = (q.clone() / 1_000_000_000u32.into()).max(1u32.into()); + + // Conversion can't overflow as p < q so ( p / (q/billion)) < billion + let p_reduce: u32 = (p / factor.clone()).try_into().unwrap_or_else(|_| panic!()); + let q_reduce: u32 = (q / factor.clone()).try_into().unwrap_or_else(|_| panic!()); + let part = p_reduce as u64 * 1_000_000_000u64 / q_reduce as u64; + + Perbill(part as u32) + } } -impl ::rstd::ops::Mul for Perbill +impl ops::Mul for Perbill where - N: traits::As + N: Clone + From + UniqueSaturatedInto + ops::Rem + + ops::Div + ops::Mul + ops::Add, { type Output = N; fn mul(self, b: N) -> Self::Output { - >::sa(b.as_().saturating_mul(self.0 as u64) / 1_000_000_000) + let billion: N = 1_000_000_000.into(); + let part: N = self.0.into(); + + let rem_multiplied_divided = { + let rem = b.clone().rem(billion.clone()); + + // `rem` is inferior to one billion, thus it fits into u32 + let rem_u32 = rem.saturated_into::(); + + // `self` and `rem` are inferior to one billion, thus the product is less than 10^18 + // and fits into u64 + let rem_multiplied_u64 = rem_u32 as u64 * self.0 as u64; + + // `rem_multiplied_u64` is less than 10^18 therefore divided by a billion it fits into + // u32 + let rem_multiplied_divided_u32 = (rem_multiplied_u64 / 1_000_000_000) as u32; + + // `rem_multiplied_divided` is inferior to b, thus it can be converted back to N type + rem_multiplied_divided_u32.into() + }; + + (b / billion) * part + rem_multiplied_divided } } @@ -241,8 +348,7 @@ impl From> for Perbill { } } -/// PerU128 is parts-per-u128-max-value. It stores a value between 0 and 1 in fixed point and -/// provides a means to multiply some other value by that. +/// PerU128 is parts-per-u128-max-value. It stores a value between 0 and 1 in fixed point. #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] #[derive(Encode, Decode, Default, Copy, Clone, PartialEq, Eq)] pub struct PerU128(u128); @@ -253,11 +359,14 @@ impl PerU128 { /// Nothing. pub fn zero() -> Self { Self(0) } + /// `true` if this is nothing. + pub fn is_zero(&self) -> bool { self.0 == 0 } + /// Everything. pub fn one() -> Self { Self(U128) } - /// Construct new instance where `x` is parts in u128::max_value. Equal to x/U128::max_value. - pub fn from_max_value(x: u128) -> Self { Self(x) } + /// From an explicitly defined number of parts per maximum of the type. + pub fn from_parts(x: u128) -> Self { Self(x) } /// Construct new instance where `x` is denominator and the nominator is 1. pub fn from_xth(x: u128) -> Self { Self(U128/x.max(1)) } @@ -267,8 +376,8 @@ impl ::rstd::ops::Deref for PerU128 { type Target = u128; fn deref(&self) -> &u128 { - &self.0 - } + &self.0 + } } impl codec::CompactAs for PerU128 { @@ -537,140 +646,6 @@ macro_rules! impl_outer_config { } } -/// Generates enum that contains all possible log entries for the runtime. -/// Every individual module of the runtime that is mentioned, must -/// expose a `Log` and `RawLog` enums. -/// -/// Generated enum is binary-compatible with and could be interpreted -/// as `generic::DigestItem`. -/// -/// Runtime requirements: -/// 1) binary representation of all supported 'system' log items should stay -/// the same. Otherwise, the native code will be unable to read log items -/// generated by previous runtime versions -/// 2) the support of 'system' log items should never be dropped by runtime. -/// Otherwise, native code will lost its ability to read items of this type -/// even if they were generated by the versions which have supported these -/// items. -#[macro_export] -macro_rules! impl_outer_log { - ( - $(#[$attr:meta])* - pub enum $name:ident ($internal:ident: DigestItem<$( $genarg:ty ),*>) for $trait:ident { - $( $module:ident $(<$instance:path>)? ( $( $sitem:ident ),* ) ),* - } - ) => { - /// Wrapper for all possible log entries for the `$trait` runtime. Provides binary-compatible - /// `Encode`/`Decode` implementations with the corresponding `generic::DigestItem`. - #[derive(Clone, PartialEq, Eq)] - #[cfg_attr(feature = "std", derive(Debug, $crate::serde::Serialize))] - $(#[$attr])* - #[allow(non_camel_case_types)] - pub struct $name($internal); - - /// All possible log entries for the `$trait` runtime. `Encode`/`Decode` implementations - /// are auto-generated => it is not binary-compatible with `generic::DigestItem`. - #[derive(Clone, PartialEq, Eq, $crate::codec::Encode, $crate::codec::Decode)] - #[cfg_attr(feature = "std", derive(Debug, $crate::serde::Serialize))] - $(#[$attr])* - #[allow(non_camel_case_types)] - pub enum InternalLog { - $( - $module($module::Log<$trait $(, $instance)? >), - )* - } - - impl $name { - /// Try to convert `$name` into `generic::DigestItemRef`. Returns Some when - /// `self` is a 'system' log && it has been marked as 'system' in macro call. - /// Otherwise, None is returned. - #[allow(unreachable_patterns)] - fn dref<'a>(&'a self) -> Option<$crate::generic::DigestItemRef<'a, $($genarg),*>> { - match self.0 { - $($( - $internal::$module($module::RawLog::$sitem(ref v)) => - Some($crate::generic::DigestItemRef::$sitem(v)), - )*)* - _ => None, - } - } - } - - impl $crate::traits::DigestItem for $name { - type Hash = <$crate::generic::DigestItem<$($genarg),*> as $crate::traits::DigestItem>::Hash; - type AuthorityId = <$crate::generic::DigestItem<$($genarg),*> as $crate::traits::DigestItem>::AuthorityId; - - fn as_authorities_change(&self) -> Option<&[Self::AuthorityId]> { - self.dref().and_then(|dref| dref.as_authorities_change()) - } - - fn as_changes_trie_root(&self) -> Option<&Self::Hash> { - self.dref().and_then(|dref| dref.as_changes_trie_root()) - } - } - - impl From<$crate::generic::DigestItem<$($genarg),*>> for $name { - /// Converts `generic::DigestItem` into `$name`. If `generic::DigestItem` represents - /// a system item which is supported by the runtime, it is returned. - /// Otherwise we expect a `Other` log item. Trying to convert from anything other - /// will lead to panic in runtime, since the runtime does not supports this 'system' - /// log item. - #[allow(unreachable_patterns)] - fn from(gen: $crate::generic::DigestItem<$($genarg),*>) -> Self { - match gen { - $($( - $crate::generic::DigestItem::$sitem(value) => - $name($internal::$module($module::RawLog::$sitem(value))), - )*)* - _ => gen.as_other() - .and_then(|value| $crate::codec::Decode::decode(&mut &value[..])) - .map($name) - .expect("not allowed to fail in runtime"), - } - } - } - - impl $crate::codec::Decode for $name { - /// `generic::DigestItem` binary compatible decode. - fn decode(input: &mut I) -> Option { - let gen: $crate::generic::DigestItem<$($genarg),*> = - $crate::codec::Decode::decode(input)?; - Some($name::from(gen)) - } - } - - impl $crate::codec::Encode for $name { - /// `generic::DigestItem` binary compatible encode. - fn encode(&self) -> Vec { - match self.dref() { - Some(dref) => dref.encode(), - None => { - let gen: $crate::generic::DigestItem<$($genarg),*> = - $crate::generic::DigestItem::Other(self.0.encode()); - gen.encode() - }, - } - } - } - - $( - impl From<$module::Log<$trait $(, $instance)? >> for $name { - /// Converts single module log item into `$name`. - fn from(x: $module::Log<$trait $(, $instance)? >) -> Self { - $name(x.into()) - } - } - - impl From<$module::Log<$trait $(, $instance)? >> for InternalLog { - /// Converts single module log item into `$internal`. - fn from(x: $module::Log<$trait $(, $instance)? >) -> Self { - InternalLog::$module(x) - } - } - )* - }; -} - /// Simple blob to hold an extrinsic without committing to its format and ensure it is serialized /// correctly. #[derive(PartialEq, Eq, Clone, Default, Encode, Decode)] @@ -698,81 +673,40 @@ impl traits::Extrinsic for OpaqueExtrinsic { #[cfg(test)] mod tests { - use substrate_primitives::hash::{H256, H512}; use crate::codec::{Encode, Decode}; - use crate::traits::DigestItem; - - pub trait RuntimeT { - type AuthorityId; - } - - pub struct Runtime; - - impl RuntimeT for Runtime { - type AuthorityId = u64; - } - - mod a { - use super::RuntimeT; - use crate::codec::{Encode, Decode}; - use serde::Serialize; - pub type Log = RawLog<::AuthorityId>; - - #[derive(Serialize, Debug, Encode, Decode, PartialEq, Eq, Clone)] - pub enum RawLog { A1(AuthorityId), AuthoritiesChange(Vec), A3(AuthorityId) } - } - mod b { - use super::RuntimeT; - use crate::codec::{Encode, Decode}; - use serde::Serialize; - pub type Log = RawLog<::AuthorityId>; - - #[derive(Serialize, Debug, Encode, Decode, PartialEq, Eq, Clone)] - pub enum RawLog { B1(AuthorityId), B2(AuthorityId) } - } - - impl_outer_log! { - pub enum Log(InternalLog: DigestItem) for Runtime { - a(AuthoritiesChange), b() + macro_rules! per_thing_upper_test { + ($num_type:tt, $per:tt) => { + // multiplication from all sort of from_percent + assert_eq!($per::from_percent(100) * $num_type::max_value(), $num_type::max_value()); + assert_eq!( + $per::from_percent(99) * $num_type::max_value(), + ((Into::::into($num_type::max_value()) * 99u32) / 100u32).as_u128() as $num_type + ); + assert_eq!($per::from_percent(50) * $num_type::max_value(), $num_type::max_value() / 2); + assert_eq!($per::from_percent(1) * $num_type::max_value(), $num_type::max_value() / 100); + assert_eq!($per::from_percent(0) * $num_type::max_value(), 0); + + // multiplication with bounds + assert_eq!($per::one() * $num_type::max_value(), $num_type::max_value()); + assert_eq!($per::zero() * $num_type::max_value(), 0); + + // from_rational_approximation + assert_eq!( + $per::from_rational_approximation(u128::max_value() - 1, u128::max_value()), + $per::one(), + ); + assert_eq!( + $per::from_rational_approximation(u128::max_value()/3, u128::max_value()), + $per::from_parts($per::one().0/3), + ); + assert_eq!( + $per::from_rational_approximation(1, u128::max_value()), + $per::zero(), + ); } } - #[test] - fn impl_outer_log_works() { - // encode/decode regular item - let b1: Log = b::RawLog::B1::(777).into(); - let encoded_b1 = b1.encode(); - let decoded_b1: Log = Decode::decode(&mut &encoded_b1[..]).unwrap(); - assert_eq!(b1, decoded_b1); - - // encode/decode system item - let auth_change: Log = a::RawLog::AuthoritiesChange::(vec![100, 200, 300]).into(); - let encoded_auth_change = auth_change.encode(); - let decoded_auth_change: Log = Decode::decode(&mut &encoded_auth_change[..]).unwrap(); - assert_eq!(auth_change, decoded_auth_change); - - // interpret regular item using `generic::DigestItem` - let generic_b1: super::generic::DigestItem = Decode::decode(&mut &encoded_b1[..]).unwrap(); - match generic_b1 { - super::generic::DigestItem::Other(_) => (), - _ => panic!("unexpected generic_b1: {:?}", generic_b1), - } - - // interpret system item using `generic::DigestItem` - let generic_auth_change: super::generic::DigestItem = Decode::decode(&mut &encoded_auth_change[..]).unwrap(); - match generic_auth_change { - super::generic::DigestItem::AuthoritiesChange::(authorities) => assert_eq!(authorities, vec![100, 200, 300]), - _ => panic!("unexpected generic_auth_change: {:?}", generic_auth_change), - } - - // check that as-style methods are working with system items - assert!(auth_change.as_authorities_change().is_some()); - - // check that as-style methods are not working with regular items - assert!(b1.as_authorities_change().is_none()); - } - #[test] fn opaque_extrinsic_serialization() { let ex = super::OpaqueExtrinsic(vec![1, 2, 3, 4]); @@ -819,8 +753,37 @@ mod tests { } #[test] - fn saturating_mul() { - assert_eq!(super::Perbill::one() * std::u64::MAX, std::u64::MAX/1_000_000_000); - assert_eq!(super::Permill::from_percent(100) * std::u64::MAX, std::u64::MAX/1_000_000); + fn per_things_should_work() { + use super::{Perbill, Permill}; + use primitive_types::U256; + + per_thing_upper_test!(u32, Perbill); + per_thing_upper_test!(u64, Perbill); + per_thing_upper_test!(u128, Perbill); + + per_thing_upper_test!(u32, Permill); + per_thing_upper_test!(u64, Permill); + per_thing_upper_test!(u128, Permill); + + } + + #[test] + fn per_things_operate_in_output_type() { + assert_eq!(super::Perbill::one() * 255_u64, 255); + } + + #[test] + fn per_things_one_minus_one_part() { + use primitive_types::U256; + + assert_eq!( + super::Perbill::from_parts(999_999_999) * std::u128::MAX, + ((Into::::into(std::u128::MAX) * 999_999_999u32) / 1_000_000_000u32).as_u128() + ); + + assert_eq!( + super::Permill::from_parts(999_999) * std::u128::MAX, + ((Into::::into(std::u128::MAX) * 999_999u32) / 1_000_000u32).as_u128() + ); } } diff --git a/core/sr-primitives/src/testing.rs b/core/sr-primitives/src/testing.rs index e8e5aa20b46fe6351014860f8eea982a0123a85d..35f3ec476f6d5b78b18c9c84f27fdefea75653fc 100644 --- a/core/sr-primitives/src/testing.rs +++ b/core/sr-primitives/src/testing.rs @@ -19,11 +19,12 @@ use serde::{Serialize, Serializer, Deserialize, de::Error as DeError, Deserializer}; use std::{fmt::Debug, ops::Deref, fmt}; use crate::codec::{Codec, Encode, Decode}; -use crate::traits::{self, Checkable, Applyable, BlakeTwo256, Convert}; -use crate::generic::DigestItem as GenDigestItem; +use crate::traits::{self, Checkable, Applyable, BlakeTwo256, OpaqueKeys}; +use crate::generic; +use crate::weights::{Weighable, Weight}; pub use substrate_primitives::H256; use substrate_primitives::U256; -use substrate_primitives::sr25519::{Public as AuthorityId, Signature as AuthoritySignature}; +use substrate_primitives::ed25519::{Public as AuthorityId}; /// Authority Id #[derive(Default, PartialEq, Eq, Clone, Encode, Decode, Debug)] @@ -36,39 +37,19 @@ impl Into for UintAuthorityId { } } -/// Converter between u64 and the AuthorityId wrapper type. -pub struct ConvertUintAuthorityId; -impl Convert> for ConvertUintAuthorityId { - fn convert(a: u64) -> Option { - Some(UintAuthorityId(a)) - } +impl OpaqueKeys for UintAuthorityId { + fn count() -> usize { 1 } + // Unsafe, i know, but it's test code and it's just there because it's really convenient to + // keep `UintAuthorityId` as a u64 under the hood. + fn get_raw(&self, _: usize) -> &[u8] { unsafe { &std::mem::transmute::<_, &[u8; 8]>(&self.0)[..] } } + fn get(&self, _: usize) -> Option { self.0.using_encoded(|mut x| T::decode(&mut x)) } } + /// Digest item -pub type DigestItem = GenDigestItem; +pub type DigestItem = generic::DigestItem; /// Header Digest -#[derive(Default, PartialEq, Eq, Clone, Serialize, Debug, Encode, Decode)] -pub struct Digest { - /// Generated logs - pub logs: Vec, -} - -impl traits::Digest for Digest { - type Hash = H256; - type Item = DigestItem; - - fn logs(&self) -> &[Self::Item] { - &self.logs - } - - fn push(&mut self, item: Self::Item) { - self.logs.push(item); - } - - fn pop(&mut self) -> Option { - self.logs.pop() - } -} +pub type Digest = generic::Digest; /// Block Header #[derive(PartialEq, Eq, Clone, Serialize, Debug, Encode, Decode)] @@ -91,7 +72,6 @@ impl traits::Header for Header { type Number = u64; type Hashing = BlakeTwo256; type Hash = H256; - type Digest = Digest; fn number(&self) -> &Self::Number { &self.number } fn set_number(&mut self, num: Self::Number) { self.number = num } @@ -105,23 +85,22 @@ impl traits::Header for Header { fn parent_hash(&self) -> &Self::Hash { &self.parent_hash } fn set_parent_hash(&mut self, hash: Self::Hash) { self.parent_hash = hash } - fn digest(&self) -> &Self::Digest { &self.digest } - fn digest_mut(&mut self) -> &mut Self::Digest { &mut self.digest } - fn set_digest(&mut self, digest: Self::Digest) { self.digest = digest } + fn digest(&self) -> &Digest { &self.digest } + fn digest_mut(&mut self) -> &mut Digest { &mut self.digest } fn new( number: Self::Number, extrinsics_root: Self::Hash, state_root: Self::Hash, parent_hash: Self::Hash, - digest: Self::Digest + digest: Digest, ) -> Self { Header { number, - extrinsics_root: extrinsics_root, + extrinsics_root, state_root, parent_hash, - digest + digest, } } } @@ -240,3 +219,9 @@ impl Applyable for TestXt where (self.2, self.0) } } +impl Weighable for TestXt { + fn weight(&self, len: usize) -> Weight { + // for testing: weight == size. + len as Weight + } +} diff --git a/core/sr-primitives/src/traits.rs b/core/sr-primitives/src/traits.rs index 92c8026340bf466f63e40e085309264558ece5a7..b2bb7ab80511d659f6d179e37fdf89c5acb69841 100644 --- a/core/sr-primitives/src/traits.rs +++ b/core/sr-primitives/src/traits.rs @@ -17,17 +17,18 @@ //! Primitives for the runtime modules. use rstd::prelude::*; -use rstd::{self, result, marker::PhantomData}; +use rstd::{self, result, marker::PhantomData, convert::{TryFrom, TryInto}}; use runtime_io; #[cfg(feature = "std")] use std::fmt::{Debug, Display}; #[cfg(feature = "std")] use serde::{Serialize, Deserialize, de::DeserializeOwned}; use substrate_primitives::{self, Hasher, Blake2Hasher}; -use crate::codec::{Codec, Encode, HasCompact}; +use crate::codec::{Codec, Encode, Decode, HasCompact}; use crate::transaction_validity::TransactionValidity; +use crate::generic::{Digest, DigestItem}; pub use integer_sqrt::IntegerSquareRoot; pub use num_traits::{ Zero, One, Bounded, CheckedAdd, CheckedSub, CheckedMul, CheckedDiv, - CheckedShl, CheckedShr, Saturating + CheckedShl, CheckedShr }; use rstd::ops::{ Add, Sub, Mul, Div, Rem, AddAssign, SubAssign, MulAssign, DivAssign, @@ -73,7 +74,11 @@ pub trait EnsureOrigin { /// A return type. type Success; /// Perform the origin check. - fn ensure_origin(o: OuterOrigin) -> result::Result; + fn ensure_origin(o: OuterOrigin) -> result::Result { + Self::try_origin(o).map_err(|_| "Invalid origin") + } + /// Perform the origin check. + fn try_origin(o: OuterOrigin) -> result::Result; } /// Means of changing one type into another in a manner dependent on the source type. @@ -157,71 +162,143 @@ impl Convert for Identity { fn convert(a: T) -> T { a } } -/// Simple trait similar to `Into`, except that it can be used to convert numerics between each -/// other. -pub trait As { - /// Convert forward (ala `Into::into`). - fn as_(self) -> T; - /// Convert backward (ala `From::from`). - fn sa(_: T) -> Self; -} - -macro_rules! impl_numerics { - ( $( $t:ty ),* ) => { - $( - impl_numerics!($t: u8, u16, u32, u64, u128, usize, i8, i16, i32, i64, i128, isize,); - )* - }; - ( $f:ty : $t:ty, $( $rest:ty, )* ) => { - impl As<$t> for $f { - fn as_(self) -> $t { self as $t } - fn sa(t: $t) -> Self { t as Self } - } - impl_numerics!($f: $( $rest, )*); - }; - ( $f:ty : ) => {} -} - -impl_numerics!(u8, u16, u32, u64, u128, usize, i8, i16, i32, i64, i128, isize); - /// A meta trait for arithmetic. +/// +/// Arithmetic types do all the usual stuff you'd expect numbers to do. They are guaranteed to +/// be able to represent at least `u32` values without loss, hence the trait implies `From` +/// and smaller ints. All other conversions are fallible. pub trait SimpleArithmetic: - Zero + One + IntegerSquareRoot + As + + Zero + One + IntegerSquareRoot + + From + From + From + TryInto + TryInto + TryInto + + TryFrom + TryInto + TryFrom + TryInto + TryFrom + TryInto + + UniqueSaturatedInto + UniqueSaturatedInto + UniqueSaturatedInto + + UniqueSaturatedFrom + UniqueSaturatedInto + UniqueSaturatedFrom + UniqueSaturatedInto + Add + AddAssign + Sub + SubAssign + Mul + MulAssign + Div + DivAssign + Rem + RemAssign + Shl + Shr + - CheckedShl + - CheckedShr + - CheckedAdd + - CheckedSub + - CheckedMul + - CheckedDiv + - Saturating + - PartialOrd + Ord + Bounded + - HasCompact + CheckedShl + CheckedShr + CheckedAdd + CheckedSub + CheckedMul + CheckedDiv + + Saturating + PartialOrd + Ord + Bounded + + HasCompact + Sized {} impl + + Zero + One + IntegerSquareRoot + + From + From + From + TryInto + TryInto + TryInto + + TryFrom + TryInto + TryFrom + TryInto + TryFrom + TryInto + + UniqueSaturatedInto + UniqueSaturatedInto + UniqueSaturatedInto + + UniqueSaturatedFrom + UniqueSaturatedInto + UniqueSaturatedFrom + + UniqueSaturatedInto + UniqueSaturatedFrom + UniqueSaturatedInto + Add + AddAssign + Sub + SubAssign + Mul + MulAssign + Div + DivAssign + Rem + RemAssign + Shl + Shr + - CheckedShl + - CheckedShr + - CheckedAdd + - CheckedSub + - CheckedMul + - CheckedDiv + - Saturating + - PartialOrd + Ord + Bounded + - HasCompact + CheckedShl + CheckedShr + CheckedAdd + CheckedSub + CheckedMul + CheckedDiv + + Saturating + PartialOrd + Ord + Bounded + + HasCompact + Sized > SimpleArithmetic for T {} +/// Just like `From` except that if the source value is too big to fit into the destination type +/// then it'll saturate the destination. +pub trait UniqueSaturatedFrom: Sized { + /// Convert from a value of `T` into an equivalent instance of `Self`. + fn unique_saturated_from(t: T) -> Self; +} + +/// Just like `Into` except that if the source value is too big to fit into the destination type +/// then it'll saturate the destination. +pub trait UniqueSaturatedInto: Sized { + /// Consume self to return an equivalent value of `T`. + fn unique_saturated_into(self) -> T; +} + +impl + Bounded + Sized> UniqueSaturatedFrom for S { + fn unique_saturated_from(t: T) -> Self { + S::try_from(t).unwrap_or_else(|_| Bounded::max_value()) + } +} + +impl + Sized> UniqueSaturatedInto for S { + fn unique_saturated_into(self) -> T { + self.try_into().unwrap_or_else(|_| Bounded::max_value()) + } +} + +/// Simple trait to use checked mul and max value to give a saturated mul operation over +/// supported types. +pub trait Saturating { + /// Saturated addition - if the product can't fit in the type then just use max-value. + fn saturating_add(self, o: Self) -> Self; + + /// Saturated subtraction - if the product can't fit in the type then just use max-value. + fn saturating_sub(self, o: Self) -> Self; + + /// Saturated multiply - if the product can't fit in the type then just use max-value. + fn saturating_mul(self, o: Self) -> Self; +} + +impl Saturating for T { + fn saturating_add(self, o: Self) -> Self { + ::saturating_add(self, o) + } + fn saturating_sub(self, o: Self) -> Self { + ::saturating_sub(self, o) + } + fn saturating_mul(self, o: Self) -> Self { + self.checked_mul(&o).unwrap_or_else(Bounded::max_value) + } +} + +/// Convenience type to work around the highly unergonomic syntax needed +/// to invoke the functions of overloaded generic traits, in this case +/// `SaturatedFrom` and `SaturatedInto`. +pub trait SaturatedConversion { + /// Convert from a value of `T` into an equivalent instance of `Self`. + /// + /// This just uses `UniqueSaturatedFrom` internally but with this + /// variant you can provide the destination type using turbofish syntax + /// in case Rust happens not to assume the correct type. + fn saturated_from(t: T) -> Self where Self: UniqueSaturatedFrom { + >::unique_saturated_from(t) + } + + /// Consume self to return an equivalent value of `T`. + /// + /// This just uses `UniqueSaturatedInto` internally but with this + /// variant you can provide the destination type using turbofish syntax + /// in case Rust happens not to assume the correct type. + fn saturated_into(self) -> T where Self: UniqueSaturatedInto { + >::unique_saturated_into(self) + } +} +impl SaturatedConversion for T {} + +/// Convenience type to work around the highly unergonomic syntax needed +/// to invoke the functions of overloaded generic traits, in this case +/// `TryFrom` and `TryInto`. +pub trait CheckedConversion { + /// Convert from a value of `T` into an equivalent instance of `Option`. + /// + /// This just uses `TryFrom` internally but with this + /// variant you can provide the destination type using turbofish syntax + /// in case Rust happens not to assume the correct type. + fn checked_from(t: T) -> Option where Self: TryFrom { + >::try_from(t).ok() + } + /// Consume self to return `Some` equivalent value of `Option`. + /// + /// This just uses `TryInto` internally but with this + /// variant you can provide the destination type using turbofish syntax + /// in case Rust happens not to assume the correct type. + fn checked_into(self) -> Option where Self: TryInto { + >::try_into(self).ok() + } +} +impl CheckedConversion for T {} + /// Trait for things that can be clear (have no bits set). For numeric types, essentially the same /// as `Zero`. pub trait Clear { @@ -330,7 +407,8 @@ tuple_impl!(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, pub trait Hash: 'static + MaybeSerializeDebug + Clone + Eq + PartialEq { // Stupid bug in the Rust compiler believes derived // traits must be fulfilled by all type parameters. /// The hash type produced. - type Output: Member + MaybeSerializeDebug + rstd::hash::Hash + AsRef<[u8]> + AsMut<[u8]> + Copy + Default; + type Output: Member + MaybeSerializeDebug + rstd::hash::Hash + AsRef<[u8]> + AsMut<[u8]> + Copy + + Default + Encode + Decode; /// The associated hash_db Hasher type. type Hasher: Hasher; @@ -363,7 +441,7 @@ pub trait Hash: 'static + MaybeSerializeDebug + Clone + Eq + PartialEq { // Stup fn storage_root() -> Self::Output; /// Acquire the global storage changes root. - fn storage_changes_root(parent_hash: Self::Output, parent_number: u64) -> Option; + fn storage_changes_root(parent_hash: Self::Output) -> Option; } /// Blake2-256 Hash implementation. @@ -396,8 +474,8 @@ impl Hash for BlakeTwo256 { fn storage_root() -> Self::Output { runtime_io::storage_root().into() } - fn storage_changes_root(parent_hash: Self::Output, parent_number: u64) -> Option { - runtime_io::storage_changes_root(parent_hash.into(), parent_number).map(Into::into) + fn storage_changes_root(parent_hash: Self::Output) -> Option { + runtime_io::storage_changes_root(parent_hash.into()).map(Into::into) } } @@ -426,7 +504,7 @@ impl CheckEqual for substrate_primitives::H256 { } } -impl CheckEqual for I where I: DigestItem { +impl CheckEqual for super::generic::DigestItem where H: Encode { #[cfg(feature = "std")] fn check_equal(&self, other: &Self) { if self != other { @@ -533,8 +611,6 @@ pub trait Header: Clone + Send + Sync + Codec + Eq + MaybeSerializeDebugButNotDe type Hash: Member + MaybeSerializeDebug + ::rstd::hash::Hash + Copy + MaybeDisplay + Default + SimpleBitOps + Codec + AsRef<[u8]> + AsMut<[u8]>; /// Hashing algorithm type Hashing: Hash; - /// Digest type - type Digest: Digest + Codec; /// Creates new header. fn new( @@ -542,7 +618,7 @@ pub trait Header: Clone + Send + Sync + Codec + Eq + MaybeSerializeDebugButNotDe extrinsics_root: Self::Hash, state_root: Self::Hash, parent_hash: Self::Hash, - digest: Self::Digest + digest: Digest, ) -> Self; /// Returns a reference to the header number. @@ -566,11 +642,9 @@ pub trait Header: Clone + Send + Sync + Codec + Eq + MaybeSerializeDebugButNotDe fn set_parent_hash(&mut self, hash: Self::Hash); /// Returns a reference to the digest. - fn digest(&self) -> &Self::Digest; + fn digest(&self) -> &Digest; /// Get a mutable reference to the digest. - fn digest_mut(&mut self) -> &mut Self::Digest; - /// Sets the digest. - fn set_digest(&mut self, digest: Self::Digest); + fn digest_mut(&mut self) -> &mut Digest; /// Returns the hash of the header. fn hash(&self) -> Self::Hash { @@ -616,11 +690,9 @@ pub type HashFor = <::Header as Header>::Hashing; /// Extract the number type for a block. pub type NumberFor = <::Header as Header>::Number; /// Extract the digest type for a block. -pub type DigestFor = <::Header as Header>::Digest; +pub type DigestFor = Digest<<::Header as Header>::Hash>; /// Extract the digest item type for a block. -pub type DigestItemFor = as Digest>::Item; -/// Extract the authority ID type for a block. -pub type AuthorityIdFor = as DigestItem>::AuthorityId; +pub type DigestItemFor = DigestItem<<::Header as Header>::Hash>; /// A "checkable" piece of information, used by the standard Substrate Executive in order to /// check the validity of a piece of extrinsic information, usually by verifying the signature. @@ -675,46 +747,6 @@ pub trait Applyable: Sized + Send + Sync { fn deconstruct(self) -> (Self::Call, Option); } -/// Something that acts like a `Digest` - it can have `Log`s `push`ed onto it and these `Log`s are -/// each `Codec`. -pub trait Digest: Member + MaybeSerializeDebugButNotDeserialize + Default { - /// Hash of the items. - type Hash: Member; - /// Digest item type. - type Item: DigestItem; - - /// Get reference to all digest items. - fn logs(&self) -> &[Self::Item]; - /// Push new digest item. - fn push(&mut self, item: Self::Item); - /// Pop a digest item. - fn pop(&mut self) -> Option; - - /// Get reference to the first digest item that matches the passed predicate. - fn log Option<&T>>(&self, predicate: F) -> Option<&T> { - self.logs().iter() - .filter_map(predicate) - .next() - } -} - -/// Single digest item. Could be any type that implements `Member` and provides methods -/// for casting member to 'system' log items, known to substrate. -/// -/// If the runtime does not supports some 'system' items, use `()` as a stub. -pub trait DigestItem: Codec + Member + MaybeSerializeDebugButNotDeserialize { - /// `ChangesTrieRoot` payload. - type Hash: Member; - /// `AuthorityChange` payload. - type AuthorityId: Member + MaybeHash + crate::codec::Encode + crate::codec::Decode; - - /// Returns Some if the entry is the `AuthoritiesChange` entry. - fn as_authorities_change(&self) -> Option<&[Self::AuthorityId]>; - - /// Returns Some if the entry is the `ChangesTrieRoot` entry. - fn as_changes_trie_root(&self) -> Option<&Self::Hash>; -} - /// Auxiliary wrapper that holds an api instance and binds it to the given lifetime. pub struct ApiRef<'a, T>(T, rstd::marker::PhantomData<&'a ()>); @@ -784,3 +816,75 @@ pub trait ValidateUnsigned { /// Changes made to storage should be discarded by caller. fn validate_unsigned(call: &Self::Call) -> TransactionValidity; } + +/// Opaque datatype that may be destructured into a series of raw byte slices (which represent +/// individual keys). +pub trait OpaqueKeys: Clone { + /// Return the number of encoded keys. + fn count() -> usize { 0 } + /// Get the raw bytes of key with index `i`. + fn get_raw(&self, i: usize) -> &[u8]; + /// Get the decoded key with index `i`. + fn get(&self, i: usize) -> Option { T::decode(&mut self.get_raw(i)) } + /// Verify a proof of ownership for the keys. + fn ownership_proof_is_valid(&self, _proof: &[u8]) -> bool { true } +} + +/// Calls a given macro a number of times with a set of fixed params and an incrementing numeral. +/// e.g. +/// ```nocompile +/// count!(println ("{}",) foo, bar, baz); +/// // Will result in three `println!`s: "0", "1" and "2". +/// ``` +#[macro_export] +macro_rules! count { + ($f:ident ($($x:tt)*) ) => (); + ($f:ident ($($x:tt)*) $x1:tt) => { $f!($($x)* 0); }; + ($f:ident ($($x:tt)*) $x1:tt, $x2:tt) => { $f!($($x)* 0); $f!($($x)* 1); }; + ($f:ident ($($x:tt)*) $x1:tt, $x2:tt, $x3:tt) => { $f!($($x)* 0); $f!($($x)* 1); $f!($($x)* 2); }; + ($f:ident ($($x:tt)*) $x1:tt, $x2:tt, $x3:tt, $x4:tt) => { + $f!($($x)* 0); $f!($($x)* 1); $f!($($x)* 2); $f!($($x)* 3); + }; + ($f:ident ($($x:tt)*) $x1:tt, $x2:tt, $x3:tt, $x4:tt, $x5:tt) => { + $f!($($x)* 0); $f!($($x)* 1); $f!($($x)* 2); $f!($($x)* 3); $f!($($x)* 4); + }; +} + +#[macro_export] +/// Just implement `OpaqueKeys` for a given tuple-struct. +/// Would be much nicer for this to be converted to `derive` code. +macro_rules! impl_opaque_keys { + ( + pub struct $name:ident ( $( $t:ty ),* $(,)* ); + ) => { + impl_opaque_keys! { + pub struct $name ( $( $t ,)* ); + impl OpaqueKeys for _ {} + } + }; + ( + pub struct $name:ident ( $( $t:ty ),* $(,)* ); + impl OpaqueKeys for _ { + $($rest:tt)* + } + ) => { + #[derive(Default, Clone, PartialEq, Eq, $crate::codec::Encode, $crate::codec::Decode)] + #[cfg_attr(feature = "std", derive(Debug, $crate::serde::Serialize, $crate::serde::Deserialize))] + pub struct $name($( pub $t ,)*); + impl $crate::traits::OpaqueKeys for $name { + fn count() -> usize { + let mut c = 0; + $( let _: $t; c += 1; )* + c + } + fn get_raw(&self, i: usize) -> &[u8] { + $crate::count!(impl_opaque_keys (!! self i) $($t),*); + &[] + } + $($rest)* + } + }; + ( !! $self:ident $param_i:ident $i:tt) => { + if $param_i == $i { return $self.$i.as_ref() } + } +} diff --git a/core/sr-primitives/src/transaction_validity.rs b/core/sr-primitives/src/transaction_validity.rs index d927bd74e452a5b894ce23c96a2bdb2e8712e938..f36599b67b42c35c52752ed9e9dfd3dee6e22e27 100644 --- a/core/sr-primitives/src/transaction_validity.rs +++ b/core/sr-primitives/src/transaction_validity.rs @@ -30,7 +30,7 @@ pub type TransactionLongevity = u64; pub type TransactionTag = Vec; /// Information on a transaction's validity and, if valid, on how it relates to other transactions. -#[derive(Clone, PartialEq, Eq, Encode, Decode)] +#[derive(Clone, PartialEq, Eq, Encode)] #[cfg_attr(feature = "std", derive(Debug))] pub enum TransactionValidity { /// Transaction is invalid. Details are described by the error code. @@ -51,7 +51,7 @@ pub enum TransactionValidity { /// /// A list of tags this transaction provides. Successfully importing the transaction /// will enable other transactions that depend on (require) those tags to be included as well. - /// Provided and requried tags allow Substrate to build a dependency graph of transactions + /// Provided and required tags allow Substrate to build a dependency graph of transactions /// and import them in the right (linear) order. provides: Vec, /// Transaction longevity @@ -59,7 +59,74 @@ pub enum TransactionValidity { /// Longevity describes minimum number of blocks the validity is correct. /// After this period transaction should be removed from the pool or revalidated. longevity: TransactionLongevity, + /// A flag indicating if the transaction should be propagated to other peers. + /// + /// By setting `false` here the transaction will still be considered for + /// including in blocks that are authored on the current node, but will + /// never be sent to other peers. + propagate: bool, }, /// Transaction validity can't be determined. Unknown(i8), } + +impl Decode for TransactionValidity { + fn decode(value: &mut I) -> Option { + match value.read_byte()? { + 0 => Some(TransactionValidity::Invalid(i8::decode(value)?)), + 1 => { + let priority = TransactionPriority::decode(value)?; + let requires = Vec::decode(value)?; + let provides = Vec::decode(value)?; + let longevity = TransactionLongevity::decode(value)?; + let propagate = bool::decode(value).unwrap_or(true); + + Some(TransactionValidity::Valid { + priority, requires, provides, longevity, propagate, + }) + }, + 2 => Some(TransactionValidity::Unknown(i8::decode(value)?)), + _ => None, + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn should_decode_with_backward_compat() { + let old_encoding = vec![ + 1, 5, 0, 0, 0, 0, 0, 0, 0, 4, 16, 1, 2, 3, 4, 4, 12, 4, 5, 6, 42, 0, 0, 0, 0, 0, 0, 0 + ]; + + assert_eq!(TransactionValidity::decode(&mut &*old_encoding), Some(TransactionValidity::Valid { + priority: 5, + requires: vec![vec![1, 2, 3, 4]], + provides: vec![vec![4, 5, 6]], + longevity: 42, + propagate: true, + })); + } + + #[test] + fn should_encode_and_decode() { + let v = TransactionValidity::Valid { + priority: 5, + requires: vec![vec![1, 2, 3, 4]], + provides: vec![vec![4, 5, 6]], + longevity: 42, + propagate: false, + }; + + let encoded = v.encode(); + assert_eq!( + encoded, + vec![1, 5, 0, 0, 0, 0, 0, 0, 0, 4, 16, 1, 2, 3, 4, 4, 12, 4, 5, 6, 42, 0, 0, 0, 0, 0, 0, 0, 0] + ); + + // decode back + assert_eq!(TransactionValidity::decode(&mut &*encoded), Some(v)); + } +} diff --git a/core/sr-primitives/src/weights.rs b/core/sr-primitives/src/weights.rs new file mode 100644 index 0000000000000000000000000000000000000000..3443992c7396bb109b402b48a4bcd77b182ee291 --- /dev/null +++ b/core/sr-primitives/src/weights.rs @@ -0,0 +1,76 @@ +// Copyright 2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +//! Primitives for transaction weighting. +//! +//! Each dispatch function within `decl_module!` can now have an optional +//! `#[weight = $x]` attribute. $x can be any object that implements the +//! `Weighable` trait. By default, All transactions are annotated by +//! `#[weight = TransactionWeight::default()]`. +//! +//! Note that the decl_module macro _cannot_ enforce this and will simply fail +//! if an invalid struct is passed in. + +/// The final type that each `#[weight = $x:expr]`'s +/// expression must evaluate to. +pub type Weight = u32; + +/// A `Call` enum (aka transaction) that can be weighted using the custom weight attribute of +/// its dispatchable functions. Is implemented by default in the `decl_module!`. +/// +/// Both the outer Call enum and the per-module individual ones will implement this. +/// The outer enum simply calls the inner ones based on call type. +pub trait Weighable { + /// Return the weight of this call. + /// The `len` argument is the encoded length of the transaction/call. + fn weight(&self, len: usize) -> Weight; +} + +/// Default type used as the weight representative in a `#[weight = x]` attribute. +/// +/// A user may pass in any other type that implements [`Weighable`]. If not, the `Default` +/// implementation of [`TransactionWeight`] is used. +pub enum TransactionWeight { + /// Basic weight (base, byte). + /// The values contained are the base weight and byte weight respectively. + Basic(Weight, Weight), + /// Maximum fee. This implies that this transaction _might_ get included but + /// no more transaction can be added. This can be done by setting the + /// implementation to _maximum block weight_. + Max, + /// Free. The transaction does not increase the total weight + /// (i.e. is not included in weight calculation). + Free, +} + +impl Weighable for TransactionWeight { + fn weight(&self, len: usize) -> Weight { + match self { + TransactionWeight::Basic(base, byte) => base + byte * len as Weight, + TransactionWeight::Max => 3 * 1024 * 1024, + TransactionWeight::Free => 0, + } + } +} + +impl Default for TransactionWeight { + fn default() -> Self { + // This implies that the weight is currently equal to tx-size, nothing more + // for all substrate transactions that do NOT explicitly annotate weight. + // TODO #2431 needs to be updated with proper max values. + TransactionWeight::Basic(0, 1) + } +} diff --git a/core/sr-sandbox/without_std.rs b/core/sr-sandbox/without_std.rs index 070ca1ddf15cfd9f08e9275f57cea6567c8b3e11..894ba43eb0ccc39795ef89590835591fcfd4d50d 100755 --- a/core/sr-sandbox/without_std.rs +++ b/core/sr-sandbox/without_std.rs @@ -15,7 +15,7 @@ // along with Substrate. If not, see . use rstd::prelude::*; -use rstd::{slice, marker, mem}; +use rstd::{slice, marker, mem, vec}; use rstd::rc::Rc; use codec::{Decode, Encode}; use primitives::sandbox as sandbox_primitives; diff --git a/core/sr-std/with_std.rs b/core/sr-std/with_std.rs index d71b9dcb69ce81a33c97336dec4094cbbdd20690..5824e26241675e80336a96bf7570f128b909ed88 100644 --- a/core/sr-std/with_std.rs +++ b/core/sr-std/with_std.rs @@ -19,6 +19,8 @@ pub use std::boxed; pub use std::cell; pub use std::clone; pub use std::cmp; +pub use std::convert; +pub use std::default; pub use std::fmt; pub use std::hash; pub use std::iter; @@ -28,11 +30,10 @@ pub use std::num; pub use std::ops; pub use std::ptr; pub use std::rc; +pub use std::result; pub use std::slice; +pub use std::str; pub use std::vec; -pub use std::default; -pub use std::result; -pub use std::convert; pub mod collections { pub use std::collections::btree_map; diff --git a/core/sr-std/without_std.rs b/core/sr-std/without_std.rs index 9214a0ed2f8fdb18d9a5f20218c7101ae81e4264..db81372c2f0708e6f8e86ea171860f06efd2b539 100755 --- a/core/sr-std/without_std.rs +++ b/core/sr-std/without_std.rs @@ -53,6 +53,8 @@ pub use core::borrow; pub use core::cell; pub use core::clone; pub use core::cmp; +pub use core::convert; +pub use core::default; pub use core::hash; pub use core::intrinsics; pub use core::iter; @@ -61,10 +63,10 @@ pub use core::mem; pub use core::num; pub use core::ops; pub use core::ptr; -pub use core::slice; -pub use core::default; pub use core::result; -pub use core::convert; +pub use core::slice; +// Allow intepreting vectors of bytes as strings, but not constructing them. +pub use core::str; // We are trying to avoid certain things here, such as `core::string` // (if you need `String` you most probably doing something wrong, since // runtime doesn't require anything human readable). diff --git a/core/sr-version/src/lib.rs b/core/sr-version/src/lib.rs index 071b8934040609c4ef6d1fcd9556039064b66e74..179146cc8464d110cb0fab6d4cc53a0c63e0bc9d 100644 --- a/core/sr-version/src/lib.rs +++ b/core/sr-version/src/lib.rs @@ -19,7 +19,7 @@ #![cfg_attr(not(feature = "std"), no_std)] #[cfg(feature = "std")] -use serde::Serialize; +use serde::{Serialize, Deserialize}; #[cfg(feature = "std")] use std::fmt; #[cfg(feature = "std")] @@ -63,7 +63,7 @@ macro_rules! create_apis_vec { /// In particular: bug fixes should result in an increment of `spec_version` and possibly `authoring_version`, /// absolutely not `impl_version` since they change the semantics of the runtime. #[derive(Clone, PartialEq, Eq, Encode)] -#[cfg_attr(feature = "std", derive(Debug, Serialize, Decode))] +#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize, Decode))] #[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] pub struct RuntimeVersion { /// Identifies the different Substrate runtimes. There'll be at least polkadot and node. diff --git a/core/state-db/Cargo.toml b/core/state-db/Cargo.toml index 6f2ac70a303d3019a92935c1d688c7c4173ec284..8c02dbc450fb82989e45f864ca710611d30ed0d5 100644 --- a/core/state-db/Cargo.toml +++ b/core/state-db/Cargo.toml @@ -5,7 +5,7 @@ authors = ["Parity Technologies "] edition = "2018" [dependencies] -parking_lot = "0.7.1" +parking_lot = "0.8.0" log = "0.4" primitives = { package = "substrate-primitives", path = "../../core/primitives" } parity-codec = { version = "3.3", features = ["derive"] } diff --git a/core/state-db/src/lib.rs b/core/state-db/src/lib.rs index 8d9cf9c965f5a21d1a9b0064de4c5ce1dc846055..8986dda32d7ca007a3c2e678e62faebf288ee0d5 100644 --- a/core/state-db/src/lib.rs +++ b/core/state-db/src/lib.rs @@ -37,7 +37,7 @@ use std::fmt; use parking_lot::RwLock; use parity_codec as codec; use codec::Codec; -use std::collections::HashSet; +use std::collections::{VecDeque, HashMap, hash_map::Entry}; use noncanonical::NonCanonicalOverlay; use pruning::RefWindow; use log::trace; @@ -78,6 +78,8 @@ pub enum Error { InvalidBlockNumber, /// Trying to insert block with unknown parent. InvalidParent, + /// Canonicalization would discard pinned state. + DiscardingPinned, } impl fmt::Debug for Error { @@ -88,6 +90,7 @@ impl fmt::Debug for Error { Error::InvalidBlock => write!(f, "Trying to canonicalize invalid block"), Error::InvalidBlockNumber => write!(f, "Trying to insert block with invalid number"), Error::InvalidParent => write!(f, "Trying to insert block with unknown parent"), + Error::DiscardingPinned => write!(f, "Trying to discard pinned state"), } } } @@ -112,7 +115,7 @@ pub struct CommitSet { } /// Pruning constraints. If none are specified pruning is -#[derive(Default, Debug, Clone)] +#[derive(Default, Debug, Clone, Eq, PartialEq)] pub struct Constraints { /// Maximum blocks. Defaults to 0 when unspecified, effectively keeping only non-canonical states. pub max_blocks: Option, @@ -121,7 +124,7 @@ pub struct Constraints { } /// Pruning mode. -#[derive(Debug, Clone)] +#[derive(Debug, Clone, Eq, PartialEq)] pub enum PruningMode { /// Maintain a pruning window. Constrained(Constraints), @@ -165,13 +168,14 @@ fn to_meta_key(suffix: &[u8], data: &S) -> Vec { struct StateDbSync { mode: PruningMode, non_canonical: NonCanonicalOverlay, + canonicalization_queue: VecDeque, pruning: Option>, - pinned: HashSet, + pinned: HashMap, } impl StateDbSync { pub fn new(mode: PruningMode, db: &D) -> Result, Error> { - trace!("StateDb settings: {:?}", mode); + trace!(target: "state-db", "StateDb settings: {:?}", mode); let non_canonical: NonCanonicalOverlay = NonCanonicalOverlay::new(db)?; let pruning: Option> = match mode { PruningMode::Constrained(Constraints { @@ -186,6 +190,7 @@ impl StateDbSync { non_canonical, pruning, pinned: Default::default(), + canonicalization_queue: Default::default(), }) } @@ -206,21 +211,30 @@ impl StateDbSync { } pub fn canonicalize_block(&mut self, hash: &BlockHash) -> Result, Error> { - let mut commit = match self.mode { - PruningMode::ArchiveAll => { - CommitSet::default() - }, - PruningMode::ArchiveCanonical => { - let mut commit = self.non_canonical.canonicalize(hash)?; - commit.data.deleted.clear(); - commit - }, - PruningMode::Constrained(_) => { - self.non_canonical.canonicalize(hash)? - }, - }; - if let Some(ref mut pruning) = self.pruning { - pruning.note_canonical(hash, &mut commit); + let mut commit = CommitSet::default(); + if self.mode == PruningMode::ArchiveAll { + return Ok(commit) + } + self.canonicalization_queue.push_back(hash.clone()); + while let Some(hash) = self.canonicalization_queue.front().cloned() { + if self.pinned.contains_key(&hash) { + break; + } + match self.non_canonical.canonicalize(&hash, &self.pinned, &mut commit) { + Ok(()) => { + self.canonicalization_queue.pop_front(); + if self.mode == PruningMode::ArchiveCanonical { + commit.data.deleted.clear(); + } + } + Err(Error::DiscardingPinned) => { + break; + } + Err(e) => return Err(e), + }; + if let Some(ref mut pruning) = self.pruning { + pruning.note_canonical(&hash, &mut commit); + } } self.prune(&mut commit); Ok(commit) @@ -255,7 +269,7 @@ impl StateDbSync { } let pinned = &self.pinned; - if pruning.next_hash().map_or(false, |h| pinned.contains(&h)) { + if pruning.next_hash().map_or(false, |h| pinned.contains_key(&h)) { break; } pruning.prune_one(commit); @@ -278,11 +292,23 @@ impl StateDbSync { } pub fn pin(&mut self, hash: &BlockHash) { - self.pinned.insert(hash.clone()); + trace!(target: "state-db", "Pinned block: {:?}", hash); + *self.pinned.entry(hash.clone()).or_default() += 1; } pub fn unpin(&mut self, hash: &BlockHash) { - self.pinned.remove(hash); + match self.pinned.entry(hash.clone()) { + Entry::Occupied(mut entry) => { + *entry.get_mut() -= 1; + if *entry.get() == 0 { + trace!(target: "state-db", "Unpinned block: {:?}", hash); + entry.remove(); + } else { + trace!(target: "state-db", "Releasing reference for {:?}", hash); + } + }, + Entry::Vacant(_) => {}, + } } pub fn get(&self, key: &Key, db: &D) -> Result, Error> diff --git a/core/state-db/src/noncanonical.rs b/core/state-db/src/noncanonical.rs index da957335ba30f4e7d59e5fe7f5eda6613b9943d7..0d43389a0be975f1f7b502536aedb0edc622d6ef 100644 --- a/core/state-db/src/noncanonical.rs +++ b/core/state-db/src/noncanonical.rs @@ -230,13 +230,20 @@ impl NonCanonicalOverlay { Ok(commit) } - fn discard_journals(&self, level_index: usize, discarded_journals: &mut Vec>, hash: &BlockHash) { + fn discard_journals( + &self, + level_index: usize, + discarded_journals: &mut Vec>, + discarded_blocks: &mut Vec, + hash: &BlockHash + ) { if let Some(level) = self.levels.get(level_index) { level.iter().for_each(|overlay| { let parent = self.parents.get(&overlay.hash).expect("there is a parent entry for each entry in levels; qed").clone(); if parent == *hash { discarded_journals.push(overlay.journal_key.clone()); - self.discard_journals(level_index + 1, discarded_journals, &overlay.hash); + discarded_blocks.push(overlay.hash.clone()); + self.discard_journals(level_index + 1, discarded_journals, discarded_blocks, &overlay.hash); } }); } @@ -268,7 +275,12 @@ impl NonCanonicalOverlay { /// Select a top-level root and canonicalized it. Discards all sibling subtrees and the root. /// Returns a set of changes that need to be added to the DB. - pub fn canonicalize(&mut self, hash: &BlockHash) -> Result, Error> { + pub fn canonicalize( + &mut self, + hash: &BlockHash, + pinned: &HashMap, + commit: &mut CommitSet, + ) -> Result<(), Error> { trace!(target: "state-db", "Canonicalizing {:?}", hash); let level = self.levels.get(self.pending_canonicalizations.len()).ok_or_else(|| Error::InvalidBlock)?; let index = level @@ -276,26 +288,40 @@ impl NonCanonicalOverlay { .position(|overlay| overlay.hash == *hash) .ok_or_else(|| Error::InvalidBlock)?; - let mut commit = CommitSet::default(); let mut discarded_journals = Vec::new(); - for (i, overlay) in level.into_iter().enumerate() { - if i == index { - // that's the one we need to canonicalize - commit.data.inserted = overlay.inserted.iter() - .map(|k| (k.clone(), self.values.get(k).expect("For each key in verlays there's a value in values").1.clone())) - .collect(); - commit.data.deleted = overlay.deleted.clone(); - } else { - self.discard_journals(self.pending_canonicalizations.len() + 1, &mut discarded_journals, &overlay.hash); + let mut discarded_blocks = Vec::new(); + for (i, overlay) in level.iter().enumerate() { + if i != index { + self.discard_journals( + self.pending_canonicalizations.len() + 1, + &mut discarded_journals, + &mut discarded_blocks, + &overlay.hash + ); } discarded_journals.push(overlay.journal_key.clone()); + discarded_blocks.push(overlay.hash.clone()); } + + for hash in discarded_blocks.into_iter() { + if pinned.contains_key(&hash) { + trace!(target: "state-db", "Refusing to discard pinned state {:?}", hash); + return Err(Error::DiscardingPinned) + } + } + + // get the one we need to canonicalize + let overlay = &level[index]; + commit.data.inserted.extend(overlay.inserted.iter() + .map(|k| (k.clone(), self.values.get(k).expect("For each key in overlays there's a value in values").1.clone()))); + commit.data.deleted.extend(overlay.deleted.clone()); + commit.meta.deleted.append(&mut discarded_journals); let canonicalized = (hash.clone(), self.front_block_number() + self.pending_canonicalizations.len() as u64); commit.meta.inserted.push((to_meta_key(LAST_CANONICAL, &()), canonicalized.encode())); trace!(target: "state-db", "Discarding {} records", commit.meta.deleted.len()); self.pending_canonicalizations.push(hash.clone()); - Ok(commit) + Ok(()) } fn apply_canonicalizations(&mut self) { @@ -385,10 +411,10 @@ impl NonCanonicalOverlay { #[cfg(test)] mod tests { - use std::io; + use std::{collections::HashMap, io}; use primitives::H256; use super::{NonCanonicalOverlay, to_journal_key}; - use crate::ChangeSet; + use crate::{ChangeSet, CommitSet}; use crate::test::{make_db, make_changeset}; fn contains(overlay: &NonCanonicalOverlay, key: u64) -> bool { @@ -409,7 +435,8 @@ mod tests { fn canonicalize_empty_panics() { let db = make_db(&[]); let mut overlay = NonCanonicalOverlay::::new(&db).unwrap(); - overlay.canonicalize::(&H256::default()).unwrap(); + let mut commit = CommitSet::default(); + overlay.canonicalize::(&H256::default(), &HashMap::default(), &mut commit).unwrap(); } #[test] @@ -453,7 +480,8 @@ mod tests { let db = make_db(&[]); let mut overlay = NonCanonicalOverlay::::new(&db).unwrap(); overlay.insert::(&h1, 1, &H256::default(), ChangeSet::default()).unwrap(); - overlay.canonicalize::(&h2).unwrap(); + let mut commit = CommitSet::default(); + overlay.canonicalize::(&h2, &HashMap::default(), &mut commit).unwrap(); } #[test] @@ -468,7 +496,8 @@ mod tests { assert_eq!(insertion.meta.inserted.len(), 2); assert_eq!(insertion.meta.deleted.len(), 0); db.commit(&insertion); - let finalization = overlay.canonicalize::(&h1).unwrap(); + let mut finalization = CommitSet::default(); + overlay.canonicalize::(&h1, &HashMap::default(), &mut finalization).unwrap(); assert_eq!(finalization.data.inserted.len(), changeset.inserted.len()); assert_eq!(finalization.data.deleted.len(), changeset.deleted.len()); assert_eq!(finalization.meta.inserted.len(), 1); @@ -501,7 +530,9 @@ mod tests { let mut overlay = NonCanonicalOverlay::::new(&db).unwrap(); db.commit(&overlay.insert::(&h1, 10, &H256::default(), make_changeset(&[3, 4], &[2])).unwrap()); db.commit(&overlay.insert::(&h2, 11, &h1, make_changeset(&[5], &[3])).unwrap()); - db.commit(&overlay.canonicalize::(&h1).unwrap()); + let mut commit = CommitSet::default(); + overlay.canonicalize::(&h1, &HashMap::default(), &mut commit).unwrap(); + db.commit(&commit); overlay.apply_pending(); assert_eq!(overlay.levels.len(), 1); @@ -526,7 +557,9 @@ mod tests { assert!(contains(&overlay, 5)); assert_eq!(overlay.levels.len(), 2); assert_eq!(overlay.parents.len(), 2); - db.commit(&overlay.canonicalize::(&h1).unwrap()); + let mut commit = CommitSet::default(); + overlay.canonicalize::(&h1, &HashMap::default(), &mut commit).unwrap(); + db.commit(&commit); assert!(contains(&overlay, 5)); assert_eq!(overlay.levels.len(), 2); assert_eq!(overlay.parents.len(), 2); @@ -535,7 +568,9 @@ mod tests { assert_eq!(overlay.parents.len(), 1); assert!(!contains(&overlay, 5)); assert!(contains(&overlay, 7)); - db.commit(&overlay.canonicalize::(&h2).unwrap()); + let mut commit = CommitSet::default(); + overlay.canonicalize::(&h2, &HashMap::default(), &mut commit).unwrap(); + db.commit(&commit); overlay.apply_pending(); assert_eq!(overlay.levels.len(), 0); assert_eq!(overlay.parents.len(), 0); @@ -552,7 +587,9 @@ mod tests { db.commit(&overlay.insert::(&h_1, 1, &H256::default(), c_1).unwrap()); db.commit(&overlay.insert::(&h_2, 1, &H256::default(), c_2).unwrap()); assert!(contains(&overlay, 1)); - db.commit(&overlay.canonicalize::(&h_1).unwrap()); + let mut commit = CommitSet::default(); + overlay.canonicalize::(&h_1, &HashMap::default(), &mut commit).unwrap(); + db.commit(&commit); assert!(contains(&overlay, 1)); overlay.apply_pending(); assert!(!contains(&overlay, 1)); @@ -569,8 +606,10 @@ mod tests { db.commit(&overlay.insert::(&h1, 1, &H256::default(), changeset.clone()).unwrap()); db.commit(&overlay.insert::(&h2, 2, &h1, changeset.clone()).unwrap()); overlay.apply_pending(); - db.commit(&overlay.canonicalize::(&h1).unwrap()); - db.commit(&overlay.canonicalize::(&h2).unwrap()); + let mut commit = CommitSet::default(); + overlay.canonicalize::(&h1, &HashMap::default(), &mut commit).unwrap(); + overlay.canonicalize::(&h2, &HashMap::default(), &mut commit).unwrap(); + db.commit(&commit); db.commit(&overlay.insert::(&h3, 3, &h2, changeset.clone()).unwrap()); overlay.apply_pending(); assert_eq!(overlay.levels.len(), 1); @@ -639,7 +678,9 @@ mod tests { assert_eq!(overlay.last_canonicalized, overlay2.last_canonicalized); // canonicalize 1. 2 and all its children should be discarded - db.commit(&overlay.canonicalize::(&h_1).unwrap()); + let mut commit = CommitSet::default(); + overlay.canonicalize::(&h_1, &HashMap::default(), &mut commit).unwrap(); + db.commit(&commit); overlay.apply_pending(); assert_eq!(overlay.levels.len(), 2); assert_eq!(overlay.parents.len(), 6); @@ -657,8 +698,15 @@ mod tests { assert!(db.get_meta(&to_journal_key(2, 2)).unwrap().is_none()); assert!(db.get_meta(&to_journal_key(2, 3)).unwrap().is_none()); + // check that discarding pinned state produces an error. + let mut commit = CommitSet::default(); + let pinned = vec![(h_1_1_1, 1)].into_iter().collect(); + assert!(overlay.canonicalize::(&h_1_2, &pinned, &mut commit).is_err()); + // canonicalize 1_2. 1_1 and all its children should be discarded - db.commit(&overlay.canonicalize::(&h_1_2).unwrap()); + let mut commit = CommitSet::default(); + overlay.canonicalize::(&h_1_2, &HashMap::default(), &mut commit).unwrap(); + db.commit(&commit); overlay.apply_pending(); assert_eq!(overlay.levels.len(), 1); assert_eq!(overlay.parents.len(), 3); @@ -673,7 +721,9 @@ mod tests { assert!(!overlay.have_block(&h_1_1_1)); // canonicalize 1_2_2 - db.commit(&overlay.canonicalize::(&h_1_2_2).unwrap()); + let mut commit = CommitSet::default(); + overlay.canonicalize::(&h_1_2_2, &HashMap::default(), &mut commit).unwrap(); + db.commit(&commit); overlay.apply_pending(); assert_eq!(overlay.levels.len(), 0); assert_eq!(overlay.parents.len(), 0); diff --git a/core/state-machine/Cargo.toml b/core/state-machine/Cargo.toml index 405e62baccf9d136dea0ce7235ab3f1d85924846..b1cb98ae808875bd8a9d28fc6a38063979c361f3 100644 --- a/core/state-machine/Cargo.toml +++ b/core/state-machine/Cargo.toml @@ -7,7 +7,7 @@ edition = "2018" [dependencies] log = "0.4" -parking_lot = "0.7.1" +parking_lot = "0.8.0" hash-db = "0.12" trie-db = "0.12" trie-root = "0.12" @@ -15,6 +15,7 @@ trie = { package = "substrate-trie", path = "../trie" } primitives = { package = "substrate-primitives", path = "../primitives" } panic-handler = { package = "substrate-panic-handler", path = "../panic-handler" } parity-codec = "3.3" +num-traits = "0.2" [dev-dependencies] hex-literal = "0.2.0" diff --git a/core/state-machine/src/backend.rs b/core/state-machine/src/backend.rs index 895a805e436d012e9408a321f4d3eb007bbd7a92..c86c802bfbd1b1cf3195eee30a86ec5fa14ca6cd 100644 --- a/core/state-machine/src/backend.rs +++ b/core/state-machine/src/backend.rs @@ -51,6 +51,11 @@ pub trait Backend { /// Get keyed child storage or None if there is nothing associated. fn child_storage(&self, storage_key: &[u8], key: &[u8]) -> Result>, Self::Error>; + /// Get child keyed storage value hash or None if there is nothing associated. + fn child_storage_hash(&self, storage_key: &[u8], key: &[u8]) -> Result, Self::Error> { + self.child_storage(storage_key, key).map(|v| v.map(|v| H::hash(&v))) + } + /// true if a key exists in storage. fn exists_storage(&self, key: &[u8]) -> Result { Ok(self.storage(key)?.is_some()) @@ -88,10 +93,25 @@ pub trait Backend { fn pairs(&self) -> Vec<(Vec, Vec)>; /// Get all keys with given prefix - fn keys(&self, prefix: &Vec) -> Vec>; + fn keys(&self, prefix: &[u8]) -> Vec> { + let mut all = Vec::new(); + self.for_keys_with_prefix(prefix, |k| all.push(k.to_vec())); + all + } + + /// Get all keys of child storage with given prefix + fn child_keys(&self, child_storage_key: &[u8], prefix: &[u8]) -> Vec> { + let mut all = Vec::new(); + self.for_keys_in_child_storage(child_storage_key, |k| { + if k.starts_with(prefix) { + all.push(k.to_vec()); + } + }); + all + } /// Try convert into trie backend. - fn try_into_trie_backend(self) -> Option>; + fn as_trie_backend(&mut self) -> Option<&TrieBackend>; /// Calculate the storage root, with given delta over what is already stored /// in the backend, and produce a "transaction" that can be used to commit. @@ -170,31 +190,33 @@ impl error::Error for Void { /// In-memory backend. Fully recomputes tries on each commit but useful for /// tests. -#[derive(Eq)] -pub struct InMemory { +pub struct InMemory { inner: HashMap>, HashMap, Vec>>, + trie: Option, H>>, _hasher: PhantomData, } -impl Default for InMemory { +impl Default for InMemory { fn default() -> Self { InMemory { inner: Default::default(), + trie: None, _hasher: PhantomData, } } } -impl Clone for InMemory { +impl Clone for InMemory { fn clone(&self) -> Self { InMemory { inner: self.inner.clone(), + trie: None, _hasher: PhantomData, } } } -impl PartialEq for InMemory { +impl PartialEq for InMemory { fn eq(&self, other: &Self) -> bool { self.inner.eq(&other.inner) } @@ -215,27 +237,29 @@ impl InMemory { } } -impl From>, HashMap, Vec>>> for InMemory { +impl From>, HashMap, Vec>>> for InMemory { fn from(inner: HashMap>, HashMap, Vec>>) -> Self { InMemory { inner: inner, + trie: None, _hasher: PhantomData, } } } -impl From, Vec>> for InMemory { +impl From, Vec>> for InMemory { fn from(inner: HashMap, Vec>) -> Self { let mut expanded = HashMap::new(); expanded.insert(None, inner); InMemory { inner: expanded, + trie: None, _hasher: PhantomData, } } } -impl From>, Vec, Option>)>> for InMemory { +impl From>, Vec, Option>)>> for InMemory { fn from(inner: Vec<(Option>, Vec, Option>)>) -> Self { let mut expanded: HashMap>, HashMap, Vec>> = HashMap::new(); for (child_key, key, value) in inner { @@ -286,7 +310,9 @@ impl Backend for InMemory { I: IntoIterator, Option>)>, ::Out: Ord, { - let existing_pairs = self.inner.get(&None).into_iter().flat_map(|map| map.iter().map(|(k, v)| (k.clone(), Some(v.clone())))); + let existing_pairs = self.inner.get(&None) + .into_iter() + .flat_map(|map| map.iter().map(|(k, v)| (k.clone(), Some(v.clone())))); let transaction: Vec<_> = delta.into_iter().collect(); let root = trie_root::(existing_pairs.chain(transaction.iter().cloned()) @@ -307,7 +333,9 @@ impl Backend for InMemory { { let storage_key = storage_key.to_vec(); - let existing_pairs = self.inner.get(&Some(storage_key.clone())).into_iter().flat_map(|map| map.iter().map(|(k, v)| (k.clone(), Some(v.clone())))); + let existing_pairs = self.inner.get(&Some(storage_key.clone())) + .into_iter() + .flat_map(|map| map.iter().map(|(k, v)| (k.clone(), Some(v.clone())))); let transaction: Vec<_> = delta.into_iter().collect(); let root = child_trie_root::( @@ -326,23 +354,34 @@ impl Backend for InMemory { } fn pairs(&self) -> Vec<(Vec, Vec)> { - self.inner.get(&None).into_iter().flat_map(|map| map.iter().map(|(k, v)| (k.clone(), v.clone()))).collect() + self.inner.get(&None) + .into_iter() + .flat_map(|map| map.iter().map(|(k, v)| (k.clone(), v.clone()))) + .collect() + } + + fn keys(&self, prefix: &[u8]) -> Vec> { + self.inner.get(&None) + .into_iter() + .flat_map(|map| map.keys().filter(|k| k.starts_with(prefix)).cloned()) + .collect() } - fn keys(&self, prefix: &Vec) -> Vec> { - self.inner.get(&None).into_iter().flat_map(|map| map.keys().filter(|k| k.starts_with(prefix)).cloned()).collect() + fn child_keys(&self, storage_key: &[u8], prefix: &[u8]) -> Vec> { + self.inner.get(&Some(storage_key.to_vec())) + .into_iter() + .flat_map(|map| map.keys().filter(|k| k.starts_with(prefix)).cloned()) + .collect() } - fn try_into_trie_backend( - self - )-> Option> { + fn as_trie_backend(&mut self)-> Option<&TrieBackend> { let mut mdb = MemoryDB::default(); let mut root = None; let mut new_child_roots = Vec::new(); let mut root_map = None; - for (storage_key, map) in self.inner { + for (storage_key, map) in &self.inner { if let Some(storage_key) = storage_key.as_ref() { - let ch = insert_into_memory_db::(&mut mdb, map.into_iter())?; + let ch = insert_into_memory_db::(&mut mdb, map.clone().into_iter())?; new_child_roots.push((storage_key.clone(), ch.as_ref().into())); } else { root_map = Some(map); @@ -352,14 +391,15 @@ impl Backend for InMemory { if let Some(map) = root_map.take() { root = Some(insert_into_memory_db::( &mut mdb, - map.into_iter().chain(new_child_roots.into_iter()) + map.clone().into_iter().chain(new_child_roots.into_iter()) )?); } let root = match root { Some(root) => root, None => insert_into_memory_db::(&mut mdb, ::std::iter::empty())?, }; - Some(TrieBackend::new(mdb, root)) + self.trie = Some(TrieBackend::new(mdb, root)); + self.trie.as_ref() } } diff --git a/core/state-machine/src/basic.rs b/core/state-machine/src/basic.rs index 3021ddfd28dee459e682d5f06df1f3aaa10078dd..e9939711f1e47e9d86c5f751ab4ee2389046113c 100644 --- a/core/state-machine/src/basic.rs +++ b/core/state-machine/src/basic.rs @@ -20,6 +20,7 @@ use std::collections::HashMap; use std::iter::FromIterator; use hash_db::Hasher; use trie::trie_root; +use primitives::offchain; use primitives::storage::well_known_keys::{CHANGES_TRIE_CONFIG, CODE, HEAP_PAGES}; use parity_codec::Encode; use super::{ChildStorageKey, Externalities, OverlayedChanges}; @@ -151,13 +152,13 @@ impl Externalities for BasicExternalities where H::Out: Ord { vec![42] } - fn storage_changes_root(&mut self, _parent: H::Out, _parent_num: u64) -> Option { - None + fn storage_changes_root(&mut self, _parent: H::Out) -> Result, ()> { + Ok(None) } - fn submit_extrinsic(&mut self, _extrinsic: Vec) -> Result<(), ()> { - warn!("Call to submit_extrinsic without offchain externalities set."); - Err(()) + fn offchain(&mut self) -> Option<&mut dyn offchain::Externalities> { + warn!("Call to non-existent out offchain externalities set."); + None } } @@ -170,7 +171,7 @@ mod tests { #[test] fn commit_should_work() { let mut ext = BasicExternalities::default(); - let ext = &mut ext as &mut Externalities; + let ext = &mut ext as &mut dyn Externalities; ext.set_storage(b"doe".to_vec(), b"reindeer".to_vec()); ext.set_storage(b"dog".to_vec(), b"puppy".to_vec()); ext.set_storage(b"dogglesworth".to_vec(), b"cat".to_vec()); @@ -181,7 +182,7 @@ mod tests { #[test] fn set_and_retrieve_code() { let mut ext = BasicExternalities::default(); - let ext = &mut ext as &mut Externalities; + let ext = &mut ext as &mut dyn Externalities; let code = vec![1, 2, 3]; ext.set_storage(CODE.to_vec(), code.clone()); diff --git a/core/state-machine/src/changes_trie/build.rs b/core/state-machine/src/changes_trie/build.rs index 9af058515aca886b47680a5046435c7c2e888c91..487fde2e3528c434c23303126a22ab1aca1a06a0 100644 --- a/core/state-machine/src/changes_trie/build.rs +++ b/core/state-machine/src/changes_trie/build.rs @@ -19,12 +19,13 @@ use std::collections::{BTreeMap, BTreeSet}; use parity_codec::Decode; use hash_db::Hasher; +use num_traits::One; use crate::backend::Backend; use crate::overlayed_changes::OverlayedChanges; -use crate::trie_backend_essence::{TrieBackendStorage, TrieBackendEssence}; +use crate::trie_backend_essence::TrieBackendEssence; use crate::changes_trie::build_iterator::digest_build_iterator; use crate::changes_trie::input::{InputKey, InputPair, DigestIndex, ExtrinsicIndex}; -use crate::changes_trie::{AnchorBlockId, Configuration, Storage}; +use crate::changes_trie::{AnchorBlockId, Configuration, Storage, BlockNumber}; /// Prepare input pairs for building a changes trie of given block. /// @@ -32,29 +33,25 @@ use crate::changes_trie::{AnchorBlockId, Configuration, Storage}; /// required data. /// Returns Ok(None) data required to prepare input pairs is not collected /// or storage is not provided. -pub fn prepare_input<'a, B, S, H>( +pub fn prepare_input<'a, B, S, H, Number>( backend: &B, - storage: Option<&'a S>, + storage: &'a S, + config: &'a Configuration, changes: &OverlayedChanges, - parent: &'a AnchorBlockId, -) -> Result>, String> + parent: &'a AnchorBlockId, +) -> Result>>, String> where B: Backend, - S: Storage, - &'a S: TrieBackendStorage, + S: Storage, H: Hasher, + Number: BlockNumber, { - let (storage, config) = match (storage, changes.changes_trie_config.as_ref()) { - (Some(storage), Some(config)) => (storage, config), - _ => return Ok(None), - }; - let mut input = Vec::new(); input.extend(prepare_extrinsics_input( backend, - parent.number + 1, + parent.number.clone() + 1.into(), changes)?); - input.extend(prepare_digest_input::<_, H>( + input.extend(prepare_digest_input::<_, H, Number>( parent, config, storage)?); @@ -63,14 +60,15 @@ pub fn prepare_input<'a, B, S, H>( } /// Prepare ExtrinsicIndex input pairs. -fn prepare_extrinsics_input( +fn prepare_extrinsics_input( backend: &B, - block: u64, + block: Number, changes: &OverlayedChanges, -) -> Result, String> +) -> Result>, String> where B: Backend, H: Hasher, + Number: BlockNumber, { let mut extrinsic_map = BTreeMap::, BTreeSet>::new(); for (key, val) in changes.prospective.top.iter().chain(changes.committed.top.iter()) { @@ -93,47 +91,50 @@ fn prepare_extrinsics_input( Ok(extrinsic_map.into_iter() .map(move |(key, extrinsics)| InputPair::ExtrinsicIndex(ExtrinsicIndex { - block, + block: block.clone(), key, }, extrinsics.iter().cloned().collect()))) } /// Prepare DigestIndex input pairs. -fn prepare_digest_input<'a, S, H>( - parent: &'a AnchorBlockId, +fn prepare_digest_input<'a, S, H, Number>( + parent: &'a AnchorBlockId, config: &Configuration, storage: &'a S -) -> Result + 'a, String> +) -> Result> + 'a, String> where - S: Storage, - &'a S: TrieBackendStorage, + S: Storage, H: Hasher, H::Out: 'a, + Number: BlockNumber, { - let mut digest_map = BTreeMap::, BTreeSet>::new(); - for digest_build_block in digest_build_iterator(config, parent.number + 1) { - let trie_root = storage.root(parent, digest_build_block)?; - let trie_root = trie_root.ok_or_else(|| format!("No changes trie root for block {}", digest_build_block))?; - let trie_storage = TrieBackendEssence::<_, H>::new(storage, trie_root); + let mut digest_map = BTreeMap::, BTreeSet>::new(); + for digest_build_block in digest_build_iterator(config, parent.number.clone() + One::one()) { + let trie_root = storage.root(parent, digest_build_block.clone())?; + let trie_root = trie_root.ok_or_else(|| format!("No changes trie root for block {}", digest_build_block.clone()))?; + let trie_storage = TrieBackendEssence::<_, H>::new( + crate::changes_trie::TrieBackendStorageAdapter(storage), + trie_root, + ); - let extrinsic_prefix = ExtrinsicIndex::key_neutral_prefix(digest_build_block); + let extrinsic_prefix = ExtrinsicIndex::key_neutral_prefix(digest_build_block.clone()); trie_storage.for_keys_with_prefix(&extrinsic_prefix, |key| - if let Some(InputKey::ExtrinsicIndex(trie_key)) = Decode::decode(&mut &key[..]) { + if let Some(InputKey::ExtrinsicIndex::(trie_key)) = Decode::decode(&mut &key[..]) { digest_map.entry(trie_key.key).or_default() - .insert(digest_build_block); + .insert(digest_build_block.clone()); }); - let digest_prefix = DigestIndex::key_neutral_prefix(digest_build_block); + let digest_prefix = DigestIndex::key_neutral_prefix(digest_build_block.clone()); trie_storage.for_keys_with_prefix(&digest_prefix, |key| - if let Some(InputKey::DigestIndex(trie_key)) = Decode::decode(&mut &key[..]) { + if let Some(InputKey::DigestIndex::(trie_key)) = Decode::decode(&mut &key[..]) { digest_map.entry(trie_key.key).or_default() - .insert(digest_build_block); + .insert(digest_build_block.clone()); }); } Ok(digest_map.into_iter() .map(move |(key, set)| InputPair::DigestIndex(DigestIndex { - block: parent.number + 1, + block: parent.number.clone() + One::one(), key }, set.into_iter().collect()))) } @@ -148,7 +149,7 @@ mod test { use crate::overlayed_changes::OverlayedValue; use super::*; - fn prepare_for_build() -> (InMemory, InMemoryStorage, OverlayedChanges) { + fn prepare_for_build() -> (InMemory, InMemoryStorage, OverlayedChanges) { let backend: InMemory<_> = vec![ (vec![100], vec![255]), (vec![101], vec![255]), @@ -225,7 +226,14 @@ mod test { #[test] fn build_changes_trie_nodes_on_non_digest_block() { let (backend, storage, changes) = prepare_for_build(); - let changes_trie_nodes = prepare_input(&backend, Some(&storage), &changes, &AnchorBlockId { hash: Default::default(), number: 4 }).unwrap(); + let config = changes.changes_trie_config.as_ref().unwrap(); + let changes_trie_nodes = prepare_input( + &backend, + &storage, + config, + &changes, + &AnchorBlockId { hash: Default::default(), number: 4 }, + ).unwrap(); assert_eq!(changes_trie_nodes, Some(vec![ InputPair::ExtrinsicIndex(ExtrinsicIndex { block: 5, key: vec![100] }, vec![0, 2, 3]), InputPair::ExtrinsicIndex(ExtrinsicIndex { block: 5, key: vec![101] }, vec![1]), @@ -236,7 +244,14 @@ mod test { #[test] fn build_changes_trie_nodes_on_digest_block_l1() { let (backend, storage, changes) = prepare_for_build(); - let changes_trie_nodes = prepare_input(&backend, Some(&storage), &changes, &AnchorBlockId { hash: Default::default(), number: 3 }).unwrap(); + let config = changes.changes_trie_config.as_ref().unwrap(); + let changes_trie_nodes = prepare_input( + &backend, + &storage, + config, + &changes, + &AnchorBlockId { hash: Default::default(), number: 3 }, + ).unwrap(); assert_eq!(changes_trie_nodes, Some(vec![ InputPair::ExtrinsicIndex(ExtrinsicIndex { block: 4, key: vec![100] }, vec![0, 2, 3]), InputPair::ExtrinsicIndex(ExtrinsicIndex { block: 4, key: vec![101] }, vec![1]), @@ -252,7 +267,14 @@ mod test { #[test] fn build_changes_trie_nodes_on_digest_block_l2() { let (backend, storage, changes) = prepare_for_build(); - let changes_trie_nodes = prepare_input(&backend, Some(&storage), &changes, &AnchorBlockId { hash: Default::default(), number: 15 }).unwrap(); + let config = changes.changes_trie_config.as_ref().unwrap(); + let changes_trie_nodes = prepare_input( + &backend, + &storage, + config, + &changes, + &AnchorBlockId { hash: Default::default(), number: 15 }, + ).unwrap(); assert_eq!(changes_trie_nodes, Some(vec![ InputPair::ExtrinsicIndex(ExtrinsicIndex { block: 16, key: vec![100] }, vec![0, 2, 3]), InputPair::ExtrinsicIndex(ExtrinsicIndex { block: 16, key: vec![101] }, vec![1]), @@ -276,7 +298,14 @@ mod test { extrinsics: Some(vec![1].into_iter().collect()) }); - let changes_trie_nodes = prepare_input(&backend, Some(&storage), &changes, &AnchorBlockId { hash: Default::default(), number: 3 }).unwrap(); + let config = changes.changes_trie_config.as_ref().unwrap(); + let changes_trie_nodes = prepare_input( + &backend, + &storage, + config, + &changes, + &AnchorBlockId { hash: Default::default(), number: 3 }, + ).unwrap(); assert_eq!(changes_trie_nodes, Some(vec![ InputPair::ExtrinsicIndex(ExtrinsicIndex { block: 4, key: vec![100] }, vec![0, 2, 3]), InputPair::ExtrinsicIndex(ExtrinsicIndex { block: 4, key: vec![101] }, vec![1]), diff --git a/core/state-machine/src/changes_trie/build_iterator.rs b/core/state-machine/src/changes_trie/build_iterator.rs index f9c6ba6e7b397021ca0c856499de012217815867..5d8a8318abf849739be1f94290bac006165e7677 100644 --- a/core/state-machine/src/changes_trie/build_iterator.rs +++ b/core/state-machine/src/changes_trie/build_iterator.rs @@ -17,13 +17,16 @@ //! Structures and functions to return blocks whose changes are to be included //! in given block' changes trie. -use crate::changes_trie::Configuration; +use crate::changes_trie::{Configuration, BlockNumber}; /// Returns iterator of OTHER blocks that are required for inclusion into /// changes trie of given block. -pub fn digest_build_iterator(config: &Configuration, block: u64) -> DigestBuildIterator { +pub fn digest_build_iterator( + config: &Configuration, + block: Number, +) -> DigestBuildIterator { // prepare digest build parameters - let (_, _, digest_step) = match config.digest_level_at_block(block) { + let (_, _, digest_step) = match config.digest_level_at_block(block.clone()) { Some((current_level, digest_interval, digest_step)) => (current_level, digest_interval, digest_step), None => return DigestBuildIterator::empty(), @@ -35,24 +38,26 @@ pub fn digest_build_iterator(config: &Configuration, block: u64) -> DigestBuildI /// Changes trie build iterator that returns numbers of OTHER blocks that are /// required for inclusion into changes trie of given block. #[derive(Debug)] -pub struct DigestBuildIterator { +pub struct DigestBuildIterator { /// Block we're building changes trie for. - block: u64, + block: Number, /// Interval for creation digest blocks. - digest_interval: u64, + digest_interval: u32, + /// Max step of blocks range. + max_step: u32, /// Step of current blocks range. - current_step: u64, + current_step: u32, /// Current blocks range. - current_range: Option<::std::iter::StepBy<::std::ops::Range>>, - /// Max step of blocks range. - max_step: u64, + current_range: Option>, } -impl DigestBuildIterator { +impl DigestBuildIterator { /// Create new digest build iterator. - pub fn new(block: u64, digest_interval: u64, max_step: u64) -> Self { + pub fn new(block: Number, digest_interval: u32, max_step: u32) -> Self { DigestBuildIterator { - block, digest_interval, max_step, + block, + digest_interval, + max_step, current_step: 0, current_range: None, } @@ -60,12 +65,12 @@ impl DigestBuildIterator { /// Create empty digest build iterator. pub fn empty() -> Self { - Self::new(0, 0, 0) + Self::new(0.into(), 0, 0) } } -impl Iterator for DigestBuildIterator { - type Item = u64; +impl Iterator for DigestBuildIterator { + type Item = Number; fn next(&mut self) -> Option { if let Some(next) = self.current_range.as_mut().and_then(|iter| iter.next()) { @@ -82,10 +87,11 @@ impl Iterator for DigestBuildIterator { } self.current_step = next_step; - self.current_range = Some( - ((self.block - self.current_step * self.digest_interval + self.current_step)..self.block) - .step_by(self.current_step as usize) - ); + self.current_range = Some(BlocksRange::new( + self.block.clone() - (self.current_step * self.digest_interval - self.current_step).into(), + self.block.clone(), + self.current_step.into(), + )); Some(self.current_range.as_mut() .expect("assigned one line above; qed") @@ -94,20 +100,52 @@ impl Iterator for DigestBuildIterator { } } +/// Blocks range iterator with builtin step_by support. +#[derive(Debug)] +struct BlocksRange { + current: Number, + end: Number, + step: Number, +} + +impl BlocksRange { + pub fn new(begin: Number, end: Number, step: Number) -> Self { + BlocksRange { + current: begin, + end, + step, + } + } +} + +impl Iterator for BlocksRange { + type Item = Number; + + fn next(&mut self) -> Option { + if self.current >= self.end { + return None; + } + + let current = Some(self.current.clone()); + self.current += self.step.clone(); + current + } +} + #[cfg(test)] mod tests { use super::*; - fn digest_build_iterator(digest_interval: u64, digest_levels: u32, block: u64) -> DigestBuildIterator { + fn digest_build_iterator(digest_interval: u32, digest_levels: u32, block: u64) -> DigestBuildIterator { super::digest_build_iterator(&Configuration { digest_interval, digest_levels }, block) } - fn digest_build_iterator_basic(digest_interval: u64, digest_levels: u32, block: u64) -> (u64, u64, u64) { + fn digest_build_iterator_basic(digest_interval: u32, digest_levels: u32, block: u64) -> (u64, u32, u32) { let iter = digest_build_iterator(digest_interval, digest_levels, block); (iter.block, iter.digest_interval, iter.max_step) } - fn digest_build_iterator_blocks(digest_interval: u64, digest_levels: u32, block: u64) -> Vec { + fn digest_build_iterator_blocks(digest_interval: u32, digest_levels: u32, block: u64) -> Vec { digest_build_iterator(digest_interval, digest_levels, block).collect() } @@ -122,7 +160,11 @@ mod tests { assert_eq!(digest_build_iterator_basic(4, 16, 2), empty, "digest is not required for this block"); assert_eq!(digest_build_iterator_basic(4, 16, 15), empty, "digest is not required for this block"); assert_eq!(digest_build_iterator_basic(4, 16, 17), empty, "digest is not required for this block"); - assert_eq!(digest_build_iterator_basic(::std::u64::MAX / 2 + 1, 16, ::std::u64::MAX), empty, "digest_interval * 2 is greater than u64::MAX"); + assert_eq!(digest_build_iterator_basic( + ::std::u32::MAX / 2 + 1, + 16, + ::std::u64::MAX, + ), empty, "digest_interval * 2 is greater than u64::MAX"); } #[test] diff --git a/core/state-machine/src/changes_trie/changes_iterator.rs b/core/state-machine/src/changes_trie/changes_iterator.rs index c8d6216926a1997990f6f4db9fc6774fed209494..0e4716ccab98a44028d44aa104ac9cc98ae3b8fb 100644 --- a/core/state-machine/src/changes_trie/changes_iterator.rs +++ b/core/state-machine/src/changes_trie/changes_iterator.rs @@ -21,8 +21,9 @@ use std::cell::RefCell; use std::collections::VecDeque; use parity_codec::{Decode, Encode}; use hash_db::{HashDB, Hasher}; +use num_traits::One; use trie::{Recorder, MemoryDB}; -use crate::changes_trie::{AnchorBlockId, Configuration, RootsStorage, Storage}; +use crate::changes_trie::{AnchorBlockId, Configuration, RootsStorage, Storage, BlockNumber}; use crate::changes_trie::input::{DigestIndex, ExtrinsicIndex, DigestIndexValue, ExtrinsicIndexValue}; use crate::changes_trie::storage::{TrieBackendAdapter, InMemoryStorage}; use crate::proving_backend::ProvingBackendEssence; @@ -31,25 +32,25 @@ use crate::trie_backend_essence::{TrieBackendEssence}; /// Return changes of given key at given blocks range. /// `max` is the number of best known block. /// Changes are returned in descending order (i.e. last block comes first). -pub fn key_changes<'a, S: Storage, H: Hasher>( +pub fn key_changes<'a, S: Storage, H: Hasher, Number: BlockNumber>( config: &'a Configuration, storage: &'a S, - begin: u64, - end: &'a AnchorBlockId, - max: u64, + begin: Number, + end: &'a AnchorBlockId, + max: Number, key: &'a [u8], -) -> Result, String> { +) -> Result, String> { // we can't query any roots before root - let max = ::std::cmp::min(max, end.number); + let max = ::std::cmp::min(max.clone(), end.number.clone()); Ok(DrilldownIterator { essence: DrilldownIteratorEssence { key, roots_storage: storage, storage, - begin, + begin: begin.clone(), end, - surface: surface_iterator(config, max, begin, end.number)?, + surface: surface_iterator(config, max, begin, end.number.clone())?, extrinsics: Default::default(), blocks: Default::default(), @@ -61,25 +62,25 @@ pub fn key_changes<'a, S: Storage, H: Hasher>( /// Returns proof of changes of given key at given blocks range. /// `max` is the number of best known block. -pub fn key_changes_proof, H: Hasher>( +pub fn key_changes_proof, H: Hasher, Number: BlockNumber>( config: &Configuration, storage: &S, - begin: u64, - end: &AnchorBlockId, - max: u64, + begin: Number, + end: &AnchorBlockId, + max: Number, key: &[u8], ) -> Result>, String> { // we can't query any roots before root - let max = ::std::cmp::min(max, end.number); + let max = ::std::cmp::min(max.clone(), end.number.clone()); let mut iter = ProvingDrilldownIterator { essence: DrilldownIteratorEssence { key, roots_storage: storage.clone(), storage, - begin, + begin: begin.clone(), end, - surface: surface_iterator(config, max, begin, end.number)?, + surface: surface_iterator(config, max, begin, end.number.clone())?, extrinsics: Default::default(), blocks: Default::default(), @@ -100,17 +101,17 @@ pub fn key_changes_proof, H: Hasher>( /// Check key changes proog and return changes of the key at given blocks range. /// `max` is the number of best known block. /// Changes are returned in descending order (i.e. last block comes first). -pub fn key_changes_proof_check, H: Hasher>( +pub fn key_changes_proof_check, H: Hasher, Number: BlockNumber>( config: &Configuration, roots_storage: &S, proof: Vec>, - begin: u64, - end: &AnchorBlockId, - max: u64, + begin: Number, + end: &AnchorBlockId, + max: Number, key: &[u8] -) -> Result, String> { +) -> Result, String> { // we can't query any roots before root - let max = ::std::cmp::min(max, end.number); + let max = ::std::cmp::min(max.clone(), end.number.clone()); let mut proof_db = MemoryDB::::default(); for item in proof { @@ -123,9 +124,9 @@ pub fn key_changes_proof_check, H: Hasher>( key, roots_storage, storage: &proof_db, - begin, + begin: begin.clone(), end, - surface: surface_iterator(config, max, begin, end.number)?, + surface: surface_iterator(config, max, begin, end.number.clone())?, extrinsics: Default::default(), blocks: Default::default(), @@ -137,36 +138,36 @@ pub fn key_changes_proof_check, H: Hasher>( /// Surface iterator - only traverses top-level digests from given range and tries to find /// all digest changes for the key. -pub struct SurfaceIterator<'a> { +pub struct SurfaceIterator<'a, Number: BlockNumber> { config: &'a Configuration, - begin: u64, - max: u64, - current: Option, - current_begin: u64, - digest_step: u64, + begin: Number, + max: Number, + current: Option, + current_begin: Number, + digest_step: u32, digest_level: u32, } -impl<'a> Iterator for SurfaceIterator<'a> { - type Item = Result<(u64, u32), String>; +impl<'a, Number: BlockNumber> Iterator for SurfaceIterator<'a, Number> { + type Item = Result<(Number, u32), String>; fn next(&mut self) -> Option { - let current = self.current?; + let current = self.current.clone()?; let digest_level = self.digest_level; - if current < self.digest_step { + if current < self.digest_step.into() { self.current = None; } else { - let next = current - self.digest_step; - if next == 0 || next < self.begin { + let next = current.clone() - self.digest_step.into(); + if next.is_zero() || next < self.begin { self.current = None; } else if next > self.current_begin { self.current = Some(next); } else { let (current, current_begin, digest_step, digest_level) = match - lower_bound_max_digest(self.config, self.max, self.begin, next) { + lower_bound_max_digest(self.config, self.max.clone(), self.begin.clone(), next) { Err(err) => return Some(Err(err)), Ok(range) => range, }; @@ -184,22 +185,36 @@ impl<'a> Iterator for SurfaceIterator<'a> { /// Drilldown iterator - receives 'digest points' from surface iterator and explores /// every point until extrinsic is found. -pub struct DrilldownIteratorEssence<'a, RS: 'a + RootsStorage, S: 'a + Storage, H: Hasher> where H::Out: 'a { +pub struct DrilldownIteratorEssence<'a, RS, S, H, Number> + where + RS: 'a + RootsStorage, + S: 'a + Storage, + H: Hasher, + Number: BlockNumber, + H::Out: 'a, +{ key: &'a [u8], roots_storage: &'a RS, storage: &'a S, - begin: u64, - end: &'a AnchorBlockId, - surface: SurfaceIterator<'a>, + begin: Number, + end: &'a AnchorBlockId, + surface: SurfaceIterator<'a, Number>, - extrinsics: VecDeque<(u64, u32)>, - blocks: VecDeque<(u64, u32)>, + extrinsics: VecDeque<(Number, u32)>, + blocks: VecDeque<(Number, u32)>, _hasher: ::std::marker::PhantomData, } -impl<'a, RS: 'a + RootsStorage, S: Storage, H: Hasher> DrilldownIteratorEssence<'a, RS, S, H> { - pub fn next(&mut self, trie_reader: F) -> Option> +impl<'a, RS, S, H, Number> DrilldownIteratorEssence<'a, RS, S, H, Number> + where + RS: 'a + RootsStorage, + S: 'a + Storage, + H: Hasher, + Number: BlockNumber, + H::Out: 'a, +{ + pub fn next(&mut self, trie_reader: F) -> Option> where F: FnMut(&S, H::Out, &[u8]) -> Result>, String>, { @@ -210,7 +225,7 @@ impl<'a, RS: 'a + RootsStorage, S: Storage, H: Hasher> DrilldownIteratorEs } } - fn do_next(&mut self, mut trie_reader: F) -> Result, String> + fn do_next(&mut self, mut trie_reader: F) -> Result, String> where F: FnMut(&S, H::Out, &[u8]) -> Result>, String>, { @@ -223,33 +238,33 @@ impl<'a, RS: 'a + RootsStorage, S: Storage, H: Hasher> DrilldownIteratorEs // not having a changes trie root is an error because: // we never query roots for future blocks // AND trie roots for old blocks are known (both on full + light node) - let trie_root = self.roots_storage.root(&self.end, block)? - .ok_or_else(|| format!("Changes trie root for block {} is not found", block))?; + let trie_root = self.roots_storage.root(&self.end, block.clone())? + .ok_or_else(|| format!("Changes trie root for block {} is not found", block.clone()))?; // only return extrinsics for blocks before self.max // most of blocks will be filtered out before pushing to `self.blocks` // here we just throwing away changes at digest blocks we're processing debug_assert!(block >= self.begin, "We shall not touch digests earlier than a range' begin"); if block <= self.end.number { - let extrinsics_key = ExtrinsicIndex { block, key: self.key.to_vec() }.encode(); + let extrinsics_key = ExtrinsicIndex { block: block.clone(), key: self.key.to_vec() }.encode(); let extrinsics = trie_reader(&self.storage, trie_root, &extrinsics_key); if let Some(extrinsics) = extrinsics? { let extrinsics: Option = Decode::decode(&mut &extrinsics[..]); if let Some(extrinsics) = extrinsics { - self.extrinsics.extend(extrinsics.into_iter().rev().map(|e| (block, e))); + self.extrinsics.extend(extrinsics.into_iter().rev().map(|e| (block.clone(), e))); } } } - let blocks_key = DigestIndex { block, key: self.key.to_vec() }.encode(); + let blocks_key = DigestIndex { block: block.clone(), key: self.key.to_vec() }.encode(); let blocks = trie_reader(&self.storage, trie_root, &blocks_key); if let Some(blocks) = blocks? { - let blocks: Option = Decode::decode(&mut &blocks[..]); + let blocks: Option> = Decode::decode(&mut &blocks[..]); if let Some(blocks) = blocks { // filter level0 blocks here because we tend to use digest blocks, // AND digest block changes could also include changes for out-of-range blocks - let begin = self.begin; - let end = self.end.number; + let begin = self.begin.clone(); + let end = self.end.number.clone(); self.blocks.extend(blocks.into_iter() .rev() .filter(|b| level > 1 || (*b >= begin && *b <= end)) @@ -271,14 +286,21 @@ impl<'a, RS: 'a + RootsStorage, S: Storage, H: Hasher> DrilldownIteratorEs } /// Exploring drilldown operator. -pub struct DrilldownIterator<'a, RS: 'a + RootsStorage, S: 'a + Storage, H: Hasher> where H::Out: 'a { - essence: DrilldownIteratorEssence<'a, RS, S, H>, +pub struct DrilldownIterator<'a, RS, S, H, Number> + where + Number: BlockNumber, + H: Hasher, + S: 'a + Storage, + RS: 'a + RootsStorage, + H::Out: 'a, +{ + essence: DrilldownIteratorEssence<'a, RS, S, H, Number>, } -impl<'a, RS: 'a + RootsStorage, S: Storage, H: Hasher> Iterator - for DrilldownIterator<'a, RS, S, H> +impl<'a, RS: 'a + RootsStorage, S: Storage, H: Hasher, Number: BlockNumber> Iterator + for DrilldownIterator<'a, RS, S, H, Number> { - type Item = Result<(u64, u32), String>; + type Item = Result<(Number, u32), String>; fn next(&mut self) -> Option { self.essence.next(|storage, root, key| @@ -287,12 +309,26 @@ impl<'a, RS: 'a + RootsStorage, S: Storage, H: Hasher> Iterator } /// Proving drilldown iterator. -struct ProvingDrilldownIterator<'a, RS: 'a + RootsStorage, S: 'a + Storage, H: Hasher> where H::Out: 'a { - essence: DrilldownIteratorEssence<'a, RS, S, H>, +struct ProvingDrilldownIterator<'a, RS, S, H, Number> + where + Number: BlockNumber, + H: Hasher, + S: 'a + Storage, + RS: 'a + RootsStorage, + H::Out: 'a, +{ + essence: DrilldownIteratorEssence<'a, RS, S, H, Number>, proof_recorder: RefCell>, } -impl<'a, RS: 'a + RootsStorage, S: Storage, H: Hasher> ProvingDrilldownIterator<'a, RS, S, H> { +impl<'a, RS, S, H, Number> ProvingDrilldownIterator<'a, RS, S, H, Number> + where + Number: BlockNumber, + H: Hasher, + S: 'a + Storage, + RS: 'a + RootsStorage, + H::Out: 'a, +{ /// Consume the iterator, extracting the gathered proof in lexicographical order /// by value. pub fn extract_proof(self) -> Vec> { @@ -303,8 +339,15 @@ impl<'a, RS: 'a + RootsStorage, S: Storage, H: Hasher> ProvingDrilldownIte } } -impl<'a, RS: 'a + RootsStorage, S: Storage, H: Hasher> Iterator for ProvingDrilldownIterator<'a, RS, S, H> { - type Item = Result<(u64, u32), String>; +impl<'a, RS, S, H, Number> Iterator for ProvingDrilldownIterator<'a, RS, S, H, Number> + where + Number: BlockNumber, + H: Hasher, + S: 'a + Storage, + RS: 'a + RootsStorage, + H::Out: 'a, +{ + type Item = Result<(Number, u32), String>; fn next(&mut self) -> Option { let proof_recorder = &mut *self.proof_recorder.try_borrow_mut() @@ -318,8 +361,18 @@ impl<'a, RS: 'a + RootsStorage, S: Storage, H: Hasher> Iterator for Provin } /// Returns surface iterator for given range of blocks. -fn surface_iterator<'a>(config: &'a Configuration, max: u64, begin: u64, end: u64) -> Result, String> { - let (current, current_begin, digest_step, digest_level) = lower_bound_max_digest(config, max, begin, end)?; +fn surface_iterator<'a, Number: BlockNumber>( + config: &'a Configuration, + max: Number, + begin: Number, + end: Number, +) -> Result, String> { + let (current, current_begin, digest_step, digest_level) = lower_bound_max_digest( + config, + max.clone(), + begin.clone(), + end, + )?; Ok(SurfaceIterator { config, begin, @@ -333,31 +386,32 @@ fn surface_iterator<'a>(config: &'a Configuration, max: u64, begin: u64, end: u6 /// Returns parameters of highest level digest block that includes the end of given range /// and tends to include the whole range. -fn lower_bound_max_digest( +fn lower_bound_max_digest( config: &Configuration, - max: u64, - begin: u64, - end: u64, -) -> Result<(u64, u64, u64, u32), String> { + max: Number, + begin: Number, + end: Number, +) -> Result<(Number, Number, u32, u32), String> { if end > max || begin > end { return Err("invalid changes range".into()); } let mut digest_level = 0u32; - let mut digest_step = 1u64; - let mut digest_interval = 0u64; - let mut current = end; - let mut current_begin = begin; - if begin != end { + let mut digest_step = 1u32; + let mut digest_interval = 0u32; + let mut current = end.clone(); + let mut current_begin = begin.clone(); + if current_begin != current { while digest_level != config.digest_levels { let new_digest_level = digest_level + 1; let new_digest_step = digest_step * config.digest_interval; let new_digest_interval = config.digest_interval * { if digest_interval == 0 { 1 } else { digest_interval } }; - let new_digest_begin = ((current - 1) / new_digest_interval) * new_digest_interval; - let new_digest_end = new_digest_begin + new_digest_interval; - let new_current = new_digest_begin + new_digest_interval; + let new_digest_begin = ((current.clone() - One::one()) + / new_digest_interval.into()) * new_digest_interval.into(); + let new_digest_end = new_digest_begin.clone() + new_digest_interval.into(); + let new_current = new_digest_begin.clone() + new_digest_interval.into(); if new_digest_end > max { if begin < new_digest_begin { @@ -372,7 +426,7 @@ fn lower_bound_max_digest( current = new_current; current_begin = new_digest_begin; - if new_digest_begin <= begin && new_digest_end >= end { + if current_begin <= begin && new_digest_end >= end { break; } } @@ -394,7 +448,7 @@ mod tests { use crate::changes_trie::storage::InMemoryStorage; use super::*; - fn prepare_for_drilldown() -> (Configuration, InMemoryStorage) { + fn prepare_for_drilldown() -> (Configuration, InMemoryStorage) { let config = Configuration { digest_interval: 4, digest_levels: 2 }; let backend = InMemoryStorage::with_inputs(vec![ // digest: 1..4 => [(3, 0)] @@ -436,27 +490,27 @@ mod tests { #[test] fn drilldown_iterator_works() { let (config, storage) = prepare_for_drilldown(); - let drilldown_result = key_changes::, Blake2Hasher>( + let drilldown_result = key_changes::, Blake2Hasher, u64>( &config, &storage, 0, &AnchorBlockId { hash: Default::default(), number: 16 }, 16, &[42]) .and_then(Result::from_iter); assert_eq!(drilldown_result, Ok(vec![(8, 2), (8, 1), (6, 3), (3, 0)])); - let drilldown_result = key_changes::, Blake2Hasher>( + let drilldown_result = key_changes::, Blake2Hasher, u64>( &config, &storage, 0, &AnchorBlockId { hash: Default::default(), number: 2 }, 4, &[42]) .and_then(Result::from_iter); assert_eq!(drilldown_result, Ok(vec![])); - let drilldown_result = key_changes::, Blake2Hasher>( + let drilldown_result = key_changes::, Blake2Hasher, u64>( &config, &storage, 0, &AnchorBlockId { hash: Default::default(), number: 3 }, 4, &[42]) .and_then(Result::from_iter); assert_eq!(drilldown_result, Ok(vec![(3, 0)])); - let drilldown_result = key_changes::, Blake2Hasher>( + let drilldown_result = key_changes::, Blake2Hasher, u64>( &config, &storage, 7, &AnchorBlockId { hash: Default::default(), number: 8 }, 8, &[42]) .and_then(Result::from_iter); assert_eq!(drilldown_result, Ok(vec![(8, 2), (8, 1)])); - let drilldown_result = key_changes::, Blake2Hasher>( + let drilldown_result = key_changes::, Blake2Hasher, u64>( &config, &storage, 5, &AnchorBlockId { hash: Default::default(), number: 7 }, 8, &[42]) .and_then(Result::from_iter); assert_eq!(drilldown_result, Ok(vec![(6, 3)])); @@ -467,7 +521,7 @@ mod tests { let (config, storage) = prepare_for_drilldown(); storage.clear_storage(); - assert!(key_changes::, Blake2Hasher>( + assert!(key_changes::, Blake2Hasher, u64>( &config, &storage, 0, &AnchorBlockId { hash: Default::default(), number: 100 }, 1000, &[42]) .and_then(|i| i.collect::, _>>()).is_err()); } @@ -475,9 +529,9 @@ mod tests { #[test] fn drilldown_iterator_fails_when_range_is_invalid() { let (config, storage) = prepare_for_drilldown(); - assert!(key_changes::, Blake2Hasher>( + assert!(key_changes::, Blake2Hasher, u64>( &config, &storage, 0, &AnchorBlockId { hash: Default::default(), number: 100 }, 50, &[42]).is_err()); - assert!(key_changes::, Blake2Hasher>( + assert!(key_changes::, Blake2Hasher, u64>( &config, &storage, 20, &AnchorBlockId { hash: Default::default(), number: 10 }, 100, &[42]).is_err()); } @@ -488,7 +542,7 @@ mod tests { // create drilldown iterator that records all trie nodes during drilldown let (remote_config, remote_storage) = prepare_for_drilldown(); - let remote_proof = key_changes_proof::, Blake2Hasher>( + let remote_proof = key_changes_proof::, Blake2Hasher, u64>( &remote_config, &remote_storage, 0, &AnchorBlockId { hash: Default::default(), number: 16 }, 16, &[42]).unwrap(); @@ -497,7 +551,7 @@ mod tests { // create drilldown iterator that works the same, but only depends on trie let (local_config, local_storage) = prepare_for_drilldown(); local_storage.clear_storage(); - let local_result = key_changes_proof_check::, Blake2Hasher>( + let local_result = key_changes_proof_check::, Blake2Hasher, u64>( &local_config, &local_storage, remote_proof, 0, &AnchorBlockId { hash: Default::default(), number: 16 }, 16, &[42]); diff --git a/core/state-machine/src/changes_trie/input.rs b/core/state-machine/src/changes_trie/input.rs index 3154aff715c2ba79070b6ecd6dd3c49a77c0729b..ae939c028b3e1e02aaf4e504eb5e8db3820a459e 100644 --- a/core/state-machine/src/changes_trie/input.rs +++ b/core/state-machine/src/changes_trie/input.rs @@ -17,12 +17,13 @@ //! Different types of changes trie input pairs. use parity_codec::{Decode, Encode, Input, Output}; +use crate::changes_trie::BlockNumber; /// Key of { changed key => set of extrinsic indices } mapping. #[derive(Clone, Debug, PartialEq, Eq)] -pub struct ExtrinsicIndex { +pub struct ExtrinsicIndex { /// Block at which this key has been inserted in the trie. - pub block: u64, + pub block: Number, /// Storage key this node is responsible for. pub key: Vec, } @@ -32,35 +33,35 @@ pub type ExtrinsicIndexValue = Vec; /// Key of { changed key => block/digest block numbers } mapping. #[derive(Clone, Debug, PartialEq, Eq)] -pub struct DigestIndex { +pub struct DigestIndex { /// Block at which this key has been inserted in the trie. - pub block: u64, + pub block: Number, /// Storage key this node is responsible for. pub key: Vec, } /// Value of { changed key => block/digest block numbers } mapping. -pub type DigestIndexValue = Vec; +pub type DigestIndexValue = Vec; /// Single input pair of changes trie. #[derive(Clone, Debug, PartialEq, Eq)] -pub enum InputPair { +pub enum InputPair { /// Element of { key => set of extrinsics where key has been changed } element mapping. - ExtrinsicIndex(ExtrinsicIndex, ExtrinsicIndexValue), + ExtrinsicIndex(ExtrinsicIndex, ExtrinsicIndexValue), /// Element of { key => set of blocks/digest blocks where key has been changed } element mapping. - DigestIndex(DigestIndex, DigestIndexValue), + DigestIndex(DigestIndex, DigestIndexValue), } /// Single input key of changes trie. #[derive(Clone, Debug, PartialEq, Eq)] -pub enum InputKey { +pub enum InputKey { /// Key of { key => set of extrinsics where key has been changed } element mapping. - ExtrinsicIndex(ExtrinsicIndex), + ExtrinsicIndex(ExtrinsicIndex), /// Key of { key => set of blocks/digest blocks where key has been changed } element mapping. - DigestIndex(DigestIndex), + DigestIndex(DigestIndex), } -impl Into<(Vec, Vec)> for InputPair { +impl Into<(Vec, Vec)> for InputPair { fn into(self) -> (Vec, Vec) { match self { InputPair::ExtrinsicIndex(key, value) => (key.encode(), value.encode()), @@ -69,8 +70,8 @@ impl Into<(Vec, Vec)> for InputPair { } } -impl Into for InputPair { - fn into(self) -> InputKey { +impl Into> for InputPair { + fn into(self) -> InputKey { match self { InputPair::ExtrinsicIndex(key, _) => InputKey::ExtrinsicIndex(key), InputPair::DigestIndex(key, _) => InputKey::DigestIndex(key), @@ -78,15 +79,15 @@ impl Into for InputPair { } } -impl ExtrinsicIndex { - pub fn key_neutral_prefix(block: u64) -> Vec { +impl ExtrinsicIndex { + pub fn key_neutral_prefix(block: Number) -> Vec { let mut prefix = vec![1]; prefix.extend(block.encode()); prefix } } -impl Encode for ExtrinsicIndex { +impl Encode for ExtrinsicIndex { fn encode_to(&self, dest: &mut W) { dest.push_byte(1); self.block.encode_to(dest); @@ -94,8 +95,8 @@ impl Encode for ExtrinsicIndex { } } -impl DigestIndex { - pub fn key_neutral_prefix(block: u64) -> Vec { +impl DigestIndex { + pub fn key_neutral_prefix(block: Number) -> Vec { let mut prefix = vec![2]; prefix.extend(block.encode()); prefix @@ -103,7 +104,7 @@ impl DigestIndex { } -impl Encode for DigestIndex { +impl Encode for DigestIndex { fn encode_to(&self, dest: &mut W) { dest.push_byte(2); self.block.encode_to(dest); @@ -111,7 +112,7 @@ impl Encode for DigestIndex { } } -impl Decode for InputKey { +impl Decode for InputKey { fn decode(input: &mut I) -> Option { match input.read_byte()? { 1 => Some(InputKey::ExtrinsicIndex(ExtrinsicIndex { @@ -133,17 +134,17 @@ mod tests { #[test] fn extrinsic_index_serialized_and_deserialized() { - let original = ExtrinsicIndex { block: 777, key: vec![42] }; + let original = ExtrinsicIndex { block: 777u64, key: vec![42] }; let serialized = original.encode(); - let deserialized: InputKey = Decode::decode(&mut &serialized[..]).unwrap(); + let deserialized: InputKey = Decode::decode(&mut &serialized[..]).unwrap(); assert_eq!(InputKey::ExtrinsicIndex(original), deserialized); } #[test] fn digest_index_serialized_and_deserialized() { - let original = DigestIndex { block: 777, key: vec![42] }; + let original = DigestIndex { block: 777u64, key: vec![42] }; let serialized = original.encode(); - let deserialized: InputKey = Decode::decode(&mut &serialized[..]).unwrap(); + let deserialized: InputKey = Decode::decode(&mut &serialized[..]).unwrap(); assert_eq!(InputKey::DigestIndex(original), deserialized); } } diff --git a/core/state-machine/src/changes_trie/mod.rs b/core/state-machine/src/changes_trie/mod.rs index f82d8b33df3c5192864738b742df94cf1a07b21b..7dc95fb5a7ba7350e930d93366ceb5cd1d695cfb 100644 --- a/core/state-machine/src/changes_trie/mod.rs +++ b/core/state-machine/src/changes_trie/mod.rs @@ -48,58 +48,116 @@ pub use self::prune::{prune, oldest_non_pruned_trie}; use hash_db::Hasher; use crate::backend::Backend; +use num_traits::{One, Zero}; +use parity_codec::{Decode, Encode}; use primitives; use crate::changes_trie::build::prepare_input; use crate::overlayed_changes::OverlayedChanges; -use crate::trie_backend_essence::TrieBackendStorage; use trie::{DBValue, trie_root}; /// Changes that are made outside of extrinsics are marked with this index; pub const NO_EXTRINSIC_INDEX: u32 = 0xffffffff; +/// Requirements for block number that can be used with changes tries. +pub trait BlockNumber: + Send + Sync + 'static + + ::std::fmt::Display + + Clone + + From + One + Zero + + PartialEq + Ord + + ::std::ops::Add + ::std::ops::Sub + + ::std::ops::Mul + ::std::ops::Div + + ::std::ops::Rem + + ::std::ops::AddAssign + + num_traits::CheckedMul + num_traits::CheckedSub + + Decode + Encode +{} + +impl BlockNumber for T where T: + Send + Sync + 'static + + ::std::fmt::Display + + Clone + + From + One + Zero + + PartialEq + Ord + + ::std::ops::Add + ::std::ops::Sub + + ::std::ops::Mul + ::std::ops::Div + + ::std::ops::Rem + + ::std::ops::AddAssign + + num_traits::CheckedMul + num_traits::CheckedSub + + Decode + Encode, +{} + /// Block identifier that could be used to determine fork of this block. #[derive(Debug)] -pub struct AnchorBlockId { +pub struct AnchorBlockId { /// Hash of this block. pub hash: Hash, /// Number of this block. - pub number: u64, + pub number: Number, } /// Changes trie storage. Provides access to trie roots and trie nodes. -pub trait RootsStorage: Send + Sync { +pub trait RootsStorage: Send + Sync { + /// Resolve hash of the block into anchor. + fn build_anchor(&self, hash: H::Out) -> Result, String>; /// Get changes trie root for the block with given number which is an ancestor (or the block /// itself) of the anchor_block (i.e. anchor_block.number >= block). - fn root(&self, anchor: &AnchorBlockId, block: u64) -> Result, String>; + fn root(&self, anchor: &AnchorBlockId, block: Number) -> Result, String>; } /// Changes trie storage. Provides access to trie roots and trie nodes. -pub trait Storage: RootsStorage { +pub trait Storage: RootsStorage { /// Get a trie node. fn get(&self, key: &H::Out, prefix: &[u8]) -> Result, String>; } +/// Changes trie storage -> trie backend essence adapter. +pub struct TrieBackendStorageAdapter<'a, H: Hasher, Number: BlockNumber>(pub &'a dyn Storage); + +impl<'a, H: Hasher, N: BlockNumber> crate::TrieBackendStorage for TrieBackendStorageAdapter<'a, H, N> { + type Overlay = trie::MemoryDB; + + fn get(&self, key: &H::Out, prefix: &[u8]) -> Result, String> { + self.0.get(key, prefix) + } +} + /// Changes trie configuration. pub type Configuration = primitives::ChangesTrieConfiguration; /// Compute the changes trie root and transaction for given block. -/// Returns None if there's no data to perform computation. -pub fn compute_changes_trie_root<'a, B: Backend, S: Storage, H: Hasher>( +/// Returns Err(()) if unknown `parent_hash` has been passed. +/// Returns Ok(None) if there's no data to perform computation. +/// Panics if background storage returns an error. +pub fn compute_changes_trie_root<'a, B: Backend, S: Storage, H: Hasher, Number: BlockNumber>( backend: &B, storage: Option<&'a S>, changes: &OverlayedChanges, - parent: &'a AnchorBlockId, -) -> Option<(H::Out, Vec<(Vec, Vec)>)> + parent_hash: H::Out, +) -> Result, Vec)>)>, ()> where - &'a S: TrieBackendStorage, - H::Out: Ord, + H::Out: Ord + 'static, { - let input_pairs = prepare_input::(backend, storage, changes, parent) - .expect("storage is not allowed to fail within runtime")?; - let transaction = input_pairs.into_iter() - .map(Into::into) - .collect::>(); - let root = trie_root::(transaction.iter().map(|(k, v)| (&*k, &*v))); - - Some((root, transaction)) + let (storage, config) = match (storage, changes.changes_trie_config.as_ref()) { + (Some(storage), Some(config)) => (storage, config), + _ => return Ok(None), + }; + + // build_anchor error should not be considered fatal + let parent = storage.build_anchor(parent_hash).map_err(|_| ())?; + + // storage errors are considered fatal (similar to situations when runtime fetches values from storage) + let input_pairs = prepare_input::(backend, storage, config, changes, &parent) + .expect("storage is not allowed to fail within runtime"); + match input_pairs { + Some(input_pairs) => { + let transaction = input_pairs.into_iter() + .map(Into::into) + .collect::>(); + let root = trie_root::(transaction.iter().map(|(k, v)| (&*k, &*v))); + + Ok(Some((root, transaction))) + }, + None => Ok(None), + } } diff --git a/core/state-machine/src/changes_trie/prune.rs b/core/state-machine/src/changes_trie/prune.rs index bbe5bb573b347c3ec17fb1716a3e295bfed5ce71..3aedf66f757129081c7c2417598ead6219968c96 100644 --- a/core/state-machine/src/changes_trie/prune.rs +++ b/core/state-machine/src/changes_trie/prune.rs @@ -19,24 +19,26 @@ use hash_db::Hasher; use trie::Recorder; use log::warn; +use num_traits::One; use crate::proving_backend::ProvingBackendEssence; use crate::trie_backend_essence::TrieBackendEssence; -use crate::changes_trie::{AnchorBlockId, Configuration, Storage}; +use crate::changes_trie::{AnchorBlockId, Configuration, Storage, BlockNumber}; use crate::changes_trie::storage::TrieBackendAdapter; /// Get number of oldest block for which changes trie is not pruned /// given changes trie configuration, pruning parameter and number of /// best finalized block. -pub fn oldest_non_pruned_trie( +pub fn oldest_non_pruned_trie( config: &Configuration, - min_blocks_to_keep: u64, - best_finalized_block: u64, -) -> u64 { + min_blocks_to_keep: Number, + best_finalized_block: Number, +) -> Number { let max_digest_interval = config.max_digest_interval(); - let max_digest_block = best_finalized_block - best_finalized_block % max_digest_interval; + let best_finalized_block_rem = best_finalized_block.clone() % max_digest_interval.into(); + let max_digest_block = best_finalized_block - best_finalized_block_rem; match pruning_range(config, min_blocks_to_keep, max_digest_block) { - Some((_, last_pruned_block)) => last_pruned_block + 1, - None => 1, + Some((_, last_pruned_block)) => last_pruned_block + One::one(), + None => One::one(), } } @@ -45,24 +47,32 @@ pub fn oldest_non_pruned_trie( /// `min_blocks_to_keep` blocks. We only prune changes tries at `max_digest_interval` /// ranges. /// Returns MemoryDB that contains all deleted changes tries nodes. -pub fn prune, H: Hasher, F: FnMut(H::Out)>( +pub fn prune, H: Hasher, Number: BlockNumber, F: FnMut(H::Out)>( config: &Configuration, storage: &S, - min_blocks_to_keep: u64, - current_block: &AnchorBlockId, + min_blocks_to_keep: Number, + current_block: &AnchorBlockId, mut remove_trie_node: F, -) -{ +) { // select range for pruning - let (first, last) = match pruning_range(config, min_blocks_to_keep, current_block.number) { + let (first, last) = match pruning_range(config, min_blocks_to_keep, current_block.number.clone()) { Some((first, last)) => (first, last), None => return, }; // delete changes trie for every block in range // FIXME: limit `max_digest_interval` so that this cycle won't involve huge ranges - for block in first..last+1 { - let root = match storage.root(current_block, block) { + let mut block = first; + loop { + if block >= last.clone() + One::one() { + break; + } + + let prev_block = block.clone(); + block += One::one(); + + let block = prev_block; + let root = match storage.root(current_block, block.clone()) { Ok(Some(root)) => root, Ok(None) => continue, Err(error) => { @@ -92,11 +102,15 @@ pub fn prune, H: Hasher, F: FnMut(H::Out)>( } /// Select blocks range (inclusive from both ends) for pruning changes tries in. -fn pruning_range(config: &Configuration, min_blocks_to_keep: u64, block: u64) -> Option<(u64, u64)> { +fn pruning_range( + config: &Configuration, + min_blocks_to_keep: Number, + block: Number, +) -> Option<(Number, Number)> { // compute number of changes tries we actually want to keep let (prune_interval, blocks_to_keep) = if config.is_digest_build_enabled() { // we only CAN prune at block where max-level-digest is created - let max_digest_interval = match config.digest_level_at_block(block) { + let max_digest_interval = match config.digest_level_at_block(block.clone()) { Some((digest_level, digest_interval, _)) if digest_level == config.digest_levels => digest_interval, _ => return None, @@ -108,7 +122,7 @@ fn pruning_range(config: &Configuration, min_blocks_to_keep: u64, block: u64) -> // number of blocks BEFORE current block where changes tries are not pruned ( max_digest_interval, - max_digest_intervals_to_keep.checked_mul(max_digest_interval) + max_digest_intervals_to_keep.checked_mul(&max_digest_interval.into()) ) } else { ( @@ -118,11 +132,11 @@ fn pruning_range(config: &Configuration, min_blocks_to_keep: u64, block: u64) -> }; // last block for which changes trie is pruned - let last_block_to_prune = blocks_to_keep.and_then(|b| block.checked_sub(b)); - let first_block_to_prune = last_block_to_prune.clone().and_then(|b| b.checked_sub(prune_interval)); + let last_block_to_prune = blocks_to_keep.and_then(|b| block.checked_sub(&b)); + let first_block_to_prune = last_block_to_prune.clone().and_then(|b| b.checked_sub(&prune_interval.into())); last_block_to_prune - .and_then(|last| first_block_to_prune.map(|first| (first + 1, last))) + .and_then(|last| first_block_to_prune.map(|first| (first + One::one(), last))) } /// Select pruning delay for the changes tries. To make sure we could build a changes @@ -133,13 +147,16 @@ fn pruning_range(config: &Configuration, min_blocks_to_keep: u64, block: u64) -> /// 0 or 1: means that only last changes trie is guaranteed to exists; /// 2: the last chnages trie + previous changes trie /// ... -fn max_digest_intervals_to_keep(min_blocks_to_keep: u64, max_digest_interval: u64) -> u64 { +fn max_digest_intervals_to_keep( + min_blocks_to_keep: Number, + max_digest_interval: u32, +) -> Number { // config.digest_level_at_block ensures that it is not zero debug_assert!(max_digest_interval != 0); - let max_digest_intervals_to_keep = min_blocks_to_keep / max_digest_interval; - if max_digest_intervals_to_keep == 0 { - 1 + let max_digest_intervals_to_keep = min_blocks_to_keep / max_digest_interval.into(); + if max_digest_intervals_to_keep.is_zero() { + One::one() } else { max_digest_intervals_to_keep } @@ -154,14 +171,14 @@ mod tests { use crate::changes_trie::storage::InMemoryStorage; use super::*; - fn config(interval: u64, levels: u32) -> Configuration { + fn config(interval: u32, levels: u32) -> Configuration { Configuration { digest_interval: interval, digest_levels: levels, } } - fn prune_by_collect, H: Hasher>( + fn prune_by_collect, H: Hasher>( config: &Configuration, storage: &S, min_blocks_to_keep: u64, @@ -175,7 +192,7 @@ mod tests { #[test] fn prune_works() { - fn prepare_storage() -> InMemoryStorage { + fn prepare_storage() -> InMemoryStorage { let mut mdb1 = MemoryDB::::default(); let root1 = insert_into_memory_db::(&mut mdb1, vec![(vec![10], vec![20])]).unwrap(); let mut mdb2 = MemoryDB::::default(); @@ -242,60 +259,60 @@ mod tests { #[test] fn pruning_range_works() { // DIGESTS ARE NOT CREATED + NO TRIES ARE PRUNED - assert_eq!(pruning_range(&config(10, 0), 2, 2), None); + assert_eq!(pruning_range(&config(10, 0), 2u64, 2u64), None); // DIGESTS ARE NOT CREATED + SOME TRIES ARE PRUNED - assert_eq!(pruning_range(&config(10, 0), 100, 110), Some((10, 10))); - assert_eq!(pruning_range(&config(10, 0), 100, 210), Some((110, 110))); + assert_eq!(pruning_range(&config(10, 0), 100u64, 110u64), Some((10, 10))); + assert_eq!(pruning_range(&config(10, 0), 100u64, 210u64), Some((110, 110))); // DIGESTS ARE CREATED + NO TRIES ARE PRUNED - assert_eq!(pruning_range(&config(10, 2), 2, 0), None); - assert_eq!(pruning_range(&config(10, 2), 30, 100), None); - assert_eq!(pruning_range(&config(::std::u64::MAX, 2), 1, 1024), None); - assert_eq!(pruning_range(&config(::std::u64::MAX, 2), ::std::u64::MAX, 1024), None); - assert_eq!(pruning_range(&config(32, 2), 2048, 512), None); - assert_eq!(pruning_range(&config(32, 2), 2048, 1024), None); + assert_eq!(pruning_range(&config(10, 2), 2u64, 0u64), None); + assert_eq!(pruning_range(&config(10, 2), 30u64, 100u64), None); + assert_eq!(pruning_range(&config(::std::u32::MAX, 2), 1u64, 1024u64), None); + assert_eq!(pruning_range(&config(::std::u32::MAX, 2), ::std::u64::MAX, 1024u64), None); + assert_eq!(pruning_range(&config(32, 2), 2048u64, 512u64), None); + assert_eq!(pruning_range(&config(32, 2), 2048u64, 1024u64), None); // DIGESTS ARE CREATED + SOME TRIES ARE PRUNED // when we do not want to keep any highest-level-digests // (system forces to keep at least one) - assert_eq!(pruning_range(&config(4, 2), 0, 32), Some((1, 16))); - assert_eq!(pruning_range(&config(4, 2), 0, 64), Some((33, 48))); + assert_eq!(pruning_range(&config(4, 2), 0u64, 32u64), Some((1, 16))); + assert_eq!(pruning_range(&config(4, 2), 0u64, 64u64), Some((33, 48))); // when we want to keep 1 (last) highest-level-digest - assert_eq!(pruning_range(&config(4, 2), 16, 32), Some((1, 16))); - assert_eq!(pruning_range(&config(4, 2), 16, 64), Some((33, 48))); + assert_eq!(pruning_range(&config(4, 2), 16u64, 32u64), Some((1, 16))); + assert_eq!(pruning_range(&config(4, 2), 16u64, 64u64), Some((33, 48))); // when we want to keep 1 (last) + 1 additional level digests - assert_eq!(pruning_range(&config(32, 2), 4096, 5120), Some((1, 1024))); - assert_eq!(pruning_range(&config(32, 2), 4096, 6144), Some((1025, 2048))); + assert_eq!(pruning_range(&config(32, 2), 4096u64, 5120u64), Some((1, 1024))); + assert_eq!(pruning_range(&config(32, 2), 4096u64, 6144u64), Some((1025, 2048))); } #[test] fn max_digest_intervals_to_keep_works() { - assert_eq!(max_digest_intervals_to_keep(1024, 1025), 1); - assert_eq!(max_digest_intervals_to_keep(1024, 1023), 1); - assert_eq!(max_digest_intervals_to_keep(1024, 512), 2); - assert_eq!(max_digest_intervals_to_keep(1024, 511), 2); - assert_eq!(max_digest_intervals_to_keep(1024, 100), 10); + assert_eq!(max_digest_intervals_to_keep(1024u64, 1025), 1u64); + assert_eq!(max_digest_intervals_to_keep(1024u64, 1023), 1u64); + assert_eq!(max_digest_intervals_to_keep(1024u64, 512), 2u64); + assert_eq!(max_digest_intervals_to_keep(1024u64, 511), 2u64); + assert_eq!(max_digest_intervals_to_keep(1024u64, 100), 10u64); } #[test] fn oldest_non_pruned_trie_works() { // when digests are not created at all - assert_eq!(oldest_non_pruned_trie(&config(0, 0), 100, 10), 1); - assert_eq!(oldest_non_pruned_trie(&config(0, 0), 100, 110), 11); + assert_eq!(oldest_non_pruned_trie(&config(0, 0), 100u64, 10u64), 1); + assert_eq!(oldest_non_pruned_trie(&config(0, 0), 100u64, 110u64), 11); // when only l1 digests are created - assert_eq!(oldest_non_pruned_trie(&config(100, 1), 100, 50), 1); - assert_eq!(oldest_non_pruned_trie(&config(100, 1), 100, 110), 1); - assert_eq!(oldest_non_pruned_trie(&config(100, 1), 100, 210), 101); + assert_eq!(oldest_non_pruned_trie(&config(100, 1), 100u64, 50u64), 1); + assert_eq!(oldest_non_pruned_trie(&config(100, 1), 100u64, 110u64), 1); + assert_eq!(oldest_non_pruned_trie(&config(100, 1), 100u64, 210u64), 101); // when l2 digests are created - assert_eq!(oldest_non_pruned_trie(&config(100, 2), 100, 50), 1); - assert_eq!(oldest_non_pruned_trie(&config(100, 2), 100, 110), 1); - assert_eq!(oldest_non_pruned_trie(&config(100, 2), 100, 210), 1); - assert_eq!(oldest_non_pruned_trie(&config(100, 2), 100, 10110), 1); - assert_eq!(oldest_non_pruned_trie(&config(100, 2), 100, 20110), 10001); + assert_eq!(oldest_non_pruned_trie(&config(100, 2), 100u64, 50u64), 1); + assert_eq!(oldest_non_pruned_trie(&config(100, 2), 100u64, 110u64), 1); + assert_eq!(oldest_non_pruned_trie(&config(100, 2), 100u64, 210u64), 1); + assert_eq!(oldest_non_pruned_trie(&config(100, 2), 100u64, 10110u64), 1); + assert_eq!(oldest_non_pruned_trie(&config(100, 2), 100u64, 20110u64), 10001); } } diff --git a/core/state-machine/src/changes_trie/storage.rs b/core/state-machine/src/changes_trie/storage.rs index 8363ae422108a0fca727ba4ff7256cfa6ba0f559..8da205251532c595b986a71d54f65873f12382f9 100644 --- a/core/state-machine/src/changes_trie/storage.rs +++ b/core/state-machine/src/changes_trie/storage.rs @@ -16,12 +16,12 @@ //! Changes trie storage utilities. -use std::collections::HashMap; +use std::collections::BTreeMap; use hash_db::Hasher; use trie::DBValue; use trie::MemoryDB; use parking_lot::RwLock; -use crate::changes_trie::{AnchorBlockId, RootsStorage, Storage}; +use crate::changes_trie::{RootsStorage, Storage, AnchorBlockId, BlockNumber}; use crate::trie_backend_essence::TrieBackendStorage; #[cfg(test)] @@ -32,27 +32,27 @@ use crate::backend::insert_into_memory_db; use crate::changes_trie::input::InputPair; /// In-memory implementation of changes trie storage. -pub struct InMemoryStorage { - data: RwLock>, +pub struct InMemoryStorage { + data: RwLock>, } /// Adapter for using changes trie storage as a TrieBackendEssence' storage. -pub struct TrieBackendAdapter<'a, H: Hasher, S: 'a + Storage> { +pub struct TrieBackendAdapter<'a, H: Hasher, Number: BlockNumber, S: 'a + Storage> { storage: &'a S, - _hasher: ::std::marker::PhantomData, + _hasher: ::std::marker::PhantomData<(H, Number)>, } -struct InMemoryStorageData { - roots: HashMap, +struct InMemoryStorageData { + roots: BTreeMap, mdb: MemoryDB, } -impl InMemoryStorage { +impl InMemoryStorage { /// Create the storage from given in-memory database. pub fn with_db(mdb: MemoryDB) -> Self { Self { data: RwLock::new(InMemoryStorageData { - roots: HashMap::new(), + roots: BTreeMap::new(), mdb, }), } @@ -63,10 +63,20 @@ impl InMemoryStorage { Self::with_db(Default::default()) } + /// Create the storage with given blocks. + pub fn with_blocks(blocks: Vec<(Number, H::Out)>) -> Self { + Self { + data: RwLock::new(InMemoryStorageData { + roots: blocks.into_iter().collect(), + mdb: MemoryDB::default(), + }), + } + } + #[cfg(test)] - pub fn with_inputs(inputs: Vec<(u64, Vec)>) -> Self { + pub fn with_inputs(inputs: Vec<(Number, Vec>)>) -> Self { let mut mdb = MemoryDB::default(); - let mut roots = HashMap::new(); + let mut roots = BTreeMap::new(); for (block, pairs) in inputs { let root = insert_into_memory_db::(&mut mdb, pairs.into_iter().map(Into::into)); if let Some(root) = root { @@ -101,32 +111,44 @@ impl InMemoryStorage { } /// Insert changes trie for given block. - pub fn insert(&self, block: u64, changes_trie_root: H::Out, trie: MemoryDB) { + pub fn insert(&self, block: Number, changes_trie_root: H::Out, trie: MemoryDB) { let mut data = self.data.write(); data.roots.insert(block, changes_trie_root); data.mdb.consolidate(trie); } } -impl RootsStorage for InMemoryStorage { - fn root(&self, _anchor_block: &AnchorBlockId, block: u64) -> Result, String> { +impl RootsStorage for InMemoryStorage { + fn build_anchor(&self, parent_hash: H::Out) -> Result, String> { + self.data.read().roots.iter() + .find(|(_, v)| **v == parent_hash) + .map(|(k, _)| AnchorBlockId { hash: parent_hash, number: k.clone() }) + .ok_or_else(|| format!("Can't find associated number for block {:?}", parent_hash)) + } + + fn root(&self, _anchor_block: &AnchorBlockId, block: Number) -> Result, String> { Ok(self.data.read().roots.get(&block).cloned()) } } -impl Storage for InMemoryStorage { +impl Storage for InMemoryStorage { fn get(&self, key: &H::Out, prefix: &[u8]) -> Result, String> { MemoryDB::::get(&self.data.read().mdb, key, prefix) } } -impl<'a, H: Hasher, S: 'a + Storage> TrieBackendAdapter<'a, H, S> { +impl<'a, H: Hasher, Number: BlockNumber, S: 'a + Storage> TrieBackendAdapter<'a, H, Number, S> { pub fn new(storage: &'a S) -> Self { Self { storage, _hasher: Default::default() } } } -impl<'a, H: Hasher, S: 'a + Storage> TrieBackendStorage for TrieBackendAdapter<'a, H, S> { +impl<'a, H, Number, S> TrieBackendStorage for TrieBackendAdapter<'a, H, Number, S> + where + S: 'a + Storage, + Number: BlockNumber, + H: Hasher, +{ type Overlay = MemoryDB; fn get(&self, key: &H::Out, prefix: &[u8]) -> Result, String> { diff --git a/core/state-machine/src/ext.rs b/core/state-machine/src/ext.rs index 0f5a4e2ed55fdd675705cb95eebc7842ac93377c..5a0daeb3488b9179345b9c5c09b92bf4e71e1aaa 100644 --- a/core/state-machine/src/ext.rs +++ b/core/state-machine/src/ext.rs @@ -19,9 +19,10 @@ use std::{error, fmt, cmp::Ord}; use log::warn; use crate::backend::Backend; -use crate::changes_trie::{AnchorBlockId, Storage as ChangesTrieStorage, compute_changes_trie_root}; -use crate::{Externalities, OverlayedChanges, OffchainExt, ChildStorageKey}; +use crate::changes_trie::{Storage as ChangesTrieStorage, compute_changes_trie_root}; +use crate::{Externalities, OverlayedChanges, ChildStorageKey}; use hash_db::Hasher; +use primitives::offchain; use primitives::storage::well_known_keys::is_child_storage_key; use trie::{MemoryDB, TrieDBMut, TrieMut, default_child_trie_root}; @@ -57,10 +58,9 @@ impl error::Error for Error { } /// Wraps a read-only backend, call executor, and current overlayed changes. -pub struct Ext<'a, H, B, T, O> +pub struct Ext<'a, H, N, B, T, O> where H: Hasher, - B: 'a + Backend, { /// The overlayed changes to write to. @@ -78,20 +78,23 @@ where /// This differs from `storage_transaction` behavior, because the moment when /// `storage_changes_root` is called matters + we need to remember additional /// data at this moment (block number). - changes_trie_transaction: Option<(u64, MemoryDB, H::Out)>, + changes_trie_transaction: Option<(MemoryDB, H::Out)>, /// Additional externalities for offchain workers. /// /// If None, some methods from the trait might not supported. offchain_externalities: Option<&'a mut O>, + /// Dummy usage of N arg. + _phantom: ::std::marker::PhantomData, } -impl<'a, H, B, T, O> Ext<'a, H, B, T, O> +impl<'a, H, N, B, T, O> Ext<'a, H, N, B, T, O> where H: Hasher, B: 'a + Backend, - T: 'a + ChangesTrieStorage, - O: 'a + OffchainExt, - H::Out: Ord, + T: 'a + ChangesTrieStorage, + O: 'a + offchain::Externalities, + H::Out: Ord + 'static, + N: crate::changes_trie::BlockNumber, { /// Create a new `Ext` from overlayed changes and read-only backend pub fn new( @@ -107,6 +110,7 @@ where changes_trie_storage, changes_trie_transaction: None, offchain_externalities, + _phantom: Default::default(), } } @@ -118,7 +122,7 @@ where self.storage_transaction .expect("storage_transaction always set after calling storage root; qed"), self.changes_trie_transaction - .map(|(_, tx, _)| tx), + .map(|(tx, _)| tx), ); ( @@ -137,13 +141,13 @@ where } #[cfg(test)] -impl<'a, H, B, T, O> Ext<'a, H, B, T, O> +impl<'a, H, N, B, T, O> Ext<'a, H, N, B, T, O> where H: Hasher, - B: 'a + Backend, - T: 'a + ChangesTrieStorage, - O: 'a + OffchainExt, + T: 'a + ChangesTrieStorage, + O: 'a + offchain::Externalities, + N: crate::changes_trie::BlockNumber, { pub fn storage_pairs(&self) -> Vec<(Vec, Vec)> { use std::collections::HashMap; @@ -159,13 +163,14 @@ where } } -impl<'a, B, T, H, O> Externalities for Ext<'a, H, B, T, O> +impl<'a, B, T, H, N, O> Externalities for Ext<'a, H, N, B, T, O> where H: Hasher, B: 'a + Backend, - T: 'a + ChangesTrieStorage, - O: 'a + OffchainExt, - H::Out: Ord, + T: 'a + ChangesTrieStorage, + O: 'a + offchain::Externalities, + H::Out: Ord + 'static, + N: crate::changes_trie::BlockNumber, { fn storage(&self, key: &[u8]) -> Option> { let _guard = panic_handler::AbortGuard::new(true); @@ -302,7 +307,7 @@ where .flat_map(|map| map.1.iter().map(|(k, v)| (k.clone(), v.clone()))) .chain(self.overlay.prospective.children.get(storage_key) .into_iter() - .flat_map(|map| map.1.iter().map(|(k, v)| (k.clone(), v.clone())))); + .flat_map(|map| map.1.clone().into_iter())); let root = self.backend.child_storage_root(storage_key, delta).0; @@ -313,14 +318,14 @@ where } } - fn storage_changes_root(&mut self, parent: H::Out, parent_num: u64) -> Option { + fn storage_changes_root(&mut self, parent_hash: H::Out) -> Result, ()> { let _guard = panic_handler::AbortGuard::new(true); - let root_and_tx = compute_changes_trie_root::<_, T, H>( + let root_and_tx = compute_changes_trie_root::<_, T, H, N>( self.backend, self.changes_trie_storage.clone(), self.overlay, - &AnchorBlockId { hash: parent, number: parent_num }, - ); + parent_hash, + )?; let root_and_tx = root_and_tx.map(|(root, changes)| { let mut calculated_root = Default::default(); let mut mdb = MemoryDB::default(); @@ -331,22 +336,15 @@ where } } - (parent_num + 1, mdb, root) + (mdb, root) }); - let root = root_and_tx.as_ref().map(|(_, _, root)| root.clone()); + let root = root_and_tx.as_ref().map(|(_, root)| root.clone()); self.changes_trie_transaction = root_and_tx; - root + Ok(root) } - fn submit_extrinsic(&mut self, extrinsic: Vec) -> Result<(), ()> { - let _guard = panic_handler::AbortGuard::new(true); - if let Some(ext) = self.offchain_externalities.as_mut() { - ext.submit_extrinsic(extrinsic); - Ok(()) - } else { - warn!("Call to submit_extrinsic without offchain externalities set."); - Err(()) - } + fn offchain(&mut self) -> Option<&mut dyn offchain::Externalities> { + self.offchain_externalities.as_mut().map(|x| &mut **x as _) } } @@ -363,8 +361,8 @@ mod tests { use super::*; type TestBackend = InMemory; - type TestChangesTrieStorage = InMemoryChangesTrieStorage; - type TestExt<'a> = Ext<'a, Blake2Hasher, TestBackend, TestChangesTrieStorage, crate::NeverOffchainExt>; + type TestChangesTrieStorage = InMemoryChangesTrieStorage; + type TestExt<'a> = Ext<'a, Blake2Hasher, u64, TestBackend, TestChangesTrieStorage, crate::NeverOffchainExt>; fn prepare_overlay_with_changes() -> OverlayedChanges { OverlayedChanges { @@ -391,26 +389,26 @@ mod tests { let mut overlay = prepare_overlay_with_changes(); let backend = TestBackend::default(); let mut ext = TestExt::new(&mut overlay, &backend, None, None); - assert_eq!(ext.storage_changes_root(Default::default(), 100), None); + assert_eq!(ext.storage_changes_root(Default::default()).unwrap(), None); } #[test] fn storage_changes_root_is_none_when_extrinsic_changes_are_none() { let mut overlay = prepare_overlay_with_changes(); overlay.changes_trie_config = None; - let storage = TestChangesTrieStorage::new(); + let storage = TestChangesTrieStorage::with_blocks(vec![(100, Default::default())]); let backend = TestBackend::default(); let mut ext = TestExt::new(&mut overlay, &backend, Some(&storage), None); - assert_eq!(ext.storage_changes_root(Default::default(), 100), None); + assert_eq!(ext.storage_changes_root(Default::default()).unwrap(), None); } #[test] fn storage_changes_root_is_some_when_extrinsic_changes_are_non_empty() { let mut overlay = prepare_overlay_with_changes(); - let storage = TestChangesTrieStorage::new(); + let storage = TestChangesTrieStorage::with_blocks(vec![(99, Default::default())]); let backend = TestBackend::default(); let mut ext = TestExt::new(&mut overlay, &backend, Some(&storage), None); - assert_eq!(ext.storage_changes_root(Default::default(), 99), + assert_eq!(ext.storage_changes_root(Default::default()).unwrap(), Some(hex!("5b829920b9c8d554a19ee2a1ba593c4f2ee6fc32822d083e04236d693e8358d5").into())); } @@ -418,10 +416,10 @@ mod tests { fn storage_changes_root_is_some_when_extrinsic_changes_are_empty() { let mut overlay = prepare_overlay_with_changes(); overlay.prospective.top.get_mut(&vec![1]).unwrap().value = None; - let storage = TestChangesTrieStorage::new(); + let storage = TestChangesTrieStorage::with_blocks(vec![(99, Default::default())]); let backend = TestBackend::default(); let mut ext = TestExt::new(&mut overlay, &backend, Some(&storage), None); - assert_eq!(ext.storage_changes_root(Default::default(), 99), + assert_eq!(ext.storage_changes_root(Default::default()).unwrap(), Some(hex!("bcf494e41e29a15c9ae5caa053fe3cb8b446ee3e02a254efbdec7a19235b76e4").into())); } } diff --git a/core/state-machine/src/lib.rs b/core/state-machine/src/lib.rs index daf8f915a1167fc30b9984158e6643fbc2bdba02..2c98cc8a30ff09d41e48441142206f01789bcc4d 100644 --- a/core/state-machine/src/lib.rs +++ b/core/state-machine/src/lib.rs @@ -24,7 +24,7 @@ use log::warn; use hash_db::Hasher; use parity_codec::{Decode, Encode}; use primitives::{ - storage::well_known_keys, NativeOrEncoded, NeverNativeValue, OffchainExt + storage::well_known_keys, NativeOrEncoded, NeverNativeValue, offchain }; pub mod backend; @@ -219,12 +219,10 @@ pub trait Externalities { fn child_storage_root(&mut self, storage_key: ChildStorageKey) -> Vec; /// Get the change trie root of the current storage overlay at a block with given parent. - fn storage_changes_root(&mut self, parent: H::Out, parent_num: u64) -> Option where H::Out: Ord; + fn storage_changes_root(&mut self, parent: H::Out) -> Result, ()> where H::Out: Ord; - /// Submit extrinsic. - /// - /// Returns an error in case the API is not available. - fn submit_extrinsic(&mut self, extrinsic: Vec) -> Result<(), ()>; + /// Returns offchain externalities extension if present. + fn offchain(&mut self) -> Option<&mut dyn offchain::Externalities>; } /// An implementation of offchain extensions that should never be triggered. @@ -237,8 +235,121 @@ impl NeverOffchainExt { } } -impl OffchainExt for NeverOffchainExt { - fn submit_extrinsic(&mut self, _extrinsic: Vec) { unreachable!() } +impl offchain::Externalities for NeverOffchainExt { + fn submit_transaction(&mut self, _extrinsic: Vec) -> Result<(), ()> { + unreachable!() + } + + fn new_crypto_key( + &mut self, + _crypto: offchain::CryptoKind, + ) -> Result { + unreachable!() + } + + fn encrypt( + &mut self, + _key: Option, + _data: &[u8], + ) -> Result, ()> { + unreachable!() + } + + fn decrypt( + &mut self, + _key: Option, + _data: &[u8], + ) -> Result, ()> { + unreachable!() + } + + fn sign(&mut self, _key: Option, _data: &[u8]) -> Result, ()> { + unreachable!() + } + + fn verify( + &mut self, + _key: Option, + _msg: &[u8], + _signature: &[u8], + ) -> Result { + unreachable!() + } + + fn timestamp(&mut self) -> offchain::Timestamp { + unreachable!() + } + + fn sleep_until(&mut self, _deadline: offchain::Timestamp) { + unreachable!() + } + + fn random_seed(&mut self) -> [u8; 32] { + unreachable!() + } + + fn local_storage_set(&mut self, _key: &[u8], _value: &[u8]) { + unreachable!() + } + + fn local_storage_compare_and_set(&mut self, _key: &[u8], _old_value: &[u8], _new_value: &[u8]) { + unreachable!() + } + + fn local_storage_get(&mut self, _key: &[u8]) -> Option> { + unreachable!() + } + + fn http_request_start( + &mut self, + _method: &str, + _uri: &str, + _meta: &[u8] + ) -> Result { + unreachable!() + } + + fn http_request_add_header( + &mut self, + _request_id: offchain::HttpRequestId, + _name: &str, + _value: &str + ) -> Result<(), ()> { + unreachable!() + } + + fn http_request_write_body( + &mut self, + _request_id: offchain::HttpRequestId, + _chunk: &[u8], + _deadline: Option + ) -> Result<(), offchain::HttpError> { + unreachable!() + } + + fn http_response_wait( + &mut self, + _ids: &[offchain::HttpRequestId], + _deadline: Option + ) -> Vec { + unreachable!() + } + + fn http_response_headers( + &mut self, + _request_id: offchain::HttpRequestId + ) -> Vec<(Vec, Vec)> { + unreachable!() + } + + fn http_response_read_body( + &mut self, + _request_id: offchain::HttpRequestId, + _buffer: &mut [u8], + _deadline: Option + ) -> Result { + unreachable!() + } } /// Code execution engine. @@ -338,7 +449,7 @@ pub fn always_wasm() -> ExecutionManager> { } /// Creates new substrate state machine. -pub fn new<'a, H, B, T, O, Exec>( +pub fn new<'a, H, N, B, T, O, Exec>( backend: &'a B, changes_trie_storage: Option<&'a T>, offchain_ext: Option<&'a mut O>, @@ -346,7 +457,7 @@ pub fn new<'a, H, B, T, O, Exec>( exec: &'a Exec, method: &'a str, call_data: &'a [u8], -) -> StateMachine<'a, H, B, T, O, Exec> { +) -> StateMachine<'a, H, N, B, T, O, Exec> { StateMachine { backend, changes_trie_storage, @@ -360,7 +471,7 @@ pub fn new<'a, H, B, T, O, Exec>( } /// The substrate state machine. -pub struct StateMachine<'a, H, B, T, O, Exec> { +pub struct StateMachine<'a, H, N, B, T, O, Exec> { backend: &'a B, changes_trie_storage: Option<&'a T>, offchain_ext: Option<&'a mut O>, @@ -368,16 +479,17 @@ pub struct StateMachine<'a, H, B, T, O, Exec> { exec: &'a Exec, method: &'a str, call_data: &'a [u8], - _hasher: PhantomData, + _hasher: PhantomData<(H, N)>, } -impl<'a, H, B, T, O, Exec> StateMachine<'a, H, B, T, O, Exec> where +impl<'a, H, N, B, T, O, Exec> StateMachine<'a, H, N, B, T, O, Exec> where H: Hasher, Exec: CodeExecutor, B: Backend, - T: ChangesTrieStorage, - O: OffchainExt, - H::Out: Ord, + T: ChangesTrieStorage, + O: offchain::Externalities, + H::Out: Ord + 'static, + N: crate::changes_trie::BlockNumber, { /// Execute a call using the given state backend, overlayed changes, and call executor. /// Produces a state-backend-specific "transaction" which can be used to apply the changes @@ -390,7 +502,7 @@ impl<'a, H, B, T, O, Exec> StateMachine<'a, H, B, T, O, Exec> where pub fn execute( &mut self, strategy: ExecutionStrategy, - ) -> Result<(Vec, B::Transaction, Option>), Box> { + ) -> Result<(Vec, B::Transaction, Option>), Box> { // We are not giving a native call and thus we are sure that the result can never be a native // value. self.execute_using_consensus_failure_handler::<_, NeverNativeValue, fn() -> _>( @@ -414,12 +526,11 @@ impl<'a, H, B, T, O, Exec> StateMachine<'a, H, B, T, O, Exec> where R: Decode + Encode + PartialEq, NC: FnOnce() -> result::Result + UnwindSafe, { - let offchain = self.offchain_ext.as_mut(); let mut externalities = ext::Ext::new( self.overlay, self.backend, self.changes_trie_storage, - offchain.map(|x| &mut **x), + self.offchain_ext.as_mut().map(|x| &mut **x), ); let (result, was_native) = self.exec.call( &mut externalities, @@ -502,7 +613,7 @@ impl<'a, H, B, T, O, Exec> StateMachine<'a, H, B, T, O, Exec> where manager: ExecutionManager, compute_tx: bool, mut native_call: Option, - ) -> Result<(NativeOrEncoded, Option, Option>), Box> where + ) -> Result<(NativeOrEncoded, Option, Option>), Box> where R: Decode + Encode + PartialEq, NC: FnOnce() -> result::Result + UnwindSafe, Handler: FnOnce( @@ -558,21 +669,21 @@ impl<'a, H, B, T, O, Exec> StateMachine<'a, H, B, T, O, Exec> where /// Prove execution using the given state backend, overlayed changes, and call executor. pub fn prove_execution( - backend: B, + mut backend: B, overlay: &mut OverlayedChanges, exec: &Exec, method: &str, call_data: &[u8], -) -> Result<(Vec, Vec>), Box> +) -> Result<(Vec, Vec>), Box> where B: Backend, H: Hasher, Exec: CodeExecutor, - H::Out: Ord, + H::Out: Ord + 'static, { - let trie_backend = backend.try_into_trie_backend() - .ok_or_else(|| Box::new(ExecutionError::UnableToGenerateProof) as Box)?; - prove_execution_on_trie_backend(&trie_backend, overlay, exec, method, call_data) + let trie_backend = backend.as_trie_backend() + .ok_or_else(|| Box::new(ExecutionError::UnableToGenerateProof) as Box)?; + prove_execution_on_trie_backend(trie_backend, overlay, exec, method, call_data) } /// Prove execution using the given trie backend, overlayed changes, and call executor. @@ -590,17 +701,17 @@ pub fn prove_execution_on_trie_backend( exec: &Exec, method: &str, call_data: &[u8], -) -> Result<(Vec, Vec>), Box> +) -> Result<(Vec, Vec>), Box> where S: trie_backend_essence::TrieBackendStorage, H: Hasher, Exec: CodeExecutor, - H::Out: Ord, + H::Out: Ord + 'static, { let proving_backend = proving_backend::ProvingBackend::new(trie_backend); let mut sm = StateMachine { backend: &proving_backend, - changes_trie_storage: None as Option<&changes_trie::InMemoryStorage>, + changes_trie_storage: None as Option<&changes_trie::InMemoryStorage>, offchain_ext: NeverOffchainExt::new(), overlay, exec, @@ -625,11 +736,11 @@ pub fn execution_proof_check( exec: &Exec, method: &str, call_data: &[u8], -) -> Result, Box> +) -> Result, Box> where H: Hasher, Exec: CodeExecutor, - H::Out: Ord, + H::Out: Ord + 'static, { let trie_backend = create_proof_check_backend::(root.into(), proof)?; execution_proof_check_on_trie_backend(&trie_backend, overlay, exec, method, call_data) @@ -642,15 +753,15 @@ pub fn execution_proof_check_on_trie_backend( exec: &Exec, method: &str, call_data: &[u8], -) -> Result, Box> +) -> Result, Box> where H: Hasher, Exec: CodeExecutor, - H::Out: Ord, + H::Out: Ord + 'static, { let mut sm = StateMachine { backend: trie_backend, - changes_trie_storage: None as Option<&changes_trie::InMemoryStorage>, + changes_trie_storage: None as Option<&changes_trie::InMemoryStorage>, offchain_ext: NeverOffchainExt::new(), overlay, exec, @@ -667,35 +778,35 @@ where /// Generate storage read proof. pub fn prove_read( - backend: B, + mut backend: B, key: &[u8] -) -> Result<(Option>, Vec>), Box> +) -> Result<(Option>, Vec>), Box> where B: Backend, H: Hasher, H::Out: Ord { - let trie_backend = backend.try_into_trie_backend() + let trie_backend = backend.as_trie_backend() .ok_or_else( - ||Box::new(ExecutionError::UnableToGenerateProof) as Box + ||Box::new(ExecutionError::UnableToGenerateProof) as Box )?; - prove_read_on_trie_backend(&trie_backend, key) + prove_read_on_trie_backend(trie_backend, key) } /// Generate child storage read proof. pub fn prove_child_read( - backend: B, + mut backend: B, storage_key: &[u8], key: &[u8], -) -> Result<(Option>, Vec>), Box> +) -> Result<(Option>, Vec>), Box> where B: Backend, H: Hasher, H::Out: Ord { - let trie_backend = backend.try_into_trie_backend() - .ok_or_else(|| Box::new(ExecutionError::UnableToGenerateProof) as Box)?; - prove_child_read_on_trie_backend(&trie_backend, storage_key, key) + let trie_backend = backend.as_trie_backend() + .ok_or_else(|| Box::new(ExecutionError::UnableToGenerateProof) as Box)?; + prove_child_read_on_trie_backend(trie_backend, storage_key, key) } @@ -703,14 +814,14 @@ where pub fn prove_read_on_trie_backend( trie_backend: &TrieBackend, key: &[u8] -) -> Result<(Option>, Vec>), Box> +) -> Result<(Option>, Vec>), Box> where S: trie_backend_essence::TrieBackendStorage, H: Hasher, H::Out: Ord { let proving_backend = proving_backend::ProvingBackend::<_, H>::new(trie_backend); - let result = proving_backend.storage(key).map_err(|e| Box::new(e) as Box)?; + let result = proving_backend.storage(key).map_err(|e| Box::new(e) as Box)?; Ok((result, proving_backend.extract_proof())) } @@ -719,15 +830,14 @@ pub fn prove_child_read_on_trie_backend( trie_backend: &TrieBackend, storage_key: &[u8], key: &[u8] -) -> Result<(Option>, Vec>), Box> +) -> Result<(Option>, Vec>), Box> where S: trie_backend_essence::TrieBackendStorage, H: Hasher, H::Out: Ord { let proving_backend = proving_backend::ProvingBackend::<_, H>::new(trie_backend); - let result = proving_backend.child_storage(storage_key, key) - .map_err(|e| Box::new(e) as Box)?; + let result = proving_backend.child_storage(storage_key, key).map_err(|e| Box::new(e) as Box)?; Ok((result, proving_backend.extract_proof())) } @@ -736,7 +846,7 @@ pub fn read_proof_check( root: H::Out, proof: Vec>, key: &[u8], -) -> Result>, Box> +) -> Result>, Box> where H: Hasher, H::Out: Ord @@ -751,7 +861,7 @@ pub fn read_child_proof_check( proof: Vec>, storage_key: &[u8], key: &[u8], -) -> Result>, Box> +) -> Result>, Box> where H: Hasher, H::Out: Ord @@ -765,12 +875,12 @@ where pub fn read_proof_check_on_proving_backend( proving_backend: &TrieBackend, H>, key: &[u8], -) -> Result>, Box> +) -> Result>, Box> where H: Hasher, H::Out: Ord { - proving_backend.storage(key).map_err(|e| Box::new(e) as Box) + proving_backend.storage(key).map_err(|e| Box::new(e) as Box) } /// Check child storage read proof on pre-created proving backend. @@ -778,20 +888,24 @@ pub fn read_child_proof_check_on_proving_backend( proving_backend: &TrieBackend, H>, storage_key: &[u8], key: &[u8], -) -> Result>, Box> +) -> Result>, Box> where H: Hasher, H::Out: Ord { - proving_backend.child_storage(storage_key, key).map_err(|e| Box::new(e) as Box) + proving_backend.child_storage(storage_key, key).map_err(|e| Box::new(e) as Box) } /// Sets overlayed changes' changes trie configuration. Returns error if configuration /// differs from previous OR config decode has failed. -pub(crate) fn set_changes_trie_config(overlay: &mut OverlayedChanges, config: Option>, final_check: bool) -> Result<(), Box> { +pub(crate) fn set_changes_trie_config( + overlay: &mut OverlayedChanges, + config: Option>, + final_check: bool, +) -> Result<(), Box> { let config = match config { Some(v) => Some(Decode::decode(&mut &v[..]) - .ok_or_else(|| Box::new("Failed to decode changes trie configuration".to_owned()) as Box)?), + .ok_or_else(|| Box::new("Failed to decode changes trie configuration".to_owned()) as Box)?), None => None, }; @@ -809,16 +923,16 @@ pub(crate) fn set_changes_trie_config(overlay: &mut OverlayedChanges, config: Op /// Reads storage value from overlay or from the backend. fn try_read_overlay_value(overlay: &OverlayedChanges, backend: &B, key: &[u8]) - -> Result>, Box> + -> Result>, Box> where H: Hasher, - B: Backend, { match overlay.storage(key).map(|x| x.map(|x| x.to_vec())) { Some(value) => Ok(value), - None => backend.storage(key) - .map_err(|err| Box::new(ExecutionError::Backend(format!("{}", err))) as Box), + None => backend + .storage(key) + .map_err(|err| Box::new(ExecutionError::Backend(format!("{}", err))) as Box), } } @@ -892,7 +1006,7 @@ mod tests { fn execute_works() { assert_eq!(new( &trie_backend::tests::test_trie(), - Some(&InMemoryChangesTrieStorage::new()), + Some(&InMemoryChangesTrieStorage::::new()), NeverOffchainExt::new(), &mut Default::default(), &DummyCodeExecutor { @@ -913,7 +1027,7 @@ mod tests { fn execute_works_with_native_else_wasm() { assert_eq!(new( &trie_backend::tests::test_trie(), - Some(&InMemoryChangesTrieStorage::new()), + Some(&InMemoryChangesTrieStorage::::new()), NeverOffchainExt::new(), &mut Default::default(), &DummyCodeExecutor { @@ -934,7 +1048,7 @@ mod tests { let mut consensus_failed = false; assert!(new( &trie_backend::tests::test_trie(), - Some(&InMemoryChangesTrieStorage::new()), + Some(&InMemoryChangesTrieStorage::::new()), NeverOffchainExt::new(), &mut Default::default(), &DummyCodeExecutor { @@ -948,7 +1062,6 @@ mod tests { ).execute_using_consensus_failure_handler::<_, NeverNativeValue, fn() -> _>( ExecutionManager::Both(|we, _ne| { consensus_failed = true; - println!("HELLO!"); we }), true, @@ -989,7 +1102,8 @@ mod tests { b"abc".to_vec() => b"2".to_vec(), b"bbb".to_vec() => b"3".to_vec() ]; - let backend = InMemory::::from(initial).try_into_trie_backend().unwrap(); + let mut state = InMemory::::from(initial); + let backend = state.as_trie_backend().unwrap(); let mut overlay = OverlayedChanges { committed: map![ b"aba".to_vec() => OverlayedValue::from(Some(b"1312".to_vec())), @@ -1003,8 +1117,8 @@ mod tests { }; { - let changes_trie_storage = InMemoryChangesTrieStorage::new(); - let mut ext = Ext::new(&mut overlay, &backend, Some(&changes_trie_storage), NeverOffchainExt::new()); + let changes_trie_storage = InMemoryChangesTrieStorage::::new(); + let mut ext = Ext::new(&mut overlay, backend, Some(&changes_trie_storage), NeverOffchainExt::new()); ext.clear_prefix(b"ab"); } overlay.commit_prospective(); @@ -1025,12 +1139,13 @@ mod tests { #[test] fn set_child_storage_works() { - let backend = InMemory::::default().try_into_trie_backend().unwrap(); - let changes_trie_storage = InMemoryChangesTrieStorage::new(); + let mut state = InMemory::::default(); + let backend = state.as_trie_backend().unwrap(); + let changes_trie_storage = InMemoryChangesTrieStorage::::new(); let mut overlay = OverlayedChanges::default(); let mut ext = Ext::new( &mut overlay, - &backend, + backend, Some(&changes_trie_storage), NeverOffchainExt::new() ); @@ -1106,7 +1221,7 @@ mod tests { fn cannot_change_changes_trie_config() { assert!(new( &trie_backend::tests::test_trie(), - Some(&InMemoryChangesTrieStorage::new()), + Some(&InMemoryChangesTrieStorage::::new()), NeverOffchainExt::new(), &mut Default::default(), &DummyCodeExecutor { @@ -1126,7 +1241,7 @@ mod tests { fn cannot_change_changes_trie_config_with_native_else_wasm() { assert!(new( &trie_backend::tests::test_trie(), - Some(&InMemoryChangesTrieStorage::new()), + Some(&InMemoryChangesTrieStorage::::new()), NeverOffchainExt::new(), &mut Default::default(), &DummyCodeExecutor { diff --git a/core/state-machine/src/overlayed_changes.rs b/core/state-machine/src/overlayed_changes.rs index e595cff0e4e4abc3af11b00e4d313e5401038a86..7d6d6081bd26bc9e1c211d94a7fd015e975f18a6 100644 --- a/core/state-machine/src/overlayed_changes.rs +++ b/core/state-machine/src/overlayed_changes.rs @@ -255,9 +255,13 @@ impl OverlayedChanges { /// /// Panics: /// Will panic if there are any uncommitted prospective changes. - pub fn into_committed(self) -> impl Iterator, Option>)> { + pub fn into_committed(self) -> ( + impl Iterator, Option>)>, + impl Iterator, impl Iterator, Option>)>)>, + ){ assert!(self.prospective.is_empty()); - self.committed.top.into_iter().map(|(k, v)| (k, v.value)) + (self.committed.top.into_iter().map(|(k, v)| (k, v.value)), + self.committed.children.into_iter().map(|(sk, v)| (sk, v.1.into_iter()))) } /// Inserts storage entry responsible for current extrinsic index. @@ -361,7 +365,7 @@ mod tests { ..Default::default() }; - let changes_trie_storage = InMemoryChangesTrieStorage::new(); + let changes_trie_storage = InMemoryChangesTrieStorage::::new(); let mut ext = Ext::new( &mut overlay, &backend, diff --git a/core/state-machine/src/proving_backend.rs b/core/state-machine/src/proving_backend.rs index fa7e94f78f297f20cf465fd60b6a8e7676fccf95..19f779e067b2cc3b214703da3282f05a8de5daf6 100644 --- a/core/state-machine/src/proving_backend.rs +++ b/core/state-machine/src/proving_backend.rs @@ -162,10 +162,14 @@ impl<'a, S, H> Backend for ProvingBackend<'a, S, H> self.backend.pairs() } - fn keys(&self, prefix: &Vec) -> Vec> { + fn keys(&self, prefix: &[u8]) -> Vec> { self.backend.keys(prefix) } + fn child_keys(&self, child_storage_key: &[u8], prefix: &[u8]) -> Vec> { + self.backend.child_keys(child_storage_key, prefix) + } + fn storage_root(&self, delta: I) -> (H::Out, Self::Transaction) where I: IntoIterator, Option>)> { @@ -180,7 +184,7 @@ impl<'a, S, H> Backend for ProvingBackend<'a, S, H> self.backend.child_storage_root(storage_key, delta) } - fn try_into_trie_backend(self) -> Option> { + fn as_trie_backend(&mut self) -> Option<&TrieBackend> { None } } @@ -189,17 +193,17 @@ impl<'a, S, H> Backend for ProvingBackend<'a, S, H> pub fn create_proof_check_backend( root: H::Out, proof: Vec> -) -> Result, H>, Box> +) -> Result, H>, Box> where H: Hasher, { let db = create_proof_check_backend_storage(proof); - if !db.contains(&root, &[]) { - return Err(Box::new(ExecutionError::InvalidProof) as Box); + if db.contains(&root, &[]) { + Ok(TrieBackend::new(db, root)) + } else { + Err(Box::new(ExecutionError::InvalidProof)) } - - Ok(TrieBackend::new(db, root)) } /// Create in-memory storage of proof check backend. @@ -224,7 +228,9 @@ mod tests { use primitives::{Blake2Hasher}; use crate::ChildStorageKey; - fn test_proving<'a>(trie_backend: &'a TrieBackend, Blake2Hasher>) -> ProvingBackend<'a, PrefixedMemoryDB, Blake2Hasher> { + fn test_proving<'a>( + trie_backend: &'a TrieBackend,Blake2Hasher>, + ) -> ProvingBackend<'a, PrefixedMemoryDB, Blake2Hasher> { ProvingBackend::new(trie_backend) } @@ -265,16 +271,16 @@ mod tests { fn proof_recorded_and_checked() { let contents = (0..64).map(|i| (None, vec![i], Some(vec![i]))).collect::>(); let in_memory = InMemory::::default(); - let in_memory = in_memory.update(contents); + let mut in_memory = in_memory.update(contents); let in_memory_root = in_memory.storage_root(::std::iter::empty()).0; (0..64).for_each(|i| assert_eq!(in_memory.storage(&[i]).unwrap().unwrap(), vec![i])); - let trie = in_memory.try_into_trie_backend().unwrap(); + let trie = in_memory.as_trie_backend().unwrap(); let trie_root = trie.storage_root(::std::iter::empty()).0; assert_eq!(in_memory_root, trie_root); (0..64).for_each(|i| assert_eq!(trie.storage(&[i]).unwrap().unwrap(), vec![i])); - let proving = ProvingBackend::new(&trie); + let proving = ProvingBackend::new(trie); assert_eq!(proving.storage(&[42]).unwrap().unwrap(), vec![42]); let proof = proving.extract_proof(); @@ -298,7 +304,7 @@ mod tests { .chain((10..15).map(|i| (Some(own2.clone()), vec![i], Some(vec![i])))) .collect::>(); let in_memory = InMemory::::default(); - let in_memory = in_memory.update(contents); + let mut in_memory = in_memory.update(contents); let in_memory_root = in_memory.full_storage_root::<_, Vec<_>, _>( ::std::iter::empty(), in_memory.child_storage_keys().map(|k|(k.to_vec(), Vec::new())) @@ -316,7 +322,7 @@ mod tests { vec![i] )); - let trie = in_memory.try_into_trie_backend().unwrap(); + let trie = in_memory.as_trie_backend().unwrap(); let trie_root = trie.storage_root(::std::iter::empty()).0; assert_eq!(in_memory_root, trie_root); (0..64).for_each(|i| assert_eq!( @@ -324,7 +330,7 @@ mod tests { vec![i] )); - let proving = ProvingBackend::new(&trie); + let proving = ProvingBackend::new(trie); assert_eq!(proving.storage(&[42]).unwrap().unwrap(), vec![42]); let proof = proving.extract_proof(); @@ -339,7 +345,7 @@ mod tests { assert_eq!(proof_check.storage(&[41]).unwrap().unwrap(), vec![41]); assert_eq!(proof_check.storage(&[64]).unwrap(), None); - let proving = ProvingBackend::new(&trie); + let proving = ProvingBackend::new(trie); assert_eq!(proving.child_storage(&own1[..], &[64]), Ok(Some(vec![64]))); let proof = proving.extract_proof(); diff --git a/core/state-machine/src/testing.rs b/core/state-machine/src/testing.rs index a4f650bcf212aa9677d90590b21eefd96fcbc6de..68b9d28752c28215131c61e1c71f99f457d3dcda 100644 --- a/core/state-machine/src/testing.rs +++ b/core/state-machine/src/testing.rs @@ -16,25 +16,31 @@ //! Test implementation for Externalities. -use std::collections::HashMap; +use std::collections::{HashMap, BTreeMap}; use std::iter::FromIterator; use hash_db::Hasher; -use trie::trie_root; -use crate::backend::InMemory; -use crate::changes_trie::{compute_changes_trie_root, InMemoryStorage as ChangesTrieInMemoryStorage, AnchorBlockId}; +use crate::backend::{InMemory, Backend}; +use primitives::storage::well_known_keys::is_child_storage_key; +use crate::changes_trie::{ + compute_changes_trie_root, InMemoryStorage as ChangesTrieInMemoryStorage, + BlockNumber as ChangesTrieBlockNumber, +}; +use primitives::offchain; use primitives::storage::well_known_keys::{CHANGES_TRIE_CONFIG, CODE, HEAP_PAGES}; use parity_codec::Encode; use super::{ChildStorageKey, Externalities, OverlayedChanges}; +const EXT_NOT_ALLOWED_TO_FAIL: &str = "Externalities not allowed to fail within runtime"; + /// Simple HashMap-based Externalities impl. -pub struct TestExternalities { - inner: HashMap, Vec>, - changes_trie_storage: ChangesTrieInMemoryStorage, - changes: OverlayedChanges, - code: Option>, +pub struct TestExternalities { + overlay: OverlayedChanges, + backend: InMemory, + changes_trie_storage: ChangesTrieInMemoryStorage, + offchain: Option>, } -impl TestExternalities { +impl TestExternalities { /// Create a new instance of `TestExternalities` pub fn new(inner: HashMap, Vec>) -> Self { Self::new_with_code(&[], inner) @@ -43,6 +49,7 @@ impl TestExternalities { /// Create a new instance of `TestExternalities` pub fn new_with_code(code: &[u8], mut inner: HashMap, Vec>) -> Self { let mut overlay = OverlayedChanges::default(); + super::set_changes_trie_config( &mut overlay, inner.get(&CHANGES_TRIE_CONFIG.to_vec()).cloned(), @@ -50,128 +57,187 @@ impl TestExternalities { ).expect("changes trie configuration is correct in test env; qed"); inner.insert(HEAP_PAGES.to_vec(), 8u64.encode()); + inner.insert(CODE.to_vec(), code.to_vec()); TestExternalities { - inner, + overlay, changes_trie_storage: ChangesTrieInMemoryStorage::new(), - changes: overlay, - code: Some(code.to_vec()), + backend: inner.into(), + offchain: None, } } - /// Insert key/value - pub fn insert(&mut self, k: Vec, v: Vec) -> Option> { - self.inner.insert(k, v) + /// Insert key/value into backend + pub fn insert(&mut self, k: Vec, v: Vec) { + self.backend = self.backend.update(vec![(None, k, Some(v))]); + } + + /// Iter to all pairs in key order + pub fn iter_pairs_in_order(&self) -> impl Iterator, Vec)> { + self.backend.pairs().iter() + .map(|&(ref k, ref v)| (k.to_vec(), Some(v.to_vec()))) + .chain(self.overlay.committed.top.clone().into_iter().map(|(k, v)| (k, v.value))) + .chain(self.overlay.prospective.top.clone().into_iter().map(|(k, v)| (k, v.value))) + .collect::>() + .into_iter() + .filter_map(|(k, maybe_val)| maybe_val.map(|val| (k, val))) + } + + /// Set offchain externaltiies. + pub fn set_offchain_externalities(&mut self, offchain: impl offchain::Externalities + 'static) { + self.offchain = Some(Box::new(offchain)); + } + + /// Get mutable reference to changes trie storage. + pub fn changes_trie_storage(&mut self) -> &mut ChangesTrieInMemoryStorage { + &mut self.changes_trie_storage } } -impl ::std::fmt::Debug for TestExternalities { +impl ::std::fmt::Debug for TestExternalities { fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "{:?}", self.inner) + write!(f, "overlay: {:?}\nbackend: {:?}", self.overlay, self.backend.pairs()) } } -impl PartialEq for TestExternalities { - fn eq(&self, other: &TestExternalities) -> bool { - self.inner.eq(&other.inner) +impl PartialEq for TestExternalities { + /// This doesn't test if they are in the same state, only if they contains the + /// same data at this state + fn eq(&self, other: &TestExternalities) -> bool { + self.iter_pairs_in_order().eq(other.iter_pairs_in_order()) } } -impl FromIterator<(Vec, Vec)> for TestExternalities { +impl FromIterator<(Vec, Vec)> for TestExternalities { fn from_iter, Vec)>>(iter: I) -> Self { let mut t = Self::new(Default::default()); - t.inner.extend(iter); + t.backend = t.backend.update(iter.into_iter().map(|(k, v)| (None, k, Some(v))).collect()); t } } -impl Default for TestExternalities { +impl Default for TestExternalities { fn default() -> Self { Self::new(Default::default()) } } -impl From> for HashMap, Vec> { - fn from(tex: TestExternalities) -> Self { - tex.inner.into() +impl From> for HashMap, Vec> { + fn from(tex: TestExternalities) -> Self { + tex.iter_pairs_in_order().collect() } } -impl From< HashMap, Vec> > for TestExternalities { +impl From< HashMap, Vec> > for TestExternalities { fn from(hashmap: HashMap, Vec>) -> Self { - TestExternalities { - inner: hashmap, - changes_trie_storage: ChangesTrieInMemoryStorage::new(), - changes: Default::default(), - code: None, - } + Self::from_iter(hashmap) } } -// TODO child test primitives are currently limited to `changes` (for non child the way -// things are defined seems utterly odd to (put changes in changes but never make them -// available for read through inner) -impl Externalities for TestExternalities where H::Out: Ord { +impl Externalities for TestExternalities + where + H: Hasher, + N: ChangesTrieBlockNumber, + H::Out: Ord + 'static +{ fn storage(&self, key: &[u8]) -> Option> { - match key { - CODE => self.code.clone(), - _ => self.inner.get(key).cloned(), - } + self.overlay.storage(key).map(|x| x.map(|x| x.to_vec())).unwrap_or_else(|| + self.backend.storage(key).expect(EXT_NOT_ALLOWED_TO_FAIL)) } fn original_storage(&self, key: &[u8]) -> Option> { - self.storage(key) + self.backend.storage(key).expect(EXT_NOT_ALLOWED_TO_FAIL) } fn child_storage(&self, storage_key: ChildStorageKey, key: &[u8]) -> Option> { - self.changes.child_storage(storage_key.as_ref(), key)?.map(Vec::from) + self.overlay + .child_storage(storage_key.as_ref(), key) + .map(|x| x.map(|x| x.to_vec())) + .unwrap_or_else(|| self.backend + .child_storage(storage_key.as_ref(), key) + .expect(EXT_NOT_ALLOWED_TO_FAIL) + ) } fn place_storage(&mut self, key: Vec, maybe_value: Option>) { - self.changes.set_storage(key.clone(), maybe_value.clone()); - match key.as_ref() { - CODE => self.code = maybe_value, - _ => { - match maybe_value { - Some(value) => { self.inner.insert(key, value); } - None => { self.inner.remove(&key); } - } - } + if is_child_storage_key(&key) { + panic!("Refuse to directly set child storage key"); } + + self.overlay.set_storage(key, maybe_value); } - fn place_child_storage(&mut self, storage_key: ChildStorageKey, key: Vec, value: Option>) { - self.changes.set_child_storage(storage_key.into_owned(), key, value); + fn place_child_storage( + &mut self, + storage_key: ChildStorageKey, + key: Vec, + value: Option> + ) { + self.overlay.set_child_storage(storage_key.into_owned(), key, value); } fn kill_child_storage(&mut self, storage_key: ChildStorageKey) { - self.changes.clear_child_storage(storage_key.as_ref()); + let backend = &self.backend; + let overlay = &mut self.overlay; + + overlay.clear_child_storage(storage_key.as_ref()); + backend.for_keys_in_child_storage(storage_key.as_ref(), |key| { + overlay.set_child_storage(storage_key.as_ref().to_vec(), key.to_vec(), None); + }); } fn clear_prefix(&mut self, prefix: &[u8]) { - self.changes.clear_prefix(prefix); - self.inner.retain(|key, _| !key.starts_with(prefix)); + if is_child_storage_key(prefix) { + panic!("Refuse to directly clear prefix that is part of child storage key"); + } + + self.overlay.clear_prefix(prefix); + + let backend = &self.backend; + let overlay = &mut self.overlay; + backend.for_keys_with_prefix(prefix, |key| { + overlay.set_storage(key.to_vec(), None); + }); } fn chain_id(&self) -> u64 { 42 } fn storage_root(&mut self) -> H::Out { - trie_root::(self.inner.clone()) + // compute and memoize + let delta = self.overlay.committed.top.iter().map(|(k, v)| (k.clone(), v.value.clone())) + .chain(self.overlay.prospective.top.iter().map(|(k, v)| (k.clone(), v.value.clone()))); + + self.backend.storage_root(delta).0 } - fn child_storage_root(&mut self, _storage_key: ChildStorageKey) -> Vec { - vec![] + fn child_storage_root(&mut self, storage_key: ChildStorageKey) -> Vec { + let storage_key = storage_key.as_ref(); + + let (root, _, _) = { + let delta = self.overlay.committed.children.get(storage_key) + .into_iter() + .flat_map(|map| map.1.iter().map(|(k, v)| (k.clone(), v.clone()))) + .chain(self.overlay.prospective.children.get(storage_key) + .into_iter() + .flat_map(|map| map.1.clone().into_iter())); + + self.backend.child_storage_root(storage_key, delta) + }; + self.overlay.set_storage(storage_key.into(), Some(root.clone())); + root } - fn storage_changes_root(&mut self, parent: H::Out, parent_num: u64) -> Option { - compute_changes_trie_root::<_, _, H>( - &InMemory::default(), + fn storage_changes_root(&mut self, parent: H::Out) -> Result, ()> { + Ok(compute_changes_trie_root::<_, _, H, N>( + &self.backend, Some(&self.changes_trie_storage), - &self.changes, - &AnchorBlockId { hash: parent, number: parent_num }, - ).map(|(root, _)| root.clone()) + &self.overlay, + parent, + )?.map(|(root, _)| root.clone())) } - fn submit_extrinsic(&mut self, _extrinsic: Vec) -> Result<(), ()> { - unimplemented!() + fn offchain(&mut self) -> Option<&mut dyn offchain::Externalities> { + self.offchain + .as_mut() + .map(|x| &mut **x as _) } } @@ -183,17 +249,17 @@ mod tests { #[test] fn commit_should_work() { - let mut ext = TestExternalities::::default(); + let mut ext = TestExternalities::::default(); ext.set_storage(b"doe".to_vec(), b"reindeer".to_vec()); ext.set_storage(b"dog".to_vec(), b"puppy".to_vec()); ext.set_storage(b"dogglesworth".to_vec(), b"cat".to_vec()); - const ROOT: [u8; 32] = hex!("0b33ed94e74e0f8e92a55923bece1ed02d16cf424e124613ddebc53ac3eeeabe"); + const ROOT: [u8; 32] = hex!("cc65c26c37ebd4abcdeb3f1ecd727527051620779a2f6c809bac0f8a87dbb816"); assert_eq!(ext.storage_root(), H256::from(ROOT)); } #[test] fn set_and_retrieve_code() { - let mut ext = TestExternalities::::default(); + let mut ext = TestExternalities::::default(); let code = vec![1, 2, 3]; ext.set_storage(CODE.to_vec(), code.clone()); diff --git a/core/state-machine/src/trie_backend.rs b/core/state-machine/src/trie_backend.rs index 1ce915d5f50ebf842dfa21f085721475b93cd829..0c57cf3682fba175835b875634539da969aefa06 100644 --- a/core/state-machine/src/trie_backend.rs +++ b/core/state-machine/src/trie_backend.rs @@ -105,7 +105,7 @@ impl, H: Hasher> Backend for TrieBackend where } } - fn keys(&self, prefix: &Vec) -> Vec> { + fn keys(&self, prefix: &[u8]) -> Vec> { let mut read_overlay = S::Overlay::default(); let eph = Ephemeral::new(self.essence.backend_storage(), &mut read_overlay); @@ -179,7 +179,7 @@ impl, H: Hasher> Backend for TrieBackend where (root, is_default, write_overlay) } - fn try_into_trie_backend(self) -> Option> { + fn as_trie_backend(&mut self) -> Option<&TrieBackend> { Some(self) } } diff --git a/core/state-machine/src/trie_backend_essence.rs b/core/state-machine/src/trie_backend_essence.rs index dfb6cae08cecfac408d0adc7f2a1c36b7e77fb8c..cad150d1bc1f660c8b992150887afa02aa22cec1 100644 --- a/core/state-machine/src/trie_backend_essence.rs +++ b/core/state-machine/src/trie_backend_essence.rs @@ -21,8 +21,10 @@ use std::ops::Deref; use std::sync::Arc; use log::{debug, warn}; use hash_db::{self, Hasher}; -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 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::backend::Consolidate; /// Patricia trie-based storage trait. @@ -154,8 +156,8 @@ impl<'a, > hash_db::AsPlainDB for Ephemeral<'a, S, H> { - fn as_plain_db<'b>(&'b self) -> &'b (hash_db::PlainDB + 'b) { self } - fn as_plain_db_mut<'b>(&'b mut self) -> &'b mut (hash_db::PlainDB + 'b) { self } + fn as_plain_db<'b>(&'b self) -> &'b (dyn hash_db::PlainDB + 'b) { self } + fn as_plain_db_mut<'b>(&'b mut self) -> &'b mut (dyn hash_db::PlainDB + 'b) { self } } impl<'a, @@ -164,8 +166,8 @@ impl<'a, > hash_db::AsHashDB for Ephemeral<'a, S, H> { - fn as_hash_db<'b>(&'b self) -> &'b (hash_db::HashDB + 'b) { self } - fn as_hash_db_mut<'b>(&'b mut self) -> &'b mut (hash_db::HashDB + 'b) { self } + fn as_hash_db<'b>(&'b self) -> &'b (dyn hash_db::HashDB + 'b) { self } + fn as_hash_db_mut<'b>(&'b mut self) -> &'b mut (dyn hash_db::HashDB + 'b) { self } } impl<'a, S: TrieBackendStorage, H: Hasher> Ephemeral<'a, S, H> { @@ -276,7 +278,7 @@ pub trait TrieBackendStorage: Send + Sync { } // This implementation is used by normal storage trie clients. -impl TrieBackendStorage for Arc> { +impl TrieBackendStorage for Arc> { type Overlay = PrefixedMemoryDB; fn get(&self, key: &H::Out, prefix: &[u8]) -> Result, String> { @@ -300,12 +302,3 @@ impl TrieBackendStorage for MemoryDB { 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 { - type Overlay = MemoryDB; - - fn get(&self, key: &H::Out, prefix: &[u8]) -> Result, String> { - ChangesTrieStorage::::get(*self, key, prefix) - } -} diff --git a/core/telemetry/Cargo.toml b/core/telemetry/Cargo.toml index d1fa12abe2843edd3b5feec26fc850d9db55a1ee..1b19796836abb060f2911b30e4fc9411998254fb 100644 --- a/core/telemetry/Cargo.toml +++ b/core/telemetry/Cargo.toml @@ -6,14 +6,19 @@ description = "Telemetry utils" edition = "2018" [dependencies] -parking_lot = "0.7.1" -lazy_static = "1.0" +bytes = "0.4" +parking_lot = "0.8.0" +futures = "0.1" +libp2p = { version = "0.9.1", default-features = false, features = ["libp2p-websocket"] } log = "0.4" rand = "0.6" serde = { version = "1.0.81", features = ["derive"] } -serde_json = "1.0" slog = { version = "^2", features = ["nested-values"] } slog-json = { version = "^2", features = ["nested-values"] } -slog-async = { version = "^2", features = ["nested-values"] } slog-scope = "^4" -ws = { version = "^0.7", features = ["ssl"] } +tokio-io = "0.1" +tokio-timer = "0.2" +void = "1.0" + +[dev-dependencies] +tokio = "0.1" diff --git a/core/telemetry/src/lib.rs b/core/telemetry/src/lib.rs index bc295f2a8cd721f59fa1a0dd102b6ff4b90a0f14..b9d99548510bb62735761421a2fcb5a2ae8ab9a7 100644 --- a/core/telemetry/src/lib.rs +++ b/core/telemetry/src/lib.rs @@ -14,38 +14,93 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -//! Telemetry utils. +//! Telemetry utilities. +//! +//! Calling `init_telemetry` registers a global `slog` logger using `slog_scope::set_global_logger`. +//! After that, calling `slog_scope::with_logger` will return a logger that sends information to +//! the telemetry endpoints. The `telemetry!` macro is a short-cut for calling +//! `slog_scope::with_logger` followed with `slog_log!`. +//! +//! Note that you are supposed to only ever use `telemetry!` and not `slog_scope::with_logger` at +//! the moment. Substate may eventually be reworked to get proper `slog` support, including sending +//! information to the telemetry. +//! +//! The [`Telemetry`] struct implements `Stream` and must be polled regularly (or sent to a +//! background thread/task) in order for the telemetry to properly function. Dropping the object +//! will also deregister the global logger and replace it with a logger that discards messages. +//! The `Stream` generates [`TelemetryEvent`]s. +//! +//! > **Note**: Cloning the [`Telemetry`] and polling from multiple clones has an unspecified behaviour. +//! +//! # Example +//! +//! ```no_run +//! use futures::prelude::*; +//! +//! let telemetry = substrate_telemetry::init_telemetry(substrate_telemetry::TelemetryConfig { +//! endpoints: substrate_telemetry::TelemetryEndpoints::new(vec![ +//! // The `0` is the maximum verbosity level of messages to send to this endpoint. +//! ("wss://example.com".into(), 0) +//! ]), +//! // Can be used to pass an external implementation of WebSockets. +//! wasm_external_transport: None, +//! }); +//! +//! // The `telemetry` object implements `Stream` and must be processed. +//! std::thread::spawn(move || { +//! tokio::run(telemetry.for_each(|_| Ok(()))); +//! }); +//! +//! // Sends a message on the telemetry. +//! substrate_telemetry::telemetry!(substrate_telemetry::SUBSTRATE_INFO; "test"; +//! "foo" => "bar", +//! ) +//! ``` //! -//! `telemetry` macro may be used anywhere in the Substrate codebase -//! in order to send real-time logging information to the telemetry -//! server (if there is one). We use the async drain adapter of `slog` -//! so that the logging thread doesn't get held up at all. -use std::{io, time, thread}; -use std::sync::Arc; +use futures::{prelude::*, task::AtomicTask}; +use libp2p::{Multiaddr, wasm_ext}; +use log::warn; use parking_lot::Mutex; -use slog::{Drain, o, OwnedKVList, Record}; -use log::trace; -use rand::{thread_rng, Rng}; +use serde::{Serialize, Deserialize}; +use std::sync::{Arc, Weak}; +use std::time::{Duration, Instant}; + pub use slog_scope::with_logger; pub use slog; -use serde::{Serialize, Deserialize}; -use core::result; + +mod worker; /// Configuration for telemetry. pub struct TelemetryConfig { /// Collection of telemetry WebSocket servers with a corresponding verbosity level. pub endpoints: TelemetryEndpoints, - /// What do do when we connect to the servers. - /// Note that this closure is executed each time we connect to a telemetry endpoint. - pub on_connect: Box, + + /// Optional external implementation of a libp2p transport. Used in WASM contexts where we need + /// some binding between the networking provided by the operating system or environment and + /// libp2p. + /// + /// This parameter exists whatever the target platform is, but it is expected to be set to + /// `Some` only when compiling for WASM. + /// + /// > **Important**: Each individual call to `write` corresponds to one message. There is no + /// > internal buffering going on. In the context of WebSockets, each `write` + /// > must be one individual WebSockets frame. + pub wasm_external_transport: Option, } -/// Telemetry service guard. -pub type Telemetry = slog_scope::GlobalLoggerGuard; +/// List of telemetry servers we want to talk to. Contains the URL of the server, and the +/// maximum verbosity level. +/// +/// The URL string can be either a URL or a multiaddress. +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct TelemetryEndpoints(Vec<(String, u8)>); -/// Size of the channel for passing messages to telemetry thread. -const CHANNEL_SIZE: usize = 262144; +impl TelemetryEndpoints { + pub fn new(endpoints: Vec<(String, u8)>) -> Self { + TelemetryEndpoints(endpoints) + } +} /// Log levels. pub const SUBSTRATE_DEBUG: &str = "9"; @@ -54,234 +109,149 @@ pub const SUBSTRATE_INFO: &str = "0"; pub const CONSENSUS_TRACE: &str = "9"; pub const CONSENSUS_DEBUG: &str = "5"; pub const CONSENSUS_WARN: &str = "4"; -pub const CONSENSUS_INFO: &str = "0"; - -/// Multiply logging to all drains. This is similar to `slog::Duplicate`, which is -/// limited to two drains though and doesn't support dynamic nesting at runtime. -#[derive(Debug, Clone)] -pub struct Multiply (pub Vec>); - -impl Multiply { - pub fn new(v: Vec>) -> Self { - Multiply(v) - } +pub const CONSENSUS_INFO: &str = "1"; + +/// Telemetry object. Implements `Future` and must be polled regularly. +/// Contains an `Arc` and can be cloned and pass around. Only one clone needs to be polled +/// regularly. +/// Dropping all the clones unregisters the telemetry. +#[derive(Clone)] +pub struct Telemetry { + inner: Arc, + /// Slog guard so that we don't get deregistered. + _guard: Arc, } -impl Drain for Multiply { - type Ok = Vec; - type Err = Vec; - - fn log(&self, record: &Record, logger_values: &OwnedKVList) -> result::Result { - let mut oks = Vec::new(); - let mut errs = Vec::new(); - - self.0.iter().for_each(|l| { - let res: Result<::Ok, ::Err> = (*l).log(record, logger_values); - match res { - Ok(o) => oks.push(o), - Err(e) => errs.push(e), - } - }); - - if !errs.is_empty() { - result::Result::Err(errs) - } else { - result::Result::Ok(oks) - } - } +// Implementation notes: considering that logging can happen at any moment, we only have two +// options: locking a mutex (which we currently do), or using a channel (which we should do). +// At the moment, `slog` doesn't provide any easy way to serialize records in order to send them +// over a channel, but ideally that's what should be done. + +/// Shared between `Telemetry` and `TelemetryDrain`. +struct TelemetryInner { + /// Worker for the telemetry. + worker: Mutex, + /// Task to wake up when we add a log entry to the worker. + polling_task: AtomicTask, } -/// Initialize telemetry. -pub fn init_telemetry(config: TelemetryConfig) -> slog_scope::GlobalLoggerGuard { - let mut endpoint_drains: Vec>> = Vec::new(); - let mut out_syncs = Vec::new(); - - // Set up a filter/drain for each endpoint - config.endpoints.0.iter().for_each(|(url, verbosity)| { - let writer = TelemetryWriter::new(Arc::new(url.to_owned())); - let out_sync = writer.out.clone(); - out_syncs.push(out_sync); - - let until_verbosity = *verbosity; - let filter = slog::Filter( - slog_json::Json::default(writer).fuse(), - move |rec| { - let tag = rec.tag().parse::() - .expect("`telemetry!` macro requires tag."); - tag <= until_verbosity - }); - - let filter = Box::new(filter) as Box>; - endpoint_drains.push(filter); - }); - - // Set up logging to all endpoints - let drain = slog_async::Async::new(Multiply::new(endpoint_drains).fuse()); - let root = slog::Logger::root(drain.chan_size(CHANNEL_SIZE) - .overflow_strategy(slog_async::OverflowStrategy::DropAndReport) - .build().fuse(), o!() - ); - let logger_guard = slog_scope::set_global_logger(root); - - // Spawn a thread for each endpoint - let on_connect = Arc::new(config.on_connect); - config.endpoints.0.into_iter().for_each(|(url, verbosity)| { - let inner_verbosity = Arc::new(verbosity.to_owned()); - let inner_on_connect = Arc::clone(&on_connect); - - let out_sync = out_syncs.remove(0); - let out_sync = Arc::clone(&out_sync); - - thread::spawn(move || { - loop { - let on_connect = Arc::clone(&inner_on_connect); - let out_sync = Arc::clone(&out_sync); - let verbosity = Arc::clone(&inner_verbosity); - - trace!(target: "telemetry", - "Connecting to Telemetry at {} with verbosity {}", url, Arc::clone(&verbosity)); - - let _ = ws::connect(url.to_owned(), - |out| { - Connection::new(out, Arc::clone(&out_sync), Arc::clone(&on_connect), url.clone()) - }); - - // Sleep for a random time between 5-10 secs. If there are general connection - // issues not all threads should be synchronized in their re-connection time. - let random_sleep = thread_rng().gen_range(0, 5); - thread::sleep(time::Duration::from_secs(5) + time::Duration::from_secs(random_sleep)); - } - }); - }); - - return logger_guard; +/// Implements `slog::Drain`. +struct TelemetryDrain { + inner: std::panic::AssertUnwindSafe>, } -/// Translates to `slog_scope::info`, but contains an additional verbosity -/// parameter which the log record is tagged with. Additionally the verbosity -/// parameter is added to the record as a key-value pair. -#[macro_export] -macro_rules! telemetry { - ( $a:expr; $b:expr; $( $t:tt )* ) => { - $crate::with_logger(|l| { - $crate::slog::slog_info!(l, #$a, $b; $($t)* ) - }) - } -} - -struct Connection { - out: ws::Sender, - out_sync: Arc>>, - on_connect: Arc>, - url: String, -} - -impl Connection { - fn new( - out: ws::Sender, - out_sync: Arc>>, - on_connect: Arc>, - url: String - ) -> Self { - Connection { - out, - out_sync, - on_connect, - url, +/// Initializes the telemetry. See the crate root documentation for more information. +/// +/// Please be careful to not call this function twice in the same program. The `slog` crate +/// doesn't provide any way of knowing whether a global logger has already been registered. +pub fn init_telemetry(config: TelemetryConfig) -> Telemetry { + // Build the list of telemetry endpoints. + let mut endpoints = Vec::new(); + for &(ref url, verbosity) in &config.endpoints.0 { + match url_to_multiaddr(url) { + Ok(addr) => endpoints.push((addr, verbosity)), + Err(err) => warn!(target: "telemetry", "Invalid telemetry URL {}: {}", url, err), } } -} - -impl ws::Handler for Connection { - fn on_open(&mut self, _: ws::Handshake) -> ws::Result<()> { - trace!(target: "telemetry", "Connected to {}!", self.url); - - *self.out_sync.lock() = Some(self.out.clone()); - (self.on_connect)(); - Ok(()) - } - - fn on_close(&mut self, code: ws::CloseCode, reason: &str) { - *self.out_sync.lock() = None; - trace!(target: "telemetry", "Connection to {} closing due to ({:?}) {}", - self.url, code, reason); - } + let inner = Arc::new(TelemetryInner { + worker: Mutex::new(worker::TelemetryWorker::new(endpoints, config.wasm_external_transport)), + polling_task: AtomicTask::new(), + }); - fn on_error(&mut self, _: ws::Error) { - *self.out_sync.lock() = None; + let guard = { + let logger = TelemetryDrain { inner: std::panic::AssertUnwindSafe(Arc::downgrade(&inner)) }; + let root = slog::Logger::root(slog::Drain::fuse(logger), slog::o!()); + slog_scope::set_global_logger(root) + }; - // Sleep to ensure that reconnecting isn't spamming logs. - // This happens in it's own thread so it won't block anything. - thread::sleep(time::Duration::from_millis(1000)); + Telemetry { + inner, + _guard: Arc::new(guard), } } -struct TelemetryWriter { - buffer: Vec, - out: Arc>>, - url: Arc, -} - -impl TelemetryWriter { - fn new(url: Arc) -> Self { - let out = Arc::new(Mutex::new(None)); - - TelemetryWriter { - buffer: Vec::new(), - out, - url, - } - } +/// Event generated when polling the worker. +#[derive(Debug)] +pub enum TelemetryEvent { + /// We have established a connection to one of the telemetry endpoint, either for the first + /// time or after having been disconnected earlier. + Connected, } -impl io::Write for TelemetryWriter { - fn write(&mut self, msg: &[u8]) -> io::Result { - let mut iter = msg.split(|x| *x == b'\n'); - let first = iter.next().expect("Split iterator always has at least one element; qed"); +impl Stream for Telemetry { + type Item = TelemetryEvent; + type Error = (); - self.buffer.extend_from_slice(first); + fn poll(&mut self) -> Poll, Self::Error> { + let before = Instant::now(); - // Flush for each occurrence of new line character - for continued in iter { - let _ = self.flush(); - self.buffer.extend_from_slice(continued); + let mut has_connected = false; + while let Async::Ready(event) = self.inner.worker.lock().poll() { + // Right now we only have one possible event. This line is here in order to not + // forget to handle any possible new event type. + let worker::TelemetryWorkerEvent::Connected = event; + has_connected = true; } - Ok(msg.len()) - } - - fn flush(&mut self) -> io::Result<()> { - if self.buffer.is_empty() { - return Ok(()); + if before.elapsed() > Duration::from_millis(200) { + warn!(target: "telemetry", "Polling the telemetry took more than 200ms"); } - if let Ok(s) = ::std::str::from_utf8(&self.buffer[..]) { - let mut out = self.out.lock(); - let error = if let Some(ref mut o) = *out { - let r = o.send(s); - trace!(target: "telemetry", "Sent to telemetry {}: {} -> {:?}", self.url, s, r); - - r.is_err() - } else { - trace!(target: "telemetry", "Telemetry socket closed to {}, failed to send: {}", self.url, s); - false - }; + if has_connected { + Ok(Async::Ready(Some(TelemetryEvent::Connected))) + } else { + self.inner.polling_task.register(); + Ok(Async::NotReady) + } + } +} - if error { - *out = None; +impl slog::Drain for TelemetryDrain { + type Ok = (); + type Err = (); + + fn log(&self, record: &slog::Record, values: &slog::OwnedKVList) -> Result { + if let Some(inner) = self.inner.0.upgrade() { + let before = Instant::now(); + let result = inner.worker.lock().log(record, values); + inner.polling_task.notify(); + if before.elapsed() > Duration::from_millis(50) { + warn!(target: "telemetry", "Writing a telemetry log took more than 50ms"); } + result + } else { + Ok(()) } - self.buffer.clear(); - Ok(()) } } -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct TelemetryEndpoints (Vec<(String, u8)>); +/// Parses a WebSocket URL into a libp2p `Multiaddr`. +fn url_to_multiaddr(url: &str) -> Result { + // First, assume that we have a `Multiaddr`. + let parse_error = match url.parse() { + Ok(ma) => return Ok(ma), + Err(err) => err, + }; + + // If not, try the `ws://path/url` format. + if let Ok(ma) = libp2p::multiaddr::from_url(url) { + return Ok(ma) + } -impl TelemetryEndpoints { - pub fn new(endpoints: Vec<(String, u8)>) -> Self { - TelemetryEndpoints(endpoints) + // If we have no clue about the format of that string, assume that we were expecting a + // `Multiaddr`. + Err(parse_error) +} + +/// Translates to `slog_scope::info`, but contains an additional verbosity +/// parameter which the log record is tagged with. Additionally the verbosity +/// parameter is added to the record as a key-value pair. +#[macro_export] +macro_rules! telemetry { + ( $a:expr; $b:expr; $( $t:tt )* ) => { + $crate::with_logger(|l| { + $crate::slog::slog_info!(l, #$a, $b; $($t)* ) + }) } } diff --git a/core/telemetry/src/worker.rs b/core/telemetry/src/worker.rs new file mode 100644 index 0000000000000000000000000000000000000000..87a3deb6ef9605793893ede5f9f5ddea8c4e279e --- /dev/null +++ b/core/telemetry/src/worker.rs @@ -0,0 +1,203 @@ +// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +//! Contains the object that makes the telemetry work. +//! +//! # Usage +//! +//! - Create a `TelemetryWorker` with `TelemetryWorker::new`. +//! - Send messages to the telemetry with `TelemetryWorker::send_message`. Messages will only be +//! sent to the appropriate targets. Messages may be ignored if the target happens to be +//! temporarily unreachable. +//! - You must appropriately poll the worker with `TelemetryWorker::poll`. Polling will/may produce +//! events indicating what happened since the latest polling. +//! + +use bytes::BytesMut; +use futures::prelude::*; +use libp2p::{core::transport::OptionalTransport, core::ConnectedPoint, Multiaddr, Transport, wasm_ext}; +use log::{trace, warn, error}; +use slog::Drain; +use std::{io, time}; +use tokio_io::AsyncWrite; + +mod node; + +/// Timeout after which a connection attempt is considered failed. Includes the WebSocket HTTP +/// upgrading. +const CONNECT_TIMEOUT: time::Duration = time::Duration::from_secs(20); + +/// Event generated when polling the worker. +#[derive(Debug)] +pub enum TelemetryWorkerEvent { + /// We have established a connection to one of the telemetry endpoint, either for the first + /// time or after having been disconnected earlier. + Connected, +} + +/// Telemetry processing machine. +#[derive(Debug)] +pub struct TelemetryWorker { + /// List of nodes with their maximum verbosity level. + nodes: Vec<(node::Node, u8)>, +} + +/// The pile of libp2p transports. +#[cfg(not(target_os = "unknown"))] +type WsTrans = libp2p::core::transport::timeout::TransportTimeout< + libp2p::core::transport::OrTransport< + libp2p::core::transport::map::Map< + OptionalTransport, + fn(wasm_ext::Connection, ConnectedPoint) -> StreamSink + >, + libp2p::websocket::framed::WsConfig> + > +>; +#[cfg(target_os = "unknown")] +type WsTrans = libp2p::core::transport::timeout::TransportTimeout< + libp2p::core::transport::map::Map< + OptionalTransport, + fn(wasm_ext::Connection, ConnectedPoint) -> StreamSink + > +>; + +impl TelemetryWorker { + /// Builds a new `TelemetryWorker`. + /// + /// The endpoints must be a list of targets, plus a verbosity level. When you send a message + /// to the telemetry, only the targets whose verbosity is higher than the verbosity of the + /// message will receive it. + pub fn new( + endpoints: impl IntoIterator, + wasm_external_transport: impl Into> + ) -> Self { + let transport = match wasm_external_transport.into() { + Some(t) => OptionalTransport::some(t), + None => OptionalTransport::none() + }.map((|inner, _| StreamSink(inner)) as fn(_, _) -> _); + + // The main transport is the `wasm_external_transport`, but if we're on desktop we add + // support for TCP+WebSocket+DNS as a fallback. In practice, you're not expected to pass + // an external transport on desktop and the fallback is used all the time. + #[cfg(not(target_os = "unknown"))] + let transport = transport.or_transport({ + let inner = libp2p::dns::DnsConfig::new(libp2p::tcp::TcpConfig::new()); + libp2p::websocket::framed::WsConfig::new(inner) + }); + + let transport = transport.with_timeout(CONNECT_TIMEOUT); + + TelemetryWorker { + nodes: endpoints.into_iter().map(|(addr, verbosity)| { + let node = node::Node::new(transport.clone(), addr); + (node, verbosity) + }).collect() + } + } + + /// Polls the worker for events that happened. + pub fn poll(&mut self) -> Async { + for (node, _) in &mut self.nodes { + loop { + match node.poll() { + Async::Ready(node::NodeEvent::Connected) => + return Async::Ready(TelemetryWorkerEvent::Connected), + Async::Ready(node::NodeEvent::Disconnected(_)) => continue, + Async::NotReady => break, + } + } + } + + Async::NotReady + } + + /// Equivalent to `slog::Drain::log`, but takes `self` by `&mut` instead, which is more convenient. + /// + /// Keep in mind that you should call `TelemetryWorker::poll` in order to process the messages. + /// You should call this function right after calling `slog::Drain::log`. + pub fn log(&mut self, record: &slog::Record, values: &slog::OwnedKVList) -> Result<(), ()> { + let msg_verbosity = match record.tag().parse::() { + Ok(v) => v, + Err(err) => { + warn!(target: "telemetry", "Failed to parse telemetry tag {:?}: {:?}", + record.tag(), err); + return Err(()) + } + }; + + // None of the nodes want that verbosity, so just return without doing any serialization. + if self.nodes.iter().all(|(_, node_max_verbosity)| msg_verbosity > *node_max_verbosity) { + trace!( + target: "telemetry", + "Skipping log entry because verbosity {:?} is too high for all endpoints", + msg_verbosity + ); + return Ok(()) + } + + // Turn the message into JSON. + let serialized = { + let mut out = Vec::new(); + slog_json::Json::default(&mut out).log(record, values).map_err(|_| ())?; + out + }; + + for (node, node_max_verbosity) in &mut self.nodes { + if msg_verbosity > *node_max_verbosity { + trace!(target: "telemetry", "Skipping {:?} for log entry with verbosity {:?}", + node.addr(), msg_verbosity); + continue; + } + + // `send_message` returns an error if we're not connected, which we silently ignore. + let _ = node.send_message(serialized.clone()); + } + + Ok(()) + } +} + +/// Wraps around an `AsyncWrite` and implements `Sink`. Guarantees that each item being sent maps +/// to one call of `write`. +/// +/// For some context, we put this object around the `wasm_ext::ExtTransport` in order to make sure +/// that each telemetry message maps to one single call to `write` in the WASM FFI. +struct StreamSink(T); +impl Sink for StreamSink { + type SinkItem = BytesMut; + type SinkError = io::Error; + + fn start_send(&mut self, item: Self::SinkItem) -> Result, io::Error> { + match self.0.write(&item[..]) { + Ok(n) if n == item.len() => Ok(AsyncSink::Ready), + Ok(_) => { + error!(target: "telemetry", + "Detected some internal buffering happening in the telemetry"); + Err(io::Error::new(io::ErrorKind::Other, "Internal buffering detected")) + }, + Err(ref err) if err.kind() == io::ErrorKind::WouldBlock => Ok(AsyncSink::NotReady(item)), + Err(err) => Err(err), + } + } + + fn poll_complete(&mut self) -> Poll<(), io::Error> { + match self.0.flush() { + Ok(()) => Ok(Async::Ready(())), + Err(ref err) if err.kind() == io::ErrorKind::WouldBlock => Ok(Async::NotReady), + Err(err) => Err(err), + } + } +} diff --git a/core/telemetry/src/worker/node.rs b/core/telemetry/src/worker/node.rs new file mode 100644 index 0000000000000000000000000000000000000000..a4d8f8d84e2cb22f0db900625e4fa4bf58af1fea --- /dev/null +++ b/core/telemetry/src/worker/node.rs @@ -0,0 +1,220 @@ +// Copyright 2017-2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +//! Contains the `Node` struct, which handles communications with a single telemetry endpoint. + +use bytes::BytesMut; +use futures::prelude::*; +use libp2p::Multiaddr; +use libp2p::core::transport::Transport; +use log::{trace, debug, warn, error}; +use rand::Rng as _; +use std::{collections::VecDeque, fmt, mem, time::Duration, time::Instant}; +use tokio_timer::Delay; + +/// Maximum number of pending telemetry messages. +const MAX_PENDING: usize = 10; + +/// Handler for a single telemetry node. +pub struct Node { + /// Address of the node. + addr: Multiaddr, + /// State of the connection. + socket: NodeSocket, + /// Transport used to establish new connections. + transport: TTrans, +} + +enum NodeSocket { + /// We're connected to the node. This is the normal state. + Connected(NodeSocketConnected), + /// We are currently dialing the node. + Dialing(TTrans::Dial), + /// A new connection should be started as soon as possible. + ReconnectNow, + /// Waiting before attempting to dial again. + WaitingReconnect(Delay), + /// Temporary transition state. + Poisoned, +} + +struct NodeSocketConnected { + /// Where to send data. + sink: TTrans::Output, + /// Queue of packets to send. + pending: VecDeque, + /// If true, we need to flush the sink. + need_flush: bool, +} + +/// Event that can happen with this node. +#[derive(Debug)] +pub enum NodeEvent { + /// We are now connected to this node. + Connected, + /// We are now disconnected from this node. + Disconnected(TSinkErr), +} + +impl Node { + /// Builds a new node handler. + pub fn new(transport: TTrans, addr: Multiaddr) -> Self { + Node { + addr, + socket: NodeSocket::ReconnectNow, + transport, + } + } + + /// Returns the address that was passed to `new`. + pub fn addr(&self) -> &Multiaddr { + &self.addr + } +} + +impl Node +where TTrans: Clone, TTrans::Output: Sink, + TSinkErr: fmt::Debug { + /// Sends a WebSocket frame to the node. Returns an error if we are not connected to the node. + /// + /// After calling this method, you should call `poll` in order for it to be properly processed. + pub fn send_message(&mut self, payload: Vec) -> Result<(), ()> { + if let NodeSocket::Connected(NodeSocketConnected { pending, .. }) = &mut self.socket { + if pending.len() <= MAX_PENDING { + trace!(target: "telemetry", "Adding log entry to queue for {:?}", self.addr); + pending.push_back(payload.into()); + Ok(()) + } else { + warn!(target: "telemetry", "Rejected log entry because queue is full for {:?}", + self.addr); + Err(()) + } + } else { + Err(()) + } + } + + /// Polls the node for updates. Must be performed regularly. + pub fn poll(&mut self) -> Async> { + let mut socket = mem::replace(&mut self.socket, NodeSocket::Poisoned); + self.socket = loop { + match socket { + NodeSocket::Connected(mut conn) => match conn.poll(&self.addr) { + Ok(Async::Ready(v)) => void::unreachable(v), + Ok(Async::NotReady) => break NodeSocket::Connected(conn), + Err(err) => { + debug!(target: "telemetry", "Disconnected from {}: {:?}", self.addr, err); + let timeout = gen_rand_reconnect_delay(); + self.socket = NodeSocket::WaitingReconnect(timeout); + return Async::Ready(NodeEvent::Disconnected(err)) + } + } + NodeSocket::Dialing(mut s) => match s.poll() { + Ok(Async::Ready(sink)) => { + debug!(target: "telemetry", "Connected to {}", self.addr); + let conn = NodeSocketConnected { sink, pending: VecDeque::new(), need_flush: false }; + self.socket = NodeSocket::Connected(conn); + return Async::Ready(NodeEvent::Connected) + }, + Ok(Async::NotReady) => break NodeSocket::Dialing(s), + Err(err) => { + debug!(target: "telemetry", "Error while dialing {}: {:?}", self.addr, err); + let timeout = gen_rand_reconnect_delay(); + socket = NodeSocket::WaitingReconnect(timeout); + } + } + NodeSocket::ReconnectNow => match self.transport.clone().dial(self.addr.clone()) { + Ok(d) => { + debug!(target: "telemetry", "Started dialing {}", self.addr); + socket = NodeSocket::Dialing(d); + } + Err(err) => { + debug!(target: "telemetry", "Error while dialing {}: {:?}", self.addr, err); + let timeout = gen_rand_reconnect_delay(); + socket = NodeSocket::WaitingReconnect(timeout); + } + } + NodeSocket::WaitingReconnect(mut s) => if let Ok(Async::Ready(_)) = s.poll() { + socket = NodeSocket::ReconnectNow; + } else { + break NodeSocket::WaitingReconnect(s) + } + NodeSocket::Poisoned => { + error!(target: "telemetry", "Poisoned connection with {}", self.addr); + break NodeSocket::Poisoned + } + } + }; + + Async::NotReady + } +} + +/// Generates a `Delay` object with a random timeout. +/// +/// If there are general connection issues, not all endpoints should be synchronized in their +/// re-connection time. +fn gen_rand_reconnect_delay() -> Delay { + let random_delay = rand::thread_rng().gen_range(5, 10); + Delay::new(Instant::now() + Duration::from_secs(random_delay)) +} + +impl NodeSocketConnected +where TTrans::Output: Sink { + /// Processes the queue of messages for the connected socket. + /// + /// The address is passed for logging purposes only. + fn poll(&mut self, my_addr: &Multiaddr) -> Poll { + loop { + if let Some(item) = self.pending.pop_front() { + let item_len = item.len(); + if let AsyncSink::NotReady(item) = self.sink.start_send(item)? { + self.pending.push_front(item); + break + } else { + trace!(target: "telemetry", "Successfully sent {:?} bytes message to {}", + item_len, my_addr); + self.need_flush = true; + } + + } else if self.need_flush && self.sink.poll_complete()?.is_ready() { + self.need_flush = false; + + } else { + break + } + } + + Ok(Async::NotReady) + } +} + +impl fmt::Debug for Node { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + let state = match self.socket { + NodeSocket::Connected(_) => "Connected", + NodeSocket::Dialing(_) => "Dialing", + NodeSocket::ReconnectNow => "Pending reconnect", + NodeSocket::WaitingReconnect(_) => "Pending reconnect", + NodeSocket::Poisoned => "Poisoned", + }; + + f.debug_struct("Node") + .field("addr", &self.addr) + .field("state", &state) + .finish() + } +} diff --git a/core/test-client/Cargo.toml b/core/test-client/Cargo.toml index 7628125df445b67fbb9307941292b88c077bd9a5..0bb8367c146dc4df6cedd3c62e311e3f75a1055e 100644 --- a/core/test-client/Cargo.toml +++ b/core/test-client/Cargo.toml @@ -7,25 +7,12 @@ edition = "2018" [dependencies] client = { package = "substrate-client", path = "../client" } client-db = { package = "substrate-client-db", path = "../client/db", features = ["test-helpers"] } -futures = { version = "0.1.17" } -parity-codec = "3.3" -executor = { package = "substrate-executor", path = "../executor" } consensus = { package = "substrate-consensus-common", path = "../consensus/common" } -keyring = { package = "substrate-keyring", path = "../../core/keyring" } +executor = { package = "substrate-executor", path = "../executor" } +futures = { version = "0.1.27" } +hash-db = "0.12" +keyring = { package = "substrate-keyring", path = "../keyring" } +parity-codec = "3.5.1" primitives = { package = "substrate-primitives", path = "../primitives" } -state_machine = { package = "substrate-state-machine", path = "../state-machine" } -runtime = { package = "substrate-test-runtime", path = "../test-runtime", default-features = false } runtime_primitives = { package = "sr-primitives", path = "../sr-primitives" } - -[features] -default = [ - "include-wasm-blob", - "std", -] -std = [ - "runtime/std", -] -# If enabled, the WASM blob is added to the `GenesisConfig`. -include-wasm-blob = [ - "runtime/include-wasm-blob", -] \ No newline at end of file +state_machine = { package = "substrate-state-machine", path = "../state-machine" } diff --git a/core/test-client/src/client_ext.rs b/core/test-client/src/client_ext.rs index d285bb726b75258210ed59d043313dc88a74d3c9..7d05b1f570da9600eedb5360d21de9b1418f8d0d 100644 --- a/core/test-client/src/client_ext.rs +++ b/core/test-client/src/client_ext.rs @@ -21,52 +21,55 @@ use consensus::{ ImportBlock, BlockImport, BlockOrigin, Error as ConsensusError, ForkChoiceStrategy, }; +use hash_db::Hasher; use runtime_primitives::Justification; +use runtime_primitives::traits::{Block as BlockT}; use runtime_primitives::generic::BlockId; use primitives::Blake2Hasher; -use runtime; use parity_codec::alloc::collections::hash_map::HashMap; /// Extension trait for a test client. -pub trait TestClient: Sized { +pub trait ClientExt: Sized { /// Import block to the chain. No finality. - fn import(&self, origin: BlockOrigin, block: runtime::Block) + fn import(&self, origin: BlockOrigin, block: Block) -> Result<(), ConsensusError>; /// Import block with justification, finalizes block. fn import_justified( &self, origin: BlockOrigin, - block: runtime::Block, + block: Block, justification: Justification ) -> Result<(), ConsensusError>; /// Finalize a block. fn finalize_block( &self, - id: BlockId, + id: BlockId, justification: Option, ) -> client::error::Result<()>; /// Returns hash of the genesis block. - fn genesis_hash(&self) -> runtime::Hash; + fn genesis_hash(&self) -> ::Hash; } -impl TestClient for Client +impl ClientExt for Client where - B: client::backend::Backend, - E: client::CallExecutor, - Self: BlockImport, + B: client::backend::Backend, + E: client::CallExecutor, + Self: BlockImport, + Block: BlockT::Out>, { - fn import(&self, origin: BlockOrigin, block: runtime::Block) + fn import(&self, origin: BlockOrigin, block: Block) -> Result<(), ConsensusError> { + let (header, extrinsics) = block.deconstruct(); let import = ImportBlock { origin, - header: block.header, + header, justification: None, post_digests: vec![], - body: Some(block.extrinsics), + body: Some(extrinsics), finalized: false, auxiliary: Vec::new(), fork_choice: ForkChoiceStrategy::LongestChain, @@ -78,15 +81,16 @@ impl TestClient for Client fn import_justified( &self, origin: BlockOrigin, - block: runtime::Block, + block: Block, justification: Justification, ) -> Result<(), ConsensusError> { + let (header, extrinsics) = block.deconstruct(); let import = ImportBlock { origin, - header: block.header, + header, justification: Some(justification), post_digests: vec![], - body: Some(block.extrinsics), + body: Some(extrinsics), finalized: true, auxiliary: Vec::new(), fork_choice: ForkChoiceStrategy::LongestChain, @@ -97,13 +101,13 @@ impl TestClient for Client fn finalize_block( &self, - id: BlockId, + id: BlockId, justification: Option, ) -> client::error::Result<()> { self.finalize_block(id, justification, true) } - fn genesis_hash(&self) -> runtime::Hash { - self.block_hash(0).unwrap().unwrap() + fn genesis_hash(&self) -> ::Hash { + self.block_hash(0.into()).unwrap().unwrap() } } diff --git a/core/test-client/src/lib.rs b/core/test-client/src/lib.rs index dfbb1fbcec42910ee1a1c189ce5d1c5057280565..40fbd10d9e43870d50fbd463da7b9709b3a314ed 100644 --- a/core/test-client/src/lib.rs +++ b/core/test-client/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// Copyright 2019 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify @@ -19,60 +19,30 @@ #![warn(missing_docs)] pub mod client_ext; -#[cfg(feature = "include-wasm-blob")] -pub mod trait_tests; -mod block_builder_ext; -pub use client_ext::TestClient; -pub use block_builder_ext::BlockBuilderExt; pub use client::{ExecutionStrategies, blockchain, backend, self}; -pub use executor::{NativeExecutor, self}; -pub use runtime; +pub use client_db::{Backend, self}; +pub use client_ext::ClientExt; pub use consensus; +pub use executor::{NativeExecutor, self}; pub use keyring::{sr25519::Keyring as AuthorityKeyring, AccountKeyring}; +pub use primitives::Blake2Hasher; +pub use runtime_primitives::{StorageOverlay, ChildrenStorageOverlay}; +pub use state_machine::ExecutionStrategy; -use std::{sync::Arc, collections::HashMap}; +use std::sync::Arc; +use std::collections::HashMap; use futures::future::FutureResult; -use primitives::Blake2Hasher; -use runtime_primitives::StorageOverlay; +use hash_db::Hasher; +use primitives::storage::well_known_keys; use runtime_primitives::traits::{ - Block as BlockT, Header as HeaderT, Hash as HashT, NumberFor + Block as BlockT, NumberFor }; -use runtime::genesismap::{GenesisConfig, additional_storage_with_genesis}; -use state_machine::ExecutionStrategy; use client::LocalCallExecutor; -#[cfg(feature = "include-wasm-blob")] -mod local_executor { - #![allow(missing_docs)] - use runtime; - use executor::native_executor_instance; - // FIXME #1576 change the macro and pass in the `BlakeHasher` that dispatch needs from here instead - native_executor_instance!( - pub LocalExecutor, - runtime::api::dispatch, - runtime::native_version, - include_bytes!("../../test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm") - ); -} - -/// Native executor used for tests. -#[cfg(feature = "include-wasm-blob")] -pub use local_executor::LocalExecutor; - -/// Test client database backend. -pub type Backend = client_db::Backend; - -/// Test client executor. -#[cfg(feature = "include-wasm-blob")] -pub type Executor = client::LocalCallExecutor< - Backend, - executor::NativeExecutor, ->; - /// Test client light database backend. -pub type LightBackend = client::light::backend::Backend< - client_db::light::LightStorage, +pub type LightBackend = client::light::backend::Backend< + client_db::light::LightStorage, LightFetcher, Blake2Hasher, >; @@ -80,45 +50,85 @@ pub type LightBackend = client::light::backend::Backend< /// Test client light fetcher. pub struct LightFetcher; -/// Test client light executor. -#[cfg(feature = "include-wasm-blob")] -pub type LightExecutor = client::light::call_executor::RemoteOrLocalCallExecutor< - runtime::Block, - LightBackend, - client::light::call_executor::RemoteCallExecutor< - client::light::blockchain::Blockchain< - client_db::light::LightStorage, - LightFetcher - >, - LightFetcher - >, - client::LocalCallExecutor< - client::light::backend::Backend< - client_db::light::LightStorage, - LightFetcher, - Blake2Hasher - >, - executor::NativeExecutor - > ->; +/// A genesis storage initialisation trait. +pub trait GenesisInit: Default { + /// Construct genesis storage. + fn genesis_storage(&self) -> (StorageOverlay, ChildrenStorageOverlay); +} + +impl GenesisInit for () { + fn genesis_storage(&self) -> (StorageOverlay, ChildrenStorageOverlay) { + Default::default() + } +} /// A builder for creating a test client instance. -pub struct TestClientBuilder { +pub struct TestClientBuilder { execution_strategies: ExecutionStrategies, - genesis_extension: HashMap, Vec>, - support_changes_trie: bool, + genesis_init: G, + child_storage_extension: HashMap, Vec<(Vec, Vec)>>, + backend: Arc, + _executor: std::marker::PhantomData, +} + +impl Default for TestClientBuilder< + Executor, + Backend, +> where + Block: BlockT::Out>, +{ + fn default() -> Self { + Self::with_default_backend() + } } -impl TestClientBuilder { +impl TestClientBuilder< + Executor, + Backend, + G, +> where + Block: BlockT::Out>, +{ + /// Create new `TestClientBuilder` with default backend. + pub fn with_default_backend() -> Self { + let backend = Arc::new(Backend::new_test(std::u32::MAX, std::u64::MAX)); + Self::with_backend(backend) + } +} + +impl TestClientBuilder< + Executor, + Backend, + G, +> { /// Create a new instance of the test client builder. - pub fn new() -> Self { + pub fn with_backend(backend: Arc) -> Self { TestClientBuilder { + backend, execution_strategies: ExecutionStrategies::default(), - genesis_extension: HashMap::default(), - support_changes_trie: false, + child_storage_extension: Default::default(), + genesis_init: Default::default(), + _executor: Default::default(), } } + /// Alter the genesis storage parameters. + pub fn genesis_init_mut(&mut self) -> &mut G { + &mut self.genesis_init + } + + /// Extend child storage + pub fn add_child_storage( + mut self, + key: impl AsRef<[u8]>, + child_key: impl AsRef<[u8]>, + value: impl AsRef<[u8]>, + ) -> Self { + let entry = self.child_storage_extension.entry(key.as_ref().to_vec()).or_insert_with(Vec::new); + entry.push((child_key.as_ref().to_vec(), value.as_ref().to_vec())); + self + } + /// Set the execution strategy that should be used by all contexts. pub fn set_execution_strategy( mut self, @@ -134,153 +144,79 @@ impl TestClientBuilder { self } - /// Set an extension of the genesis storage. - pub fn set_genesis_extension( - mut self, - extension: HashMap, Vec> - ) -> Self { - self.genesis_extension = extension; - self - } - - /// Enable/Disable changes trie support. - pub fn set_support_changes_trie(mut self, enable: bool) -> Self { - self.support_changes_trie = enable; - self - } - - /// Build the test client. - #[cfg(feature = "include-wasm-blob")] - pub fn build(self) -> client::Client< - Backend, Executor, runtime::Block, runtime::RuntimeApi - > { - let backend = Arc::new(Backend::new_test(std::u32::MAX, std::u64::MAX)); - self.build_with_backend(backend) - } - - /// Build the test client with the given backend. - #[cfg(feature = "include-wasm-blob")] - pub fn build_with_backend(self, backend: Arc) -> client::Client< - B, - client::LocalCallExecutor>, - runtime::Block, - runtime::RuntimeApi - > where B: backend::LocalBackend { - let executor = NativeExecutor::new(None); - let executor = LocalCallExecutor::new(backend.clone(), executor); - - client::Client::new( - backend, - executor, - genesis_storage(self.support_changes_trie, self.genesis_extension), - self.execution_strategies - ).expect("Creates new client") - } - /// Build the test client with the given native executor. - pub fn build_with_native_executor( + pub fn build_with_executor( self, - executor: executor::NativeExecutor - ) -> client::Client< - Backend, - client::LocalCallExecutor>, - runtime::Block, - runtime::RuntimeApi - > where E: executor::NativeExecutionDispatch + executor: Executor, + ) -> ( + client::Client< + Backend, + Executor, + Block, + RuntimeApi, + >, + client::LongestChain, + ) where + Executor: client::CallExecutor, + Backend: client::backend::Backend, + Block: BlockT::Out>, { - let backend = Arc::new(Backend::new_test(std::u32::MAX, std::u64::MAX)); - let executor = LocalCallExecutor::new(backend.clone(), executor); - client::Client::new( - backend, - executor, - genesis_storage(self.support_changes_trie, self.genesis_extension), - self.execution_strategies - ).expect("Creates new client") - } -} + let storage = { + let mut storage = self.genesis_init.genesis_storage(); -/// Creates new client instance used for tests. -#[cfg(feature = "include-wasm-blob")] -pub fn new() -> client::Client { - new_with_backend(Arc::new(Backend::new_test(::std::u32::MAX, ::std::u64::MAX)), false) -} + // Add some child storage keys. + for (key, value) in self.child_storage_extension { + storage.1.insert( + well_known_keys::CHILD_STORAGE_KEY_PREFIX.iter().cloned().chain(key).collect(), + value.into_iter().collect(), + ); + } -/// Creates new light client instance used for tests. -#[cfg(feature = "include-wasm-blob")] -pub fn new_light() -> client::Client { - let storage = client_db::light::LightStorage::new_test(); - let blockchain = Arc::new(client::light::blockchain::Blockchain::new(storage)); - let backend = Arc::new(LightBackend::new(blockchain.clone())); - let executor = NativeExecutor::new(None); - let fetcher = Arc::new(LightFetcher); - let remote_call_executor = client::light::call_executor::RemoteCallExecutor::new(blockchain.clone(), fetcher); - let local_call_executor = client::LocalCallExecutor::new(backend.clone(), executor); - let call_executor = LightExecutor::new(backend.clone(), remote_call_executor, local_call_executor); - client::Client::new(backend, call_executor, genesis_storage(false, Default::default()), Default::default()).unwrap() -} + storage + }; -/// Creates new client instance used for tests with the given api execution strategy. -#[cfg(feature = "include-wasm-blob")] -pub fn new_with_execution_strategy( - execution_strategy: ExecutionStrategy -) -> client::Client { - TestClientBuilder::new().set_execution_strategy(execution_strategy).build() -} + let client = client::Client::new( + self.backend.clone(), + executor, + storage, + self.execution_strategies + ).expect("Creates new client"); -/// Creates new test client instance that suports changes trie creation. -#[cfg(feature = "include-wasm-blob")] -pub fn new_with_changes_trie() - -> client::Client -{ - TestClientBuilder::new().set_support_changes_trie(true).build() -} + let longest_chain = client::LongestChain::new(self.backend); -/// Creates new client instance used for tests with an explicitly provided backend. -/// This is useful for testing backend implementations. -#[cfg(feature = "include-wasm-blob")] -pub fn new_with_backend( - backend: Arc, - support_changes_trie: bool -) -> client::Client< - B, - client::LocalCallExecutor>, - runtime::Block, - runtime::RuntimeApi -> where B: backend::LocalBackend -{ - TestClientBuilder::new() - .set_support_changes_trie(support_changes_trie) - .build_with_backend(backend) + (client, longest_chain) + } } -fn genesis_config(support_changes_trie: bool) -> GenesisConfig { - GenesisConfig::new(support_changes_trie, vec![ - AuthorityKeyring::Alice.into(), - AuthorityKeyring::Bob.into(), - AuthorityKeyring::Charlie.into(), - ], vec![ - AccountKeyring::Alice.into(), - AccountKeyring::Bob.into(), - AccountKeyring::Charlie.into(), - ], - 1000 - ) -} +impl TestClientBuilder< + client::LocalCallExecutor>, + Backend, + G, +> { + /// Build the test client with the given native executor. + pub fn build_with_native_executor( + self, + executor: I, + ) -> ( + client::Client< + Backend, + client::LocalCallExecutor>, + Block, + RuntimeApi + >, + client::LongestChain, + ) where + I: Into>>, + E: executor::NativeExecutionDispatch, + Backend: client::backend::Backend, + Block: BlockT::Out>, + { + let executor = executor.into().unwrap_or_else(|| executor::NativeExecutor::new(None)); + let executor = LocalCallExecutor::new(self.backend.clone(), executor); -fn genesis_storage( - support_changes_trie: bool, - extension: HashMap, Vec> -) -> StorageOverlay { - let mut storage = genesis_config(support_changes_trie).genesis_map(); - storage.extend(extension.into_iter()); - - let state_root = <<::Header as HeaderT>::Hashing as HashT>::trie_root( - storage.clone().into_iter() - ); - let block: runtime::Block = client::genesis::construct_genesis_block(state_root); - storage.extend(additional_storage_with_genesis(&block)); - storage + self.build_with_executor(executor) + } } impl client::light::fetcher::Fetcher for LightFetcher { @@ -288,6 +224,7 @@ impl client::light::fetcher::Fetcher for LightFetcher { type RemoteReadResult = FutureResult>, client::error::Error>; type RemoteCallResult = FutureResult, client::error::Error>; type RemoteChangesResult = FutureResult, u32)>, client::error::Error>; + type RemoteBodyResult = FutureResult, client::error::Error>; fn remote_header( &self, @@ -323,4 +260,11 @@ impl client::light::fetcher::Fetcher for LightFetcher { ) -> Self::RemoteChangesResult { unimplemented!("not (yet) used in tests") } + + fn remote_body( + &self, + _request: client::light::fetcher::RemoteBodyRequest, + ) -> Self::RemoteBodyResult { + unimplemented!("not (yet) used in tests") + } } diff --git a/core/test-runtime/Cargo.toml b/core/test-runtime/Cargo.toml index 4244dcc58b8c39aea5a1b5bd3fece8fa495eec47..64725177fc970f3ef06290c0a3247346fd3982de 100644 --- a/core/test-runtime/Cargo.toml +++ b/core/test-runtime/Cargo.toml @@ -25,11 +25,10 @@ memory-db = { version = "0.12", default-features = false } offchain-primitives = { package = "substrate-offchain-primitives", path = "../offchain/primitives", default-features = false} executive = { package = "srml-executive", path = "../../srml/executive", default-features = false } cfg-if = "0.1.6" -consensus_authorities = { package = "substrate-consensus-authorities", path = "../../core/consensus/authorities", default-features = false } [dev-dependencies] substrate-executor = { path = "../executor" } -substrate-test-client = { path = "../test-client" } +substrate-test-runtime-client = { path = "./client" } [features] default = [ @@ -57,7 +56,6 @@ std = [ "memory-db/std", "offchain-primitives/std", "executive/std", - "consensus_authorities/std", ] # If enabled, the WASM blob is added to the `GenesisConfig`. include-wasm-blob = [] diff --git a/core/test-runtime/client/Cargo.toml b/core/test-runtime/client/Cargo.toml new file mode 100644 index 0000000000000000000000000000000000000000..9ddeb7ba2508b627132bdbc2b906f525296f4192 --- /dev/null +++ b/core/test-runtime/client/Cargo.toml @@ -0,0 +1,20 @@ +[package] +name = "substrate-test-runtime-client" +version = "2.0.0" +authors = ["Parity Technologies "] +edition = "2018" + +[dependencies] +generic-test-client = { package = "substrate-test-client", path = "../../test-client" } +primitives = { package = "substrate-primitives", path = "../../primitives" } +runtime = { package = "substrate-test-runtime", path = "../../test-runtime", default-features = false } +runtime_primitives = { package = "sr-primitives", path = "../../sr-primitives" } + +[features] +default = [ + "std", + "runtime/include-wasm-blob", +] +std = [ + "runtime/std", +] diff --git a/core/test-client/src/block_builder_ext.rs b/core/test-runtime/client/src/block_builder_ext.rs similarity index 76% rename from core/test-client/src/block_builder_ext.rs rename to core/test-runtime/client/src/block_builder_ext.rs index 15861ce3d0eaa3c997d43ee10ee6c5d46c47abf2..9b7d343f02f88ee46f938bdfa55d9c993792f337 100644 --- a/core/test-client/src/block_builder_ext.rs +++ b/core/test-runtime/client/src/block_builder_ext.rs @@ -16,15 +16,17 @@ //! Block Builder extensions for tests. -use client; use runtime; use runtime_primitives::traits::ProvideRuntimeApi; -use client::block_builder::api::BlockBuilder; +use generic_test_client::client; +use generic_test_client::client::block_builder::api::BlockBuilder; /// Extension trait for test block builder. pub trait BlockBuilderExt { /// Add transfer extrinsic to the block. fn push_transfer(&mut self, transfer: runtime::Transfer) -> Result<(), client::error::Error>; + /// Add storage change extrinsic to the block. + fn push_storage_change(&mut self, key: Vec, value: Option>) -> Result<(), client::error::Error>; } impl<'a, A> BlockBuilderExt for client::block_builder::BlockBuilder<'a, runtime::Block, A> where @@ -34,4 +36,8 @@ impl<'a, A> BlockBuilderExt for client::block_builder::BlockBuilder<'a, runtime: fn push_transfer(&mut self, transfer: runtime::Transfer) -> Result<(), client::error::Error> { self.push(transfer.into_signed_tx()) } + + fn push_storage_change(&mut self, key: Vec, value: Option>) -> Result<(), client::error::Error> { + self.push(runtime::Extrinsic::StorageChange(key, value)) + } } diff --git a/core/test-runtime/client/src/lib.rs b/core/test-runtime/client/src/lib.rs new file mode 100644 index 0000000000000000000000000000000000000000..ee1ad2421472695855215810fc717692afa286f8 --- /dev/null +++ b/core/test-runtime/client/src/lib.rs @@ -0,0 +1,208 @@ +// Copyright 2018-2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +//! Client testing utilities. + +#![warn(missing_docs)] + +pub mod trait_tests; + +mod block_builder_ext; + +pub use block_builder_ext::BlockBuilderExt; +pub use generic_test_client::*; +pub use runtime; + +use runtime::genesismap::{GenesisConfig, additional_storage_with_genesis}; +use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, Hash as HashT}; + +/// A prelude to import in tests. +pub mod prelude { + // Trait extensions + pub use super::{BlockBuilderExt, DefaultTestClientBuilderExt, TestClientBuilderExt, ClientExt}; + // Client structs + pub use super::{ + TestClient, TestClientBuilder, Backend, LightBackend, + Executor, LightExecutor, LocalExecutor, NativeExecutor, + }; + // Keyring + pub use super::{AccountKeyring, AuthorityKeyring}; +} + +mod local_executor { + #![allow(missing_docs)] + use runtime; + use crate::executor::native_executor_instance; + // FIXME #1576 change the macro and pass in the `BlakeHasher` that dispatch needs from here instead + native_executor_instance!( + pub LocalExecutor, + runtime::api::dispatch, + runtime::native_version, + include_bytes!("../../wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm") + ); +} + +/// Native executor used for tests. +pub use local_executor::LocalExecutor; + +/// Test client database backend. +pub type Backend = generic_test_client::Backend; + +/// Test client executor. +pub type Executor = client::LocalCallExecutor< + Backend, + NativeExecutor, +>; + +/// Test client light database backend. +pub type LightBackend = generic_test_client::LightBackend; + +/// Test client light executor. +pub type LightExecutor = client::light::call_executor::RemoteOrLocalCallExecutor< + runtime::Block, + LightBackend, + client::light::call_executor::RemoteCallExecutor< + client::light::blockchain::Blockchain< + client_db::light::LightStorage, + LightFetcher + >, + LightFetcher + >, + client::LocalCallExecutor< + client::light::backend::Backend< + client_db::light::LightStorage, + LightFetcher, + Blake2Hasher + >, + NativeExecutor + > +>; + +/// Parameters of test-client builder with test-runtime. +#[derive(Default)] +pub struct GenesisParameters { + support_changes_trie: bool, +} + +impl generic_test_client::GenesisInit for GenesisParameters { + fn genesis_storage(&self) -> (StorageOverlay, ChildrenStorageOverlay) { + let mut storage = genesis_config(self.support_changes_trie).genesis_map(); + + let state_root = <<::Header as HeaderT>::Hashing as HashT>::trie_root( + storage.clone().into_iter() + ); + let block: runtime::Block = client::genesis::construct_genesis_block(state_root); + storage.extend(additional_storage_with_genesis(&block)); + + (storage, Default::default()) + } +} + +/// A `TestClient` with `test-runtime` builder. +pub type TestClientBuilder = generic_test_client::TestClientBuilder; + +/// Test client type with `LocalExecutor` and generic Backend. +pub type Client = client::Client< + B, + client::LocalCallExecutor>, + runtime::Block, + runtime::RuntimeApi, +>; + +/// A test client with default backend. +pub type TestClient = Client; + +/// A `TestClientBuilder` with default backend and executor. +pub trait DefaultTestClientBuilderExt: Sized { + /// Create new `TestClientBuilder` + fn new() -> Self; +} + +impl DefaultTestClientBuilderExt for TestClientBuilder< + Executor, + Backend, +> { + fn new() -> Self { + Self::with_default_backend() + } +} + +/// A `test-runtime` extensions to `TestClientBuilder`. +pub trait TestClientBuilderExt: Sized { + /// Enable or disable support for changes trie in genesis. + fn set_support_changes_trie(self, support_changes_trie: bool) -> Self; + + /// Build the test client. + fn build(self) -> Client { + self.build_with_longest_chain().0 + } + + /// Build the test client and longest chain selector. + fn build_with_longest_chain(self) -> (Client, client::LongestChain); +} + +impl TestClientBuilderExt for TestClientBuilder< + client::LocalCallExecutor>, + B +> where + B: client::backend::Backend, +{ + fn set_support_changes_trie(mut self, support_changes_trie: bool) -> Self { + self.genesis_init_mut().support_changes_trie = support_changes_trie; + self + } + + fn build_with_longest_chain(self) -> (Client, client::LongestChain) { + self.build_with_native_executor(None) + } +} + +fn genesis_config(support_changes_trie: bool) -> GenesisConfig { + GenesisConfig::new(support_changes_trie, vec![ + AuthorityKeyring::Alice.into(), + AuthorityKeyring::Bob.into(), + AuthorityKeyring::Charlie.into(), + ], vec![ + AccountKeyring::Alice.into(), + AccountKeyring::Bob.into(), + AccountKeyring::Charlie.into(), + ], + 1000 + ) +} + +/// Creates new client instance used for tests. +pub fn new() -> Client { + TestClientBuilder::new().build() +} + +/// Creates new light client instance used for tests. +pub fn new_light() -> client::Client { + use std::sync::Arc; + + let storage = client_db::light::LightStorage::new_test(); + let blockchain = Arc::new(client::light::blockchain::Blockchain::new(storage)); + let backend = Arc::new(LightBackend::new(blockchain.clone())); + let executor = NativeExecutor::new(None); + let fetcher = Arc::new(LightFetcher); + let remote_call_executor = client::light::call_executor::RemoteCallExecutor::new(blockchain.clone(), fetcher); + let local_call_executor = client::LocalCallExecutor::new(backend.clone(), executor); + let call_executor = LightExecutor::new(backend.clone(), remote_call_executor, local_call_executor); + + TestClientBuilder::with_backend(backend) + .build_with_executor(call_executor) + .0 +} diff --git a/core/test-client/src/trait_tests.rs b/core/test-runtime/client/src/trait_tests.rs similarity index 63% rename from core/test-client/src/trait_tests.rs rename to core/test-runtime/client/src/trait_tests.rs index aa51f7d8bf9e33b24bad88060c5b8dca23a04018..3d013e3e74263f2354c1c2fd5089c16802eba539 100644 --- a/core/test-client/src/trait_tests.rs +++ b/core/test-runtime/client/src/trait_tests.rs @@ -20,15 +20,16 @@ #![allow(missing_docs)] use std::sync::Arc; -use consensus::BlockOrigin; -use primitives::Blake2Hasher; -use crate::{TestClient, AccountKeyring}; -use runtime_primitives::traits::Block as BlockT; + use crate::backend; +use crate::block_builder_ext::BlockBuilderExt; use crate::blockchain::{Backend as BlockChainBackendT, HeaderBackend}; -use crate::{BlockBuilderExt, new_with_backend}; +use crate::{AccountKeyring, ClientExt, TestClientBuilder, TestClientBuilderExt}; +use generic_test_client::consensus::BlockOrigin; +use primitives::Blake2Hasher; use runtime::{self, Transfer}; use runtime_primitives::generic::BlockId; +use runtime_primitives::traits::Block as BlockT; /// helper to test the `leaves` implementation for various backends pub fn test_leaves_for_backend(backend: Arc) where @@ -40,51 +41,54 @@ pub fn test_leaves_for_backend(backend: Arc) where // B2 -> C3 // A1 -> D2 - let client = new_with_backend(backend.clone(), false); + let client = TestClientBuilder::with_backend(backend.clone()).build(); + let blockchain = backend.blockchain(); - let genesis_hash = client.info().unwrap().chain.genesis_hash; + let genesis_hash = client.info().chain.genesis_hash; assert_eq!( - client.backend().blockchain().leaves().unwrap(), + blockchain.leaves().unwrap(), vec![genesis_hash]); // G -> A1 - let a1 = client.new_block().unwrap().bake().unwrap(); + let a1 = client.new_block(Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a1.clone()).unwrap(); assert_eq!( - backend.blockchain().leaves().unwrap(), + blockchain.leaves().unwrap(), vec![a1.hash()]); // A1 -> A2 - let a2 = client.new_block_at(&BlockId::Hash(a1.hash())).unwrap().bake().unwrap(); + let a2 = client.new_block_at(&BlockId::Hash(a1.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a2.clone()).unwrap(); + + #[allow(deprecated)] assert_eq!( - client.backend().blockchain().leaves().unwrap(), + blockchain.leaves().unwrap(), vec![a2.hash()]); // A2 -> A3 - let a3 = client.new_block_at(&BlockId::Hash(a2.hash())).unwrap().bake().unwrap(); + let a3 = client.new_block_at(&BlockId::Hash(a2.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a3.clone()).unwrap(); assert_eq!( - backend.blockchain().leaves().unwrap(), + blockchain.leaves().unwrap(), vec![a3.hash()]); // A3 -> A4 - let a4 = client.new_block_at(&BlockId::Hash(a3.hash())).unwrap().bake().unwrap(); + let a4 = client.new_block_at(&BlockId::Hash(a3.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a4.clone()).unwrap(); assert_eq!( - backend.blockchain().leaves().unwrap(), + blockchain.leaves().unwrap(), vec![a4.hash()]); // A4 -> A5 - let a5 = client.new_block_at(&BlockId::Hash(a4.hash())).unwrap().bake().unwrap(); + let a5 = client.new_block_at(&BlockId::Hash(a4.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a5.clone()).unwrap(); assert_eq!( - backend.blockchain().leaves().unwrap(), + blockchain.leaves().unwrap(), vec![a5.hash()]); // A1 -> B2 - let mut builder = client.new_block_at(&BlockId::Hash(a1.hash())).unwrap(); + let mut builder = client.new_block_at(&BlockId::Hash(a1.hash()), Default::default()).unwrap(); // this push is required as otherwise B2 has the same hash as A2 and won't get imported builder.push_transfer(Transfer { from: AccountKeyring::Alice.into(), @@ -95,25 +99,25 @@ pub fn test_leaves_for_backend(backend: Arc) where let b2 = builder.bake().unwrap(); client.import(BlockOrigin::Own, b2.clone()).unwrap(); assert_eq!( - backend.blockchain().leaves().unwrap(), + blockchain.leaves().unwrap(), vec![a5.hash(), b2.hash()]); // B2 -> B3 - let b3 = client.new_block_at(&BlockId::Hash(b2.hash())).unwrap().bake().unwrap(); + let b3 = client.new_block_at(&BlockId::Hash(b2.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, b3.clone()).unwrap(); assert_eq!( - backend.blockchain().leaves().unwrap(), + blockchain.leaves().unwrap(), vec![a5.hash(), b3.hash()]); // B3 -> B4 - let b4 = client.new_block_at(&BlockId::Hash(b3.hash())).unwrap().bake().unwrap(); + let b4 = client.new_block_at(&BlockId::Hash(b3.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, b4.clone()).unwrap(); assert_eq!( - backend.blockchain().leaves().unwrap(), + blockchain.leaves().unwrap(), vec![a5.hash(), b4.hash()]); // // B2 -> C3 - let mut builder = client.new_block_at(&BlockId::Hash(b2.hash())).unwrap(); + let mut builder = client.new_block_at(&BlockId::Hash(b2.hash()), Default::default()).unwrap(); // this push is required as otherwise C3 has the same hash as B3 and won't get imported builder.push_transfer(Transfer { from: AccountKeyring::Alice.into(), @@ -124,11 +128,11 @@ pub fn test_leaves_for_backend(backend: Arc) where let c3 = builder.bake().unwrap(); client.import(BlockOrigin::Own, c3.clone()).unwrap(); assert_eq!( - backend.blockchain().leaves().unwrap(), + blockchain.leaves().unwrap(), vec![a5.hash(), b4.hash(), c3.hash()]); // A1 -> D2 - let mut builder = client.new_block_at(&BlockId::Hash(a1.hash())).unwrap(); + let mut builder = client.new_block_at(&BlockId::Hash(a1.hash()), Default::default()).unwrap(); // this push is required as otherwise D2 has the same hash as B2 and won't get imported builder.push_transfer(Transfer { from: AccountKeyring::Alice.into(), @@ -139,7 +143,7 @@ pub fn test_leaves_for_backend(backend: Arc) where let d2 = builder.bake().unwrap(); client.import(BlockOrigin::Own, d2.clone()).unwrap(); assert_eq!( - backend.blockchain().leaves().unwrap(), + blockchain.leaves().unwrap(), vec![a5.hash(), b4.hash(), c3.hash(), d2.hash()]); } @@ -153,30 +157,31 @@ pub fn test_children_for_backend(backend: Arc) where // B2 -> C3 // A1 -> D2 - let client = new_with_backend(backend.clone(), false); + let client = TestClientBuilder::with_backend(backend.clone()).build(); + let blockchain = backend.blockchain(); // G -> A1 - let a1 = client.new_block().unwrap().bake().unwrap(); + let a1 = client.new_block(Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a1.clone()).unwrap(); // A1 -> A2 - let a2 = client.new_block_at(&BlockId::Hash(a1.hash())).unwrap().bake().unwrap(); + let a2 = client.new_block_at(&BlockId::Hash(a1.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a2.clone()).unwrap(); // A2 -> A3 - let a3 = client.new_block_at(&BlockId::Hash(a2.hash())).unwrap().bake().unwrap(); + let a3 = client.new_block_at(&BlockId::Hash(a2.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a3.clone()).unwrap(); // A3 -> A4 - let a4 = client.new_block_at(&BlockId::Hash(a3.hash())).unwrap().bake().unwrap(); + let a4 = client.new_block_at(&BlockId::Hash(a3.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a4.clone()).unwrap(); // A4 -> A5 - let a5 = client.new_block_at(&BlockId::Hash(a4.hash())).unwrap().bake().unwrap(); + let a5 = client.new_block_at(&BlockId::Hash(a4.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a5.clone()).unwrap(); // A1 -> B2 - let mut builder = client.new_block_at(&BlockId::Hash(a1.hash())).unwrap(); + let mut builder = client.new_block_at(&BlockId::Hash(a1.hash()), Default::default()).unwrap(); // this push is required as otherwise B2 has the same hash as A2 and won't get imported builder.push_transfer(Transfer { from: AccountKeyring::Alice.into(), @@ -188,15 +193,15 @@ pub fn test_children_for_backend(backend: Arc) where client.import(BlockOrigin::Own, b2.clone()).unwrap(); // B2 -> B3 - let b3 = client.new_block_at(&BlockId::Hash(b2.hash())).unwrap().bake().unwrap(); + let b3 = client.new_block_at(&BlockId::Hash(b2.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, b3.clone()).unwrap(); // B3 -> B4 - let b4 = client.new_block_at(&BlockId::Hash(b3.hash())).unwrap().bake().unwrap(); + let b4 = client.new_block_at(&BlockId::Hash(b3.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, b4.clone()).unwrap(); // // B2 -> C3 - let mut builder = client.new_block_at(&BlockId::Hash(b2.hash())).unwrap(); + let mut builder = client.new_block_at(&BlockId::Hash(b2.hash()), Default::default()).unwrap(); // this push is required as otherwise C3 has the same hash as B3 and won't get imported builder.push_transfer(Transfer { from: AccountKeyring::Alice.into(), @@ -208,7 +213,7 @@ pub fn test_children_for_backend(backend: Arc) where client.import(BlockOrigin::Own, c3.clone()).unwrap(); // A1 -> D2 - let mut builder = client.new_block_at(&BlockId::Hash(a1.hash())).unwrap(); + let mut builder = client.new_block_at(&BlockId::Hash(a1.hash()), Default::default()).unwrap(); // this push is required as otherwise D2 has the same hash as B2 and won't get imported builder.push_transfer(Transfer { from: AccountKeyring::Alice.into(), @@ -219,18 +224,18 @@ pub fn test_children_for_backend(backend: Arc) where let d2 = builder.bake().unwrap(); client.import(BlockOrigin::Own, d2.clone()).unwrap(); - let genesis_hash = client.info().unwrap().chain.genesis_hash; + let genesis_hash = client.info().chain.genesis_hash; - let children1 = backend.blockchain().children(a4.hash()).unwrap(); + let children1 = blockchain.children(a4.hash()).unwrap(); assert_eq!(vec![a5.hash()], children1); - let children2 = backend.blockchain().children(a1.hash()).unwrap(); + let children2 = blockchain.children(a1.hash()).unwrap(); assert_eq!(vec![a2.hash(), b2.hash(), d2.hash()], children2); - let children3 = backend.blockchain().children(genesis_hash).unwrap(); + let children3 = blockchain.children(genesis_hash).unwrap(); assert_eq!(vec![a1.hash()], children3); - let children4 = backend.blockchain().children(b2.hash()).unwrap(); + let children4 = blockchain.children(b2.hash()).unwrap(); assert_eq!(vec![b3.hash(), c3.hash()], children4); } @@ -242,30 +247,31 @@ pub fn test_blockchain_query_by_number_gets_canonical(backend: Arc B2 -> B3 -> B4 // B2 -> C3 // A1 -> D2 - let client = new_with_backend(backend, false); + let client = TestClientBuilder::with_backend(backend.clone()).build(); + let blockchain = backend.blockchain(); // G -> A1 - let a1 = client.new_block().unwrap().bake().unwrap(); + let a1 = client.new_block(Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a1.clone()).unwrap(); // A1 -> A2 - let a2 = client.new_block_at(&BlockId::Hash(a1.hash())).unwrap().bake().unwrap(); + let a2 = client.new_block_at(&BlockId::Hash(a1.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a2.clone()).unwrap(); // A2 -> A3 - let a3 = client.new_block_at(&BlockId::Hash(a2.hash())).unwrap().bake().unwrap(); + let a3 = client.new_block_at(&BlockId::Hash(a2.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a3.clone()).unwrap(); // A3 -> A4 - let a4 = client.new_block_at(&BlockId::Hash(a3.hash())).unwrap().bake().unwrap(); + let a4 = client.new_block_at(&BlockId::Hash(a3.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a4.clone()).unwrap(); // A4 -> A5 - let a5 = client.new_block_at(&BlockId::Hash(a4.hash())).unwrap().bake().unwrap(); + let a5 = client.new_block_at(&BlockId::Hash(a4.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, a5.clone()).unwrap(); // A1 -> B2 - let mut builder = client.new_block_at(&BlockId::Hash(a1.hash())).unwrap(); + let mut builder = client.new_block_at(&BlockId::Hash(a1.hash()), Default::default()).unwrap(); // this push is required as otherwise B2 has the same hash as A2 and won't get imported builder.push_transfer(Transfer { from: AccountKeyring::Alice.into(), @@ -277,15 +283,15 @@ pub fn test_blockchain_query_by_number_gets_canonical(backend: Arc B3 - let b3 = client.new_block_at(&BlockId::Hash(b2.hash())).unwrap().bake().unwrap(); + let b3 = client.new_block_at(&BlockId::Hash(b2.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, b3.clone()).unwrap(); // B3 -> B4 - let b4 = client.new_block_at(&BlockId::Hash(b3.hash())).unwrap().bake().unwrap(); + let b4 = client.new_block_at(&BlockId::Hash(b3.hash()), Default::default()).unwrap().bake().unwrap(); client.import(BlockOrigin::Own, b4.clone()).unwrap(); // // B2 -> C3 - let mut builder = client.new_block_at(&BlockId::Hash(b2.hash())).unwrap(); + let mut builder = client.new_block_at(&BlockId::Hash(b2.hash()), Default::default()).unwrap(); // this push is required as otherwise C3 has the same hash as B3 and won't get imported builder.push_transfer(Transfer { from: AccountKeyring::Alice.into(), @@ -297,7 +303,7 @@ pub fn test_blockchain_query_by_number_gets_canonical(backend: Arc D2 - let mut builder = client.new_block_at(&BlockId::Hash(a1.hash())).unwrap(); + let mut builder = client.new_block_at(&BlockId::Hash(a1.hash()), Default::default()).unwrap(); // this push is required as otherwise D2 has the same hash as B2 and won't get imported builder.push_transfer(Transfer { from: AccountKeyring::Alice.into(), @@ -308,23 +314,23 @@ pub fn test_blockchain_query_by_number_gets_canonical(backend: Arc), Transfer(Transfer, AccountSignature), IncludeData(Vec), + StorageChange(Vec, Option>), } #[cfg(feature = "std")] @@ -121,14 +129,19 @@ impl BlindCheckable for Extrinsic { Err(runtime_primitives::BAD_SIGNATURE) } }, - Extrinsic::IncludeData(data) => Ok(Extrinsic::IncludeData(data)), + Extrinsic::IncludeData(_) => Err(runtime_primitives::BAD_SIGNATURE), + Extrinsic::StorageChange(key, value) => Ok(Extrinsic::StorageChange(key, value)), } } } impl ExtrinsicT for Extrinsic { fn is_signed(&self) -> Option { - Some(true) + if let Extrinsic::IncludeData(_) = *self { + Some(false) + } else { + Some(true) + } } } @@ -141,10 +154,6 @@ impl Extrinsic { } } -/// The signature type used by authorities. -pub type AuthoritySignature = sr25519::Signature; -/// The identity type used by authorities. -pub type AuthorityId = ::Signer; /// The signature type used by accounts/transactions. pub type AccountSignature = sr25519::Signature; /// An identifier for an account on this system. @@ -156,13 +165,13 @@ pub type BlockNumber = u64; /// Index of a transaction. pub type Index = u64; /// The item of a block digest. -pub type DigestItem = runtime_primitives::generic::DigestItem; +pub type DigestItem = runtime_primitives::generic::DigestItem; /// The digest of a block. -pub type Digest = runtime_primitives::generic::Digest; +pub type Digest = runtime_primitives::generic::Digest; /// A test block. pub type Block = runtime_primitives::generic::Block; /// A test block's header. -pub type Header = runtime_primitives::generic::Header; +pub type Header = runtime_primitives::generic::Header; /// Run whatever tests we have. pub fn run_tests(mut input: &[u8]) -> Vec { @@ -347,10 +356,6 @@ cfg_if! { fn initialize_block(header: &::Header) { system::initialize_block(header) } - - fn authorities() -> Vec { - panic!("Deprecated, please use `AuthoritiesApi`.") - } } impl client_api::Metadata for Runtime { @@ -361,6 +366,16 @@ cfg_if! { impl client_api::TaggedTransactionQueue for Runtime { fn validate_transaction(utx: ::Extrinsic) -> TransactionValidity { + if let Extrinsic::IncludeData(data) = utx { + return TransactionValidity::Valid { + priority: data.len() as u64, + requires: vec![], + provides: vec![data], + longevity: 1, + propagate: false, + }; + } + system::validate_transaction(utx) } } @@ -444,8 +459,9 @@ cfg_if! { } } - impl consensus_aura::AuraApi for Runtime { + impl consensus_aura::AuraApi for Runtime { fn slot_duration() -> u64 { 1 } + fn authorities() -> Vec { system::authorities() } } impl consensus_babe::BabeApi for Runtime { @@ -454,20 +470,16 @@ cfg_if! { slot_duration: 1, expected_block_time: 1, threshold: std::u64::MAX, + median_required_blocks: 100, } } + fn authorities() -> Vec { system::authorities() } } impl offchain_primitives::OffchainWorkerApi for Runtime { fn offchain_worker(block: u64) { let ex = Extrinsic::IncludeData(block.encode()); - runtime_io::submit_extrinsic(&ex) - } - } - - impl consensus_authorities::AuthoritiesApi for Runtime { - fn authorities() -> Vec> { - system::authorities() + runtime_io::submit_transaction(&ex).unwrap(); } } } @@ -485,10 +497,6 @@ cfg_if! { fn initialize_block(header: &::Header) { system::initialize_block(header) } - - fn authorities() -> Vec { - panic!("Deprecated, please use `AuthoritiesApi`.") - } } impl client_api::Metadata for Runtime { @@ -499,6 +507,16 @@ cfg_if! { impl client_api::TaggedTransactionQueue for Runtime { fn validate_transaction(utx: ::Extrinsic) -> TransactionValidity { + if let Extrinsic::IncludeData(data) = utx { + return TransactionValidity::Valid { + priority: data.len() as u64, + requires: vec![], + provides: vec![data], + longevity: 1, + propagate: false, + }; + } + system::validate_transaction(utx) } } @@ -586,30 +604,27 @@ cfg_if! { } } - impl consensus_aura::AuraApi for Runtime { + impl consensus_aura::AuraApi for Runtime { fn slot_duration() -> u64 { 1 } + fn authorities() -> Vec { system::authorities() } } impl consensus_babe::BabeApi for Runtime { fn startup_data() -> consensus_babe::BabeConfiguration { consensus_babe::BabeConfiguration { + median_required_blocks: 0, slot_duration: 1, expected_block_time: 1, threshold: core::u64::MAX, } } + fn authorities() -> Vec { system::authorities() } } impl offchain_primitives::OffchainWorkerApi for Runtime { fn offchain_worker(block: u64) { let ex = Extrinsic::IncludeData(block.encode()); - runtime_io::submit_extrinsic(&ex) - } - } - - impl consensus_authorities::AuthoritiesApi for Runtime { - fn authorities() -> Vec> { - system::authorities() + runtime_io::submit_transaction(&ex).unwrap() } } } diff --git a/core/test-runtime/src/system.rs b/core/test-runtime/src/system.rs index 5345dc0cdb01bac03d568b94b9499878ddde3120..267d322e87b136abbd94b882e234dc6e34d4849d 100644 --- a/core/test-runtime/src/system.rs +++ b/core/test-runtime/src/system.rs @@ -21,13 +21,14 @@ use rstd::prelude::*; use runtime_io::{storage_root, enumerated_trie_root, storage_changes_root, twox_128, blake2_256}; use runtime_support::storage::{self, StorageValue, StorageMap}; use runtime_support::storage_items; -use runtime_primitives::traits::{Hash as HashT, BlakeTwo256, Digest as DigestT}; +use runtime_primitives::traits::{Hash as HashT, BlakeTwo256, Header as _}; use runtime_primitives::generic; use runtime_primitives::{ApplyError, ApplyOutcome, ApplyResult, transaction_validity::TransactionValidity}; use parity_codec::{KeyedVec, Encode}; -use super::{AccountId, BlockNumber, Extrinsic, Transfer, H256 as Hash, Block, Header, Digest}; +use super::{ + AccountId, BlockNumber, Extrinsic, Transfer, H256 as Hash, Block, Header, Digest, AuthorityId +}; use primitives::{Blake2Hasher, storage::well_known_keys}; -use primitives::sr25519::Public as AuthorityId; const NONCE_OF: &[u8] = b"nonce:"; const BALANCE_OF: &[u8] = b"balance:"; @@ -38,6 +39,8 @@ storage_items! { Number: b"sys:num" => BlockNumber; ParentHash: b"sys:pha" => required Hash; NewAuthorities: b"sys:new_auth" => Vec; + StorageDigest: b"sys:digest" => Digest; + Authorities get(authorities): b"sys:auth" => default Vec; } pub fn balance_of_key(who: AccountId) -> Vec { @@ -52,21 +55,11 @@ pub fn nonce_of(who: AccountId) -> u64 { storage::hashed::get_or(&blake2_256, &who.to_keyed_vec(NONCE_OF), 0) } -/// Get authorities at given block. -pub fn authorities() -> Vec { - let len: u32 = storage::unhashed::get(well_known_keys::AUTHORITY_COUNT) - .expect("There are always authorities in test-runtime"); - (0..len) - .map(|i| storage::unhashed::get(&i.to_keyed_vec(well_known_keys::AUTHORITY_PREFIX)) - .expect("Authority is properly encoded in test-runtime") - ) - .collect() -} - pub fn initialize_block(header: &Header) { // populate environment. ::put(&header.number); ::put(&header.parent_hash); + ::put(header.digest()); storage::unhashed::put(well_known_keys::EXTRINSIC_INDEX, &0u32); } @@ -78,8 +71,25 @@ pub fn take_block_number() -> Option { Number::take() } +#[derive(Copy, Clone)] +enum Mode { + Verify, + Overwrite, +} + /// Actually execute all transitioning for `block`. pub fn polish_block(block: &mut Block) { + execute_block_with_state_root_handler(block, Mode::Overwrite); +} + +pub fn execute_block(mut block: Block) { + execute_block_with_state_root_handler(&mut block, Mode::Verify); +} + +fn execute_block_with_state_root_handler( + block: &mut Block, + mode: Mode, +) { let header = &mut block.header; // check transaction trie root represents the transactions. @@ -87,7 +97,11 @@ pub fn polish_block(block: &mut Block) { let txs = txs.iter().map(Vec::as_slice).collect::>(); let txs_root = enumerated_trie_root::(&txs).into(); info_expect_equal_hash(&txs_root, &header.extrinsics_root); - header.extrinsics_root = txs_root; + if let Mode::Overwrite = mode { + header.extrinsics_root = txs_root; + } else { + assert!(txs_root == header.extrinsics_root, "Transaction trie root must be valid."); + } // execute transactions block.extrinsics.iter().enumerate().for_each(|(i, e)| { @@ -96,50 +110,24 @@ pub fn polish_block(block: &mut Block) { storage::unhashed::kill(well_known_keys::EXTRINSIC_INDEX); }); - header.state_root = storage_root().into(); - - // check digest - let mut digest = Digest::default(); - if let Some(storage_changes_root) = storage_changes_root(header.parent_hash.into(), header.number - 1) { - digest.push(generic::DigestItem::ChangesTrieRoot(storage_changes_root.into())); - } - if let Some(new_authorities) = ::take() { - digest.push(generic::DigestItem::AuthoritiesChange(new_authorities)); + if let Mode::Overwrite = mode { + header.state_root = storage_root().into(); + } else { + // check storage root. + let storage_root = storage_root().into(); + info_expect_equal_hash(&storage_root, &header.state_root); + assert!(storage_root == header.state_root, "Storage root must match that calculated."); } - header.digest = digest; -} - -pub fn execute_block(block: Block) { - let ref header = block.header; - - // check transaction trie root represents the transactions. - let txs = block.extrinsics.iter().map(Encode::encode).collect::>(); - let txs = txs.iter().map(Vec::as_slice).collect::>(); - let txs_root = enumerated_trie_root::(&txs).into(); - info_expect_equal_hash(&txs_root, &header.extrinsics_root); - assert!(txs_root == header.extrinsics_root, "Transaction trie root must be valid."); - - // execute transactions - block.extrinsics.into_iter().enumerate().for_each(|(i, e)| { - storage::unhashed::put(well_known_keys::EXTRINSIC_INDEX, &(i as u32)); - execute_transaction_backend(&e).unwrap_or_else(|_| panic!("Invalid transaction")); - storage::unhashed::kill(well_known_keys::EXTRINSIC_INDEX); - }); - - // check storage root. - let storage_root = storage_root().into(); - info_expect_equal_hash(&storage_root, &header.state_root); - assert!(storage_root == header.state_root, "Storage root must match that calculated."); // check digest - let mut digest = Digest::default(); - if let Some(storage_changes_root) = storage_changes_root(header.parent_hash.into(), header.number - 1) { + let digest = &mut header.digest; + if let Some(storage_changes_root) = storage_changes_root(header.parent_hash.into()) { digest.push(generic::DigestItem::ChangesTrieRoot(storage_changes_root.into())); } if let Some(new_authorities) = ::take() { - digest.push(generic::DigestItem::AuthoritiesChange(new_authorities)); + digest.push(generic::DigestItem::Consensus(*b"aura", new_authorities.encode())); + digest.push(generic::DigestItem::Consensus(*b"babe", new_authorities.encode())); } - assert!(digest == header.digest, "Header digest items must match that calculated."); } /// The block executor. @@ -190,6 +178,7 @@ pub fn validate_transaction(utx: Extrinsic) -> TransactionValidity { requires, provides, longevity: 64, + propagate: true, } } @@ -209,18 +198,22 @@ pub fn finalize_block() -> Header { let txs: Vec<_> = (0..extrinsic_index).map(ExtrinsicData::take).collect(); let txs = txs.iter().map(Vec::as_slice).collect::>(); let extrinsics_root = enumerated_trie_root::(&txs).into(); - + // let mut digest = Digest::default(); let number = ::take().expect("Number is set by `initialize_block`"); let parent_hash = ::take(); + let mut digest = ::take().expect("StorageDigest is set by `initialize_block`"); + + // This MUST come after all changes to storage are done. Otherwise we will fail the + // “Storage root does not match that calculated” assertion. let storage_root = BlakeTwo256::storage_root(); - let storage_changes_root = BlakeTwo256::storage_changes_root(parent_hash, number - 1); + let storage_changes_root = BlakeTwo256::storage_changes_root(parent_hash); - let mut digest = Digest::default(); if let Some(storage_changes_root) = storage_changes_root { digest.push(generic::DigestItem::ChangesTrieRoot(storage_changes_root)); } if let Some(new_authorities) = ::take() { - digest.push(generic::DigestItem::AuthoritiesChange(new_authorities)); + digest.push(generic::DigestItem::Consensus(*b"aura", new_authorities.encode())); + digest.push(generic::DigestItem::Consensus(*b"babe", new_authorities.encode())); } Header { @@ -245,6 +238,7 @@ fn execute_transaction_backend(utx: &Extrinsic) -> ApplyResult { Extrinsic::Transfer(ref transfer, _) => execute_transfer_backend(transfer), Extrinsic::AuthoritiesChange(ref new_auth) => execute_new_authorities_backend(new_auth), Extrinsic::IncludeData(_) => Ok(ApplyOutcome::Success), + Extrinsic::StorageChange(key, value) => execute_storage_change(key, value.as_ref().map(|v| &**v)), } } @@ -280,6 +274,14 @@ fn execute_new_authorities_backend(new_authorities: &[AuthorityId]) -> ApplyResu Ok(ApplyOutcome::Success) } +fn execute_storage_change(key: &[u8], value: Option<&[u8]>) -> ApplyResult { + match value { + Some(value) => storage::unhashed::put_raw(key, value), + None => storage::unhashed::kill(key), + } + Ok(ApplyOutcome::Success) +} + #[cfg(feature = "std")] fn info_expect_equal_hash(given: &Hash, expected: &Hash) { use primitives::hexdisplay::HexDisplay; @@ -305,25 +307,27 @@ fn info_expect_equal_hash(given: &Hash, expected: &Hash) { mod tests { use super::*; - use runtime_io::{with_externalities, twox_128, blake2_256, TestExternalities}; - use parity_codec::{Joiner, KeyedVec}; - use substrate_test_client::{AuthorityKeyring, AccountKeyring}; + use runtime_io::{with_externalities, TestExternalities}; + use substrate_test_runtime_client::{AuthorityKeyring, AccountKeyring}; use crate::{Header, Transfer}; use primitives::{Blake2Hasher, map}; - use primitives::storage::well_known_keys; use substrate_executor::WasmExecutor; const WASM_CODE: &'static [u8] = include_bytes!("../wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm"); fn new_test_ext() -> TestExternalities { + let authorities = vec![ + AuthorityKeyring::Alice.to_raw_public(), + AuthorityKeyring::Bob.to_raw_public(), + AuthorityKeyring::Charlie.to_raw_public() + ]; TestExternalities::new(map![ twox_128(b"latest").to_vec() => vec![69u8; 32], - twox_128(well_known_keys::AUTHORITY_COUNT).to_vec() => vec![].and(&3u32), - twox_128(&0u32.to_keyed_vec(well_known_keys::AUTHORITY_PREFIX)).to_vec() => AuthorityKeyring::Alice.to_raw_public().to_vec(), - twox_128(&1u32.to_keyed_vec(well_known_keys::AUTHORITY_PREFIX)).to_vec() => AuthorityKeyring::Bob.to_raw_public().to_vec(), - twox_128(&2u32.to_keyed_vec(well_known_keys::AUTHORITY_PREFIX)).to_vec() => AuthorityKeyring::Charlie.to_raw_public().to_vec(), - blake2_256(&AccountKeyring::Alice.to_raw_public().to_keyed_vec(b"balance:")).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0] + twox_128(b"sys:auth").to_vec() => authorities.encode(), + blake2_256(&AccountKeyring::Alice.to_raw_public().to_keyed_vec(b"balance:")).to_vec() => { + vec![111u8, 0, 0, 0, 0, 0, 0, 0] + } ]) } diff --git a/core/test-runtime/wasm/Cargo.lock b/core/test-runtime/wasm/Cargo.lock index 2a8f1942a347c2c30a1729dcf2c1b8337384c6e1..7cba86c8b6d963b7f79d28179ee0a9076a22dbdd 100644 --- a/core/test-runtime/wasm/Cargo.lock +++ b/core/test-runtime/wasm/Cargo.lock @@ -1,5 +1,10 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +[[package]] +name = "adler32" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "aes-ctr" version = "0.3.0" @@ -33,7 +38,7 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "0.6.10" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -44,12 +49,12 @@ name = "aio-limited" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -79,7 +84,7 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -87,27 +92,26 @@ name = "atty" version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "termion 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "autocfg" -version = "0.1.2" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "backtrace" -version = "0.3.14" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "backtrace-sys 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-demangle 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-demangle 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -115,19 +119,22 @@ name = "backtrace-sys" version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.30 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] -name = "base-x" -version = "0.2.4" +name = "base58" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] -name = "base58" -version = "0.1.0" +name = "base64" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] name = "bigint" @@ -179,10 +186,10 @@ dependencies = [ [[package]] name = "block-buffer" -version = "0.7.0" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "block-padding 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "block-padding 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "generic-array 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -198,7 +205,7 @@ dependencies = [ [[package]] name = "block-padding" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -209,9 +216,14 @@ name = "bs58" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "build_const" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "bumpalo" -version = "2.4.1" +version = "2.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -250,12 +262,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "cc" -version = "1.0.30" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "cfg-if" -version = "0.1.7" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -263,8 +275,8 @@ name = "chrono" version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "num-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -273,7 +285,7 @@ name = "clear_on_drop" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.30 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -289,12 +301,28 @@ name = "constant_time_eq" version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "crc" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "build_const 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "crc32fast" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "crossbeam" version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-channel 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-deque 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-epoch 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -346,7 +374,7 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-utils 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -360,7 +388,7 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -380,7 +408,7 @@ name = "crossbeam-utils" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -388,7 +416,7 @@ name = "crossbeam-utils" version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -399,7 +427,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "crunchy" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -440,14 +468,14 @@ dependencies = [ [[package]] name = "curve25519-dalek" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "digest 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "subtle 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "subtle 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -457,13 +485,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "derive_more" -version = "0.14.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -482,11 +510,6 @@ dependencies = [ "generic-array 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "discard" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "dns-parser" version = "0.8.0" @@ -502,7 +525,7 @@ version = "1.0.0-pre.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "curve25519-dalek 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "curve25519-dalek 1.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -510,7 +533,7 @@ dependencies = [ [[package]] name = "either" -version = "1.5.1" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -529,7 +552,7 @@ dependencies = [ "atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "humantime 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "termcolor 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -543,15 +566,7 @@ name = "erased-serde" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "error-chain" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "backtrace 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -559,7 +574,7 @@ name = "failure" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "backtrace 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", + "backtrace 0.3.26 (registry+https://github.com/rust-lang/crates.io-index)", "failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -568,10 +583,10 @@ name = "failure_derive" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", - "synstructure 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", + "synstructure 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -581,33 +596,33 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "fixed-hash" -version = "0.3.0" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "static_assertions 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] -name = "fnv" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "foreign-types" -version = "0.3.2" +name = "flate2" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "miniz-sys 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "miniz_oxide_c_api 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] -name = "foreign-types-shared" -version = "0.1.1" +name = "fnv" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -631,7 +646,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "futures" -version = "0.1.25" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -639,7 +654,7 @@ name = "futures-cpupool" version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -672,7 +687,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "c_linked_list 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "get_if_addrs-sys 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -682,7 +697,7 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "gcc 0.3.55 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -692,10 +707,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "hash256-std-hasher" -version = "0.12.0" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "crunchy 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "crunchy 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -717,7 +732,7 @@ name = "heapsize" version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -725,7 +740,7 @@ name = "heck" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "unicode-segmentation 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-segmentation 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -735,16 +750,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "hex-literal" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "hex-literal-impl 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal-impl 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro-hack 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "hex-literal-impl" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro-hack 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -779,6 +794,16 @@ dependencies = [ "hmac 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "http" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "httparse" version = "1.3.3" @@ -816,7 +841,15 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "impl-serde" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -829,21 +862,26 @@ name = "iovec" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "ipnet" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "itoa" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "js-sys" -version = "0.3.19" +version = "0.3.22" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -874,53 +912,51 @@ name = "lazy_static" version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "lazycell" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "libc" -version = "0.2.50" +version = "0.2.55" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "libp2p" -version = "0.7.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core-derive 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-dns 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-floodsub 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-identify 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-kad 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-mdns 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-mplex 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-noise 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-ping 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-plaintext 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-ratelimit 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-secio 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-tcp 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-uds 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-yamux 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multihash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core-derive 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-deflate 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-dns 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-floodsub 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-identify 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-kad 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-mdns 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-mplex 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-noise 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-ping 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-plaintext 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-ratelimit 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-secio 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-tcp 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-uds 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-wasm-ext 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-websocket 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-yamux 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multihash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", - "stdweb 0.4.15 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-core" -version = "0.7.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "asn1_der 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -929,64 +965,74 @@ dependencies = [ "ed25519-dalek 1.0.0-pre.1 (registry+https://github.com/rust-lang/crates.io-index)", "failure 0.1.5 (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)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libsecp256k1 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "multistream-select 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multihash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multihash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", - "rw-stream-sink 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "secp256k1 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rw-stream-sink 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "zeroize 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-core-derive" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "libp2p-deflate" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "flate2 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-dns" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-dns-unofficial 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-floodsub" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bs58 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "cuckoofilter 0.3.2 (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)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -996,28 +1042,28 @@ dependencies = [ [[package]] name = "libp2p-identify" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (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)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-kad" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1026,54 +1072,55 @@ dependencies = [ "bs58 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.12 (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)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multihash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multihash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-mdns" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "data-encoding 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "dns-parser 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-udp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-mplex" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (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)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1081,103 +1128,107 @@ dependencies = [ [[package]] name = "libp2p-noise" -version = "0.5.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "curve25519-dalek 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "curve25519-dalek 1.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", "snow 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "x25519-dalek 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "zeroize 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", + "x25519-dalek 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", + "zeroize 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-ping" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-plaintext" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-ratelimit" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "aio-limited 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-secio" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "aes-ctr 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "asn1_der 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "ctr 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "hmac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "js-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-send-wrapper 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", - "rw-stream-sink 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "send_wrapper 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rw-stream-sink 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "twofish 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-futures 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", - "web-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-futures 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", + "web-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-tcp" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "get_if_addrs 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ipnet 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "tk-listen 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1185,26 +1236,57 @@ dependencies = [ [[package]] name = "libp2p-uds" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-uds 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "libp2p-wasm-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-send-wrapper 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-futures 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "libp2p-websocket" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "rw-stream-sink 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "soketto 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-rustls 0.10.0-alpha.3 (registry+https://github.com/rust-lang/crates.io-index)", + "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "webpki-roots 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "libp2p-yamux" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "yamux 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "yamux 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1229,12 +1311,20 @@ dependencies = [ "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "lock_api" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "log" version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1269,7 +1359,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "merlin" -version = "1.0.3" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1278,17 +1368,44 @@ dependencies = [ "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "miniz-sys" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "miniz_oxide" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "adler32 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "miniz_oxide_c_api" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", + "crc 1.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "miniz_oxide 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "mio" -version = "0.6.16" +version = "0.6.19" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1296,25 +1413,14 @@ dependencies = [ "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "mio-extras" -version = "2.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", - "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "mio-uds" version = "0.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1334,7 +1440,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1347,9 +1453,9 @@ name = "net2" version = "0.2.33" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1373,23 +1479,27 @@ dependencies = [ [[package]] name = "num-integer" -version = "0.1.39" +version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "num-traits" -version = "0.2.6" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] name = "num_cpus" version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1410,31 +1520,6 @@ name = "opaque-debug" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "openssl" -version = "0.10.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl-sys 0.9.42 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "openssl-sys" -version = "0.9.42" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cc 1.0.30 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", - "pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "vcpkg 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "owning_ref" version = "0.3.3" @@ -1463,7 +1548,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec-derive 3.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1471,15 +1556,15 @@ name = "parity-codec-derive" version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro-crate 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "parity-multiaddr" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1487,24 +1572,31 @@ dependencies = [ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "data-encoding 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multihash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multihash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "parity-multihash" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "blake2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "sha-1 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "sha3 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "parity-send-wrapper" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "parity-wasm" version = "0.31.3" @@ -1540,15 +1632,25 @@ dependencies = [ "parking_lot_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "parking_lot" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "lock_api 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot_core 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "parking_lot_core" version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1556,11 +1658,11 @@ name = "parking_lot_core" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1568,31 +1670,46 @@ name = "parking_lot_core" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "parking_lot_core" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.54 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "paste" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "paste-impl 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro-hack 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", + "paste-impl 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-hack 0.5.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "paste-impl" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro-hack 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-hack 0.5.7 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1610,28 +1727,23 @@ name = "percent-encoding" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "pkg-config" -version = "0.3.14" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "primitive-types" -version = "0.2.1" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "fixed-hash 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "fixed-hash 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "impl-codec 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "impl-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "uint 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "impl-serde 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "uint 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "proc-macro-crate" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "toml 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "toml 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1644,12 +1756,12 @@ dependencies = [ [[package]] name = "proc-macro-hack" -version = "0.5.4" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1659,7 +1771,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "proc-macro2" -version = "0.4.27" +version = "0.4.30" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1667,7 +1779,7 @@ dependencies = [ [[package]] name = "protobuf" -version = "2.4.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -1685,7 +1797,7 @@ name = "quote" version = "0.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1693,7 +1805,7 @@ name = "rand" version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1703,10 +1815,10 @@ version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1716,9 +1828,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1726,17 +1838,17 @@ name = "rand" version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand_isaac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_jitter 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_jitter 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "rand_pcg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "rand_xorshift 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1744,7 +1856,7 @@ name = "rand_chacha" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1779,12 +1891,12 @@ dependencies = [ [[package]] name = "rand_jitter" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1794,10 +1906,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1805,7 +1917,7 @@ name = "rand_pcg" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1823,7 +1935,7 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crossbeam-deque 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "either 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "either 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "rayon-core 1.4.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1834,7 +1946,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crossbeam-deque 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1848,7 +1960,7 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.1.51" +version = "0.1.54" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -1856,24 +1968,24 @@ name = "redox_termios" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.54 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "regex" -version = "1.1.2" +version = "1.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "aho-corasick 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", + "aho-corasick 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "regex-syntax 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "regex-syntax 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", "thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", "utf8-ranges 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "regex-syntax" -version = "0.6.5" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "ucd-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1884,17 +1996,17 @@ name = "ring" version = "0.14.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.30 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "spin 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "rustc-demangle" -version = "0.1.13" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -1910,19 +2022,32 @@ dependencies = [ "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "rustls" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", + "sct 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "webpki 0.19.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "rw-stream-sink" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "ryu" -version = "0.2.7" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -1935,51 +2060,38 @@ dependencies = [ [[package]] name = "schnorrkel" -version = "0.0.0" -source = "git+https://github.com/w3f/schnorrkel#3179838da9dd4896c12bb910e7c42477a3250641" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "curve25519-dalek 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "curve25519-dalek 1.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "ed25519-dalek 1.0.0-pre.1 (registry+https://github.com/rust-lang/crates.io-index)", "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "merlin 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "merlin 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sha3 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", - "subtle 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "sha3 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", + "subtle 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] -name = "schnorrkel" -version = "0.1.0" +name = "scopeguard" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "curve25519-dalek 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "ed25519-dalek 1.0.0-pre.1 (registry+https://github.com/rust-lang/crates.io-index)", - "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "merlin 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sha3 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", - "subtle 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", -] [[package]] name = "scopeguard" -version = "0.3.3" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] -name = "secp256k1" -version = "0.12.0" +name = "sct" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.30 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", + "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2002,20 +2114,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "serde" -version = "1.0.89" +version = "1.0.91" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "serde_derive" -version = "1.0.89" +version = "1.0.91" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2023,9 +2135,20 @@ name = "serde_json" version = "1.0.39" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", - "ryu 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", + "ryu 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "sha-1" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", + "digest 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "opaque-debug 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2050,7 +2173,7 @@ name = "sha2" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "block-buffer 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "digest 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "opaque-debug 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2058,10 +2181,10 @@ dependencies = [ [[package]] name = "sha3" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "block-buffer 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "digest 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "keccak 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2081,16 +2204,6 @@ dependencies = [ "erased-serde 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "slog-async" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "take_mut 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "slog-json" version = "2.3.0" @@ -2098,7 +2211,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "erased-serde 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", "slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2132,7 +2245,25 @@ dependencies = [ "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", "static_slice 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "subtle 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "subtle 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "soketto" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "http 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", + "httparse 1.3.3 (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)", + "sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2150,10 +2281,10 @@ name = "sr-api-macros" version = "2.0.0" dependencies = [ "blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro-crate 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2178,9 +2309,9 @@ version = "2.0.0" dependencies = [ "integer-sqrt 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)", - "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-std 2.0.0", "substrate-primitives 2.0.0", @@ -2199,7 +2330,7 @@ version = "2.0.0" dependencies = [ "impl-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", ] @@ -2209,7 +2340,7 @@ name = "srml-executive" version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -2222,7 +2353,7 @@ name = "srml-metadata" version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-std 2.0.0", "substrate-primitives 2.0.0", ] @@ -2234,8 +2365,8 @@ dependencies = [ "bitmask 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "once_cell 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "paste 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "paste 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -2248,31 +2379,31 @@ dependencies = [ name = "srml-support-procedural" version = "2.0.0" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", "sr-api-macros 2.0.0", "srml-support-procedural-tools 2.0.0", - "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "srml-support-procedural-tools" version = "2.0.0" dependencies = [ - "proc-macro-crate 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", "srml-support-procedural-tools-derive 2.0.0", - "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "srml-support-procedural-tools-derive" version = "2.0.0" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2281,7 +2412,7 @@ version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -2304,50 +2435,6 @@ name = "static_slice" version = "0.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "stdweb" -version = "0.4.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "discard 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "stdweb-derive 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "stdweb-internal-macros 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", - "stdweb-internal-runtime 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "stdweb-derive" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "stdweb-internal-macros" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "base-x 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", - "sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "stdweb-internal-runtime" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "stream-cipher" version = "0.3.0" @@ -2367,19 +2454,19 @@ version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-bip39" -version = "0.2.0" -source = "git+https://github.com/paritytech/substrate-bip39#a28806512c977992af8d6740d45352f5a1c832a0" +version = "0.2.1" +source = "git+https://github.com/paritytech/substrate-bip39#44307fda4ea17fe97aeb93af317fbc8f6ed34193" dependencies = [ "hmac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "pbkdf2 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "schnorrkel 0.0.0 (git+https://github.com/w3f/schnorrkel)", + "schnorrkel 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2387,15 +2474,15 @@ dependencies = [ name = "substrate-client" version = "2.0.0" dependencies = [ - "derive_more 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.14.1 (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)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", - "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-api-macros 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -2413,21 +2500,10 @@ dependencies = [ [[package]] name = "substrate-consensus-aura-primitives" version = "2.0.0" -dependencies = [ - "sr-primitives 2.0.0", - "substrate-client 2.0.0", -] - -[[package]] -name = "substrate-consensus-authorities" -version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", - "sr-version 2.0.0", - "srml-support 2.0.0", "substrate-client 2.0.0", "substrate-primitives 2.0.0", ] @@ -2438,42 +2514,45 @@ version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", + "sr-std 2.0.0", "substrate-client 2.0.0", "substrate-consensus-slots 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] name = "substrate-consensus-common" version = "2.0.0" dependencies = [ - "crossbeam-channel 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", + "sr-std 2.0.0", "sr-version 2.0.0", "substrate-inherents 2.0.0", "substrate-primitives 2.0.0", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-consensus-slots" version = "2.0.0" dependencies = [ - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "substrate-client 2.0.0", "substrate-consensus-common 2.0.0", "substrate-inherents 2.0.0", "substrate-primitives 2.0.0", - "tokio 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2481,12 +2560,12 @@ name = "substrate-executor" version = "2.0.0" dependencies = [ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "libsecp256k1 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-version 2.0.0", "substrate-panic-handler 2.0.0", @@ -2495,7 +2574,7 @@ dependencies = [ "substrate-state-machine 2.0.0", "substrate-trie 2.0.0", "tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "wasmi 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmi 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2503,7 +2582,7 @@ name = "substrate-inherents" version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", ] @@ -2531,7 +2610,7 @@ dependencies = [ name = "substrate-panic-handler" version = "2.0.0" dependencies = [ - "backtrace 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", + "backtrace 0.3.26 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2544,29 +2623,30 @@ dependencies = [ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "ed25519-dalek 1.0.0-pre.1 (registry+https://github.com/rust-lang/crates.io-index)", "hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", - "hash256-std-hasher 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash256-std-hasher 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "impl-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "primitive-types 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "primitive-types 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "schnorrkel 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "schnorrkel 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-std 2.0.0", - "substrate-bip39 0.2.0 (git+https://github.com/paritytech/substrate-bip39)", + "substrate-bip39 0.2.1 (git+https://github.com/paritytech/substrate-bip39)", "tiny-bip39 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "twox-hash 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "wasmi 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "twox-hash 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmi 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-serializer" version = "2.0.0" dependencies = [ - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2576,8 +2656,9 @@ version = "2.0.0" dependencies = [ "hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-panic-handler 2.0.0", "substrate-primitives 2.0.0", "substrate-trie 2.0.0", @@ -2589,28 +2670,30 @@ dependencies = [ name = "substrate-telemetry" version = "2.0.0" dependencies = [ - "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "slog-async 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "slog-json 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "slog-scope 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "ws 0.7.9 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-test-runtime" version = "2.0.0" dependencies = [ - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "memory-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -2619,7 +2702,6 @@ dependencies = [ "srml-support 2.0.0", "substrate-client 2.0.0", "substrate-consensus-aura-primitives 2.0.0", - "substrate-consensus-authorities 2.0.0", "substrate-consensus-babe-primitives 2.0.0", "substrate-inherents 2.0.0", "substrate-keyring 2.0.0", @@ -2656,35 +2738,30 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "subtle" -version = "2.0.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "syn" -version = "0.15.33" +version = "0.15.34" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "synstructure" -version = "0.10.1" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "take_mut" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "termcolor" version = "1.0.4" @@ -2698,9 +2775,9 @@ name = "termion" version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "numtoa 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.54 (registry+https://github.com/rust-lang/crates.io-index)", "redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2717,9 +2794,9 @@ name = "time" version = "0.1.42" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.54 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2749,31 +2826,32 @@ name = "tk-listen" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tokio" -version = "0.1.16" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-current-thread 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-current-thread 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-fs 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-sync 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-sync 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-threadpool 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-threadpool 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-trace-core 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-udp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-uds 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2784,17 +2862,17 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tokio-current-thread" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2802,19 +2880,19 @@ name = "tokio-dns-unofficial" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tokio-executor" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2822,9 +2900,9 @@ name = "tokio-fs" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-threadpool 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-threadpool 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2833,7 +2911,7 @@ version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2843,25 +2921,38 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-sync 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-sync 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-rustls" +version = "0.10.0-alpha.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rustls 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "webpki 0.19.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tokio-sync" -version = "0.1.3" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "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)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2870,38 +2961,46 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tokio-threadpool" -version = "0.1.12" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crossbeam-deque 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-queue 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tokio-timer" -version = "0.2.10" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-trace-core" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2910,9 +3009,9 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2924,11 +3023,11 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", "mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2937,10 +3036,10 @@ dependencies = [ [[package]] name = "toml" -version = "0.4.10" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2975,7 +3074,7 @@ dependencies = [ [[package]] name = "twox-hash" -version = "1.2.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2993,11 +3092,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "uint" -version = "0.6.1" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "crunchy 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "crunchy 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3020,7 +3119,7 @@ dependencies = [ [[package]] name = "unicode-segmentation" -version = "1.2.1" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -3057,11 +3156,6 @@ name = "utf8-ranges" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "vcpkg" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "version_check" version = "0.1.5" @@ -3074,103 +3168,141 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "wasm-bindgen" -version = "0.2.42" +version = "0.2.45" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "wasm-bindgen-macro 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-macro 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.42" +version = "0.2.45" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bumpalo 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bumpalo 2.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-shared 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-shared 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-futures" -version = "0.3.19" +version = "0.3.22" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "js-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.42" +version = "0.2.45" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-macro-support 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-macro-support 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.42" +version = "0.2.45" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-backend 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-shared 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-backend 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-shared 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.42" +version = "0.2.45" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "wasm-bindgen-webidl" -version = "0.2.42" +version = "0.2.45" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-backend 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", - "weedle 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-backend 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", + "weedle 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "wasm-timer" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "send_wrapper 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", + "web-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasmi" -version = "0.4.3" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "memory_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-wasm 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmi-validation 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "wasmi-validation" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "parity-wasm 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "web-sys" -version = "0.3.19" +version = "0.3.22" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "env_logger 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "js-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", "sourcefile 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-webidl 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-webidl 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "webpki" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", + "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "webpki-roots" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "webpki 0.19.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "weedle" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "nom 4.2.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3183,7 +3315,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "winapi" -version = "0.3.6" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3205,7 +3337,7 @@ name = "winapi-util" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3218,28 +3350,10 @@ name = "wincolor" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", "winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "ws" -version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "httparse 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", - "mio-extras 2.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl 0.10.19 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "ws2_32-sys" version = "0.2.1" @@ -3251,21 +3365,21 @@ dependencies = [ [[package]] name = "x25519-dalek" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "curve25519-dalek 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "curve25519-dalek 1.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "yamux" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "nohash-hasher 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3280,45 +3394,68 @@ name = "zeroize" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "zeroize" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "zeroize_derive 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "zeroize_derive" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", + "synstructure 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + [metadata] +"checksum adler32 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7e522997b529f05601e05166c07ed17789691f562762c7f3b987263d2dedee5c" "checksum aes-ctr 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d2e5b0458ea3beae0d1d8c0f3946564f8e10f90646cf78c06b4351052058d1ee" "checksum aes-soft 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cfd7e7ae3f9a1fb5c03b389fc6bb9a51400d0c13053f0dca698c832bfd893a0d" "checksum aesni 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2f70a6b5f971e473091ab7cfb5ffac6cde81666c4556751d8d5620ead8abf100" -"checksum aho-corasick 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)" = "81ce3d38065e618af2d7b77e10c5ad9a069859b4be3c2250f674af3840d9c8a5" +"checksum aho-corasick 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e6f484ae0c99fec2e858eb6134949117399f222608d84cadb3f58c1f97c2364c" "checksum aio-limited 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7f10b352bc3fc08ae24dc5d2d3ddcac153678533986122dc283d747b12071000" "checksum arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "0d382e583f07208808f6b1249e60848879ba3543f57c32277bf52d69c2f0f0ee" "checksum arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "92c7fb76bc8826a8b33b4ee5bb07a247a81e76764ab4d55e8f73e3a4d8808c71" "checksum asn1_der 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9893d63fc3b1c44231e667da6836a33f27d8b6b3bdc82f83da5dfd579d1b6528" "checksum asn1_der_derive 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9e7f92edafad155aff997fa5b727c6429b91e996b5a5d62a2b0adbae1306b5fe" "checksum atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "9a7d5b8723950951411ee34d271d99dddcc2035a16ab25310ea2c8cfd4369652" -"checksum autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a6d640bee2da49f60a4068a7fae53acde8982514ab7bae8b8cea9e88cbcfd799" -"checksum backtrace 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)" = "cd5a90e2b463010cd0e0ce9a11d4a9d5d58d9f41d4a6ba3dcaf9e68b466e88b4" +"checksum autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "0e49efa51329a5fd37e7c79db4621af617cd4e3e5bc224939808d076077077bf" +"checksum backtrace 0.3.26 (registry+https://github.com/rust-lang/crates.io-index)" = "1a13fc43f04daf08ab4f71e3d27e1fc27fc437d3e95ac0063a796d92fb40f39b" "checksum backtrace-sys 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)" = "797c830ac25ccc92a7f8a7b9862bde440715531514594a6154e3d4a54dd769b6" -"checksum base-x 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "d55aa264e822dbafa12db4d54767aff17c6ba55ea2d8559b3e17392c7d000e5d" "checksum base58 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5024ee8015f02155eee35c711107ddd9a9bf3cb689cf2a9089c97e79b6e1ae83" +"checksum base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b25d992356d2eb0ed82172f5248873db5560c4721f564b13cb5193bda5e668e" "checksum bigint 4.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ebecac13b3c745150d7b6c3ea7572d372f09d627c2077e893bf26c5c7f70d282" "checksum bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "228047a76f468627ca71776ecdebd732a3423081fcf5125585bcd7c49886ce12" "checksum bitmask 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5da9b3d9f6f585199287a473f4f8dfab6566cf827d15c00c219f53c645687ead" "checksum blake2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "91721a6330935673395a0607df4d49a9cb90ae12d259f1b3e0a3f6e1d486872e" "checksum blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "5d6d530bdd2d52966a6d03b7a964add7ae1a288d25214066fd4b600f0f796400" "checksum block-buffer 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1339a1042f5d9f295737ad4d9a6ab6bf81c84a933dba110b9200cd6d1448b814" -"checksum block-buffer 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "49665c62e0e700857531fa5d3763e91b539ff1abeebd56808d378b495870d60d" +"checksum block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" "checksum block-cipher-trait 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1c924d49bd09e7c06003acda26cd9742e796e34282ec6c1189404dee0c1f4774" -"checksum block-padding 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d75255892aeb580d3c566f213a2b6fdc1c66667839f45719ee1d30ebf2aea591" +"checksum block-padding 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "6d4dc3af3ee2e12f3e5d224e5e1e3d73668abbeb69e566d361f7d5563a4fdf09" "checksum bs58 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0de79cfb98e7aa9988188784d8664b4b5dad6eaaa0863b91d9a4ed871d4f7a42" -"checksum bumpalo 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4639720be048090544634e0402490838995ccdc9d2fe648f528f30d3c33ae71f" +"checksum build_const 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "39092a32794787acd8525ee150305ff051b0aa6cc2abaf193924f5ab05425f39" +"checksum bumpalo 2.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "84dca3afd8e01b9526818b7963e5b4916063b3cdf9f10cf6b73ef0bd0ec37aa5" "checksum byte-tools 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "560c32574a12a89ecd91f5e742165893f86e3ab98d21f8ea548658eb9eef5f40" "checksum byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" "checksum byteorder 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "0fc10e8cc6b2580fda3f36eb6dc5316657f812a3df879a44a66fc9f0fdbc4855" "checksum byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a019b10a2a7cdeb292db131fc8113e57ea2a908f6e7894b0c3c671893b65dbeb" "checksum bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)" = "206fdffcfa2df7cbe15601ef46c813fce0965eb3286db6b56c583b814b51c81c" "checksum c_linked_list 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4964518bd3b4a8190e832886cdc0da9794f12e8e6c1613a9e90ff331c4c8724b" -"checksum cc 1.0.30 (registry+https://github.com/rust-lang/crates.io-index)" = "d01c69d08ff207f231f07196e30f84c70f1c815b04f980f8b7b01ff01f05eb92" -"checksum cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "11d43355396e872eefb45ce6342e4374ed7bc2b3a502d1b28e36d6e23c05d1f4" +"checksum cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)" = "39f75544d7bbaf57560d2168f28fd649ff9c76153874db88bdbdfd839b1a7e7d" +"checksum cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "b486ce3ccf7ffd79fdeb678eac06a9e6c09fc88d33836340becb8fffe87c5e33" "checksum chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "45912881121cb26fad7c38c17ba7daa18764771836b34fab7d3fbd93ed633878" "checksum clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "97276801e127ffb46b66ce23f35cc96bd454fa311294bced4bbace7baa8b1d17" "checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" "checksum constant_time_eq 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8ff012e225ce166d4422e0e78419d901719760f62ae2b7969ca6b564d1b54a9e" +"checksum crc 1.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d663548de7f5cca343f1e0a48d14dcfb0e9eb4e079ec58883b7251539fa10aeb" +"checksum crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ba125de2af0df55319f41944744ad91c71113bf74a4646efff39afe1f6842db1" "checksum crossbeam 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ad4c7ea749d9fb09e23c5cb17e3b70650860553a0e2744e38446b1803bf7db94" "checksum crossbeam-channel 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "0f0ed1a4de2235cabda8558ff5840bffb97fcb64c97827f354a451307df5f72b" "checksum crossbeam-deque 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f739f8c5363aca78cfb059edf753d8f0d36908c348f3d8d1503f03d8b75d9cf3" @@ -3330,36 +3467,33 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum crossbeam-utils 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2760899e32a1d58d5abb31129f8fae5de75220bc2176e77ff7c627ae45c918d9" "checksum crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "f8306fcef4a7b563b76b7dd949ca48f52bc1141aa067d2ea09565f3e2652aa5c" "checksum crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "a2f4a431c5c9f662e1200b7c7f02c34e91361150e382089a8f2dec3ba680cbda" -"checksum crunchy 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c240f247c278fa08a6d4820a6a222bfc6e0d999e51ba67be94f44c905b2161f2" +"checksum crunchy 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" "checksum crypto-mac 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "779015233ac67d65098614aec748ac1c756ab6677fa2e14cf8b37c08dfed1198" "checksum crypto-mac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4434400df11d95d556bac068ddfedd482915eb18fe8bea89bc80b6e4b1c179e5" "checksum ctr 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "022cd691704491df67d25d006fe8eca083098253c4d43516c2206479c58c6736" "checksum cuckoofilter 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8dd43f7cfaffe0a386636a10baea2ee05cc50df3b77bea4a456c9572a939bf1f" -"checksum curve25519-dalek 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e1f8a6fc0376eb52dc18af94915cc04dfdf8353746c0e8c550ae683a0815e5c1" +"checksum curve25519-dalek 1.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "750226d75fc2f5a8daec6e7477624e258674023eb73d8d647f63b943ca182a4a" "checksum data-encoding 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f4f47ca1860a761136924ddd2422ba77b2ea54fe8cc75b9040804a0d9d32ad97" -"checksum derive_more 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fbe9f11be34f800b3ecaaed0ec9ec2e015d1d0ba0c8644c1310f73d6e8994615" +"checksum derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6d944ac6003ed268757ef1ee686753b57efc5fcf0ebe7b64c9fc81e7e32ff839" "checksum digest 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e5b29bf156f3f4b3c4f610a25ff69370616ae6e0657d416de22645483e72af0a" "checksum digest 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "05f47366984d3ad862010e22c7ce81a7dbcaebbdfb37241a620f8b6596ee135c" -"checksum discard 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "212d0f5754cb6769937f4501cc0e67f4f4483c8d2c3e1e922ee9edbe4ab4c7c0" "checksum dns-parser 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c4d33be9473d06f75f58220f71f7a9317aca647dc061dbd3c361b0bef505fbea" "checksum ed25519-dalek 1.0.0-pre.1 (registry+https://github.com/rust-lang/crates.io-index)" = "81956bcf7ef761fb4e1d88de3fa181358a0d26cbcb9755b587a08f9119824b86" -"checksum either 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c67353c641dc847124ea1902d69bd753dee9bb3beff9aa3662ecf86c971d1fac" +"checksum either 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5527cfe0d098f36e3f8839852688e63c8fff1c90b2b405aef730615f9a7bcf7b" "checksum elastic-array 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)" = "073be79b6538296faf81c631872676600616073817dd9a440c477ad09b408983" "checksum env_logger 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b61fa891024a945da30a9581546e8cfaf5602c7b3f4c137a2805cf388f92075a" "checksum environmental 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5c7464757b80de8930c91c9afe77ddce501826bf9d134a87db2c67d9dc177e2c" "checksum erased-serde 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "3beee4bc16478a1b26f2e80ad819a52d24745e292f521a63c16eea5f74b7eb60" -"checksum error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "07e791d3be96241c77c43846b665ef1384606da2cd2a48730abe606a12906e02" "checksum failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "795bd83d3abeb9220f257e597aa0080a508b27533824adf336529648f6abf7e2" "checksum failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "ea1063915fd7ef4309e222a5a07cf9c319fb9c7836b1f89b85458672dbb127e1" "checksum fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" -"checksum fixed-hash 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a557e80084b05c32b455963ff565a9de6f2866da023d6671705c6aff6f65e01c" +"checksum fixed-hash 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d1a683d1234507e4f3bf2736eeddf0de1dc65996dc0164d57eba0a74bcf29489" +"checksum flate2 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)" = "f87e68aa82b2de08a6e037f1385455759df6e445a8df5e005b4297191dbf18aa" "checksum fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2fad85553e09a6f881f739c29f0b00b0f01357c743266d478b68951ce23285f3" -"checksum foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -"checksum foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" "checksum fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" "checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" "checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" -"checksum futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)" = "49e7653e374fe0d0c12de4250f0bdb60680b8c80eed558c5c7538eec9c89e21b" +"checksum futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)" = "a2037ec1c6c1c4f79557762eab1f7eae1f64f6cb418ace90fae88f0942b60139" "checksum futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "ab90cde24b3319636588d0c35fe03b1333857621051837ed769faefb4c2162e4" "checksum gcc 0.3.55 (registry+https://github.com/rust-lang/crates.io-index)" = "8f5f3913fa0bfe7ee1fd8248b6b9f42a5af4b9d65ec2dd2c3c26132b950ecfc2" "checksum generic-array 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3c0f28c2f5bfb5960175af447a2da7c18900693738343dc896ffbcabd9839592" @@ -3367,60 +3501,68 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum get_if_addrs 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "abddb55a898d32925f3148bd281174a68eeb68bbfd9a5938a57b18f506ee4ef7" "checksum get_if_addrs-sys 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0d04f9fb746cf36b191c00f3ede8bde9c8e64f9f4b05ae2694a9ccf5e3f5ab48" "checksum hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ba7fb417e5c470acdd61068c79767d0e65962e70836cf6c9dfd2409f06345ce0" -"checksum hash256-std-hasher 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1224388a21c88a80ae7087a2a245ca6d80acc97a9186b75789fb3eeefd0609af" +"checksum hash256-std-hasher 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f8b2027c19ec91eb304999abae7307d225cf93be42af53b0039f76e98ed5af86" "checksum hashbrown 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3bae29b6653b3412c2e71e9d486db9f9df5d701941d86683005efb9f2d28e3da" "checksum hashmap_core 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "8e04cb7a5051270ef3fa79f8c7604d581ecfa73d520e74f554e45541c4b5881a" "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" "checksum hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "805026a5d0141ffc30abb3be3173848ad46a1b1664fe632428479619a3644d77" -"checksum hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "27455ce8b4a6666c87220e4b59c9a83995476bdadc10197905e61dbe906e36fa" -"checksum hex-literal-impl 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1d340b6514f232f6db1bd16db65302a5278a04fef9ce867cb932e7e5fa21130a" +"checksum hex-literal 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "ddc2928beef125e519d69ae1baa8c37ea2e0d3848545217f6db0179c5eb1d639" +"checksum hex-literal-impl 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "520870c3213943eb8d7803e80180d12a6c7ceb4ae74602544529d1643dc4ddda" "checksum hmac 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7a13f4163aa0c5ca1be584aace0e2212b2e41be5478218d4f657f5f778b2ae2a" "checksum hmac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f127a908633569f208325f86f71255d3363c79721d7f9fe31cd5569908819771" "checksum hmac-drbg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4fe727d41d2eec0a6574d887914347e5ff96a3b87177817e2a9820c5c87fecc2" +"checksum http 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)" = "eed324f0f0daf6ec10c474f150505af2c143f251722bf9dbd1261bd1f2ee2c1a" "checksum httparse 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e8734b0cfd3bc3e101ec59100e101c2eecd19282202e87808b3037b442777a83" "checksum humantime 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3ca7e5f2e110db35f93b837c81797f3714500b81d517bf20c431b16d3ca4f114" "checksum idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e" "checksum impl-codec 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d2050d823639fbeae26b2b5ba09aca8907793117324858070ade0673c49f793b" "checksum impl-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5158079de9d4158e0ce1de3ae0bd7be03904efc40b3d7dd8b8c301cbf6b52b56" +"checksum impl-serde 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7d26be4b97d738552ea423f76c4f681012ff06c3fa36fa968656b3679f60b4a1" "checksum integer-sqrt 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ea155abb3ba6f382a75f1418988c05fe82959ed9ce727de427f9cfd425b0c903" "checksum iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dbe6e417e7d0975db6512b90796e8ce223145ac4e33c377e4a42882a0e88bb08" -"checksum itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1306f3464951f30e30d12373d31c79fbd52d236e5e896fd92f96ec7babbbe60b" -"checksum js-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)" = "3c994fd445b81741d77f6bcd227d6ed645b95b35a2ecfd2050767450ff1c0b6d" +"checksum ipnet 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e61c2da0d0f700c77d2d313dbf4f93e41d235fa12c6681fee06621036df4c2af" +"checksum itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "501266b7edd0174f8530248f87f99c88fbe60ca4ef3dd486835b8d8d53136f7f" +"checksum js-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "9987e7c13a91d9cf0efe59cca48a3a7a70e2b11695d5a4640f85ae71e28f5e73" "checksum keccak 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" "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 lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bc5729f27f159ddd61f4df6228e827e86643d4d3e7c32183cb30a1c08f604a14" -"checksum lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b294d6fa9ee409a054354afc4352b0b9ef7ca222c69b8812cbea9e7d2bf3783f" -"checksum libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)" = "aab692d7759f5cd8c859e169db98ae5b52c924add2af5fbbca11d12fefb567c1" -"checksum libp2p 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0231edab431064b30b7749484a39735eb36492cef4658c372c9059e58c3003aa" -"checksum libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d1a3bad2ed26297112847678683dd221473a0d44297250b61f004e1b35e72493" -"checksum libp2p-core-derive 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3f765f103b680cbed910b02bfdbdcfce5b1142899c93e51acb960bf59b6f81b1" -"checksum libp2p-dns 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4b129d20cc8cbb6ce5da8361045649c024659173e246c5dfbf20ae06071c046a" -"checksum libp2p-floodsub 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "70d68816b8435d6788399416eb2f0a6974fb1d15c4be5c30141f87c8e81746df" -"checksum libp2p-identify 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "718ca645a065fd70855ca6042a7df686c24cd21add750c37a82c811fbd1e5c43" -"checksum libp2p-kad 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bbe27c623a6a720efd5d704347838972062f89149a9c3cd149748da60bdcd3e0" -"checksum libp2p-mdns 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c9bc1a5d85f4812cae6367b49a432763fe28997bac7c530dc55b70ec18a78aa7" -"checksum libp2p-mplex 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fe5a858342a1cc89464474f7edc4bae1da649b9c823a3e04d9fb494493601746" -"checksum libp2p-noise 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc6b5185c50a52a12e7bbe2ee7799059e24de4e52ab25edbfd26c8ab8515d317" -"checksum libp2p-ping 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7905c1431ad115bee83405770629a27d6f17153ad02ec9670a7347998ef20e22" -"checksum libp2p-plaintext 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cc17626763ded57da8fed73187c2d9f6ebb89d30838673c430315bf560c7e4db" -"checksum libp2p-ratelimit 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2409d08b809ab1a74269597f7da2829d117cc11b9ed3343af33fc20831619726" -"checksum libp2p-secio 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "258cdc6742945c8f6402997bbbf36733588e2db18e5a0014da6d46e3ccfb92cf" -"checksum libp2p-tcp 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1b5691e2ba2720d42bd1e93d6b90239fa9235c1956ef6a5f1dd499a7ae2767be" -"checksum libp2p-uds 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c9ab0b9ca050105fd94229c48911c0c84aef4d6b86a53d1b6df81d938354e47e" -"checksum libp2p-yamux 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5e6ff51a5b2056bacee1c9f2ed8455cdf3c5c619261ddb4efc783119130aaf52" +"checksum libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)" = "42914d39aad277d9e176efbdad68acb1d5443ab65afe0e0e4f0d49352a950880" +"checksum libp2p 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6abde4e6fc777dc06ae2a15202ddedb1a38d7c71ed16bc10fa704b03f73aec37" +"checksum libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b4ceb4791289534d4c1ad8e4bd3c6f06d3670efa55ce71482951a287df93ddd1" +"checksum libp2p-core-derive 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "851a59dcaab66c96777ae0cace96de88a700243c3b8360ab51c7e093f3727066" +"checksum libp2p-deflate 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "902b44e92e1f8b7e697b3a186d15c841e0e38037f14286513207a5407650a635" +"checksum libp2p-dns 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "71a6630a84552b39e5f752e1f6a951d31f3211079465d2e7af73491b6f48fc3f" +"checksum libp2p-floodsub 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9fced4da0c31e0dc8a759472c65fab41db40c01de2d93bc45e1431c13f0564f0" +"checksum libp2p-identify 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1ba5e882d72c71cdf77f45ab68dd715451d3b78a23085f8d385c7a31ec1b4272" +"checksum libp2p-kad 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d71966dbbb4cedcfcdb1d4c87d5dbb6f3f07b465d1ca74f2624256669997d1f2" +"checksum libp2p-mdns 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cdbdaea6f0049cc09ba5db00308f5b93105a8a33b65ba2e36bd35da707850ea2" +"checksum libp2p-mplex 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b351bfd67e97154e7b60f62402237671486c8a89f83eabdb6838f37d4d5f006" +"checksum libp2p-noise 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "44324032b2f9260d2b862c741d79d250dc02298dbba56354a992528a826ee2d5" +"checksum libp2p-ping 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e1ac43ffd01de4210cf1b969bbb55a008c77f9ec22b74df26a6590bb6bd4c93f" +"checksum libp2p-plaintext 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0506e10770bcbcb59f2a6154ce93c8fd5cb9730b6ceb5aa1463164af1fd0b9c6" +"checksum libp2p-ratelimit 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3886b79a35c0348497bab763517a9a2b4965173f4b4c7438d59f1e4dcf5122ff" +"checksum libp2p-secio 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b811272e5cd86d39bd71fb94687025d9802b13daf0998ebe0d3f2885c636c51a" +"checksum libp2p-tcp 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b2c54cb75f17557de6ce0149aa03e729455e2d240f84d854272bc4b11012a324" +"checksum libp2p-uds 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fbedf4a1e72a5f67523915414e9e12d71d128731873f0f24d8b878398fb47aa4" +"checksum libp2p-wasm-ext 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d0c1f615b56aa2a6f4ec07bf9667be9fff8877b9c5bd5335601af47490eda341" +"checksum libp2p-websocket 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a0d1bfe60577558f48a9fdf9f35c0ee2dc5baa01f685ff847d3b5cf4f12ee135" +"checksum libp2p-yamux 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bf4bfc7ff127cd622502dbe56f10513dd6776b970e33d8ebb6e367f0752324f6" "checksum libsecp256k1 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "688e8d65e495567c2c35ea0001b26b9debf0b4ea11f8cccc954233b75fc3428a" "checksum lock_api 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "62ebf1391f6acad60e5c8b43706dde4582df75c06698ab44511d15016bc2442c" +"checksum lock_api 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ed946d4529956a20f2d63ebe1b69996d5a2137c91913fe3ebbeff957f5bca7ff" "checksum log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c84ec4b527950aa83a329754b01dbe3f58361d1c5efacd1f6d68c494d08a17c6" "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.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7623b01a4f1b7acb7cf8e3f678f05e15e6ae26cb0b738dfeb5cc186fd6b82ef4" "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" -"checksum mio-extras 2.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "46e73a04c2fa6250b8d802134d56d554a9ec2922bf977777c805ea5def61ce40" +"checksum merlin 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8c39467de91b004f5b9c06fac5bbc8e7d28309a205ee66905166b70804a71fea" +"checksum miniz-sys 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "1e9e3ae51cea1576ceba0dde3d484d30e6e5b86dee0b2d412fe3a16a15c98202" +"checksum miniz_oxide 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c468f2369f07d651a5d0bb2c9079f8488a66d5466efe42d0c5c6466edcb7f71e" +"checksum miniz_oxide_c_api 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b7fe927a42e3807ef71defb191dc87d4e24479b221e67015fe38ae2b7b447bab" +"checksum mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)" = "83f51996a3ed004ef184e16818edc51fadffe8e7ca68be67f9dee67d84d0ff23" "checksum mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)" = "966257a94e196b11bb43aca423754d87429960a768de9414f3691d6957abf125" "checksum miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919" "checksum multistream-select 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f989d40aab0ed0d83c1cdb4856b5790e980b96548d1a921f280e985eb049f38d" @@ -3428,40 +3570,40 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum nodrop 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "2f9667ddcc6cc8a43afc9b7917599d7216aa09c463919ea32c59ed6cac8bc945" "checksum nohash-hasher 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0d138afcce92d219ccb6eb53d9b1e8a96ac0d633cfd3c53cd9856d96d1741bb8" "checksum nom 4.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2ad2a91a8e869eeb30b9cb3119ae87773a8f4ae617f41b1eb9c154b2905f7bd6" -"checksum num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)" = "e83d528d2677f0518c570baf2b7abdcf0cd2d248860b68507bdcb3e91d4c0cea" -"checksum num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0b3a5d7cc97d6d30d8b9bc8fa19bf45349ffe46241e8816f50f62f6d6aaabee1" +"checksum num-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)" = "b85e541ef8255f6cf42bbfe4ef361305c6c135d10919ecc26126c4e5ae94bc09" +"checksum num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "6ba9a427cfca2be13aa6f6403b0b7e7368fe982bfa16fccc450ce74c46cd9b32" "checksum num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1a23f0ed30a54abaa0c7e83b1d2d87ada7c3c23078d1d87815af3e3b6385fbba" "checksum numtoa 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b8f8bdf33df195859076e54ab11ee78a1b208382d3a26ec40d142ffc1ecc49ef" "checksum once_cell 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "532c29a261168a45ce28948f9537ddd7a5dd272cc513b3017b1e82a88f962c37" "checksum opaque-debug 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "93f5bb2e8e8dec81642920ccff6b61f1eb94fa3020c5a325c9851ff604152409" -"checksum openssl 0.10.19 (registry+https://github.com/rust-lang/crates.io-index)" = "84321fb9004c3bce5611188a644d6171f895fa2889d155927d528782edb21c5d" -"checksum openssl-sys 0.9.42 (registry+https://github.com/rust-lang/crates.io-index)" = "cb534d752bf98cf363b473950659ac2546517f9c6be9723771614ab3f03bbc9e" "checksum owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cdf84f41639e037b484f93433aa3897863b561ed65c6e59c7073d7c561710f37" "checksum owning_ref 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "49a4b8ea2179e6a2e27411d3bca09ca6dd630821cf6894c6c7c8467a8ee7ef13" "checksum parity-bytes 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)" = "" "checksum parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dcb43c05fb71c03b4ea7327bf15694da1e0f23f19d5b1e95bab6c6d74097e336" "checksum parity-codec-derive 3.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "00a486fd383382ddcb2de928364b1f82571c1e48274fc43b7667a4738ee4056c" -"checksum parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "18a130a727008cfcd1068a28439fe939897ccad28664422aeca65b384d6de6d0" -"checksum parity-multihash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3e8eab0287ccde7821e337a124dc5a4f1d6e4c25d10cc91e3f9361615dd95076" +"checksum parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "045b3c7af871285146300da35b1932bb6e4639b66c7c98e85d06a32cbc4e8fa7" +"checksum parity-multihash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05d6a68e07ab34a9e87bd8dd4936f6bb5be21e4f6dbcdbaf04d8e854eba0af01" +"checksum parity-send-wrapper 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aa9777aa91b8ad9dd5aaa04a9b6bcb02c7f1deb952fca5a66034d5e63afc5c6f" "checksum parity-wasm 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)" = "511379a8194230c2395d2f5fa627a5a7e108a9f976656ce723ae68fca4097bfc" "checksum parking_lot 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d4d05f1349491390b1730afba60bb20d55761bef489a954546b58b4b34e1e2ac" "checksum parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f0802bff09003b291ba756dc7e79313e51cc31667e94afbe847def490424cde5" "checksum parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ab41b4aed082705d1056416ae4468b6ea99d52599ecf3169b00088d43113e337" +"checksum parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fa7767817701cce701d5585b9c4db3cdd02086398322c1d7e8bf5094a96a2ce7" "checksum parking_lot_core 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "4db1a8ccf734a7bce794cc19b3df06ed87ab2f3907036b693c68f56b4d4537fa" "checksum parking_lot_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ad7f7e6ebdc79edff6fdcb87a55b620174f7a989e3eb31b65231f4af57f00b8c" "checksum parking_lot_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "94c8c7923936b28d546dfd14d4472eaf34c99b14e1c973a32b3e6d4eb04298c9" -"checksum paste 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f50392d1265092fbee9273414cc40eb6d47d307bd66222c477bb8450c8504f9d" -"checksum paste-impl 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "a3cd512fe3a55e8933b2dcad913e365639db86d512e4004c3084b86864d9467a" +"checksum parking_lot_core 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cb88cb1cb3790baa6776844f968fea3be44956cf184fa1be5a03341f5491278c" +"checksum paste 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "1f4a4a1c555c6505821f9d58b8779d0f630a6b7e4e1be24ba718610acf01fa79" +"checksum paste-impl 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "26e796e623b8b257215f27e6c80a5478856cae305f5b59810ff9acdaa34570e6" "checksum pbkdf2 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "006c038a43a45995a9670da19e67600114740e8511d4333bf97a56e66a7542d9" "checksum percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" -"checksum pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)" = "676e8eb2b1b4c9043511a9b7bea0915320d7e502b0a079fb03f9635a5252b18c" -"checksum primitive-types 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "edb92f1ebfc177432c03287b15d48c202e6e2c95993a7af3ba039abb43b1492e" -"checksum proc-macro-crate 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4c6cf4e5b00300d151dfffae39f529dfa5188f42eeb14201229aa420d6aad10c" +"checksum primitive-types 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "6e8612a8dc70f26276fed6131c153ca277cf275ee0a5e2a50cd8a69c697beb8f" +"checksum proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "e10d4b51f154c8a7fb96fd6dad097cb74b863943ec010ac94b9fd1be8861fe1e" "checksum proc-macro-hack 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2c725b36c99df7af7bf9324e9c999b9e37d92c8f8caf106d82e1d7953218d2d8" -"checksum proc-macro-hack 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "3e90aa19cd73dedc2d0e1e8407473f073d735fef0ab521438de6da8ee449ab66" +"checksum proc-macro-hack 0.5.7 (registry+https://github.com/rust-lang/crates.io-index)" = "0c1dd4172a1e1f96f709341418f49b11ea6c2d95d53dca08c0f74cbd332d9cf3" "checksum proc-macro-hack-impl 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2b753ad9ed99dd8efeaa7d2fb8453c8f6bc3e54b97966d35f1bc77ca6865254a" -"checksum proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)" = "4d317f9caece796be1980837fd5cb3dfec5613ebdb04ad0956deea83ce168915" -"checksum protobuf 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "24d5d73d2b88fddb8b8141f2730d950d88772c940ac4f8f3e93230b9a99d92df" +"checksum proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)" = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" +"checksum protobuf 2.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a151c11a92df0059d6ab446fafa3b21a1210aad4bc2293e1c946e8132b10db01" "checksum quick-error 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "5fb6ccf8db7bbcb9c2eae558db5ab4f3da1c2a87e4e597ed394726bc8ea6ca1d" "checksum quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9274b940887ce9addde99c4eee6b5c44cc494b182b97e73dc8ffdcb3397fd3f0" "checksum quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)" = "faf4799c5d274f3868a4aae320a0a182cbd2baee377b378f080e16a23e9d80db" @@ -3474,63 +3616,60 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d0e7a549d590831370895ab7ba4ea0c1b6b011d106b5ff2da6eee112615e6dc0" "checksum rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4" "checksum rand_isaac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08" -"checksum rand_jitter 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7b9ea758282efe12823e0d952ddb269d2e1897227e464919a554f2a03ef1b832" +"checksum rand_jitter 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "1166d5c91dc97b88d1decc3285bb0a99ed84b05cfd0bc2341bdf2d43fc41e39b" "checksum rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7b75f676a1e053fc562eafbb47838d67c84801e38fc1ba459e8f180deabd5071" "checksum rand_pcg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "abf9b09b01790cfe0364f52bf32995ea3c39f4d2dd011eac241d2914146d0b44" "checksum rand_xorshift 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cbf7e9e623549b0e21f6e97cf8ecf247c1a8fd2e8a992ae265314300b2455d5c" "checksum rayon 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "373814f27745b2686b350dd261bfd24576a6fb0e2c5919b3a2b6005f820b0473" "checksum rayon-core 1.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b055d1e92aba6877574d8fe604a63c8b5df60f60e5982bf7ccbb1338ea527356" "checksum rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" -"checksum redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)" = "423e376fffca3dfa06c9e9790a9ccd282fafb3cc6e6397d01dbf64f9bacc6b85" +"checksum redox_syscall 0.1.54 (registry+https://github.com/rust-lang/crates.io-index)" = "12229c14a0f65c4f1cb046a3b52047cdd9da1f4b30f8a39c5063c8bae515e252" "checksum redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76" -"checksum regex 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "53ee8cfdddb2e0291adfb9f13d31d3bbe0a03c9a402c01b1e24188d86c35b24f" -"checksum regex-syntax 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "8c2f35eedad5295fdf00a63d7d4b238135723f92b434ec06774dad15c7ab0861" +"checksum regex 1.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "8f0a0bcab2fd7d1d7c54fa9eae6f43eddeb9ce2e7352f8518a814a4f65d60c58" +"checksum regex-syntax 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)" = "dcfd8681eebe297b81d98498869d4aae052137651ad7b96822f09ceb690d0a96" "checksum ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)" = "426bc186e3e95cac1e4a4be125a4aca7e84c2d616ffc02244eef36e2a60a093c" -"checksum rustc-demangle 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "adacaae16d02b6ec37fdc7acfcddf365978de76d1983d3ee22afc260e1ca9619" +"checksum rustc-demangle 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)" = "a7f4dccf6f4891ebcc0c39f9b6eb1a83b9bf5d747cb439ec6fba4f3b977038af" "checksum rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "403bb3a286107a04825a5f82e1270acc1e14028d3d554d7a1e08914549575ab8" "checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" -"checksum rw-stream-sink 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d548a40fe17c3a77d54b82457b79fcc9b8a288d509ca20fbf5aa1dac386d22d6" -"checksum ryu 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "eb9e9b8cde282a9fe6a42dd4681319bfb63f121b8a8ee9439c6f4107e58a46f7" +"checksum rustls 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f271e3552cd835fa28c541c34a7e8fdd8cdff09d77fe4eb8f6c42e87a11b096e" +"checksum rw-stream-sink 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2f9cbe61c20455d3015b2bb7be39e1872310283b8e5a52f5b242b0ac7581fe78" +"checksum ryu 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "b96a9549dc8d48f2c283938303c4b5a77aa29bfbc5b54b084fb1630408899a8f" "checksum safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7f7bf422d23a88c16d5090d455f182bc99c60af4df6a345c63428acf5129e347" -"checksum schnorrkel 0.0.0 (git+https://github.com/w3f/schnorrkel)" = "" -"checksum schnorrkel 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a700659388785588c75b197cecda0f23c7112a9281ef703e8ffc651061ce014c" +"checksum schnorrkel 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b5eff518f9bed3d803a0d002af0ab96339b0ebbedde3bec98a684986134b7a39" "checksum scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "94258f53601af11e6a49f722422f6e3425c52b06245a5cf9bc09908b174f5e27" -"checksum secp256k1 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4070f3906e65249228094cf97b04a90799fba04468190bbbcfa812309cf86e32" +"checksum scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b42e15e59b18a828bbf5c58ea01debb36b9b096346de35d941dcb89009f24a0d" +"checksum sct 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2f5adf8fbd58e1b1b52699dc8bed2630faecb6d8c7bee77d009d6bbe4af569b9" "checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" "checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" "checksum send_wrapper 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a0eddf2e8f50ced781f288c19f18621fa72a3779e3cb58dbf23b07469b0abeb4" -"checksum serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)" = "92514fb95f900c9b5126e32d020f5c6d40564c27a5ea6d1d7d9f157a96623560" -"checksum serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)" = "bb6eabf4b5914e88e24eea240bb7c9f9a2cbc1bbbe8d961d381975ec3c6b806c" +"checksum serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)" = "a72e9b96fa45ce22a4bc23da3858dfccfd60acd28a25bcd328a98fdd6bea43fd" +"checksum serde_derive 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)" = "101b495b109a3e3ca8c4cbe44cf62391527cdfb6ba15821c5ce80bcd5ea23f9f" "checksum serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)" = "5a23aa71d4a4d43fdbfaac00eff68ba8a06a51759a89ac3304323e800c4dd40d" +"checksum sha-1 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "23962131a91661d643c98940b20fcaffe62d776a823247be80a48fcb8b6fce68" "checksum sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d" "checksum sha2 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7d963c78ce367df26d7ea8b8cc655c651b42e8a1e584e869c1e17dae3ccb116a" "checksum sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b4d8bfd0e469f417657573d8451fb33d16cfe0989359b93baf3a1ffc639543d" -"checksum sha3 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "34a5e54083ce2b934bf059fdf38e7330a154177e029ab6c4e18638f2f624053a" +"checksum sha3 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dd26bc0e7a2e3a7c959bc494caf58b72ee0c71d67704e9520f736ca7e4853ecf" "checksum slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" "checksum slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1e1a2eec401952cd7b12a84ea120e2d57281329940c3f93c2bf04f462539508e" -"checksum slog-async 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e544d16c6b230d84c866662fe55e31aacfca6ae71e6fc49ae9a311cb379bfc2f" "checksum slog-json 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ddc0d2aff1f8f325ef660d9a0eb6e6dcd20b30b3f581a5897f58bf42d061c37a" "checksum slog-scope 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "60c04b4726fa04595ccf2c2dad7bcd15474242c4c5e109a8a376e8a2c9b1539a" "checksum smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)" = "c4488ae950c49d403731982257768f48fada354a5203fe81f9bb6f43ca9002be" "checksum snow 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5a64f02fd208ef15bd2d1a65861df4707e416151e1272d02c8faafad1c138100" +"checksum soketto 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8cf3ae22c0bce5437c7dce6a2b00e492c19da1feb21ad64a7b6fd7058438c3f2" "checksum sourcefile 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4bf77cb82ba8453b42b6ae1d692e4cdc92f9a47beaf89a847c8be83f4e328ad3" "checksum spin 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "44363f6f51401c34e7be73db0db371c04705d35efbe9f7d6082e03a921a32c55" "checksum stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dba1a27d3efae4351c8051072d619e3ade2820635c3958d826bfea39d59b54c8" "checksum static_assertions 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "c19be23126415861cb3a23e501d34a708f7f9b2183c5252d690941c2e69199d5" "checksum static_slice 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "92a7e0c5e3dfb52e8fbe0e63a1b947bbb17b4036408b151353c4491374931362" -"checksum stdweb 0.4.15 (registry+https://github.com/rust-lang/crates.io-index)" = "a3edad410e603184d656e2abded5fd4d3d6e93d5763d21130dbaf99795db74eb" -"checksum stdweb-derive 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0e21ebd9179de08f2300a65454268a17ea3de204627458588c84319c4def3930" -"checksum stdweb-internal-macros 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "1635afd059cbfac7d5b1274f0c44cec110c1e013c48e8bbc22e07e52696cf887" -"checksum stdweb-internal-runtime 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a2a2f4a2eb556337b2d1a302630bbddf989ae383c70393e89b48152b9896cbda" "checksum stream-cipher 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8861bc80f649f5b4c9bd38b696ae9af74499d479dbfb327f0607de6b326a36bc" "checksum strum 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1810e25f576e7ffce1ff5243b37066da5ded0310b3274c20baaeccb1145b2806" "checksum strum_macros 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "572a2f4e53dd4c3483fd79e5cc10ddd773a3acb1169bbfe8762365e107110579" -"checksum substrate-bip39 0.2.0 (git+https://github.com/paritytech/substrate-bip39)" = "" +"checksum substrate-bip39 0.2.1 (git+https://github.com/paritytech/substrate-bip39)" = "" "checksum subtle 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2d67a5a62ba6e01cb2192ff309324cb4875d0c451d55fe2319433abe7a05a8ee" -"checksum subtle 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "702662512f3ddeb74a64ce2fbbf3707ee1b6bb663d28bb054e0779bbc720d926" -"checksum syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)" = "ec52cd796e5f01d0067225a5392e70084acc4c0013fa71d55166d38a8b307836" -"checksum synstructure 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "73687139bf99285483c96ac0add482c3776528beac1d97d444f6e91f203a2015" -"checksum take_mut 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f764005d11ee5f36500a149ace24e00e3da98b0158b3e2d53a7495660d3f4d60" +"checksum subtle 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "01dca13cf6c3b179864ab3292bd794e757618d35a7766b7c46050c614ba00829" +"checksum syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)" = "a1393e4a97a19c01e900df2aec855a29f71cf02c402e2f443b8d2747c25c5dbe" +"checksum synstructure 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)" = "02353edf96d6e4dc81aea2d8490a7e9db177bf8acb0e951c24940bf866cb313f" "checksum termcolor 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4096add70612622289f2fdcdbd5086dc81c1e2675e6ae58d6c4f62a16c6d7f2f" "checksum termion 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dde0593aeb8d47accea5392b39350015b5eccb12c0d98044d856983d89548dea" "checksum thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b" @@ -3538,58 +3677,64 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum tiny-bip39 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c1c5676413eaeb1ea35300a0224416f57abc3bd251657e0fafc12c47ff98c060" "checksum tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e9175261fbdb60781fcd388a4d6cc7e14764a2b629a7ad94abb439aed223a44f" "checksum tk-listen 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5462b0f968c0457efe38fcd2df7e487096b992419e4f5337b06775a614bbda4b" -"checksum tokio 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "fcaabb3cec70485d0df6e9454fe514393ad1c4070dee8915f11041e95630b230" +"checksum tokio 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)" = "94a1f9396aec29d31bb16c24d155cfa144d1af91c40740125db3131bdaf76da8" "checksum tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5c501eceaf96f0e1793cf26beb63da3d11c738c4a943fdf3746d81d64684c39f" -"checksum tokio-current-thread 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "c756b04680eea21902a46fca4e9f410a2332c04995af590e07ff262e2193a9a3" +"checksum tokio-current-thread 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "d16217cad7f1b840c5a97dfb3c43b0c871fef423a6e8d2118c604e843662a443" "checksum tokio-dns-unofficial 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "82c65483db54eb91b4ef3a9389a3364558590faf30ce473141707c0e16fda975" -"checksum tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "30c6dbf2d1ad1de300b393910e8a3aa272b724a400b6531da03eed99e329fbf0" +"checksum tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "83ea44c6c0773cc034771693711c35c677b4b5a4b21b9e7071704c54de7d555e" "checksum tokio-fs 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "3fe6dc22b08d6993916647d108a1a7d15b9cd29c4f4496c62b92c45b5041b7af" "checksum tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "5090db468dad16e1a7a54c8c67280c5e4b544f3d3e018f0b913b400261f85926" "checksum tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "6af16bfac7e112bea8b0442542161bfc41cbfa4466b580bdda7d18cb88b911ce" -"checksum tokio-sync 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1bf2b9dac2a0509b5cfd1df5aa25eafacb616a42a491a13604d6bbeab4486363" +"checksum tokio-rustls 0.10.0-alpha.3 (registry+https://github.com/rust-lang/crates.io-index)" = "316fdbc899efec48b3b492bd0f339e6d81c4ee96a409257572147ec341943452" +"checksum tokio-sync 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "5b2f843ffdf8d6e1f90bddd48da43f99ab071660cd92b7ec560ef3cdfd7a409a" "checksum tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1d14b10654be682ac43efee27401d792507e30fd8d26389e1da3b185de2e4119" -"checksum tokio-threadpool 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "742e511f6ce2298aeb86fc9ea0d8df81c2388c6ebae3dc8a7316e8c9df0df801" -"checksum tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)" = "2910970404ba6fa78c5539126a9ae2045d62e3713041e447f695f41405a120c6" +"checksum tokio-threadpool 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "72558af20be886ea124595ea0f806dd5703b8958e4705429dd58b3d8231f72f2" +"checksum tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "f2106812d500ed25a4f38235b9cae8f78a09edf43203e16e59c3b769a342a60e" +"checksum tokio-trace-core 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "350c9edade9830dc185ae48ba45667a445ab59f6167ef6d0254ec9d2430d9dd3" "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 toml 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b8c96d7873fa7ef8bdeb3a9cda3ac48389b4154f32b9803b4bc26220b677b039" "checksum trie-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1ba73747fd3a64ab531274c04cb588dfa9d30d972d62990831e63fbce2cfec59" "checksum trie-root 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "cfa2e20c4f1418ac2e71ddc418e35e1b56e34022e2146209ffdbf1b2de8b1bd9" "checksum twofish 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712d261e83e727c8e2dbb75dacac67c36e35db36a958ee504f2164fc052434e1" -"checksum twox-hash 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "09871da9f15424236082e0b220fd404a4eb6bebc7205c67653701229234ac64c" +"checksum twox-hash 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6c7bcecad121018bdcd6b709fa2325b004878fcb3d3067934ce90749f0faff9a" "checksum typenum 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "612d636f949607bdf9b123b4a6f6d966dedf3ff669f7f045890d3a4a73948169" "checksum ucd-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "535c204ee4d8434478593480b8f86ab45ec9aae0e83c568ca81abf0fd0e88f86" -"checksum uint 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e7780bb27fd8a22295e0d9d53ae3be253f715a0dccb1808527f478f1c2603708" +"checksum uint 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2143cded94692b156c356508d92888acc824db5bffc0b4089732264c6fcf86d4" "checksum unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" "checksum unicode-normalization 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "141339a08b982d942be2ca06ff8b076563cbe223d1befd5450716790d44e2426" -"checksum unicode-segmentation 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "aa6024fc12ddfd1c6dbc14a80fa2324d4568849869b779f6bd37e5e4c03344d1" +"checksum unicode-segmentation 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1967f4cdfc355b37fd76d2a954fb2ed3871034eb4f26d60537d88795cfc332a9" "checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" "checksum unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2c64cdf40b4a9645534a943668681bcb219faf51874d4b65d2e0abda1b10a2ab" "checksum untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "55cd1f4b4e96b46aeb8d4855db4a7a9bd96eeeb5c6a1ab54593328761642ce2f" "checksum url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a" "checksum utf8-ranges 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "796f7e48bef87609f7ade7e06495a87d5cd06c7866e6a5cbfceffc558a243737" -"checksum vcpkg 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "def296d3eb3b12371b2c7d0e83bfe1403e4db2d7a0bba324a12b21c4ee13143d" "checksum version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd" "checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" -"checksum wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "ffde3534e5fa6fd936e3260cd62cd644b8656320e369388f9303c955895e35d4" -"checksum wasm-bindgen-backend 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "40c0543374a7ae881cdc5d32d19de28d1d1929e92263ffa7e31712cc2d53f9f1" -"checksum wasm-bindgen-futures 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)" = "0ad171fc1f6e43f97d155d27f4ee5657bd8aa5cce7c497ef3a0a0c5b44618b2d" -"checksum wasm-bindgen-macro 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "f914c94c2c5f4c9364510ca2429e59c92157ec89429243bcc245e983db990a71" -"checksum wasm-bindgen-macro-support 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "9168c413491e4233db7b6884f09a43beb00c14d11d947ffd165242daa48a2385" -"checksum wasm-bindgen-shared 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "326c32126e1a157b6ced7400061a84ac5b11182b2cda6edad7314eb3ae9ac9fe" -"checksum wasm-bindgen-webidl 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "613dbf4d7d3bf10aeb212b35de14a8ef07222c26526d4f931061a83fc9e2a851" -"checksum wasmi 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "21ef487a11df1ed468cf613c78798c26282da5c30e9d49f824872d4c77b47d1d" -"checksum web-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)" = "24129e4be2281109b3e15a328d3d7f233ee232a5405f75ba1e9bb59a25ebc4d4" -"checksum weedle 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "26a4c67f132386d965390b8a734d5d10adbcd30eb5cc74bd9229af8b83f10044" +"checksum wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)" = "b7ccc7b93cfd13e26700a9e2e41e6305f1951b87e166599069f77d10358100e6" +"checksum wasm-bindgen-backend 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)" = "1953f91b1608eb1522513623c7739f047bb0fed4128ce51a93f08e12cc314645" +"checksum wasm-bindgen-futures 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "fa1af11c73eca3dc8c51c76ea475a4416e912da6402064a49fc6c0214701866d" +"checksum wasm-bindgen-macro 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)" = "0f69da5696545d7ca6607a2e4b1a0edf5a6b36b2c49dbb0f1df6ad1d92884047" +"checksum wasm-bindgen-macro-support 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)" = "2d4246f3bc73223bbb846f4f2430a60725826a96c9389adf715ed1d5af46dec6" +"checksum wasm-bindgen-shared 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)" = "c08381e07e7a79e5e229ad7c60d15833d19033542cc5dd91d085df59d235f4a6" +"checksum wasm-bindgen-webidl 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)" = "1f42ff7adb8102bf5ad8adbc45b1635c520c8175f9fdf6eb2c54479d485d435a" +"checksum wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ad9ac33c834103916e373d648adf65f58c83fb3d8a0f3e6b9a64bca7253a4dca" +"checksum wasmi 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "aebbaef470840d157a5c47c8c49f024da7b1b80e90ff729ca982b2b80447e78b" +"checksum wasmi-validation 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ab380192444b3e8522ae79c0a1976e42a82920916ccdfbce3def89f456ea33f3" +"checksum web-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "540b8259eb242ff3a566fa0140bda03a4ece4e5c226e1284b5c95dddcd4341f6" +"checksum webpki 0.19.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4f7e1cd7900a3a6b65a3e8780c51a3e6b59c0e2c55c6dc69578c288d69f7d082" +"checksum webpki-roots 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c10fa4212003ba19a564f25cd8ab572c6791f99a03cc219c13ed35ccab00de0e" +"checksum weedle 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bcc44aa200daee8b1f3a004beaf16554369746f1b4486f0cf93b0caf8a3c2d1e" "checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" -"checksum winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "92c1eb33641e276cfa214a0522acad57be5c56b10cb348b3c5117db75f3ac4b0" +"checksum winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "f10e386af2b13e47c89e7236a7a14a086791a2b88ebad6df9bf42040195cf770" "checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" "checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" "checksum winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7168bab6e1daee33b4557efd0e95d5ca70a03706d39fa5f3fe7a236f584b03c9" "checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" "checksum wincolor 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "561ed901ae465d6185fa7864d63fbd5720d0ef718366c9a4dc83cf6170d7e9ba" -"checksum ws 0.7.9 (registry+https://github.com/rust-lang/crates.io-index)" = "329d3e6dd450a9c5c73024e1047f0be7e24121a68484eb0b5368977bee3cf8c3" "checksum ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" -"checksum x25519-dalek 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4aca1ba6bec2719576bd20dfe5b24d9359552e616d10bff257e50cd85f745d17" -"checksum yamux 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ae9073f5dbc901abb0b2ec4f866e726fed2f54953bdf81f8a5fde7762b7cc3b3" +"checksum x25519-dalek 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7ee1585dc1484373cbc1cee7aafda26634665cf449436fd6e24bfd1fad230538" +"checksum yamux 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "01bd67889938c48f0049fc60a77341039e6c3eaf16cb7693e6ead7c0ba701295" "checksum zeroize 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8ddfeb6eee2fb3b262ef6e0898a52b7563bb8e0d5955a313b3cf2f808246ea14" +"checksum zeroize 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b60a6c572b91d8ecb0a460950d84fe5b40699edd07d65f73789b31237afc8f66" +"checksum zeroize_derive 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9dac4b660d969bff9c3fe1847a891cacaa8b21dd5f2aae6e0a3e0975aea96431" diff --git a/core/test-runtime/wasm/build.sh b/core/test-runtime/wasm/build.sh index 635532babf3e8329e31ab4dbae91047809bb29e6..059e475c71e78c7c23f2acb6ffcfa7a8e31f95b6 100755 --- a/core/test-runtime/wasm/build.sh +++ b/core/test-runtime/wasm/build.sh @@ -6,7 +6,7 @@ if cargo --version | grep -q "nightly"; then else CARGO_CMD="cargo +nightly" fi -CARGO_INCREMENTAL=0 RUSTFLAGS="-C link-arg=--export-table" $CARGO_CMD build --target=wasm32-unknown-unknown --release +CARGO_INCREMENTAL=0 RUSTFLAGS="-C link-arg=--export-table" $CARGO_CMD build --target=wasm32-unknown-unknown --release "$@" for i in substrate_test_runtime do wasm-gc "target/wasm32-unknown-unknown/release/$i.wasm" "target/wasm32-unknown-unknown/release/$i.compact.wasm" diff --git a/core/transaction-pool/Cargo.toml b/core/transaction-pool/Cargo.toml index c3f9dce5fe28bfc71886908a0f60c5d8f9e472f8..2bcad4d4d6c2e624b0b887e4c3d34ff8cd6199bf 100644 --- a/core/transaction-pool/Cargo.toml +++ b/core/transaction-pool/Cargo.toml @@ -5,11 +5,11 @@ authors = ["Parity Technologies "] edition = "2018" [dependencies] -error-chain = "0.12" +derive_more = "0.14.0" futures = "0.1" log = "0.4" parity-codec = "3.3" -parking_lot = "0.7.1" +parking_lot = "0.8.0" sr-primitives = { path = "../sr-primitives" } client = { package = "substrate-client", path = "../client" } substrate-primitives = { path = "../primitives" } @@ -17,4 +17,4 @@ txpool = { package = "substrate-transaction-graph", path = "./graph" } [dev-dependencies] keyring = { package = "substrate-keyring", path = "../../core/keyring" } -test_client = { package = "substrate-test-client", path = "../../core/test-client" } +test-client = { package = "substrate-test-runtime-client", path = "../../core/test-runtime/client" } diff --git a/core/transaction-pool/graph/Cargo.toml b/core/transaction-pool/graph/Cargo.toml index 29accf0eb819d9543ca0f851e80eb046b40390e8..3f918efa4a2ea7c61b5717123f7fdd37e4a85a8e 100644 --- a/core/transaction-pool/graph/Cargo.toml +++ b/core/transaction-pool/graph/Cargo.toml @@ -5,10 +5,10 @@ authors = ["Parity Technologies "] edition = "2018" [dependencies] -error-chain = "0.12" +derive_more = "0.14.0" futures = "0.1" log = "0.4" -parking_lot = "0.7.1" +parking_lot = "0.8.0" serde = { version = "1.0", features = ["derive"] } substrate-primitives = { path = "../../primitives" } sr-primitives = { path = "../../sr-primitives" } diff --git a/core/transaction-pool/graph/src/base_pool.rs b/core/transaction-pool/graph/src/base_pool.rs index 2b4b96839d7bf49acdb7d2fbff0828f179f12888..b3a2cf0e54702475a514da18705c6b76971dd3cb 100644 --- a/core/transaction-pool/graph/src/base_pool.rs +++ b/core/transaction-pool/graph/src/base_pool.rs @@ -25,7 +25,6 @@ use std::{ sync::Arc, }; -use error_chain::bail; use log::{trace, debug, warn}; use serde::Serialize; use substrate_primitives::hexdisplay::HexDisplay; @@ -101,6 +100,15 @@ pub struct Transaction { pub requires: Vec, /// Tags that this transaction provides. pub provides: Vec, + /// Should that transaction be propagated. + pub propagate: bool, +} + +impl Transaction { + /// Returns `true` if the transaction should be propagated to other peers. + pub fn is_propagateable(&self) -> bool { + self.propagate + } } impl fmt::Debug for Transaction where @@ -124,6 +132,7 @@ impl fmt::Debug for Transaction where write!(fmt, "priority: {:?}, ", &self.priority)?; write!(fmt, "valid_till: {:?}, ", &self.valid_till)?; write!(fmt, "bytes: {:?}, ", &self.bytes)?; + write!(fmt, "propagate: {:?}, ", &self.propagate)?; write!(fmt, "requires: [")?; print_tags(fmt, &self.requires)?; write!(fmt, "], provides: [")?; @@ -184,7 +193,7 @@ impl BasePool, ) -> error::Result> { if self.future.contains(&tx.hash) || self.ready.contains(&tx.hash) { - bail!(error::ErrorKind::AlreadyImported(Box::new(tx.hash.clone()))) + return Err(error::Error::AlreadyImported(Box::new(tx.hash.clone()))) } let tx = WaitingTransaction::new( @@ -259,7 +268,7 @@ impl BasePool) { - description("Transaction is already in the pool"), - display("[{:?}] Already imported", hash), - } - /// The transaction cannot be imported cause it's a replacement and has too low priority. - TooLowPriority(old: Priority, new: Priority) { - description("The priority is too low to replace transactions already in the pool."), - display("Too low priority ({} > {})", old, new) - } - /// Deps cycle detected and we couldn't import transaction. - CycleDetected { - description("Transaction was not imported because of detected cycle."), - display("Cycle Detected"), - } - /// Transaction was dropped immediately after it got inserted. - ImmediatelyDropped { - description("Transaction couldn't enter the pool because of the limit."), - display("Immediately Dropped"), - } - } +/// Transaction pool result. +pub type Result = std::result::Result; + +/// Transaction pool error type. +#[derive(Debug, derive_more::Display, derive_more::From)] +pub enum Error { + /// Transaction is not verifiable yet, but might be in the future. + #[display(fmt="Unkown Transaction Validity. Error code: {}", _0)] + UnknownTransactionValidity(i8), + /// Transaction is invalid. + #[display(fmt="Invalid Transaction. Error Code: {}", _0)] + InvalidTransaction(i8), + /// The transaction is temporarily banned. + #[display(fmt="Temporarily Banned")] + TemporarilyBanned, + /// The transaction is already in the pool. + #[display(fmt="[{:?}] Already imported", _0)] + AlreadyImported(Box), + /// The transaction cannot be imported cause it's a replacement and has too low priority. + #[display(fmt="Too low priority ({} > {})", old, new)] + TooLowPriority { + /// Transaction already in the pool. + old: Priority, + /// Transaction entering the pool. + new: Priority + }, + /// Deps cycle etected and we couldn't import transaction. + #[display(fmt="Cycle Detected")] + CycleDetected, + /// Transaction was dropped immediately after it got inserted. + #[display(fmt="Transaction couldn't enter the pool because of the limit.")] + ImmediatelyDropped, + /// Invalid block id. + InvalidBlockId(String), } +impl std::error::Error for Error {} + /// Transaction pool error conversion. pub trait IntoPoolError: ::std::error::Error + Send + Sized { /// Try to extract original `Error` diff --git a/core/transaction-pool/graph/src/pool.rs b/core/transaction-pool/graph/src/pool.rs index 121e3ddf0049220078bf6cf37ec4f3436a6522f3..4498598aee9cab96b878e4f5984460c806c8e053 100644 --- a/core/transaction-pool/graph/src/pool.rs +++ b/core/transaction-pool/graph/src/pool.rs @@ -27,14 +27,13 @@ use crate::listener::Listener; use crate::rotator::PoolRotator; use crate::watcher::Watcher; use serde::Serialize; -use error_chain::bail; use log::debug; use futures::sync::mpsc; use parking_lot::{Mutex, RwLock}; use sr_primitives::{ generic::BlockId, - traits::{self, As}, + traits::{self, SaturatedConversion}, transaction_validity::{TransactionValidity, TransactionTag as Tag}, }; @@ -119,18 +118,18 @@ impl Pool { T: IntoIterator> { let block_number = self.api.block_id_to_number(at)? - .ok_or_else(|| error::ErrorKind::Msg(format!("Invalid block id: {:?}", at)).into())?; + .ok_or_else(|| error::Error::InvalidBlockId(format!("{:?}", at)).into())?; let results = xts .into_iter() .map(|xt| -> Result<_, B::Error> { let (hash, bytes) = self.api.hash_and_length(&xt); if self.rotator.is_banned(&hash) { - bail!(error::Error::from(error::ErrorKind::TemporarilyBanned)) + return Err(error::Error::TemporarilyBanned.into()) } match self.api.validate_transaction(at, xt.clone())? { - TransactionValidity::Valid { priority, requires, provides, longevity } => { + TransactionValidity::Valid { priority, requires, provides, longevity, propagate } => { Ok(base::Transaction { data: xt, bytes, @@ -138,15 +137,18 @@ impl Pool { priority, requires, provides, - valid_till: block_number.as_().saturating_add(longevity), + propagate, + valid_till: block_number + .saturated_into::() + .saturating_add(longevity), }) }, TransactionValidity::Invalid(e) => { - bail!(error::Error::from(error::ErrorKind::InvalidTransaction(e))) + Err(error::Error::InvalidTransaction(e).into()) }, TransactionValidity::Unknown(e) => { self.listener.write().invalid(&hash); - bail!(error::Error::from(error::ErrorKind::UnknownTransactionValidity(e))) + Err(error::Error::UnknownTransactionValidity(e).into()) }, } }) @@ -166,7 +168,7 @@ impl Pool { let removed = self.enforce_limits(); Ok(results.into_iter().map(|res| match res { - Ok(ref hash) if removed.contains(hash) => Err(error::Error::from(error::ErrorKind::ImmediatelyDropped).into()), + Ok(ref hash) if removed.contains(hash) => Err(error::Error::ImmediatelyDropped.into()), other => other, }).collect()) } @@ -306,10 +308,7 @@ impl Pool { // Collect the hashes of transactions that now became invalid (meaning that they are succesfully pruned). let hashes = results.into_iter().enumerate().filter_map(|(idx, r)| match r.map_err(error::IntoPoolError::into_pool_error) { - Err(Ok(err)) => match err.kind() { - error::ErrorKind::InvalidTransaction(_) => Some(hashes[idx].clone()), - _ => None, - }, + Err(Ok(error::Error::InvalidTransaction(_))) => Some(hashes[idx].clone()), _ => None, }); // Fire `pruned` notifications for collected hashes and make sure to include @@ -317,7 +316,7 @@ impl Pool { let hashes = hashes.chain(known_imported_hashes.into_iter()); { let header_hash = self.api.block_id_to_hash(at)? - .ok_or_else(|| error::ErrorKind::Msg(format!("Invalid block id: {:?}", at)).into())?; + .ok_or_else(|| error::Error::InvalidBlockId(format!("{:?}", at)).into())?; let mut listener = self.listener.write(); for h in hashes { listener.pruned(header_hash, &h); @@ -336,8 +335,8 @@ impl Pool { /// See `prune_tags` if you want this. pub fn clear_stale(&self, at: &BlockId) -> Result<(), B::Error> { let block_number = self.api.block_id_to_number(at)? - .ok_or_else(|| error::ErrorKind::Msg(format!("Invalid block id: {:?}", at)).into())? - .as_(); + .ok_or_else(|| error::Error::InvalidBlockId(format!("{:?}", at)).into())? + .saturated_into::(); let now = time::Instant::now(); let to_remove = { self.ready() @@ -418,8 +417,7 @@ impl Pool { } /// Returns transaction hash - #[cfg(test)] - fn hash_of(&self, xt: &ExtrinsicFor) -> ExHash { + pub fn hash_of(&self, xt: &ExtrinsicFor) -> ExHash { self.api.hash_and_length(xt).0 } } @@ -493,6 +491,7 @@ mod tests { requires: if nonce > block_number { vec![vec![nonce as u8 - 1]] } else { vec![] }, provides: vec![vec![nonce as u8]], longevity: 3, + propagate: true, }) } } @@ -567,7 +566,7 @@ mod tests { assert_eq!(pool.status().future, 0); // then - assert_matches!(res.unwrap_err().kind(), error::ErrorKind::TemporarilyBanned); + assert_matches!(res.unwrap_err(), error::Error::TemporarilyBanned); } #[test] diff --git a/core/transaction-pool/graph/src/ready.rs b/core/transaction-pool/graph/src/ready.rs index befb1b60ccc2deb18e18eee7a4a08b977f87045d..3497c1bc4ba72408535c33d43813fc08031c465c 100644 --- a/core/transaction-pool/graph/src/ready.rs +++ b/core/transaction-pool/graph/src/ready.rs @@ -23,7 +23,6 @@ use std::{ use serde::Serialize; use log::debug; -use error_chain::bail; use parking_lot::RwLock; use sr_primitives::traits::Member; use sr_primitives::transaction_validity::{ @@ -376,7 +375,7 @@ impl ReadyTransactions { // bail - the transaction has too low priority to replace the old ones if old_priority >= tx.priority { - bail!(error::ErrorKind::TooLowPriority(old_priority, tx.priority)) + return Err(error::Error::TooLowPriority { old: old_priority, new: tx.priority }) } replace_hashes.into_iter().cloned().collect::>() @@ -500,6 +499,7 @@ mod tests { valid_till: 2, requires: vec![vec![1], vec![2]], provides: vec![vec![3], vec![4]], + propagate: true, } } @@ -559,6 +559,7 @@ mod tests { valid_till: u64::max_value(), // use the max_value() here for testing. requires: vec![tx1.provides[0].clone()], provides: vec![], + propagate: true, }; // when diff --git a/core/transaction-pool/graph/src/rotator.rs b/core/transaction-pool/graph/src/rotator.rs index 2ca51ef74e880007285ec8b0f279019fb2b5fa3f..41c1b5842ae849a3ff41e47896f4cf41d3d80ca1 100644 --- a/core/transaction-pool/graph/src/rotator.rs +++ b/core/transaction-pool/graph/src/rotator.rs @@ -120,6 +120,7 @@ mod tests { valid_till: 1, requires: vec![], provides: vec![], + propagate: true, }; (hash, tx) @@ -185,6 +186,7 @@ mod tests { valid_till, requires: vec![], provides: vec![], + propagate: true, } } diff --git a/core/transaction-pool/src/error.rs b/core/transaction-pool/src/error.rs index d4cc0acee8d79923bbeefa8314fc36f3e7ab9e30..f3641aa8ecee3bfc31d86977686d709ce4a355e4 100644 --- a/core/transaction-pool/src/error.rs +++ b/core/transaction-pool/src/error.rs @@ -16,29 +16,34 @@ //! Transaction pool error. -// Silence: `use of deprecated item 'std::error::Error::cause': replaced by Error::source, which can support downcasting` -// https://github.com/paritytech/substrate/issues/1547 -#![allow(deprecated)] - use client; use txpool; -use error_chain::{ - error_chain, error_chain_processing, impl_error_chain_processed, impl_extract_backtrace, impl_error_chain_kind -}; -error_chain! { - foreign_links { - Client(client::error::Error) #[doc = "Client error"]; - } - links { - Pool(txpool::error::Error, txpool::error::ErrorKind) #[doc = "Pool error"]; +/// Transaction pool result. +pub type Result = std::result::Result; + +/// Transaction pool error type. +#[derive(Debug, derive_more::Display, derive_more::From)] +pub enum Error { + /// Client error. + Client(client::error::Error), + /// Pool error. + Pool(txpool::error::Error), +} + +impl std::error::Error for Error { + fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { + match self { + Error::Client(ref err) => Some(err), + Error::Pool(ref err) => Some(err), + } } } impl txpool::IntoPoolError for Error { - fn into_pool_error(self) -> ::std::result::Result { + fn into_pool_error(self) -> std::result::Result { match self { - Error(ErrorKind::Pool(e), c) => Ok(txpool::error::Error(e, c)), + Error::Pool(e) => Ok(e), e => Err(e), } } diff --git a/core/transaction-pool/src/tests.rs b/core/transaction-pool/src/tests.rs index cab44f49cc79c4b812c513a2cc197b0a5e00d01d..a1ee4a50df332b9fe9d74fd0f4a1e8f3d637bebf 100644 --- a/core/transaction-pool/src/tests.rs +++ b/core/transaction-pool/src/tests.rs @@ -53,6 +53,7 @@ impl txpool::ChainApi for TestApi { requires, provides, longevity: 64, + propagate: true, }) } diff --git a/core/trie/src/lib.rs b/core/trie/src/lib.rs index 1322038d7847cbec83d36349014ba5e0717282e3..ec6f50d6e32cc5ab6bd5a44d6735af5c52cb3aa5 100644 --- a/core/trie/src/lib.rs +++ b/core/trie/src/lib.rs @@ -43,9 +43,9 @@ pub type TrieError = trie_db::TrieError; pub trait AsHashDB: hash_db::AsHashDB {} impl> AsHashDB for T {} /// As in `hash_db`, but less generic, trait exposed. -pub type HashDB<'a, H> = hash_db::HashDB + 'a; +pub type HashDB<'a, H> = dyn hash_db::HashDB + 'a; /// As in `hash_db`, but less generic, trait exposed. -pub type PlainDB<'a, K> = hash_db::PlainDB + 'a; +pub type PlainDB<'a, K> = dyn 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. @@ -379,7 +379,9 @@ mod tests { let mut empty = TrieDBMut::::new(&mut db, &mut root); empty.commit(); let root1 = empty.root().as_ref().to_vec(); - let root2: Vec = trie_root::, Vec>(std::iter::empty()).as_ref().iter().cloned().collect(); + let root2: Vec = trie_root::, Vec>( + std::iter::empty(), + ).as_ref().iter().cloned().collect(); assert_eq!(root1, root2); } @@ -455,7 +457,10 @@ mod tests { #[test] fn single_long_leaf_is_equivalent() { - let input: Vec<(&[u8], &[u8])> = vec![(&[0xaa][..], &b"ABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABC"[..]), (&[0xba][..], &[0x11][..])]; + let input: Vec<(&[u8], &[u8])> = vec![ + (&[0xaa][..], &b"ABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABC"[..]), + (&[0xba][..], &[0x11][..]), + ]; check_equivalent(&input); check_iteration(&input); } @@ -471,7 +476,7 @@ mod tests { } fn populate_trie<'db>( - db: &'db mut HashDB, + db: &'db mut dyn HashDB, root: &'db mut ::Out, v: &[(Vec, Vec)] ) -> TrieDBMut<'db, Blake2Hasher> { diff --git a/core/trie/src/node_header.rs b/core/trie/src/node_header.rs index 4f7617c0684bb881d970c177d940559d0760d9a9..2c01189f8a155118d3c1779524df729ed5059544 100644 --- a/core/trie/src/node_header.rs +++ b/core/trie/src/node_header.rs @@ -60,12 +60,12 @@ impl Decode for NodeHeader { Some(match input.read_byte()? { EMPTY_TRIE => NodeHeader::Null, // 0 - i @ LEAF_NODE_OFFSET ... LEAF_NODE_SMALL_MAX => // 1 ... (127 - 1) + i @ LEAF_NODE_OFFSET ..= LEAF_NODE_SMALL_MAX => // 1 ... (127 - 1) NodeHeader::Leaf((i - LEAF_NODE_OFFSET) as usize), LEAF_NODE_BIG => // 127 NodeHeader::Leaf(input.read_byte()? as usize + LEAF_NODE_THRESHOLD as usize), - i @ EXTENSION_NODE_OFFSET ... EXTENSION_NODE_SMALL_MAX =>// 128 ... (253 - 1) + i @ EXTENSION_NODE_OFFSET ..= EXTENSION_NODE_SMALL_MAX =>// 128 ... (253 - 1) NodeHeader::Extension((i - EXTENSION_NODE_OFFSET) as usize), EXTENSION_NODE_BIG => // 253 NodeHeader::Extension(input.read_byte()? as usize + EXTENSION_NODE_THRESHOLD as usize), diff --git a/core/trie/src/trie_stream.rs b/core/trie/src/trie_stream.rs index 123ab1ea16de5bd242f88e3715ebe7f192070b34..913cff2c5a94e0664e3e24163e9a39f65538ff72 100644 --- a/core/trie/src/trie_stream.rs +++ b/core/trie/src/trie_stream.rs @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see . -//! `TrieStream` implementation for Substrate's trie format. +//! `TrieStream` implementation for Substrate's trie format. use rstd::iter::once; use hash_db::Hasher; @@ -83,7 +83,7 @@ impl trie_root::TrieStream for TrieStream { fn append_substream(&mut self, other: Self) { let data = other.out(); match data.len() { - 0...31 => { + 0..=31 => { data.encode_to(&mut self.buffer) }, _ => { diff --git a/core/util/fork-tree/src/lib.rs b/core/util/fork-tree/src/lib.rs index cba5a1535b6f2046c37539816c4c0571cd656f82..7a2e2f422a7fa7d67540c31d09bcc4688a45283c 100644 --- a/core/util/fork-tree/src/lib.rs +++ b/core/util/fork-tree/src/lib.rs @@ -37,22 +37,18 @@ pub enum Error { impl fmt::Display for Error { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - use std::error::Error; - write!(f, "{}", self.description()) + let message = match *self { + Error::Duplicate => "Hash already exists in Tree".into(), + Error::UnfinalizedAncestor => "Finalized descendent of Tree node without finalizing its ancestor(s) first".into(), + Error::Revert => "Tried to import or finalize node that is an ancestor of a previously finalized node".into(), + Error::Client(ref err) => format!("Client error: {}", err), + }; + write!(f, "{}", message) } } impl std::error::Error for Error { - fn description(&self) -> &str { - match *self { - Error::Duplicate => "Hash already exists in Tree", - Error::UnfinalizedAncestor => "Finalized descendent of Tree node without finalizing its ancestor(s) first", - Error::Revert => "Tried to import or finalize node that is an ancestor of a previously finalized node", - Error::Client(ref err) => err.description(), - } - } - - fn cause(&self) -> Option<&std::error::Error> { + fn cause(&self) -> Option<&dyn std::error::Error> { None } } diff --git a/node-template/Cargo.toml b/node-template/Cargo.toml index d0427ec80de0140ac2d1f779d03c720696b77556..e78bb2d27e4447142823e27a7c90eda5cea80d44 100644 --- a/node-template/Cargo.toml +++ b/node-template/Cargo.toml @@ -10,13 +10,13 @@ name = "node-template" path = "src/main.rs" [dependencies] -error-chain = "0.12" +derive_more = "0.14.0" futures = "0.1" ctrlc = { version = "3.0", features = ["termination"] } log = "0.4" tokio = "0.1" exit-future = "0.1" -parking_lot = "0.7.1" +parking_lot = "0.8.0" parity-codec = "3.3" trie-root = "0.12.2" sr-io = { path = "../core/sr-io" } diff --git a/node-template/README.md b/node-template/README.md index 4d616be7f0930e8fb02d0f88664e044cd5cb345c..6924fa55762b2b4b0d284d7afd2de771d77c7cc0 100644 --- a/node-template/README.md +++ b/node-template/README.md @@ -40,7 +40,7 @@ Detailed logs may be shown by running the node with the following environment va If you want to see the multi-node consensus algorithm in action locally, then you can create a local testnet with two validator nodes for Alice and Bob, who are the initial authorities of the genesis chain that have been endowed with testnet units. Give each node a name and expose them so they are listed on the Polkadot [telemetry site](https://telemetry.polkadot.io/#/Local%20Testnet). You'll need two terminal windows open. -We'll start Alice's substrate node first on default TCP port 30333 with her chain database stored locally at `/tmp/alice`. The bootnode ID of her node is `QmQZ8TjTqeDj3ciwr93EJ95hxfDsb9pEYDizUAbWpigtQN`, which is generated from the `--node-key` value that we specify below: +We'll start Alice's substrate node first on default TCP port 30333 with her chain database stored locally at `/tmp/alice`. The bootnode ID of her node is `QmRpheLN4JWdAnY7HGJfWFNbfkQCb6tFf4vvA6hgjMZKrR`, which is generated from the `--node-key` value that we specify below: ```bash cargo run -- \ @@ -57,7 +57,7 @@ In the second terminal, we'll start Bob's substrate node on a different TCP port ```bash cargo run -- \ --base-path /tmp/bob \ - --bootnodes /ip4/127.0.0.1/tcp/30333/p2p/QmQZ8TjTqeDj3ciwr93EJ95hxfDsb9pEYDizUAbWpigtQN \ + --bootnodes /ip4/127.0.0.1/tcp/30333/p2p/QmRpheLN4JWdAnY7HGJfWFNbfkQCb6tFf4vvA6hgjMZKrR \ --chain=local \ --bob \ --port 30334 \ diff --git a/node-template/runtime/Cargo.toml b/node-template/runtime/Cargo.toml index bc784071baa9a2e0eb8fc3c11cdaf06567eadfc0..90cc85317adb287a0a50c3c9c5722c7f0630efce 100644 --- a/node-template/runtime/Cargo.toml +++ b/node-template/runtime/Cargo.toml @@ -14,7 +14,6 @@ version = { package = "sr-version", path = "../../core/sr-version", default_feat support = { package = "srml-support", path = "../../srml/support", default_features = false } primitives = { package = "substrate-primitives", path = "../../core/primitives", default_features = false } balances = { package = "srml-balances", path = "../../srml/balances", default_features = false } -consensus = { package = "srml-consensus", path = "../../srml/consensus", default_features = false } aura = { package = "srml-aura", path = "../../srml/aura", default_features = false } executive = { package = "srml-executive", path = "../../srml/executive", default_features = false } indices = { package = "srml-indices", path = "../../srml/indices", default_features = false } @@ -25,7 +24,6 @@ runtime-primitives = { package = "sr-primitives", path = "../../core/sr-primitiv client = { package = "substrate-client", path = "../../core/client", default_features = false } consensus-aura = { package = "substrate-consensus-aura-primitives", path = "../../core/consensus/aura/primitives", default_features = false } offchain-primitives = { package = "substrate-offchain-primitives", path = "../../core/offchain/primitives", default-features = false } -consensus_authorities = { package = "substrate-consensus-authorities", path = "../../core/consensus/authorities", default-features = false } [features] default = ["std"] @@ -49,5 +47,4 @@ std = [ "safe-mix/std", "consensus-aura/std", "offchain-primitives/std", - "consensus_authorities/std", ] diff --git a/node-template/runtime/src/lib.rs b/node-template/runtime/src/lib.rs index 30560989a8ac9bcf60cc4de3c739dd0ba9fb3b1c..9b99e7f08f49594952bec0b8f3f0f8754bc1b574 100644 --- a/node-template/runtime/src/lib.rs +++ b/node-template/runtime/src/lib.rs @@ -26,18 +26,17 @@ use version::NativeVersion; // A few exports that help ease life for downstream crates. #[cfg(any(feature = "std", test))] pub use runtime_primitives::BuildStorage; -pub use consensus::Call as ConsensusCall; pub use timestamp::Call as TimestampCall; pub use balances::Call as BalancesCall; pub use runtime_primitives::{Permill, Perbill}; pub use timestamp::BlockPeriod; pub use support::{StorageValue, construct_runtime}; -/// The type that is used for identifying authorities. -pub type AuthorityId = ::Signer; +/// Alias to the signature scheme used for Aura authority signatures. +pub type AuraSignature = ed25519::Signature; -/// The type used by authorities to prove their ID. -pub type AuthoritySignature = ed25519::Signature; +/// The Ed25519 pub key of an session that belongs to an Aura authority of the chain. +pub type AuraId = ed25519::Public; /// Alias to pubkey that identifies an account on the chain. pub type AccountId = ::Signer; @@ -80,13 +79,13 @@ pub mod opaque { } } /// Opaque block header type. - pub type Header = generic::Header>; + pub type Header = generic::Header; /// Opaque block type. pub type Block = generic::Block; /// Opaque block identifier type. pub type BlockId = generic::BlockId; /// Opaque session key type. - pub type SessionKey = AuthorityId; + pub type SessionKey = AuraId; } /// This runtime version. @@ -94,8 +93,8 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("node-template"), impl_name: create_runtime_str!("node-template"), authoring_version: 3, - spec_version: 3, - impl_version: 0, + spec_version: 4, + impl_version: 4, apis: RUNTIME_API_VERSIONS, }; @@ -121,30 +120,17 @@ impl system::Trait for Runtime { type Hash = Hash; /// The hashing algorithm used. type Hashing = BlakeTwo256; - /// The header digest type. - type Digest = generic::Digest; /// The header type. - type Header = generic::Header; + type Header = generic::Header; /// The ubiquitous event type. type Event = Event; - /// The ubiquitous log type. - type Log = Log; /// The ubiquitous origin type. type Origin = Origin; } impl aura::Trait for Runtime { type HandleReport = (); -} - -impl consensus::Trait for Runtime { - /// The identifier we use to refer to authorities. - type SessionKey = AuthorityId; - // The aura module handles offline-reports internally - // rather than using an explicit report system. - type InherentOfflineReport = (); - /// The ubiquitous log type. - type Log = Log; + type AuthorityId = AuraId; } impl indices::Trait for Runtime { @@ -155,7 +141,7 @@ impl indices::Trait for Runtime { type ResolveHint = indices::SimpleResolveHint; /// Determine whether an account is dead. type IsDeadAccount = Balances; - /// The uniquitous event type. + /// The ubiquitous event type. type Event = Event; } @@ -172,7 +158,7 @@ impl balances::Trait for Runtime { type OnFreeBalanceZero = (); /// What to do if a new account is created. type OnNewAccount = Indices; - /// The uniquitous event type. + /// The ubiquitous event type. type Event = Event; type TransactionPayment = (); @@ -181,7 +167,7 @@ impl balances::Trait for Runtime { } impl sudo::Trait for Runtime { - /// The uniquitous event type. + /// The ubiquitous event type. type Event = Event; type Proposal = Call; } @@ -192,16 +178,15 @@ impl template::Trait for Runtime { } construct_runtime!( - pub enum Runtime with Log(InternalLog: DigestItem) where + pub enum Runtime where Block = Block, NodeBlock = opaque::Block, UncheckedExtrinsic = UncheckedExtrinsic { - System: system::{default, Log(ChangesTrieRoot)}, + System: system::{default, Config}, Timestamp: timestamp::{Module, Call, Storage, Config, Inherent}, - Consensus: consensus::{Module, Call, Storage, Config, Log(AuthoritiesChange), Inherent}, - Aura: aura::{Module}, - Indices: indices, + Aura: aura::{Module, Config, Inherent(Timestamp)}, + Indices: indices::{default, Config}, Balances: balances, Sudo: sudo, // Used for the module template in `./template.rs` @@ -214,7 +199,7 @@ type Context = system::ChainContext; /// The address format for describing accounts. type Address = ::Source; /// Block header type as expected by this runtime. -pub type Header = generic::Header; +pub type Header = generic::Header; /// Block type as expected by this runtime. pub type Block = generic::Block; /// BlockId type as expected by this runtime. @@ -240,10 +225,6 @@ impl_runtime_apis! { fn initialize_block(header: &::Header) { Executive::initialize_block(header) } - - fn authorities() -> Vec { - panic!("Deprecated, please use `AuthoritiesApi`.") - } } impl runtime_api::Metadata for Runtime { @@ -280,10 +261,13 @@ impl_runtime_apis! { } } - impl consensus_aura::AuraApi for Runtime { + impl consensus_aura::AuraApi for Runtime { fn slot_duration() -> u64 { Aura::slot_duration() } + fn authorities() -> Vec { + Aura::authorities() + } } impl offchain_primitives::OffchainWorkerApi for Runtime { @@ -291,10 +275,4 @@ impl_runtime_apis! { Executive::offchain_worker(n) } } - - impl consensus_authorities::AuthoritiesApi for Runtime { - fn authorities() -> Vec { - Consensus::authorities() - } - } } diff --git a/node-template/runtime/src/template.rs b/node-template/runtime/src/template.rs index 636ee1ac09506e2c887ebad48d91bb468a129ad2..c8b75f43f5f5b5f75b34cad4391cdb68ea5307ee 100644 --- a/node-template/runtime/src/template.rs +++ b/node-template/runtime/src/template.rs @@ -75,7 +75,7 @@ mod tests { use runtime_primitives::{ BuildStorage, traits::{BlakeTwo256, IdentityLookup}, - testing::{Digest, DigestItem, Header} + testing::Header, }; impl_outer_origin! { @@ -93,12 +93,10 @@ mod tests { type BlockNumber = u64; type Hash = H256; type Hashing = BlakeTwo256; - type Digest = Digest; type AccountId = u64; type Lookup = IdentityLookup; type Header = Header; type Event = (); - type Log = DigestItem; } impl Trait for Test { type Event = (); diff --git a/node-template/runtime/wasm/Cargo.lock b/node-template/runtime/wasm/Cargo.lock index bd69f55c6244e1feff0b2ccf0ccc1ca6ca15c152..df4773de1e64d936bc27f6f5b3749488bc280add 100644 --- a/node-template/runtime/wasm/Cargo.lock +++ b/node-template/runtime/wasm/Cargo.lock @@ -1,5 +1,10 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +[[package]] +name = "adler32" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "aes-ctr" version = "0.3.0" @@ -33,7 +38,7 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "0.6.10" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -44,12 +49,12 @@ name = "aio-limited" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -79,7 +84,7 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -87,27 +92,26 @@ name = "atty" version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "termion 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "autocfg" -version = "0.1.2" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "backtrace" -version = "0.3.14" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "backtrace-sys 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-demangle 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-demangle 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -115,19 +119,22 @@ name = "backtrace-sys" version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.31 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] -name = "base-x" -version = "0.2.4" +name = "base58" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] -name = "base58" -version = "0.1.0" +name = "base64" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] name = "bigint" @@ -179,10 +186,10 @@ dependencies = [ [[package]] name = "block-buffer" -version = "0.7.0" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "block-padding 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "block-padding 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "generic-array 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -198,7 +205,7 @@ dependencies = [ [[package]] name = "block-padding" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -209,9 +216,14 @@ name = "bs58" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "build_const" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "bumpalo" -version = "2.4.1" +version = "2.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -250,12 +262,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "cc" -version = "1.0.31" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "cfg-if" -version = "0.1.7" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -263,8 +275,8 @@ name = "chrono" version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "num-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -273,7 +285,7 @@ name = "clear_on_drop" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.31 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -289,12 +301,28 @@ name = "constant_time_eq" version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "crc" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "build_const 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "crc32fast" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "crossbeam" version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-channel 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-deque 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-epoch 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -346,7 +374,7 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-utils 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -360,7 +388,7 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -380,7 +408,7 @@ name = "crossbeam-utils" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -388,7 +416,7 @@ name = "crossbeam-utils" version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -399,7 +427,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "crunchy" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -440,14 +468,14 @@ dependencies = [ [[package]] name = "curve25519-dalek" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "digest 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "subtle 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "subtle 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -457,13 +485,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "derive_more" -version = "0.14.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -482,11 +510,6 @@ dependencies = [ "generic-array 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "discard" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "dns-parser" version = "0.8.0" @@ -502,7 +525,7 @@ version = "1.0.0-pre.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "curve25519-dalek 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "curve25519-dalek 1.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -510,7 +533,7 @@ dependencies = [ [[package]] name = "either" -version = "1.5.1" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -529,7 +552,7 @@ dependencies = [ "atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "humantime 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "termcolor 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -543,15 +566,7 @@ name = "erased-serde" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "error-chain" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "backtrace 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -559,7 +574,7 @@ name = "failure" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "backtrace 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", + "backtrace 0.3.26 (registry+https://github.com/rust-lang/crates.io-index)", "failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -568,10 +583,10 @@ name = "failure_derive" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", - "synstructure 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", + "synstructure 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -581,33 +596,33 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "fixed-hash" -version = "0.3.0" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "static_assertions 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] -name = "fnv" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "foreign-types" -version = "0.3.2" +name = "flate2" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "miniz-sys 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "miniz_oxide_c_api 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] -name = "foreign-types-shared" -version = "0.1.1" +name = "fnv" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -631,7 +646,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "futures" -version = "0.1.25" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -639,7 +654,7 @@ name = "futures-cpupool" version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -672,7 +687,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "c_linked_list 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "get_if_addrs-sys 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -682,7 +697,7 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "gcc 0.3.55 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -692,10 +707,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "hash256-std-hasher" -version = "0.12.0" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "crunchy 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "crunchy 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -717,7 +732,7 @@ name = "heapsize" version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -725,7 +740,7 @@ name = "heck" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "unicode-segmentation 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-segmentation 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -735,16 +750,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "hex-literal" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "hex-literal-impl 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal-impl 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro-hack 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "hex-literal-impl" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro-hack 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -779,6 +794,16 @@ dependencies = [ "hmac 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "http" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "httparse" version = "1.3.3" @@ -816,7 +841,15 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "impl-serde" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -829,21 +862,26 @@ name = "iovec" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "ipnet" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "itoa" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "js-sys" -version = "0.3.19" +version = "0.3.22" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -874,53 +912,51 @@ name = "lazy_static" version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "lazycell" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "libc" -version = "0.2.50" +version = "0.2.55" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "libp2p" -version = "0.7.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core-derive 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-dns 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-floodsub 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-identify 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-kad 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-mdns 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-mplex 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-noise 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-ping 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-plaintext 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-ratelimit 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-secio 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-tcp 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-uds 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-yamux 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multihash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core-derive 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-deflate 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-dns 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-floodsub 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-identify 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-kad 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-mdns 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-mplex 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-noise 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-ping 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-plaintext 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-ratelimit 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-secio 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-tcp 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-uds 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-wasm-ext 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-websocket 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-yamux 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multihash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", - "stdweb 0.4.15 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-core" -version = "0.7.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "asn1_der 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -929,64 +965,74 @@ dependencies = [ "ed25519-dalek 1.0.0-pre.1 (registry+https://github.com/rust-lang/crates.io-index)", "failure 0.1.5 (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)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libsecp256k1 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "multistream-select 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multihash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multihash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", - "rw-stream-sink 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "secp256k1 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rw-stream-sink 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "zeroize 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-core-derive" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "libp2p-deflate" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "flate2 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-dns" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-dns-unofficial 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-floodsub" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bs58 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "cuckoofilter 0.3.2 (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)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -996,28 +1042,28 @@ dependencies = [ [[package]] name = "libp2p-identify" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (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)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-kad" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1026,54 +1072,55 @@ dependencies = [ "bs58 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.12 (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)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multihash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multihash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-mdns" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "data-encoding 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "dns-parser 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-udp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-mplex" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (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)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1081,103 +1128,107 @@ dependencies = [ [[package]] name = "libp2p-noise" -version = "0.5.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "curve25519-dalek 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "curve25519-dalek 1.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", "snow 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "x25519-dalek 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "zeroize 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", + "x25519-dalek 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", + "zeroize 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-ping" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-plaintext" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-ratelimit" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "aio-limited 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-secio" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "aes-ctr 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "asn1_der 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "ctr 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "hmac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "js-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-send-wrapper 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", - "rw-stream-sink 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "send_wrapper 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rw-stream-sink 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "twofish 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-futures 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", - "web-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-futures 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", + "web-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-tcp" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "get_if_addrs 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ipnet 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "tk-listen 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1185,26 +1236,57 @@ dependencies = [ [[package]] name = "libp2p-uds" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-uds 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "libp2p-wasm-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-send-wrapper 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-futures 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "libp2p-websocket" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "rw-stream-sink 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "soketto 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-rustls 0.10.0-alpha.3 (registry+https://github.com/rust-lang/crates.io-index)", + "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "webpki-roots 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "libp2p-yamux" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "yamux 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "yamux 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1229,12 +1311,20 @@ dependencies = [ "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "lock_api" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "log" version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1269,7 +1359,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "merlin" -version = "1.0.3" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1278,17 +1368,44 @@ dependencies = [ "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "miniz-sys" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "miniz_oxide" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "adler32 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "miniz_oxide_c_api" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", + "crc 1.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "miniz_oxide 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "mio" -version = "0.6.16" +version = "0.6.19" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1296,25 +1413,14 @@ dependencies = [ "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "mio-extras" -version = "2.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", - "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "mio-uds" version = "0.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1334,7 +1440,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1347,9 +1453,9 @@ name = "net2" version = "0.2.33" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1358,14 +1464,13 @@ version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", "sr-version 2.0.0", "srml-aura 2.0.0", "srml-balances 2.0.0", - "srml-consensus 2.0.0", "srml-executive 2.0.0", "srml-indices 2.0.0", "srml-sudo 2.0.0", @@ -1374,7 +1479,6 @@ dependencies = [ "srml-timestamp 2.0.0", "substrate-client 2.0.0", "substrate-consensus-aura-primitives 2.0.0", - "substrate-consensus-authorities 2.0.0", "substrate-offchain-primitives 2.0.0", "substrate-primitives 2.0.0", ] @@ -1407,23 +1511,27 @@ dependencies = [ [[package]] name = "num-integer" -version = "0.1.39" +version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "num-traits" -version = "0.2.6" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] name = "num_cpus" version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1444,31 +1552,6 @@ name = "opaque-debug" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "openssl" -version = "0.10.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl-sys 0.9.42 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "openssl-sys" -version = "0.9.42" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cc 1.0.31 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", - "pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "vcpkg 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "owning_ref" version = "0.3.3" @@ -1497,7 +1580,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec-derive 3.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1505,15 +1588,15 @@ name = "parity-codec-derive" version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro-crate 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "parity-multiaddr" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1521,24 +1604,31 @@ dependencies = [ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "data-encoding 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multihash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multihash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "parity-multihash" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "blake2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "sha-1 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "sha3 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "parity-send-wrapper" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "parity-wasm" version = "0.31.3" @@ -1574,15 +1664,25 @@ dependencies = [ "parking_lot_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "parking_lot" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "lock_api 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot_core 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "parking_lot_core" version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1590,11 +1690,11 @@ name = "parking_lot_core" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1602,31 +1702,46 @@ name = "parking_lot_core" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "parking_lot_core" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.54 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "paste" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "paste-impl 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro-hack 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", + "paste-impl 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-hack 0.5.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "paste-impl" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro-hack 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-hack 0.5.7 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1644,28 +1759,23 @@ name = "percent-encoding" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "pkg-config" -version = "0.3.14" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "primitive-types" -version = "0.2.1" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "fixed-hash 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "fixed-hash 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "impl-codec 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "impl-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "uint 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "impl-serde 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "uint 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "proc-macro-crate" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "toml 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "toml 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1678,12 +1788,12 @@ dependencies = [ [[package]] name = "proc-macro-hack" -version = "0.5.4" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1693,7 +1803,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "proc-macro2" -version = "0.4.27" +version = "0.4.30" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1701,7 +1811,7 @@ dependencies = [ [[package]] name = "protobuf" -version = "2.4.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -1719,7 +1829,7 @@ name = "quote" version = "0.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1727,7 +1837,7 @@ name = "rand" version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1737,10 +1847,10 @@ version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1750,9 +1860,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1760,17 +1870,17 @@ name = "rand" version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand_isaac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_jitter 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_jitter 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "rand_pcg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "rand_xorshift 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1778,7 +1888,7 @@ name = "rand_chacha" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1813,12 +1923,12 @@ dependencies = [ [[package]] name = "rand_jitter" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1828,10 +1938,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1839,7 +1949,7 @@ name = "rand_pcg" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1857,7 +1967,7 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crossbeam-deque 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "either 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "either 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "rayon-core 1.4.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1868,7 +1978,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crossbeam-deque 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1882,7 +1992,7 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.1.51" +version = "0.1.54" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -1890,24 +2000,24 @@ name = "redox_termios" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.54 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "regex" -version = "1.1.2" +version = "1.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "aho-corasick 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", + "aho-corasick 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "regex-syntax 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "regex-syntax 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", "thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", "utf8-ranges 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "regex-syntax" -version = "0.6.5" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "ucd-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1918,17 +2028,17 @@ name = "ring" version = "0.14.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.31 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "spin 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "rustc-demangle" -version = "0.1.13" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -1944,19 +2054,32 @@ dependencies = [ "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "rustls" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", + "sct 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "webpki 0.19.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "rw-stream-sink" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "ryu" -version = "0.2.7" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -1969,51 +2092,38 @@ dependencies = [ [[package]] name = "schnorrkel" -version = "0.0.0" -source = "git+https://github.com/w3f/schnorrkel#0a0de4294b475ef6abdeebb50067f213ca79b3c7" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "curve25519-dalek 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "curve25519-dalek 1.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "ed25519-dalek 1.0.0-pre.1 (registry+https://github.com/rust-lang/crates.io-index)", "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "merlin 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "merlin 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sha3 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", - "subtle 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "sha3 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", + "subtle 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] -name = "schnorrkel" -version = "0.1.0" +name = "scopeguard" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "curve25519-dalek 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "ed25519-dalek 1.0.0-pre.1 (registry+https://github.com/rust-lang/crates.io-index)", - "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "merlin 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sha3 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", - "subtle 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", -] [[package]] name = "scopeguard" -version = "0.3.3" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] -name = "secp256k1" -version = "0.12.0" +name = "sct" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.31 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", + "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2036,20 +2146,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "serde" -version = "1.0.89" +version = "1.0.91" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "serde_derive" -version = "1.0.89" +version = "1.0.91" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2057,9 +2167,20 @@ name = "serde_json" version = "1.0.39" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", - "ryu 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", + "ryu 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "sha-1" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", + "digest 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "opaque-debug 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2084,7 +2205,7 @@ name = "sha2" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "block-buffer 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "digest 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "opaque-debug 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2092,10 +2213,10 @@ dependencies = [ [[package]] name = "sha3" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "block-buffer 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "digest 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "keccak 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2115,16 +2236,6 @@ dependencies = [ "erased-serde 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "slog-async" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "take_mut 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "slog-json" version = "2.3.0" @@ -2132,7 +2243,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "erased-serde 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", "slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2166,7 +2277,25 @@ dependencies = [ "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", "static_slice 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "subtle 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "subtle 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "soketto" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "http 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", + "httparse 1.3.3 (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)", + "sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2184,10 +2313,10 @@ name = "sr-api-macros" version = "2.0.0" dependencies = [ "blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro-crate 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2212,9 +2341,9 @@ version = "2.0.0" dependencies = [ "integer-sqrt 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)", - "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-std 2.0.0", "substrate-primitives 2.0.0", @@ -2233,7 +2362,7 @@ version = "2.0.0" dependencies = [ "impl-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", ] @@ -2243,7 +2372,7 @@ name = "srml-aura" version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", "srml-session 2.0.0", @@ -2251,7 +2380,9 @@ dependencies = [ "srml-support 2.0.0", "srml-system 2.0.0", "srml-timestamp 2.0.0", + "substrate-consensus-aura-primitives 2.0.0", "substrate-inherents 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] @@ -2260,7 +2391,7 @@ version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", "srml-support 2.0.0", @@ -2268,26 +2399,12 @@ dependencies = [ "substrate-keyring 2.0.0", ] -[[package]] -name = "srml-consensus" -version = "2.0.0" -dependencies = [ - "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 2.0.0", - "sr-std 2.0.0", - "srml-support 2.0.0", - "srml-system 2.0.0", - "substrate-inherents 2.0.0", - "substrate-primitives 2.0.0", -] - [[package]] name = "srml-executive" version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -2301,7 +2418,7 @@ version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -2316,7 +2433,7 @@ name = "srml-metadata" version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-std 2.0.0", "substrate-primitives 2.0.0", ] @@ -2327,10 +2444,9 @@ version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", - "srml-consensus 2.0.0", "srml-support 2.0.0", "srml-system 2.0.0", "srml-timestamp 2.0.0", @@ -2342,11 +2458,10 @@ version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", - "srml-consensus 2.0.0", "srml-session 2.0.0", "srml-support 2.0.0", "srml-system 2.0.0", @@ -2358,7 +2473,8 @@ name = "srml-sudo" version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", "srml-support 2.0.0", @@ -2373,8 +2489,8 @@ dependencies = [ "bitmask 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "once_cell 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "paste 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "paste 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -2387,31 +2503,31 @@ dependencies = [ name = "srml-support-procedural" version = "2.0.0" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", "sr-api-macros 2.0.0", "srml-support-procedural-tools 2.0.0", - "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "srml-support-procedural-tools" version = "2.0.0" dependencies = [ - "proc-macro-crate 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", "srml-support-procedural-tools-derive 2.0.0", - "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "srml-support-procedural-tools-derive" version = "2.0.0" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2420,7 +2536,7 @@ version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -2433,7 +2549,7 @@ name = "srml-timestamp" version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", "srml-support 2.0.0", @@ -2456,50 +2572,6 @@ name = "static_slice" version = "0.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "stdweb" -version = "0.4.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "discard 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "stdweb-derive 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "stdweb-internal-macros 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", - "stdweb-internal-runtime 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "stdweb-derive" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "stdweb-internal-macros" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "base-x 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", - "sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "stdweb-internal-runtime" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "stream-cipher" version = "0.3.0" @@ -2519,19 +2591,19 @@ version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-bip39" -version = "0.2.0" -source = "git+https://github.com/paritytech/substrate-bip39#a28806512c977992af8d6740d45352f5a1c832a0" +version = "0.2.1" +source = "git+https://github.com/paritytech/substrate-bip39#44307fda4ea17fe97aeb93af317fbc8f6ed34193" dependencies = [ "hmac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "pbkdf2 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "schnorrkel 0.0.0 (git+https://github.com/w3f/schnorrkel)", + "schnorrkel 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2539,15 +2611,15 @@ dependencies = [ name = "substrate-client" version = "2.0.0" dependencies = [ - "derive_more 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.14.1 (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)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", - "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-api-macros 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -2565,21 +2637,10 @@ dependencies = [ [[package]] name = "substrate-consensus-aura-primitives" version = "2.0.0" -dependencies = [ - "sr-primitives 2.0.0", - "substrate-client 2.0.0", -] - -[[package]] -name = "substrate-consensus-authorities" -version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", - "sr-version 2.0.0", - "srml-support 2.0.0", "substrate-client 2.0.0", "substrate-primitives 2.0.0", ] @@ -2588,17 +2649,19 @@ dependencies = [ name = "substrate-consensus-common" version = "2.0.0" dependencies = [ - "crossbeam-channel 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", + "sr-std 2.0.0", "sr-version 2.0.0", "substrate-inherents 2.0.0", "substrate-primitives 2.0.0", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2606,12 +2669,12 @@ name = "substrate-executor" version = "2.0.0" dependencies = [ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "libsecp256k1 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-version 2.0.0", "substrate-panic-handler 2.0.0", @@ -2620,7 +2683,7 @@ dependencies = [ "substrate-state-machine 2.0.0", "substrate-trie 2.0.0", "tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "wasmi 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmi 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2628,7 +2691,7 @@ name = "substrate-inherents" version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", ] @@ -2656,7 +2719,7 @@ dependencies = [ name = "substrate-panic-handler" version = "2.0.0" dependencies = [ - "backtrace 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", + "backtrace 0.3.26 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2669,29 +2732,30 @@ dependencies = [ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "ed25519-dalek 1.0.0-pre.1 (registry+https://github.com/rust-lang/crates.io-index)", "hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", - "hash256-std-hasher 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash256-std-hasher 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "impl-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "primitive-types 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "primitive-types 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "schnorrkel 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "schnorrkel 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-std 2.0.0", - "substrate-bip39 0.2.0 (git+https://github.com/paritytech/substrate-bip39)", - "tiny-bip39 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "twox-hash 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "wasmi 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "substrate-bip39 0.2.1 (git+https://github.com/paritytech/substrate-bip39)", + "tiny-bip39 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "twox-hash 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmi 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-serializer" version = "2.0.0" dependencies = [ - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2701,8 +2765,9 @@ version = "2.0.0" dependencies = [ "hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-panic-handler 2.0.0", "substrate-primitives 2.0.0", "substrate-trie 2.0.0", @@ -2714,17 +2779,19 @@ dependencies = [ name = "substrate-telemetry" version = "2.0.0" dependencies = [ - "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "slog-async 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "slog-json 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "slog-scope 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "ws 0.7.9 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2747,35 +2814,30 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "subtle" -version = "2.0.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "syn" -version = "0.15.33" +version = "0.15.34" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "synstructure" -version = "0.10.1" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "take_mut" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "termcolor" version = "1.0.4" @@ -2789,9 +2851,9 @@ name = "termion" version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "numtoa 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.54 (registry+https://github.com/rust-lang/crates.io-index)", "redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2808,14 +2870,14 @@ name = "time" version = "0.1.42" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.54 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tiny-bip39" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2840,31 +2902,32 @@ name = "tk-listen" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tokio" -version = "0.1.16" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-current-thread 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-current-thread 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-fs 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-sync 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-sync 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-threadpool 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-threadpool 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-trace-core 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-udp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-uds 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2875,17 +2938,17 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tokio-current-thread" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2893,19 +2956,19 @@ name = "tokio-dns-unofficial" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tokio-executor" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2913,9 +2976,9 @@ name = "tokio-fs" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-threadpool 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-threadpool 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2924,7 +2987,7 @@ version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2934,25 +2997,38 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-sync 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-sync 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-rustls" +version = "0.10.0-alpha.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rustls 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "webpki 0.19.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tokio-sync" -version = "0.1.3" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "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)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2961,38 +3037,46 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tokio-threadpool" -version = "0.1.12" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crossbeam-deque 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-queue 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tokio-timer" -version = "0.2.10" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-trace-core" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3001,9 +3085,9 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3015,11 +3099,11 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", "mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3028,10 +3112,10 @@ dependencies = [ [[package]] name = "toml" -version = "0.4.10" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3066,7 +3150,7 @@ dependencies = [ [[package]] name = "twox-hash" -version = "1.2.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3084,11 +3168,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "uint" -version = "0.6.1" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "crunchy 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "crunchy 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3111,7 +3195,7 @@ dependencies = [ [[package]] name = "unicode-segmentation" -version = "1.2.1" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -3148,11 +3232,6 @@ name = "utf8-ranges" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "vcpkg" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "version_check" version = "0.1.5" @@ -3165,103 +3244,141 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "wasm-bindgen" -version = "0.2.42" +version = "0.2.45" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "wasm-bindgen-macro 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-macro 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.42" +version = "0.2.45" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bumpalo 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bumpalo 2.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-shared 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-shared 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-futures" -version = "0.3.19" +version = "0.3.22" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "js-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.42" +version = "0.2.45" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-macro-support 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-macro-support 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.42" +version = "0.2.45" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-backend 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-shared 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-backend 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-shared 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.42" +version = "0.2.45" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "wasm-bindgen-webidl" -version = "0.2.42" +version = "0.2.45" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-backend 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", - "weedle 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-backend 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", + "weedle 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "wasm-timer" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "send_wrapper 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", + "web-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasmi" -version = "0.4.3" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "memory_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-wasm 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmi-validation 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "wasmi-validation" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "parity-wasm 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "web-sys" -version = "0.3.19" +version = "0.3.22" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "env_logger 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "js-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", "sourcefile 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-webidl 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-webidl 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "webpki" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", + "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "webpki-roots" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "webpki 0.19.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "weedle" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "nom 4.2.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3274,7 +3391,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "winapi" -version = "0.3.6" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3296,7 +3413,7 @@ name = "winapi-util" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3309,28 +3426,10 @@ name = "wincolor" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", "winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "ws" -version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "httparse 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", - "mio-extras 2.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl 0.10.19 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "ws2_32-sys" version = "0.2.1" @@ -3342,21 +3441,21 @@ dependencies = [ [[package]] name = "x25519-dalek" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "curve25519-dalek 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "curve25519-dalek 1.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "yamux" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "nohash-hasher 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3371,45 +3470,68 @@ name = "zeroize" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "zeroize" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "zeroize_derive 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "zeroize_derive" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", + "synstructure 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + [metadata] +"checksum adler32 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7e522997b529f05601e05166c07ed17789691f562762c7f3b987263d2dedee5c" "checksum aes-ctr 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d2e5b0458ea3beae0d1d8c0f3946564f8e10f90646cf78c06b4351052058d1ee" "checksum aes-soft 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cfd7e7ae3f9a1fb5c03b389fc6bb9a51400d0c13053f0dca698c832bfd893a0d" "checksum aesni 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2f70a6b5f971e473091ab7cfb5ffac6cde81666c4556751d8d5620ead8abf100" -"checksum aho-corasick 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)" = "81ce3d38065e618af2d7b77e10c5ad9a069859b4be3c2250f674af3840d9c8a5" +"checksum aho-corasick 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e6f484ae0c99fec2e858eb6134949117399f222608d84cadb3f58c1f97c2364c" "checksum aio-limited 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7f10b352bc3fc08ae24dc5d2d3ddcac153678533986122dc283d747b12071000" "checksum arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "0d382e583f07208808f6b1249e60848879ba3543f57c32277bf52d69c2f0f0ee" "checksum arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "92c7fb76bc8826a8b33b4ee5bb07a247a81e76764ab4d55e8f73e3a4d8808c71" "checksum asn1_der 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9893d63fc3b1c44231e667da6836a33f27d8b6b3bdc82f83da5dfd579d1b6528" "checksum asn1_der_derive 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9e7f92edafad155aff997fa5b727c6429b91e996b5a5d62a2b0adbae1306b5fe" "checksum atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "9a7d5b8723950951411ee34d271d99dddcc2035a16ab25310ea2c8cfd4369652" -"checksum autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a6d640bee2da49f60a4068a7fae53acde8982514ab7bae8b8cea9e88cbcfd799" -"checksum backtrace 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)" = "cd5a90e2b463010cd0e0ce9a11d4a9d5d58d9f41d4a6ba3dcaf9e68b466e88b4" +"checksum autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "0e49efa51329a5fd37e7c79db4621af617cd4e3e5bc224939808d076077077bf" +"checksum backtrace 0.3.26 (registry+https://github.com/rust-lang/crates.io-index)" = "1a13fc43f04daf08ab4f71e3d27e1fc27fc437d3e95ac0063a796d92fb40f39b" "checksum backtrace-sys 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)" = "797c830ac25ccc92a7f8a7b9862bde440715531514594a6154e3d4a54dd769b6" -"checksum base-x 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "d55aa264e822dbafa12db4d54767aff17c6ba55ea2d8559b3e17392c7d000e5d" "checksum base58 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5024ee8015f02155eee35c711107ddd9a9bf3cb689cf2a9089c97e79b6e1ae83" +"checksum base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b25d992356d2eb0ed82172f5248873db5560c4721f564b13cb5193bda5e668e" "checksum bigint 4.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ebecac13b3c745150d7b6c3ea7572d372f09d627c2077e893bf26c5c7f70d282" "checksum bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "228047a76f468627ca71776ecdebd732a3423081fcf5125585bcd7c49886ce12" "checksum bitmask 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5da9b3d9f6f585199287a473f4f8dfab6566cf827d15c00c219f53c645687ead" "checksum blake2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "91721a6330935673395a0607df4d49a9cb90ae12d259f1b3e0a3f6e1d486872e" "checksum blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "5d6d530bdd2d52966a6d03b7a964add7ae1a288d25214066fd4b600f0f796400" "checksum block-buffer 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1339a1042f5d9f295737ad4d9a6ab6bf81c84a933dba110b9200cd6d1448b814" -"checksum block-buffer 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "49665c62e0e700857531fa5d3763e91b539ff1abeebd56808d378b495870d60d" +"checksum block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" "checksum block-cipher-trait 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1c924d49bd09e7c06003acda26cd9742e796e34282ec6c1189404dee0c1f4774" -"checksum block-padding 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d75255892aeb580d3c566f213a2b6fdc1c66667839f45719ee1d30ebf2aea591" +"checksum block-padding 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "6d4dc3af3ee2e12f3e5d224e5e1e3d73668abbeb69e566d361f7d5563a4fdf09" "checksum bs58 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0de79cfb98e7aa9988188784d8664b4b5dad6eaaa0863b91d9a4ed871d4f7a42" -"checksum bumpalo 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4639720be048090544634e0402490838995ccdc9d2fe648f528f30d3c33ae71f" +"checksum build_const 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "39092a32794787acd8525ee150305ff051b0aa6cc2abaf193924f5ab05425f39" +"checksum bumpalo 2.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "84dca3afd8e01b9526818b7963e5b4916063b3cdf9f10cf6b73ef0bd0ec37aa5" "checksum byte-tools 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "560c32574a12a89ecd91f5e742165893f86e3ab98d21f8ea548658eb9eef5f40" "checksum byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" "checksum byteorder 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "0fc10e8cc6b2580fda3f36eb6dc5316657f812a3df879a44a66fc9f0fdbc4855" "checksum byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a019b10a2a7cdeb292db131fc8113e57ea2a908f6e7894b0c3c671893b65dbeb" "checksum bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)" = "206fdffcfa2df7cbe15601ef46c813fce0965eb3286db6b56c583b814b51c81c" "checksum c_linked_list 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4964518bd3b4a8190e832886cdc0da9794f12e8e6c1613a9e90ff331c4c8724b" -"checksum cc 1.0.31 (registry+https://github.com/rust-lang/crates.io-index)" = "c9ce8bb087aacff865633f0bd5aeaed910fe2fe55b55f4739527f2e023a2e53d" -"checksum cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "11d43355396e872eefb45ce6342e4374ed7bc2b3a502d1b28e36d6e23c05d1f4" +"checksum cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)" = "39f75544d7bbaf57560d2168f28fd649ff9c76153874db88bdbdfd839b1a7e7d" +"checksum cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "b486ce3ccf7ffd79fdeb678eac06a9e6c09fc88d33836340becb8fffe87c5e33" "checksum chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "45912881121cb26fad7c38c17ba7daa18764771836b34fab7d3fbd93ed633878" "checksum clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "97276801e127ffb46b66ce23f35cc96bd454fa311294bced4bbace7baa8b1d17" "checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" "checksum constant_time_eq 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8ff012e225ce166d4422e0e78419d901719760f62ae2b7969ca6b564d1b54a9e" +"checksum crc 1.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d663548de7f5cca343f1e0a48d14dcfb0e9eb4e079ec58883b7251539fa10aeb" +"checksum crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ba125de2af0df55319f41944744ad91c71113bf74a4646efff39afe1f6842db1" "checksum crossbeam 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ad4c7ea749d9fb09e23c5cb17e3b70650860553a0e2744e38446b1803bf7db94" "checksum crossbeam-channel 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "0f0ed1a4de2235cabda8558ff5840bffb97fcb64c97827f354a451307df5f72b" "checksum crossbeam-deque 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f739f8c5363aca78cfb059edf753d8f0d36908c348f3d8d1503f03d8b75d9cf3" @@ -3421,36 +3543,33 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum crossbeam-utils 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2760899e32a1d58d5abb31129f8fae5de75220bc2176e77ff7c627ae45c918d9" "checksum crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "f8306fcef4a7b563b76b7dd949ca48f52bc1141aa067d2ea09565f3e2652aa5c" "checksum crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "a2f4a431c5c9f662e1200b7c7f02c34e91361150e382089a8f2dec3ba680cbda" -"checksum crunchy 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c240f247c278fa08a6d4820a6a222bfc6e0d999e51ba67be94f44c905b2161f2" +"checksum crunchy 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" "checksum crypto-mac 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "779015233ac67d65098614aec748ac1c756ab6677fa2e14cf8b37c08dfed1198" "checksum crypto-mac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4434400df11d95d556bac068ddfedd482915eb18fe8bea89bc80b6e4b1c179e5" "checksum ctr 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "022cd691704491df67d25d006fe8eca083098253c4d43516c2206479c58c6736" "checksum cuckoofilter 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8dd43f7cfaffe0a386636a10baea2ee05cc50df3b77bea4a456c9572a939bf1f" -"checksum curve25519-dalek 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e1f8a6fc0376eb52dc18af94915cc04dfdf8353746c0e8c550ae683a0815e5c1" +"checksum curve25519-dalek 1.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "750226d75fc2f5a8daec6e7477624e258674023eb73d8d647f63b943ca182a4a" "checksum data-encoding 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f4f47ca1860a761136924ddd2422ba77b2ea54fe8cc75b9040804a0d9d32ad97" -"checksum derive_more 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fbe9f11be34f800b3ecaaed0ec9ec2e015d1d0ba0c8644c1310f73d6e8994615" +"checksum derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6d944ac6003ed268757ef1ee686753b57efc5fcf0ebe7b64c9fc81e7e32ff839" "checksum digest 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e5b29bf156f3f4b3c4f610a25ff69370616ae6e0657d416de22645483e72af0a" "checksum digest 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "05f47366984d3ad862010e22c7ce81a7dbcaebbdfb37241a620f8b6596ee135c" -"checksum discard 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "212d0f5754cb6769937f4501cc0e67f4f4483c8d2c3e1e922ee9edbe4ab4c7c0" "checksum dns-parser 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c4d33be9473d06f75f58220f71f7a9317aca647dc061dbd3c361b0bef505fbea" "checksum ed25519-dalek 1.0.0-pre.1 (registry+https://github.com/rust-lang/crates.io-index)" = "81956bcf7ef761fb4e1d88de3fa181358a0d26cbcb9755b587a08f9119824b86" -"checksum either 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c67353c641dc847124ea1902d69bd753dee9bb3beff9aa3662ecf86c971d1fac" +"checksum either 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5527cfe0d098f36e3f8839852688e63c8fff1c90b2b405aef730615f9a7bcf7b" "checksum elastic-array 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)" = "073be79b6538296faf81c631872676600616073817dd9a440c477ad09b408983" "checksum env_logger 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b61fa891024a945da30a9581546e8cfaf5602c7b3f4c137a2805cf388f92075a" "checksum environmental 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5c7464757b80de8930c91c9afe77ddce501826bf9d134a87db2c67d9dc177e2c" "checksum erased-serde 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "3beee4bc16478a1b26f2e80ad819a52d24745e292f521a63c16eea5f74b7eb60" -"checksum error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "07e791d3be96241c77c43846b665ef1384606da2cd2a48730abe606a12906e02" "checksum failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "795bd83d3abeb9220f257e597aa0080a508b27533824adf336529648f6abf7e2" "checksum failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "ea1063915fd7ef4309e222a5a07cf9c319fb9c7836b1f89b85458672dbb127e1" "checksum fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" -"checksum fixed-hash 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a557e80084b05c32b455963ff565a9de6f2866da023d6671705c6aff6f65e01c" +"checksum fixed-hash 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d1a683d1234507e4f3bf2736eeddf0de1dc65996dc0164d57eba0a74bcf29489" +"checksum flate2 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)" = "f87e68aa82b2de08a6e037f1385455759df6e445a8df5e005b4297191dbf18aa" "checksum fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2fad85553e09a6f881f739c29f0b00b0f01357c743266d478b68951ce23285f3" -"checksum foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -"checksum foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" "checksum fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" "checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" "checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" -"checksum futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)" = "49e7653e374fe0d0c12de4250f0bdb60680b8c80eed558c5c7538eec9c89e21b" +"checksum futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)" = "a2037ec1c6c1c4f79557762eab1f7eae1f64f6cb418ace90fae88f0942b60139" "checksum futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "ab90cde24b3319636588d0c35fe03b1333857621051837ed769faefb4c2162e4" "checksum gcc 0.3.55 (registry+https://github.com/rust-lang/crates.io-index)" = "8f5f3913fa0bfe7ee1fd8248b6b9f42a5af4b9d65ec2dd2c3c26132b950ecfc2" "checksum generic-array 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3c0f28c2f5bfb5960175af447a2da7c18900693738343dc896ffbcabd9839592" @@ -3458,60 +3577,68 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum get_if_addrs 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "abddb55a898d32925f3148bd281174a68eeb68bbfd9a5938a57b18f506ee4ef7" "checksum get_if_addrs-sys 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0d04f9fb746cf36b191c00f3ede8bde9c8e64f9f4b05ae2694a9ccf5e3f5ab48" "checksum hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ba7fb417e5c470acdd61068c79767d0e65962e70836cf6c9dfd2409f06345ce0" -"checksum hash256-std-hasher 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1224388a21c88a80ae7087a2a245ca6d80acc97a9186b75789fb3eeefd0609af" +"checksum hash256-std-hasher 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f8b2027c19ec91eb304999abae7307d225cf93be42af53b0039f76e98ed5af86" "checksum hashbrown 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3bae29b6653b3412c2e71e9d486db9f9df5d701941d86683005efb9f2d28e3da" "checksum hashmap_core 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "8e04cb7a5051270ef3fa79f8c7604d581ecfa73d520e74f554e45541c4b5881a" "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" "checksum hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "805026a5d0141ffc30abb3be3173848ad46a1b1664fe632428479619a3644d77" -"checksum hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "27455ce8b4a6666c87220e4b59c9a83995476bdadc10197905e61dbe906e36fa" -"checksum hex-literal-impl 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1d340b6514f232f6db1bd16db65302a5278a04fef9ce867cb932e7e5fa21130a" +"checksum hex-literal 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "ddc2928beef125e519d69ae1baa8c37ea2e0d3848545217f6db0179c5eb1d639" +"checksum hex-literal-impl 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "520870c3213943eb8d7803e80180d12a6c7ceb4ae74602544529d1643dc4ddda" "checksum hmac 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7a13f4163aa0c5ca1be584aace0e2212b2e41be5478218d4f657f5f778b2ae2a" "checksum hmac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f127a908633569f208325f86f71255d3363c79721d7f9fe31cd5569908819771" "checksum hmac-drbg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4fe727d41d2eec0a6574d887914347e5ff96a3b87177817e2a9820c5c87fecc2" +"checksum http 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)" = "eed324f0f0daf6ec10c474f150505af2c143f251722bf9dbd1261bd1f2ee2c1a" "checksum httparse 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e8734b0cfd3bc3e101ec59100e101c2eecd19282202e87808b3037b442777a83" "checksum humantime 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3ca7e5f2e110db35f93b837c81797f3714500b81d517bf20c431b16d3ca4f114" "checksum idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e" "checksum impl-codec 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d2050d823639fbeae26b2b5ba09aca8907793117324858070ade0673c49f793b" "checksum impl-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5158079de9d4158e0ce1de3ae0bd7be03904efc40b3d7dd8b8c301cbf6b52b56" +"checksum impl-serde 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7d26be4b97d738552ea423f76c4f681012ff06c3fa36fa968656b3679f60b4a1" "checksum integer-sqrt 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ea155abb3ba6f382a75f1418988c05fe82959ed9ce727de427f9cfd425b0c903" "checksum iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dbe6e417e7d0975db6512b90796e8ce223145ac4e33c377e4a42882a0e88bb08" -"checksum itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1306f3464951f30e30d12373d31c79fbd52d236e5e896fd92f96ec7babbbe60b" -"checksum js-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)" = "3c994fd445b81741d77f6bcd227d6ed645b95b35a2ecfd2050767450ff1c0b6d" +"checksum ipnet 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e61c2da0d0f700c77d2d313dbf4f93e41d235fa12c6681fee06621036df4c2af" +"checksum itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "501266b7edd0174f8530248f87f99c88fbe60ca4ef3dd486835b8d8d53136f7f" +"checksum js-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "9987e7c13a91d9cf0efe59cca48a3a7a70e2b11695d5a4640f85ae71e28f5e73" "checksum keccak 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" "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 lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bc5729f27f159ddd61f4df6228e827e86643d4d3e7c32183cb30a1c08f604a14" -"checksum lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b294d6fa9ee409a054354afc4352b0b9ef7ca222c69b8812cbea9e7d2bf3783f" -"checksum libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)" = "aab692d7759f5cd8c859e169db98ae5b52c924add2af5fbbca11d12fefb567c1" -"checksum libp2p 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0231edab431064b30b7749484a39735eb36492cef4658c372c9059e58c3003aa" -"checksum libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d1a3bad2ed26297112847678683dd221473a0d44297250b61f004e1b35e72493" -"checksum libp2p-core-derive 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3f765f103b680cbed910b02bfdbdcfce5b1142899c93e51acb960bf59b6f81b1" -"checksum libp2p-dns 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4b129d20cc8cbb6ce5da8361045649c024659173e246c5dfbf20ae06071c046a" -"checksum libp2p-floodsub 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "70d68816b8435d6788399416eb2f0a6974fb1d15c4be5c30141f87c8e81746df" -"checksum libp2p-identify 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "718ca645a065fd70855ca6042a7df686c24cd21add750c37a82c811fbd1e5c43" -"checksum libp2p-kad 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bbe27c623a6a720efd5d704347838972062f89149a9c3cd149748da60bdcd3e0" -"checksum libp2p-mdns 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c9bc1a5d85f4812cae6367b49a432763fe28997bac7c530dc55b70ec18a78aa7" -"checksum libp2p-mplex 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fe5a858342a1cc89464474f7edc4bae1da649b9c823a3e04d9fb494493601746" -"checksum libp2p-noise 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc6b5185c50a52a12e7bbe2ee7799059e24de4e52ab25edbfd26c8ab8515d317" -"checksum libp2p-ping 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7905c1431ad115bee83405770629a27d6f17153ad02ec9670a7347998ef20e22" -"checksum libp2p-plaintext 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cc17626763ded57da8fed73187c2d9f6ebb89d30838673c430315bf560c7e4db" -"checksum libp2p-ratelimit 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2409d08b809ab1a74269597f7da2829d117cc11b9ed3343af33fc20831619726" -"checksum libp2p-secio 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "258cdc6742945c8f6402997bbbf36733588e2db18e5a0014da6d46e3ccfb92cf" -"checksum libp2p-tcp 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1b5691e2ba2720d42bd1e93d6b90239fa9235c1956ef6a5f1dd499a7ae2767be" -"checksum libp2p-uds 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c9ab0b9ca050105fd94229c48911c0c84aef4d6b86a53d1b6df81d938354e47e" -"checksum libp2p-yamux 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5e6ff51a5b2056bacee1c9f2ed8455cdf3c5c619261ddb4efc783119130aaf52" +"checksum libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)" = "42914d39aad277d9e176efbdad68acb1d5443ab65afe0e0e4f0d49352a950880" +"checksum libp2p 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6abde4e6fc777dc06ae2a15202ddedb1a38d7c71ed16bc10fa704b03f73aec37" +"checksum libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b4ceb4791289534d4c1ad8e4bd3c6f06d3670efa55ce71482951a287df93ddd1" +"checksum libp2p-core-derive 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "851a59dcaab66c96777ae0cace96de88a700243c3b8360ab51c7e093f3727066" +"checksum libp2p-deflate 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "902b44e92e1f8b7e697b3a186d15c841e0e38037f14286513207a5407650a635" +"checksum libp2p-dns 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "71a6630a84552b39e5f752e1f6a951d31f3211079465d2e7af73491b6f48fc3f" +"checksum libp2p-floodsub 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9fced4da0c31e0dc8a759472c65fab41db40c01de2d93bc45e1431c13f0564f0" +"checksum libp2p-identify 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1ba5e882d72c71cdf77f45ab68dd715451d3b78a23085f8d385c7a31ec1b4272" +"checksum libp2p-kad 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d71966dbbb4cedcfcdb1d4c87d5dbb6f3f07b465d1ca74f2624256669997d1f2" +"checksum libp2p-mdns 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cdbdaea6f0049cc09ba5db00308f5b93105a8a33b65ba2e36bd35da707850ea2" +"checksum libp2p-mplex 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b351bfd67e97154e7b60f62402237671486c8a89f83eabdb6838f37d4d5f006" +"checksum libp2p-noise 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "44324032b2f9260d2b862c741d79d250dc02298dbba56354a992528a826ee2d5" +"checksum libp2p-ping 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e1ac43ffd01de4210cf1b969bbb55a008c77f9ec22b74df26a6590bb6bd4c93f" +"checksum libp2p-plaintext 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0506e10770bcbcb59f2a6154ce93c8fd5cb9730b6ceb5aa1463164af1fd0b9c6" +"checksum libp2p-ratelimit 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3886b79a35c0348497bab763517a9a2b4965173f4b4c7438d59f1e4dcf5122ff" +"checksum libp2p-secio 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b811272e5cd86d39bd71fb94687025d9802b13daf0998ebe0d3f2885c636c51a" +"checksum libp2p-tcp 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b2c54cb75f17557de6ce0149aa03e729455e2d240f84d854272bc4b11012a324" +"checksum libp2p-uds 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fbedf4a1e72a5f67523915414e9e12d71d128731873f0f24d8b878398fb47aa4" +"checksum libp2p-wasm-ext 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d0c1f615b56aa2a6f4ec07bf9667be9fff8877b9c5bd5335601af47490eda341" +"checksum libp2p-websocket 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a0d1bfe60577558f48a9fdf9f35c0ee2dc5baa01f685ff847d3b5cf4f12ee135" +"checksum libp2p-yamux 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bf4bfc7ff127cd622502dbe56f10513dd6776b970e33d8ebb6e367f0752324f6" "checksum libsecp256k1 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "688e8d65e495567c2c35ea0001b26b9debf0b4ea11f8cccc954233b75fc3428a" "checksum lock_api 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "62ebf1391f6acad60e5c8b43706dde4582df75c06698ab44511d15016bc2442c" +"checksum lock_api 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ed946d4529956a20f2d63ebe1b69996d5a2137c91913fe3ebbeff957f5bca7ff" "checksum log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c84ec4b527950aa83a329754b01dbe3f58361d1c5efacd1f6d68c494d08a17c6" "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.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7623b01a4f1b7acb7cf8e3f678f05e15e6ae26cb0b738dfeb5cc186fd6b82ef4" "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" -"checksum mio-extras 2.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "46e73a04c2fa6250b8d802134d56d554a9ec2922bf977777c805ea5def61ce40" +"checksum merlin 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8c39467de91b004f5b9c06fac5bbc8e7d28309a205ee66905166b70804a71fea" +"checksum miniz-sys 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "1e9e3ae51cea1576ceba0dde3d484d30e6e5b86dee0b2d412fe3a16a15c98202" +"checksum miniz_oxide 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c468f2369f07d651a5d0bb2c9079f8488a66d5466efe42d0c5c6466edcb7f71e" +"checksum miniz_oxide_c_api 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b7fe927a42e3807ef71defb191dc87d4e24479b221e67015fe38ae2b7b447bab" +"checksum mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)" = "83f51996a3ed004ef184e16818edc51fadffe8e7ca68be67f9dee67d84d0ff23" "checksum mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)" = "966257a94e196b11bb43aca423754d87429960a768de9414f3691d6957abf125" "checksum miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919" "checksum multistream-select 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f989d40aab0ed0d83c1cdb4856b5790e980b96548d1a921f280e985eb049f38d" @@ -3519,40 +3646,40 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum nodrop 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "2f9667ddcc6cc8a43afc9b7917599d7216aa09c463919ea32c59ed6cac8bc945" "checksum nohash-hasher 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0d138afcce92d219ccb6eb53d9b1e8a96ac0d633cfd3c53cd9856d96d1741bb8" "checksum nom 4.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2ad2a91a8e869eeb30b9cb3119ae87773a8f4ae617f41b1eb9c154b2905f7bd6" -"checksum num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)" = "e83d528d2677f0518c570baf2b7abdcf0cd2d248860b68507bdcb3e91d4c0cea" -"checksum num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0b3a5d7cc97d6d30d8b9bc8fa19bf45349ffe46241e8816f50f62f6d6aaabee1" +"checksum num-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)" = "b85e541ef8255f6cf42bbfe4ef361305c6c135d10919ecc26126c4e5ae94bc09" +"checksum num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "6ba9a427cfca2be13aa6f6403b0b7e7368fe982bfa16fccc450ce74c46cd9b32" "checksum num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1a23f0ed30a54abaa0c7e83b1d2d87ada7c3c23078d1d87815af3e3b6385fbba" "checksum numtoa 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b8f8bdf33df195859076e54ab11ee78a1b208382d3a26ec40d142ffc1ecc49ef" "checksum once_cell 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "532c29a261168a45ce28948f9537ddd7a5dd272cc513b3017b1e82a88f962c37" "checksum opaque-debug 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "93f5bb2e8e8dec81642920ccff6b61f1eb94fa3020c5a325c9851ff604152409" -"checksum openssl 0.10.19 (registry+https://github.com/rust-lang/crates.io-index)" = "84321fb9004c3bce5611188a644d6171f895fa2889d155927d528782edb21c5d" -"checksum openssl-sys 0.9.42 (registry+https://github.com/rust-lang/crates.io-index)" = "cb534d752bf98cf363b473950659ac2546517f9c6be9723771614ab3f03bbc9e" "checksum owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cdf84f41639e037b484f93433aa3897863b561ed65c6e59c7073d7c561710f37" "checksum owning_ref 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "49a4b8ea2179e6a2e27411d3bca09ca6dd630821cf6894c6c7c8467a8ee7ef13" "checksum parity-bytes 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)" = "" "checksum parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dcb43c05fb71c03b4ea7327bf15694da1e0f23f19d5b1e95bab6c6d74097e336" "checksum parity-codec-derive 3.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "00a486fd383382ddcb2de928364b1f82571c1e48274fc43b7667a4738ee4056c" -"checksum parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "18a130a727008cfcd1068a28439fe939897ccad28664422aeca65b384d6de6d0" -"checksum parity-multihash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3e8eab0287ccde7821e337a124dc5a4f1d6e4c25d10cc91e3f9361615dd95076" +"checksum parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "045b3c7af871285146300da35b1932bb6e4639b66c7c98e85d06a32cbc4e8fa7" +"checksum parity-multihash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05d6a68e07ab34a9e87bd8dd4936f6bb5be21e4f6dbcdbaf04d8e854eba0af01" +"checksum parity-send-wrapper 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aa9777aa91b8ad9dd5aaa04a9b6bcb02c7f1deb952fca5a66034d5e63afc5c6f" "checksum parity-wasm 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)" = "511379a8194230c2395d2f5fa627a5a7e108a9f976656ce723ae68fca4097bfc" "checksum parking_lot 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d4d05f1349491390b1730afba60bb20d55761bef489a954546b58b4b34e1e2ac" "checksum parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f0802bff09003b291ba756dc7e79313e51cc31667e94afbe847def490424cde5" "checksum parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ab41b4aed082705d1056416ae4468b6ea99d52599ecf3169b00088d43113e337" +"checksum parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fa7767817701cce701d5585b9c4db3cdd02086398322c1d7e8bf5094a96a2ce7" "checksum parking_lot_core 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "4db1a8ccf734a7bce794cc19b3df06ed87ab2f3907036b693c68f56b4d4537fa" "checksum parking_lot_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ad7f7e6ebdc79edff6fdcb87a55b620174f7a989e3eb31b65231f4af57f00b8c" "checksum parking_lot_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "94c8c7923936b28d546dfd14d4472eaf34c99b14e1c973a32b3e6d4eb04298c9" -"checksum paste 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f50392d1265092fbee9273414cc40eb6d47d307bd66222c477bb8450c8504f9d" -"checksum paste-impl 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "a3cd512fe3a55e8933b2dcad913e365639db86d512e4004c3084b86864d9467a" +"checksum parking_lot_core 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cb88cb1cb3790baa6776844f968fea3be44956cf184fa1be5a03341f5491278c" +"checksum paste 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "1f4a4a1c555c6505821f9d58b8779d0f630a6b7e4e1be24ba718610acf01fa79" +"checksum paste-impl 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "26e796e623b8b257215f27e6c80a5478856cae305f5b59810ff9acdaa34570e6" "checksum pbkdf2 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "006c038a43a45995a9670da19e67600114740e8511d4333bf97a56e66a7542d9" "checksum percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" -"checksum pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)" = "676e8eb2b1b4c9043511a9b7bea0915320d7e502b0a079fb03f9635a5252b18c" -"checksum primitive-types 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "edb92f1ebfc177432c03287b15d48c202e6e2c95993a7af3ba039abb43b1492e" -"checksum proc-macro-crate 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4c6cf4e5b00300d151dfffae39f529dfa5188f42eeb14201229aa420d6aad10c" +"checksum primitive-types 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "6e8612a8dc70f26276fed6131c153ca277cf275ee0a5e2a50cd8a69c697beb8f" +"checksum proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "e10d4b51f154c8a7fb96fd6dad097cb74b863943ec010ac94b9fd1be8861fe1e" "checksum proc-macro-hack 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2c725b36c99df7af7bf9324e9c999b9e37d92c8f8caf106d82e1d7953218d2d8" -"checksum proc-macro-hack 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "3e90aa19cd73dedc2d0e1e8407473f073d735fef0ab521438de6da8ee449ab66" +"checksum proc-macro-hack 0.5.7 (registry+https://github.com/rust-lang/crates.io-index)" = "0c1dd4172a1e1f96f709341418f49b11ea6c2d95d53dca08c0f74cbd332d9cf3" "checksum proc-macro-hack-impl 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2b753ad9ed99dd8efeaa7d2fb8453c8f6bc3e54b97966d35f1bc77ca6865254a" -"checksum proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)" = "4d317f9caece796be1980837fd5cb3dfec5613ebdb04ad0956deea83ce168915" -"checksum protobuf 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "24d5d73d2b88fddb8b8141f2730d950d88772c940ac4f8f3e93230b9a99d92df" +"checksum proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)" = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" +"checksum protobuf 2.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a151c11a92df0059d6ab446fafa3b21a1210aad4bc2293e1c946e8132b10db01" "checksum quick-error 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "5fb6ccf8db7bbcb9c2eae558db5ab4f3da1c2a87e4e597ed394726bc8ea6ca1d" "checksum quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9274b940887ce9addde99c4eee6b5c44cc494b182b97e73dc8ffdcb3397fd3f0" "checksum quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)" = "faf4799c5d274f3868a4aae320a0a182cbd2baee377b378f080e16a23e9d80db" @@ -3565,122 +3692,125 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d0e7a549d590831370895ab7ba4ea0c1b6b011d106b5ff2da6eee112615e6dc0" "checksum rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4" "checksum rand_isaac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08" -"checksum rand_jitter 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7b9ea758282efe12823e0d952ddb269d2e1897227e464919a554f2a03ef1b832" +"checksum rand_jitter 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "1166d5c91dc97b88d1decc3285bb0a99ed84b05cfd0bc2341bdf2d43fc41e39b" "checksum rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7b75f676a1e053fc562eafbb47838d67c84801e38fc1ba459e8f180deabd5071" "checksum rand_pcg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "abf9b09b01790cfe0364f52bf32995ea3c39f4d2dd011eac241d2914146d0b44" "checksum rand_xorshift 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cbf7e9e623549b0e21f6e97cf8ecf247c1a8fd2e8a992ae265314300b2455d5c" "checksum rayon 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "373814f27745b2686b350dd261bfd24576a6fb0e2c5919b3a2b6005f820b0473" "checksum rayon-core 1.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b055d1e92aba6877574d8fe604a63c8b5df60f60e5982bf7ccbb1338ea527356" "checksum rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" -"checksum redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)" = "423e376fffca3dfa06c9e9790a9ccd282fafb3cc6e6397d01dbf64f9bacc6b85" +"checksum redox_syscall 0.1.54 (registry+https://github.com/rust-lang/crates.io-index)" = "12229c14a0f65c4f1cb046a3b52047cdd9da1f4b30f8a39c5063c8bae515e252" "checksum redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76" -"checksum regex 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "53ee8cfdddb2e0291adfb9f13d31d3bbe0a03c9a402c01b1e24188d86c35b24f" -"checksum regex-syntax 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "8c2f35eedad5295fdf00a63d7d4b238135723f92b434ec06774dad15c7ab0861" +"checksum regex 1.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "8f0a0bcab2fd7d1d7c54fa9eae6f43eddeb9ce2e7352f8518a814a4f65d60c58" +"checksum regex-syntax 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)" = "dcfd8681eebe297b81d98498869d4aae052137651ad7b96822f09ceb690d0a96" "checksum ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)" = "426bc186e3e95cac1e4a4be125a4aca7e84c2d616ffc02244eef36e2a60a093c" -"checksum rustc-demangle 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "adacaae16d02b6ec37fdc7acfcddf365978de76d1983d3ee22afc260e1ca9619" +"checksum rustc-demangle 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)" = "a7f4dccf6f4891ebcc0c39f9b6eb1a83b9bf5d747cb439ec6fba4f3b977038af" "checksum rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "403bb3a286107a04825a5f82e1270acc1e14028d3d554d7a1e08914549575ab8" "checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" -"checksum rw-stream-sink 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d548a40fe17c3a77d54b82457b79fcc9b8a288d509ca20fbf5aa1dac386d22d6" -"checksum ryu 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "eb9e9b8cde282a9fe6a42dd4681319bfb63f121b8a8ee9439c6f4107e58a46f7" +"checksum rustls 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f271e3552cd835fa28c541c34a7e8fdd8cdff09d77fe4eb8f6c42e87a11b096e" +"checksum rw-stream-sink 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2f9cbe61c20455d3015b2bb7be39e1872310283b8e5a52f5b242b0ac7581fe78" +"checksum ryu 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "b96a9549dc8d48f2c283938303c4b5a77aa29bfbc5b54b084fb1630408899a8f" "checksum safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7f7bf422d23a88c16d5090d455f182bc99c60af4df6a345c63428acf5129e347" -"checksum schnorrkel 0.0.0 (git+https://github.com/w3f/schnorrkel)" = "" -"checksum schnorrkel 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a700659388785588c75b197cecda0f23c7112a9281ef703e8ffc651061ce014c" +"checksum schnorrkel 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b5eff518f9bed3d803a0d002af0ab96339b0ebbedde3bec98a684986134b7a39" "checksum scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "94258f53601af11e6a49f722422f6e3425c52b06245a5cf9bc09908b174f5e27" -"checksum secp256k1 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4070f3906e65249228094cf97b04a90799fba04468190bbbcfa812309cf86e32" +"checksum scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b42e15e59b18a828bbf5c58ea01debb36b9b096346de35d941dcb89009f24a0d" +"checksum sct 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2f5adf8fbd58e1b1b52699dc8bed2630faecb6d8c7bee77d009d6bbe4af569b9" "checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" "checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" "checksum send_wrapper 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a0eddf2e8f50ced781f288c19f18621fa72a3779e3cb58dbf23b07469b0abeb4" -"checksum serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)" = "92514fb95f900c9b5126e32d020f5c6d40564c27a5ea6d1d7d9f157a96623560" -"checksum serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)" = "bb6eabf4b5914e88e24eea240bb7c9f9a2cbc1bbbe8d961d381975ec3c6b806c" +"checksum serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)" = "a72e9b96fa45ce22a4bc23da3858dfccfd60acd28a25bcd328a98fdd6bea43fd" +"checksum serde_derive 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)" = "101b495b109a3e3ca8c4cbe44cf62391527cdfb6ba15821c5ce80bcd5ea23f9f" "checksum serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)" = "5a23aa71d4a4d43fdbfaac00eff68ba8a06a51759a89ac3304323e800c4dd40d" +"checksum sha-1 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "23962131a91661d643c98940b20fcaffe62d776a823247be80a48fcb8b6fce68" "checksum sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d" "checksum sha2 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7d963c78ce367df26d7ea8b8cc655c651b42e8a1e584e869c1e17dae3ccb116a" "checksum sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b4d8bfd0e469f417657573d8451fb33d16cfe0989359b93baf3a1ffc639543d" -"checksum sha3 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "34a5e54083ce2b934bf059fdf38e7330a154177e029ab6c4e18638f2f624053a" +"checksum sha3 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dd26bc0e7a2e3a7c959bc494caf58b72ee0c71d67704e9520f736ca7e4853ecf" "checksum slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" "checksum slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1e1a2eec401952cd7b12a84ea120e2d57281329940c3f93c2bf04f462539508e" -"checksum slog-async 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e544d16c6b230d84c866662fe55e31aacfca6ae71e6fc49ae9a311cb379bfc2f" "checksum slog-json 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ddc0d2aff1f8f325ef660d9a0eb6e6dcd20b30b3f581a5897f58bf42d061c37a" "checksum slog-scope 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "60c04b4726fa04595ccf2c2dad7bcd15474242c4c5e109a8a376e8a2c9b1539a" "checksum smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)" = "c4488ae950c49d403731982257768f48fada354a5203fe81f9bb6f43ca9002be" "checksum snow 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5a64f02fd208ef15bd2d1a65861df4707e416151e1272d02c8faafad1c138100" +"checksum soketto 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8cf3ae22c0bce5437c7dce6a2b00e492c19da1feb21ad64a7b6fd7058438c3f2" "checksum sourcefile 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4bf77cb82ba8453b42b6ae1d692e4cdc92f9a47beaf89a847c8be83f4e328ad3" "checksum spin 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "44363f6f51401c34e7be73db0db371c04705d35efbe9f7d6082e03a921a32c55" "checksum stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dba1a27d3efae4351c8051072d619e3ade2820635c3958d826bfea39d59b54c8" "checksum static_assertions 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "c19be23126415861cb3a23e501d34a708f7f9b2183c5252d690941c2e69199d5" "checksum static_slice 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "92a7e0c5e3dfb52e8fbe0e63a1b947bbb17b4036408b151353c4491374931362" -"checksum stdweb 0.4.15 (registry+https://github.com/rust-lang/crates.io-index)" = "a3edad410e603184d656e2abded5fd4d3d6e93d5763d21130dbaf99795db74eb" -"checksum stdweb-derive 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0e21ebd9179de08f2300a65454268a17ea3de204627458588c84319c4def3930" -"checksum stdweb-internal-macros 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "1635afd059cbfac7d5b1274f0c44cec110c1e013c48e8bbc22e07e52696cf887" -"checksum stdweb-internal-runtime 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a2a2f4a2eb556337b2d1a302630bbddf989ae383c70393e89b48152b9896cbda" "checksum stream-cipher 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8861bc80f649f5b4c9bd38b696ae9af74499d479dbfb327f0607de6b326a36bc" "checksum strum 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1810e25f576e7ffce1ff5243b37066da5ded0310b3274c20baaeccb1145b2806" "checksum strum_macros 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "572a2f4e53dd4c3483fd79e5cc10ddd773a3acb1169bbfe8762365e107110579" -"checksum substrate-bip39 0.2.0 (git+https://github.com/paritytech/substrate-bip39)" = "" +"checksum substrate-bip39 0.2.1 (git+https://github.com/paritytech/substrate-bip39)" = "" "checksum subtle 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2d67a5a62ba6e01cb2192ff309324cb4875d0c451d55fe2319433abe7a05a8ee" -"checksum subtle 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "702662512f3ddeb74a64ce2fbbf3707ee1b6bb663d28bb054e0779bbc720d926" -"checksum syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)" = "ec52cd796e5f01d0067225a5392e70084acc4c0013fa71d55166d38a8b307836" -"checksum synstructure 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "73687139bf99285483c96ac0add482c3776528beac1d97d444f6e91f203a2015" -"checksum take_mut 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f764005d11ee5f36500a149ace24e00e3da98b0158b3e2d53a7495660d3f4d60" +"checksum subtle 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "01dca13cf6c3b179864ab3292bd794e757618d35a7766b7c46050c614ba00829" +"checksum syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)" = "a1393e4a97a19c01e900df2aec855a29f71cf02c402e2f443b8d2747c25c5dbe" +"checksum synstructure 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)" = "02353edf96d6e4dc81aea2d8490a7e9db177bf8acb0e951c24940bf866cb313f" "checksum termcolor 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4096add70612622289f2fdcdbd5086dc81c1e2675e6ae58d6c4f62a16c6d7f2f" "checksum termion 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dde0593aeb8d47accea5392b39350015b5eccb12c0d98044d856983d89548dea" "checksum thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b" "checksum time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "db8dcfca086c1143c9270ac42a2bbd8a7ee477b78ac8e45b19abfb0cbede4b6f" -"checksum tiny-bip39 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f5388a470627f97a01a6e13389ced797a42b1611f9de7e0f6ca705675ac55297" +"checksum tiny-bip39 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c1c5676413eaeb1ea35300a0224416f57abc3bd251657e0fafc12c47ff98c060" "checksum tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e9175261fbdb60781fcd388a4d6cc7e14764a2b629a7ad94abb439aed223a44f" "checksum tk-listen 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5462b0f968c0457efe38fcd2df7e487096b992419e4f5337b06775a614bbda4b" -"checksum tokio 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "fcaabb3cec70485d0df6e9454fe514393ad1c4070dee8915f11041e95630b230" +"checksum tokio 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)" = "94a1f9396aec29d31bb16c24d155cfa144d1af91c40740125db3131bdaf76da8" "checksum tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5c501eceaf96f0e1793cf26beb63da3d11c738c4a943fdf3746d81d64684c39f" -"checksum tokio-current-thread 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "c756b04680eea21902a46fca4e9f410a2332c04995af590e07ff262e2193a9a3" +"checksum tokio-current-thread 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "d16217cad7f1b840c5a97dfb3c43b0c871fef423a6e8d2118c604e843662a443" "checksum tokio-dns-unofficial 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "82c65483db54eb91b4ef3a9389a3364558590faf30ce473141707c0e16fda975" -"checksum tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "30c6dbf2d1ad1de300b393910e8a3aa272b724a400b6531da03eed99e329fbf0" +"checksum tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "83ea44c6c0773cc034771693711c35c677b4b5a4b21b9e7071704c54de7d555e" "checksum tokio-fs 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "3fe6dc22b08d6993916647d108a1a7d15b9cd29c4f4496c62b92c45b5041b7af" "checksum tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "5090db468dad16e1a7a54c8c67280c5e4b544f3d3e018f0b913b400261f85926" "checksum tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "6af16bfac7e112bea8b0442542161bfc41cbfa4466b580bdda7d18cb88b911ce" -"checksum tokio-sync 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1bf2b9dac2a0509b5cfd1df5aa25eafacb616a42a491a13604d6bbeab4486363" +"checksum tokio-rustls 0.10.0-alpha.3 (registry+https://github.com/rust-lang/crates.io-index)" = "316fdbc899efec48b3b492bd0f339e6d81c4ee96a409257572147ec341943452" +"checksum tokio-sync 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "5b2f843ffdf8d6e1f90bddd48da43f99ab071660cd92b7ec560ef3cdfd7a409a" "checksum tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1d14b10654be682ac43efee27401d792507e30fd8d26389e1da3b185de2e4119" -"checksum tokio-threadpool 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "742e511f6ce2298aeb86fc9ea0d8df81c2388c6ebae3dc8a7316e8c9df0df801" -"checksum tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)" = "2910970404ba6fa78c5539126a9ae2045d62e3713041e447f695f41405a120c6" +"checksum tokio-threadpool 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "72558af20be886ea124595ea0f806dd5703b8958e4705429dd58b3d8231f72f2" +"checksum tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "f2106812d500ed25a4f38235b9cae8f78a09edf43203e16e59c3b769a342a60e" +"checksum tokio-trace-core 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "350c9edade9830dc185ae48ba45667a445ab59f6167ef6d0254ec9d2430d9dd3" "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 toml 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b8c96d7873fa7ef8bdeb3a9cda3ac48389b4154f32b9803b4bc26220b677b039" "checksum trie-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1ba73747fd3a64ab531274c04cb588dfa9d30d972d62990831e63fbce2cfec59" "checksum trie-root 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "cfa2e20c4f1418ac2e71ddc418e35e1b56e34022e2146209ffdbf1b2de8b1bd9" "checksum twofish 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712d261e83e727c8e2dbb75dacac67c36e35db36a958ee504f2164fc052434e1" -"checksum twox-hash 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "09871da9f15424236082e0b220fd404a4eb6bebc7205c67653701229234ac64c" +"checksum twox-hash 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6c7bcecad121018bdcd6b709fa2325b004878fcb3d3067934ce90749f0faff9a" "checksum typenum 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "612d636f949607bdf9b123b4a6f6d966dedf3ff669f7f045890d3a4a73948169" "checksum ucd-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "535c204ee4d8434478593480b8f86ab45ec9aae0e83c568ca81abf0fd0e88f86" -"checksum uint 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e7780bb27fd8a22295e0d9d53ae3be253f715a0dccb1808527f478f1c2603708" +"checksum uint 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2143cded94692b156c356508d92888acc824db5bffc0b4089732264c6fcf86d4" "checksum unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" "checksum unicode-normalization 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "141339a08b982d942be2ca06ff8b076563cbe223d1befd5450716790d44e2426" -"checksum unicode-segmentation 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "aa6024fc12ddfd1c6dbc14a80fa2324d4568849869b779f6bd37e5e4c03344d1" +"checksum unicode-segmentation 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1967f4cdfc355b37fd76d2a954fb2ed3871034eb4f26d60537d88795cfc332a9" "checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" "checksum unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2c64cdf40b4a9645534a943668681bcb219faf51874d4b65d2e0abda1b10a2ab" "checksum untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "55cd1f4b4e96b46aeb8d4855db4a7a9bd96eeeb5c6a1ab54593328761642ce2f" "checksum url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a" "checksum utf8-ranges 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "796f7e48bef87609f7ade7e06495a87d5cd06c7866e6a5cbfceffc558a243737" -"checksum vcpkg 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "def296d3eb3b12371b2c7d0e83bfe1403e4db2d7a0bba324a12b21c4ee13143d" "checksum version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd" "checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" -"checksum wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "ffde3534e5fa6fd936e3260cd62cd644b8656320e369388f9303c955895e35d4" -"checksum wasm-bindgen-backend 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "40c0543374a7ae881cdc5d32d19de28d1d1929e92263ffa7e31712cc2d53f9f1" -"checksum wasm-bindgen-futures 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)" = "0ad171fc1f6e43f97d155d27f4ee5657bd8aa5cce7c497ef3a0a0c5b44618b2d" -"checksum wasm-bindgen-macro 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "f914c94c2c5f4c9364510ca2429e59c92157ec89429243bcc245e983db990a71" -"checksum wasm-bindgen-macro-support 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "9168c413491e4233db7b6884f09a43beb00c14d11d947ffd165242daa48a2385" -"checksum wasm-bindgen-shared 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "326c32126e1a157b6ced7400061a84ac5b11182b2cda6edad7314eb3ae9ac9fe" -"checksum wasm-bindgen-webidl 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "613dbf4d7d3bf10aeb212b35de14a8ef07222c26526d4f931061a83fc9e2a851" -"checksum wasmi 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "21ef487a11df1ed468cf613c78798c26282da5c30e9d49f824872d4c77b47d1d" -"checksum web-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)" = "24129e4be2281109b3e15a328d3d7f233ee232a5405f75ba1e9bb59a25ebc4d4" -"checksum weedle 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "26a4c67f132386d965390b8a734d5d10adbcd30eb5cc74bd9229af8b83f10044" +"checksum wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)" = "b7ccc7b93cfd13e26700a9e2e41e6305f1951b87e166599069f77d10358100e6" +"checksum wasm-bindgen-backend 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)" = "1953f91b1608eb1522513623c7739f047bb0fed4128ce51a93f08e12cc314645" +"checksum wasm-bindgen-futures 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "fa1af11c73eca3dc8c51c76ea475a4416e912da6402064a49fc6c0214701866d" +"checksum wasm-bindgen-macro 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)" = "0f69da5696545d7ca6607a2e4b1a0edf5a6b36b2c49dbb0f1df6ad1d92884047" +"checksum wasm-bindgen-macro-support 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)" = "2d4246f3bc73223bbb846f4f2430a60725826a96c9389adf715ed1d5af46dec6" +"checksum wasm-bindgen-shared 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)" = "c08381e07e7a79e5e229ad7c60d15833d19033542cc5dd91d085df59d235f4a6" +"checksum wasm-bindgen-webidl 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)" = "1f42ff7adb8102bf5ad8adbc45b1635c520c8175f9fdf6eb2c54479d485d435a" +"checksum wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ad9ac33c834103916e373d648adf65f58c83fb3d8a0f3e6b9a64bca7253a4dca" +"checksum wasmi 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "aebbaef470840d157a5c47c8c49f024da7b1b80e90ff729ca982b2b80447e78b" +"checksum wasmi-validation 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ab380192444b3e8522ae79c0a1976e42a82920916ccdfbce3def89f456ea33f3" +"checksum web-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "540b8259eb242ff3a566fa0140bda03a4ece4e5c226e1284b5c95dddcd4341f6" +"checksum webpki 0.19.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4f7e1cd7900a3a6b65a3e8780c51a3e6b59c0e2c55c6dc69578c288d69f7d082" +"checksum webpki-roots 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c10fa4212003ba19a564f25cd8ab572c6791f99a03cc219c13ed35ccab00de0e" +"checksum weedle 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bcc44aa200daee8b1f3a004beaf16554369746f1b4486f0cf93b0caf8a3c2d1e" "checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" -"checksum winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "92c1eb33641e276cfa214a0522acad57be5c56b10cb348b3c5117db75f3ac4b0" +"checksum winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "f10e386af2b13e47c89e7236a7a14a086791a2b88ebad6df9bf42040195cf770" "checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" "checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" "checksum winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7168bab6e1daee33b4557efd0e95d5ca70a03706d39fa5f3fe7a236f584b03c9" "checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" "checksum wincolor 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "561ed901ae465d6185fa7864d63fbd5720d0ef718366c9a4dc83cf6170d7e9ba" -"checksum ws 0.7.9 (registry+https://github.com/rust-lang/crates.io-index)" = "329d3e6dd450a9c5c73024e1047f0be7e24121a68484eb0b5368977bee3cf8c3" "checksum ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" -"checksum x25519-dalek 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4aca1ba6bec2719576bd20dfe5b24d9359552e616d10bff257e50cd85f745d17" -"checksum yamux 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ae9073f5dbc901abb0b2ec4f866e726fed2f54953bdf81f8a5fde7762b7cc3b3" +"checksum x25519-dalek 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7ee1585dc1484373cbc1cee7aafda26634665cf449436fd6e24bfd1fad230538" +"checksum yamux 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "01bd67889938c48f0049fc60a77341039e6c3eaf16cb7693e6ead7c0ba701295" "checksum zeroize 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8ddfeb6eee2fb3b262ef6e0898a52b7563bb8e0d5955a313b3cf2f808246ea14" +"checksum zeroize 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b60a6c572b91d8ecb0a460950d84fe5b40699edd07d65f73789b31237afc8f66" +"checksum zeroize_derive 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9dac4b660d969bff9c3fe1847a891cacaa8b21dd5f2aae6e0a3e0975aea96431" diff --git a/node-template/runtime/wasm/build.sh b/node-template/runtime/wasm/build.sh index 0be6e7a11c75464ce42a8ad0ddb8a7ccd8d630fc..a549eeb50a5f14168ff41313b61c98edc381bd87 100755 --- a/node-template/runtime/wasm/build.sh +++ b/node-template/runtime/wasm/build.sh @@ -6,7 +6,7 @@ if cargo --version | grep -q "nightly"; then else CARGO_CMD="cargo +nightly" fi -$CARGO_CMD build --target=wasm32-unknown-unknown --release +CARGO_INCREMENTAL=0 RUSTFLAGS="-C link-arg=--export-table" $CARGO_CMD build --target=wasm32-unknown-unknown --release "$@" for i in node_template_runtime_wasm do wasm-gc target/wasm32-unknown-unknown/release/$i.wasm target/wasm32-unknown-unknown/release/$i.compact.wasm diff --git a/node-template/scripts/build.sh b/node-template/scripts/build.sh index 01d0fee3549461f5f2f36be54fc38dc5c64011f7..980a8fa802d02f9f66f58ec8aebea522d690f19a 100755 --- a/node-template/scripts/build.sh +++ b/node-template/scripts/build.sh @@ -17,7 +17,7 @@ do echo "${bold}Building webassembly binary in $SRC...${normal}" cd "$PROJECT_ROOT/$SRC" - ./build.sh + ./build.sh "$@" cd - >> /dev/null done diff --git a/node-template/src/chain_spec.rs b/node-template/src/chain_spec.rs index 3cb8d21d5d0dac64a6c38a18716d92b431085a15..f14cf41464a1b8e9b14641e3d4dc39ffb892a3d0 100644 --- a/node-template/src/chain_spec.rs +++ b/node-template/src/chain_spec.rs @@ -1,12 +1,10 @@ use primitives::{ed25519, sr25519, Pair}; use node_template_runtime::{ - AccountId, GenesisConfig, ConsensusConfig, TimestampConfig, BalancesConfig, - SudoConfig, IndicesConfig, + AccountId, AuraId as AuthorityId, GenesisConfig, AuraConfig, TimestampConfig, BalancesConfig, + SudoConfig, IndicesConfig, SystemConfig }; use substrate_service; -use ed25519::Public as AuthorityId; - // Note this is the URL for the telemetry server //const STAGING_TELEMETRY_URL: &str = "wss://telemetry.polkadot.io/submit/"; @@ -92,11 +90,14 @@ impl Alternative { fn testnet_genesis(initial_authorities: Vec, endowed_accounts: Vec, root_key: AccountId) -> GenesisConfig { GenesisConfig { - consensus: Some(ConsensusConfig { + system: Some(SystemConfig { code: include_bytes!("../runtime/wasm/target/wasm32-unknown-unknown/release/node_template_runtime_wasm.compact.wasm").to_vec(), + changes_trie_config: Default::default(), + _genesis_phantom_data: Default::default(), + }), + aura: Some(AuraConfig { authorities: initial_authorities.clone(), }), - system: None, timestamp: Some(TimestampConfig { minimum_period: 5, // 10 second block time. }), diff --git a/node-template/src/cli.rs b/node-template/src/cli.rs index f41674631e8a43f78104dede2d4fe30e0b8d9462..cd148f3462dce8cac7ffa981d37439967954ba3c 100644 --- a/node-template/src/cli.rs +++ b/node-template/src/cli.rs @@ -61,8 +61,8 @@ fn run_until_exit( { let (exit_send, exit) = exit_future::signal(); - let executor = runtime.executor(); - informant::start(&service, exit.clone(), executor.clone()); + let informant = informant::build(&service); + runtime.executor().spawn(exit.until(informant).map(|_| ())); let _ = runtime.block_on(e.into_exit()); exit_send.fire(); diff --git a/node-template/src/error.rs b/node-template/src/error.rs deleted file mode 100644 index a8aa94bf3285f928b79468ed5317a28eeaa8b635..0000000000000000000000000000000000000000 --- a/node-template/src/error.rs +++ /dev/null @@ -1,13 +0,0 @@ -//! Initialization errors. - -use client; - -error_chain! { - foreign_links { - Io(::std::io::Error) #[doc="IO error"]; - Cli(::clap::Error) #[doc="CLI error"]; - } - links { - Client(client::error::Error, client::error::ErrorKind) #[doc="Client error"]; - } -} diff --git a/node-template/src/main.rs b/node-template/src/main.rs index 53845ddd087b84ddb8bf654caeee7f9e44e13855..5418453a022cac246e767dbda5c031b9b201836c 100644 --- a/node-template/src/main.rs +++ b/node-template/src/main.rs @@ -9,7 +9,7 @@ mod cli; pub use substrate_cli::{VersionInfo, IntoExit, error}; -fn run() -> cli::error::Result<()> { +fn main() { let version = VersionInfo { name: "Substrate Node", commit: env!("VERGEN_SHA_SHORT"), @@ -19,7 +19,9 @@ fn run() -> cli::error::Result<()> { description: "Template Node", support_url: "support.anonymous.an", }; - cli::run(::std::env::args(), cli::Exit, version) -} -error_chain::quick_main!(run); + if let Err(e) = cli::run(::std::env::args(), cli::Exit, version) { + eprintln!("Error starting the node: {}\n\n{:?}", e, e); + std::process::exit(1) + } +} diff --git a/node-template/src/service.rs b/node-template/src/service.rs index 2a4980688f8a7f6b48a9b04461f9e4e36d4d89d5..1de7bb47675242df4a45a84b9eaf56b4f40f2b47 100644 --- a/node-template/src/service.rs +++ b/node-template/src/service.rs @@ -10,9 +10,11 @@ use substrate_service::{ FactoryFullConfiguration, LightComponents, FullComponents, FullBackend, FullClient, LightClient, LightBackend, FullExecutor, LightExecutor, TaskExecutor, + error::{Error as ServiceError}, }; use basic_authorship::ProposerFactory; -use consensus::{import_queue, start_aura, AuraImportQueue, SlotDuration, NothingExtra}; +use consensus::{import_queue, start_aura, AuraImportQueue, SlotDuration}; +use futures::prelude::*; use substrate_client::{self as client, LongestChain}; use primitives::{ed25519::Pair, Pair as PairT}; use inherents::InherentDataProviders; @@ -45,10 +47,18 @@ construct_service_factory! { RuntimeApi = RuntimeApi, NetworkProtocol = NodeProtocol { |config| Ok(NodeProtocol::new()) }, RuntimeDispatch = Executor, - FullTransactionPoolApi = transaction_pool::ChainApi, FullExecutor, Block, RuntimeApi>, Block> - { |config, client| Ok(TransactionPool::new(config, transaction_pool::ChainApi::new(client))) }, - LightTransactionPoolApi = transaction_pool::ChainApi, LightExecutor, Block, RuntimeApi>, Block> - { |config, client| Ok(TransactionPool::new(config, transaction_pool::ChainApi::new(client))) }, + FullTransactionPoolApi = transaction_pool::ChainApi< + client::Client, FullExecutor, Block, RuntimeApi>, + Block + > { + |config, client| Ok(TransactionPool::new(config, transaction_pool::ChainApi::new(client))) + }, + LightTransactionPoolApi = transaction_pool::ChainApi< + client::Client, LightExecutor, Block, RuntimeApi>, + Block + > { + |config, client| Ok(TransactionPool::new(config, transaction_pool::ChainApi::new(client))) + }, Genesis = GenesisConfig, Configuration = NodeConfig, FullService = FullComponents @@ -62,21 +72,22 @@ construct_service_factory! { let proposer = Arc::new(ProposerFactory { client: service.client(), transaction_pool: service.transaction_pool(), - inherents_pool: service.inherents_pool(), }); let client = service.client(); - executor.spawn(start_aura( + let select_chain = service.select_chain() + .ok_or_else(|| ServiceError::SelectChainRequired)?; + let aura = start_aura( SlotDuration::get_or_compute(&*client)?, key.clone(), client.clone(), - service.select_chain(), + select_chain, client, proposer, service.network(), - service.on_exit(), service.config.custom.inherent_data_providers.clone(), service.config.force_authoring, - )?); + )?; + executor.spawn(aura.select(service.on_exit()).then(|_| Ok(()))); } Ok(service) @@ -88,12 +99,13 @@ construct_service_factory! { Self::Block, > { |config: &mut FactoryFullConfiguration , client: Arc>, _select_chain: Self::SelectChain| { - import_queue::<_, _, _, Pair>( + import_queue::<_, _, Pair>( SlotDuration::get_or_compute(&*client)?, client.clone(), None, + None, + None, client, - NothingExtra, config.custom.inherent_data_providers.clone(), ).map_err(Into::into) } @@ -102,23 +114,25 @@ construct_service_factory! { Self::Block, > { |config: &mut FactoryFullConfiguration, client: Arc>| { - import_queue::<_, _, _, Pair>( + import_queue::<_, _, Pair>( SlotDuration::get_or_compute(&*client)?, client.clone(), None, + None, + None, client, - NothingExtra, config.custom.inherent_data_providers.clone(), ).map_err(Into::into) } }, SelectChain = LongestChain, Self::Block> { |config: &FactoryFullConfiguration, client: Arc>| { - Ok(LongestChain::new( - client.backend().clone(), - client.import_lock() - )) + #[allow(deprecated)] + Ok(LongestChain::new(client.backend().clone())) } }, + FinalityProofProvider = { |_client: Arc>| { + Ok(None) + }}, } } diff --git a/node/cli/Cargo.toml b/node/cli/Cargo.toml index 38cf49c35f7ba074b21c7740cd3fc6acde887d81..14a5b5c32d10bdb5254243d5ae1b50b6eaceca81 100644 --- a/node/cli/Cargo.toml +++ b/node/cli/Cargo.toml @@ -27,11 +27,20 @@ network = { package = "substrate-network", path = "../../core/network" } consensus = { package = "substrate-consensus-aura", path = "../../core/consensus/aura" } grandpa = { package = "substrate-finality-grandpa", path = "../../core/finality-grandpa" } sr-primitives = { path = "../../core/sr-primitives" } +aura_primitives = { package = "substrate-consensus-aura-primitives", path = "../../core/consensus/aura/primitives" } node-executor = { path = "../executor" } substrate-keystore = { path = "../../core/keystore" } substrate-telemetry = { package = "substrate-telemetry", path = "../../core/telemetry" } +structopt = "0.2" +transaction-factory = { path = "../../test-utils/transaction-factory" } +keyring = { package = "substrate-keyring", path = "../../core/keyring" } +indices = { package = "srml-indices", path = "../../srml/indices" } +timestamp = { package = "srml-timestamp", path = "../../srml/timestamp", default-features = false } +rand = "0.6" +finality_tracker = { package = "srml-finality-tracker", path = "../../srml/finality-tracker", default-features = false } [dev-dependencies] +consensus-common = { package = "substrate-consensus-common", path = "../../core/consensus/common" } service-test = { package = "substrate-service-test", path = "../../core/service/test" } [build-dependencies] diff --git a/node/cli/res/emberic-elm.json b/node/cli/res/emberic-elm.json deleted file mode 100644 index 84b537744b2b48d258a08b1c362479736c6211f9..0000000000000000000000000000000000000000 --- a/node/cli/res/emberic-elm.json +++ /dev/null @@ -1,132 +0,0 @@ -{ - "name": "Emberic Elm", - "id": "emberic-elm", - "properties": { - "tokenDecimals": 15, - "tokenSymbol": "EAN" - }, - "bootNodes": [ - "/ip4/104.211.54.233/tcp/30333/p2p/QmWxNqJeKEBWjJXeX8s882ZdphuVPgUV43THfGAJn7UBWB", - "/ip4/104.211.48.51/tcp/30333/p2p/QmXd7MQAuXkQK1r3ejSbaXKgjXmT2FvbJ3yNfLZpsQ2t8S", - "/ip4/104.211.48.247/tcp/30333/p2p/QmV2zjgFRfxbgYZQC9qFr4aHsQt7tDBJRAdgqqxqTq1Kta", - "/ip4/40.114.120.164/tcp/30333/p2p/QmQbPCeurXuKhzCw6Ar6ovizNKATMTnkkqFJKgZzbF2MJs" - ], - "telemetryEndpoints": [ - ["wss://telemetry.polkadot.io/submit/", 0] - ], - "protocolId": null, - "consensusEngine": null, - "genesis": { - "raw": { - "0x5ed99fb359fb6799d57fe4ff8cae9d05": "0x00", - "0xb9b861cab4bbce870c811515bd5f33d7": "0x00", - "0x927154b0e6cda82b9a0b44e489a8a9ae": "0x1be80f2d4513a1fbe0e5163874f729baa5498486ac3914ac3fe2e1817d7b3f44", - "0x6e45a8645fa8f905c49fecfef3d06c67": "0x01000000", - "0x0e0cdac0d4de97c54f3ae216b003fa81": "0x5802000000000000", - "0x24b2518f9a9ee24ab0b62346d83d90b0": "0x11080000", - "0xf4039aa8ae697861be900c58239e96f7": "0x0010a5d4e80000000000000000000000", - "0x799192c17c5cc562d709af11ace92e6a": "0x00040000", - "0x579ab55d37b1220812be3c3df29d4858": "0x0000000000000000", - "0x9a407c6bb9914a308de7006093089b76": "0x0f0000c16ff286230f0000c16ff2862300", - "0x040ff70c23416b89ce6afb75ee0d362e": "0x00000000", - "0xb7b6ec0f25eb1ed8b91d05f697d7a874": "0x0c00000000000000", - "0x24586f4898a5a637b755b658ec163d00": "0x00407a10f35a00000000000000000000", - "0x3a617574683a03000000": "0xf54d9f5ed217ce07c0c5faa5277a0356f8bfd884d201f9d2c9e171568e1bf077", - "0xd368b9d9bb1cc910c9a2b8e5d0f5f2fc": "0x0000c16ff28623000000000000000000", - "0x90e2849b965314409e8bc00011f3004f": "0x04000000", - "0xabe32953315ab8fe7b2b925eba5f4c80": "0x00e40b54020000000000000000000000", - "0xdfaac108e0d4bc78fc9419a7fcfa84dc": "0x102a32622a5da54a80dc704a05f2d761c96d4748beedd83f61ca20a90f4a257678f06dd616c75cc4b2b01f325accf79b4f66a525ede0a59f48dcce2322b8798f5ceacb8edf6b05cb909a3d2bd8c6bffb13be3069ec6a69f1fa25e46103c5190267f0fae46aeb1a7ce8ca65f2bf885d09cd7f525bc00e9f6e73b5ea74402a2c4c19", - "0x3b7d32346a3315a351084927a27d06a7": "0x0010a5d4e80000000000000000000000", - "0x9651d20f401bfac47731a01d6eba33b4": "0x00000000", - "0x125dc846383907f5846f72ce53ca0e4b": "0x00ca9a3b000000000000000000000000", - "0x0e4944cfd98d6f4cc374d16f5a4e3f9c": "0x0000000000000000", - "0x22bc8c154e4b317f5495a906caaf444e": "0x00", - "0x934302c5ec4cb4f73a395e2184ab0aa6": "0x00e40b54020000000000000000000000", - "0xa902f1f0ef97177b8df9f9fd413768e7": "0x00000000", - "0x3a6772616e6470613a617574683a6c656e": "0x04000000", - "0xb6d5bfd5d8d92f0f212a8c22535c9214": "0x0000c16ff28623000000000000000000", - "0xeed97a85a4f02a96fae3fc6210ec53f6": "0x0c000001fe6211db8bd436e0d1cf37398eac655833fb47497e0f72ec00ab160c88966b7e", - "0x27b3872d47181b4a2dc15f0da43e7026": "0xe803000000000000", - "0xfc2dc4b8bb0b9ca8f01a73a726f7c7f5": "0x00e1000000000000", - "0xe026dd082e3158e72eb7c985fc8bac4f": "0x4038000000000000", - "0xc81a21733684a8047e9d810d78a8b9db": "0x0f0000c16ff286230f0000c16ff2862300", - "0x74d5dca6735bab024bc25136daaab7c0": "0x06", - "0x637414312dac3b280120bf15b4f66cee": "0x00000000", - "0xf718f07ec955fb94f1b3069713461089": "0x0010a5d4e80000000000000000000000", - "0x37c05deaa240e0691daf4dea41c3b5c3": "0x0c0001fe6211db8bd436e0d1cf37398eac655833fb47497e0f72ec00ab160c88966b7e0172b52eb36f57b4bae756e4f064cf2e97df80d5f9c2f06ff31206a9be8c7b371c", - "0x52b963fbdb3d6e1b03808fc20071f07f": "0x0027060000000000", - "0xdd9b01f8462dc19488279cb351a6d861": "0x20a10700", - "0x23df389ad0a7bab6ab6b2a35f0f02952": "0x0c00012254035a15597c1c19968be71593d2d0131e18ae90049e49178970f583ac3e1700", - "0x78152ea7013ebe91392b425506c10074": "0x00", - "0x62f532424b7b1c52f522857315040f27": "0x00407a10f35a00000000000000000000", - "0xd437fe93b0bd0a5d67d30d85d010edc2": "0x40420f00", - "0xe532791382a63a9bd48f2bc7fba9907d": "0xe29624233b2cba342750217aa1883f6ec624134dd306efd230a988e5cb37d9ed", - "0x93940e78496482b15b64783020bbdfa0": "0x6400000000000000", - "0x7e6064dc0e78ffebb59b3053826a9467": "0x10f0fae46aeb1a7ce8ca65f2bf885d09cd7f525bc00e9f6e73b5ea74402a2c4c19eacb8edf6b05cb909a3d2bd8c6bffb13be3069ec6a69f1fa25e46103c5190267f06dd616c75cc4b2b01f325accf79b4f66a525ede0a59f48dcce2322b8798f5c2a32622a5da54a80dc704a05f2d761c96d4748beedd83f61ca20a90f4a257678", - "0xf29d830d1e349e75cb09cc309ff99cae": "0x00", - "0x59b17352bea17cb7dec6dde697de7db4": "0x6400000000000000", - "0x90d5871cf3f4d0a3642cf2043a7d8eda": "0x0010a5d4e80000000000000000000000", - "0x717a2ee9c64ad3424e10e4461ec08296": "0x000000000100000000000000010000000000000001000000000000000100000000000000010000000000000001000000000000000000010010000000", - "0xd7ec675c9803761fed320c891f024816": "0x047374616b696e67200000c16ff28623000000000000000000ffffffffffffffff0f", - "0x982a35fc0ccb86c71c5868d1ab9a8f24": "0xf54d9f5ed217ce07c0c5faa5277a0356f8bfd884d201f9d2c9e171568e1bf077", - "0xd94712e4e93059160b019777f1d514c8": "0xf06dd616c75cc4b2b01f325accf79b4f66a525ede0a59f48dcce2322b8798f5c", - "0x8366297e853b97a38cca0f62019a717b": "0x00000000000000000000000000000000", - "0x6049593ee984e2e3142d968450c2499b": "0x0f0000c16ff286230f0000c16ff2862300", - "0x472b8f236d06a2ff7f1e9b2e848ef1d5": "0x0080e03779c311000000000000000000", - "0x2dce29f1a768624dc5343063cb77f77d": "0x07000000", - "0x6de9a38a396b5f99e5c455561e72b48e": "0xe19b6b89729a41638e57dead9c993425287d386fa4963306b63f018732843495", - "0xdeb7eb5c65480ddd073a5bfafed0754f": "0x60779817899466dbd476a0bc3a38cc64b7774d5fb646c3d291684171e67a07430f0000c16ff286230f0000c16ff2862300", - "0xb12f6ccdb8b9fdf64c98783becc0b82e": "0x72b52eb36f57b4bae756e4f064cf2e97df80d5f9c2f06ff31206a9be8c7b371c0f0000c16ff286230f0000c16ff2862300", - "0x64873b9e6ab89b1f892a7a42d405d8ad": "0xf0fae46aeb1a7ce8ca65f2bf885d09cd7f525bc00e9f6e73b5ea74402a2c4c19", - "0x3a617574683a02000000": "0x1be80f2d4513a1fbe0e5163874f729baa5498486ac3914ac3fe2e1817d7b3f44", - "0x7935e46f94f24b82716c0142e2271de9": "0x8070000000000000", - "0x677198f01757ddfcb0e33c9de27bdcce": "0x0c000160779817899466dbd476a0bc3a38cc64b7774d5fb646c3d291684171e67a0743012254035a15597c1c19968be71593d2d0131e18ae90049e49178970f583ac3e17", - "0x730e605a7019f66c4bc5df70178f2bb2": "0x047374616b696e67200000c16ff28623000000000000000000ffffffffffffffff0f", - "0xb8f48a8c01f629d6dc877f64892bed49": "0x0000000000000000", - "0x4664fb5d4e16f894df23cadb3faaa9a6": "0x04000000", - "0xfbb77d814ac81cfe0ef7030e8bd686f0": "0xe803000000000000", - "0x52c9048efbfc40fd1e312b7bed451dee": "0x06000000", - "0xa62601bb840b2ee9ae90cbc8aefa0d01": "0x60779817899466dbd476a0bc3a38cc64b7774d5fb646c3d291684171e67a0743", - "0x3a617574683a00000000": "0xe29624233b2cba342750217aa1883f6ec624134dd306efd230a988e5cb37d9ed", - "0xdee5bbb035d9ebc2c9338b5aedf744d7": "0x4038000000000000", - "0x3a617574683a6c656e": "0x04000000", - "0xde7e6f7637ad906002e911eae3e49f75": "0x0f0000c16ff286230f0000c16ff2862300", - "0xa36baa0f89eff09b2facf282f27a11ba": "0x50c30000", - "0xd543ad6ee4446bf5bcf48867fe340f36": "0xfe6211db8bd436e0d1cf37398eac655833fb47497e0f72ec00ab160c88966b7e0f0000c16ff286230f0000c16ff2862300", - "0x2ec6e5652282d579398fb8fdfa531ef6": "0x0000000000000000", - "0x0c5cbeca89340ea96c6f8fe1442df463": "0x0010a5d4e80000000000000000000000", - "0xf541ffd8c90d7124a5298d6c1e2c0d40": "0x0300000000000000", - "0x7c1f36e9b2a83a7f2b42d97ec0f18d9c": "0x14c224ccba63292331623bbf06a55f46607824c2580071a80a17c53cab2f999e2f72b52eb36f57b4bae756e4f064cf2e97df80d5f9c2f06ff31206a9be8c7b371c2254035a15597c1c19968be71593d2d0131e18ae90049e49178970f583ac3e17fe6211db8bd436e0d1cf37398eac655833fb47497e0f72ec00ab160c88966b7e60779817899466dbd476a0bc3a38cc64b7774d5fb646c3d291684171e67a0743", - "0x2b89d3b6f46fc8a3aee48c9cb06d7670": "0x0010a5d4e80000000000000000000000", - "0xf14d23a9d4492a1efc9194e257b3c3d9": "0x00000000", - "0x1b4b2c8255b431edbbb5a4f5c7dcde69": "0x0010a5d4e80000000000000000000000", - "0xb5195c66899fef96507f9d63b7bb38d4": "0x0000a0dec5adc9353600000000000000", - "0x50a63a871aced22e88ee6466fe5aa5d9": "0xc224ccba63292331623bbf06a55f46607824c2580071a80a17c53cab2f999e2f", - "0x3a6772616e6470613a617574683a02000000": "0x1be80f2d4513a1fbe0e5163874f729baa5498486ac3914ac3fe2e1817d7b3f440100000000000000", - "0xd9c94b41dc87728ebf0a966d2e9ad9c0": "0x3200000000000000", - "0xd2f07efec1d302ff1a26581135e0298f": "0x047374616b696e67200000c16ff28623000000000000000000ffffffffffffffff0f", - "0xeb0e8ce72fcdefef3a57c7f513a8472b": "0x2254035a15597c1c19968be71593d2d0131e18ae90049e49178970f583ac3e170f0000c16ff286230f0000c16ff2862300", - "0x0a48d3d36ccd781f6e9e46530a158883": "0x0000c16ff28623000000000000000000", - "0xa8faca54f39771f71efa0e9f698ae52e": "0x0000c16ff28623000000000000000000", - "0xea711aaf3497563884c33630127d71ff": "0x0000c16ff28623000000000000000000", - "0x4a8b1a5c7681353a6a320553abbbca49": "0x4038000000000000", - "0x3a6772616e6470613a617574683a03000000": "0xf54d9f5ed217ce07c0c5faa5277a0356f8bfd884d201f9d2c9e171568e1bf0770100000000000000", - "0xbb6e9b5b6b8700aea3b8b4eba8b75803": "0x047374616b696e67200000c16ff28623000000000000000000ffffffffffffffff0f", - "0x99e2aba8a2b7c8ccba2d740fb86adb0c": "0x00", - "0x3a617574683a01000000": "0xe19b6b89729a41638e57dead9c993425287d386fa4963306b63f018732843495", - "0x2efe65fb3e5579a8af5f464dc3da63d8": "0xeacb8edf6b05cb909a3d2bd8c6bffb13be3069ec6a69f1fa25e46103c5190267", - "0x3a636f6465": "0x0061736d0100000001ba022a60037f7f7f017f60037f7f7f0060047f7f7f7f0060027f7f0060017f0060067f7f7f7f7f7f0060027f7f017f60057f7f7f7f7f017f60067f7f7f7f7f7f017f60087f7f7f7f7f7f7f7f017f60047f7f7f7f017f60047f7f7e7f017f60077f7f7f7f7f7f7f017f60017e0060017f017f60000060057f7f7f7f7f0060037f7e7f0060087f7f7e7e7f7f7f7f0060087f7f7f7f7f7e7e7f0060087f7f7f7f7f7f7f7f0060057f7f7f7e7e0060047f7f7e7e0060097f7f7f7e7e7f7f7f7f0060047f7f7f7f017e60017f017e60027e7f0060037f7e7e0060057f7e7f7f7e0060037f7f7e0060047f7e7e7e0060027e7e0060027f7e0060067f7f7e7e7e7f0060037e7f7f0060077f7e7e7e7e7e7e0060057f7f7e7e7f0060037e7f7f017f60027f7f017e60057f7e7e7e7e0060047f7e7e7f0060067f7e7e7e7e7f0002d3051b03656e760e6578745f626c616b65325f323536000103656e760c6578745f74776f785f313238000103656e76146578745f6765745f73746f726167655f696e746f000703656e760f6578745f7365745f73746f72616765000203656e76166578745f73616e64626f785f6d656d6f72795f6e6577000603656e761b6578745f73616e64626f785f6d656d6f72795f74656172646f776e000403656e76176578745f73616e64626f785f696e7374616e7469617465000803656e76126578745f73616e64626f785f696e766f6b65000903656e761d6578745f73616e64626f785f696e7374616e63655f74656172646f776e000403656e76116578745f636c6561725f73746f72616765000303656e760e6578745f7072696e745f75746638000303656e76126578745f737232353531395f766572696679000a03656e76126578745f656432353531395f766572696679000a03656e76106578745f73746f726167655f726f6f74000403656e76186578745f73746f726167655f6368616e6765735f726f6f74000b03656e76166578745f6b696c6c5f6368696c645f73746f72616765000303656e76166578745f73616e64626f785f6d656d6f72795f676574000a03656e76166578745f73616e64626f785f6d656d6f72795f736574000a03656e760d6578745f7072696e745f686578000303656e761f6578745f6765745f616c6c6f63617465645f6368696c645f73746f72616765000703656e761a6578745f6765745f6368696c645f73746f726167655f696e746f000c03656e76176578745f636c6561725f6368696c645f73746f72616765000203656e76156578745f7365745f6368696c645f73746f72616765000503656e76236578745f626c616b65325f3235365f656e756d6572617465645f747269655f726f6f74000203656e760d6578745f7072696e745f6e756d000d03656e760a6578745f6d616c6c6f63000e03656e76086578745f66726565000403bd03bb03010104000e030f1001110303060303030304010f120106040313011403030303040415160f041702030304030306030e010101030101100101010303010303030303030303030303000202020202020202020202020202020202020202180e03010f030103040104040404020319060104040d04011a0303031b1c03030d03030e101d031604030303030401031e0303041f20032003030304030303030403030404040303030303030e0303030f01030216030603210322030303030403040f040304231e04031b010404041b04030303160416162403161f01040605020f040304040303030303030303030302060625080601020103030201032626030301060626260f2603010303032626260303032626262626262603262603030303030303040404030404040404040125030303010e0304040403010503030301010404040404040303010604040403011d03030e0402000f030303060303030303040403040303030303030103031603040101040404040404040404040404040404040403030303030303030d01040404040403010306010601030301010401030304030e04000e000f0604000606190a06060600000000272728282904070170019001900105030100120619037f01418080c0000b7f0041f0c0c4000b7f0041f0c0c4000b07be0415066d656d6f72790200195f5f696e6469726563745f66756e6374696f6e5f7461626c6501000b5f5f686561705f6261736503010a5f5f646174615f656e6403020c436f72655f76657273696f6e00960212436f72655f657865637574655f626c6f636b00970215436f72655f696e697469616c697a655f626c6f636b009d0210436f72655f617574686f726974696573009e02114d657461646174615f6d6574616461746100a0021c426c6f636b4275696c6465725f6170706c795f65787472696e73696300a6021b426c6f636b4275696c6465725f66696e616c697a655f626c6f636b00a70220426c6f636b4275696c6465725f696e686572656e745f65787472696e7369637300a8021c426c6f636b4275696c6465725f636865636b5f696e686572656e747300ac0218426c6f636b4275696c6465725f72616e646f6d5f7365656400ad022b5461676765645472616e73616374696f6e51756575655f76616c69646174655f7472616e73616374696f6e00ae02214f6666636861696e576f726b65724170695f6f6666636861696e5f776f726b657200af02214772616e6470614170695f6772616e6470615f70656e64696e675f6368616e676500b002204772616e6470614170695f6772616e6470615f666f726365645f6368616e676500b1021e4772616e6470614170695f6772616e6470615f617574686f72697469657300b20215417572614170695f736c6f745f6475726174696f6e00b4021a417574686f7269746965734170695f617574686f72697469657300b502098c02010041010b8f0127b1036465666768696a6b6c6d6e6f707172737475767778ce01f601af038a029b02e3028d0289029c02ca03cb03f402cc03c303ab03d402d802d302d50240f70130d90237ac03fe01e9019d038003ff01bf01be01dc0184028302820281028002c002d202e002830382038103ff02fe028903ea0285038a03d901db018c038d03c502c602c402840185018301e502e602e4028e03e601e801e0018f03db02dc02da029003fb02fd02fa029103bc01bd01bb019203fc01fd01fa019303be02bf02bd029403a903aa03a8039503b801c202c302c1029603de02df02dd029703980399039a039b03d002d102cf029c03a303a203a103a0039f039e03c403c503c603c703c8030ad5c532bb03c404020d7f017e230041c0006b22032400200128020022042001280208220541047422066a2107200128020421080240024002400240024002402005450d00200341306a41017221094100210a200341306a41026a210b200341206a410172220c41076a210d0340200b2004200a6a220141036a2d00003a00002003200141016a2f00003b013020012d0000220e41ac01460d022003410c6a41026a220f200b2d00003a0000200320032f01303b010c200141046a2902002110200341306a410c6a2001410c6a280200360200200920032f010c3b0000200941026a200f2d00003a00002003200e3a003020032010370234200341206a200341306a2002101c2003200c2900003703102003200d29000037001720032d0020220e411a470d052006200a41106a220a470d000c040b0b200422012007470d010c020b200141106a22012007460d010b03400240024020012d0000220a4109460d00200a41ac01470d010c030b200141086a28020041ffffffff0371450d00200141046a280200101d0b200141106a22012007470d000b0b02402008450d002004101d0b2000411a3a00000c010b200020032903103700012000200e3a0000200041086a20032900173700000240200541047441706a200a460d00200141186a2101034002400240200141786a220a2d0000220b4109460d00200b41ac01470d010c030b200128020041ffffffff0371450d002001417c6a280200101d0b200141106a2101200a41106a2007470d000b0b2008450d002004101d200341c0006a24000f0b200341c0006a24000bd0ec0203077f017e037f230041106b2203240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d0000417f6a220441aa014b0d000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040eab01000b1c1001ab01a801aa01a401240d14a90104151b9b01541e2555063607a201890173279201a101a70135090f8a013a9e01a50105023b44754c74578e01030a47177a7c4285017926297b8b01080e282f1319950197012399019d01a6015ea301189c01611f5d129f01a00121930177760c1145482b1698011d6332940191018c012c1a379a013d2a674d5868644e8001437f318d0188012e8f019601204941309001723e228101624b7d86012d34333940705f6f84018301388701515282017869657e6c603c563f6a4f466d506e5a6b664a59535b5c000b200241086a2802002002410c6a2802002204470dcf01200441016a22052004490dfe0720044101742206200520052006491b22064100480dfe072004450d9f03200241046a28020020042006101e2205450da0030c8e080b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dfd0720044101742206200520052006491b22064100480dfd072004450dd602200241046a28020020042006101e2205450dd7020c8b080b200241046a2107200141086a2802002106200141046a2802002105200241086a2802002002410c6a2802002204470daa01200441016a22082004490d870820044101742209200820082009491b22084100480d87082004450dd702200728020020042008101e2209450dd8020c85080b200241046a2105200141086a290300210a200241086a2802002002410c6a2802002204470daa01200441016a22062004490d860820044101742208200620062008491b22084100480d86082004450dd802200528020020042008101e2206450dd9020c82080b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dfa0720044101742206200520052006491b22064100480dfa072004450dd902200241046a28020020042006101e2205450dda020cff070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490d840820044101742209200820082009491b22084100480d84082004450dda02200728020020042008101e2209450ddb020cfc070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490df80720044101742209200820082009491b22084100480df8072004450ddb02200728020020042008101e2209450ddc020cf6070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490df70720044101742209200820082009491b22084100480df7072004450ddc02200728020020042008101e2209450ddd020cf3070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d810820044101742206200520052006491b22064100480d81082004450ddd02200241046a28020020042006101e2205450dde020cf0070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490df50720044101742209200820082009491b22084100480df5072004450dde02200728020020042008101e2209450ddf020ced070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dff0720044101742206200520052006491b22064100480dff072004450ddf02200241046a28020020042006101e2205450de0020cea070b200241046a210520012d00012108200241086a2802002002410c6a2802002204470daa01200441016a22062004490df30720044101742209200620062009491b22094100480df3072004450de002200528020020042009101e2206450de1020ce7070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490da30520044101742206200520052006491b22064100480da3052004450de102200241046a28020020042006101e2205450de2020ce4070b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470daa01200641016a22052006490df10720064101742208200520052008491b22054100480df1072006450de202200728020020062005101e2208450de3020ce1070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dfb0720044101742206200520052006491b22064100480dfb072004450de302200241046a28020020042006101e2205450de4020cde070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490dfa0720044101742209200820082009491b22084100480dfa072004450de402200728020020042008101e2209450de5020cdb070b200241046a210520012d00012108200241086a2802002002410c6a2802002204470daa01200441016a22062004490dee0720044101742209200620062009491b22094100480dee072004450de502200528020020042009101e2206450de6020cd8070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d9e0520044101742206200520052006491b22064100480d9e052004450de602200241046a28020020042006101e2205450de7020cd5070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df70720044101742206200520052006491b22064100480df7072004450de702200241046a28020020042006101e2205450de8020cd2070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df60720044101742206200520052006491b22064100480df6072004450de802200241046a28020020042006101e2205450de9020ccf070b200241046a210b200141046a280200210520012d0001210c200241086a2802002002410c6a2802002204470daa01200441016a22062004490dea0720044101742208200620062008491b22064100480dea072004450de902200b28020020042006101e2208450dea020ccc070b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470daa01200641016a22052006490de90720064101742208200520052008491b22054100480de9072006450dea02200728020020062005101e2208450deb020cc9070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d990520044101742206200520052006491b22064100480d99052004450deb02200241046a28020020042006101e2205450dec020cc6070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df20720044101742206200520052006491b22064100480df2072004450dec02200241046a28020020042006101e2205450ded020cc3070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df10720044101742206200520052006491b22064100480df1072004450ded02200241046a28020020042006101e2205450dee020cc0070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df00720044101742206200520052006491b22064100480df0072004450dee02200241046a28020020042006101e2205450def020cbd070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d950520044101742206200520052006491b22064100480d95052004450def02200241046a28020020042006101e2205450df0020cba070b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470daa01200641016a22052006490de30720064101742208200520052008491b22054100480de3072006450df002200728020020062005101e2208450df1020cb7070b200241046a210520012d00012108200241086a2802002002410c6a2802002204470daa01200441016a22062004490de20720044101742209200620062009491b22094100480de2072004450df102200528020020042009101e2206450df2020cb4070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d920520044101742206200520052006491b22064100480d92052004450df202200241046a28020020042006101e2205450df3020cb1070b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470daa01200641016a22052006490de00720064101742208200520052008491b22054100480de0072006450df302200728020020062005101e2208450df4020cae070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dea0720044101742206200520052006491b22064100480dea072004450df402200241046a28020020042006101e2205450df5020cab070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d8f0520044101742206200520052006491b22064100480d8f052004450df502200241046a28020020042006101e2205450df6020ca8070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490de80720044101742206200520052006491b22064100480de8072004450df602200241046a28020020042006101e2205450df7020ca5070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d8d0520044101742206200520052006491b22064100480d8d052004450df702200241046a28020020042006101e2205450df8020ca2070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490de60720044101742206200520052006491b22064100480de6072004450df802200241046a28020020042006101e2205450df9020c9f070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dda0720044101742206200520052006491b22064100480dda072004450df902200241046a28020020042006101e2205450dfa020c9c070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dd90720044101742209200820082009491b22084100480dd9072004450dfc02200728020020042008101e2209450dfd020c99070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de30720044101742206200520052006491b22064100480de3072004450dfd02200241046a28020020042006101e2205450dfe020c96070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dd70720044101742209200820082009491b22084100480dd7072004450dfe02200728020020042008101e2209450dff020c93070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de10720044101742206200520052006491b22064100480de1072004450dff02200241046a28020020042006101e2205450d80030c90070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de00720044101742206200520052006491b22064100480de0072004450d8003200241046a28020020042006101e2205450d81030c8d070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d850520044101742206200520052006491b22064100480d85052004450d8103200241046a28020020042006101e2205450d82030c8a070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d840520044101742206200520052006491b22064100480d84052004450d8203200241046a28020020042006101e2205450d83030c87070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d830520044101742206200520052006491b22064100480d83052004450d8303200241046a28020020042006101e2205450d84030c84070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d820520044101742206200520052006491b22064100480d82052004450d8403200241046a28020020042006101e2205450d85030c81070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d810520044101742206200520052006491b22064100480d81052004450d8503200241046a28020020042006101e2205450d86030cfe060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dda0720044101742206200520052006491b22064100480dda072004450d8603200241046a28020020042006101e2205450d87030cfb060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dff0420044101742206200520052006491b22064100480dff042004450d8703200241046a28020020042006101e2205450d88030cf8060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfe0420044101742206200520052006491b22064100480dfe042004450d8803200241046a28020020042006101e2205450d89030cf5060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfd0420044101742206200520052006491b22064100480dfd042004450d8903200241046a28020020042006101e2205450d8a030cf2060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfc0420044101742206200520052006491b22064100480dfc042004450d8a03200241046a28020020042006101e2205450d8b030cef060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfb0420044101742206200520052006491b22064100480dfb042004450d8b03200241046a28020020042006101e2205450d8c030cec060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dc90720044101742209200820082009491b22084100480dc9072004450d8c03200728020020042008101e2209450d8d030ce9060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dc80720044101742209200820082009491b22084100480dc8072004450d8d03200728020020042008101e2209450d8e030ce6060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df80420044101742206200520052006491b22064100480df8042004450d8e03200241046a28020020042006101e2205450d8f030ce3060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df70420044101742206200520052006491b22064100480df7042004450d8f03200241046a28020020042006101e2205450d90030ce0060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df60420044101742206200520052006491b22064100480df6042004450d9003200241046a28020020042006101e2205450d91030cdd060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dcf0720044101742209200820082009491b22084100480dcf072004450d9103200728020020042008101e2209450d92030cda060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dce0720044101742209200820082009491b22084100480dce072004450d9203200728020020042008101e2209450d93030cd7060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df30420044101742206200520052006491b22064100480df3042004450d9303200241046a28020020042006101e2205450d94030cd4060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df20420044101742206200520052006491b22064100480df2042004450d9403200241046a28020020042006101e2205450d95030cd1060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df10420044101742206200520052006491b22064100480df1042004450d9503200241046a28020020042006101e2205450d96030cce060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df00420044101742206200520052006491b22064100480df0042004450d9603200241046a28020020042006101e2205450d97030ccb060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490def0420044101742206200520052006491b22064100480def042004450d9703200241046a28020020042006101e2205450d98030cc8060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dee0420044101742206200520052006491b22064100480dee042004450d9803200241046a28020020042006101e2205450d99030cc5060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc70720044101742206200520052006491b22064100480dc7072004450d9903200241046a28020020042006101e2205450d9a030cc2060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dec0420044101742206200520052006491b22064100480dec042004450d9a03200241046a28020020042006101e2205450d9b030cbf060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dc50720044101742209200820082009491b22084100480dc5072004450d9b03200728020020042008101e2209450d9c030cbc060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dea0420044101742206200520052006491b22064100480dea042004450d9c03200241046a28020020042006101e2205450d9d030cb9060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dea0420044101742206200520052006491b22064100480dea042004450d9d03200241046a28020020042006101e2205450d9e030cb6060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc20720044101742206200520052006491b22064100480dc2072004450d9e03200241046a28020020042006101e2205450d9f030cb3060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de70420044101742206200520052006491b22064100480de7042004450d9f03200241046a28020020042006101e2205450da0030cb0060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de60420044101742206200520052006491b22064100480de6042004450da003200241046a28020020042006101e2205450da1030cad060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de60420044101742206200520052006491b22064100480de6042004450da103200241046a28020020042006101e2205450da2030caa060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de40420044101742206200520052006491b22064100480de4042004450da203200241046a28020020042006101e2205450da3030ca7060b200241046a210520012d00012108200241086a2802002002410c6a2802002204470dab01200441016a22062004490dbd0720044101742209200620062009491b22094100480dbd072004450da303200528020020042009101e2206450da4030ca4060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de20420044101742206200520052006491b22064100480de2042004450da403200241046a28020020042006101e2205450da5030ca1060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de10420044101742206200520052006491b22064100480de1042004450da503200241046a28020020042006101e2205450da6030c9e060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de00420044101742206200520052006491b22064100480de0042004450da603200241046a28020020042006101e2205450da7030c9b060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de00420044101742206200520052006491b22064100480de0042004450da703200241046a28020020042006101e2205450da8030c98060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dde0420044101742206200520052006491b22064100480dde042004450da803200241046a28020020042006101e2205450da9030c95060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490ddd0420044101742206200520052006491b22064100480ddd042004450da903200241046a28020020042006101e2205450daa030c92060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490ddd0420044101742206200520052006491b22064100480ddd042004450daa03200241046a28020020042006101e2205450dab030c8f060b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470dab01200641016a22052006490daa0720064101742208200520052008491b22054100480daa072006450dab03200728020020062005101e2208450dac030c8c060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490da90720044101742209200820082009491b22084100480da9072004450dac03200728020020042008101e2209450dad030c89060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd90420044101742206200520052006491b22064100480dd9042004450dad03200241046a28020020042006101e2205450dae030c86060b200141086a290300210a200241086a2802002002410c6a2802002204470dab01200441016a22052004490db20720044101742206200520052006491b22064100480db2072004450dae03200241046a28020020042006101e2205450daf030c82060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd70420044101742206200520052006491b22064100480dd7042004450daf03200241046a28020020042006101e2205450db0030cff050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd70420044101742206200520052006491b22064100480dd7042004450db003200241046a28020020042006101e2205450db1030cfc050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd60420044101742206200520052006491b22064100480dd6042004450db103200241046a28020020042006101e2205450db2030cf9050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd50420044101742206200520052006491b22064100480dd5042004450db203200241046a28020020042006101e2205450db3030cf6050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd40420044101742206200520052006491b22064100480dd4042004450db303200241046a28020020042006101e2205450db4030cf3050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dac0720044101742206200520052006491b22064100480dac072004450db403200241046a28020020042006101e2205450db5030cf0050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dab0720044101742206200520052006491b22064100480dab072004450db503200241046a28020020042006101e2205450db6030ced050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd00420044101742206200520052006491b22064100480dd0042004450db603200241046a28020020042006101e2205450db7030cea050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dcf0420044101742206200520052006491b22064100480dcf042004450db703200241046a28020020042006101e2205450db8030ce7050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da80720044101742206200520052006491b22064100480da8072004450db803200241046a28020020042006101e2205450db9030ce4050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dcd0420044101742206200520052006491b22064100480dcd042004450db903200241046a28020020042006101e2205450dba030ce1050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dcc0420044101742206200520052006491b22064100480dcc042004450dba03200241046a28020020042006101e2205450dbb030cde050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dcb0420044101742206200520052006491b22064100480dcb042004450dbb03200241046a28020020042006101e2205450dbc030cdb050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dca0420044101742206200520052006491b22064100480dca042004450dbc03200241046a28020020042006101e2205450dbd030cd8050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dca0420044101742206200520052006491b22064100480dca042004450dbd03200241046a28020020042006101e2205450dbe030cd5050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc80420044101742206200520052006491b22064100480dc8042004450dbe03200241046a28020020042006101e2205450dbf030cd2050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc70420044101742206200520052006491b22064100480dc7042004450dbf03200241046a28020020042006101e2205450dc0030ccf050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc60420044101742206200520052006491b22064100480dc6042004450dc003200241046a28020020042006101e2205450dc1030ccc050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc50420044101742206200520052006491b22064100480dc5042004450dc103200241046a28020020042006101e2205450dc2030cc9050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc50420044101742206200520052006491b22064100480dc5042004450dc203200241046a28020020042006101e2205450dc3030cc6050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc30420044101742206200520052006491b22064100480dc3042004450dc303200241046a28020020042006101e2205450dc4030cc3050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc30420044101742206200520052006491b22064100480dc3042004450dc403200241046a28020020042006101e2205450dc5030cc0050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc20420044101742206200520052006491b22064100480dc2042004450dc503200241046a28020020042006101e2205450dc6030cbd050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc00420044101742206200520052006491b22064100480dc0042004450dc603200241046a28020020042006101e2205450dc7030cba050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dbf0420044101742206200520052006491b22064100480dbf042004450dc703200241046a28020020042006101e2205450dc8030cb7050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d8d0720044101742206200520052006491b22064100480d8d072004450dc803200241046a28020020042006101e2205450dc9030cb4050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dbd0420044101742206200520052006491b22064100480dbd042004450dc903200241046a28020020042006101e2205450dca030cb1050b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490d8b0720044101742209200820082009491b22084100480d8b072004450dca03200728020020042008101e2209450dcb030cae050b200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22052004490d950720044101742208200520052008491b22084100480d95072004450dcb03200241046a28020020042008101e2205450dcc030cab050b200241046a210520012d00012108200241086a2802002002410c6a2802002204470dab01200441016a22062004490d940720044101742209200620062009491b22094100480d94072004450dcc03200528020020042009101e2206450dcd030ca8050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db90420044101742206200520052006491b22064100480db9042004450dcd03200241046a28020020042006101e2205450dce030ca5050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db80420044101742206200520052006491b22064100480db8042004450dce03200241046a28020020042006101e2205450dcf030ca2050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db70420044101742206200520052006491b22064100480db7042004450dcf03200241046a28020020042006101e2205450dd0030c9f050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d900720044101742206200520052006491b22064100480d90072004450dd003200241046a28020020042006101e2205450dd1030c9c050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d8f0720044101742206200520052006491b22064100480d8f072004450dd103200241046a28020020042006101e2205450dd2030c99050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d8e0720044101742206200520052006491b22064100480d8e072004450dd203200241046a28020020042006101e2205450dd3030c96050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d8d0720044101742206200520052006491b22064100480d8d072004450dd303200241046a28020020042006101e2205450dd4030c93050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db20420044101742206200520052006491b22064100480db2042004450dd403200241046a28020020042006101e2205450dd5030c90050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db10420044101742206200520052006491b22064100480db1042004450dd503200241046a28020020042006101e2205450dd6030c8d050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db00420044101742206200520052006491b22064100480db0042004450dd603200241046a28020020042006101e2205450dd7030c8a050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490daf0420044101742206200520052006491b22064100480daf042004450dd703200241046a28020020042006101e2205450dd8030c87050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dae0420044101742206200520052006491b22064100480dae042004450dd803200241046a28020020042006101e2205450dd9030c84050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dad0420044101742206200520052006491b22064100480dad042004450dd903200241046a28020020042006101e2205450dda030c81050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dac0420044101742206200520052006491b22064100480dac042004450dda03200241046a28020020042006101e2205450ddb030cfe040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dab0420044101742206200520052006491b22064100480dab042004450ddb03200241046a28020020042006101e2205450ddc030cfb040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d840720044101742206200520052006491b22064100480d84072004450ddc03200241046a28020020042006101e2205450ddd030cf8040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da90420044101742206200520052006491b22064100480da9042004450ddd03200241046a28020020042006101e2205450dde030cf5040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da80420044101742206200520052006491b22064100480da8042004450dde03200241046a28020020042006101e2205450ddf030cf2040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da70420044101742206200520052006491b22064100480da7042004450ddf03200241046a28020020042006101e2205450de0030cef040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490df50620044101742209200820082009491b22084100480df5062004450de003200728020020042008101e2209450de1030cec040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dff0620044101742209200820082009491b22084100480dff062004450de103200728020020042008101e2209450de2030ce9040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfe0620044101742206200520052006491b22064100480dfe062004450de203200241046a28020020042006101e2205450de3030ce6040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da30420044101742206200520052006491b22064100480da3042004450de303200241046a28020020042006101e2205450de4030ce3040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da20420044101742206200520052006491b22064100480da2042004450de403200241046a28020020042006101e2205450de5030ce0040b200241046a2105200141046a2802002108200241086a2802002002410c6a2802002204470dab01200441016a22062004490dfb0620044101742209200620062009491b22094100480dfb062004450de503200528020020042009101e2206450de6030cdd040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da00420044101742206200520052006491b22064100480da0042004450de603200241046a28020020042006101e2205450de7030cda040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d9f0420044101742206200520052006491b22064100480d9f042004450de703200241046a28020020042006101e2205450de8030cd7040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d9e0420044101742206200520052006491b22064100480d9e042004450de803200241046a28020020042006101e2205450de9030cd4040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dec0620044101742209200820082009491b22084100480dec062004450de903200728020020042008101e2209450dea030cd1040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df60620044101742206200520052006491b22064100480df6062004450dea03200241046a28020020042006101e2205450deb030cce040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d9b0420044101742206200520052006491b22064100480d9b042004450deb03200241046a28020020042006101e2205450dec030ccb040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df40620044101742206200520052006491b22064100480df4062004450dec03200241046a28020020042006101e2205450ded030cc8040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d990420044101742206200520052006491b22064100480d99042004450ded03200241046a28020020042006101e2205450dee030cc5040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df20620044101742206200520052006491b22064100480df2062004450dee03200241046a28020020042006101e2205450def030cc2040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d970420044101742206200520052006491b22064100480d97042004450def03200241046a28020020042006101e2205450df0030cbf040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df00620044101742206200520052006491b22064100480df0062004450df003200241046a28020020042006101e2205450df1030cbc040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d950420044101742206200520052006491b22064100480d95042004450df103200241046a28020020042006101e2205450df2030cb9040b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470dab01200641016a22052006490de30620064101742208200520052008491b22054100480de3062006450df203200728020020062005101e2208450df3030cb6040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490ded0620044101742206200520052006491b22064100480ded062004450df303200241046a28020020042006101e2205450df4030cb3040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dec0620044101742206200520052006491b22064100480dec062004450df403200241046a28020020042006101e2205450df5030cb0040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490deb0620044101742209200820082009491b22084100480deb062004450df503200728020020042008101e2209450df6030cad040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dea0620044101742206200520052006491b22064100480dea062004450df603200241046a28020020042006101e2205450df7030caa040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de90620044101742206200520052006491b22064100480de9062004450df703200241046a28020020042006101e2205450df8030ca7040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490ddd0620044101742209200820082009491b22084100480ddd062004450df803200728020020042008101e2209450df9030ca4040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490ddc0620044101742209200820082009491b22084100480ddc062004450df903200728020020042008101e2209450dfa030ca1040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de60620044101742206200520052006491b22064100480de6062004450dfa03200241046a28020020042006101e2205450dfb030c9e040b200241046a21092001410c6a2802002104200141086a280200210b200141046a280200210d200241086a2802002002410c6a2802002205470dab01200541016a22012005490dda0620054101742206200120012006491b22014100480dda062005450dfb03200928020020052001101e2206450dfc030c9b040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490de40620044101742209200820082009491b22084100480de4062004450dfc03200728020020042008101e2209450dfd030c98040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de30620044101742206200520052006491b22064100480de3062004450dfd03200241046a28020020042006101e2205450dfe030c95040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dd70620044101742209200820082009491b22084100480dd7062004450dfe03200728020020042008101e2209450dff030c92040b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470dab01200641016a22052006490dd60620064101742208200520052008491b22054100480dd6062006450dff03200728020020062005101e2208450d80040c8f040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd50620044101742206200520052006491b22064100480dd5062004450d8004200241046a28020020042006101e2205450d81040c8c040b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470dab01200641016a22052006490dd40620064101742208200520052008491b22054100480dd4062006450d8104200728020020062005101e2208450d82040c89040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd30620044101742206200520052006491b22064100480dd3062004450d8204200241046a28020020042006101e2205450d83040c86040b200241046a28020021050ce1060b200728020021090cdb060b200528020021060cd8060b200241046a28020021050cd5060b200728020021090cd2060b200728020021090ccc060b200728020021090cc9060b200241046a28020021050cc6060b200728020021090cc3060b200241046a28020021050cc0060b200528020021060cbd060b200241046a28020021050cba060b200728020021080cb7060b200241046a28020021050cb4060b200728020021090cb1060b200528020021060cae060b200241046a28020021050cab060b200241046a28020021050ca8060b200241046a28020021050ca5060b200b28020021080ca2060b200728020021080c9f060b200241046a28020021050c9c060b200241046a28020021050c99060b200241046a28020021050c96060b200241046a28020021050c93060b200241046a28020021050c90060b200728020021080c8d060b200528020021060c8a060b200241046a28020021050c87060b200728020021080c84060b200241046a28020021050c81060b200241046a28020021050cfe050b200241046a28020021050cfb050b200241046a28020021050cf8050b200241046a28020021050cf5050b200241046a28020021050cf2050b200241046a28020021050cbf060b200728020021090cee050b200241046a28020021050ceb050b200728020021090ce8050b200241046a28020021050ce5050b200241046a28020021050ce2050b200241046a28020021050cdf050b200241046a28020021050cdc050b200241046a28020021050cd9050b200241046a28020021050cd6050b200241046a28020021050cd3050b200241046a28020021050cd0050b200241046a28020021050ccd050b200241046a28020021050cca050b200241046a28020021050cc7050b200241046a28020021050cc4050b200241046a28020021050cc1050b200728020021090cbe050b200728020021090cbb050b200241046a28020021050cb8050b200241046a28020021050cb5050b200241046a28020021050cb2050b200728020021090caf050b200728020021090cac050b200241046a28020021050ca9050b200241046a28020021050ca6050b200241046a28020021050ca3050b200241046a28020021050ca0050b200241046a28020021050c9d050b200241046a28020021050c9a050b200241046a28020021050c97050b200241046a28020021050c94050b200728020021090c91050b200241046a28020021050c8e050b200241046a28020021050c8b050b200241046a28020021050c88050b200241046a28020021050c85050b200241046a28020021050c82050b200241046a28020021050cff040b200241046a28020021050cfc040b200528020021060cf9040b200241046a28020021050cf6040b200241046a28020021050cf3040b200241046a28020021050cf0040b200241046a28020021050ced040b200241046a28020021050cea040b200241046a28020021050ce7040b200241046a28020021050ce4040b200728020021080ce1040b200728020021090cde040b200241046a28020021050cdb040b200241046a28020021050cd7040b200241046a28020021050cd4040b200241046a28020021050cd1040b200241046a28020021050cce040b200241046a28020021050ccb040b200241046a28020021050cc8040b200241046a28020021050cc5040b200241046a28020021050cc2040b200241046a28020021050cbf040b200241046a28020021050cbc040b200241046a28020021050cb9040b200241046a28020021050cb6040b200241046a28020021050cb3040b200241046a28020021050cb0040b200241046a28020021050cad040b200241046a28020021050caa040b200241046a28020021050ca7040b200241046a28020021050ca4040b200241046a28020021050ca1040b200241046a28020021050c9e040b200241046a28020021050c9b040b200241046a28020021050c98040b200241046a28020021050c95040b200241046a28020021050c92040b200241046a28020021050c8f040b200241046a28020021050c8c040b200241046a28020021050c89040b200241046a28020021050c86040b200728020021090c83040b200241046a28020021050c80040b200528020021060cfd030b200241046a28020021050cfa030b200241046a28020021050cf7030b200241046a28020021050cf4030b200241046a28020021050cf1030b200241046a28020021050cee030b200241046a28020021050ceb030b200241046a28020021050ce8030b200241046a28020021050ce5030b200241046a28020021050ce2030b200241046a28020021050cdf030b200241046a28020021050cdc030b200241046a28020021050cd9030b200241046a28020021050cd6030b200241046a28020021050cd3030b200241046a28020021050cd0030b200241046a28020021050ccd030b200241046a28020021050cca030b200241046a28020021050cc7030b200241046a28020021050cc4030b200728020021090cc1030b200728020021090cbe030b200241046a28020021050cbb030b200241046a28020021050cb8030b200241046a28020021050cb5030b200528020021060cb2030b200241046a28020021050caf030b200241046a28020021050cac030b200241046a28020021050ca9030b200728020021090ca6030b200241046a28020021050ca3030b200241046a28020021050ca0030b200241046a28020021050c9d030b200241046a28020021050c9a030b200241046a28020021050c97030b200241046a28020021050c94030b200241046a28020021050c91030b200241046a28020021050c8e030b200728020021080c8b030b200241046a28020021050c88030b200241046a28020021050c85030b200728020021090c82030b200241046a28020021050cff020b200241046a28020021050cfc020b200728020021090cf9020b200728020021090cf6020b200241046a28020021050cf3020b200928020021060cf0020b200728020021090ced020b200241046a28020021050cea020b200728020021090ce7020b200728020021080ce4020b200241046a28020021050ce1020b200728020021080cde020b200241046a28020021050cdb020b2006101f22050db4050b200641011020000b2008101f22090dad050b200841011020000b2008101f22060da9050b200841011020000b2006101f22050da5050b200641011020000b2008101f22090da1050b200841011020000b2008101f22090d9a050b200841011020000b2008101f22090d96050b200841011020000b2006101f22050d92050b200641011020000b2008101f22090d8e050b200841011020000b2006101f22050d8a050b200641011020000b2009101f22060d86050b200941011020000b2006101f22050d82050b200641011020000b2005101f22080dfe040b200541011020000b2006101f22050dfa040b200641011020000b2008101f22090df6040b200841011020000b2009101f22060df2040b200941011020000b2006101f22050dee040b200641011020000b2006101f22050dea040b200641011020000b2006101f22050de6040b200641011020000b2006101f22080de2040b200641011020000b2005101f22080dde040b200541011020000b2006101f22050dda040b200641011020000b2006101f22050dd6040b200641011020000b2006101f22050dd2040b200641011020000b2006101f22050dce040b200641011020000b2006101f22050dca040b200641011020000b2005101f22080dc6040b200541011020000b2009101f22060dc2040b200941011020000b2006101f22050dbe040b200641011020000b2005101f22080dba040b200541011020000b2006101f22050db6040b200641011020000b2006101f22050db2040b200641011020000b2006101f22050dae040b200641011020000b2006101f22050daa040b200641011020000b2006101f22050da6040b200641011020000b2006101f22050da2040b200641011020000b2006101f22050dee040b200641011020000b2008101f22090d9c040b200841011020000b2006101f22050d98040b200641011020000b2008101f22090d94040b200841011020000b2006101f22050d90040b200641011020000b2006101f22050d8c040b200641011020000b2006101f22050d88040b200641011020000b2006101f22050d84040b200641011020000b2006101f22050d80040b200641011020000b2006101f22050dfc030b200641011020000b2006101f22050df8030b200641011020000b2006101f22050df4030b200641011020000b2006101f22050df0030b200641011020000b2006101f22050dec030b200641011020000b2006101f22050de8030b200641011020000b2006101f22050de4030b200641011020000b2006101f22050de0030b200641011020000b2008101f22090ddc030b200841011020000b2008101f22090dd8030b200841011020000b2006101f22050dd4030b200641011020000b2006101f22050dd0030b200641011020000b2006101f22050dcc030b200641011020000b2008101f22090dc8030b200841011020000b2008101f22090dc4030b200841011020000b2006101f22050dc0030b200641011020000b2006101f22050dbc030b200641011020000b2006101f22050db8030b200641011020000b2006101f22050db4030b200641011020000b2006101f22050db0030b200641011020000b2006101f22050dac030b200641011020000b2006101f22050da8030b200641011020000b2006101f22050da4030b200641011020000b2008101f22090da0030b200841011020000b2006101f22050d9c030b200641011020000b2006101f22050d98030b200641011020000b2006101f22050d94030b200641011020000b2006101f22050d90030b200641011020000b2006101f22050d8c030b200641011020000b2006101f22050d88030b200641011020000b2006101f22050d84030b200641011020000b2009101f22060d80030b200941011020000b2006101f22050dfc020b200641011020000b2006101f22050df8020b200641011020000b2006101f22050df4020b200641011020000b2006101f22050df0020b200641011020000b2006101f22050dec020b200641011020000b2006101f22050de8020b200641011020000b2006101f22050de4020b200641011020000b2005101f22080de0020b200541011020000b2008101f22090ddc020b200841011020000b2006101f22050dd8020b200641011020000b2006101f22050dd3020b200641011020000b2006101f22050dcf020b200641011020000b2006101f22050dcb020b200641011020000b2006101f22050dc7020b200641011020000b2006101f22050dc3020b200641011020000b2006101f22050dbf020b200641011020000b2006101f22050dbb020b200641011020000b2006101f22050db7020b200641011020000b2006101f22050db3020b200641011020000b2006101f22050daf020b200641011020000b2006101f22050dab020b200641011020000b2006101f22050da7020b200641011020000b2006101f22050da3020b200641011020000b2006101f22050d9f020b200641011020000b2006101f22050d9b020b200641011020000b2006101f22050d97020b200641011020000b2006101f22050d93020b200641011020000b2006101f22050d8f020b200641011020000b2006101f22050d8b020b200641011020000b2006101f22050d87020b200641011020000b2006101f22050d83020b200641011020000b2006101f22050dff010b200641011020000b2006101f22050dfb010b200641011020000b2006101f22050df7010b200641011020000b2006101f22050df3010b200641011020000b2006101f22050def010b200641011020000b2006101f22050deb010b200641011020000b2006101f22050de7010b200641011020000b2008101f22090de3010b200841011020000b2008101f22050ddf010b200841011020000b2009101f22060ddb010b200941011020000b2006101f22050dd7010b200641011020000b2006101f22050dd3010b200641011020000b2006101f22050dcf010b200641011020000b2006101f22050dcb010b200641011020000b2006101f22050dc7010b200641011020000b2006101f22050dc3010b200641011020000b2006101f22050dbf010b200641011020000b2006101f22050dbb010b200641011020000b2006101f22050db7010b200641011020000b2006101f22050db3010b200641011020000b2006101f22050daf010b200641011020000b2006101f22050dab010b200641011020000b2006101f22050da7010b200641011020000b2006101f22050da3010b200641011020000b2006101f22050d9f010b200641011020000b2006101f22050d9b010b200641011020000b2006101f22050d97010b200641011020000b2006101f22050d93010b200641011020000b2006101f22050d8f010b200641011020000b2008101f22090d8b010b200841011020000b2008101f22090d87010b200841011020000b2006101f22050d83010b200641011020000b2006101f22050d7f0b200641011020000b2006101f22050d7b0b200641011020000b2009101f22060d770b200941011020000b2006101f22050d730b200641011020000b2006101f22050d6f0b200641011020000b2006101f22050d6b0b200641011020000b2008101f22090d670b200841011020000b2006101f22050d630b200641011020000b2006101f22050d5f0b200641011020000b2006101f22050d5b0b200641011020000b2006101f22050d570b200641011020000b2006101f22050d530b200641011020000b2006101f22050d4f0b200641011020000b2006101f22050d4b0b200641011020000b2006101f22050d470b200641011020000b2005101f22080d430b200541011020000b2006101f22050d3f0b200641011020000b2006101f22050d3b0b200641011020000b2008101f22090d370b200841011020000b2006101f22050d330b200641011020000b2006101f22050d2f0b200641011020000b2008101f22090d2b0b200841011020000b2008101f22090d270b200841011020000b2006101f22050d230b200641011020000b2001101f22060d1f0b200141011020000b2008101f22090d1b0b200841011020000b2006101f22050d170b200641011020000b2008101f22090d130b200841011020000b2005101f22080d0f0b200541011020000b2006101f22050d0b0b200641011020000b2005101f22080d070b200541011020000b2006101f22050d030b200641011020000b1021000b1021000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a410b3a00000cdd020b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a410d3a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490dcf0220024101742209200620062009491b22094100480dcf022002450d01200728020020022009101e22060d020c050b200728020021060c020b2009101f2206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000cdd020b0b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a411a3a00000cd9020b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a410c3a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490dcb0220024101742209200620062009491b22094100480dcb022002450d01200728020020022009101e22060d020c050b200728020021060c020b2009101f2206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000cd9020b0b200941011020000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41333a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dca022004410174220d20092009200d491b220d4100480dca022004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dca0220024101742209200620062009491b22094100480dca022002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cd8020b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41dc003a00000cd3020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413a3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dd1022004410174220d20092009200d491b220d4100480dd1022004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dd10220024101742209200620062009491b22094100480dd1022002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cd4020b0b200d41011020000b200941011020000b200241086a2001360200200241046a20063602002002410c6a28020021050b2002410c6a2201200541016a360200200620056a410e3a00002003200b200d200d200b4102746a200210220240024020032d0000411a470d00200241086a2106200241046a210703400240024002400240200628020020012802002202470d00200241016a22052002490dc40220024101742208200520052008491b22084100480dc4022002450d01200928020020022008101e22050d020c060b200928020021050c020b2008101f2205450d040b2006200836020020072005360200200128020021020b2001200241016a360200200520026a200441807f72200441ff0071200441077622021b3a00002002210420020d000b0240200b41ffffffff0371450d00200d101d0b2000411a3a0000200341106a24000f0b20002003290300370200200041086a200341086a290300370200200b41ffffffff0371450dd102200d101d200341106a24000f0b200841011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41de003a00000ccd020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412d3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dc0022004410174220d20092009200d491b220d4100480dc0022004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dc00220024101742209200620062009491b22094100480dc0022002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cce020b0b200d41011020000b200941011020000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41323a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dbe022004410174220d20092009200d491b220d4100480dbe022004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dbe0220024101742209200620062009491b22094100480dbe022002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000ccc020b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e6003a00000cc7020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e5003a00000cc5020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41393a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dc3022004410174220d20092009200d491b220d4100480dc3022004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dc30220024101742209200620062009491b22094100480dc3022002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cc6020b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41db003a00000cc1020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e0003a00000cbf020b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41223a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490db10220024101742209200620062009491b22094100480db1022002450d01200728020020022009101e22060d020c050b200728020021060c020b2009101f2206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000cbf020b0b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fb003a00000cbb020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41da003a00000cb9020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f1003a00000cb7020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d8003a00000cb5020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418c013a00000cb3020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d7003a00000cb1020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f5003a00000caf020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e8003a00000cad020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41313a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490da0022004410174220d20092009200d491b220d4100480da0022004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490da00220024101742209200620062009491b22094100480da0022002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cae020b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f6003a00000ca9020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4191013a00000ca7020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418b013a00000ca5020b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41c3003a000002400240024002400240200241086a2802002206200928020022046b41044f0d00200441046a22092004490da10220064101742204200920092004491b22044100480da1022006450d01200528020020062004101e2205450d020c030b200528020021050c030b2004101f22050d010b200441011020000b200241086a2004360200200241046a20053602002002410c6a28020021040b2002410c6a200441046a360200200520046a20083600000ca3020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4188013a00000ca1020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f7003a00000c9f020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d0003a00000c9d020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41373a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d9b022004410174220d20092009200d491b220d4100480d9b022004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d9b0220024101742209200620062009491b22094100480d9b022002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c9e020b0b200d41011020000b200941011020000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412e3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d8e022004410174220d20092009200d491b220d4100480d8e022004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d8e0220024101742209200620062009491b22094100480d8e022002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c9c020b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4189013a00000c97020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a5013a00000c95020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4199013a00000c93020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cb003a00000c91020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a2013a00000c8f020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a3013a00000c8d020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a8013a00000c8b020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4195013a00000c89020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4184013a00000c87020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4186013a00000c85020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ac013a00000c83020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4198013a00000c81020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c9003a00000cff010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cf003a00000cfd010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c8003a00000cfb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cc003a00000cf9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a9013a00000cf7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e9003a00000cf5010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ea003a00000cf3010b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a413f3a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490def0120044101742209200620062009491b22064100480def012004450d01200528020020042006101e2205450d020c030b200528020021050c030b2006101f22050d010b200641011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a20083a00000cf1010b200241086a2008360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c1003a0000200320062002102320032d0000411a460def0120002003290300370200200041086a200341086a29030037020020012d00004109470df0010c3a0b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412f3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490de2012004410174220d20092009200d491b220d4100480de2012004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490de20120024101742209200620062009491b22094100480de2012002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cf0010b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4192013a00000ceb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41003a00000ce9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419f013a00000ce7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a1013a00000ce5010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b7013a00000ce3010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b5013a00000ce1010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ad013a00000cdf010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b9013a00000cdd010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b2013a00000cdb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41aa013a00000cd9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4181013a00000cd7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fe003a00000cd5010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ba013a00000cd3010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ab013a00000cd1010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4182013a00000ccf010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f3003a00000ccd010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4196013a00000ccb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e1003a00000cc9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ae013a00000cc7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a0013a00000cc5010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41dd003a00000cc3010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e3003a00000cc1010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bf013a00000cbf010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41be013a00000cbd010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b8013a00000cbb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bc013a00000cb9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4180013a00000cb7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c2003a00002003200a2002102420032d0000411a460db50120002003290300370200200041086a200341086a29030037020020012d00004109470db6010b200141086a28020041ffffffff0371450db501200141046a280200101d200341106a24000f0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b0013a00000cb2010b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41293a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490da5012004410174220d20092009200d491b220d4100480da5012004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490da50120024101742209200620062009491b22094100480da5012002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cb3010b0b200d41011020000b200941011020000b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41233a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490da20120024101742209200620062009491b22094100480da2012002450d01200728020020022009101e22060d020c050b200728020021060c020b2009101f2206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000cb0010b0b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bd013a00000cac010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a7013a00000caa010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a6013a00000ca8010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b6013a00000ca6010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b3013a00000ca4010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4183013a00000ca2010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ff003a00000ca0010b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41c0003a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490d9c0120044101742209200620062009491b22064100480d9c012004450d01200528020020042006101e2205450d020c030b200528020021050c030b2006101f22050d010b200641011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a20083a00000c9e010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4197013a00000c9c010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bb013a00000c9a010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418e013a00000c98010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ee003a00000c96010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c6003a00000c94010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b4013a00000c92010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ed003a00000c90010b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413e3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d8e012004410174220d20092009200d491b220d4100480d8e012004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d8e0120024101742209200620062009491b22094100480d8e012002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c91010b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4185013a00000c8c010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ca003a00000c8a010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418f013a00000c88010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419e013a00000c86010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b1013a00000c84010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4193013a00000c82010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fc003a00000c80010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41af013a00000c7e0b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413d3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d7c2004410174220d20092009200d491b220d4100480d7c2004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d7c20024101742209200620062009491b22094100480d7c2002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c7f0b0b200d41011020000b200941011020000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41383a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d7a2004410174220d20092009200d491b220d4100480d7a2004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d7a20024101742209200620062009491b22094100480d7a2002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c7d0b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419d013a00000c780b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a4013a00000c760b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fa003a00000c740b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412b3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d672004410174220d20092009200d491b220d4100480d672004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d6720024101742209200620062009491b22094100480d672002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c750b0b200d41011020000b200941011020000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41343a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d652004410174220d20092009200d491b220d4100480d652004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d6520024101742209200620062009491b22094100480d652002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c730b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419b013a00000c6e0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419c013a00000c6c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f4003a00000c6a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4187013a00000c680b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4190013a00000c660b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d4003a00000c640b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418a013a00000c620b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419a013a00000c600b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f8003a00000c5e0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ef003a00000c5c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fd003a00000c5a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ce003a00000c580b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d3003a00000c560b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41303a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d492004410174220d20092009200d491b220d4100480d492004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d4920024101742209200620062009491b22094100480d492002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c570b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cd003a00000c520b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41283a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d452004410174220d20092009200d491b220d4100480d452004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d4520024101742209200620062009491b22094100480d452002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c530b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a410f3a00000c4e0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d9003a00000c4c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4194013a00000c4a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e7003a00000c480b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418d013a00000c460b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e2003a00000c440b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41243a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490d3620024101742209200620062009491b22094100480d362002450d01200728020020022009101e22060d020c050b200728020021060c020b2009101f2206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000c440b0b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f2003a00000c400b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41033a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490d3120044101742209200620062009491b22064100480d312004450d01200528020020042006101e2205450d020c030b200528020021050c030b2006101f22050d010b200641011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a42c0818386fcdffffe7c2008410374412073ad42f8018388a7413f7141c000723a00000c3e0b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41213a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490d3020024101742209200620062009491b22094100480d302002450d01200728020020022009101e22060d020c050b200728020021060c020b2009101f2206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000c3e0b0b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f9003a00000c3a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d6003a00000c380b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41df003a00000c360b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c7003a00000c340b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f0003a00000c320b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41203a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490d2420024101742209200620062009491b22094100480d242002450d01200728020020022009101e22060d020c050b200728020021060c020b2009101f2206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000c320b0b200941011020000b200241086a2006360200200241046a20083602002002410c6a28020021040b2002410c6a2206200441016a360200200820046a41113a0000200241086a2109200241046a210d02400240024003400240024002400240200928020020062802002204470d00200441016a22082004490d2420044101742207200820082007491b22074100480d242004450d01200b28020020042007101e22080d020c050b200b28020021080c020b2007101f2208450d030b20092007360200200d2008360200200628020021040b2006200441016a360200200820046a200541807f72200541ff0071200541077622041b3a00002004210520040d000b024002400240200241086a2802002002410c6a2802002204470d00200441016a22052004490d2220044101742206200520052006491b22064100480d222004450d01200b28020020042006101e2205450d020c040b200b28020021050c040b2006101f22050d020b200641011020000b200741011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a200c3a00000c2e0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d5003a00000c2c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e4003a00000c2a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ec003a00000c280b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41043a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490d1920044101742209200620062009491b22064100480d192004450d01200528020020042006101e2205450d020c030b200528020021050c030b2006101f22050d010b200641011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a42c0818386fcdffffe7c2008410374412073ad42f8018388a7413f7141c000723a00000c260b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41363a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d242004410174220d20092009200d491b220d4100480d242004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d2420024101742209200620062009491b22094100480d242002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c270b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d2003a00000c220b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41103a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490d1420024101742209200620062009491b22094100480d142002450d01200728020020022009101e22060d020c050b200728020021060c020b2009101f2206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000c220b0b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41eb003a00000c1e0b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41023a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490d0f20044101742209200620062009491b22064100480d0f2004450d01200528020020042006101e2205450d020c030b200528020021050c030b2006101f22050d010b200641011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a42c0818386fcdffffe7c2008410374412073ad42f8018388a7413f7141c000723a00000c1c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c5003a00000c1a0b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41353a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d182004410174220d20092009200d491b220d4100480d182004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d1820024101742209200620062009491b22094100480d182002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c1b0b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d1003a00000c160b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412c3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d092004410174220d20092009200d491b220d4100480d092004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d0920024101742209200620062009491b22094100480d092002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c170b0b200d41011020000b200941011020000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412a3a0000200241086a210b200241046a210c03400240024002400240200b28020020082802002204470d00200441016a22092004490d052004410174220d20092009200d491b220d4100480d052004450d0120072802002004200d101e22090d020c060b200728020021090c020b200d101f2209450d040b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d0520024101742209200620062009491b22094100480d052002450d01200728020020022009101e22060d020c070b200728020021060c020b2009101f2206450d050b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c130b0b1021000b200d41011020000b200941011020000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413b3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d0d2004410174220d20092009200d491b220d4100480d0d2004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d0d20024101742209200620062009491b22094100480d0d2002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c100b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a411b3a00000c0b0b200241086a2008360200200241046a20063602002002410c6a28020021040b2002410c6a2208200441016a360200200620046a41c4003a000002400240024002400240200241086a2802002206200828020022046b41084f0d00200441086a22082004490d0720064101742204200820082004491b22044100480d072006450d01200528020020062004101e2205450d020c030b200528020021050c030b2004101f22050d010b200441011020000b200241086a2004360200200241046a20053602002002410c6a28020021040b2002410c6a200441086a360200200520046a200a3700000c090b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413c3a0000200241086a210b200241046a210c03400240024002400240200b28020020082802002204470d00200441016a22092004490d052004410174220d20092009200d491b220d4100480d052004450d0120072802002004200d101e22090d020c060b200728020021090c020b200d101f2209450d040b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200541807f72200541ff0071200541077622041b3a00002004210520040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22052002490d0520024101742209200520052009491b22094100480d052002450d01200728020020022009101e22050d020c070b200728020021050c020b2009101f2205450d050b20082009360200200b2005360200200428020021020b2004200241016a360200200520026a200641807f72200641ff0071200641077622021b3a00002002210620020d000c080b0b1021000b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41053a00000c020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41013a00000b2000411a3a000020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a280200101d0b200341106a24000b0700200010be030b0b0020002001200210bf030b0700200010bd030b0e0041ddafc200412210bc0300000b0a0041f8b0c400102c000bce0301067f2004410c6a2105200441086a2106200441046a210702400240024003400240024002400240200628020020052802002208470d00200841016a22092008490d052008410174220a20092009200a491b220a4100480d052008450d0120072802002008200a101e22090d020c070b200728020021090c020b200a101f2209450d050b2006200a36020020072009360200200528020021080b2005200841016a360200200920086a200141807f72200141ff0071200141077622081b3a00002008210120080d000b024020022003460d002004410c6a2105200441086a21060340200241046a210a2002280200210103400240024002400240200628020020052802002208470d00200841016a22092008490d0720084101742202200920092002491b22024100480d072008450d01200441046a28020020082002101e22090d020c080b200441046a28020021090c020b2002101f2209450d060b20062002360200200441046a2009360200200528020021080b2005200841016a360200200920086a200141807f72200141ff0071200141077622081b3a00002008210120080d000b200a2102200a2003470d000b0b2000411a3a00000f0b1021000b200241011020000b200a41011020000be30301077f200141c000712103200141ff00712104024002400240024002400240200141077522050d002003450d010b02402005417f470d0020030d010b2002410c6a2104200241086a2106200241046a21070340200521030240024002400240200628020020042802002205470d00200541016a22082005490d0620054101742209200820082009491b22094100480d062005450d01200728020020052009101e22080d020c070b200728020021080c020b2009101f2208450d050b2006200936020020072008360200200428020021050b2004200541016a360200200820056a200141807f723a0000200341c00071210802400240200341077522050d002008450d010b200321012005417f470d01200321012008450d010b0b200341ff007121040b024002400240200241086a2802002002410c6a2802002205470d00200541016a22032005490d0320054101742201200320032001491b22014100480d032005450d01200241046a28020020052001101e2203450d020c050b200241046a28020021030c050b2001101f22030d030b200141011020000b1021000b200941011020000b200241086a2001360200200241046a20033602002002410c6a28020021050b2002410c6a200541016a360200200320056a20043a00002000411a3a00000be60301047f2001a7220341c000712104200341ff00712105024002400240024002400240200142078722014200520d002004450d010b02402001427f520d0020040d010b03400240024002400240200241086a2802002002410c6a2802002204470d00200441016a22052004490d0620044101742206200520052006491b22064100480d062004450d01200241046a28020020042006101e22050d020c070b200241046a28020021050c020b2006101f2205450d050b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a200341807f723a00002001a7220341c00071210402400240200142078722014200520d002004450d010b2001427f520d012004450d010b0b200341ff007121050b024002400240200241086a2802002002410c6a2802002204470d00200441016a22032004490d0320044101742206200320032006491b22064100480d032004450d01200241046a28020020042006101e2203450d020c050b200241046a28020021030c050b2006101f22030d030b200641011020000b1021000b200641011020000b200241086a2006360200200241046a20033602002002410c6a28020021040b2002410c6a200441016a360200200320046a20053a00002000411a3a00000bd403020a7f017e230041306b22022400200241216a220341076a210441002105410021064100210741002108410821090240024002400340200241186a2001102620022802184101460d01200220032900003703082002200429000037000f200241186a41086a2d0000210a2002200229000f37001f20022002290308370318024020072008470d00200741016a220b2007490d032005200b200b2005491b2208ad420486220c422088a70d03200ca7220b4100480d0302402007450d0020092006200b101e22090d010c050b200b101f2209450d040b200920066a220b200a3a0000200b41086a200229001f370000200b41016a2002290318370000200541026a2105200641106a2106200741016a2107200a41ff01714106470d000b20002009360204200041003602002000410c6a2007360200200041086a2008360200200241306a24000f0b2000200229021c370204200041013602002000410c6a200241186a410c6a29020037020002402007450d00200921070340024020072d00004109470d00200741086a28020041ffffffff0371450d00200741046a280200101d0b200741106a2107200641706a22060d000b0b02402008450d002009101d0b200241306a24000f0b1021000b200b41081020000bc4bd0103087f017e037f230041e0006b22022400024020012802082203200128020c2204470d00200241013a0038200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241386a3602282002200241286a360258200241086a200241c8006a1028200241d3006a200241106a2802003600002002200229030837004b2002200241cf006a29000037001f20022002290048370318200041053a000420004101360200200020022903183700052000410c6a200229001f370000200241e0006a24000f0b200441016a21050240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402004417f460d0020032005490d012001280200220620046a2d000021072001410c6a220820053602000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200741bf014b0d000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020070ec001b504b50400840124b504aa01aa01aa01aa01aa01a801a501a701a101200b11aa01aa01aa01aa01aa01aa01aa01aa01a60103aa01aa01aa01aa0112189801511aaa01aa01aa0121520533069f0186016f238f019e01a40132080d8801379b01a20104013841714970548b010209441476783f8101752226778701070c252c1016920194011f96019a01a3015ba0011599015e1b5a0f9c019d011d900174720a0e42452813950119602f91018e01890129173497013a27644b5565624a7d407b2e8a0185012b8c0193011c463e2d8d016e3b1e7c5f487982012a3130363d6d5c6c80017f3583014e4f7e7366617a695d39533c674c436a4d6b5768634756505859b5040b20032005470dae01200241013a0037200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241376a3602282002200241286a360258200241386a200241c8006a1028200241d2006a200241c0006a2802003601002002200229033837014a2002200241ce006a29010037011e20022002290148370318410521090cb0020b410120036b2107200441026a2101410021054100210903402005411f4b0db201200720016a4102460de9012001450da80320032001490da903200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490db30220046741686a41ff017141034b0db302410d21010cb2010b200320056b41084f0da801200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10282002290318210a200041106a2002280220360200200041086a200a37020020004281808080d000370300200241e0006a24000f0b410e21070ca5010b410120036b2107200441026a2101410021054100210903402005411f4b0db101200720016a4102460de8012001450da70320032001490da803200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490db10220046741686a41ff017141034b0db102410d21010cb1010b410120036b2107200441026a2101410021054100210903402005411f4b0db201200720016a4102460de9012001450da80320032001490da903200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490db10220046741686a41ff017141034b0db102410d21010cb2010b410120036b2107200441026a2101410021054100210903402005411f4b0db301200720016a4102460dea012001450da90320032001490daa03200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490db10220046741686a41ff017141034b0db102410d21010cb3010b413d21070ca1010b410120036b2107200441026a2101410021054100210903402005411f4b0db301200720016a4102460dea012001450da90320032001490daa03200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490db00220046741686a41ff017141034b0db002410d21010cb3010b413121070c9f010b41d70021070c9e010b410021014100210903402001411f4b0db20120032005460de9012005417f460da8032003200541016a2207490da903200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b024020014120490d00410d210120046741686a41ff017141034d0dea010b410b21070ca8040b413e21070c9c010b410120036b2107200441026a2101410021054100210903402005411f4b0db101200720016a4102460de9012001450da80320032001490da903200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490dac0220046741686a41ff017141034b0dac02410d21010cb1010b41d80021070c9a010b41d00021070c99010b41c10021070c98010b410021014100210903402001411f4b0daf0120032005460de7012005417f460da6032003200541016a2204490da703200620056a2d0000210720082004360200200741ff00712001411f71742009722109200141076a2101200421052007418001710d000b024020014120490d00410d210120076741686a41ff017141034d0de8010b20032004470dbf02200241013a0038200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241386a3602282002200241286a360258200241086a200241c8006a1028200241d3006a200241106a2802003600002002200229030837004b2002200241cf006a29000037001f20022002290048370318200041053a000420004101360200200020022903183700052000410c6a200229001f370000200241e0006a24000f0b410021014100210903402001411f4b0daf0120032005460de8012005417f460da7032003200541016a2207490da803200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b024020014120490d00410d210120046741686a41ff017141034d0de9010b410f21070ca1040b41dc0021070c95010b413321070c94010b41cb0021070c93010b41c20021070c92010b41e50021070c91010b410021014100210903402001411f4b0daa0120032005460de4012005417f460da3032003200541016a2207490da403200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b024020014120490d00410d210120046741686a41ff017141034d0de5010b411021070c9b040b41de0021070c8f010b410021014100210903402001411f4b0da90120032005460de4012005417f460da3032003200541016a2207490da403200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b024020014120490d00410d210120046741686a41ff017141034d0de5010b411321070c99040b41ce0021070c8d010b41f90021070c8c010b41d30021070c8b010b41800121070c8a010b41c50021070c89010b410a21070c88010b410120036b2107200441026a2101410021054100210903402005411f4b0da301200720016a4102460ddf012001450d9e0320032001490d9f03200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d990220046741686a41ff017141034b0d9902410d21010ca3010b413921070c86010b410120036b2107200441026a2101410021054100210903402005411f4b0da301200720016a4102460ddf012001450d9e0320032001490d9f03200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d980220046741686a41ff017141034b0d9802410d21010ca3010b20032005470d8701200241013a0037200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241376a3602282002200241286a360258200241386a200241c8006a1028200241d2006a200241c0006a2802003601002002200229033837014a2002200241ce006a29010037011e20022002290148370318410521090c88020b413f21070c83010b413a21070c82010b41e90021070c81010b41db0021070c80010b41e40021070c7f0b41860121070c7e0b41f60021070c7d0b41c00021070c7c0b41fc0021070c7b0b41f30021070c7a0b41e00021070c790b41880121070c780b41870121070c770b410120036b2107200441026a2101410021054100210903402005411f4b0d9601200720016a4102460dd2012001450d910320032001490d9203200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d8a0220046741686a41ff017141034b0d8a02410d21010c96010b410120036b2107200441026a2101410021054100210903402005411f4b0d9701200720016a4102460dd3012001450d920320032001490d9303200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d8a0220046741686a41ff017141034b0d8a02410d21010c97010b41e60021070c740b41900121070c730b41890121070c720b410120036b2107200441026a2101410021054100210903402005411f4b0d9501200720016a4102460dd1012001450d900320032001490d9103200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d870220046741686a41ff017141034b0d8702410d21010c95010b410120036b2107200441026a2101410021054100210903402005411f4b0d9601200720016a4102460dd2012001450d910320032001490d9203200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d870220046741686a41ff017141034b0d8702410d21010c96010b419b0121070c6f0b41e80021070c6e0b41ff0021070c6d0b419d0121070c6c0b418a0121070c6b0b41fb0021070c6a0b413621070c690b41f10021070c680b410120036b2107200441026a2101410021054100210903402005411f4b0d8f01200720016a4102460dcb012001450d8a0320032001490d8b03200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490dff0120046741686a41ff017141034b0dff01410d21010c8f010b41d90021070c660b41a00121070c650b413221070c640b41da0021070c630b41fa0021070c620b41a70121070c610b41830121070c600b20032005470d63200241013a0038200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241386a3602282002200241286a360258200241086a200241c8006a1028200241d3006a200241106a2802003600002002200229030837004b2002200241cf006a29000037001f20022002290048370318200041053a000420004101360200200020022903183700052000410c6a200229001f370000200241e0006a24000f0b41ef0021070c5e0b41eb0021070c5d0b419f0121070c5c0b41a20121070c5b0b41920121070c5a0b41930121070c590b41a90121070c580b410021014100210903402001411f4b0d810120032005460dbd012005417f460dfc022003200541016a2207490dfd02200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b024020014120490d00410d210120046741686a41ff017141034d0dbe010b411221070ce2030b410120036b2107200441026a2101410021054100210903402005411f4b0d8101200720016a4102460dbe012001450dfd0220032001490dfe02200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490def0120046741686a41ff017141034b0def01410d21010c81010b419c0121070c550b4200210a410021010340410e21072001413f4b0dff0120032005460dbe012005417f460dfd022003200541016a2209490dfe02200620056a2d0000210420082009360200200441ff0071220bad2001413f71ad86200a84210a200141076a210120092105200441187441187522094100480d000b200941c0007121052001413f4b0dee012005450dee01200a427f2001413f71ad8684210a412e21070cde030b41ec0021070c530b41a80121070c520b41a40121070c510b41aa0121070c500b41ab0121070c4f0b41cf0021070c4e0b41c90021070c4d0b418c0121070c4c0b419a0121070c4b0b41cd0021070c4a0b41820121070c490b41df0021070c480b41970121070c470b41ee0021070c460b41a60121070c450b41ea0021070c440b41ed0021070c430b41960121070c420b419e0121070c410b41a50121070c400b41990121070c3f0b41a10121070c3e0b41a30121070c3d0b418d0121070c3c0b418b0121070c3b0b41fe0021070c3a0b410120036b2107200441026a2101410021054100210903402005411f4b0d66200720016a4102460da4012001450de40220032001490de502200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490dd40120046741686a41ff017141034b0dd401410d21010c660b41002101410021090340410d210b2001411f4b0dc00320032005460da5012005417f460de5022003200541016a2204490de602200620056a2d0000210720082004360200200741ff00712001411f71742009722109200141076a210120042105200741187441187522044100480d000b200441c0007121052001411f4b0dd4012005450dd4012009417f2001411f7174722109412d21070cc3030b20032005470d3c200241013a0038200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241386a3602282002200241286a360258200241086a200241c8006a1028200241d3006a200241106a2802003600002002200229030837004b2002200241cf006a29000037001f20022002290048370318200041053a000420004101360200200020022903183700052000410c6a200229001f370000200241e0006a24000f0b41d60021070c360b41950121070c350b41d50021070c340b413821070c330b413421070c320b413b21070c310b413521070c300b41840121070c2f0b41980121070c2e0b41f20021070c2d0b41810121070c2c0b41f00021070c2b0b41940121070c2a0b418f0121070c290b418e0121070c280b413721070c270b41850121070c260b41910121070c250b20032005470d2b200241013a0037200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241376a3602282002200241286a360258200241386a200241c8006a1028200241d2006a200241c0006a2802003601002002200229033837014a2002200241ce006a29010037011e20022002290148370318410521090cae010b41f50021070c230b410120036b2107200441026a2101410021054100210903402005411f4b0d51200720016a4102460d90012001450dd10220032001490dd202200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490dbf0120046741686a41ff017141034b0dbf01410d21010c510b413c21070c210b410120036b2107200441026a2101410021054100210903402005411f4b0d51200720016a4102460d90012001450dd10220032001490dd202200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490dbe0120046741686a41ff017141034b0dbe01410d21010c510b41e30021070c1f0b41f40021070c1e0b200320056b41044f0d25200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102820004281808080d000370300200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b41f70021070c1c0b41fd0021070c1b0b41e20021070c1a0b410120036b2107200441026a2101410021054100210903402005411f4b0d4c200720016a4102460d8b012001450dcc0220032001490dcd02200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490db80120046741686a41ff017141034b0db801410d21010c4c0b41d40021070c180b41e10021070c170b41c30021070c160b41f80021070c150b41c40021070c140b41dd0021070c130b41c60021070c120b41e70021070c110b410021014100210903402001411f4b0d4520032005460d84012005417f460dc5022003200541016a2207490dc602200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b024020014120490d00410d210120046741686a41ff017141034d0d85010b411121070c9b030b41cc0021070c0f0b41c70021070c0e0b410120036b2107200441026a2101410021054100210903402005411f4b0d43200720016a4102460d83012001450dc40220032001490dc502200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490dad0120046741686a41ff017141034b0dad01410d21010c430b41d10021070c0c0b41d20021070c0b0b410120036b2107200441026a2101410021054100210903402005411f4b0d42200720016a4102460d82012001450dc30220032001490dc402200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490dab0120046741686a41ff017141034b0dab01410d21010c420b410120036b2107200441026a2101410021054100210903402005411f4b0d43200720016a4102460d83012001450dc40220032001490dc502200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490dab0120046741686a41ff017141034b0dab01410d21010c430b41ca0021070c080b200241c8006a2001102941042109200228024822064101470d10200041013602002000200241c8006a41047222012902003702042000410c6a200141086a290200370200200241e0006a24000f0b410120036b2107200441026a2101410021054100210903402005411f4b0d42200720016a4102460d82012001450dc30220032001490dc402200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490da90120046741686a41ff017141034b0da901410d21010c420b41c80021070c050b410120036b2107200441026a2101410021054100210903402005411f4b0d42200720016a4102460d82012001450dc30220032001490dc402200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490da80120046741686a41ff017141034b0da801410d21010c420b410021014100210903402001411f4b0d4320032005460d83012005417f460dc4022003200541016a2207490dc502200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b024020014120490d00410d210120046741686a41ff017141034d0d84010b410721070c8e030b410d21070c020b410021014100210903402001411f4b0d4220032005460d83012005417f460dc4022003200541016a2207490dc502200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b024020014120490d00410d210120046741686a41ff017141034d0d84010b410821070c8c030b410621070b0c89030b2000410b3a000420004101360200200041056a20073a0000200241e0006a24000f0b200441096a2101200541784f0df00220032001490df102200620056a290000210a20082001360200413021070c87030b200441026a21092005417f460df10220032009490df202200620056a2c00002101200820093602004100210b20014100480d7f200141017441807f71200172220141ff0171220541847e6a220941034b0da101024020090e0400f301f101f201000b4103210b410421070c88030b200441026a21012005417f460df20220032001490df302200620056a2d00002109200820013602002009450d8001200041153a000420004101360200200041056a20093a0000200241e0006a24000f0b200441026a21012005417f460df30220032001490df402200620056a2d00002109200820013602002009450d8001200041153a000420004101360200200041056a20093a0000200241e0006a24000f0b200441026a21092005417f460df40220032009490df502200620056a2c00002101200820093602004100210b20014100480d8001200141017441807f71200172220141ff0171220541847e6a220941034b0d9f01024020090e0400f301f101f201000b4103210b410221070c85030b200441026a21092005417f460df50220032009490df602200620056a2c00002101200820093602004100210b20014100480d8101200141017441807f71200172220141ff0171220541847e6a220941034b0d9f01024020090e0400f501f301f401000b4103210b410321070c84030b200441056a21012005417c4f0df60220032001490df702200620056a280000210920082001360200412f21070c82030b200241d0006a280200210b200228024c2103200241d4006a2802002205450d81012005410274220c4102752207ad420286220a422088a70de802200aa722044100480de8022004101f2209450df70220054102742104200c417c6a210c410021050340200920056a200320056a2802003602002004200541046a2205470d000b200c41027641016a210d200b450dff020cfe020b410f21010b0c360b410f21010b0c360b410f21010b0c360b410f21010b0c360b410f21010b0c360b410f21010c370b410f21010b0c370b410f21010c380b410f21010c390b410f21010c3a0b410f21010c3b0b410f21010b0c3b0b410f21010b0c3b0b410f21010b0c3b0b410f21010b0c3b0b410f21010b0c3b0b410f21010b0c3b0b410f21010b0c3b0b410f21010c3c0b410f21010b0c3c0b410f21010b0c3d0b410f21010b0c3e0b410f21010b0c3e0b410f21010b0c3e0b410f21010c3f0b410f21010b0c3f0b410f21010b0c3f0b410f21010b0c3f0b410f21010b0c3f0b410f21010b0c3f0b410f21010c400b410f21010c410b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102820022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102820022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102820022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102820022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102820022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102820022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102820022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102820022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102820022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102820022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102820022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102820022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102820022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102820022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0038200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241386a3602282002200241286a360258200241186a200241c8006a1028200228022021012002290318210a410521070c410b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102820022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10284105210b0c9a020b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102820022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102820022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102820022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102820022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102820022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102820022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102820022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a102820022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b411821090b2002200229011e37010e200220022903183703080c81020b412c21074100210b0c86020b412b21074100210b0c85020b411821090b2002200229011e37010e200220022903183703080cfc010b411821090b2002200229011e37010e200220022903183703080cf9010b410021074100210d200b0dfc010cfd010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d3a2001417f460db8012003200141016a2207490db901200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d3b0b200bad210a412821070cfe010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d3b2001417f460db9012003200141016a2207490dba01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d3c0b200bad210a412721070cfd010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d3c2001417f460dba012003200141016a2207490dbb01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d3d0b200bad210a411621070cfc010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d3d2001417f460dbb012003200141016a2207490dbc01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d3e0b200bad210a411821070cfb010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d3e2001417f460dbc012003200141016a2207490dbd01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d3f0b200bad210a412121070cfa010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d3f2001417f460dbd012003200141016a2207490dbe01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d400b200bad210a412221070cf9010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d402001417f460dbe012003200141016a2207490dbf01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d410b200bad210a411421070cf8010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d412001417f460dbf012003200141016a2207490dc001200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d420b200bad210a411c21070cf7010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d422001417f460dc0012003200141016a2207490dc101200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b41202107024020054120490d00410d210120046741686a41ff01714104490d430b200bad210a0cf6010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d432001417f460dc1012003200141016a2207490dc201200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d440b200bad210a411721070cf5010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d442001417f460dc2012003200141016a2207490dc301200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d450b200bad210a412421070cf4010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d452001417f460dc3012003200141016a2207490dc401200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d460b200bad210a412921070cf3010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d462001417f460dc4012003200141016a2207490dc501200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d470b200bad210a412a21070cf2010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d472001417f460dc5012003200141016a2207490dc601200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d480b200bad210a411521070cf1010b200141c000490d0e2005450d0e200b41ff00470d0f0c110b2001417f6a2101410021054100210b03402005411f4b0d2220032001460d472001417f460dc5012003200141016a2207490dc601200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d480b200bad210a411b21070cef010b20014120490d102005450d102004417f7341ff00716741686a41ff01714105490dea010c110b2001417f6a2101410021054100210b03402005411f4b0d2120032001460d472001417f460dc5012003200141016a2207490dc601200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d480b200bad210a411a21070ced010b2001417f6a2101410021054100210b03402005411f4b0d2120032001460d482001417f460dc6012003200141016a2207490dc701200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d490b200bad210a412321070cec010b2001417f6a2101410021054100210b03402005411f4b0d2120032001460d492001417f460dc7012003200141016a2207490dc801200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d4a0b200bad210a411d21070ceb010b2001417f6a2101410021054100210b03402005411f4b0d2120032001460d4a2001417f460dc8012003200141016a2207490dc901200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d4b0b200bad210a412521070cea010b2001417f6a2101410021054100210b03402005411f4b0d2120032001460d4b2001417f460dc9012003200141016a2207490dca01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d4c0b200bad210a411e21070ce9010b2001417f6a2101410021054100210b03402005411f4b0d2120032001460d4c2001417f460dca012003200141016a2207490dcb01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d4d0b200bad210a411921070ce8010b2001417f6a2101410021054100210b03402005411f4b0d2120032001460d4d2001417f460dcb012003200141016a2207490dcc01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d4e0b200bad210a412621070ce7010b2001417f6a2101410021054100210b03402005411f4b0d2120032001460d4e2001417f460dcc012003200141016a2207490dcd01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d4f0b200bad210a411f21070ce6010b41062109200541c001470de0014104210b410421070ce6010b41062109200541c001470dde014104210b410221070ce5010b41062109200541c001470ddc014104210b410321070ce4010b200441016a21012004417f460dd90120032001490dda01200620046a2d00002105200820013602002005450d54200041163a000420004101360200200041056a20053a0000200241e0006a24000f0b200141c000490d022009450d020b0b200020022f00083b0005200020073a000420004101360200200041106a2001360200200041086a200a370200200041076a2002410a6a2d00003a0000200241e0006a24000f0b412e21070cdd010b200441ff01716741686a41ff017141044b0d0020014120490d002005450dd9010b412d21070cdc010b410f21010c170b410f21010c180b410f21010c190b410f21010c1a0b410f21010c1b0b410f21010c1c0b410f21010c1d0b410f21010c1e0b410f21010c1f0b410f21010c200b410f21010c210b410f21010c220b410f21010c230b410f21010c240b410f21010c250b410f21010c260b410f21010c270b410f21010c280b410f21010c290b410f21010c2a0b410f21010c2b0b410f21010c2c0b410f21010c2d0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b4101210b0b410421070c96010b4102210b410421070c95010b4101210b0b410221070c93010b4102210b410221070c92010b4101210b0b410321070c90010b4102210b410321070c8f010b410c21074100210b0c8e010b417f2005102a000b20052003102b000b417f2001102a000b20012003102b000b417f2001102a000b20012003102b000b417f2001102a000b20012003102b000b417f2001102a000b20012003102b000b417f2001102a000b20012003102b000b417f200541016a102a000b200541016a2003102b000b417f2001102a000b20012003102b000b417f200541016a102a000b200541016a2003102b000b417f200541016a102a000b200541016a2003102b000b417f200541016a102a000b200541016a2003102b000b417f200541016a102a000b200541016a2003102b000b417f2001102a000b20012003102b000b417f2001102a000b20012003102b000b417f2001102a000b20012003102b000b417f2001102a000b20012003102b000b417f2001102a000b20012003102b000b417f2001102a000b20012003102b000b417f2001102a000b20012003102b000b417f200541016a102a000b200541016a2003102b000b417f2001102a000b20012003102b000b417f200541016a102a000b200541016a2003102b000b417f2001102a000b20012003102b000b417f200541016a102a000b200541016a2003102b000b417f2001102a000b20012003102b000b417f2001102a000b20012003102b000b417f2001102a000b20012003102b000b417f200541016a102a000b200541016a2003102b000b417f2001102a000b20012003102b000b417f2001102a000b20012003102b000b417f2001102a000b20012003102b000b417f2001102a000b20012003102b000b417f2001102a000b20012003102b000b417f200541016a102a000b200541016a2003102b000b417f200541016a102a000b200541016a2003102b000b417f200141016a102a000b200141016a2003102b000b417f200141016a102a000b200141016a2003102b000b417f200141016a102a000b200141016a2003102b000b417f200141016a102a000b200141016a2003102b000b417f200141016a102a000b200141016a2003102b000b417f200141016a102a000b200141016a2003102b000b417f200141016a102a000b200141016a2003102b000b417f200141016a102a000b200141016a2003102b000b417f200141016a102a000b200141016a2003102b000b417f200141016a102a000b200141016a2003102b000b417f200141016a102a000b200141016a2003102b000b417f200141016a102a000b200141016a2003102b000b417f200141016a102a000b200141016a2003102b000b417f200141016a102a000b200141016a2003102b000b417f200141016a102a000b200141016a2003102b000b417f200141016a102a000b200141016a2003102b000b417f200141016a102a000b200141016a2003102b000b417f200141016a102a000b200141016a2003102b000b417f200141016a102a000b200141016a2003102b000b417f200141016a102a000b200141016a2003102b000b417f200141016a102a000b200141016a2003102b000b417f200141016a102a000b200141016a2003102b000b417f200141016a102a000b200141016a2003102b000b1021000b20052001102a000b20012003102b000b417f2009102a000b20092003102b000b417f2001102a000b20012003102b000b417f2001102a000b20012003102b000b417f2009102a000b20092003102b000b417f2009102a000b20092003102b000b20052001102a000b20012003102b000b200441041020000b417f2001102a000b20012003102b000b200020013a0005200020093a000420002002290308370106200041013602002000410c6a200229010e370100200241e0006a24000f0b200020013a0005200020093a000420002002290308370106200041013602002000410c6a200229010e370100200241e0006a24000f0b200020013a0005200020093a000420002002290308370106200041013602002000410c6a200229010e370100200241e0006a24000f0b2000200b36020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b2003101d0b024020022d004c4105470d002006450d00200241d4006a280200450d00200241d0006a280200101d0b0240024002402007200d470d002007210d0c010b2007200d490d010240200d450d0020092007410274200d4102742205101e22090d01200541041020000b4100210d02402007450d002009101d0b410421090b410021052001410c6a210b200141086a210c410021070240024002400240024003402005411f4b0d01200c2802002206200b2802002203460d02200341016a21042003417f460d0420062004490d05200128020020036a2d0000210320082004360200200341ff00712005411f71742007722107200541076a21052003418001710d000b024020054120490d00410d210120036741686a41ff01714104490d030b2007ad422086200dad84210a410921070c070b410f21010c010b200241013a0008200241dc006a41013602002002410136022c2002420137024c20024190afc4003602482002200241086a3602282002200241286a360258200241186a200241c8006a1028410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200d41ffffffff0371450d062009101d200241e0006a24000f0b417f2004102a000b20042006102b000b41b8cfc200102c000b0b0b20004100360200200041106a200a3703002000410c6a2009360200200041096a200b3a0000200041086a20073a00000b200241e0006a24000b6b000240024020002d000022004101460d0020004102470d01200128021841f1aac200410b2001411c6a28020028020c1100000f0b200128021841e4aac200410d2001411c6a28020028020c1100000f0b200128021841d8aac200410c2001411c6a28020028020c1100000b800301067f230041306b22022400200128020021030240024002400240024002400240200128020422044103742205450d00200341046a2106410021070340200628020020076a2107200641086a2106200541786a22050d000b200141146a280200450d010c020b41002107200141146a2802000d010b200721060c010b2004450d02024002402007410f4b0d002003280204450d010b200720076a220620074f0d010b4101210541002106200241086a21070c010b2006417f4c0d02200241086a210702402006450d002006101f22050d01200641011020000b41012105410021060b200241003602102002200636020c200220053602082002200241086a360214200241186a41106a200141106a290200370300200241186a41086a200141086a290200370300200220012902003703180240200241146a41a0b1c400200241186a10c1030d0020002007290200370200200041086a200741086a280200360200200241306a24000f0b10c203000b4190b1c40041004100104b000b102e000bbb07030d7f017e017f230041c0006b22022400410021032001410c6a2104200141086a210541002106024002400240024002400240024002400240024002400240024002400240024003402003411f4b0d012005280200220720042802002208460d02200841016a21092008417f460d0920072009490d0a200128020020086a2d0000210820042009360200200841ff00712003411f71742006722106200341076a21032008418001710d000b024020034120490d00410d210320086741686a41ff017141034d0d030b2006450d032001410c6a2107200141086a210a4100210b4104210c4100210d0340200d220e41016a210d410021034100210403402003411f4b0d07200a280200220520072802002208460d08200841016a21092008417f460d0c20052009490d0d200128020020086a2d0000210820072009360200200841ff00712003411f71742004722104200341076a21032008418001710d000b024020034120490d0020086741686a41ff01714104490d090b0240200b200e470d00200b4101742203200b41016a220820082003491b2203ad420286220f422088a70d0e200fa722084100480d0e02400240200b450d00200c200b4102742008101e220c0d010c110b2008101f220c450d100b2003210b0b20044108762110200c200e4102746a2004360200200d2006490d000c050b0b410f21030c010b200241013a000f2002413c6a4101360200200241013602142002420137022c20024190afc40036022820022002410f6a3602102002200241106a360238200241186a200241286a1028410521030b200241086a2208200241186a41086a280200360200200220022902183703002000200336020420004101360200200041086a2002290300370200200041106a20082802003602000c0c0b4104210c4100210b4100210d0b2000200c360204200041003602002000410c6a200d360200200041086a200b360200200241c0006a24000f0b410f21030c080b200241013a00002002413c6a4101360200200241013602142002420137022c20024190afc400360228200220023602102002200241106a360238200241186a200241286a102820022802202104200228021c21092002280218210841002110410521030c070b410d21030c060b417f2009102a000b20092007102b000b417f2009102a000b20092005102b000b1021000b200841041020000b20004101360200200041106a20043602002000410c6a2009360200200041086a200836020020002010410874200372360204200b450d00200c101d200241c0006a24000f0b200241c0006a24000b7001017f230041306b2202240020022001360204200220003602002002412c6a41023602002002411c6a4102360200200241023602242002420237020c20024198b2c4003602082002200241046a360228200220023602202002200241206a360218200241086a41a8b2c40010cf01000b7001017f230041306b2202240020022001360204200220003602002002412c6a41023602002002411c6a4102360200200241023602242002420237020c200241f8b1c4003602082002200241046a360228200220023602202002200241206a360218200241086a4188b2c40010cf01000b6902017f037e230041306b22012400200029020821022000290210210320002902002104200141146a410036020020012004370318200141f8b3c200360210200142013702042001200141186a36020020012003370328200120023703202001200141206a10cf01000bd0ec0203077f017e037f230041106b2203240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d0000417f6a220441aa014b0d000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040eab01000b1c1001ab01a801aa01a401240d14a90104151b9b01541e2555063607a201890173279201a101a70135090f8a013a9e01a50105023b44754c74578e01030a47177a7c4285017926297b8b01080e282f1319950197012399019d01a6015ea301189c01611f5d129f01a00121930177760c1145482b1698011d6332940191018c012c1a379a013d2a674d5868644e8001437f318d0188012e8f019601204941309001723e228101624b7d86012d34333940705f6f84018301388701515282017869657e6c603c563f6a4f466d506e5a6b664a59535b5c000b200241086a2802002002410c6a2802002204470dcf01200441016a22052004490dfe0720044101742206200520052006491b22064100480dfe072004450d9f03200241046a28020020042006101e2205450da0030c8e080b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dfd0720044101742206200520052006491b22064100480dfd072004450dd602200241046a28020020042006101e2205450dd7020c8b080b200241046a2107200141086a2802002106200141046a2802002105200241086a2802002002410c6a2802002204470daa01200441016a22082004490d870820044101742209200820082009491b22084100480d87082004450dd702200728020020042008101e2209450dd8020c85080b200241046a2105200141086a290300210a200241086a2802002002410c6a2802002204470daa01200441016a22062004490d860820044101742208200620062008491b22084100480d86082004450dd802200528020020042008101e2206450dd9020c82080b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dfa0720044101742206200520052006491b22064100480dfa072004450dd902200241046a28020020042006101e2205450dda020cff070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490d840820044101742209200820082009491b22084100480d84082004450dda02200728020020042008101e2209450ddb020cfc070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490df80720044101742209200820082009491b22084100480df8072004450ddb02200728020020042008101e2209450ddc020cf6070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490df70720044101742209200820082009491b22084100480df7072004450ddc02200728020020042008101e2209450ddd020cf3070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d810820044101742206200520052006491b22064100480d81082004450ddd02200241046a28020020042006101e2205450dde020cf0070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490df50720044101742209200820082009491b22084100480df5072004450dde02200728020020042008101e2209450ddf020ced070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dff0720044101742206200520052006491b22064100480dff072004450ddf02200241046a28020020042006101e2205450de0020cea070b200241046a210520012d00012108200241086a2802002002410c6a2802002204470daa01200441016a22062004490df30720044101742209200620062009491b22094100480df3072004450de002200528020020042009101e2206450de1020ce7070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490da30520044101742206200520052006491b22064100480da3052004450de102200241046a28020020042006101e2205450de2020ce4070b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470daa01200641016a22052006490df10720064101742208200520052008491b22054100480df1072006450de202200728020020062005101e2208450de3020ce1070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dfb0720044101742206200520052006491b22064100480dfb072004450de302200241046a28020020042006101e2205450de4020cde070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490dfa0720044101742209200820082009491b22084100480dfa072004450de402200728020020042008101e2209450de5020cdb070b200241046a210520012d00012108200241086a2802002002410c6a2802002204470daa01200441016a22062004490dee0720044101742209200620062009491b22094100480dee072004450de502200528020020042009101e2206450de6020cd8070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d9e0520044101742206200520052006491b22064100480d9e052004450de602200241046a28020020042006101e2205450de7020cd5070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df70720044101742206200520052006491b22064100480df7072004450de702200241046a28020020042006101e2205450de8020cd2070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df60720044101742206200520052006491b22064100480df6072004450de802200241046a28020020042006101e2205450de9020ccf070b200241046a210b200141046a280200210520012d0001210c200241086a2802002002410c6a2802002204470daa01200441016a22062004490dea0720044101742208200620062008491b22064100480dea072004450de902200b28020020042006101e2208450dea020ccc070b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470daa01200641016a22052006490de90720064101742208200520052008491b22054100480de9072006450dea02200728020020062005101e2208450deb020cc9070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d990520044101742206200520052006491b22064100480d99052004450deb02200241046a28020020042006101e2205450dec020cc6070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df20720044101742206200520052006491b22064100480df2072004450dec02200241046a28020020042006101e2205450ded020cc3070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df10720044101742206200520052006491b22064100480df1072004450ded02200241046a28020020042006101e2205450dee020cc0070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df00720044101742206200520052006491b22064100480df0072004450dee02200241046a28020020042006101e2205450def020cbd070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d950520044101742206200520052006491b22064100480d95052004450def02200241046a28020020042006101e2205450df0020cba070b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470daa01200641016a22052006490de30720064101742208200520052008491b22054100480de3072006450df002200728020020062005101e2208450df1020cb7070b200241046a210520012d00012108200241086a2802002002410c6a2802002204470daa01200441016a22062004490de20720044101742209200620062009491b22094100480de2072004450df102200528020020042009101e2206450df2020cb4070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d920520044101742206200520052006491b22064100480d92052004450df202200241046a28020020042006101e2205450df3020cb1070b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470daa01200641016a22052006490de00720064101742208200520052008491b22054100480de0072006450df302200728020020062005101e2208450df4020cae070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dea0720044101742206200520052006491b22064100480dea072004450df402200241046a28020020042006101e2205450df5020cab070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d8f0520044101742206200520052006491b22064100480d8f052004450df502200241046a28020020042006101e2205450df6020ca8070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490de80720044101742206200520052006491b22064100480de8072004450df602200241046a28020020042006101e2205450df7020ca5070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d8d0520044101742206200520052006491b22064100480d8d052004450df702200241046a28020020042006101e2205450df8020ca2070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490de60720044101742206200520052006491b22064100480de6072004450df802200241046a28020020042006101e2205450df9020c9f070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dda0720044101742206200520052006491b22064100480dda072004450df902200241046a28020020042006101e2205450dfa020c9c070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dd90720044101742209200820082009491b22084100480dd9072004450dfc02200728020020042008101e2209450dfd020c99070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de30720044101742206200520052006491b22064100480de3072004450dfd02200241046a28020020042006101e2205450dfe020c96070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dd70720044101742209200820082009491b22084100480dd7072004450dfe02200728020020042008101e2209450dff020c93070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de10720044101742206200520052006491b22064100480de1072004450dff02200241046a28020020042006101e2205450d80030c90070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de00720044101742206200520052006491b22064100480de0072004450d8003200241046a28020020042006101e2205450d81030c8d070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d850520044101742206200520052006491b22064100480d85052004450d8103200241046a28020020042006101e2205450d82030c8a070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d840520044101742206200520052006491b22064100480d84052004450d8203200241046a28020020042006101e2205450d83030c87070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d830520044101742206200520052006491b22064100480d83052004450d8303200241046a28020020042006101e2205450d84030c84070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d820520044101742206200520052006491b22064100480d82052004450d8403200241046a28020020042006101e2205450d85030c81070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d810520044101742206200520052006491b22064100480d81052004450d8503200241046a28020020042006101e2205450d86030cfe060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dda0720044101742206200520052006491b22064100480dda072004450d8603200241046a28020020042006101e2205450d87030cfb060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dff0420044101742206200520052006491b22064100480dff042004450d8703200241046a28020020042006101e2205450d88030cf8060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfe0420044101742206200520052006491b22064100480dfe042004450d8803200241046a28020020042006101e2205450d89030cf5060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfd0420044101742206200520052006491b22064100480dfd042004450d8903200241046a28020020042006101e2205450d8a030cf2060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfc0420044101742206200520052006491b22064100480dfc042004450d8a03200241046a28020020042006101e2205450d8b030cef060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfb0420044101742206200520052006491b22064100480dfb042004450d8b03200241046a28020020042006101e2205450d8c030cec060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dc90720044101742209200820082009491b22084100480dc9072004450d8c03200728020020042008101e2209450d8d030ce9060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dc80720044101742209200820082009491b22084100480dc8072004450d8d03200728020020042008101e2209450d8e030ce6060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df80420044101742206200520052006491b22064100480df8042004450d8e03200241046a28020020042006101e2205450d8f030ce3060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df70420044101742206200520052006491b22064100480df7042004450d8f03200241046a28020020042006101e2205450d90030ce0060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df60420044101742206200520052006491b22064100480df6042004450d9003200241046a28020020042006101e2205450d91030cdd060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dcf0720044101742209200820082009491b22084100480dcf072004450d9103200728020020042008101e2209450d92030cda060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dce0720044101742209200820082009491b22084100480dce072004450d9203200728020020042008101e2209450d93030cd7060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df30420044101742206200520052006491b22064100480df3042004450d9303200241046a28020020042006101e2205450d94030cd4060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df20420044101742206200520052006491b22064100480df2042004450d9403200241046a28020020042006101e2205450d95030cd1060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df10420044101742206200520052006491b22064100480df1042004450d9503200241046a28020020042006101e2205450d96030cce060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df00420044101742206200520052006491b22064100480df0042004450d9603200241046a28020020042006101e2205450d97030ccb060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490def0420044101742206200520052006491b22064100480def042004450d9703200241046a28020020042006101e2205450d98030cc8060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dee0420044101742206200520052006491b22064100480dee042004450d9803200241046a28020020042006101e2205450d99030cc5060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc70720044101742206200520052006491b22064100480dc7072004450d9903200241046a28020020042006101e2205450d9a030cc2060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dec0420044101742206200520052006491b22064100480dec042004450d9a03200241046a28020020042006101e2205450d9b030cbf060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dc50720044101742209200820082009491b22084100480dc5072004450d9b03200728020020042008101e2209450d9c030cbc060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dea0420044101742206200520052006491b22064100480dea042004450d9c03200241046a28020020042006101e2205450d9d030cb9060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dea0420044101742206200520052006491b22064100480dea042004450d9d03200241046a28020020042006101e2205450d9e030cb6060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc20720044101742206200520052006491b22064100480dc2072004450d9e03200241046a28020020042006101e2205450d9f030cb3060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de70420044101742206200520052006491b22064100480de7042004450d9f03200241046a28020020042006101e2205450da0030cb0060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de60420044101742206200520052006491b22064100480de6042004450da003200241046a28020020042006101e2205450da1030cad060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de60420044101742206200520052006491b22064100480de6042004450da103200241046a28020020042006101e2205450da2030caa060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de40420044101742206200520052006491b22064100480de4042004450da203200241046a28020020042006101e2205450da3030ca7060b200241046a210520012d00012108200241086a2802002002410c6a2802002204470dab01200441016a22062004490dbd0720044101742209200620062009491b22094100480dbd072004450da303200528020020042009101e2206450da4030ca4060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de20420044101742206200520052006491b22064100480de2042004450da403200241046a28020020042006101e2205450da5030ca1060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de10420044101742206200520052006491b22064100480de1042004450da503200241046a28020020042006101e2205450da6030c9e060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de00420044101742206200520052006491b22064100480de0042004450da603200241046a28020020042006101e2205450da7030c9b060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de00420044101742206200520052006491b22064100480de0042004450da703200241046a28020020042006101e2205450da8030c98060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dde0420044101742206200520052006491b22064100480dde042004450da803200241046a28020020042006101e2205450da9030c95060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490ddd0420044101742206200520052006491b22064100480ddd042004450da903200241046a28020020042006101e2205450daa030c92060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490ddd0420044101742206200520052006491b22064100480ddd042004450daa03200241046a28020020042006101e2205450dab030c8f060b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470dab01200641016a22052006490daa0720064101742208200520052008491b22054100480daa072006450dab03200728020020062005101e2208450dac030c8c060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490da90720044101742209200820082009491b22084100480da9072004450dac03200728020020042008101e2209450dad030c89060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd90420044101742206200520052006491b22064100480dd9042004450dad03200241046a28020020042006101e2205450dae030c86060b200141086a290300210a200241086a2802002002410c6a2802002204470dab01200441016a22052004490db20720044101742206200520052006491b22064100480db2072004450dae03200241046a28020020042006101e2205450daf030c82060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd70420044101742206200520052006491b22064100480dd7042004450daf03200241046a28020020042006101e2205450db0030cff050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd70420044101742206200520052006491b22064100480dd7042004450db003200241046a28020020042006101e2205450db1030cfc050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd60420044101742206200520052006491b22064100480dd6042004450db103200241046a28020020042006101e2205450db2030cf9050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd50420044101742206200520052006491b22064100480dd5042004450db203200241046a28020020042006101e2205450db3030cf6050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd40420044101742206200520052006491b22064100480dd4042004450db303200241046a28020020042006101e2205450db4030cf3050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dac0720044101742206200520052006491b22064100480dac072004450db403200241046a28020020042006101e2205450db5030cf0050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dab0720044101742206200520052006491b22064100480dab072004450db503200241046a28020020042006101e2205450db6030ced050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd00420044101742206200520052006491b22064100480dd0042004450db603200241046a28020020042006101e2205450db7030cea050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dcf0420044101742206200520052006491b22064100480dcf042004450db703200241046a28020020042006101e2205450db8030ce7050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da80720044101742206200520052006491b22064100480da8072004450db803200241046a28020020042006101e2205450db9030ce4050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dcd0420044101742206200520052006491b22064100480dcd042004450db903200241046a28020020042006101e2205450dba030ce1050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dcc0420044101742206200520052006491b22064100480dcc042004450dba03200241046a28020020042006101e2205450dbb030cde050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dcb0420044101742206200520052006491b22064100480dcb042004450dbb03200241046a28020020042006101e2205450dbc030cdb050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dca0420044101742206200520052006491b22064100480dca042004450dbc03200241046a28020020042006101e2205450dbd030cd8050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dca0420044101742206200520052006491b22064100480dca042004450dbd03200241046a28020020042006101e2205450dbe030cd5050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc80420044101742206200520052006491b22064100480dc8042004450dbe03200241046a28020020042006101e2205450dbf030cd2050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc70420044101742206200520052006491b22064100480dc7042004450dbf03200241046a28020020042006101e2205450dc0030ccf050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc60420044101742206200520052006491b22064100480dc6042004450dc003200241046a28020020042006101e2205450dc1030ccc050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc50420044101742206200520052006491b22064100480dc5042004450dc103200241046a28020020042006101e2205450dc2030cc9050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc50420044101742206200520052006491b22064100480dc5042004450dc203200241046a28020020042006101e2205450dc3030cc6050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc30420044101742206200520052006491b22064100480dc3042004450dc303200241046a28020020042006101e2205450dc4030cc3050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc30420044101742206200520052006491b22064100480dc3042004450dc403200241046a28020020042006101e2205450dc5030cc0050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc20420044101742206200520052006491b22064100480dc2042004450dc503200241046a28020020042006101e2205450dc6030cbd050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc00420044101742206200520052006491b22064100480dc0042004450dc603200241046a28020020042006101e2205450dc7030cba050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dbf0420044101742206200520052006491b22064100480dbf042004450dc703200241046a28020020042006101e2205450dc8030cb7050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d8d0720044101742206200520052006491b22064100480d8d072004450dc803200241046a28020020042006101e2205450dc9030cb4050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dbd0420044101742206200520052006491b22064100480dbd042004450dc903200241046a28020020042006101e2205450dca030cb1050b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490d8b0720044101742209200820082009491b22084100480d8b072004450dca03200728020020042008101e2209450dcb030cae050b200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22052004490d950720044101742208200520052008491b22084100480d95072004450dcb03200241046a28020020042008101e2205450dcc030cab050b200241046a210520012d00012108200241086a2802002002410c6a2802002204470dab01200441016a22062004490d940720044101742209200620062009491b22094100480d94072004450dcc03200528020020042009101e2206450dcd030ca8050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db90420044101742206200520052006491b22064100480db9042004450dcd03200241046a28020020042006101e2205450dce030ca5050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db80420044101742206200520052006491b22064100480db8042004450dce03200241046a28020020042006101e2205450dcf030ca2050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db70420044101742206200520052006491b22064100480db7042004450dcf03200241046a28020020042006101e2205450dd0030c9f050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d900720044101742206200520052006491b22064100480d90072004450dd003200241046a28020020042006101e2205450dd1030c9c050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d8f0720044101742206200520052006491b22064100480d8f072004450dd103200241046a28020020042006101e2205450dd2030c99050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d8e0720044101742206200520052006491b22064100480d8e072004450dd203200241046a28020020042006101e2205450dd3030c96050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d8d0720044101742206200520052006491b22064100480d8d072004450dd303200241046a28020020042006101e2205450dd4030c93050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db20420044101742206200520052006491b22064100480db2042004450dd403200241046a28020020042006101e2205450dd5030c90050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db10420044101742206200520052006491b22064100480db1042004450dd503200241046a28020020042006101e2205450dd6030c8d050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db00420044101742206200520052006491b22064100480db0042004450dd603200241046a28020020042006101e2205450dd7030c8a050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490daf0420044101742206200520052006491b22064100480daf042004450dd703200241046a28020020042006101e2205450dd8030c87050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dae0420044101742206200520052006491b22064100480dae042004450dd803200241046a28020020042006101e2205450dd9030c84050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dad0420044101742206200520052006491b22064100480dad042004450dd903200241046a28020020042006101e2205450dda030c81050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dac0420044101742206200520052006491b22064100480dac042004450dda03200241046a28020020042006101e2205450ddb030cfe040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dab0420044101742206200520052006491b22064100480dab042004450ddb03200241046a28020020042006101e2205450ddc030cfb040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d840720044101742206200520052006491b22064100480d84072004450ddc03200241046a28020020042006101e2205450ddd030cf8040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da90420044101742206200520052006491b22064100480da9042004450ddd03200241046a28020020042006101e2205450dde030cf5040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da80420044101742206200520052006491b22064100480da8042004450dde03200241046a28020020042006101e2205450ddf030cf2040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da70420044101742206200520052006491b22064100480da7042004450ddf03200241046a28020020042006101e2205450de0030cef040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490df50620044101742209200820082009491b22084100480df5062004450de003200728020020042008101e2209450de1030cec040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dff0620044101742209200820082009491b22084100480dff062004450de103200728020020042008101e2209450de2030ce9040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfe0620044101742206200520052006491b22064100480dfe062004450de203200241046a28020020042006101e2205450de3030ce6040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da30420044101742206200520052006491b22064100480da3042004450de303200241046a28020020042006101e2205450de4030ce3040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da20420044101742206200520052006491b22064100480da2042004450de403200241046a28020020042006101e2205450de5030ce0040b200241046a2105200141046a2802002108200241086a2802002002410c6a2802002204470dab01200441016a22062004490dfb0620044101742209200620062009491b22094100480dfb062004450de503200528020020042009101e2206450de6030cdd040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da00420044101742206200520052006491b22064100480da0042004450de603200241046a28020020042006101e2205450de7030cda040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d9f0420044101742206200520052006491b22064100480d9f042004450de703200241046a28020020042006101e2205450de8030cd7040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d9e0420044101742206200520052006491b22064100480d9e042004450de803200241046a28020020042006101e2205450de9030cd4040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dec0620044101742209200820082009491b22084100480dec062004450de903200728020020042008101e2209450dea030cd1040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df60620044101742206200520052006491b22064100480df6062004450dea03200241046a28020020042006101e2205450deb030cce040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d9b0420044101742206200520052006491b22064100480d9b042004450deb03200241046a28020020042006101e2205450dec030ccb040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df40620044101742206200520052006491b22064100480df4062004450dec03200241046a28020020042006101e2205450ded030cc8040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d990420044101742206200520052006491b22064100480d99042004450ded03200241046a28020020042006101e2205450dee030cc5040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df20620044101742206200520052006491b22064100480df2062004450dee03200241046a28020020042006101e2205450def030cc2040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d970420044101742206200520052006491b22064100480d97042004450def03200241046a28020020042006101e2205450df0030cbf040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df00620044101742206200520052006491b22064100480df0062004450df003200241046a28020020042006101e2205450df1030cbc040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d950420044101742206200520052006491b22064100480d95042004450df103200241046a28020020042006101e2205450df2030cb9040b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470dab01200641016a22052006490de30620064101742208200520052008491b22054100480de3062006450df203200728020020062005101e2208450df3030cb6040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490ded0620044101742206200520052006491b22064100480ded062004450df303200241046a28020020042006101e2205450df4030cb3040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dec0620044101742206200520052006491b22064100480dec062004450df403200241046a28020020042006101e2205450df5030cb0040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490deb0620044101742209200820082009491b22084100480deb062004450df503200728020020042008101e2209450df6030cad040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dea0620044101742206200520052006491b22064100480dea062004450df603200241046a28020020042006101e2205450df7030caa040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de90620044101742206200520052006491b22064100480de9062004450df703200241046a28020020042006101e2205450df8030ca7040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490ddd0620044101742209200820082009491b22084100480ddd062004450df803200728020020042008101e2209450df9030ca4040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490ddc0620044101742209200820082009491b22084100480ddc062004450df903200728020020042008101e2209450dfa030ca1040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de60620044101742206200520052006491b22064100480de6062004450dfa03200241046a28020020042006101e2205450dfb030c9e040b200241046a21092001410c6a2802002104200141086a280200210b200141046a280200210d200241086a2802002002410c6a2802002205470dab01200541016a22012005490dda0620054101742206200120012006491b22014100480dda062005450dfb03200928020020052001101e2206450dfc030c9b040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490de40620044101742209200820082009491b22084100480de4062004450dfc03200728020020042008101e2209450dfd030c98040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de30620044101742206200520052006491b22064100480de3062004450dfd03200241046a28020020042006101e2205450dfe030c95040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dd70620044101742209200820082009491b22084100480dd7062004450dfe03200728020020042008101e2209450dff030c92040b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470dab01200641016a22052006490dd60620064101742208200520052008491b22054100480dd6062006450dff03200728020020062005101e2208450d80040c8f040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd50620044101742206200520052006491b22064100480dd5062004450d8004200241046a28020020042006101e2205450d81040c8c040b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470dab01200641016a22052006490dd40620064101742208200520052008491b22054100480dd4062006450d8104200728020020062005101e2208450d82040c89040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd30620044101742206200520052006491b22064100480dd3062004450d8204200241046a28020020042006101e2205450d83040c86040b200241046a28020021050ce1060b200728020021090cdb060b200528020021060cd8060b200241046a28020021050cd5060b200728020021090cd2060b200728020021090ccc060b200728020021090cc9060b200241046a28020021050cc6060b200728020021090cc3060b200241046a28020021050cc0060b200528020021060cbd060b200241046a28020021050cba060b200728020021080cb7060b200241046a28020021050cb4060b200728020021090cb1060b200528020021060cae060b200241046a28020021050cab060b200241046a28020021050ca8060b200241046a28020021050ca5060b200b28020021080ca2060b200728020021080c9f060b200241046a28020021050c9c060b200241046a28020021050c99060b200241046a28020021050c96060b200241046a28020021050c93060b200241046a28020021050c90060b200728020021080c8d060b200528020021060c8a060b200241046a28020021050c87060b200728020021080c84060b200241046a28020021050c81060b200241046a28020021050cfe050b200241046a28020021050cfb050b200241046a28020021050cf8050b200241046a28020021050cf5050b200241046a28020021050cf2050b200241046a28020021050cbf060b200728020021090cee050b200241046a28020021050ceb050b200728020021090ce8050b200241046a28020021050ce5050b200241046a28020021050ce2050b200241046a28020021050cdf050b200241046a28020021050cdc050b200241046a28020021050cd9050b200241046a28020021050cd6050b200241046a28020021050cd3050b200241046a28020021050cd0050b200241046a28020021050ccd050b200241046a28020021050cca050b200241046a28020021050cc7050b200241046a28020021050cc4050b200241046a28020021050cc1050b200728020021090cbe050b200728020021090cbb050b200241046a28020021050cb8050b200241046a28020021050cb5050b200241046a28020021050cb2050b200728020021090caf050b200728020021090cac050b200241046a28020021050ca9050b200241046a28020021050ca6050b200241046a28020021050ca3050b200241046a28020021050ca0050b200241046a28020021050c9d050b200241046a28020021050c9a050b200241046a28020021050c97050b200241046a28020021050c94050b200728020021090c91050b200241046a28020021050c8e050b200241046a28020021050c8b050b200241046a28020021050c88050b200241046a28020021050c85050b200241046a28020021050c82050b200241046a28020021050cff040b200241046a28020021050cfc040b200528020021060cf9040b200241046a28020021050cf6040b200241046a28020021050cf3040b200241046a28020021050cf0040b200241046a28020021050ced040b200241046a28020021050cea040b200241046a28020021050ce7040b200241046a28020021050ce4040b200728020021080ce1040b200728020021090cde040b200241046a28020021050cdb040b200241046a28020021050cd7040b200241046a28020021050cd4040b200241046a28020021050cd1040b200241046a28020021050cce040b200241046a28020021050ccb040b200241046a28020021050cc8040b200241046a28020021050cc5040b200241046a28020021050cc2040b200241046a28020021050cbf040b200241046a28020021050cbc040b200241046a28020021050cb9040b200241046a28020021050cb6040b200241046a28020021050cb3040b200241046a28020021050cb0040b200241046a28020021050cad040b200241046a28020021050caa040b200241046a28020021050ca7040b200241046a28020021050ca4040b200241046a28020021050ca1040b200241046a28020021050c9e040b200241046a28020021050c9b040b200241046a28020021050c98040b200241046a28020021050c95040b200241046a28020021050c92040b200241046a28020021050c8f040b200241046a28020021050c8c040b200241046a28020021050c89040b200241046a28020021050c86040b200728020021090c83040b200241046a28020021050c80040b200528020021060cfd030b200241046a28020021050cfa030b200241046a28020021050cf7030b200241046a28020021050cf4030b200241046a28020021050cf1030b200241046a28020021050cee030b200241046a28020021050ceb030b200241046a28020021050ce8030b200241046a28020021050ce5030b200241046a28020021050ce2030b200241046a28020021050cdf030b200241046a28020021050cdc030b200241046a28020021050cd9030b200241046a28020021050cd6030b200241046a28020021050cd3030b200241046a28020021050cd0030b200241046a28020021050ccd030b200241046a28020021050cca030b200241046a28020021050cc7030b200241046a28020021050cc4030b200728020021090cc1030b200728020021090cbe030b200241046a28020021050cbb030b200241046a28020021050cb8030b200241046a28020021050cb5030b200528020021060cb2030b200241046a28020021050caf030b200241046a28020021050cac030b200241046a28020021050ca9030b200728020021090ca6030b200241046a28020021050ca3030b200241046a28020021050ca0030b200241046a28020021050c9d030b200241046a28020021050c9a030b200241046a28020021050c97030b200241046a28020021050c94030b200241046a28020021050c91030b200241046a28020021050c8e030b200728020021080c8b030b200241046a28020021050c88030b200241046a28020021050c85030b200728020021090c82030b200241046a28020021050cff020b200241046a28020021050cfc020b200728020021090cf9020b200728020021090cf6020b200241046a28020021050cf3020b200928020021060cf0020b200728020021090ced020b200241046a28020021050cea020b200728020021090ce7020b200728020021080ce4020b200241046a28020021050ce1020b200728020021080cde020b200241046a28020021050cdb020b2006101f22050db4050b200641011020000b2008101f22090dad050b200841011020000b2008101f22060da9050b200841011020000b2006101f22050da5050b200641011020000b2008101f22090da1050b200841011020000b2008101f22090d9a050b200841011020000b2008101f22090d96050b200841011020000b2006101f22050d92050b200641011020000b2008101f22090d8e050b200841011020000b2006101f22050d8a050b200641011020000b2009101f22060d86050b200941011020000b2006101f22050d82050b200641011020000b2005101f22080dfe040b200541011020000b2006101f22050dfa040b200641011020000b2008101f22090df6040b200841011020000b2009101f22060df2040b200941011020000b2006101f22050dee040b200641011020000b2006101f22050dea040b200641011020000b2006101f22050de6040b200641011020000b2006101f22080de2040b200641011020000b2005101f22080dde040b200541011020000b2006101f22050dda040b200641011020000b2006101f22050dd6040b200641011020000b2006101f22050dd2040b200641011020000b2006101f22050dce040b200641011020000b2006101f22050dca040b200641011020000b2005101f22080dc6040b200541011020000b2009101f22060dc2040b200941011020000b2006101f22050dbe040b200641011020000b2005101f22080dba040b200541011020000b2006101f22050db6040b200641011020000b2006101f22050db2040b200641011020000b2006101f22050dae040b200641011020000b2006101f22050daa040b200641011020000b2006101f22050da6040b200641011020000b2006101f22050da2040b200641011020000b2006101f22050dee040b200641011020000b2008101f22090d9c040b200841011020000b2006101f22050d98040b200641011020000b2008101f22090d94040b200841011020000b2006101f22050d90040b200641011020000b2006101f22050d8c040b200641011020000b2006101f22050d88040b200641011020000b2006101f22050d84040b200641011020000b2006101f22050d80040b200641011020000b2006101f22050dfc030b200641011020000b2006101f22050df8030b200641011020000b2006101f22050df4030b200641011020000b2006101f22050df0030b200641011020000b2006101f22050dec030b200641011020000b2006101f22050de8030b200641011020000b2006101f22050de4030b200641011020000b2006101f22050de0030b200641011020000b2008101f22090ddc030b200841011020000b2008101f22090dd8030b200841011020000b2006101f22050dd4030b200641011020000b2006101f22050dd0030b200641011020000b2006101f22050dcc030b200641011020000b2008101f22090dc8030b200841011020000b2008101f22090dc4030b200841011020000b2006101f22050dc0030b200641011020000b2006101f22050dbc030b200641011020000b2006101f22050db8030b200641011020000b2006101f22050db4030b200641011020000b2006101f22050db0030b200641011020000b2006101f22050dac030b200641011020000b2006101f22050da8030b200641011020000b2006101f22050da4030b200641011020000b2008101f22090da0030b200841011020000b2006101f22050d9c030b200641011020000b2006101f22050d98030b200641011020000b2006101f22050d94030b200641011020000b2006101f22050d90030b200641011020000b2006101f22050d8c030b200641011020000b2006101f22050d88030b200641011020000b2006101f22050d84030b200641011020000b2009101f22060d80030b200941011020000b2006101f22050dfc020b200641011020000b2006101f22050df8020b200641011020000b2006101f22050df4020b200641011020000b2006101f22050df0020b200641011020000b2006101f22050dec020b200641011020000b2006101f22050de8020b200641011020000b2006101f22050de4020b200641011020000b2005101f22080de0020b200541011020000b2008101f22090ddc020b200841011020000b2006101f22050dd8020b200641011020000b2006101f22050dd3020b200641011020000b2006101f22050dcf020b200641011020000b2006101f22050dcb020b200641011020000b2006101f22050dc7020b200641011020000b2006101f22050dc3020b200641011020000b2006101f22050dbf020b200641011020000b2006101f22050dbb020b200641011020000b2006101f22050db7020b200641011020000b2006101f22050db3020b200641011020000b2006101f22050daf020b200641011020000b2006101f22050dab020b200641011020000b2006101f22050da7020b200641011020000b2006101f22050da3020b200641011020000b2006101f22050d9f020b200641011020000b2006101f22050d9b020b200641011020000b2006101f22050d97020b200641011020000b2006101f22050d93020b200641011020000b2006101f22050d8f020b200641011020000b2006101f22050d8b020b200641011020000b2006101f22050d87020b200641011020000b2006101f22050d83020b200641011020000b2006101f22050dff010b200641011020000b2006101f22050dfb010b200641011020000b2006101f22050df7010b200641011020000b2006101f22050df3010b200641011020000b2006101f22050def010b200641011020000b2006101f22050deb010b200641011020000b2006101f22050de7010b200641011020000b2008101f22090de3010b200841011020000b2008101f22050ddf010b200841011020000b2009101f22060ddb010b200941011020000b2006101f22050dd7010b200641011020000b2006101f22050dd3010b200641011020000b2006101f22050dcf010b200641011020000b2006101f22050dcb010b200641011020000b2006101f22050dc7010b200641011020000b2006101f22050dc3010b200641011020000b2006101f22050dbf010b200641011020000b2006101f22050dbb010b200641011020000b2006101f22050db7010b200641011020000b2006101f22050db3010b200641011020000b2006101f22050daf010b200641011020000b2006101f22050dab010b200641011020000b2006101f22050da7010b200641011020000b2006101f22050da3010b200641011020000b2006101f22050d9f010b200641011020000b2006101f22050d9b010b200641011020000b2006101f22050d97010b200641011020000b2006101f22050d93010b200641011020000b2006101f22050d8f010b200641011020000b2008101f22090d8b010b200841011020000b2008101f22090d87010b200841011020000b2006101f22050d83010b200641011020000b2006101f22050d7f0b200641011020000b2006101f22050d7b0b200641011020000b2009101f22060d770b200941011020000b2006101f22050d730b200641011020000b2006101f22050d6f0b200641011020000b2006101f22050d6b0b200641011020000b2008101f22090d670b200841011020000b2006101f22050d630b200641011020000b2006101f22050d5f0b200641011020000b2006101f22050d5b0b200641011020000b2006101f22050d570b200641011020000b2006101f22050d530b200641011020000b2006101f22050d4f0b200641011020000b2006101f22050d4b0b200641011020000b2006101f22050d470b200641011020000b2005101f22080d430b200541011020000b2006101f22050d3f0b200641011020000b2006101f22050d3b0b200641011020000b2008101f22090d370b200841011020000b2006101f22050d330b200641011020000b2006101f22050d2f0b200641011020000b2008101f22090d2b0b200841011020000b2008101f22090d270b200841011020000b2006101f22050d230b200641011020000b2001101f22060d1f0b200141011020000b2008101f22090d1b0b200841011020000b2006101f22050d170b200641011020000b2008101f22090d130b200841011020000b2005101f22080d0f0b200541011020000b2006101f22050d0b0b200641011020000b2005101f22080d070b200541011020000b2006101f22050d030b200641011020000b1021000b1021000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a410b3a00000cdd020b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a410d3a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490dcf0220024101742209200620062009491b22094100480dcf022002450d01200728020020022009101e22060d020c050b200728020021060c020b2009101f2206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000cdd020b0b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a411a3a00000cd9020b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a410c3a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490dcb0220024101742209200620062009491b22094100480dcb022002450d01200728020020022009101e22060d020c050b200728020021060c020b2009101f2206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000cd9020b0b200941011020000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41333a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dca022004410174220d20092009200d491b220d4100480dca022004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dca0220024101742209200620062009491b22094100480dca022002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cd8020b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41dc003a00000cd3020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413a3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dd1022004410174220d20092009200d491b220d4100480dd1022004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dd10220024101742209200620062009491b22094100480dd1022002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cd4020b0b200d41011020000b200941011020000b200241086a2001360200200241046a20063602002002410c6a28020021050b2002410c6a2201200541016a360200200620056a410e3a00002003200b200d200d200b4102746a200210220240024020032d0000411a470d00200241086a2106200241046a210703400240024002400240200628020020012802002202470d00200241016a22052002490dc40220024101742208200520052008491b22084100480dc4022002450d01200928020020022008101e22050d020c060b200928020021050c020b2008101f2205450d040b2006200836020020072005360200200128020021020b2001200241016a360200200520026a200441807f72200441ff0071200441077622021b3a00002002210420020d000b0240200b41ffffffff0371450d00200d101d0b2000411a3a0000200341106a24000f0b20002003290300370200200041086a200341086a290300370200200b41ffffffff0371450dd102200d101d200341106a24000f0b200841011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41de003a00000ccd020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412d3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dc0022004410174220d20092009200d491b220d4100480dc0022004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dc00220024101742209200620062009491b22094100480dc0022002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cce020b0b200d41011020000b200941011020000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41323a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dbe022004410174220d20092009200d491b220d4100480dbe022004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dbe0220024101742209200620062009491b22094100480dbe022002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000ccc020b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e6003a00000cc7020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e5003a00000cc5020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41393a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dc3022004410174220d20092009200d491b220d4100480dc3022004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dc30220024101742209200620062009491b22094100480dc3022002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cc6020b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41db003a00000cc1020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e0003a00000cbf020b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41223a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490db10220024101742209200620062009491b22094100480db1022002450d01200728020020022009101e22060d020c050b200728020021060c020b2009101f2206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000cbf020b0b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fb003a00000cbb020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41da003a00000cb9020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f1003a00000cb7020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d8003a00000cb5020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418c013a00000cb3020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d7003a00000cb1020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f5003a00000caf020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e8003a00000cad020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41313a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490da0022004410174220d20092009200d491b220d4100480da0022004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490da00220024101742209200620062009491b22094100480da0022002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cae020b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f6003a00000ca9020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4191013a00000ca7020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418b013a00000ca5020b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41c3003a000002400240024002400240200241086a2802002206200928020022046b41044f0d00200441046a22092004490da10220064101742204200920092004491b22044100480da1022006450d01200528020020062004101e2205450d020c030b200528020021050c030b2004101f22050d010b200441011020000b200241086a2004360200200241046a20053602002002410c6a28020021040b2002410c6a200441046a360200200520046a20083600000ca3020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4188013a00000ca1020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f7003a00000c9f020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d0003a00000c9d020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41373a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d9b022004410174220d20092009200d491b220d4100480d9b022004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d9b0220024101742209200620062009491b22094100480d9b022002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c9e020b0b200d41011020000b200941011020000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412e3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d8e022004410174220d20092009200d491b220d4100480d8e022004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d8e0220024101742209200620062009491b22094100480d8e022002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c9c020b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4189013a00000c97020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a5013a00000c95020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4199013a00000c93020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cb003a00000c91020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a2013a00000c8f020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a3013a00000c8d020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a8013a00000c8b020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4195013a00000c89020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4184013a00000c87020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4186013a00000c85020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ac013a00000c83020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4198013a00000c81020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c9003a00000cff010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cf003a00000cfd010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c8003a00000cfb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cc003a00000cf9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a9013a00000cf7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e9003a00000cf5010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ea003a00000cf3010b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a413f3a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490def0120044101742209200620062009491b22064100480def012004450d01200528020020042006101e2205450d020c030b200528020021050c030b2006101f22050d010b200641011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a20083a00000cf1010b200241086a2008360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c1003a0000200320062002102320032d0000411a460def0120002003290300370200200041086a200341086a29030037020020012d00004109470df0010c3a0b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412f3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490de2012004410174220d20092009200d491b220d4100480de2012004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490de20120024101742209200620062009491b22094100480de2012002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cf0010b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4192013a00000ceb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41003a00000ce9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419f013a00000ce7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a1013a00000ce5010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b7013a00000ce3010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b5013a00000ce1010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ad013a00000cdf010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b9013a00000cdd010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b2013a00000cdb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41aa013a00000cd9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4181013a00000cd7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fe003a00000cd5010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ba013a00000cd3010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ab013a00000cd1010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4182013a00000ccf010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f3003a00000ccd010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4196013a00000ccb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e1003a00000cc9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ae013a00000cc7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a0013a00000cc5010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41dd003a00000cc3010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e3003a00000cc1010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bf013a00000cbf010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41be013a00000cbd010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b8013a00000cbb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bc013a00000cb9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4180013a00000cb7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c2003a00002003200a2002102420032d0000411a460db50120002003290300370200200041086a200341086a29030037020020012d00004109470db6010b200141086a28020041ffffffff0371450db501200141046a280200101d200341106a24000f0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b0013a00000cb2010b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41293a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490da5012004410174220d20092009200d491b220d4100480da5012004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490da50120024101742209200620062009491b22094100480da5012002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cb3010b0b200d41011020000b200941011020000b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41233a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490da20120024101742209200620062009491b22094100480da2012002450d01200728020020022009101e22060d020c050b200728020021060c020b2009101f2206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000cb0010b0b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bd013a00000cac010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a7013a00000caa010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a6013a00000ca8010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b6013a00000ca6010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b3013a00000ca4010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4183013a00000ca2010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ff003a00000ca0010b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41c0003a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490d9c0120044101742209200620062009491b22064100480d9c012004450d01200528020020042006101e2205450d020c030b200528020021050c030b2006101f22050d010b200641011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a20083a00000c9e010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4197013a00000c9c010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bb013a00000c9a010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418e013a00000c98010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ee003a00000c96010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c6003a00000c94010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b4013a00000c92010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ed003a00000c90010b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413e3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d8e012004410174220d20092009200d491b220d4100480d8e012004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d8e0120024101742209200620062009491b22094100480d8e012002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c91010b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4185013a00000c8c010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ca003a00000c8a010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418f013a00000c88010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419e013a00000c86010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b1013a00000c84010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4193013a00000c82010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fc003a00000c80010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41af013a00000c7e0b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413d3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d7c2004410174220d20092009200d491b220d4100480d7c2004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d7c20024101742209200620062009491b22094100480d7c2002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c7f0b0b200d41011020000b200941011020000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41383a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d7a2004410174220d20092009200d491b220d4100480d7a2004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d7a20024101742209200620062009491b22094100480d7a2002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c7d0b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419d013a00000c780b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a4013a00000c760b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fa003a00000c740b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412b3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d672004410174220d20092009200d491b220d4100480d672004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d6720024101742209200620062009491b22094100480d672002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c750b0b200d41011020000b200941011020000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41343a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d652004410174220d20092009200d491b220d4100480d652004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d6520024101742209200620062009491b22094100480d652002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c730b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419b013a00000c6e0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419c013a00000c6c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f4003a00000c6a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4187013a00000c680b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4190013a00000c660b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d4003a00000c640b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418a013a00000c620b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419a013a00000c600b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f8003a00000c5e0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ef003a00000c5c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fd003a00000c5a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ce003a00000c580b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d3003a00000c560b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41303a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d492004410174220d20092009200d491b220d4100480d492004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d4920024101742209200620062009491b22094100480d492002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c570b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cd003a00000c520b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41283a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d452004410174220d20092009200d491b220d4100480d452004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d4520024101742209200620062009491b22094100480d452002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c530b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a410f3a00000c4e0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d9003a00000c4c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4194013a00000c4a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e7003a00000c480b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418d013a00000c460b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e2003a00000c440b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41243a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490d3620024101742209200620062009491b22094100480d362002450d01200728020020022009101e22060d020c050b200728020021060c020b2009101f2206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000c440b0b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f2003a00000c400b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41033a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490d3120044101742209200620062009491b22064100480d312004450d01200528020020042006101e2205450d020c030b200528020021050c030b2006101f22050d010b200641011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a42c0818386fcdffffe7c2008410374412073ad42f8018388a7413f7141c000723a00000c3e0b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41213a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490d3020024101742209200620062009491b22094100480d302002450d01200728020020022009101e22060d020c050b200728020021060c020b2009101f2206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000c3e0b0b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f9003a00000c3a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d6003a00000c380b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41df003a00000c360b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c7003a00000c340b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f0003a00000c320b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41203a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490d2420024101742209200620062009491b22094100480d242002450d01200728020020022009101e22060d020c050b200728020021060c020b2009101f2206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000c320b0b200941011020000b200241086a2006360200200241046a20083602002002410c6a28020021040b2002410c6a2206200441016a360200200820046a41113a0000200241086a2109200241046a210d02400240024003400240024002400240200928020020062802002204470d00200441016a22082004490d2420044101742207200820082007491b22074100480d242004450d01200b28020020042007101e22080d020c050b200b28020021080c020b2007101f2208450d030b20092007360200200d2008360200200628020021040b2006200441016a360200200820046a200541807f72200541ff0071200541077622041b3a00002004210520040d000b024002400240200241086a2802002002410c6a2802002204470d00200441016a22052004490d2220044101742206200520052006491b22064100480d222004450d01200b28020020042006101e2205450d020c040b200b28020021050c040b2006101f22050d020b200641011020000b200741011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a200c3a00000c2e0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d5003a00000c2c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e4003a00000c2a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ec003a00000c280b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41043a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490d1920044101742209200620062009491b22064100480d192004450d01200528020020042006101e2205450d020c030b200528020021050c030b2006101f22050d010b200641011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a42c0818386fcdffffe7c2008410374412073ad42f8018388a7413f7141c000723a00000c260b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41363a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d242004410174220d20092009200d491b220d4100480d242004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d2420024101742209200620062009491b22094100480d242002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c270b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d2003a00000c220b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41103a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490d1420024101742209200620062009491b22094100480d142002450d01200728020020022009101e22060d020c050b200728020021060c020b2009101f2206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000c220b0b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41eb003a00000c1e0b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41023a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490d0f20044101742209200620062009491b22064100480d0f2004450d01200528020020042006101e2205450d020c030b200528020021050c030b2006101f22050d010b200641011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a42c0818386fcdffffe7c2008410374412073ad42f8018388a7413f7141c000723a00000c1c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c5003a00000c1a0b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41353a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d182004410174220d20092009200d491b220d4100480d182004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d1820024101742209200620062009491b22094100480d182002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c1b0b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d1003a00000c160b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412c3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d092004410174220d20092009200d491b220d4100480d092004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d0920024101742209200620062009491b22094100480d092002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c170b0b200d41011020000b200941011020000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412a3a0000200241086a210b200241046a210c03400240024002400240200b28020020082802002204470d00200441016a22092004490d052004410174220d20092009200d491b220d4100480d052004450d0120072802002004200d101e22090d020c060b200728020021090c020b200d101f2209450d040b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d0520024101742209200620062009491b22094100480d052002450d01200728020020022009101e22060d020c070b200728020021060c020b2009101f2206450d050b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c130b0b1021000b200d41011020000b200941011020000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413b3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d0d2004410174220d20092009200d491b220d4100480d0d2004450d0120072802002004200d101e22090d020c050b200728020021090c020b200d101f2209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d0d20024101742209200620062009491b22094100480d0d2002450d01200728020020022009101e22060d020c060b200728020021060c020b2009101f2206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c100b0b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a411b3a00000c0b0b200241086a2008360200200241046a20063602002002410c6a28020021040b2002410c6a2208200441016a360200200620046a41c4003a000002400240024002400240200241086a2802002206200828020022046b41084f0d00200441086a22082004490d0720064101742204200820082004491b22044100480d072006450d01200528020020062004101e2205450d020c030b200528020021050c030b2004101f22050d010b200441011020000b200241086a2004360200200241046a20053602002002410c6a28020021040b2002410c6a200441086a360200200520046a200a3700000c090b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413c3a0000200241086a210b200241046a210c03400240024002400240200b28020020082802002204470d00200441016a22092004490d052004410174220d20092009200d491b220d4100480d052004450d0120072802002004200d101e22090d020c060b200728020021090c020b200d101f2209450d040b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200541807f72200541ff0071200541077622041b3a00002004210520040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22052002490d0520024101742209200520052009491b22094100480d052002450d01200728020020022009101e22050d020c070b200728020021050c020b2009101f2205450d050b20082009360200200b2005360200200428020021020b2004200241016a360200200520026a200641807f72200641ff0071200641077622021b3a00002002210620020d000c080b0b1021000b200d41011020000b200941011020000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41053a00000c020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41013a00000b2000411a3a000020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a280200101d0b200341106a24000b05001021000b912503027f027e087f230041d00b6b2208240002402001280224200128024022092802a001470d00200041013a0000200041086a4124360200200041046a419e81c000360200200841d00b6a24000f0b200442002004290308220a20094198016a2903007d220b200b200a56200b507222091b37030802402009450d00200041013a0000200041086a412a360200200041046a41c281c000360200200841d00b6a24000f0b200841d8026a41186a22094200370300200841d8026a41106a220c4200370300200841d8026a41086a220d4200370300200842003703d80220062007200841d8026a1000200841f8006a41186a2009290300370300200841f8006a41106a200c290300370300200841f8006a41086a200d290300370300200820082903d8023703780240024002400240024002404120101f2209450d0020092005290000370000200941186a200541186a290000370000200941106a200541106a290000370000200941086a200541086a2900003700002009412041c000101e2209450d0120092008290378370020200941386a200841f8006a41186a290300370000200941306a200841f8006a41106a290300370000200941286a200841f8006a41086a290300370000200941c000418001101e2209450d022009200141cc006a220e290000370040200941d8006a200e41186a290000370000200941d0006a200e41106a290000370000200941c8006a200e41086a290000370000200841d8026a41186a220c4200370300200841d8026a41106a220d4200370300200841d8026a41086a220f4200370300200842003703d802200941e000200841d8026a1000200841086a41186a200c290300370300200841086a41106a200d290300370300200841086a41086a200f290300370300200820082903d8023703082009101d200841d8026a2001410c6a2210200841086a1030024020082d00d8024101470d00200041013a0000200041086a4117360200200041046a41ec81c000360200200841d00b6a24000f0b2008413c6a4184d0c200360200200841286a41086a2209420037030020082010360238200841f0c0c10036022c2008410036022820084188026a41186a200541186a29000037030020084188026a41106a200541106a29000037030020084188026a41086a200541086a2900003703002008200529000037038802417f210c2008417f360228200841f8006a41186a200841086a41186a290300370300200841f8006a41106a200841086a41106a290300370300200841f8006a41086a200841086a41086a29030037030020082008290308370378418009101f220f450d03200841286a4104722111200f41003b0106200f4100360200200f41086a200841d8026a41f80810ce031a200941003602002008200f36022c200f2f010622124105742113410021090240024002400240034020132009460d01200841f8006a200f20096a41086a412010d003220d450d03200941206a2109200c41016a210c200d41004e0d000c020b0b2012210c0b200841a8026a41186a200841f8006a41186a290300370300200841a8026a41106a200841f8006a41106a290300370300200841a8026a41086a200841f8006a41086a290300370300200820082903783703a802200841346a21094100450d010c060b200c41016a210c200841346a210941010d050b200841f8006a411c6a200841a8026a41086a2903003702002008419c016a200841a8026a41106a290300370200200841a4016a200841a8026a41186a29030037020020082009360288012008200c3602840120082011360280012008200f36027c20084100360278200820082903a80237028c01200841d8026a411c6a4200370200200841d8026a41106a200841c8026a41086a290300370300200841fd026a200829004037000020084185036a200841c0006a41086a2900003700002008418d036a200841c0006a41106a29000037000020084195036a200841c0006a41186a2900003700002008419c036a200841df006a280000360000200842003703d802200841023a00fc02200841f0c0c1003602f002200820082903c8023703e002200841f8006a200841d8026a103121090c050b412041011020000b41c00041011020000b41800141011020000b41800941081020000b200841f0026a4200370300200841ec026a41f0c0c100360200200841003602f802200841003602e802200842003703e002200841f0c0c1003602dc02200841003602d802200f200c41c8006c6a41e8026a2109200841d8026a10320b200941013a0024200941256a2008290388023700002009412d6a20084188026a41086a290300370000200941356a20084188026a41106a2903003700002009413d6a20084188026a41186a2903003700002008200828022841016a360228200841a8026a41106a2209200841286a41106a290300370300200841a8026a41086a220c200841286a41086a290300370300200820082903283703a802200841f8006a41186a220d200841086a41186a290300370300200841f8006a41106a220f200841086a41106a290300370300200841f8006a41086a2213200841086a41086a29030037030020082008290308370378200841c0006a200841f8006a103320082802482111200829024c210b200841ac036a2013290300370200200841b4036a200f290300370200200841bc036a200d290300370200200841ec026a200c290300370200200841f4026a20092903003702002008200b3702dc02200820113602d802200820082903783702a403200820082903a8023702e402200141246a2802002109200141c0006a290200210b2001280248210c20084190036a420037030020084188036a428080808080013703002008200c3602a0032008200b3703980320084208370380032008200941016a3602fc02200820044101200e200841086a20022003200841d8026a103402400240024020082802002209450d0020082802042101200041013a0000200041086a2001360200200041046a200936020020082802d80222090d010c020b200841f8006a2005200141c8006a28020028020010350240024020082802784101470d00200041046a200829027c370200200041013a00000c010b200841a8026a41186a220920084194016a280200360200200841a8026a41106a220c2008418c016a290200370300200841a8026a41086a220d20084184016a2902003703002008200829027c3703a802200841c0006a41106a200d290300370300200841c0006a41186a200c290300370300200841e0006a2009280200360200200841063602442008419289c000360240200820082903a802370348200141c4006a280200210c200841d8016a41186a200141e4006a290000370300200841d8016a41106a200141dc006a290000370300200841d8016a41086a200141d4006a2900003703002008200129004c3703d801200841c8026a41086a22094200370300200842003703c802418390c100410d200841c8026a1001200841f8016a41086a220d2009290300370300200820082903c8023703f8014200210b02400240024002400240200841f8016a411041f8b3c200410041001002417f460d00200842003703a802200841f8016a4110200841a8026a41084100100241016a41084d0d0120082903a802210b0b20094200370300200842003703c80241fbb8c0004111200841c8026a1001200d2009290300370300200820082903c8023703f80102400240200841f8016a411041f8b3c200410041001002417f460d00200841c0026a4200370300200841a8026a41106a4200370300200841b0026a4200370300200842003703a802200841f8016a4110200841a8026a4120410010022209417f460d032009411f4d0d0320084188026a41186a200841a8026a41186a29030037030020084188026a41106a200841a8026a41106a29030037030020084188026a41086a200841a8026a41086a290300370300200820082903a802370388020c010b200841a0026a420037030020084198026a420037030020084190026a420037030020084200370388020b2008419c016a200841d8016a41086a290300370200200841a4016a200841d8016a41106a290300370200200841ac016a200841d8016a41186a290300370200200841bc016a20084188026a41086a290300370200200841c4016a20084188026a41106a290300370200200841cc016a20084188026a41186a29030037020020082002370378200820082903d801370294012008200b3703880120082008290388023702b40120082003370380012008200841d8026a36029001200841003602b002200842013703a802200841e8006a200c200841c0006a200841f8006a20062007200841a8026a2004103602400240200828026822094101460d0020094102470d01200041046a200829026c370200200041013a0000200841d8006a280200450d06200841d4006a280200101d20082802d80222090d070c080b200841e8006a41086a280200450d00200828026c101d0b200841f8006a41186a200141cc006a220941186a290000370300200841f8006a41106a200941106a290000370300200841f8006a41086a200941086a290000370300200841a8026a41086a200841086a41086a290300370300200841a8026a41106a200841086a41106a290300370300200841a8026a41186a200841086a41186a29030037030020082009290000370378200820082903083703a802024002400240024020084188036a280200220920084184036a280200470d00200941016a220c2009490d062009410174220d200c200c200d491b220dad42d8007e220b422088a70d06200ba722054100480d062009450d0120084180036a280200200941d8006c2005101e220c0d020c070b20084180036a280200210c0c020b2005101f220c450d050b20084184036a200d36020020084180036a200c36020020084188036a28020021090b200c200941d8006c6a22092008290378370001200941013a0000200920082903a8023700212009200829008802370041200941096a200841f8006a41086a220c290300370000200941116a200841f8006a41106a290300370000200941196a200841f8006a41186a290300370000200941296a200841a8026a41086a220d290300370000200941316a200841a8026a41106a290300370000200941396a200841a8026a41186a290300370000200941d0006a20084197026a290000370000200941c9006a20084188026a41086a29000037000020084188036a2209200928020041016a2205360200200c200841e4026a220941086a290200370300200d20084184016a280200360200200820092902003703782008200829027c3703a80220084194036a280200210d20084190036a280200210f2008418c036a280200210920084184036a280200210420084180036a280200210c0240200841c0006a41186a280200450d00200841d4006a280200101d0b024020082802d8022213450d0020082802dc02450d002013101d0b200841f8006a41086a2213200841a8026a41086a280200360200200820082903a802370378200841d8026a41086a2013280200360200200820082903783703d8022010200841d8026a10372008200c200541d8006c6a3602e4022008200c3602e002200820043602dc022008200c3602d802200141286a200841d8026a103820082009200d4107746a3602e402200820093602e0022008200f3602dc02200820093602d802200141346a200841d8026a1039200041003a0000200041196a200841206a290300370000200041116a200841186a290300370000200041096a200841086a41086a29030037000020002008290308370001200841d00b6a24000f0b41df88c0004133103a000b41df88c0004133103a000b1021000b200541081020000b20082802d8022209450d010b20082802dc02450d002009101d0b200841d8026a41186a280200210d200841e8026a280200210902400240200841d8026a41146a2802002200450d002000210c2009210103402001280280092101200c417f6a220c0d000b0340200920092f01064102746a4180096a28020021092000417f6a22000d000c020b0b200921010b20084194016a20092f0106360200200841f8006a41186a4100360200200841f8006a41146a20093602002008200d36029801200841003602880120084200370380012008200136027c20084100360278200841f8006a103b024020084188036a2802002201450d00200841d8026a41286a2802002109200141d8006c21010340024020092d00004105490d00200941286a280200450d00200941246a280200101d0b200941d8006a2109200141a87f6a22010d000b0b024020084184036a280200450d0020084180036a280200101d0b024020084194036a2802002209450d00200941077421012008418c036a28020041206a210903402009103c20094180016a2109200141807f6a22010d000b0b024020084190036a280200450d002008418c036a280200101d0b200841d00b6a24000bec0301097f230041c0006b220324000240200128020022044100480d00200441ffffffff07460d002001200441016a2205360200200141046a2104200141086a280200210602400240024003402004280200220841086a210920082f0106220741057421044100210a0240024003402004450d0120022009412010d003220b450d02200441606a2104200a41016a210a200941206a2109200b417f4a0d000b200a417f6a21070b2006450d022006417f6a2106200820074102746a4180096a21040c010b0b2008200a41c8006c6a41e8026a2204450d0020042d002422094102470d010b200020012802102002200141146a280200280210110100200128020021050c010b4100210a024020094101470d00200341386a2004413d6a290000370300200341306a200441356a290000370300200341286a2004412d6a2900003703002003200441256a2900003703204101210a0b200341186a2204200341206a41186a290300370300200341106a2209200341206a41106a290300370300200341086a220b200341206a41086a290300370300200320032903203703002000200a3a000020002003290300370001200041096a200b290300370000200041116a2009290300370000200041196a20042903003700000b20012005417f6a360200200341c0006a24000f0b103f000bd31801187f230041d00c6b2202240020002802102203200328020041016a360200200028020c21042000280208210520002802042103200241186a41186a22062000412c6a290000370300200241186a41106a2207200041246a290000370300200241186a41086a22082000411c6a29000037030020022000290014370318200241e8016a200141c80010ce031a024020032f01062201410b4f0d00200320044105746a220041286a200041086a2209200120046b41057410cf031a200041206a2006290300370000200041186a2007290300370000200041106a2008290300370000200920022903183700002003200441c8006c6a220041b0036a200041e8026a2200200341066a22032f010020046b41c8006c10cf031a2000200241e8016a41c80010ce032100200320032f010041016a3b0100200241d00c6a240020000f0b024002400240418009101f220a450d00200a41003b0106200a4100360200200a41086a200241a8036a41f80810ce0321012002200341ca016a2d00003a00da02200220032f00c8013b01d802200220032900db013703c8022002200341e0016a2900003700cd02200341cb016a280000210b200341cf016a280000210c200341d3016a280000210d200341d7016a280000210e200241a8036a20034198066a41c80010ce031a2001200341e8016a200341066a22062f010041796a220041057410ce032101200a41e8026a200341e0066a200041c8006c10ce032107200641063b0100200a20003b0106200220022d00da023a00c602200220022f01d8023b01c402200220022903c8023703b002200220022900cd023700b502200241e0026a200241a8036a41c80010ce031a02400240200441064b0d00200341086a20044105746a220141206a2001200341066a22002f010020046b41057410cf031a200141186a200241186a41186a290300370000200141106a200241186a41106a290300370000200141086a200241186a41086a29030037000020012002290318370000200341e8026a200441c8006c6a220f41c8006a200f20002f010020046b41c8006c10cf031a200f200241e8016a41c80010ce031a0c010b200120044105746a41c07e6a2001200441796a22064105746a2201200041ffff037120066b41057410cf031a200141186a200241186a41186a290300370000200141106a200241186a41106a290300370000200141086a200241186a41086a290300370000200120022903183700002007200441c8006c6a220041d07c6a200041887c6a220f200a41066a22002f010020066b41c8006c10cf031a200f200241e8016a41c80010ce031a0b200241d0016a41026a220420022d00c6023a0000200020002f010041016a3b0100200220022f01c4023b01d001200220022903b002370360200220022900b502370065200241f0006a200241e0026a41c80010ce031a200241146a41026a221020042d00003a0000200220022f01d0013b01142002200229036037030020022002290065370005200241186a200241f0006a41c80010ce031a02400240024020032802002207450d0020032f010421110340200241e4016a41026a221620102d00003a0000200220022f01143b01e401200220022903003703d001200220022900053700d501200241e8016a200241186a41c80010ce031a201141ffff0371210620072f01062203410a4d0d0241b009101f2201450d03200141003b010620014100360200200141086a200241a8036a41a80910ce0321002002200741ca016a2d00003a00da02200220072f00c8013b01d802200220072900db013703c8022002200741e0016a2900003700cd02200741cb016a2800002112200741cf016a2800002115200741d3016a2800002114200741d7016a2800002113200241a8036a20074198066a41c80010ce031a2000200741e8016a200741066a22092f0100220441796a220341057410ce032117200141e8026a200741e0066a200341c8006c10ce03211820014180096a2007419c096a2004417a6a220841027410ce032119200941063b0100200120033b010602402008450d00410021032019210003402000280200220420033b010420042001360200200041046a21002008200341016a2203470d000b0b200241e0026a200241a8036a41c80010ce031a200220022d00da023a00c602200220022f01d8023b01c402200220022903c8023703b002200220022900cd023700b502200241dc026a41026a220820022d00c6023a0000200220022f01c4023b01dc02200220022903b002370360200220022900b502370065200241a8036a200241e0026a41c80010ce031a02400240201141ffff0371220041064b0d00200741086a2203200641016a22044105746a200320064105746a220320092f0100221120066b221941057410cf031a2003200e36000f2003200d36000b2003200c3600072003200b360003200341026a20162d00003a0000200320022f01e4013b0000200320022903d001370013200341186a20022900d501370000200741e8026a200641c8006c6a220341c8006a2003201941c8006c10cf031a2003200241e8016a41c80010ce031a2009201141016a22033b010020074180096a2211200641027422196a41086a201120044102746a2211200341ffff037120046b41027410cf031a2011200a360200200020092f010022044f0d01200720196a4184096a2103034020032802002200200641016a22063b010420002007360200200341046a210320042006470d000c020b0b20172006417a6a22044105746a2017200641796a22034105746a2200200141066a22092f010020036b41057410cf031a200041186a20022900d5013700002000200e36000f2000200d36000b2000200c3600072000200b360003200041026a20162d00003a0000200020022f01e4013b0000200020022903d0013700132018200641c8006c6a220041d07c6a200041887c6a220020092f010020036b41c8006c10cf031a2000200241e8016a41c80010ce031a200920092f010041016a22003b01002019200641027422116a416c6a201920044102746a2209200041ffff0371220620046b41027410cf031a2009200a360200200420064b0d00200120116a41e8086a2100034020002802002204200341016a22033b010420042001360200200041046a210020062003470d000b0b200241cc016a41026a220320082d00003a0000200220022f01dc023b01cc01200220022903603703b801200220022900653700bd01200241f0006a200241a8036a41c80010ce031a201020032d00003a0000200220022f01cc013b0114200220022903b801370300200220022900bd01370005200241186a200241f0006a41c80010ce031a024020072802002203450d0020072f010421112012210b2013210e2014210d2015210c200321072001210a0c010b0b2012210b2013210e2014210d2015210c2001210a0b41b009101f2203450d03200341003b010620034100360200200341086a200241a8036a41a80910ce03210120032005280200220036028009200520033602002005200528020441016a360204200041003b010420002003360200200120032f010622044105746a220020022f01143b00002000200e36000f2000200d36000b2000200c3600072000200b36000320002002290300370013200041026a200241146a41026a2d00003a0000200041186a20022900053700002003200441c8006c6a41e8026a200241186a41c80010ce031a20034180096a200441016a22004102746a200a360200200320003b0106200a20003b0104200a20033602000c040b200741086a2200200641016a22044105746a200020064105746a2200200320066b220141057410cf031a2000200e36000f2000200d36000b2000200c3600072000200b360003200041026a200241e4016a41026a2d00003a0000200020022f01e4013b0000200020022903d001370013200041186a20022900d5013700002007200641c8006c6a220041b0036a200041e8026a2200200141c8006c10cf031a2000200241e8016a41c80010ce031a200741066a2200200341016a22033b010020074180096a220120064102746a41086a200120044102746a2201200341ffff037120046b41027410cf031a2001200a360200201141ffff037120002f010022034f0d03200a20043b0104200a200736020020042003460d032003417f6a210120072004417f6a22034102746a4188096a2100034020002802002204200341026a3b010420042007360200200041046a21002001200341016a2203470d000c040b0b41b00941081020000b41800941081020000b41b00941081020000b200241d00c6a2400200f0bd80101067f230041206b22012400200141086a200010d702024020012802082202450d00200141186a2103200141146a2104034020032802002105200428020021060240200128020c450d002002101d0b02402006450d002005450d002006101d0b200141086a200010d702200128020822020d000b0b02402000280204220641f0c0c100460d00200628020021022006101d2002450d00200228020021052002101d2005450d00024020052802002206450d0003402005101d2006210520062802002202210620020d000b0b2005101d0b200141206a24000bd30402077f017e230041306b2202240002400240024002404116101f2203450d002003410e6a41002900aaf341370000200341086a41002900a4f3413700002003410029009cf341370000200341164136101e2203450d01200320012900003700162003412e6a200141186a290000370000200341266a200141106a2900003700002003411e6a200141086a290000370000200241186a41086a220142003703002002420037031820034136200241186a1001200241086a41086a200129030037030020022002290318370308024002400240024002400240200241086a411041f8b3c200410041001002417f460d002002421037021c2002200241086a3602182002200241186a10d5012002280200450d0520022802042201417f4c0d082001450d01200110792204450d09200241206a2205200528020022052001410020022802182206200228021c2207200420012005100222052005417f461b2205200520014b1b22086a220536020020082001460d020c040b200041003602080c020b4101210420022802182206200228021c220741014100200241206a280200220510021a41002001470d020b20024200370328200241186a41086a410020062007200241286a41082005100222062006417f461b2206410820064108491b20056a360200200641074d0d012004450d0220022903282109200041106a20013602002000200136020c20002004360208200020093703000b2003101d200241306a24000f0b2001450d002004101d0b41df88c0004133103a000b411641011020000b413641011020000b102e000b200141011020000bbe0d030c7f067e0a7f23004180016b22082400024002400240024002400240200728020c22094100480d00200941ffffffff07460d002007410c6a210a2007410c6a200941016a220b360200200741146a280200210c200741106a220d210e410021090340024002400240024002400240024020090e020001010b200e280200221041086a211120102f0106220f410574210941002112024002400240024003402009450d0120042011412010d0032213450d02200941606a2109201241016a2112201141206a21112013417f4a0d000b2012417f6a210f0b200c450d01200c417f6a210c2010200f4102746a4180096a210e410021090c090b201041e8026a201241c8006c6a2209450d002009280200450d00200941106a2903002114200941086a29030021150c010b200841286a2007411c6a2802002004200741206a280200280214110100200841306a2903002114200728020c210b200829032821150b2007410c6a200b417f6a360200200141186a29030021162007280240210920012903102117024041004101410220152014842218501b20021b22114101460d0020114102470d0220094180016a21094200211920172016844200520d030c0d0b200941f0006a21094200211920172016844200510d0c0c020b200d2802002210201d6a211120102f0106220d201e742109410021120240024003402009450d0120032011202210d0032213450d02200920236a21092012201a6a2112201120226a21112013201f4a0d000b2012201f6a210d0b201c450d03201c201f6a211c2010200d2020746a20216a210d410121090c060b201041e8026a201241c8006c6a2209450d022009280200450d02200941106a2903002116200941086a29030021170c030b200941e0006a21094200211920172016844200510d0a0b200841186a2009290300200941086a2903002017201610d103200120192001290308221720082903187d221620162017562016507222091b37030802402009450d00418382c0002109412221110c090b200a28020022094100480d04200941ffffffff07460d044101211a2007410c6a200941016a221b360200200741146a280200211c4108211d4105211e417f211f41022120418009212141202122416021230c020b200841086a2007411c6a2802002003200741206a280200280214110100200841106a2903002116200728020c211b200829030821170b200a201b417f6a3602000240201720057d2219201756201620067d2017200554ad7d221720165620172016511b4101470d00418dd6c0002109411d21110c070b024020184200520d00200741c0006a2802002209290350200556200941d8006a290300221620065620162006511b450d0041eed5c0002109411f21110c070b20082003410220192017103d024020082802002209450d00200828020421110c070b0240201520057c22182015542209201420067c2009ad7c221620145420162014511b450d0041c1d5c0002109412d21110c070b4100210920032004460d0520032004412010d003450d05200a200320192017103e200a200420182016103e200841e0006a41186a200341186a290000370300200841e0006a41106a200341106a290000370300200841e0006a41086a200341086a290000370300200841c0006a41086a200441086a290000370300200841c0006a41106a200441106a290000370300200841c0006a41186a200441186a29000037030020082003290000370360200820042900003703400240024002400240200741306a28020022092007412c6a280200470d00200941016a22112009490d0320094101742212201120112012491b2212ad42d8007e2216422088a70d032016a722224100480d032009450d01200741286a280200200941d8006c2022101e2211450d020c070b200741286a28020021110c070b2022101f22110d050b202241081020000b1021000b410121090c000b0b103f000b2007412c6a2012360200200741286a2011360200200741306a28020021090b2011200941d8006c6a2211200829036037000141002109201141003a00002011200829034037002120112008280039360041201141096a200841e0006a41086a290300370000201141116a200841e0006a41106a290300370000201141196a200841e0006a41186a290300370000201141296a200841c0006a41086a290300370000201141316a200841c0006a41106a290300370000201141396a200841c0006a41186a290300370000201141c4006a2008413c6a280000360000201141d0006a200637030020112005370348200741306a2211201128020041016a3602000b0b200020113602042000200936020020084180016a24000f0b4180dac300102c000be110010d7f23004180016b220324000240024002400240024002400240024002400240024002404114101f2204450d00200441106a41002800c2f341360000200441086a41002900baf341370000200441002900b2f341370000200441144134101e2204450d01200420012900003700142004412c6a200141186a290000370000200441246a200141106a2900003700002004411c6a200141086a290000370000200341f0006a41086a220542003703002003420037037020044134200341f0006a1001200341e0006a41086a2005290300370300200320032903703703600240024002400240200341e0006a411041f8b3c200410041001002417f460d002003421037023c2003200341e0006a360238200341286a200341386a10d5012003280228450d03200328022c2106200341206a200341386a10d5012003280220450d0320032802242107200341186a200341386a10d5012003280218450d03200328021c210841002109200341003a0070200341c0006a2205200528020022052003280238200328023c200341f0006a41012005100241016a41014b22056a3602002005450d03024020032d00702205450d004101210920054101470d040b200341106a200341386a10d5012003280210450d0320032802142205417f4c0d0b2005450d0120051079220a450d06200341c0006a220b200b280200220b200541002003280238200328023c200a2005200b1002220b200b417f461b220b200b20054b1b220b6a360200200b2005470d020c070b410221092004101d4102210441024102460d070c080b4101210a2003280238200328023c41014100200341c0006a28020010021a41002005460d050b2005450d00200a101d0b41df88c0004133103a000b411441011020000b413441011020000b200541011020000b200341dc006a41026a220b200341f0006a41026a2d00003a0000200320032f00703b015c200341386a41026a200b2d00003a0000200320032f015c3b01382004101d4102210420094102470d010b4101210b41fdd3c0002106411121070c010b200341f0006a20046a200341386a20046a2d00003a0000200320032f01383b01704100210b0b200341346a20046a200341f0006a20046a2d00003a0000200320032f01703b01340240200b450d002000200636020420004101360200200041086a200736020020034180016a24000f0b200341306a41026a220c200341346a41026a2d00003a0000200320032f01343b0130024002400240024002400240024002400240024002400240024002400240200228024020064d0d004115101f2204450d05410021062004410d6a4100290094f341370000200441086a410029008ff34137000020044100290087f341370000200441154135101e2204450d06200420012900003700152004412d6a200141186a290000370000200441256a200141106a2900003700002004411d6a200141086a290000370000200341f0006a41086a220742003703002003420037037020044135200341f0006a1001200341e0006a41086a200729030037030020032003290370370360200341e0006a411041f8b3c200410041001002417f460d012003421037023c2003200341e0006a360238200341086a200341386a10d5012003280208450d04200328020c220b417f4c0d0f200b450d02200b10792206450d07200341c0006a220720072802002207200b41002003280238200328023c2006200b2007100222072007417f461b22072007200b4b1b22076a3602002007200b470d030c080b200521042005210e200a21020c120b2004101d41000d070c080b410121062003280238200328023c41014100200341c0006a28020010021a4100200b460d050b200b450d002006101d0b41df88c0004133103a000b411541011020000b413541011020000b200b41011020000b2004101d2006450d010b2006410020061b210d200341386a2006200b20021042200341386a41086a2802002107200328023c210620032802384101470d042000200636020420004101360200200041086a2007360200200b450d01200d101d20050d020c030b2000418ed4c00036020420004101360200200041086a411a3602000b2005450d010b200a101d0b20034180016a24000f0b200341f0006a41026a220f200341d7006a2d00003a0000200320032f00553b0170200341d4006a2d00002109200341d0006a2802002104200341cc006a280200210e200341c8006a2802002102200341c4006a280200210802402005450d00200a101d0b200341306a41026a200f2d00003a0000200320032f01703b01302004417f4c0d004101210502402004450d002004101f2205450d040b20052002200410ce03210a200341386a41146a2004360200200341386a41106a2004360200200320083602402003200736023c200320063602382003200a3602442003200941ff01714101463a00504114101f2205450d01200541106a41002800c2f341360000200541086a41002900baf341370000200541002900b2f341370000200541144134101e2205450d02200520012900003700142005412c6a200141186a290000370000200541246a200141106a2900003700002005411c6a200141086a290000370000200341f0006a41086a220142003703002003420037037020054134200341f0006a1001200341e0006a41086a200129030037030020032003290370370360200341e0006a200341386a10612005101d02402004450d00200a101d0b200b450d04200d101d0c040b102e000b411441011020000b413441011020000b200441011020000b20002006360204200020032f01303b001d200041003602002000411c6a20093a0000200041186a2004360200200041146a200e360200200041106a20023602002000410c6a2008360200200041086a20073602002000411f6a200c2d00003a000020034180016a24000bc33f01087f230041a0016b22082400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402002410c6a280200200241106a28020010042209417f460d00410c101f220a450d01200a2009360208200a42818080801037020002404101450d00200a410141016a3602004101417e460d00200a41014102723602004104101f220b450d03200b200a360200200a280208210c4103101f220d450d04200d41026a41002d00e1a3423a0000200d41002f00dfa3423b00004106101f220e450d05200e41046a41002f009c89403b0000200e410028009889403600004120101f2209450d062009200c36021c2009410136021820094286808080e0003702102009200e36020c20094283808080303702042009200d360200200a200a280200417f6a220d3602000240200d0d00200a41086a2802001005200a200a280204417f6a220d360204200d0d00200a101d0b4103101f220d450d07200d41026a41002d00e1a3423a0000200d41002f00dfa3423b00004103101f220e450d08200e41026a41002d00e4a3423a0000200e41002f00e2a3423b00002009412041c000101e2209450d092009410336023c2009410036023820094283808080303702302009200e36022c20094283808080303702242009200d3602204103101f220d450d0a200d41026a41002d00e1a3423a0000200d41002f00dfa3423b0000410f101f220e450d0b200e41076a41002900b49d42370000200e41002900ad9d42370000200941c000418001101e2209450d0c2009410436025c200941003602582009428f808080f0013702502009200e36024c20094283808080303702442009200d3602404103101f220d450d0d200d41026a41002d00e1a3423a0000200d41002f00dfa3423b0000410f101f220e450d0e200e41076a41002900c39d42370000200e41002900bc9d423700002009410536027c200941003602782009428f808080f0013702702009200e36026c20094283808080303702642009200d3602604103101f220d450d0f200d41026a41002d00e1a3423a0000200d41002f00dfa3423b00004108101f220e450d10200e42e5f0d1fbb5ac98b6ec003700002009418001418002101e2209450d112009410636029c012009410036029801200942888080808001370290012009200e36028c012009428380808030370284012009200d360280014103101f220d450d12200d41026a41002d00e1a3423a0000200d41002f00dfa3423b0000410a101f220e450d13200e41086a41002f00db9d423b0000200e41002900d39d42370000200941073602bc01200941003602b8012009428a808080a0013702b0012009200e3602ac0120094283808080303702a4012009200d3602a0014103101f220d450d14200d41026a41002d00e1a3423a0000200d41002f00dfa3423b0000410a101f220e450d15200e41086a41002f00e59d423b0000200e41002900dd9d42370000200941083602dc01200941003602d8012009428a808080a0013702d0012009200e3602cc0120094283808080303702c4012009200d3602c0014103101f220d450d16200d41026a41002d00e1a3423a0000200d41002f00dfa3423b0000410a101f220e450d17200e41086a41002f00ef9d423b0000200e41002900e79d42370000200941093602fc01200941003602f8012009428a808080a0013702f0012009200e3602ec0120094283808080303702e4012009200d3602e0014103101f220d450d18200d41026a41002d00e1a3423a0000200d41002f00dfa3423b0000410b101f220e450d19200e41076a41002800f89d42360000200e41002900f19d423700002009418002418004101e2209450d1a2009410a36029c0220094100360298022009428b808080b001370290022009200e36028c022009428380808030370284022009200d360280024103101f220d450d1b200d41026a41002d00e1a3423a0000200d41002f00dfa3423b0000410d101f220e450d1c200e41056a41002900819e42370000200e41002900fc9d423700002009410b3602bc02200941003602b8022009428d808080d0013702b0022009200e3602ac0220094283808080303702a4022009200d3602a0024103101f220d450d1d200d41026a41002d00e1a3423a0000200d41002f00dfa3423b0000410c101f220e450d1e200e41086a41002800919e42360000200e41002900899e423700002009410c3602dc02200941003602d8022009428c808080c0013702d0022009200e3602cc0220094283808080303702c4022009200d3602c0024103101f220d450d1f200d41026a41002d00e1a3423a0000200d41002f00dfa3423b0000410b101f220e450d20200e41076a410028009c9e42360000200e41002900959e423700002009410d3602fc02200941003602f8022009428b808080b0013702f0022009200e3602ec0220094283808080303702e4022009200d3602e0024103101f220e450d21200e41026a41002d00e1a3423a0000200e41002f00dfa3423b00004115101f220d450d22200d410d6a41002900ad9e42370000200d41086a41002900a89e42370000200d41002900a09e423700002009410e36029c03200941003602980320094295808080d002370290032009200d36028c032009428380808030370284032009200e360280034103101f220d450d23200d41026a41002d00e1a3423a0000200d41002f00dfa3423b0000410f101f220e450d24200e41076a41002900bc9e42370000200e41002900b59e423700002009410f3602bc03200941003602b8032009428f808080f0013702b0032009200e3602ac0320094283808080303702a4032009200d3602a0034103101f220d450d25200d41026a41002d00e1a3423a0000200d41002f00dfa3423b00004107101f220e450d26200e41036a41002800c79e42360000200e41002800c49e42360000200941103602dc03200941003602d80320094287808080f0003702d0032009200e3602cc0320094283808080303702c4032009200d3602c0034103101f220e450d27200e41026a41002d00e1a3423a0000200e41002f00dfa3423b00004111101f220d450d28200d41106a41002d00db9e423a0000200d41086a41002900d39e42370000200d41002900cb9e42370000200941113602fc03200941003602f8032009429180808090023702f0032009200d3602ec0320094283808080303702e4032009200e3602e0034103101f220d450d29200d41026a41002d00e1a3423a0000200d41002f00dfa3423b0000410e101f220e450d2a200e41066a41002900e29e42370000200e41002900dc9e423700002009418004418008101e220c450d2b200c411236029c04200c410036029804200c428e808080e00137029004200c200e36028c04200c42838080803037028404200c200d360280044103101f2209450d2c200941026a41002d00e1a3423a0000200941002f00dfa3423b0000410e101f220d450d2d200d41066a41002900f09e42370000200d41002900ea9e42370000200c41133602bc04200c41003602b804200c428e808080e0013702b004200c200d3602ac04200c4283808080303702a404200c20093602a0044103101f2209450d2e200941026a41002d00e1a3423a0000200941002f00dfa3423b00004110101f220d450d2f200d41086a41002900809f42370000200d41002900f89e42370000200c41143602dc04200c41003602d804200c429080808080023702d004200c200d3602cc04200c4283808080303702c404200c20093602c0044103101f2209450d30200941026a41002d00e1a3423a0000200941002f00dfa3423b00004110101f220d450d31200d41086a41002900909f42370000200d41002900889f42370000200c41153602fc04200c41003602f804200c429080808080023702f004200c200d3602ec04200c4283808080303702e404200c20093602e0044103101f220d450d32200d41026a41002d00e1a3423a0000200d41002f00dfa3423b00004111101f2209450d33200941106a41002d00a89f423a0000200941086a41002900a09f42370000200941002900989f42370000200c411636029c05200c410036029805200c4291808080900237029005200c200936028c05200c42838080803037028405200c200d36028005200841086a41086a2005360200200841086a41206a4100360200200841086a41146a200641086a2802003602002008200436020c2008200336020820084100360238200820073602342008200a36023020084201370320200820062902003702142008200128020036022c200241146a28020021072002411c6a280200210f200841003602602008420137035820084115360248200841c8006a200841d8006a10624100210402400240024002400240024002400340200c20046a220d28020021012008200d41086a2802002209360248200841c8006a200841d8006a10620240024002400240200828025c2206200841d8006a41086a220e280200220a6b20094f0d00200a20096a2203200a490d0520064101742205200320032005491b22034100480d052006450d01200828025820062003101e22060d020c060b200828025821060c020b2003101f2206450d040b2008200336025c200820063602580b200e200a20096a3602002006200a6a2001200910ce031a200d410c6a28020021052008200d41146a2802002201360248200841c8006a200841d8006a10620240024002400240200828025c220a200e28020022036b20014f0d00200320016a22092003490d05200a4101742206200920092006491b22064100480d05200a450d012008280258200a2006101e22090d020c070b200828025821090c020b2006101f2209450d050b2008200636025c200820093602582006210a0b200e200320016a2206360200200920036a2005200110ce031a0240024002400240024002400240024002400240024002400240024002400240200d41186a2802004101470d00200a2006470d01200a41016a2201200a490d11200a4101742203200120012003491b22014100480d11200a450d032009200a2001101e22090d040c140b200a2006470d01200a41016a2201200a490d10200a4101742203200120012003491b22014100480d10200a450d052009200a2001101e22090d060c140b200a21010c030b200a21010c050b2001101f2209450d100b2008200136025c200820093602580b200e200641016a220a360200200920066a41023a0000200d411c6a280200210d2001200a6b41034b0d05200a41046a2203200a490d0b20014101742205200320032005491b22034100480d0b2001450d03200920012003101e22090d040c100b2001101f2209450d0e0b2008200136025c200820093602580b200e200641016a220a360200200920066a41013a0000200d411c6a280200210d2001200a6b41034b0d05200a41046a2203200a490d0820014101742205200320032005491b22034100480d082001450d03200920012003101e22090d040c0e0b2003101f2209450d0c0b2008200336025c200820093602580b200e200641056a3602002009200a6a200d360000200441206a220441a005470d040c030b2003101f2209450d0a0b2008200336025c200820093602580b200e200641056a3602002009200a6a200d360000200441206a220441a005470d010b0b200828025c21090240024041172007200f20082802582206200841e0006a280200200841086a1006220a417d460d00200a417f470d014100210d2009450d410c400b4102210d20090d3f0c400b4104101f220e450d3b200b280200220d28020041016a22014102490d07200d2001360200200e200d36020002402009450d002006101d0b200841d0006a4281808080103703002008200e36024c2008200a36024820022802002106200228020421012008410036026020084201370358200841003602980120084198016a200841d8006a106220082802602103200828025c21042008280258210d410a10792209450d3c41012105024002400240200a20062001200d20032009410a200841086a10072206417d460d0020060d402008410936029c012008200941016a36029801024020092d00002206450d00024020064101470d00200841d8006a20084198016a107a2008280258417e714104470d010b2009101d2004450d02200d101d0c020b410021050b2009101d02402004450d00200d101d0b410321092005450d010b410221090b200841d8006a41386a200841086a41386a280200360200200841d8006a41306a200841086a41306a290300370300200841d8006a41286a200841086a41286a290300370300200841d8006a41206a200841086a41206a290300370300200841d8006a41186a200841086a41186a290300370300200841d8006a41106a200841086a41106a290300370300200841d8006a41086a200841086a41086a290300370300200820082903083703582000200841d8006a2009107b200a1008200e28020022092009280200417f6a3602000240200e28020022092802000d0020092802081005200e28020022092009280204417f6a360204200e28020022092802040d002009101d0b200e101d4101210d41002106200c41046a2802000d400c410b1021000b200341011020000b200641011020000b200141011020000b200141011020000b200341011020000b200341011020000b00000b107c000b410c41041020000b410441041020000b410341011020000b410641011020000b412041041020000b410341011020000b410341011020000b41c00041041020000b410341011020000b410f41011020000b41800141041020000b410341011020000b410f41011020000b410341011020000b410841011020000b41800241041020000b410341011020000b410a41011020000b410341011020000b410a41011020000b410341011020000b410a41011020000b410341011020000b410b41011020000b41800441041020000b410341011020000b410d41011020000b410341011020000b410c41011020000b410341011020000b410b41011020000b410341011020000b411541011020000b410341011020000b410f41011020000b410341011020000b410741011020000b410341011020000b411141011020000b410341011020000b410e41011020000b41800841041020000b410341011020000b410e41011020000b410341011020000b411041011020000b410341011020000b411041011020000b410341011020000b411141011020000b410441041020000b410a41011020000b41c4f5c200102c000b2006101d0b200d450d02200841d8006a41386a200841086a41386a280200360200200841d8006a41306a200841086a41306a290300370300200841d8006a41286a200841086a41286a290300370300200841d8006a41206a200841086a41206a290300370300200841d8006a41186a200841086a41186a290300370300200841d8006a41106a200841086a41106a290300370300200841d8006a41086a200841086a41086a290300370300200820082903083703582000200841d8006a200d107b4100210d41012106200c41046a280200450d010b200c280200101d0b0240200c41106a280200450d00200c28020c101d0b0240200c41246a280200450d00200c41206a280200101d0b0240200c41306a280200450d00200c28022c101d0b0240200c41c4006a280200450d00200c41c0006a280200101d0b0240200c41d0006a280200450d00200c28024c101d0b0240200c41e4006a280200450d00200c41e0006a280200101d0b0240200c41f0006a280200450d00200c28026c101d0b0240200c4184016a280200450d00200c4180016a280200101d0b0240200c4190016a280200450d00200c28028c01101d0b0240200c41a4016a280200450d00200c41a0016a280200101d0b0240200c41b0016a280200450d00200c2802ac01101d0b0240200c41c4016a280200450d00200c41c0016a280200101d0b0240200c41d0016a280200450d00200c2802cc01101d0b0240200c41e4016a280200450d00200c41e0016a280200101d0b0240200c41f0016a280200450d00200c2802ec01101d0b0240200c4184026a280200450d00200c4180026a280200101d0b0240200c4190026a280200450d00200c28028c02101d0b0240200c41a4026a280200450d00200c41a0026a280200101d0b0240200c41b0026a280200450d00200c2802ac02101d0b0240200c41c4026a280200450d00200c41c0026a280200101d0b0240200c41d0026a280200450d00200c2802cc02101d0b0240200c41e4026a280200450d00200c41e0026a280200101d0b0240200c41f0026a280200450d00200c2802ec02101d0b0240200c4184036a280200450d00200c4180036a280200101d0b0240200c4190036a280200450d00200c28028c03101d0b0240200c41a4036a280200450d00200c41a0036a280200101d0b0240200c41b0036a280200450d00200c2802ac03101d0b0240200c41c4036a280200450d00200c41c0036a280200101d0b0240200c41d0036a280200450d00200c2802cc03101d0b0240200c41e4036a280200450d00200c41e0036a280200101d0b0240200c41f0036a280200450d00200c2802ec03101d0b0240200c4184046a280200450d00200c4180046a280200101d0b0240200c4190046a280200450d00200c28028c04101d0b0240200c41a4046a280200450d00200c41a0046a280200101d0b0240200c41b0046a280200450d00200c2802ac04101d0b0240200c41c4046a280200450d00200c41c0046a280200101d0b0240200c41d0046a280200450d00200c2802cc04101d0b0240200c41e4046a280200450d00200c41e0046a280200101d0b0240200c41f0046a280200450d00200c2802ec04101d0b0240200c4184056a280200450d00200c4180056a280200101d0b0240200c4190056a280200450d00200c28028c05101d0b200c101d200b28020022092009280200417f6a3602000240200b28020022092802000d0020092802081005200b28020022092009280204417f6a360204200b28020022092802040d002009101d0b200b101d4100210902402006410047200d720d00200a100802400340200e20096a220a280200220d200d280200417f6a36020002400240200a280200220d2802000d00200d2802081005200a280200220d200d280204417f6a360204200a280200220a280204450d010b200941046a22094104470d010c020b200a101d200941046a22094104470d000b0b200e101d0b200841a0016a24000f0b2000419e89c00036020420004102360200200041086a41103602000240200841146a2802002209450d00200841086a41106a280200450d002009101d0b0240200841246a280200450d00200841206a280200101d0b200841306a2209280200220a200a280200417f6a36020002402009280200220a2802000d00200a28020810052009280200220a200a280204417f6a360204200928020022092802040d002009101d0b0240200841386a2802002209450d002008413c6a280200450d002009101d0b0240200c41046a280200450d00200c280200101d0b0240200c41106a280200450d00200c28020c101d0b0240200c41246a280200450d00200c41206a280200101d0b0240200c41306a280200450d00200c28022c101d0b0240200c41c4006a280200450d00200c41c0006a280200101d0b0240200c41d0006a280200450d00200c28024c101d0b0240200c41e4006a280200450d00200c41e0006a280200101d0b0240200c41f0006a280200450d00200c28026c101d0b0240200c4184016a280200450d00200c4180016a280200101d0b0240200c4190016a280200450d00200c28028c01101d0b0240200c41a4016a280200450d00200c41a0016a280200101d0b0240200c41b0016a280200450d00200c2802ac01101d0b0240200c41c4016a280200450d00200c41c0016a280200101d0b0240200c41d0016a280200450d00200c2802cc01101d0b0240200c41e4016a280200450d00200c41e0016a280200101d0b0240200c41f0016a280200450d00200c2802ec01101d0b0240200c4184026a280200450d00200c4180026a280200101d0b0240200c4190026a280200450d00200c28028c02101d0b0240200c41a4026a280200450d00200c41a0026a280200101d0b0240200c41b0026a280200450d00200c2802ac02101d0b0240200c41c4026a280200450d00200c41c0026a280200101d0b0240200c41d0026a280200450d00200c2802cc02101d0b0240200c41e4026a280200450d00200c41e0026a280200101d0b0240200c41f0026a280200450d00200c2802ec02101d0b0240200c4184036a280200450d00200c4180036a280200101d0b0240200c4190036a280200450d00200c28028c03101d0b0240200c41a4036a280200450d00200c41a0036a280200101d0b0240200c41b0036a280200450d00200c2802ac03101d0b0240200c41c4036a280200450d00200c41c0036a280200101d0b0240200c41d0036a280200450d00200c2802cc03101d0b0240200c41e4036a280200450d00200c41e0036a280200101d0b0240200c41f0036a280200450d00200c2802ec03101d0b0240200c4184046a280200450d00200c4180046a280200101d0b0240200c4190046a280200450d00200c28028c04101d0b0240200c41a4046a280200450d00200c41a0046a280200101d0b0240200c41b0046a280200450d00200c2802ac04101d0b0240200c41c4046a280200450d00200c41c0046a280200101d0b0240200c41d0046a280200450d00200c2802cc04101d0b0240200c41e4046a280200450d00200c41e0046a280200101d0b0240200c41f0046a280200450d00200c2802ec04101d0b0240200c4184056a280200450d00200c4180056a280200101d0b0240200c4190056a280200450d00200c28028c05101d0b200c101d200b28020022092009280200417f6a3602000240200b28020022092802000d0020092802081005200b28020022092009280204417f6a360204200b28020022092802040d002009101d0b200b101d200841a0016a24000bd70e05057f017e157f027e0a7f230041900b6b22022400024020002802000d002000417f36020020012802082103200128020021040240024020012802042205450d002005210620042101034020012802800921012006417f6a22060d000b0340200420042f01064102746a4180096a28020021042005417f6a22050d000c020b0b200421010b200241086a411c6a20042f0106360200200241086a41186a4100360200200241086a41146a20043602002002200336022820024100360218200242003703102002200136020c2002410036020820024198026a200241086a10d602024020022903b80222074202510d002000410c6a2108200041046a2109200241c0016a41146a210a200241a0016a410c6a210b20024198026a41256a210c200241dd026a210d200241c8026a210e200241c0026a210f200241dc026a2110200241d0026a2111200241d4026a2112200241d8026a2113200241bc026a211420024198026a41206a211520024198026a411c6a21160340200241d8006a41086a220420024198026a41086a2217290300370300200241d8006a41106a220120024198026a41106a2218290300370300200241d8006a41186a220620024198026a41186a2219290300370300200241306a41086a2203200d41086a290000370300200241306a41106a221a200d41106a290000370300200241306a41186a221b200d41186a290000370300200241306a411f6a221c200d411f6a28000036000020022002290398023703582002200d290000370330200e290300211d200f290300211e20102d0000211f201128020021052012280200212020132802002121200241f8006a411f6a2222201c280000360000200241f8006a41186a2223201b290300370300200241f8006a41106a2224201a290300370300200241f8006a41086a2225200329030037030020022002290330370378200241c0016a41186a22262006290300370300200241c0016a41106a221c2001290300370300200241c0016a41086a221a2004290300370300200220022903583703c001024002400240024002400240024002402009280200220341f0c0c100460d00200041086a28020021270c010b418009101f2203450d0141002127200341003b010620034100360200200341086a20024198026a41f80810ce031a200041086a4100360200200920033602000b0240034020032f01062228410574211b410021044100210102400340201b2004460d01200241c0016a200320046a41086a412010d0032206450d03200441206a2104200141016a21012006417f4a0d000b2001417f6a21280b02402027450d002027417f6a2127200320284102746a4180096a28020021030c010b0b200241a0016a41186a22042026290300370300200241a0016a41106a2201201c290300370300200241a0016a41086a2206201a290300370300200220022903c0013703a001201c2008360200200241c0016a410c6a2028360200201a2009360200200a20022903a001370200200a41086a2006290300370200200a41106a2001290300370200200a41186a2004290300370200200220033602c401200241003602c0012018201d3703002017201e3703002014201f3a0000201520213602002016202036020020192005360200200c2002290378370000200c41086a2025290300370000200c41106a2024290300370000200c41186a2023290300370000200c411f6a20222800003600002002200737039802200241c0016a20024198026a10311a0c060b200341e8026a200141c8006c6a21060240024020074201510d00201f41ff01714102470d010c030b200642013703002006201e370308200641106a201d370300201f41ff01714102460d020b2006201f3a00242006413d6a2023290300370000200641356a20242903003700002006412d6a2025290300370000200641256a200229037837000020200d020c030b41800941081020000b2020450d010b2020210120052104034020042802900221042001417f6a22010d000b0340200520052f01064102746a4190026a28020021052020417f6a22200d000c020b0b200521040b20052f0106210120152021360200201620013602002019410036020020024198026a41146a200536020020184100360200201742003703002002200436029c022002410036029802200241c0016a20024198026a10d702024020022802c001450d00200641186a21010340200241a0016a41106a201c290300370300200241a0016a41086a2204201a290300370300200220022903c0013703a00120024188026a41086a2004280200360200200220022903a00137038802201a200b41086a2802003602002002200b2902003703c001200241f8016a200120024188026a200241c0016a10f801024020022802f801450d0020022802fc012204450d00200241f8016a41086a280200450d002004101d0b200241c0016a20024198026a10d70220022802c0010d000b0b20024198026a10320b20024198026a200241086a10d602201529030022074202520d000b0b200241086a103b2000200028020041016a360200200241900b6a24000f0b10f901000b910202077f017e024002400240024002400240200041046a2802002202200041086a28020022036b2001410c6a2802002204200141086a28020022056b220641d8006d22074f0d00200320076a22082003490d0320024101742203200820082003491b2203ad42d8007e2209422088a70d032009a722084100480d032002450d012000280200200241d8006c2008101e2202450d020c040b200028020021020c040b2008101f22020d020b200841081020000b1021000b20002002360200200041046a2003360200200041086a28020021030b2002200341d8006c6a2005200610ce031a200141086a2004360200200041086a2200200028020020076a36020002402001280204450d002001280200101d0b0b8d0202077f017e024002400240024002400240200041046a2802002202200041086a28020022036b2001410c6a2802002204200141086a28020022056b220641077522074f0d00200320076a22082003490d0320024101742203200820082003491b2203ad4207862209422088a70d032009a722084100480d032002450d01200028020020024107742008101e2202450d020c040b200028020021020c040b2008101f22020d020b200841081020000b1021000b20002002360200200041046a2003360200200041086a28020021030b200220034107746a2005200610ce031a200141086a2004360200200041086a2200200028020020076a36020002402001280204450d002001280200101d0b0b5f01017f230041306b220224002002200136020c20022000360208200241246a41013602002002411836022c20024201370214200241d8c0c4003602102002200241086a3602282002200241286a360220200241106a41e0c0c40010cf01000b8403010e7f23004190016b220124002001200010d602024020012903204202510d00200141c0006a21022001413c6a2103200141386a210420014184016a210520014180016a2106200141fc006a2107200141f8006a2108200141f0006a210903402002280200210a2004280200210b024002402003280200220c450d00200c210d200b210e0340200e28029002210e200d417f6a220d0d000b0340200b200b2f01064102746a4190026a280200210b200c417f6a220c0d000c020b0b200b210e0b200141e8006a41206a200a3602002005200b2f0106360200200641003602002007200b36020020084100360200200942003703002001200e36026c20014100360268200141e8006a10322001200010d602200141206a2903004202520d000b0b02402000280204220b41f0c0c100460d00200b280200210c200b101d200c450d00200c280200210e200c101d200e450d000240200e280200220b450d000340200e101d200b210e200b280200220c210b200c0d000b0b200e101d0b20014190016a24000ba30601027f024002400240024002400240024002400240024002400240024002400240024002400240024020002802002201410d4b0d0020010e0e1201121212020304050612071208120b20002802044101470d11200041086a2200280200103c2000280200101d0f0b200041086a280200220141064b0d0b024020010e071100110d110e0f110b200041106a280200450d102000410c6a280200101d0f0b200041086a2d00002201410e4b0d0e20014106470d0f200041106a280200450d0f2000410c6a280200101d0f0b200041086a2d000022014105460d0520014101470d0e2000410c6a2200280200103c2000280200101d0f0b200041086a28020022014102460d0520014101470d0d200041106a280200450d0d2000410c6a280200101d0f0b200041086a2d00004101470d0c2000410c6a2200280200103c2000280200101d0f0b20002d00044101470d0b2000410c6a2200280200103c2000280200101d0f0b200041086a280200450d0a2000280204101d0f0b200041086a2d000022014102490d0920014103460d0220014102470d03200041106a280200450d092000410c6a280200101d0f0b2000410c6a2200280200103c2000280200101d0f0b200041106a280200450d072000410c6a280200101d0f0b200041346a280200450d06200041306a280200101d0f0b200041306a280200450d052000412c6a280200101d0f0b0240200041146a2802002202450d002000410c6a28020021012002410c6c210203400240200141046a280200450d002001280200101d0b2001410c6a2101200241746a22020d000b0b200041106a280200450d042000410c6a280200101d0f0b200041106a280200450d032000410c6a280200101d0f0b200041106a280200450d022000410c6a280200101d0f0b0240200041146a2802002202450d002000410c6a2802002101200241186c210203400240200141046a280200450d002001280200101d0b0240200141106a280200450d002001410c6a280200101d0b200141186a2101200241686a22020d000b0b200041106a280200450d012000410c6a280200101d0f0b200041106a280200450d002000410c6a280200101d0f0b0ba90404027f017e027f017e230041d0006b220524000240024002400240200241ff017122064102460d0020064104470d02200541106a200110e1012005290310200356200541186a290300220720045620072004511b0d010c020b2005200110e1012005290300200358200541086a290300220720045820072004511b0d010b41adb7c0002101412621060c010b200541206a200110ea01024002400240024002402005280228450d0042002107200541c0006a41086a2206420037030020054200370340418cb9c000410d200541c0006a1001200541306a41086a2006290300370300200520052903403703300240200541306a411041f8b3c200410041001002417f460d0020054200370340200541306a4110200541c0006a41084100100241016a41084d0d03200529034021070b200541c0006a200110ea012005280244210820052802402109024020052802482201450d00200141286c210620092101034002402007200141106a2903005a0d002001290300200358200141086a290300220a200458200a2004511b0d00200141206a2d000020027141ff0171200241ff0171460d040b200141286a2101200641586a22060d000b0b410021012008450d040c030b02402005280224450d002005280220101d0b410021010c040b41d3b7c000210120080d010c020b41df88c0004133103a000b2009101d0b02402005280224450d002005280220101d0b413121060b2000200636020420002001360200200541d0006a24000b820701087f230041900a6b22042400024002400240024020002802000d002000417f360200200441e0006a41186a200141186a290000370300200441e0006a41106a200141106a290000370300200441e0006a41086a200141086a29000037030020042001290000370360024002402000280204220541f0c0c100460d00200041086a28020021060c010b418009101f2205450d0241002106200541003b010620054100360200200541086a20044198016a41f80810ce031a200041086a4100360200200041046a20053602000b200041046a210702400240034020052f010622084105742109410021014100210a0240034020092001460d01200441e0006a200520016a41086a412010d003220b450d03200141206a2101200a41016a210a200b417f4a0d000b200a417f6a21080b02402006450d002006417f6a2106200520084102746a4180096a28020021050c010b0b200441086a41186a200441e0006a41186a290300370300200441086a41106a200441e0006a41106a290300370300200441086a41086a200441e0006a41086a290300370300200420042903603703082000410c6a2101410021062008210a41000d010c040b2000410c6a21014101450d030b200441b0016a4200370300200441ac016a41f0c0c100360200200441003602b801200441003602a801200442003703a001200441f0c0c10036029c0120044100360298012005200a41c8006c6a41e8026a210120044198016a10320c030b10f901000b41800941081020000b200441e0006a411c6a200441086a41086a29030037020020044184016a200441086a41106a2903003702002004418c016a200441086a41186a290300370200200420013602702004200a36026c2004200736026820042005360264200420063602602004200429030837027420044198016a411c6a420037020020044198016a41106a200441d0006a41086a290300370300200441bd016a200429002d370000200441c5016a2004412d6a41086a290000370000200441cd016a2004412d6a41106a290000370000200441d5016a2004412d6a41186a290000370000200441dc016a200441cc006a2800003600002004420037039801200441023a00bc01200441f0c0c1003602b001200420042903503703a001200441e0006a20044198016a103121010b200141106a200337030020012002370308200142013703002000200028020041016a360200200441900a6a24000b7701017f230041c0006b220024002000411836020c200041fca8c100360208200041346a4119360200200041246a41023602002000411836022c20004202370214200041b8b1c4003602102000200041386a3602302000200041086a3602282000200041286a360220200041106a41c8b1c40010cf01000bc50101057f230041306b220124002000410c6a28020021022000280204210302400240200041086a2802002204450d002004210520032100034020002802800921002005417f6a22050d000b0340200320032f01064102746a4180096a28020021032004417f6a22040d000c020b0b200321000b200141246a20032f0106360200200141206a41003602002001411c6a20033602002001200236022820014100360218200142003703102001200036020c20014100360208200141086a103b200141306a24000bfc1b03027f027e097f230041d0036b2209240002400240024020012802242001280240220a2802a001470d00200041a582c00036020420004101360200200041086a4129360200200841046a2802000d010c020b200542002005290308220b200a4190016a2903007d220c200c200b56200c5072220a1b37030802400240200a450d00200041ce82c00036020420004101360200200041086a41233602000c010b200941106a2001410c6a220a2002103020094180026a41186a220d200241186a29000037030020094180026a41106a220e200241106a29000037030020094180026a41086a220f200241086a2900003703002009200229000037038002200941c8016a20094180026a103320092802d001211020092902d401210c200941f0006a4200370300200941e8006a42808080808001370300200941d8006a4184d0c200360200200941d4006a200a360200200941cc006a4200370200200941386a41106a41f0c0c1003602002009418c016a200f29030037020020094194016a200e2903003702002009419c016a200d290300370200200942083703604100210e200941003602442009200c37023c2009201036023820092009290380023702840120092001280248360280012009200141c0006a2902003703784101210d2009200141246a28020041016a36025c0240024002400240024002400240024002400240024002402003200484500d00200941086a20054100200141cc006a200220032004200941386a103420092802082202450d00200928020c21012000200236020420004101360200200041086a2001360200024020092802382201450d00200928023c450d002001101d0b200941386a41186a280200210a200941c8006a2802002101200941386a41146a2802002202450d012002210520012100034020002802800921002005417f6a22050d000b0340200120012f01064102746a4180096a28020021012002417f6a22020d000c030b0b0240024020092d0010450d00200941a8016a41186a200941296a290000370300200941a8016a41106a200941216a290000370300200941a8016a41086a200941196a290000370300200920092900113703a80120094180026a200941a8016a200141c8006a28020028020010352009280280024101470d01200020092902840237020420004101360200024020092802382201450d00200928023c450d002001101d0b200941386a41186a280200210a200941c8006a2802002101200941386a41146a2802002202450d042002210520012100034020002802800921002005417f6a22050d000b0340200120012f01064102746a4180096a28020021012002417f6a22020d000c060b0b410021074101210f0c070b200941b0036a41186a220d2009419c026a280200360200200941b0036a41106a220e20094194026a290200370300200941b0036a41086a22022009418c026a29020037030020092009290284023703b003200941c8016a41106a2002290300370300200941c8016a41186a200e290300370300200941e8016a200d280200360200200941043602cc012009418df9c1003602c801200920092903b0033703d001200141c4006a280200210d200941e0026a41186a200141e4006a290000370300200941e0026a41106a200141dc006a290000370300200941e0026a41086a200141d4006a2900003703002009200129004c3703e00220024200370300200942003703b003418390c100410d200941b0036a1001200941a0036a41086a2002290300370300200920092903b0033703a0034200210c0240200941a0036a411041f8b3c200410041001002417f460d00200942003703b003200941a0036a4110200941b0036a41084100100241016a41084d0d0a20092903b003210c0b200941b0036a41086a22024200370300200942003703b00341fbb8c0004111200941b0036a1001200941a0036a41086a2002290300370300200920092903b0033703a003200941a0036a411041f8b3c200410041001002417f460d04200941c8036a4200370300200941b0036a41106a420037030020024200370300200942003703b003200941a0036a4110200941b0036a4120410010022202417f460d0a2002411f4d0d0a20094180036a41186a200941b0036a41186a29030037030020094180036a41106a200941b0036a41106a29030037030020094180036a41086a200941b0036a41086a290300370300200920092903b003370380030c050b200121000b2009419c026a20012f010636020020094180026a41186a410036020020094180026a41146a20013602002009200a3602a002200941003602900220094200370388022009200036028402200941003602800220094180026a103b0240200941e8006a2802002200450d00200941386a41286a2802002101200041d8006c21000340024020012d00004105490d00200141286a280200450d00200141246a280200101d0b200141d8006a2101200041a87f6a22000d000b0b0240200941e4006a280200450d00200941e0006a280200101d0b0240200941f4006a2802002201450d0020014107742100200941ec006a28020041206a210103402001103c20014180016a2101200041807f6a22000d000b0b200941f0006a280200450d09200941ec006a280200101d200841046a2802000d0a0c0b0b200121000b2009419c026a20012f010636020020094180026a41186a410036020020094180026a41146a20013602002009200a3602a002200941003602900220094200370388022009200036028402200941003602800220094180026a103b0240200941e8006a2802002200450d00200941386a41286a2802002101200041d8006c21000340024020012d00004105490d00200141286a280200450d00200141246a280200101d0b200141d8006a2101200041a87f6a22000d000b0b0240200941e4006a280200450d00200941e0006a280200101d0b0240200941f4006a2802002201450d0020014107742100200941ec006a28020041206a210103402001103c20014180016a2101200041807f6a22000d000b0b200941f0006a280200450d07200941ec006a280200101d200841046a2802000d080c090b20094198036a420037030020094180036a41106a420037030020094180036a41086a420037030020094200370380030b200941a4026a200941e0026a41086a290300370200200941ac026a200941e0026a41106a290300370200200941b4026a200941e0026a41186a290300370200200941c4026a20094180036a41086a290300370200200941cc026a20094180036a41106a290300370200200941d4026a20094180036a41186a2903003702002009200337038002200920092903e00237029c022009200c3703900220092009290380033702bc0220092004370388022009200941386a36029802200941b0036a41086a200841086a280200360200200920082902003703b003200941f0016a200d200941c8016a20094180026a20062007200941b0036a200510364101210d0240024020092802f00122024101460d004100210e4100210720024102470d01200020092902f401370204200041013602000240200941e0016a280200450d00200941dc016a280200101d0b024020092802382201450d00200928023c450d002001101d0b200941386a41186a2802002108200941c8006a2802002101200941386a41146a2802002202450d032002210520012100034020002802800921002005417f6a22050d000b0340200120012f01064102746a4180096a28020021012002417f6a22020d000c050b0b200941fc016a280200210e200941f0016a41086a280200210720092802f401210d0b0240200941e0016a280200450d00200941dc016a280200101d0b4100210f0b20094180026a41086a2206200941386a410c6a220241086a290200370300200941c8016a41086a221020094180026a410c6a280200360200200920022902003703800220092009290284023703c801200941f4006a2802002111200941f0006a2802002112200941386a41346a2802002102200941e8006a2802002113200941e4006a2802002114200941386a41286a2802002105024020092802382215450d00200928023c450d002015101d0b20062010280200360200200920092903c80137038002200941386a41086a20062802003602002009200929038002370338200a200941386a103720092005201341d8006c6a360244200920053602402009201436023c20092005360238200141286a200941386a10382009200220114107746a360244200920023602402009201236023c20092002360238200141346a200941386a10392000410c6a200e360200200041086a20073602002000200d36020420004100360200200f450d06200841046a280200450d062008280200101d200941d0036a24000f0b200121000b2009419c026a20012f010636020020094180026a41186a410036020020094180026a41146a2001360200200920083602a002200941003602900220094200370388022009200036028402200941003602800220094180026a103b0240200941e8006a2802002200450d00200941386a41286a2802002101200041d8006c21000340024020012d00004105490d00200141286a280200450d00200141246a280200101d0b200141d8006a2101200041a87f6a22000d000b0b0240200941e4006a280200450d00200941e0006a280200101d0b0240200941f4006a2802002201450d0020014107742100200941ec006a28020041206a210103402001103c20014180016a2101200041807f6a22000d000b0b200941f0006a280200450d04200941ec006a280200101d200941d0036a24000f0b41df88c0004133103a000b41df88c0004133103a000b200841046a280200450d010b2008280200101d0b200941d0036a24000ba07709227f047e4f7f017e397f017e057f027e0f7f230041c0046b220424004100210520044100360290022004200236028c022004200136028802024002400240024002400240200241034b0d00200441013a0048200441c4036a4101360200200441013602f401200442013702b40320044190afc4003602b0032004200441c8006a3602f0012004200441f0016a3602c003200441e0006a200441b0036a1028200428026821022004280264210620042802602107410521080c010b20044190026a4104360200024002400240024020012800004180c2cdeb06470d002002417c714104470d01200441013a0048200441c4036a4101360200200441013602f401200442013702b40320044190afc4003602b0032004200441c8006a3602f0012004200441f0016a3602c003200441e0006a200441b0036a102820042802682102200428026421062004280260210741052108410021050c040b410121080c010b02400240024002400240024002400240024002400240024002400240200241074d0d0020044188026a41086a41083602000240024002400240200128000422074101470d00200441b0036a20044188026a104320042802b0034101470d014104210a4100210b4100210c20042d00b4030d020c050b410221080c120b200441b0036a410572210f4104210a200441b0036a412c6a2110200441d4036a2111200441d0036a2112200441cc036a2113200441c8036a2114200441c4036a2115200441c0036a2116200441bc036a2117200441b8036a211841002107412821054100210b4100210c410021090340200441f0016a41026a2219200f41026a2d00003a00002004200f2f00003b01f0012010280200211a200441d8036a280200211b2011280200211c2012280200211d2013280200211e2014280200211f20152802002120201628020021212017280200212220182802002106024020042d00b4032223417e6a220141ff0171410a4b0d0002400240024002400240024002400240024002400240024002400240024002402001410a4b22240d00024020010e0b00070405020809060b030a000b200941ff0171222541014d0d0c0c0b0b200941ff0171222541004b0d0a0c0b0b200941ff0171222541054d0d0a0c090b200941ff01712225410a4d0d090c080b200941ff0171222541034d0d080c070b200941ff0171222541044d0d070c060b200941ff0171222541084d0d060c050b200941ff0171222541024d0d050c040b200941ff0171222541064d0d040c030b200941ff0171222541074d0d030c020b200941ff01712225410b4d0d020c010b200941ff0171222541094d0d010b411321082023410d4b0d010c020b02400240024002400240024002400240024002400240024020240d00024020010e0b00070405020809060b030a000b20254101470d0e0c0b0b20254100460d0a0c0d0b20254105470d0c0c090b2025410a470d0b0c080b20254103470d0a0c070b20254104470d090c060b20254108470d080c050b20254102470d070c040b20254106470d060c030b20254107470d050c020b2025410b470d040c010b20254109470d030b411421082023410d4d0d010b02402022450d002006101d0b0240201f450d00201e450d00201f101d0b201b450d10201c101d200b0d110c120b0240024002400240024002400240024002400240024020230e0e1904050119191908031a07000206190b2021450d184118213d2006202141186c6a213e4104213f4114214041102141410c2142410921434108214441ffffffff0321454170214620062147410121010c110b2021450d17202141286c21022006210103400240200141046a280200450d002001280200101d0b0240200141106a280200450d002001410c6a280200101d0b200141286a2101200241586a22020d000c180b0b2021450d16411c214820062021411c6c6a2149410c214a4108214b4114214c4104214d4110214e4109214f41ffffffff0321504170215120062152410221010c0f0b2021450d15202141146c21022006210103400240200141046a280200450d002001280200101d0b200141146a21012002416c6a22020d000c160b0b02402022450d002006101d0b201f450d152020101d200b0d160c170b2021450d13202141047421022006210103400240200141046a280200450d002001280200101d0b200141106a2101200241706a22020d000c140b0b200641ff017122014102460d0320014101460d022021450d132022101d200b0d140c150b2021450d11411c215320062021411c6c6a2154410c2155410821564114215741042158411021594109215a41ffffffff03215b4170215c2006215d410321010c0a0b2021450d104104215e200620214104746a215f41102160410921614108216241ffffffff0321634170216420062165410421010c090b201f450d0c201f410c6c2102202121010340024020012802002205450d00200141046a280200450d002005101d0b2001410c6a2101200241746a22020d000c0d0b0b201f450d0b41042195012021201f4104746a2196014110219701410c21980141082199014174219a012021219b01410521010c070b0240024002400240024002400240024002400240024020240d00024020010e0b00070405020809060b030a000b410121090c0b0b410021090c0a0b410521090c090b410a21090c080b410321090c070b410421090c060b410821090c050b410221090c040b410621090c030b410721090c020b410b21090c010b410921090b200441e0006a41026a222420192d00003a0000200420042f01f0013b01600240200b200c470d00200b41016a2201200b490d072007200120012007491b220cad422c7e2226422088a70d072026a722014100480d070240200b450d00200a200541586a2001101e220a0d010c040b2001101f220a450d030b200a20056a220141586a20233a00002001201a3602002001417c6a201b360200200141786a201c360200200141746a201d360200200141706a201e3602002001416c6a201f360200200141686a2020360200200141646a2021360200200141606a20223602002001415c6a20063602002001415b6a20242d00003a0000200141596a20042f01603b0000200741026a21072005412c6a2105200b41016a210b200441b0036a20044188026a104320042802b0034101470d000b20042d00b403450d030b20042902b4032227a722084110762105200841087621092027422088a72107200441b0036a41106a2802002102200441bc036a2802002106200b0d0c0c0d0b200141041020000b41082002102b000b200b412c6c2101200a41606a21050240024003402001450d01200141546a2101200541206a21072005412c6a220d210520072d0000410b470d000b200d280200210e0c010b4100210e0b200b412c6c2101200a41586a21050240024003402001450d01200141546a2101200541286a21072005412c6a220d210520072d00004104470d000b200441c0006a200d1044200e2004280244460d010c0d0b200e4100470d0c0b024002400240024020044188026a41086a2802002002470d004280c2cdeb062128200441b4026a200b360200200441b0026a2201200c360200200441ac026a200a360200200441003602a00220044280c2cdeb06428080808010843702a402200a450d0320012903002229a7212a200a2029422088a7222b412c6c6a2105200a2101034020052001460d0220012d000021022001412c6a2207210120024102470d000b200441386a200741586a104420042802382101200428023c21020c020b200441003a0048200441c4036a4101360200200441013602f401200442013702b40320044190afc4003602b0032004200441c8006a3602f0012004200441f0016a3602c003200441e0006a200441b0036a1028200441bb036a200441e0006a41086a280200360000200420042903603700b303200441ac026a200441b7036a290000370000200441053a00a402200441013602a002200420042900b0033700a5020240200b450d00200b412c6c2108200a21010340200110452001412c6a2101200841546a22080d000b0b200441a0026a41047221010240200c450d00200a101d0b4100450d130c140b410021010b2002410020011b212c200141f8b3c20020011b212d200a202b412c6c6a2105200a210102400240034020052001460d0120012d000021022001412c6a2207210120024108470d000b200441306a200741586a104420042802302101200428023421020c010b410021010b2002410020011b212e200141f8b3c20020011b210d200a202b412c6c6a2105200a210102400240034020052001460d0120012d000021022001412c6a2207210120024104470d000b200441286a200741586a104420042802282101200428022c21020c010b410021010b2002410020011b212f200141f8b3c20020011b2130200a202b412c6c6a2105200a210102400240024003404100210e20052001460d0120012d000021022001412c6a2207210120024103470d000b200441206a200741586a104420042802244100200428022022011b22020d010c020b410021014100410041001b2202450d010b200241286c2102200141f8b3c20020011b41186a21014100210e0340200e20012d0000456a210e200141286a2101200241586a22020d000b0b41142131200d202e41146c6a213241002133410821344106212e419289c0002135410c2136411021374102213841042139418df9c100213a41e3c2b1e306213b4100213c410021010c010b418284c0004136103a000b03400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020010e080001020304070a0b0b0b0240200d2032460d000240024002400340200d280200210102400240200d20346a2802002202202e460d0020022039470d012001203a460d042001280000203b470d010c040b20012035460d0220012035202e10d003450d020b200d20316a220d2032470d000c040b0b4101213c200d20366a280200450d010c0a0b41012133200d20366a2802000d090b200d20376a2802002201200e6b220220014b0d09419988c000210141262123202f20024d0d52203020022038746a2202450d5241bf88c000210141202123202c200228020022024d0d52202d20022039746a2202450d52411f212341c483c000210120022802080d52200d20316a210d20022d000d2039460d200c520b024002402033203c71410171450d00200a202b412c6c6a2105200a2101034020052001460d0220012d000021022001412c6a2207210120024106470d000b200441186a200741586a1044200428021c450d01200041e383c000360204411f21230c540b411c411e203c41017122011b212341df87c00041fb87c00020011b21010c520b200a202b412c6c6a2105200a2101034020052001460d0520012d000021022001412c6a2207210120024102470d000b200441106a200741586a104420042802102101200428021421020c050b02402047203f6a280200450d002047280200101d0b0240204720406a2802002202450d00204728020c21012002203f7421020340024020012d00002043470d00200120446a280200204571450d002001203f6a280200101d0b200120416a2101200220466a22020d000b0b2047203d6a21010240204720416a280200450d00204720426a280200101d0b200121472001203e470d1f0c520b02402052204a6a2802002202450d00205228020421012002204d7421020340024020012d0000204f470d002001204b6a280200205071450d002001204d6a280200101d0b2001204e6a2101200220516a22020d000b0b02402052204b6a280200450d002052204d6a280200101d0b205220486a210102402052204c6a280200450d002052280210101d0b2001215220012049470d1f0c510b0240205d20556a2802002202450d00205d2802042101200220587421020340024020012d0000205a470d00200120566a280200205b71450d00200120586a280200101d0b200120596a21012002205c6a22020d000b0b0240205d20566a280200450d00205d20586a280200101d0b205d20536a21010240205d20576a280200450d00205d280210101d0b2001215d20012054470d1f0c500b024020652802082202450d00206528020021012002205e7421020340024020012d00002061470d00200120626a280200206371450d002001205e6a280200101d0b200120606a2101200220646a22020d000b0b206520606a210102402065205e6a280200450d002065280200101d0b200121652001205f470d1f0c4f0b410021010b2002410020011b2166200141f8b3c20020011b2167200a202b412c6c6a2105200a21010240024003404100216820052001460d0120012d000021022001412c6a2207210120024103470d000b200441086a200741586a104420042802082101200428020c21020c010b410021010b41282169200141f8b3c20020011b226a2002410020011b41286c6a216b4103216c41dfa3c200216d4104216e41e2a3c200216f4101217041e0002171410d217241792173410e217441c49ec20021754107217641cb9dc20021774106217842e5f0d1fbb5ac98b6ec00217941d39dc200217a410a217b41dd9dc200217c4102217d41e79dc200217e41f19dc200217f410b21800141959ec20021810141899ec200218201410c21830141fc9dc20021840141dc9ec20021850141ea9ec20021860141ad9dc200218701410f21880141bc9dc20021890141b59ec200218a0141f89ec200218b014110218c0141889fc200218d0141cb9ec200218e014111218f0141989fc20021900141a09ec2002191014115219201411c21930141002194010c330b209b0122072097016a219b01024020072802042201450d00024020072098016a2802002202450d0020022098016c21020340024020012802002205450d0020012095016a280200450d002005101d0b20012098016a21012002209a016a22020d000b0b20072099016a280200450d0020072095016a280200101d0b209b01209601470d1d0c490b41132123418783c00021010c490b412a2123419a83c00021010c480b0240024002400240024002400240024002400240024002400240206a206b460d0041b884c000211b412d2123206a280208206c470d070240206a2802002201206d460d002001206d206c10d0030d080b206a20696a211e0240024002400240024002400240024002400240024002400240024002400240024002400240206a2d001822010d00418b85c000211b413621232066206a28021c22014d0d1a20672001206e746a221f450d1a206a28020c2101024002400240024002400240024002400240024002400240206a2802142202206c470d0041e584c000211b412621232001206f460d262001206f206c10d003450d26206f2001206c10d0030d262070101f2207450d33200720683a0000201f2d000c2071470d1e201f2802082070470d1e201f280200210f41002101034020010d02200720016a2102200f20016a2105200120706a210120052d000020022d0000460d000c1f0b0b41e584c000211b41262123200220736a220220744b0d25024020020e0f000926070508040602030b2626260a000b024020012075460d0020752001207610d0030d260b201f2d000c2071470d25201f2802080d25201e216a201f20726a2d0000206e460d4a0c250b201f20726a2d000021012007101d201e216a2001206e460d580c240b2001208701460d0a208701200120880110d003450d0a2001208901460d14208901200120880110d003450d1402402001208a01460d00208a01200120880110d0030d240b201f2d000c2071470d23201f2802080d23201e216a201f20726a2d0000206e460d520c230b2001208b01460d0a208b012001208c0110d003450d0a02402001208d01460d00208d012001208c0110d0030d230b206c101f2207450d32200720683a0002200720683b0000201f2d000c2071470d23201f280208206c470d23201f280200210f4100210103402001207d4b0d16200720016a2102200f20016a2105200120706a210120052d000020022d0000460d000c240b0b02402001208401460d002084012001207210d0030d220b201f2d000c2071470d21201f2802080d21201e216a201f20726a2d0000206e460d490c210b2001207f460d09207f200120800110d003450d0902402001208101460d00208101200120800110d0030d210b201f2d000c2071470d20201f2802080d20201e216a201f20726a2d0000206e460d490c200b2001208501460d092085012001207410d003450d0902402001208601460d002086012001207410d0030d200b206c101f2207450d32200720683a0002200720683b0000201f2d000c2071470d21201f280208206c470d21201f280200210f4100210103402001207d4b0d14200720016a2102200f20016a2105200120706a210120052d000020022d0000460d000c220b0b2001207a460d09207a2001207b10d003450d092001207c460d10207c2001207b10d003450d1002402001207e460d00207e2001207b10d0030d1f0b201f2d000c2071470d1e201f2802080d1e201e216a201f20726a2d0000206e460d490c1e0b02402001208201460d00208201200120830110d0030d1e0b201f2d000c2071470d1d201f2802080d1d201e216a201f20726a2d0000206e460d440c1d0b024020012077460d0020012900002079520d1d0b2076101f2207450d3220072068360003200720703a0002200720683b0000201f2d000c2071470d16201f2802082076470d16201f280200210f410021010340200120784b0d0a200720016a2102200f20016a2105200120706a210120052d000020022d0000460d000c170b0b02402001209101460d00209101200120920110d0030d1c0b201f2d000c2071470d1b201f2802080d1b201e216a201f20726a2d0000206e460d410c1b0b2001208e01460d06208e012001208f0110d003450d0602402001209001460d002090012001208f0110d0030d1b0b207d101f2207450d28200720683b0000201f2d000c2071470d19201f280208207d470d19201f280200210f410021010340200120704b0d10200720016a2102200f20016a2105200120706a210120052d000020022d0000460d000c1a0b0b02402001207d470d00206a2093016a2194010b201e216a410621010c610b206e101f2207450d2a20072068360000201f2d000c2071470d15201f280208206e470d15201f280200210f4100210103402001206c4b0d07200720016a2102200f20016a2105200120706a210120052d000020022d0000460d000c160b0b201f2d000c2071470d17201f2802080d17201f20726a2d00002201206e460d17201e216a2001206e72206e460d4a0c170b201f2d000c2071470d16201f2802080d16201e216a201f20726a2d0000206e460d400c160b201f2d000c2071470d15201f2802080d15201f20726a2d00002201206e460d15201e216a2001206e72206e460d370c150b2076101f2207450d2920072068360003200720703a0002200720683b0000201f2d000c2071470d0f201f2802082076470d0f201f280200210f410021010340200120784b0d04200720016a2102200f20016a2105200120706a210120052d000020022d0000460d000c100b0b207d101f2207450d22200720683b0000201f2d000c2071470d0f201f280208207d470d0f201f280200210f410021010340200120704b0d04200720016a2102200f20016a2105200120706a210120052d000020022d0000460d000c100b0b201f20726a2d00002201206e460d0c2007101d201e216a2001206e72206e460d400c120b201f20726a2d000021012007101d201e216a2001206e460d420c110b201f20726a2d00002201206e460d0b2007101d201e216a2001206e72206e460d3d0c100b201f20726a2d000021012007101d201e216a2001206e460d330c0f0b2070101f2207450d1f200720683a0000201f2d000c2071470d15201f2802082070470d15201f280200210f41002101034020010d05200720016a2102200f20016a2105200120706a210120052d000020022d0000460d000c160b0b207d101f2207450d21200720683b0000201f2d000c2071470d15201f280208207d470d15201f280200210f410021010340200120704b0d05200720016a2102200f20016a2105200120706a210120052d000020022d0000460d000c160b0b201f20726a2d000021012007101d201e216a2001206e460d3e0c0c0b201f20726a2d000021012007101d201e216a2001206e460d2c0c0b0b201f20726a2d000021012007101d201e216a2001206e460d2d0c0a0b201f20726a2d00002201206e460d102007101d201e216a2001206e72206e460d390c090b201f20726a2d000021012007101d201e216a2001206e460d340c080b2007101d200041e584c0003602040c550b209401450d04209401280204450d09209401280200229c01209401280208229d014d0d0a200041c185c00036020441c90021230c540b2007101d200041e584c0003602040c530b2007101d200041e584c0003602040c520b2007101d200041e584c0003602040c510b2007101d200041e584c0003602040c500b4100219c014100219d010c060b2007101d0b2000201b3602040c4d0b2007101d200041e584c0003602040c4c0b2007101d200041e584c0003602040c4b0b200041cb86c000360204413221230c4a0b209d0120032802484d0d002000418a86c00036020441c10021230c490b200441b0036a41086a22024200370300200441f0c0c1003602b403200420032903083e02c003200420032903103e02b003200441b0036a4104722201410d10462001410c10462001410710462001410f1046200441d8006a20042802c003360200200441c8006a41086a2002290300370300200420042903b003370348200a450d11200441b0036a410c6a20293702002004200a3602b80320042028428080808010843703b003200441e0006a200441b0036a10474101101f2201450d12200141003a0000200420042f01b0033b01a002200441c0036a41e0083b0100200441b8036a428180808010370300200420013602b403200441013602b003200420042f01a0023b01c203200441e0006a200441b0036a1048219e014103101f2202450d13200241026a41002d00e1a3423a0000200241002f00dfa3423b00004103101f2205450d14200541026a41002d00e4a3423a0000200541002f00e2a3423b0000200441a0026a41026a229f01200441b0036a41026a22a0012d00003a0000200420042f00b0033b01a002200441f4006a22a1012802002107200441e0006a41106a280200210120a001209f012d00003a0000200420042f01a0023b01b00320072001470d05200141016a22072001490d432001410174229f0120072007209f01491b229f01ad42287e2227422088a70d432027a722074100480d432001450d03200441ec006a280200200141286c2007101e2201450d060c040b20a2012d000020a8016a220120a9014b0d32024002400240024020010e0400030102000b20a20128020c2201450d35200120aa016c210220a20128020420ab016a210103400240200120ac016a2802000d002001280200220520a101490d0020012005209e016a3602000b200120aa016a2101200220ad016a22020d000c360b0b20a20128020c2201450d3420a20128020422c001200120ae016c6a21c101410021010c330b20a20128020c2201450d3320a20128020422c201200120b0016c6a21c3010c310b20a201280204220120a101490d3220a201209f016a2001209e016a36020020a20120a4016a22a20120a501470d2f0c330b2007101d200041e584c0003602040c460b2007101d200041e584c0003602040c450b2007101f2201450d020b200441f0006a209f01360200200441ec006a2001360200200441f4006a28020021070b200441ec006a280200200741286c6a220141003a00182001200536020c200142838080803037020420012002360200200141106a4283808080303702002001411b6a200441b2036a2d00003a0000200141196a20042f01b0033b00002001411c6a209e0136020020a10120a10128020041016a360200200441b0036a200441e0006a418c0110ce031a200441f0016a200441b0036a1049200441f0016a41106a280200229f01412c6c210120042802f80122a20141586a210202400340410021052001450d01200141546a2101200241286a21072002412c6a22a101210220072d00004103470d000b20a10141086a2802002201450d00200141286c210220a10128020041186a2101410021050340200520012d0000456a2105200141286a2101200241586a22020d000b0b209f01412c6c210120a20141586a21022005417f6a21a10102400340410021052001450d01200141546a2101200241286a21072002412c6a229e01210220072d00004103470d000b209e0141086a2802002201450d00200141286c2102209e0128020041186a2101410021050340200520012d0000456a2105200141286a2101200241586a22020d000b0b209f01412c6c210120a20141606a21020240024003402001450d01200141546a2101200241206a21072002412c6a229e01210220072d00004104470d000b209e012802002101209f010d010c310b41002101209f01450d300b200120056a21a301412c21a40120a201209f01412c6c6a21a5014104219f01200441c8006a41047221a601410021a701417821a801410321a901411421aa01411021ab01417c21ac014101219e01416c21ad01411c21ae01410221af01411821b001410c21b101410821b20142808080801021b301412d21b40142202127417f21b501410b21a001417021b601417e21b70141ec0021b801420321b901420221ba0141ff0121bb01410521bc01410621bd01410021be01410021bf01410721010c3c0b200741041020000b410141011020000b410241011020000b410241011020000b410341011020000b410141011020000b410441011020000b410341011020000b410241011020000b410741011020000b410741011020000b418284c0004136103a000b410141011020000b410341011020000b410341011020000b410021010c2c0b410121010c2b0b410221010c2a0b410321010c290b410421010c280b410521010c270b410621010c260b410621010c250b410621010c240b410621010c230b410621010c220b410621010c210b410621010c200b410621010c1f0b410621010c1e0b410621010c1d0b410621010c1c0b410621010c1b0b410621010c1a0b410621010c190b410621010c180b410621010c170b410621010c160b410621010c150b410621010c140b410621010c130b410621010c120b410721010c110b410121010b034002400240024002400240024002400240024020010e020001010b20c001220120ae016a21c001024020012802182202450d0020012802102101200220af01742102034002402001280200220520a101490d0020012005209e016a3602000b2001209f016a2101200220ac016a22020d000b0b20c00120c101470d010c090b20bf012111024020c201280214209f01742202450d0020c20128020c21010340024020012d000020a001470d002001209f016a2205280200220720a101490d0020052007209e016a3602000b200120ab016a2101200220b6016a22020d000b0b20b201101f2201450d02200120b301370200209f01101f221c450d0120c20120b1016a2105201c20a70136020020c20120aa016a22102802002224450d0341002102410121234101210f4101211b41012107024002400240024041002024221f4f0d00024003402002209e016a211f0240024002400240024002400240024020052802002002209f01746a2d0000220220b7016a20a9014f0d002002104a21c401200441c8006a20b2016a28020021c50120a60121c6010c010b0240024002400240024002400240200220bc01460d00200220bd01470d012007450d0f200720b5016a21070c0a0b2007450d0e2023200f470d012023209e016a22022023490d2b2023209e0174221e20022002201e491b221ead20b901862226202788a70d2b2026a7220220a701480d2b2023450d022001202320a901742002101e22010d030c040b2002104a21c701200441c8006a20b2016a28020021c80120a60121c9010c060b2023211e0c010b2002101f2201450d010b2001200f20a901746a2202209e013602042002201f360200024002400240201b200720b5016a2223470d00201b209e01742202200720072002491b2219ad20ba01862226202788a70d2a2026a7220220a701480d2a201b450d01201c201b20af01742002101e221c0d020c040b201b21190c010b2002101f221c450d020b200f209e016a2102201c202320af01746a200f360200201f20244f0d130c080b200241041020000b200241041020000b410021020c010b410121020b0240024003400240024020020e020001010b20c601280200221920b2016a21bf0120192f0106211e410021020240024002400340201e2002460d0120a70120b501209e0120bf0120026a2d0000221a20c40120bb0171221d4b1b201a201d461b221a450d022002209e016a2102201a209e01460d000b200220b5016a211e0b024020c501450d0020c50120b5016a21c5012019201e20af01746a20b8016a21c601410021020c040b200441c8006a211e200720b5016a22022007490d010c0b0b200441c8006a211e02402019200220a901746a20aa016a2202450d0020022802002219209e01460d0b201920af01470d002002209f016a211e0b200720b5016a220220074f0d0a0b200220074b0d09200f201c200220af01746a28020022024d0d092001200220a901746a22192802042202201e2802006a221e2002490d092019209f016a201e36020002402023200f470d002023209e016a22022023490d272023209e0174221e20022002201e491b221ead20b901862226202788a70d272026a7220220a701480d272023450d062001202320a901742002101e22010d070c0c0b2023211e0c060b20c901280200221920b2016a21bf0120192f0106211e4100210202400340201e2002460d0120a70120b501209e0120bf0120026a2d0000221a20c70120bb0171221d4b1b201a201d461b221a450d032002209e016a2102201a209e01460d000b200220b5016a211e0b024020c801450d0020c80120b5016a21c8012019201e20af01746a20b8016a21c901410121020c010b0b200441c8006a211e200720b5016a22022007490d010c070b200441c8006a211e02402019200220a901746a20aa016a2202450d0020022802002219209e01460d07201920af01470d002002209f016a211e0b200720b5016a220220074f0d060b200220074b0d05200f201c200220af01746a28020022024d0d052001200220a901746a22192802042202201e2802006a221e2002490d052019209f016a201e3602000b2023211e200f2102201b2119201f2024490d020c0d0b2002101f2201450d050b2001200f20a901746a2202209e013602042002201f360200024002400240201b2007470d00201b209e016a2202201b490d22201b209e01742223200220022023491b2219ad20ba01862226202788a70d222026a7220220a701480d22201b450d01201c201b20af01742002101e221c0d020c080b201b21190c010b2002101f221c450d060b200f209e016a2102201c200720af01746a200f3602002007209e016a2107201f20244f0d0b0b201e21232002210f2019211b201f22022010280200221f490d000c020b0b02402023450d002001101d0b410121be010240201b450d00201c101d201121bf0120a20120a4016a22a20120a501470d040c0e0b201121bf010c0c0b41a0aec4002002201f104b000b200241041020000b200241041020000b410721010c170b410021010c060b410441041020000b410841041020000b200120b2016a210f410121194101211e0c010b2002450d012001200220a901746a210f0b2001212341012102034020012902002126200420b4013a00b003200420262027883e02b403200520022026a76a220720b5016a200441b0036a104c200420a0013a00b003200420a1013602b40320052007200441b0036a104c200220af016a2102200f200120b2016a2201470d000b202321010b0240201e450d002001101d0b02402019450d00201c101d0b20c20120b0016a21c20102400240200441c8006a20ab016a280200450d0020102802002202450d00200528020021012002209f01742102410021050340024020012d000020a401470d00200120a0013a00002001209f016a20a3013602002005209e016a21050b200120ab016a2101200220b6016a22020d000b410121bf0120050d010b201121bf010b20c20120c301460d01410121010c000b0b20a20120a4016a22a20120a501470d0d0b024020be01410171450d0020042802f8012109200441fc016a2902002227a7210202402027422088a72201450d002001412c6c2108200921010340200110452001412c6a2101200841546a22080d000b0b02402002450d002009101d0b200428024c200441d0006a280200200441d4006a280200104d200041fd86c000360204411a21010c030b024020bf01410171450d00200441b0036a41106a200441f0016a41106a280200360200200441b0036a41086a200441f0016a41086a290300370300200420042903f0013703b003200441a0026a200441b0036a10474110101f2208450d08200841063a00004101101f2201450d09200141003a00004101101f2202450d0a200220012d00003a00002001101d4110101f2209450d0b200941063a000041f000101f2201450d0c200141063a00602001412c3b0150200120a1013602442001410b3a0040200141d8003a00302001412d3a0020200141003602142001410f3a0010200141003602042001410f3a00002001200441d8006a280200360224024020092d00004109470d00200928020841ffffffff0371450d002009280204101d0b2009101d024020082d00004109470d00200828020841ffffffff0371450d002008280204101d0b2008101d200441d4036a4287808080f000370200200441d0036a2001360200200441cc036a4100360200200441b0036a410c6a4281808080800c370200200441b8036a4101360200200441003602dc03200442043702c403200420023602b403200441013602b003200441a0026a200441b0036a104e200441b0036a200441a0026a418c0110ce031a20044188026a200441b0036a104920044188026a410c6a290200212720042802900221a201200428028c02210120042802880221080c020b20042802f80121a2010b200441fc016a290200212720042802f401210120042802f00121080b200428024c200441d0006a280200200441c8006a410c6a280200104d20a201450d02200441a0026a410c6a2027370200200420a2013602a80220042001ad4220862008ad843703a002200441b0036a200441a0026a2003280244104f20042802b0034101470d010240200441b8036a280200450d0020042802b403101d0b2000419787c000360204412321010b20004101360200200041086a2001360200200441c0046a24000f0b200441bc036a28020022a101450d01200441c0036a2903002127200441b8036a280200210220042802b403210920032802402161200441003602900220044201370388024104101f2201450d022004410436028c0220044190026a22082008280200220541046a3602002004200136028802200120056a2009360000024002400240200428028c022209200828020022016b41044f0d00200141046a22082001490d0d20094101742201200820082001491b22014100480d0d2009450d0120042802880220092001101e2208450d020c0e0b20042802880221080c0e0b2001101f22080d0c0b200141011020000b418284c0004136103a000b418284c0004136103a000b410441011020000b411041081020000b410141011020000b410141011020000b411041081020000b41f00041081020000b410721010c000b0b1021000b2004200136028c02200420083602880220044190026a28020021010b20044188026a41086a200141046a360200200820016a200236000020a1012027422088a72201412c6c22086a21022027a72164024002400240024002402001450d00200841546a2122200441b0036a4101722108200441b0036a41276a2105200441b0036a41206a210b200441b0036a41186a2107200441b0036a41106a2106200441b0036a41086a212120a1012101034020012d000021092005200141286a280000360000200b200141216a2900003703002007200141196a2900003703002006200141116a2900003703002021200141096a2900003703002004200141016a2900003703b0032009410f460d02200441a0026a41276a22202005280000360000200441a0026a41206a220d200b290300370300200441a0026a41186a220e2007290300370300200441a0026a41106a22412006290300370300200441a0026a41086a22602021290300370300200420042903b0033703a002200820042903a002370000200841086a2060290300370000200841106a2041290300370000200841186a200e290300370000200841206a200d290300370000200841276a2020280000360000200420093a00b003200441e0006a200441b0036a20044188026a105020042d00602209411a470d05202241546a21222001412c6a22012002470d000b200222012002470d020c030b20a10122012002470d010c020b2001412c6a22012002460d010b200441b0036a4101722108200441b0036a41276a2105200441b0036a41206a210b200441b0036a41186a2107200441b0036a41106a2106200441b0036a41086a2121034020012d000021092005200141286a280000360000200b200141216a2900003703002007200141196a2900003703002006200141116a2900003703002021200141096a2900003703002004200141016a2900003703b0032009410f460d01200441a0026a41276a22222005280000360000200441a0026a41206a2220200b290300370300200441a0026a41186a220d2007290300370300200441a0026a41106a220e2006290300370300200441a0026a41086a22412021290300370300200420042903b0033703a002200820042903a002370000200841086a2041290300370000200841106a200e290300370000200841186a200d290300370000200841206a2020290300370000200841276a2022280000360000200420093a00b003200441b0036a10452001412c6a22012002470d000b0b02402064450d0020a101101d0b20044188026a41086a280200210120042903880221272000411c6a41003a0000200041186a2001360200200041106a20273702002000410c6a209d01360200200041086a209c0136020020002061360204200041003602002000411d6a20042f00b0033b00002000411f6a200441b2036a2d00003a0000200441c0046a24000f0b200441e0006a41086a28020021612004280264215c02402022450d002001412c6a2101200441b0036a4101722108200441b0036a41276a210b200441b0036a41206a2107200441b0036a41186a2106200441b0036a41106a2121200441b0036a41086a2122034020012d00002105200b200141286a2800003600002007200141216a2900003703002006200141196a2900003703002021200141116a2900003703002022200141096a2900003703002004200141016a2900003703b0032005410f460d01200441a0026a41276a2220200b280000360000200441a0026a41206a220d2007290300370300200441a0026a41186a220e2006290300370300200441a0026a41106a22412021290300370300200441a0026a41086a22602022290300370300200420042903b0033703a002200820042903a002370000200841086a2060290300370000200841106a2041290300370000200841186a200e290300370000200841206a200d290300370000200841276a2020280000360000200420053a00b003200441b0036a10452001412c6a22012002470d000b0b02402064450d0020a101101d0b0240200428028c02450d00200428028802101d0b024020094105470d002061450d00205c101d0b200041ba87c00036020420004101360200200041086a4125360200200441c0046a24000f0b2020450d032021101d200b0d040c050b200020013602040b20004101360200200041086a2023360200200a450d0b0240202b450d00202b412c6c2108200a21010340200110452001412c6a2101200841546a22080d000b0b202a450d0b200a101d200441c0046a24000f0b2022450d002006101d0b200b450d010b200b412c6c210b200a21010340200110452001412c6a2101200b41546a220b0d000b0b200c450d04200a101d0c040b0240200b450d00200b412c6c2108200a21010340200110452001412c6a2101200841546a22080d000b0b41192108200c450d00200a101d0b0b0c010b410021090b200441b0026a2002360200200441ac026a2006360200200441013602a00220042007ad4220862005ad42ffff03834210862009ad42ff0183420886842008ad42ff018384843702a402200441a0026a4104722101200841ff01714105470d010b2001280208450d002001280204101d20042802a0020d0041002108200441ac026a280200220921010340200110452001412c6a2101200841546a22080d000b200441b0026a280200450d002009101d0b200041f182c00036020420004101360200200041086a41163602000b200441c0046a24000bf5d8012b0a7f027e027f017e027f017e387f027e107f017e0f7f027e067f017e117f027e0e7f017e0b7f027e107f027e177f027e177f017e067f017e017f017e027f017e017f017e1a7f017e097f017e0b7f017e0b7f017e277f230041d080046b22022400024002402001280204220320012802082204470d00200241013a0008200241346a4101360200200241013602042002420137022420024190afc4003602202002200241086a36020020022002360230200241b880046a200241206a102820022802bc8004210120022802b88004210520004101360200200041003a00042001450d012005101d0c010b200441016a210502400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402004417f460d0020032005490d012001280200220620046a2d00002104200141086a2005360200024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402004410b4b0d0002400240024002400240024002400240024002400240024020040e0c00070405020809060b030a01000b41002104200141086a21074100210803402004411f4b0d1820032005460d192005417f460d6a2003200541016a2209490d6b200620056a2d0000210a20072009360200200a41ff00712004411f71742008722108200441076a210420092105200a418001710d000b20044120490d36200a6741686a41ff017141044f0d36410d21010cb6010b200241206a2001105520022802204101470d0b20022802242201410876210b200241206a41086a290300220c422088210d200241306a280200210e0cc9010b200241206a2001105520022802204101470d0b200228022422054108762104200241206a41086a290300220d422088210c200241306a28020021010cc6010b200241206a2001105520022802204101470d0b20022802242201410876210f200241206a41086a2903002210422088210d200241306a28020021110cc3010b200241206a2001105520022802204101470d0b200228022422014108762105200241206a41086a290300220d422088210c200241306a28020021040cc0010b200241206a2001105520022802204101470d0b200228022422014108762105200241206a41086a290300220d422088210c200241306a28020021040cbd010b200241206a2001105520022802204101470d0b200228022422014108762105200241206a41086a290300220d422088210c200241306a28020021040cba010b200241206a2001105520022802204101470d0b200228022422014108762105200241206a41086a290300220d422088210c200241306a28020021040cb7010b200241206a2001105520022802204101470d0b200228022422014108762105200241206a41086a290300220d422088210c200241306a28020021040cb4010b200241206a2001105520022802204101470d0b200228022422124108762101200241206a41086a2903002213422088210d200241306a28020021140cb1010b200241206a2001105520022802204101470d0b200228022422154108762101200241206a41086a290300220d422088210c200241306a28020021160cae010b200241206a2001105520022802204101470d0b200041013602002000200241206a41047222012902003702042000410c6a200141086a290200370200200241d080046a24000f0b200041123a000420004101360200200041056a20043a0000200241d080046a24000f0b200241186a200241346a280200360200200241106a2217200241206a410c6a290200370300200220022902243703084100210b410021014100211803402001411f4b0d0d20172802002203200241086a410c6a22192802002205460d1d200541016a21042005417f460d5f20032004490d60200228020820056a2d0000210520192004360200200541ff00712001411f71742018722118200141076a21012005418001710d000b20014120490d2a20056741686a41ff017141044f0d2a4100210b410d211a0c0d0b200241c880046a200241346a280200360200200241c080046a22012002412c6a290200370300200220022902243703b88004200128020021044100210520022802c48004210120022802b8800421084100210903402005411f4b0d0e20042001460d1d2001417f460d602004200141016a220a490d61200820016a2d0000220341ff00712005411f71742009722109200541076a2105200a21012003418001710d000b200241c480046a200a36020020054120490d2a20036741686a41ff017141044f0d2a41002105410d210a0c0e0b200241c880046a200241346a280200360200200241c080046a221b200241206a410c6a290200370300200220022902243703b880044100210f410021014100211c03402001411f4b0d0f201b2802002203200241b880046a410c6a221d2802002205460d1d200541016a21042005417f460d6120032004490d6220022802b8800420056a2d00002105201d2004360200200541ff00712001411f7174201c72211c200141076a21012005418001710d000b20014120490d2a20056741686a41ff017141044f0d2a4100210f410d211e0c0f0b200241c880046a200241346a280200360200200241c080046a221f200241206a410c6a290200370300200220022902243703b8800441002106410021014100212003402001411f4b0d10201f2802002203200241b880046a410c6a22212802002205460d1d200541016a21042005417f460d6220032004490d6320022802b8800420056a2d0000210520212004360200200541ff00712001411f71742020722120200141076a21012005418001710d000b20014120490d2a20056741686a41ff017141044f0d2a410d21014100210a0cb3010b200241346a2802002122200241306a28020021012002412c6a2802002107200241286a28020021232002280224212441002121410021054100212503402005411f4b0d1020072001460d1d2001417f460d632007200141016a2226490d64202420016a2d0000220441ff00712005411f71742025722125200541076a2105202621012004418001710d000b20054120490d2a20046741686a41ff017141044f0d2a410d2101410021050cb0010b200241c880046a200241346a280200360200200241c080046a2227200241206a410c6a290200370300200220022902243703b8800441002128410021014100212903402001411f4b0d1020272802002203200241b880046a410c6a22212802002205460d1d200541016a21042005417f460d6420032004490d6520022802b8800420056a2d0000210520212004360200200541ff00712001411f71742029722129200141076a21012005418001710d000b20014120490d2a20056741686a41ff017141044f0d2a410d21014100210a0cad010b200241346a280200212a200241306a28020021012002412c6a280200210a200241286a280200212b2002280224212c41002121410021054100212d03402005411f4b0d10200a2001460d1d2001417f460d65200a200141016a222e490d66202c20016a2d0000220441ff00712005411f7174202d72212d200541076a2105202e21012004418001710d000b20054120490d2a20046741686a41ff017141044f0d2a410d21014100210a0caa010b200241c880046a200241346a280200360200200241c080046a22012002412c6a290200370300200220022902243703b88004200128020021034100210520022802c48004210120022802b8800421084100210403402005411f4b0d1020032001460d1d2001417f460d662003200141016a220a490d67200820016a2d0000220941ff00712005411f71742004722104200541076a2105200a21012009418001710d000b200241c480046a200a36020020054120490d2a20096741686a41ff017141044f0d2a41002105410d21080c100b200241c880046a200241346a280200360200200241c080046a222f200241206a410c6a290200370300200220022902243703b8800441002130410021014100212103402001411f4b0d11202f2802002214200241b880046a410c6a22032802002205460d1d200541016a21042005417f460d6720142004490d6820022802b88004220620056a2d0000210520032004360200200541ff00712001411f71742021722121200141076a21012005418001710d000b20014120490d2a20056741686a41ff017141044f0d2a410d2112410021310ca4010b200241346a2802002132200241306a28020021012002412c6a2802002108200241286a280200213320022802242134410021054100213503402005411f4b0d1120082001460d1d2001417f460d682008200141016a2209490d69203420016a2d0000220441ff00712005411f71742035722135200541076a2105200921012004418001710d000b20054120490d2a20046741686a41ff017141034b0d2a410d21150c110b200241346a2802002120200241306a28020021012002412c6a2802002104200241286a280200210720022802242108410021054100210303402005411f4b0d1220042001460d1e2001417f460d692004200141016a2209490d6a200820016a2d0000220a41ff00712005411f71742003722103200541076a210520092101200a418001710d000b024020054120490d00410d2101200a6741686a41ff017141034d0d1f0b2020200946210102402007450d002008101d0b2001450d2b410921050c9c010b410f21010c9e010b200241013a00a88004200241346a41013602002002410136020c2002420137022420024190afc4003602202002200241a880046a3602082002200241086a360230200241b880046a200241206a102820022802c08004210520022903b88004210d410521010c9d010b410f211a0b41002136410021370cae010b200241c480046a200136020041002105410f210a0b41002108410021070caa010b410f211e0b41002138410021390ca6010b410f21014100210a0ca3010b410f2101410021050ca0010b410f21014100210a0c9d010b410f21014100210a0c9a010b200241c480046a200136020041002105410f21080b41002107410021200c96010b410f2112410021310c93010b410f21150b0c0b0b410f21010c0c0b200241013a00a88004200241346a4101360200200241013602042002420137022420024190afc4003602202002200241a880046a36020020022002360230200241b880046a200241206a102820022903b88004220d422088a7213620022802c08004210e200da721374105211a4100210b0c9f010b200241c480046a2004360200200241013a00a88004200241346a4101360200200241013602042002420137022420024190afc4003602202002200241a880046a36020020022002360230200241086a200241206a10282002290308220d422088a7210820022802102101200da721074105210a410021050c9c010b200241013a00a88004200241346a4101360200200241013602042002420137022420024190afc4003602202002200241a880046a36020020022002360230200241086a200241206a10282002290308220d422088a7213820022802102111200da721394105211e4100210f0c99010b200241013a00a88004200241346a4101360200200241013602042002420137022420024190afc4003602202002200241a880046a36020020022002360230200241086a200241206a10282002290308220d422088a7210620022802102104200da7210a410521010c96010b200241013a0008200241346a4101360200200241013602042002420137022420024190afc4003602202002200241086a36020020022002360230200241b880046a200241206a102820022903b88004220d422088a7212120022802c080042104200da72105410521010c93010b200241013a00a88004200241346a4101360200200241013602042002420137022420024190afc4003602202002200241a880046a36020020022002360230200241086a200241206a10282002290308220d422088a7212820022802102104200da7210a410521010c90010b200241013a0008200241346a4101360200200241013602042002420137022420024190afc4003602202002200241086a36020020022002360230200241b880046a200241206a102820022903b88004220d422088a7212120022802c080042104200da7210a410521010c8d010b200241c480046a2003360200200241013a00a88004200241346a4101360200200241013602042002420137022420024190afc4003602202002200241a880046a36020020022002360230200241086a200241206a10282002290308220d422088a7210720022802102104200da7212041052108410021050c8a010b200241013a00a88004200241346a4101360200200241013602042002420137022420024190afc4003602202002200241a880046a36020020022002360230200241086a200241206a10282002290308220d422088a7213020022802102114200da72131410521120c87010b200241013a0008200241346a4101360200200241013602042002420137022420024190afc4003602202002200241086a36020020022002360230200241b880046a200241206a102820022802c08004211620022903b88004210d410521150b200d422088a7213a200da7213b0c83010b200241013a0008200241346a4101360200200241013602042002420137022420024190afc4003602202002200241086a36020020022002360230200241b880046a200241206a1028410521010b2000200136020420004101360200200041086a20022902b88004370200200041106a200241b880046a41086a2802003602002007450d95012008101d200241d080046a24000f0b4100210a200241206a41004180800110cd031a41012125410021074100210402402008450d00200141086a211c200141046a211841012125410021074100210341002109034020182802002229201c28020022046b200820096b220541808001200541808001491b2205490d0c200420056a22202004490d4c20292020490d4d200241206a200128020020046a200510ce031a201c20203602000240024002400240200720036b20054f0d00200320056a22042003490d6b20074101742220200420042020491b22204100480d6b2007450d01202520072020101e22250d020c530b200520036a21040c020b2020101f2225450d510b202021070b202520036a200241206a200510ce031a200421032008200520096a22094b0d000b0b41002101410021050340410021082001411f4b0d0d2004200a460d0e2004200a4d0d4d2025200a6a2d0000220341ff00712001411f71742005722105200141076a2101200a41016a2209210a2003418001710d000b20014120490d1b20036741686a41ff017141044f0d1b410d21014100210a0c7d0b2018450d0d4100213c4104213d4101213e411f213f410c2140200241086a410c6a214141082142200241086a41086a2143417f214441ff002145410721464180012147416821484120214941ff01214a41808004214b421c214c4220214d411c214e4110214f410321504118215141142152410421034100211741002119410021210c590b2009450d0d41042103200241b880046a410c6a21294108211c410021204100212502402004200a460d000340200a41016a2101200a417f460d4f20042001490d502008200a6a2c000021052029200136020020054100480d1c4107210a200541c00071450d1d200541807f7222054170470d1f200241206a200241b880046a105620022f002520022d002741107472210520022d0024210a20022802204101460d1e200241206a410c6a2802002104200241206a41086a280200210802400240024020252020470d0020204101742201202041016a220720072001491b2207ad420c7e220d422088a70d68200da722014100480d682020450d0120032020410c6c2001101e22030d020c5a0b202021070c010b2001101f2203450d580b2003201c6a220120043602002001417b6a200541ffffff077122054110763a0000200141796a20053b00002001417c6a2008360200200141786a200a3a0000202541016a220120094f0d20201c410c6a211c20022802b8800421082007212020012125200241b880046a41086a28020022042029280200220a470d000b0b200241013a00a88004200241346a410136020020024101360204200241306a20023602002002420137022420024190afc4003602202002200241a880046a360200200241086a200241206a1028200241106a2802002101200228020c2108200228020821074105210a0c1d0b201c450d0d4100215f4104216041012161411f2162410c2163200241b880046a410c6a216441082165200241b880046a41086a2166417f216741ff00216841072169418001216a4168216b4120216c41ff01216d421c216e4220216f411c2170411021714103217241182173411421744102217542022176417c2177410421034100211b4100211d410121210c580b2020450d0d41042178410021794101217a410c217b200241206a410c6a217c4108217d200241206a41086a217e417f217f4103218001411f21810141ff0021820141072183014180012184014168218501412021860141ff01218701422821880142202189014128218a01411c218b01411a218c014119218d014118218e014114218f014110219001410221910141c00021920141807f219301417021940141fc012195014100211f4104210341002196014100219701410221210c580b410421032025450d0d41002199014101219a01411f219b01417f219c0141ff00219d014107219e01418001219f01416821a001412021a10141ff0121a201410321a301420221a401422021a501410221a601410021a701410021a801410321210c580b2029450d0d410421a901410021aa01410121ab01410c21ac01410821ad01417f21ae01410321af01411f212841ff0021b001410721b10141800121b201416821b301412021b40141ff0121b501421421b601422021b701411421b8014100212741042103410021b901410021ba01410421210c580b202d450d0d410021bb014100200a6b21bc01410421bd01410121be01417f21bf0141e00021c001410321c101411f21c20141ff0021c301410721c40141800121c501416821c601412021c70141ff0121c801411021c901410821ca0141c00021cb0141807f21cc0141fb0121cd014180807c21ce01420421cf01422021d001410221d101410021d20141042103410021d301410021d401410521210c580b2004450d0d200241206a410c6a2129200241206a41086a21184100212541002109410021014100211c410421030340200241206a200241b880046a105620022f002520022d0027411074722105202928020021072018280200212020022d0024210820022802204101460d13200141016a210a02402001201c470d002025200a200a2025491b221cad420c7e220d422088a70d5f200da7222d4100480d5f02402001450d0020032009202d101e22030d010c490b202d101f2203450d480b200320096a220120083a0000200141036a20054110763a0000200141016a20053b0000200141086a2007360200200141046a2020360200202541026a21252009410c6a2109200a2101200a2004490d000c0f0b0b2021450d0e200241b880046a410c6a215c200241206a41086a215b4100215941002158410021544100212f41042153410421d60141042103024020142004460d000340200441016a21052004417f460d4a20142005490d4b200620046a2c00002101205c200536020020014100480d1b41062112200141c00071450d1c200141807f72225d41ff017141fc01490d1e20142005460d1f200441026a21042005417f460d4e20142004490d4f200620056a2d00002101410c2112200241b880046a410c6a20043602004100210402402001450d0020014101470d2241800221040b200241206a200241b880046a1025200241206a410c6a2802002130205b28020021312002280224211220022802204101460d22205441016a210502402054202f470d002059200520052059491b222fad420486225e422088a70d5f205ea722014100480d5f024002402054450d00205320582001101e22530d010c540b2001101f2253450d530b205321d601205321030b200320586a220120123602002001410c6a205a4180807c71205d417f7341ff017172200472225a360200200141086a2030360200200141046a2031360200200520214f0d24205941026a2159205841106a215820022802b88004210620052154200241b880046a41086a2802002214205c2802002204470d000b0b200241013a00a88004200241346a4101360200200241013602042002420137022420024190afc4003602202002200241a880046a36020020022002360230200241086a200241206a10280c1e0b2035450d0e200241296a21d701410021d801410421d901410121da01411f21db01417f21dc0141ff0021dd01410721de0141800121df01416821e001412021e10141ff0121e2014180800121e301411021e401200241086a41106a21e501410c21e601200241086a410c6a21e701422021e801410221e901410821ea01200241206a41086a21eb01410621ec01411421ed01200241206a41146a21ee01420421ef01410321f001421821f101411821f201417e21f301420321f401410121f501420121f6014190afc40021f70141c00021f80141807f21f90141fb0121fa014180807c21fb0141042103410021fc01410021fd01410621210c560b200241013a00a88004200241cc80046a410136020020024101360204200242013702bc800420024190afc4003602b880042002200241a880046a360200200220023602c88004200241086a200241b880046a1028200228021021052002290308210d4105210120070d730c740b20024103410220011b3a0008200241346a4101360200200241013602042002420137022420024190afc4003602202002200241086a36020020022002360230200241b880046a200241206a10282002412b6a200241c080046a280200360000200220022903b88004370023200041053a000420004101360200200020022900203700052000410c6a200241276a290000370000200241d080046a24000f0b410f21014100210a0c700b200241013a0008200241346a4101360200200241013602042002420137022420024190afc4003602202002200241086a36020020022002360230200241b880046a200241206a102820022903b88004220d422088a7210820022802c080042105200da7210a410521010c6f0b410021174104210341002119410021010c550b4100210741042103410021050c110b4100211b410421034100211d410121010c530b410021960141042103410021010c690b410021a701410021a8010c670b410021b90141042103410021010c650b410021d30141042103410021590c630b410421034100210a4100211c0b200241c480046a28020020022802c88004462101024020022802bc8004450d0020022802b88004101d0b2001450d02200aad422086201cad84210d410621050c650b41042103410021054100212f0c4b0b410021fc0141042103410021fd01410221010c4b0b20024103410220011b3a00a88004200241346a4101360200200241013602042002420137022420024190afc4003602202002200241a880046a36020020022002360230200241086a200241206a10282002290308220d422088210c200228021021044105210141002105201c450d6b2003101d0c6b0b200241306a2802002104201c450d692003101d0c690b2005450d08200241206a410041800810cd031a410121294100210a41002103410021200340200420096b200520206b22014180082001418008491b2201490d0f200920016a221c2009490d382004201c490d39200241206a202520096a200110ce031a0240024002400240200a20036b20014f0d00200320016a22082003490d4e200a4101742209200820082009491b22094100480d4e200a450d012029200a2009101e22290d020c420b200120036a21080c020b2009101f2229450d400b2009210a0b202920036a200241206a200110ce031a201c2109200821032005200120206a22204b0d000b200241206a20292008105720022802204101470d1041082101200a450d132029101d0c610b4118210a0b0c010b20054180feff07714108762104200241306a28020021012002412c6a2802002108200241206a41086a28020021070b2004410874200541ff01717221052020450d702003101d0c700b202541016a21050b200241c480046a28020020022802c88004462101024020022802bc8004450d0020022802b88004101d0b02402001450d002005ad4220862007ad84210d410521050c5b0b20024103410220011b3a00a88004200241346a4101360200200241013602042002420137022420024190afc4003602202002200241a880046a36020020022002360230200241086a200241206a10282002290308220d422088210c2002280210210141052105410021042007450d6f2003101d0c6f0b411821120b0c040b4100210341012129410021084100210a20042009490d080c3d0b205d21010c020b200241013a00a88004200241346a4101360200200241013602042002420137022420024190afc4003602202002200241a880046a36020020022002360230200241086a200241206a10280b20022802102114200228020c213020022802082131410521120b200141ff017141087420127221122054450d450c380b200241306a280200211420540d370c440b200241013a00a88004200241cc80046a410136020020024101360204200242013702bc800420024190afc4003602b880042002200241a880046a360200200220023602c88004200241086a200241b880046a10282002290308220d422088a7210820022802102105200da7210441052101200a450d032029101d2004210a0c520b205441016a21050c370b202941087621032004201c22094f0d350b20092004102a000b2004210a0c4e0b0c4d0b417f2005102a000b20052003102b000b417f200541016a102a000b200541016a2003102b000b417f2004102a000b20042003102b000b417f200141016a102a000b200141016a2004102b000b417f2004102a000b20042003102b000b417f2004102a000b20042003102b000b417f200141016a102a000b200141016a2007102b000b417f2004102a000b20042003102b000b417f200141016a102a000b200141016a200a102b000b417f200141016a102a000b200141016a2003102b000b417f2004102a000b20042014102b000b417f200141016a102a000b200141016a2008102b000b417f200141016a102a000b200141016a2004102b000b20042020102a000b20202029102b000b200a41016a2004102b000b202041011020000b202d41041020000b417f2001102a000b20012004102b000b417f2005102a000b20052014102b000b2009201c102a000b201c2004102b000b417f2004102a000b20042014102b000b200141041020000b200141041020000b200941011020000b410321010c090b410321010c080b410321010c070b410321010c060b410321010c050b410321010c040b410321010c030b200320586a21be02411021bf02410421c002410921c102410821c20241ffffffff0321c302417021c402410c2121410321010c020b0240200420096b2205417f4c0d00024002402005450d002005101f22010d01200541011020000b410121010b2008ad422086210d200aad210c2001202520096a200510ce031a2005ad2210422086211302402007450d002025101d0b200d200c84210d2013201084210c2003410874202941ff0171722103410121050c1a0b102e000b200241c480046a28020020022802c88004462101024020022802bc8004450d0020022802b88004101d0b02402001450d002005ad422086202fad84210d410721050c190b20024103410220011b3a00a88004200241346a4101360200200241013602042002420137022420024190afc4003602202002200241a880046a36020020022002360230200241086a200241206a1028422021910220022903082113200228021021142005450d124104219202200320054104746a21930241102194024109219502410821960241ffffffff032197024170219802200321990241082121410321010b03400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020010e0400010206060b200241146a28020020022802184621010240200228020c450d002002280208101d0b2001450d032019ad4220862017ad84210d410c21050cdf010b200241c480046a28020020022802c88004462101024020022802bc8004450d0020022802b88004101d0b2001450d01201dad422086201bad84210d410a21050cde010b2009203246210102402033450d002034101d0b2001450d0220fd01ad42208620fc01ad84210d410b21050cdd010b20024103410220011b3a00a880044114219a02200241206a41146a4101360200200241013602042002420137022420024190afc4003602202002200241a880046a36020020022002360230200241086a200241206a10284220219b022002290308211020022802102111201d450d03411c219c022003201d411c6c6a219d02410c219e024108219f02410421a002411021a102410921a20241ffffffff0321a302417021a402200321a502410921210cb9010b20024103410220011b3a00a88004411421a602200241206a41146a4101360200200241013602042002420137022420024190afc4003602202002200241a880046a36020020022002360230200241b880046a200241206a1028422021a70220022903b88004210c20022802c08004210e2019450d04411c21a80220032019411c6c6a21a902410c21aa02410821ab02410421ac02411021ad02410921ae0241ffffffff0321af02417021b002200321b102410a21210cba010b20024103410220011b3a0008411421b202200241206a41146a4101360200200241013602042002420137022420024190afc4003602202002200241086a36020020022002360230200241b880046a200241206a1028422021b30220022903b88004210d20022802c08004211620fd01450d05411821b402200320fd0141186c6a21b502410421b602411021b702410c21b802410921b902410821ba0241ffffffff0321bb02417021bc02200321bd02410b21210cbb010b02400240024002400240024002400240024002400240024002400240024002400240024002400240024020210e0f000102030405060b0d1416181c202c2c0b20192253203e6a2119410021014100210603404100210b2001203f4b0d0c2043280200225420412802002205460d0e2005203e6a210420052044460d7420542004490d75200228020820056a2d000021052041200436020020052045712001203f71742006722106200120466a210120052047710d000b024020012049490d0020056720486a204a71203d490d530b200241206a200241086a10252002280220203e460d53200241206a20406a2802002155200241206a20426a280200215620022802242157410021054100215803402005203f4b0d1d2043280200225420412802002204460d1f2004203e6a210120042044460d840120542001490d85012002280208225920046a2d000021042041200136020020042045712005203f71742058722158200520466a210520042047710d000b024020052049490d0020046720486a204a71203d490d5e0b4100215a200241206a4100204b10cd031a024002402058450d004100215a4101215b410021044100215c0340205420016b2058205c6b2205204b2005204b491b2205490d3d200120056a225d2001490d9b012054205d490d9c01200241206a205920016a200510ce031a2041205d3602000240024002400240205a20046b20054f0d00200420056a225d2004490ddd01205a203e742201205d205d2001491b2201203c480ddd01205a450d01205b205a2001101e225b0d020ca1010b200520046a215d0c020b2001101f225b450d9f010b2001215a0b205b20046a200241206a200510ce031a20582005205c6a225c4d0d02204128020021012043280200215420022802082159205d21040c000b0b4101215b4100215d0b024020172053470d002017203e7422012017203e6a220520052001491b2205ad204c7e225e204d88a70dd701205ea72201203c480dd701024002402017450d0020032017204e6c2001101e22030d010ca3010b2001101f2203450da2010b200521170b20032053204e6c6a2201200620427622053b00012001205b36021020012057360204200120063a0000200120506a2005204f763a0000200120516a205d360200200120526a205a360200200120406a2055360200200120426a205636020020192018490dae010cbd010b201d225820616a211d410021014100210603404100210f200120624b0d072066280200225420642802002205460d09200520616a210420052067460d7120542004490d7220022802b8800420056a2d000021052064200436020020052068712001206271742006722106200120696a21012005206a710d000b02402001206c490d00200567206b6a206d712060490d4b0b200241206a200241b880046a102520022802202061460d4b200241206a20636a2201280200215c200241206a20656a2205280200215d2002280224215a200241206a200241b880046a102920022802202061460d4c200528020021532002280224215902400240024020012802002201450d0020012075742204207575225bad207686225e206f88a70dd801205ea72201205f480dd8012001101f2254450d9d01200420776a21552054210120592105034020012005280200360200200120606a2101200520606a2105200420776a22040d000b205520757620616a21052053450d020c010b4100215b41042154410021052053450d010b2059101d0b0240201b2058470d00201b2061742201201b20616a220420042001491b2204ad206e7e225e206f88a70dd601205ea72201205f480dd60102400240201b450d002003201b20706c2001101e22030d010c9e010b2001101f2203450d9d010b2004211b0b2003205820706c6a2201200620657622043b0001200120543602102001205a360204200120063a0000200120726a20042071763a0000200120736a2005360200200120746a205b360200200120636a205c360200200120656a205d360200201d201c490dae010cbd010b200241206a200241b880046a1058207c2802002106207e280200215d2002280224215b2002280220207a460d23200241206a200241b880046a1058207c2802002157207e2802002153200228022421552002280220207a460d24200241b880046a207d6a2802002204200241b880046a207b6a22592802002221460d252021207a6a21012021207f460d850120042001490d860120022802b88004225c20216a2d00002105205920013602004100215a20052080014b0d2602400240024002400240024020050e0400030102000b4100215a4100210541002121034020052081014b0d1d20042001460d1e2001207f460d7f20042001207a6a2258490d8001205c20016a2d000021542059205836020020542082017120052081017174202172212120052083016a2105205821012054208401710d000b4100215a02402005208601490d002054672085016a208701712078490d5b0b209601209701460d030c040b200241206a200241b880046a1056207e290300215e200228022421212002280220207a460d424102215a209601209701460d020c030b20042001460d4320212091016a21582001207f460da30120042058490da401205c20016a2c000021052059205836020020052079480d44200520920171450d38200520930172220520870171209501490d3820042058460d4820212080016a21012058207f460d9f0120042001490da0012005207f732154205c20586a2d00002105410c2121200241b880046a410c6a20013602004103215a4100210402402005450d002005207a470d4b410121040b209601209701460d010c020b20042001460d4120212091016a21052001207f460d900120042005490d9101205c20016a2c00002101205920053602002001207f4c0d44200120920171450d382001209301722201209401470d38200241206a200241b880046a1056207e290300215e200228022421212002280220207a460d484101215a209601209701470d010b209601207a742201209601207a6a220520052001491b2205ad2088017e22980120890188a70dd501209801a722012079480dd50102400240209601450d002003209601208a016c2001101e22030d010c93010b2001101f2203450d92010b20052196010b2003209701208a016c6a2201205536020c200120063602082001205d3602042001205b36020020012086016a205e3702002001208b016a20213602002001208c016a20043a00002001208d016a20543a00002001208e016a205a3a00002001208f016a205736020020012090016a2053360200201f208a016a211f209701207a6a220121970120012020490dae010cea010b20a7012206209a016a21a70120262101410021054100210403402005209b014b0d0420072001460d062001209c01460d6d20072001209a016a2226490d6e202420016a2d00002221209d01712005209b01717420047221042005209e016a2105202621012021209f01710d000b0240200520a101490d0020216720a0016a20a2017120a3014d0d480b024020a8012006470d002006209a0174220120a70120a7012001491b22a801ad20a40186225e20a50188a70dd401205ea72201209901480dd40102402006450d002003200620a601742001101e22030d010c9c010b2001101f2203450d9b010b2003200620a601746a200436020020a7012025490dae010ce8010b200241206a200241b880046a1058200228022020ab01460d2b200241206a20ad016a280200215a2002280224215d200241b880046a20ad016a2802002205200241b880046a20ac016a22212802002204460d2c200420ab016a2101200420ae01460d900120052001490d9101200241206a20ac016a280200215320022802b88004220620046a2d0000215c20212001360200205c20af014b0d2f02400240024002400240205c0e0400030102000b4100215c41002154410021040340205420284b0d1e20052001460d24200120ae01460d86012005200120ab016a2259490d8701200620016a2d0000215820212059360200205820b001712054202871742004722104205420b1016a215420592101205820b201710d000b4100215c205420b401490d0320586720b3016a20b5017120a9014f0d030c620b41002154410021040340205420284b0d1220052001460d21200120ae01460d89012005200120ab016a2259490d8a01200620016a2d0000215820212059360200205820b001712054202871742004722104205420b1016a215420592101205820b201710d000b4102215c205420b401490d0220586720b3016a20b5017120a9014f0d020c550b41002154410021040340205420284b0d1120052001460d21200120ae01460d7e2005200120ab016a2259490d7f200620016a2d0000215820212059360200205820b001712054202871742004722104205420b1016a215420592101205820b201710d000b4103215c205420b401490d0120586720b3016a20b5017120a9014f0d010c540b41002154410021040340205420284b0d1020052001460d1e200120ae01460d7b2005200120ab016a2259490d7c200620016a2d0000215820212059360200205820b001712054202871742004722104205420b1016a215420592101205820b201710d000b4101215c205420b401490d0020586720b3016a20b5017120a901490d530b200241a880046a20ad016a20043602002002205c3602ac8004200220533602a8800420022902ac8004215e024020b90120ba01470d0020b90120ab0174220120b90120ab016a220520052001491b2205ad20b6017e22980120b70188a70dd301209801a7220120aa01480dd3010240024020b901450d00200320b90120b8016c2001101e22030d010c92010b2001101f2203450d91010b200521b9010b200320ba0120b8016c6a2201205e37020c200120533602082001205a3602042001205d360200202720b8016a212720ba0120ab016a220121ba0120012029490dae010ce6010b200a202e460d34202e20be016a2101202e20bf01460d9101200a2001490d9201202c202e6a2d0000225820c001470d3820d40120be016a2159202e20c1016a210641002158410021054100212103402006212e200520c2014b0d0c200a2001460d0d200120bf01460d73200a200120be016a2204490d74202c20016a2d0000225420c30171200520c20171742021722121202e20be016a2106200520c4016a210520042101205420c501710d000b0240200520c701490d0020546720c6016a20c8017120bd01490d510b41002105024002402021450d0020bc0120046a2153202c20046a215b4101215a41002154410021014100215d0340205320016a450d30202e450da701200a202e490da801205b20016a2c0000225820bb01480d324106215c205820cb0171450d33205820cc0172225820c8017120cd014d0d33200120be016a210602402001205d470d002054200620062054491b225d20bb01480dd50102402001450d00205a2001205d101e225a0d010ca1010b205d101f225a450da0010b205a20016a205820bf01733a0000205420d1016a2154202e20be016a212e2006210120062021490d000b200420066a21040c010b4101215a410021064100215d0b205a20c9017620c901742253205a20ca017620c8017120ca0174225b72205a20c80171225a72215441002101034041002158200520c2014b0d28200a2004460d2a200420bf01460d8701200a200420be016a222e490d8801202c20046a2d0000222120c30171200520c20171742001722101200520c4016a2105202e2104202120c501710d000b0240200520c701490d0020216720c6016a20c8017120bd01490d620b024002400240200120be01460d0020010d654104210520d30120d401460d010c020b200a202e460d65202e20bf01460da801200a202e20be016a2201490da901202c202e6a2c0000225820bb01480d664106215c205820cb0171450d2a205820cc0172225820c8017120cd014d0d2a205820bf017321052001212e20d30120d401470d010b20d30120be0174220120d30120be016a220420042001491b2204ad20cf0186225e20d00188a70dd201205ea7220120bb01480dd2010240024020d301450d00200320d30120bd01742001101e22030d010cab010b2001101f2203450daa010b200421d3010b200320d40120bd01746a220120d50120ce0171200520c8017120ca01747220c0017222d50136020c200120063602082001205d3602042001205b205a7220537236020020d20120c9016a21d201205921d4012059202d490dae010ce4010b20fd01225d20da016a21fd0141002101410021040340200120db014b0d0920082009460d0a200920dc01460d702008200920da016a2205490d71203420096a2d0000220620dd0171200120db0171742004722104200120de016a210120052109200620df01710d000b0240200120e101490d0020066720e0016a20e2017120d901490d4f0b41002158200241206a410020e30110cd031a4101215a024002402004450d00410021544100215c410021590340200820056b200420596b220120e301200120e301491b2201490d21200520016a22092005490d7e20082009490d7f200241206a203420056a200110ce031a0240024002400240205c20546b20014f0d00205420016a22062054490dd701205c20da01742205200620062005491b220520d801480dd701205c450d01205a205c2005101e225a0d020c8e010b200120546a21060c020b2005101f225a450d8c010b2005215c0b205a20546a200241206a200110ce031a20092105200621542004200120596a22594b0d000c020b0b200521094100215c410021060b20e501200636020020e70141003602002002205a36020820022006ad20e80186205cad8437020c41002101410021590340200120db014b0d2420062058460d25205820dc01460d89012006205820da016a2204490d8a01205a20586a2d0000210520e7012004360200200520dd0171200120db0171742059722159200120de016a210120042158200520df01710d000b0240200120e101490d0020056720e0016a20e2017120d901490d5e0b4100215b024002402059450d004100215c410421554100215a0340205a225320da016a215a410021014100210602400240024002400340200120db014b0d01200241086a20ea016a280200225420e7012802002205460d02200520da016a2104200520dc01460d7b20542004490d7c2002280208225820056a2d0000211520e7012004360200201520dd0171200120db0171742006722106200120de016a2101201520df01710d000b02400240200120e101490d0020156720e0016a20e2017120f0014d0d010b0240024020542004470d00200220da013a00a8800420ee0120da01360200200220f501360204200241206a20e4016a2002360200200220f601370224200220f7013602202002200241a880046a360200200241b880046a200241206a1028200241b880046a20ea016a28020021fe0120022802bc800421ff0120022802b88004218002410521060c010b200520e9016a2101200420dc01460da70120542001490da801205820046a2c0000210520e701200136020002400240200520d801480d00200520f801710d01410621060c020b411821060c010b0240200520f90172220120e2017120fa014d0d00200620fb01712104200620ea01762105200120dc01732101410021540c060b41062106200121050b20800220ea0176218102410121544100210420ff0121820220fe0121830220800221010c040b203b2101203a218202410d21060c020b410f2106203b2101203a2182020c010b200220da013a00a8800420ee0120da01360200200220f501360204200241206a20e4016a2002360200200220f601370224200220f7013602202002200241a880046a360200200241b880046a200241206a102820022903b88004225e20e80188a7218202200241b880046a20ea016a2802002116205ea72101410521060b200120ea017621810241012154410021052016218302410021042001213b208202213a0b2004200520e2017120ea017472200620e2017172211520540d3b0240205c2053470d00205c20da01742205205c20da016a220420042005491b2204ad20f40186225e20e80188a70dd401205ea7220520d801480dd40102400240205c450d002055205c20f001742005101e22550d010ca6010b2005101f2255450da5010b2004215c0b2055205320f001746a220520013a000420052015360200205a2059490d000c020b0b410421554100215c4100215a0b410121064108215641002101410021044100218402034020012105200241206a200241086a1026200228022020da01460d3a200241b880046a20e9016a220120d70120e9016a2d00003a0000200220d7012f00003b01b88004200241206a20e6016a2802002159200241206a20e4016a280200215820ee0128020021530240024020eb012d0000225420ec01470d00200620dc016a21060c010b205420f3016a20e9014b0d00200620da016a225720064f21850220572106208502450d540b200241206a20e9016a225720012d00003a0000200220022f01b880043b012002402004208402470d00200420da016a22012004490dd201205b20012001205b491b228402ad20ef0186225e20e80188a70dd201205ea7220120d801480dd20102402004450d00205620052001101e22560d010ca4010b2001101f2256450da3010b205620056a220120543a0000200120e6016a2053360200200120ea016a2058360200200120d9016a2059360200200120f0016a20572d00003a0000200120da016a20022f01203b0000205b20e9016a215b200520e4016a2101200420da016a210420060d000b20e70128020020e5012802004621010240200228020c450d002002280208101d0b2001450d64024020fc01205d470d0020fc0120da0174220120fc0120da016a220520052001491b2205ad20f1017e225e20e80188a70dd101205ea7220120d801480dd1010240024020fc01450d00200320fc0120f2016c2001101e22030d010ca5010b2001101f2203450da4010b200521fc010b2003205d20f2016c6a2201205636020c2001205a3602082001205c36020420012055360200200120ed016a2004360200200120e4016a20840236020020fd012035490dae010cb9010b410f210120a8010de1010cf4010b410f211e20580d480c490b200241013a0008200241346a4101360200200241013602042002420137022420024190afc4003602202002200241086a36020020022002360230200241b880046a200241206a102820022802c08004210420022802bc8004212120022802b8800421054105210120a801450df2010cdf010b200241013a00a88004200241346a410136020020024101360204200241306a20023602002002420137022420024190afc4003602202002200241a880046a360200200241086a200241206a10282002290308225e422088a72138200241106a2802002111205ea721394105211e0c440b02402090022088026a2802002205450d0020900228020421012005208b027421050340024020012d0000208d02470d0020012089026a280200208e0271450d002001208b026a280200101d0b2001208c026a21012005208f026a22050d000b0b02402090022089026a280200450d00209002208b026a280200101d0b2090022086026a21010240209002208a026a280200450d00209002280210101d0b20012190022001208702470daa010c460b410f211a20530d540c550b02402099022802082205450d00209902280200210120052092027421050340024020012d0000209502470d0020012096026a28020020970271450d0020012092026a280200101d0b20012094026a210120052098026a22050d000b0b2099022094026a210102402099022092026a280200450d00209902280200101d0b20012199022001209302470da9010cda010b200241013a00a88004200241346a410136020020024101360204200241306a20023602002002420137022420024190afc4003602202002200241a880046a360200200241b880046a200241206a102820022903b88004225e422088a72136200241c080046a280200210e205ea721374105211a20530d520c530b410f2115205d0d5e0c5f0b200241013a00a88004200241346a410136020020024101360204200241306a20023602002002420137022420024190afc4003602202002200241a880046a360200200241b880046a200241206a102820022903b88004225e422088a7213a200241c080046a2802002116205ea7213b41052115205d0d5d0c5e0b410f215c0cc8010b200241013a0008200241346a410136020020024101360204200241306a20023602002002420137022420024190afc4003602202002200241086a360200200241b880046a200241206a102820022903b88004220d422088a72121200241c080046a2802002101200da7210a4105215c0cc7010b410f21014100215c0cc7010b024020a502209e026a2802002205450d0020a5022802042101200520a0027421050340024020012d000020a202470d002001209f026a28020020a30271450d00200120a0026a280200101d0b200120a1026a2101200520a4026a22050d000b0b024020a502209f026a280200450d0020a50220a0026a280200101d0b20a502209c026a2101024020a502209a026a280200450d0020a502280210101d0b200121a5022001209d02470da3010b2010209b0288210d410521014100210f201b450deb012003101d0ceb010b024020b10220aa026a2802002205450d0020b1022802042101200520ac027421050340024020012d000020ae02470d00200120ab026a28020020af0271450d00200120ac026a280200101d0b200120ad026a2101200520b0026a22050d000b0b024020b10220ab026a280200450d0020b10220ac026a280200101d0b20b10220a8026a2101024020b10220a6026a280200450d0020b102280210101d0b200121b102200120a902470da2010b200c20a70288210d410521014100210b2017450ded012003101d0ced010b024020bd0220b6026a280200450d0020bd02280200101d0b024020bd0220b2026a2802002205450d0020bd0228020c2101200520b6027421050340024020012d000020b902470d00200120ba026a28020020bb0271450d00200120b6026a280200101d0b200120b7026a2101200520bc026a22050d000b0b20bd0220b4026a2101024020bd0220b7026a280200450d0020bd0220b8026a280200101d0b200121bd02200120b502470da1010b200d20b30288210c410521154100210120fc01450dd9012003101d0cd9010b410f21210cc6010b200241013a00a88004200241346a410136020020024101360204200241306a20023602002002420137022420024190afc4003602202002200241a880046a360200200241086a200241206a1028200229020c210d2002280208210a410521214100215a0cc6010b024020032802082205450d0020032802002101200520c0027421050340024020012d000020c102470d00200120c2026a28020020c30271450d00200120c0026a280200101d0b200120bf026a2101200520c4026a22050d000b0b200320bf026a21010240200320c0026a280200450d002003280200101d0b2001210320be022001470d9e010cc3010b410f211a20550d410c420b410f21010cbc010b200241013a00a88004200241346a410136020020024101360204200241306a20023602002002420137022420024190afc4003602202002200241a880046a360200200241b880046a200241206a102820022903b88004225e422088a72136200241c080046a280200210e205ea721374105211a0c1c0b024020cf0220c7026a2802002205450d0020cf022802042101200520ca027421050340024020012d000020cc02470d00200120c8026a28020020cd0271450d00200120ca026a280200101d0b200120cb026a2101200520ce026a22050d000b0b024020cf0220c8026a280200450d0020cf0220ca026a280200101d0b20cf0220c5026a2101024020cf0220c9026a280200450d0020cf02280210101d0b200121cf02200120c602470d9b010c410b200241013a00a78004200241346a410136020020024101360204200241306a20023602002002420137022420024190afc4003602202002200241a780046a360200200241086a200241206a10280c100b200241013a00a78004200241346a410136020020024101360204200241306a20023602002002420137022420024190afc4003602202002200241a780046a360200200241086a200241206a10280c0f0b200241013a00a78004200241346a410136020020024101360204200241306a20023602002002420137022420024190afc4003602202002200241a780046a360200200241086a200241206a10280c0e0b200241013a00a78004200241346a410136020020024101360204200241306a20023602002002420137022420024190afc4003602202002200241a780046a360200200241086a200241206a1028200229020c210d2002280208210a410521010cb6010b200241013a00a78004200241cc80046a410136020020024101360204200241c880046a2002360200200242013702bc800420024190afc4003602b880042002200241a780046a360200200241a880046a200241b880046a102820022903a88004225e422088a7213a200241b080046a2802002116205ea7213b41052115205c450d46205a101d205d0d480c490b200241306a2802002104205d210a205b21012097010dbf010cc0010b200241306a28020021042053210a2057210620552101205d0dbc010cbd010b200241013a00a88004200241346a410136020020024101360204200241306a20023602002002420137022420024190afc4003602202002200241a880046a360200200241086a200241206a1028200229020c210d2002280208210a410521214100215a410021040cba010b41092121410021040cb9010b410f2115200228020c0d3a0c3b0b200241013a00a88004200241346a410136020020024101360204200241306a20023602002002420137022420024190afc4003602202002200241a880046a360200200241b880046a200241206a102820022903b88004225e422088a7218202200241c080046a280200218302205ea7213b410521150c300b024020da0220d2026a280200450d0020da02280200101d0b024020da0220d3026a2802002205450d0020da0228020c2101200520d2027421050340024020012d000020d602470d00200120d7026a28020020d80271450d00200120d2026a280200101d0b200120d4026a2101200520d9026a22050d000b0b20da0220d0026a2101024020da0220d4026a280200450d0020da0220d5026a280200101d0b200121da02200120d102470d90010c420b410f215c0b205d0daf010cb0010b200241013a0008200241346a410136020020024101360204200241306a20023602002002420137022420024190afc4003602202002200241086a360200200241b880046a200241206a1028200241c280046a2f01002105200241c180046a2d00002104200241c080046a2d0000210120022802bc8004212120022802b88004210a4105215c205d450daf010cae010b20022002412c6a2902003703a88004200241286a280200210a2002280224210120022802a88004212820022802ac8004210420ba010dab010cac010b200241013a00a78004200241346a410136020020024101360204200241306a20023602002002420137022420024190afc4003602202002200241a780046a360200200241086a200241206a10280b200229020c210d2002280208210a410521014100215c0ca8010b200241013a0008200241346a410136020020024101360204200241306a20023602002002420137022420024190afc4003602202002200241086a360200200241b880046a200241206a1028200241c080046a280200210120022802bc8004212120022802b88004210a4105215c205d0d030ca6010b410a21010ca6010b4118215c0b205d450da3010b205a101d0ca2010b41062121410021040caa010b410721040c0c0b200241013a0008200241346a410136020020024101360204200241306a20023602002002420137022420024190afc4003602202002200241086a360200200241b880046a200241206a1028200241c280046a2f01002105200241c180046a2d00002104200241c080046a2d0000210120022802bc8004212120022802b88004210a4105215c0ca4010b200241013a00a78004200241cc80046a410136020020024101360204200241c880046a2002360200200242013702bc800420024190afc4003602b880042002200241a780046a360200200241a880046a200241b880046a1028200241b080046a280200210e20022802ac8004213620022802a8800421374105211a205a0d010b2055450d230c220b205b101d20550d210c220b4117215c0ca0010b20810220ea0174200120e2017172213b205c0d1d0c1c0b200241306a2802002183022002412c6a280200218202200241286a280200213b200228022421152004450d1a0c190b200241206a41086a200241306a2802003602002021418080807871215a20214180807c712104202141087621050c97010b200241013a00a88004200241346a410136020020024101360204200241306a20023602002002420137022420024190afc4003602202002200241a880046a360200200241086a200241206a1028200241106a28020021052002290308215e410521040c040b200241013a00a88004200241346a410136020020024101360204200241306a20023602002002420137022420024190afc4003602202002200241a880046a360200200241086a200241206a102841052121200229020c210d2002280208210a410021040c9f010b41182121410021040c9e010b411821040b0b200141ff017141087420047221210c90010b200241013a00a88004200241346a410136020020024101360204200241306a20023602002002420137022420024190afc4003602202002200241a880046a360200200241086a200241206a1028200229020c210d2002280208210a41052121410021040c9a010b200241306a28020021050c8e010b4100215a0c98010b410d210120a8010d9d010cb0010b410d211e20580d040c050b2002280224221e410876210f200241306a28020021112002412c6a2802002138200241206a41086a280200213920580d030c040b2002280224211e200241206a41106a28020021112002412c6a2802002138200241206a41086a28020021390240205c450d00205c4104742105205a21010340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a280200101d0b200141106a2101200541706a22050d000b0b201e410876210f205d0d010b2058450d020c010b205a101d2058450d010b411c21860220032058411c6c6a218702410c21880241082189024114218a024104218b024110218c024109218d0241ffffffff03218e024170218f022003219002410721210c760b201b450dad012003101d0cad010b410d211a20530d0d0c0e0b2002280224221a410876210b200241306a280200210e2002412c6a2802002136200241206a41086a280200213720530d0c0c0d0b410d2115205d0d180c190b410d215c0c83010b410d21014100215c0c83010b410d21210c88010b024020544109470d00205841ffffffff0371450d002059101d0b4115218202418080c000213b410421152004450d010b205621010340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a280200101d0b200141106a2101200541706a22050d000b0b0240208402450d002056101d0b205c0d010b200228020c450d090c080b2055101d200228020c0d070c080b410d211a2055450d010b20554104742105205721010340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a280200101d0b200141106a2101200541706a22050d000b0b4100210b02402056450d002057101d0b2053450d010b411c21c50220032053411c6c6a21c602410c21c702410821c802411421c902410421ca02411021cb02410921cc0241ffffffff0321cd02417021ce02200321cf02410d21210c700b2017450da1012003101d0ca1010b410d21010c770b410d2115200228020c450d010b2002280208101d0b208202213a20830221160c050b410d215c205d0d760c770b4104215c4198a0c100210a41242121205d0d750c760b200241013a0008200241346a410136020020024101360204200241306a20023602002002420137022420024190afc4003602202002200241086a360200200241b880046a200241206a1028200241c280046a2f01002105200241c180046a2d00002104200241c080046a2d0000210120022802bc8004212120022802b88004210a4105215c205d0d740c750b4118215c205d0d730c740b200220f00120e90120011b3a00a88004200241346a410136020020024101360204200241206a41106a20023602002002420137022420024190afc4003602202002200241a880046a360200200241b880046a200241206a1028200241b880046a41086a280200211620022802bc8004213a20022802b88004213b02402004450d00200541106a21044100210103400240205620016a22052d00004109470d00200541086a28020041ffffffff0371450d00200541046a280200101d0b2004200141106a2201470d000b0b0240208402450d002056101d0b41052115205c0d010b205d450d020c010b2055101d205d450d010b411821d0022003205d41186c6a21d102410421d202411421d302411021d402410c21d502410921d602410821d70241ffffffff0321d802417021d902200321da02410e21210c650b20fc01450d82012003101d0c82010b417f200141016a102a000b200141016a2007102b000b417f2004102a000b20042054102b000b417f2004102a000b20042054102b000b417f200941016a102a000b200941016a2008102b000b417f200141016a102a000b200141016a200a102b000b417f2004102a000b20042054102b000b417f200141016a102a000b200141016a2004102b000b417f200141016a102a000b200141016a2005102b000b417f200141016a102a000b200141016a2005102b000b20052009102a000b20092008102b000b417f2001102a000b20012054102b000b417f200141016a102a000b200141016a2005102b000b417f2001102a000b20012004102b000b417f200141016a102a000b200141016a2005102b000b417f200441016a102a000b200441016a200a102b000b200541011020000b417f205841016a102a000b205841016a2006102b000b417f2005102a000b20052004102b000b200141041020000b200141041020000b417f2001102a000b20012005102b000b417f2001102a000b2001200a102b000b2001205d102a000b205d2054102b000b200141011020000b200141041020000b200141041020000b200141041020000b417f2001102a000b20012004102b000b200141041020000b205d41011020000b417f2058102a000b20582004102b000b417f2001102a000b20012054102b000b200541041020000b200141081020000b200141041020000b417f202e102a000b202e200a102b000b417f202e41016a102a000b202e41016a200a102b000b200141041020000b410021210c110b410121210c110b410221210c110b410321210c110b410421210c110b410521210c110b410621210c110b410721210c120b410821210c120b410921210c130b410a21210c140b410b21210c150b410c21210c150b410d21210c160b410e21210c170b410021010c170b410121010c160b410221010c150b410321010c140b410321010c130b410321010c120b410321010c110b410321010c100b410321010c0f0b410321010c0e0b410321010c0d0b410321010c0c0b410321010c0b0b410321010c0a0b410321010c090b410321010c080b410321010c070b410321010c060b410321010c050b410321010c040b410321010c030b410321010c020b410321010c010b410321010c000b0b1021000b200241206a41086a20053602002021418080807871215a20214180807c712104202141087621050b2002205e3703202002290224210d205ea7210a0c090b20014110762105200141087621040c040b205c41087420017221012002200d3703a88004200da721280240205a450d00205d101d0b20022802ac8004210420ba01450d010b2003210503400240200541046a280200450d002005280200101d0b200541146a21052027416c6a22270d000b0b20b901450d1c2003101d0c1c0b2054101d0b200441ff0171410874200141ff017172210420054110742105205841ff01714108742109024020d401450d002003210103400240200141046a280200450d002001280200101d0b200141106a210120d20141706a22d2010d000b0b200420057221042009205c72210120d301450d182003101d0c180b202f450d1320d601101d0c130b0b41002104410021050b202141ff0171200541ff0171410874722004418080fc077172205a722101200d422088a72104200da7210602402053450d002055101d0b205d450d010b205b101d0b209701450d010b2003210503400240200541046a280200450d002005280200101d0b0240200541106a280200450d002005410c6a280200101d0b200541286a2105201f41586a221f0d000b0b209601450d162003101d0c160b201320910288210d4105211241002101202f450d0c2003101d0c0c0b2003101d0c120b202e202a4621010240202b450d00202c101d0b02402001450d002059ad42208620d301ad84210d410221050c040b20024103410220011b3a0008200241346a4101360200200241013602042002420137022420024190afc4003602202002200241086a36020020022002360230200241b880046a200241206a102820022903b88004210d20022802c08004210402402059450d00205941047421052003210103400240200141046a280200450d002001280200101d0b200141106a2101200541706a22050d000b0b200d422088210c410521014100210520d301450d0e2003101d0c0e0b200241c480046a28020020022802c88004462105024020022802bc8004450d0020022802b88004101d0b02402005450d002001ad42208620b901ad84210d410821050c030b20024103410220051b3a00a88004200241206a41146a4101360200200241013602042002420137022420024190afc4003602202002200241a880046a36020020022002360230200241086a200241206a10282002290308210d2002280210210402402001450d00200141146c21052003210103400240200141046a280200450d002001280200101d0b200141146a21012005416c6a22050d000b0b200d422088210c410521014100210520b901450d0f2003101d0c0f0b2026202246210102402023450d002024101d0b02402001450d0020a701ad42208620a801ad84210d410421050c020b20024103410220011b3a0008200241346a4101360200200241013602042002420137022420024190afc4003602202002200241086a36020020022002360230200241b880046a200241206a102820022903b88004220d422088210c20022802c080042104410521014100210520a801450d102003101d0c100b200241c480046a28020020022802c88004462105024020022802bc8004450d0020022802b88004101d0b02402005450d002001ad422086209601ad84210d410321050c010b20024103410220051b3a00a88004200241346a4101360200200241013602042002420137022420024190afc4003602202002200241a880046a36020020022002360230200241086a200241206a10282002290308210d2002280210210402402001450d00200141286c21052003210103400240200141046a280200450d002001280200101d0b0240200141106a280200450d002001410c6a280200101d0b200141286a2101200541586a22050d000b0b200d422088210c4105210141002105209601450d112003101d0c110b200020053a000420004100360200200041056a20022f00b880043b0000200041186a200c370200200041146a20013602002000410c6a200d370200200041086a2003360200200041206a2002290220370200200041076a200241ba80046a2d00003a0000200041286a200241206a41086a290200370200200241d080046a24000f0b2008ad422086200aad84210d2007450d010b2025101d0b2000200136020420004101360200200041106a2005360200200041086a200d370200200241d080046a24000f0b20154108762101203aad220c422086203bad84210d2033450d002034101d0b20004101360200200041106a2016360200200041086a200c422086200d42ffffffff0f838437020020002001410874201541ff017172360204200241d080046a24000f0b201241087621012030ad220d4220862031ad84211320022802bc8004450d0020022802b88004101d0b20004101360200200041106a2014360200200041086a200d422086201342ffffffff0f838437020020002001410874201241ff017172360204200241d080046a24000f0b200541ffffff07712205410874200841ff01717221012007ad220c4220862020ad84210d20022802bc8004450d0020022802b88004101d0b20004101360200200041106a2004360200200041086a200c422086200d42ffffffff0f838437020020002005410874200141ff017172360204200241d080046a24000f0b200141087621052021ad220c422086200aad84210d202b450d00202c101d0b20004101360200200041106a2004360200200041086a200c422086200d42ffffffff0f838437020020002005410874200141ff017172360204200241d080046a24000f0b200141087621052028ad220c422086200aad84210d20022802bc8004450d0020022802b88004101d0b20004101360200200041106a2004360200200041086a200c422086200d42ffffffff0f838437020020002005410874200141ff017172360204200241d080046a24000f0b2021ad220c4220862005ad84210d410021052023450d002024101d0b20004101360200200041106a2004360200200041086a200c422086200d42ffffffff0f838437020020002005410874200141ff017172360204200241d080046a24000f0b200141087621052006ad220c422086200aad84210d20022802bc8004450d0020022802b88004101d0b20004101360200200041106a2004360200200041086a200c422086200d42ffffffff0f838437020020002005410874200141ff017172360204200241d080046a24000f0b200f410874201e41ff01717221012038ad220d4220862039ad84211020022802bc8004450d0020022802b88004101d0b20004101360200200041106a2011360200200041086a200d422086201042ffffffff0f83843702002000200f410874200141ff017172360204200241d080046a24000f0b200541ffffff07712204410874200a41ff01717221052008ad220c4220862007ad84210d20022802bc8004450d0020022802b88004101d0b20004101360200200041106a2001360200200041086a200c422086200d42ffffffff0f838437020020002004410874200541ff017172360204200241d080046a24000f0b200b410874201a41ff01717221012036ad220d4220862037ad84210c200228020c450d002002280208101d0b20004101360200200041106a200e360200200041086a200d422086200c42ffffffff0f83843702002000200b410874200141ff017172360204200241d080046a24000f0b200241d080046a24000b160020002001280208360204200020012802003602000bf30f01347f0240024002400240024002400240024002400240024002400240024002400240024002400240024020002d00002201410d4b0d00024020010e0e000203040506070809140a0b0c0d000b200041086a280200450d13200041046a280200101d0f0b0240200041086a280200450d00200041046a280200101d0b0240200041146a2802002201450d00200041186a280200450d002001101d0b200041246a280200450d12200041206a280200101d0f0b0240200041086a280200450d00200041046a280200101d0b200041146a280200450d11200041106a280200101d0f0b02402000410c6a2802002202450d00200041046a28020021012002410474210203400240200141046a280200450d002001280200101d0b200141106a2101200241706a22020d000b0b200041086a280200450d10200041046a280200101d0f0b02402000410c6a2802002202450d00200041046a2802002101200241286c210203400240200141046a280200450d002001280200101d0b0240200141106a280200450d002001410c6a280200101d0b200141286a2101200241586a22020d000b0b200041086a280200450d0f200041046a280200101d0f0b200041086a280200450d0e200041046a280200101d0f0b200041086a280200450d0d200041046a280200101d0f0b200041086a280200450d0c200041046a280200101d0f0b2000410c6a2802002201450d0a41042103200041046a280200220420014104746a210541102106410921074108210841ffffffff0321094170210a410021010c050b02402000410c6a2802002202450d00200041046a2802002101200241146c210203400240200141046a280200450d002001280200101d0b200141146a21012002416c6a22020d000b0b200041086a280200450d0a200041046a280200101d0f0b410c210b2000410c6a2802002201450d07411c210c4104210d200041046a280200220e2001411c6c6a210f4108211041142111411021124109211341ffffffff03211441702115410121010c030b410c21162000410c6a2802002201450d054118211741042118200041046a2802002219200141186c6a211a4114211b4110211c4109211d4108211e41ffffffff03211f41702120410221010c020b410c21212000410c6a2802002201450d03411c212241042123200041046a28020022242001411c6c6a21254108212641142127411021284109212941ffffffff03212a4170212b410321010c010b024002400240200041046a2d000022014102460d0020014101460d0120010d022000410c6a280200450d09200041086a280200101d0f0b200041146a2802002201450d03410c212c2000410c6a280200222d20014104746a212e4110212f410821304104213141742132410421010c020b0240200041146a2802002202450d002000410c6a28020021012002410c6c21020340024020012802002206450d00200141046a280200450d002006101d0b2001410c6a2101200241746a22020d000b0b200041106a280200450d072000410c6a280200101d0f0b2000410c6a280200450d06200041086a280200101d0f0b0340024002400240024002400240024002400240024020010e050001020304040b024020042802082202450d0020042802002101200220037421020340024020012d00002007470d00200120086a280200200971450d00200120036a280200101d0b200120066a21012002200a6a22020d000b0b200420066a21010240200420036a280200450d002004280200101d0b2001210420012005470d040c0e0b0240200e200b6a2802002202450d00200e28020421012002200d7421020340024020012d00002013470d00200120106a280200201471450d002001200d6a280200101d0b200120126a2101200220156a22020d000b0b0240200e20106a280200450d00200e200d6a280200101d0b200e200c6a21010240200e20116a280200450d00200e280210101d0b2001210e2001200f470d040c0c0b0240201920186a280200450d002019280200101d0b02402019201b6a2802002202450d00201928020c2101200220187421020340024020012d0000201d470d002001201e6a280200201f71450d00200120186a280200101d0b2001201c6a2101200220206a22020d000b0b201920176a210102402019201c6a280200450d00201920166a280200101d0b200121192001201a470d040c0a0b0240202420216a2802002202450d0020242802042101200220237421020340024020012d00002029470d00200120266a280200202a71450d00200120236a280200101d0b200120286a21012002202b6a22020d000b0b0240202420266a280200450d00202420236a280200101d0b202420226a21010240202420276a280200450d002024280210101d0b2001212420012025470d040c080b202d2233202f6a212d024020332802042201450d0002402033202c6a2802002202450d002002202c6c21020340024020012802002234450d00200120316a280200450d002034101d0b2001202c6a2101200220326a22020d000b0b203320306a280200450d00203320316a280200101d0b202d202e470d040c060b410021010c040b410121010c030b410221010c020b410321010c010b410421010c000b0b200041106a280200450d042000410c6a280200101d0c040b200041086a280200450d03200041046a280200101d0f0b200041086a280200450d02200041046a280200101d0f0b200041086a280200450d01200041046a280200101d0f0b200041086a280200450d00200041046a280200101d0f0b0bb310012e7f230041a0016b2202240002400240024002402000280200220341f0c0c100460d00200028020421040c010b41ec00101f2203450d0141002104200341003b010620034100360200200341086a200241086a41e40010ce031a20004100360204200020033602000b200141ff017121050c010b41ec0041041020000b41002107024003400240024002400240024002400240024020070e020001010b200341086a210820032f0106210641002107024002400240034020062007460d014100417f4101200820076a2d0000220920054b1b20092005461b2209450d02200741016a210720094101460d000b2007417f6a21060b02402004450d002004417f6a2104200320064102746a41ec006a2802002103410021070c0a0b2000200028020841016a36020820032f01062207410b4f0d01200341086a2209200641016a220a6a200920066a2209200720066b10cf031a200920013a0000200341146a2207200a4103746a200720064103746a2209200341066a22072f010020066b41037410cf031a20094101360200200720072f010041016a3b0100200241a0016a24000f0b200320074103746a41146a42013702000c090b41ec00101f220b450d04200b41003b0106200b4100360200200b41086a200241086a41e40010ce0321092003410e6a2d0000210c2003280248210d2003280244210e20092003410f6a200341066a220a2f010041796a220710ce032109200b41146a200341cc006a200741037410ce03210f200a41063b0100200b20073b010602400240200641064b0d00200341086a2207200641016a22096a200720066a220a200341066a22072f010020066b10cf031a200a20013a0000200341146a220a20094103746a200a20064103746a220920072f010020066b41037410cf031a200941013602000c010b20092006417a6a220a6a2009200641796a22066a2209200741ffff037120066b10cf031a200920013a0000200f200a4103746a200f20064103746a2209200b41066a22072f010020066b41037410cf031a200941013602000b4101210a200720072f010041016a3b010020032802002210450d014104210f410a2111419c0121124100211341082114419401211541c800211641c4002117410e2118410f21194106211a4179211b41cc00211c4114211d4103211e418801211f41ec002120417a21214102212241ffff03212341f0002124416c212541d4002126200341046a2f0100212720102f01062207410a4b0d060c020b2012101f2208450d02200820133b010620082013360200200820146a200241086a201510ce032106201020166a280200212a201020176a2802002129201020186a2d000021282006201020196a2010201a6a222b2f01002209201b6a220710ce03212c2008201d6a2010201c6a2007201e7410ce03212d200820206a2010201f6a200920216a222e20227410ce03212f202b201a3b0100200820073b01060240202e450d0041002107202f210603402006280200220920073b0104200920083602002006200f6a2106202e2007200a6a2207470d000b0b024002402027201a4b0d00201020146a22062027200a6a22076a200620276a2206202b2f0100220920276b222e10cf031a2006200c3a00002010201d6a22062007201e746a20062027201e746a2206202e201e7410cf031a2006200e3602002006200d360204202b2009200a6a22063b0100201020206a22092027202274222b6a20146a200920072022746a222e2006202371220920076b20227410cf031a202e200b360200202720094f0d012010202b6a20246a21070340200728020022062027200a6a22273b0104200620103602002007200f6a210720092027470d000c020b0b202c202720216a22066a202c2027201b6a22076a222e2008201a6a22092f010020076b10cf031a202e200c3a0000202d2006201e746a202d2007201e746a222e20092f010020076b201e7410cf031a202e200e360200202e200d360204200920092f0100200a6a222e3b0100202f2027202274222b6a20256a202f20062022746a2209202e202371222720066b20227410cf031a2009200b360200200620274b0d002008202b6a20266a21060340200628020022092007200a6a22073b0104200920083602002006200f6a210620272007470d000b0b024020102802002207450d002028210c2029210e202a210d2008210b2010200f6a2f01002127200722102f0106220720114d0d02410121070c070b2008210b202a210d2029210e2028210c0b419c01101f2207450d03200741003b010620074100360200200741086a200241086a41940110ce03210920072000280200220636026c200020073602002000200028020441016a360204200641003b010420062007360200200720072f010622064103746a220a41186a200d360200200a41146a200e360200200920066a200c3a0000200741ec006a200641016a22064102746a200b360200200720063b0106200b20063b0104200b2007360200200241a0016a24000f0b201041086a2209202741016a22066a200920276a2209200720276b220a10cf031a2009200c3a0000201041146a220920064103746a200920274103746a2209200a41037410cf031a2009200e3602002009200d360204201041066a200741016a22073b0100201041ec006a220920274102746a41086a200920064102746a2209200741ffff0371220a20066b41027410cf031a2009200b3602002027200a4f0d0520102006417f6a22074102746a41f0006a2106034020062802002209200741016a22073b010420092010360200200641046a2106200a2007470d000c060b0b419c0141041020000b41ec0041041020000b419c0141041020000b410121070c000b0b200241a0016a24000b8f4701af017f230041f0016b2202240020024184016a4200370200200241fc006a4280808080c000370200200241ec006a4200370200200241e4006a4280808080c000370200200241d0006a4200370300200241c0006a4200370300200241386a4280808080c000370300200241286a4200370300200241206a4280808080c000370300200241106a4200370300200242043702742002420437025c20024204370348200242043703302002420437031820024280808080c000370308200242043703002001410c6a28020021032001280208210441002105024002400240200141106a2802002206450d0041012107200241c0016a410172210841002109417f210a412c210b4109210c4108210d20024190016a41086a210e4111210f20024190016a41106a2110411921114118211220024190016a41186a21134121211420024190016a41206a21154127211620024190016a41276a2117410f2118417e2119410a211a410d211b4114211c200241c0016a41146a211d200241e4016a211e200241c0016a410c6a211f411c21204104212141ffffffff03212241702123410221244174212541582126416c212741002128410021294100212a4100212b4100212c4100212d4100212e4100212f4100213041002131410021320c010b4100210941002128410021294100212a4100212b4100212c4100212d4100212e4100212f4100213041002131410021010c010b410121010b03400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020010e020001010b410421820120022802002183010240200241086a2802002201450d0020014104742132208301210103400240200141046a280200450d002001280200101d0b200141106a2101203241706a22320d000b0b02402002280204450d00208301101d0b2002410c6a2802002183010240200241146a2802002201450d00200141286c2132208301210103400240200141046a280200450d002001280200101d0b0240200141106a280200450d002001410c6a280200101d0b200141286a2101203241586a22320d000b0b0240200241106a280200450d00208301101d0b02402002411c6a280200450d00200241186a280200101d0b0240200241286a280200450d00200241246a280200101d0b0240200241346a280200450d00200241306a280200101d0b2002413c6a280200218301200241c4006a2802002201450d01410421840120830120014104746a21850141102186014109218701410821880141ffffffff032189014170218a01208301218b01410121320c2d0b0240024020320e050001030507070b200e20042006200a6a2206200b6c6a2201200c6a29000037030020102001200f6a2900003703002013200120116a2900003703002015200120146a2900003703002017200141286a2800003600002002200129000137039001024020012d000022332018460d0020082002290390013700002008200d6a200e290300370000200841106a2010290300370000200820126a2013290300370000200841206a2015290300370000200820166a2017280000360000200220333a00c00141012134203320196a2235201a4b22360d3c02400240024002400240024002400240024002400240024002400240024002400240024020350e0b000102030405060708090a000b201f2802002137200241c0016a200d6a280200213820022802c40121392030450d0a0240203a450d00203a202174213b2030210103400240200120216a280200450d002001280200101d0b200141106a2101203b20236a223b0d000b0b4100213b0240203c450d002030101d0b2037213a2038213c203921300c4e0b201f2802002137200241c0016a200d6a280200213820022802c4012139202f450d0a0240203d450d00203d41286c213b202f210103400240200120216a280200450d002001280200101d0b0240200141106a280200450d002001410c6a280200101d0b200141286a2101203b20266a223b0d000b0b4100213e0240203f450d00202f101d0b2037213d2038213f2039212f4101213b0c4e0b201f2802002140200241c0016a200d6a280200210120022802c401213302402041450d00202e450d00202e101d0b2033212e2001214120060d200c2f0b201f2802002142200241c0016a200d6a280200210120022802c401213302402043450d00202d450d00202d101d0b2033212d2001214320060d1e0c2d0b201f2802002144200241c0016a200d6a280200210120022802c401213302402045450d00202c450d00202c101d0b2033212c2001214520060d1c0c2b0b201f2802002146200241c0016a200d6a280200214720022802c4012148202b450d072049450d42202b20492021746a214a202b214b4100214c0c4b0b201f2802002137200241c0016a200d6a280200213820022802c4012139202a450d0702402052450d002052201c6c213b202a210103400240200120216a280200450d002001280200101d0b2001201c6a2101203b20276a223b0d000b0b4100214f02402053450d00202a101d0b20372152203821532039212a4101213b4101213e4101214d41012150410121512036450d430c420b4101213120022802c401215420060d130c220b201f2802002155200241c0016a200d6a280200215620022802c40121572029450d062058450d422029205820206c6a21592029215a4101214c0c490b201f280200215c200241c0016a200d6a280200215d20022802c401215e2028450d06205f450d422028205f20126c6a2160202821614102214c0c490b201f2802002163200241c0016a200d6a280200216420022802c40121652009450d062066450d422009206620206c6a2167200921684103214c0c490b203921302038213c2037213a20060d190c280b2039212f2038213f2037213d20060d170c260b2048212b2047214e2046214920060d120c210b2039212a203821532037215220060d100c1f0b205721292056215b2055215820060d0e0c1d0b205e2128205d2162205c215f20060d0c0c1b0b20652109206421692063216620060d0a0c190b20062105410021010c430b0240208b012802082232450d00208b01280200210120322084017421320340024020012d0000208701470d0020012088016a28020020890171450d0020012084016a280200101d0b20012086016a21012032208a016a22320d000b0b208b012086016a21010240208b012084016a280200450d00208b01280200101d0b2001218b012001208501470d120b0240200241c0006a280200450d00208301101d0b200241c8006a280200218c010240200241d0006a2802002201450d00200141146c2132208c01210103400240200141046a280200450d002001280200101d0b200141146a21012032416c6a22320d000b0b0240200241cc006a280200450d00208c01101d0b200241dc006a280200218c01200241e4006a2802002201450d01411c218d01208c012001411c6c6a218e01410c218f014108219001411421910141042192014110219301410921940141ffffffff032195014170219601208c01219701410221320c2d0b0240209701208f016a2802002232450d00209701280204210120322092017421320340024020012d0000209401470d0020012090016a28020020950171450d0020012092016a280200101d0b20012093016a210120322096016a22320d000b0b02402097012090016a280200450d002097012092016a280200101d0b209701208d016a210102402097012091016a280200450d00209701280210101d0b20012197012001208e01470d110b0240200241e0006a280200450d00208c01101d0b200241e8006a280200219801200241f0006a2802002201450d014118219901209801200141186c6a219a014104219b014114219c014110219d01410c219e014109219f01410821a00141ffffffff0321a101417021a20120980121a301410321320c2d0b024020a301209b016a280200450d0020a301280200101d0b024020a301209c016a2802002232450d0020a30128020c21012032209b017421320340024020012d0000209f01470d00200120a0016a28020020a10171450d002001209b016a280200101d0b2001209d016a2101203220a2016a22320d000b0b20a3012099016a2101024020a301209d016a280200450d0020a301209e016a280200101d0b200121a3012001209a01470d100b0240200241ec006a280200450d00209801101d0b41800121a401200241f4006a28020021a501200241fc006a2802002201450d01411c21a60120a5012001411c6c6a21a701410c21a801410821a901411421aa01410421ab01411021ac01410921ad0141ffffffff0321ae01417021af0120a50121b001410421320c2d0b024020b00120a8016a2802002232450d0020b0012802042101203220ab017421320340024020012d000020ad01470d00200120a9016a28020020ae0171450d00200120ab016a280200101d0b200120ac016a2101203220af016a22320d000b0b024020b00120a9016a280200450d0020b00120ab016a280200101d0b20b00120a6016a2101024020b00120aa016a280200450d0020b001280210101d0b200121b001200120a701470d0f0b200220a4016a21010240200241f8006a280200450d0020a501101d0b2066410020091b21322069410020091b218601205f410020281b218a012062410020281b2187012058410020291b219d01205b410020291b21960120524100202a1b21940120534100202a1b21930120494100202b1b21a201204e4100202b1b219f0120444100202c1b21af0120454100202c1b21ad0120424100202d1b21ac0120434100202d1b21890120404100202e1b21880120414100202e1b218301203d4100202f1b219001203f4100202f1b21a901203a410020301b219501203c410020301b218401200920820120091b21a101202820820120281b21a001202920820120291b21ae01202a208201202a1b219201202b208201202b1b218b01202c208201202c1b219b01202d208201202d1b219701202e208201202e1b21ab01202f208201202f1b21a301203020820120301b21b001200110b703024020024184016a2201280200450d0020024180016a280200101d0b20024188016a20053602002001200336020020024180016a2004360200200241fc006a2032360200200241f8006a208601360200200241f4006a20a101360200200241f0006a208a01360200200241ec006a208701360200200241e8006a20a001360200200241e4006a209d01360200200241e0006a209601360200200241dc006a20ae01360200200241d8006a2054360200200241d4006a2031360200200241d0006a209401360200200241cc006a209301360200200241c8006a209201360200200241c4006a20a201360200200241c0006a209f013602002002413c6a208b01360200200241386a20af01360200200241346a20ad01360200200241306a209b013602002002412c6a20ac01360200200241286a208901360200200241246a209701360200200241206a2088013602002002411c6a208301360200200241186a20ab01360200200241146a209001360200200241106a20a9013602002002410c6a20a301360200200241086a2095013602002002208401360204200220b00136020020002002418c0110ce031a200241f0016a24000f0b410021320c190b410021320c190b410021320c190b410021320c190b410021320c190b410021320c190b410021320c190b410021320c190b410021320c190b410021320c190b410021320c190b410121320c1a0b410221320c1b0b410321320c1c0b410421320c1d0b410021010c2b0b410021010c2a0b410021010c290b410021010c280b410021010c270b410021010c260b410021010c250b410021010c240b410021010c230b410021010c220b410021010c210b410121010c200b410121010c1f0b410121010c1e0b410121010c1d0b410121010c1c0b410121010c1b0b410121010c1a0b410121010c190b410121010c180b410121010c170b410121010c160b410121010c150b410121010c140b410121010c130b410121010c120b410121010c110b410121010c100b410121010c0f0b410121010c0e0b410021010c0c0b410821010c0b0b410121010c0a0b410221010c090b410321010c080b410421010c070b410521010c060b410621010c050b410721010c040b410921010c030b410921010c020b410921010c010b410921010b0340024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020010e0a00010203040f10111234340b4100214d0240204e450d00202b101d0b204621492047214e2048212b4101213b4101213e4101214f410121504101215120360d70410121010c87010b024020350e0b00040506070809720a0b0c000b203b450d4220022802c40121360240201f2802002201450d00200120217421332036210103400240200120216a280200450d002001280200101d0b200141106a2101203320236a22330d000b0b200241c0016a200d6a280200450d422036101d20060d160c210b410021500240205b450d002029101d0b205521582056215b205721294101213b4101213e4101214d4101214f410121512036450d6d0c6c0b4100215102402062450d002028101d0b205c215f205d2162205e21284101213b4101213e4101214d4101214f410121502036450d6a0c690b410021342069450d092009101d2063216620642169206521094101213b4101213e4101214d4101214f4101215041012151410021342036450d670c660b203e450d3e20022802c40121360240201f2802002201450d00200141286c21332036210103400240200120216a280200450d002001280200101d0b0240200141106a280200450d002001410c6a280200101d0b200141286a2101203320266a22330d000b0b200241c0016a200d6a280200450d3e2036101d20060d110c1c0b200241c0016a200d6a280200450d3d20022802c401101d20060d0f0c1a0b200241c0016a200d6a280200450d3c20022802c401101d20060d0d0c180b200241c0016a200d6a280200450d3b20022802c401101d20060d0b0c160b204d450d3a20022802c401216a201f2802002201450d2b206a20012021746a216b206a216c4104214c0c6e0b204f450d3920022802c40121360240201f2802002201450d002001201c6c21332036210103400240200120216a280200450d002001280200101d0b2001201c6a2101203320276a22330d000b0b200241c0016a200d6a280200450d392036101d20060d080c130b2050450d3820022802c401216d201f2802002201450d2b206d200120206c6a216e206d216f4105214c0c6e0b2051450d3720022802c4012170201f2802002201450d2c2070200120126c6a2171207021724106214c0c6f0b2034450d3620022802c4012173201f2802002201450d2d2073200120206c6a2174207321754107214c0c700b206321662064216920652109410521010c790b4101213b410621010c780b4101213e410721010c770b4101214d4101214f41012150410121512036450d60410821010c760b024002400240024002402033201b4b0d000240024020330e0e0001020202020202023803040506000b200241c0016a200d6a280200450d3720022802c401101d20060d0f0c1a0b0240200241c0016a200d6a280200450d0020022802c401101d0b201d280200450d36200241c0016a41106a280200101d20060d0d0c180b0240200241c0016a200d6a280200450d0020022802c401101d0b0240201d2802002201450d00200241c0016a20126a280200450d002001101d0b201e280200450d35200241c0016a41206a280200101d20060d0e0c190b20022802c4012176201f2802002201450d2d2076200120206c6a2177207621784108214c0c700b20022802c4012179201f2802002201450d2e2079200120126c6a217a2079217b4109214c0c710b20022802c401217c201f2802002201450d2f207c200120206c6a217d207c217e410a214c0c720b02400240024020022d00c40122012024460d0020012007460d0120010d02201f280200450d34200241c0016a200d6a280200101d20060d0a0c150b201f280200217f201d2802002201450d32207f20012021746a218001207f218101410b214c0c750b201f28020021350240201d2802002201450d002001410c6c2133203521010340024020012802002236450d00200120216a280200450d002036101d0b2001410c6a2101203320256a22330d000b0b200241c0016a41106a280200450d322035101d20060d070c120b201f280200450d31200241c0016a200d6a280200101d0c310b410021320c150b410021320c150b410021320c150b410021320c150b410021320c150b410021320c150b410021320c150b410021320c150b410021320c150b410021320c150b410021320c150b410021010c6a0b410021010c690b410021010c680b410021010c670b410021010c660b410021010c650b410021010c640b410021010c630b410021010c620b410021010c610b410021010c600b410121010c5f0b410121010c5e0b410121010c5d0b410121010c5c0b410121010c5b0b410121010c5a0b410121010c590b410121010c580b410121010c570b410121010c560b410121010c550b02400240024002400240204c0e0c000102030406080a0c0e1012120b0240204b2802082237450d00204b2802002101203720217421370340024020012d0000200c470d002001200d6a280200202271450d00200120216a280200101d0b200141106a2101203720236a22370d000b0b204b41106a21010240204b20216a280200450d00204b280200101d0b2001214b2001204a470d2e410021010c570b0240205a410c6a2802002237450d00205a2802042101203720217421370340024020012d0000200c470d002001200d6a280200202271450d00200120216a280200101d0b200141106a2101203720236a22370d000b0b0240205a200d6a280200450d00205a20216a280200101d0b205a20206a21010240205a201c6a280200450d00205a280210101d0b2001215a20012059470d2e410221010c560b0240206120216a280200450d002061280200101d0b02402061201c6a2802002237450d00206128020c2101203720217421370340024020012d0000200c470d002001200d6a280200202271450d00200120216a280200101d0b200141106a2101203720236a22370d000b0b206120126a21010240206141106a280200450d002061410c6a280200101d0b2001216120012060470d2e410321010c550b02402068410c6a2802002237450d0020682802042101203720217421370340024020012d0000200c470d002001200d6a280200202271450d00200120216a280200101d0b200141106a2101203720236a22370d000b0b02402068200d6a280200450d00206820216a280200101d0b206820206a210102402068201c6a280200450d002068280210101d0b2001216820012067470d2e410421010c540b0240206c2802082237450d00206c2802002101203720217421370340024020012d0000200c470d002001200d6a280200202271450d00200120216a280200101d0b200141106a2101203720236a22370d000b0b206c41106a21010240206c20216a280200450d00206c280200101d0b2001216c2001206b470d2e0b200241c0016a200d6a280200450d0e206a101d20060d120c1b0b0240206f410c6a2802002237450d00206f2802042101203720217421370340024020012d0000200c470d002001200d6a280200202271450d00200120216a280200101d0b200141106a2101203720236a22370d000b0b0240206f200d6a280200450d00206f20216a280200101d0b206f20206a21010240206f201c6a280200450d00206f280210101d0b2001216f2001206e470d2d0b200241c0016a200d6a280200450d0c206d101d20060d0f0c180b0240207220216a280200450d002072280200101d0b02402072201c6a2802002237450d00207228020c2101203720217421370340024020012d0000200c470d002001200d6a280200202271450d00200120216a280200101d0b200141106a2101203720236a22370d000b0b207220126a21010240207241106a280200450d002072410c6a280200101d0b2001217220012071470d2c0b200241c0016a200d6a280200450d0a2070101d20060d0c0c150b02402075410c6a2802002237450d0020752802042101203720217421370340024020012d0000200c470d002001200d6a280200202271450d00200120216a280200101d0b200141106a2101203720236a22370d000b0b02402075200d6a280200450d00207520216a280200101d0b207520206a210102402075201c6a280200450d002075280210101d0b2001217520012074470d2b0b200241c0016a200d6a280200450d082073101d20060d090c120b02402078410c6a2802002237450d0020782802042101203720217421370340024020012d0000200c470d002001200d6a280200202271450d00200120216a280200101d0b200141106a2101203720236a22370d000b0b02402078200d6a280200450d00207820216a280200101d0b207820206a210102402078201c6a280200450d002078280210101d0b2001217820012077470d2a0b200241c0016a200d6a280200450d062076101d20060d0b0c140b0240207b20216a280200450d00207b280200101d0b0240207b201c6a2802002237450d00207b28020c2101203720217421370340024020012d0000200c470d002001200d6a280200202271450d00200120216a280200101d0b200141106a2101203720236a22370d000b0b207b20126a21010240207b41106a280200450d00207b410c6a280200101d0b2001217b2001207a470d290b200241c0016a200d6a280200450d042079101d20060d0a0c130b0240207e410c6a2802002237450d00207e2802042101203720217421370340024020012d0000200c470d002001200d6a280200202271450d00200120216a280200101d0b200141106a2101203720236a22370d000b0b0240207e200d6a280200450d00207e20216a280200101d0b207e20206a21010240207e201c6a280200450d00207e280210101d0b2001217e2001207d470d280b200241c0016a200d6a280200450d02207c101d20060d090c120b208101223941106a218101024020392802042201450d0002402039410c6a2802002237450d002037410c6c21370340024020012802002238450d00200120216a280200450d002038101d0b2001410c6a2101203720256a22370d000b0b2039200d6a280200450d00203920216a280200101d0b208101208001470d270b200241c0016a41106a280200450d00207f101d20060d080c110b2006450d08410021320c110b410021320c110b410021320c110b410021320c110b410021320c110b410021320c110b410021320c110b410021320c110b410021320c110b410021010c3b0b410021010c3a0b410021010c390b410021010c380b410021010c370b410021010c360b410021010c350b410021010c340b410021010c330b410121010c320b410121010c310b410121010c300b410121010c2f0b410121010c2e0b410121010c2d0b410121010c2c0b410121010c2b0b410121010c2a0b4100214c0c140b4101214c0c140b4102214c0c140b4103214c0c140b4104214c0c150b4105214c0c160b4106214c0c170b4107214c0c180b4108214c0c190b4109214c0c1a0b410a214c0c1b0b410b214c0c1c0b410821010c1c0b410121010c1b0b410821010c1a0b410121010c190b410821010c180b410121010c170b410821010c160b410121010c150b410821010c140b410921010c130b410921010c120b410921010c110b410921010c100b410921010c0f0b410921010c0e0b410921010c0d0b410921010c0c0b410921010c0b0b410921010c0a0b410921010c090b410921010c080b410921010c070b410921010c060b410921010c050b410921010c040b410921010c030b410921010c020b410921010c010b410921010c000b0b0b980c02297f017e230041106b22022400024002400240024020012802004101470d00200141106a2d000021032001410c6a2802002104200141086a280200210520012f0112210620012d0011210720012802042101200241086a2000104420022802082208200228020c22094104746a210a4100210b20094104490d0141ff01210c200341ff0171210d4101210e410d210f411c211041182111411d2112412c21134128211441202115412d2116413c211741c0002118413821194130211a413d211b413f211c4101211d0c020b20012802042104200241106a240020040f0b410021090c010b410121090b02400240024003400240024002400240024002400240024002400240024002400240024002400240024020090e020001010b2008200a460d01410421210240200741ff017122224104470d0041102123200341ff0171212441012125410d21264100211d0c0c0b41102127200341ff0171212841012129410d212a4102211d0c0f0b024002400240201d0e03010002020b024020082d000c200d470d0020082802082004470d002008280200211e4100210902400340200920044f0d01200120096a211f201e20096a21202009200e6a210920202d0000201f2d0000460d000c020b0b2007200c71220941044622202008200f6a2d0000221f410446221e470d00201f2009460d0720200d07201e0d070b0240200820106a2d0000200d470d00200820116a2802002004470d00200841106a280200211e4100210902400340200920044f0d01200120096a211f201e20096a21202009200e6a210920202d0000201f2d0000460d000c020b0b2007200c7122094104462220200820126a2d0000221f410446221e470d00201f2009460d0420200d04201e0d040b0240200820136a2d0000200d470d00200820146a2802002004470d00200820156a280200211e4100210902400340200920044f0d01200120096a211f201e20096a21202009200e6a210920202d0000201f2d0000460d000c020b0b2007200c7122094104462220200820166a2d0000221f410446221e470d00201f2009460d0520200d05201e0d050b0240200820176a2d0000200d470d00200820196a2802002004470d002008201a6a280200211e4100210902400340200920044f0d01200120096a211f201e20096a21202009200e6a210920202d0000201f2d0000460d000c020b0b2007200c71220941044622202008201b6a2d0000221f410446221e470d00201f2009460d0620200d06201e0d060b200b41046a210b200a200820186a22086b201c4b0d0a410021090c110b024020082d000c2024470d0020082802082004470d00200828020021204100210902400340200920044f0d01200120096a211d202020096a211f200920256a2109201f2d0000201d2d0000460d000c020b0b200820266a2d00002021460d060b200b20256a210b200820236a2208200a470d080c010b024020082d000c2028470d0020082802082004470d00200828020021204100210902400340200920044f0d01200120096a211d202020096a211f200920296a2109201f2d0000201d2d0000460d000c020b0b2008202a6a2d000022092022470d0020092021470d050b200b20296a210b200820276a2208200a470d090b024002400240200041046a28020020002802082208470d00200841016a22092008490d082008410174220e20092009200e491b220ead420486222b422088a70d08202ba7221d4100480d082008450d0120002802002008410474201d101e2209450d020c120b200028020021090c120b201d101f22090d100b201d41041020000b200b410172210b20050d030c100b200b410272210b20050d020c0f0b200b410372210b0b2005450d0d0b2001101d200241106a2400200b0f0b1021000b4100211d0c030b4101211d0c030b4102211d0c030b410121090c040b410121090c030b410121090c020b410121090c010b410121090c000b0b20002009360200200041046a200e360200200041086a28020021080b200920084104746a220820063b010e200820073a000d200820033a000c200820043602082008200536020420082001360200200041086a2204200428020041016a3602002002200010442002280204417f6a210b0b200241106a2400200b0bac24032d7f017e2b7f230041306b220224002001280204210320012802002104410121050240024002400240024020012802082206450d00412c101f2207450d02200720022f002d3b0001200741023a00002007200636000c200720033600082007200436000420072002290208370210200741036a2002412d6a41026a2d00003a0000200741186a200241106a290200370200200741206a200241186a290200370200200741286a200241086a41186a28020036020041002108410121090c010b4104210741002109410121080b200141106a280200210a200128020c210b024002400240200141146a280200220c450d002009410174220d200941016a220e200e200d491b220d412c6c210e2009450d0120072009412c6c200e101e2207450d020c040b2009210d0c040b200e101f22070d020b200e41041020000b412c41041020000b20072009412c6c6a220e20022f002d3b0001200e41033a0000200e200c36000c200e200a360008200e200b360004200e2002290208370210200e41036a2002412f6a2d00003a0000200e41186a200241106a290200370200200e41206a200241186a290200370200200e41286a200241086a41186a280200360200200941016a2109410021050b2001411c6a280200210f2001280218211041002111024002400240024002400240024002400240200141206a2802002212450d00200d2009470d0441000d0641000d06200d410174220e200d41016a22132013200e491b220ead422c7ea722134100480d06200d450d012007200d412c6c2013101e2207450d020c030b410021140c040b2013101f22070d010b201341041020000b200e210d0b20072009412c6c6a220e41043a0000200e201236000c200e200f360008200e2010360004200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41186a280200360200200e41206a200241186a290200370200200e41186a200241106a290200370200200e200229020837021041012114200941016a21090b200141286a28020021152001280224211602402001412c6a2802002212450d000240200d2009470d0041000d0241000d02200d410174220e200d41016a22132013200e491b220ead422c7ea722134100480d02024002400240200d450d002007200d412c6c2013101e2207450d010c020b2013101f22070d010b201341041020000b200e210d0b20072009412c6c6a220e41053a0000200e201236000c200e2015360008200e2016360004200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41186a280200360200200e41206a200241186a290200370200200e41186a200241106a290200370200200e200229020837021041012111200941016a21090b200141346a280200211720012802302118024002400240024002400240200141386a2802002212450d00200d2009470d0441000d0641000d06200d410174220e200d41016a22132013200e491b220ead422c7ea722134100480d06200d450d012007200d412c6c2013101e2207450d020c030b410021190c040b2013101f22070d010b201341041020000b200e210d0b20072009412c6c6a220e41063a0000200e201236000c200e2017360008200e2018360004200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41186a280200360200200e41206a200241186a290200370200200e41186a200241106a290200370200200e200229020837021041012119200941016a21090b200141c0006a280200211a200128023c211b4101211c024002400240024002400240200141c4006a280200221d450d00200d2009470d0441000d0641000d06200d410174220e200d41016a22122012200e491b220ead422c7ea722124100480d06200d450d012007200d412c6c2012101e2207450d020c030b4101211e0c040b2012101f22070d010b201241041020000b200e210d0b20072009412c6c6a220e41073a0000200e201d36000c200e201a360008200e201b360004200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41186a280200360200200e41206a200241186a290200370200200e41186a200241106a290200370200200e2002290208370210200941016a21094100211e0b200141cc006a280200211f200128024821200240200141d0006a2802002221450d000240200d2009470d0041000d0241000d02200d410174220e200d41016a22122012200e491b220ead422c7ea722124100480d02024002400240200d450d002007200d412c6c2012101e2207450d010c020b2012101f22070d010b201241041020000b200e210d0b20072009412c6c6a220e41083a0000200e202136000c200e201f360008200e2020360004200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41186a280200360200200e41206a200241186a290200370200200e41186a200241086a41086a290200370200200e2002290208370210200941016a21094100211c0b41012122024020012802544101470d00200141d8006a28020021120240200d2009470d0041000d0241000d02200d410174220e200d41016a22132013200e491b220ead422c7ea722134100480d02024002400240200d450d002007200d412c6c2013101e2207450d010c020b2013101f22070d010b201341041020000b200e210d0b20072009412c6c6a220e41093a0000200e2012360204200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41206a280200360200200e41206a200241086a41186a290200370200200e41186a200241086a41106a290200370200200e41106a200241106a290200370200200e2002290208370208200941016a21090b200141e0006a2802002123200128025c21240240200141e4006a2802002225450d000240200d2009470d0041000d0241000d02200d410174220e200d41016a22122012200e491b220ead422c7ea722124100480d02024002400240200d450d002007200d412c6c2012101e2207450d010c020b2012101f22070d010b201241041020000b200e210d0b20072009412c6c6a220e410a3a0000200e202536000c200e2023360008200e2024360004200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41186a280200360200200e41206a200241186a290200370200200e41186a200241106a290200370200200e2002290208370210200941016a2109410021220b200141ec006a28020021262001280268212741012128024002400240024002400240200141f0006a2802002229450d00200d2009470d0441000d0641000d06200d410174220e200d41016a22122012200e491b220ead422c7ea722124100480d06200d450d012007200d412c6c2012101e2207450d020c030b4101212a0c040b2012101f22070d010b201241041020000b200e210d0b20072009412c6c6a220e410b3a0000200e202936000c200e2026360008200e2027360004200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41186a280200360200200e41206a200241186a290200370200200e41186a200241106a290200370200200e2002290208370210200941016a21094100212a0b200141f8006a2802002112200128027421130240200141fc006a280200222b450d000240200d2009470d0041000d0241000d02200d410174220e200d41016a22282028200e491b220ead422c7ea722284100480d02024002400240200d450d002007200d412c6c2028101e2207450d010c020b2028101f22070d010b202841041020000b200e210d0b20072009412c6c6a220e410c3a0000200e202b36000c200e2012360008200e2013360004200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41186a280200360200200e41206a200241186a290200370200200e41186a200241106a290200370200200e2002290208370210200941016a2109410021280b20014184016a280200212c200128028001210e024002400240200d20096b20014188016a280200412c6c222d412c6d22014f0d00200920016a22012009490d03200d410174222e20012001202e491b222ead422c7e222f422088a70d03202fa722304100480d03200d450d012007200d412c6c2030101e2207450d020c040b200920016a21010c040b2030101f22070d020b203041041020000b1021000b202e210d0b20072009412c6c6a200e202d10ce031a0240202c450d00200e101d0b0240024002400240024041c005101f2209450d002000200736020820004280c2cdeb16370200200241086a410c6a4210370200200041106a20013602002000410c6a200d3602002002200936021020024280c2cdeb16370308200241106a10b7032009101d2028450d02202b450d01411c21312013202b411c6c6a2132410c2133410821344114213541042136411021374109213841ffffffff0321394170213a2013213b4100213c0c030b41c00541041020000b410021010c020b410121010c010b410221010b03400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020010e03000102020b2012450d0e2013101d410121010c160b202a450d022029450d014118213d2027202941186c6a213e4104213f4114214041102141410c2142410921434108214441ffffffff03214541702146202721474101213c0c0f0b02400240203c0e0400010407070b0240203b20336a2802002209450d00203b2802042101200920367421090340024020012d00002038470d00200120346a280200203971450d00200120366a280200101d0b200120376a21012009203a6a22090d000b0b0240203b20346a280200450d00203b20366a280200101d0b203b20316a21010240203b20356a280200450d00203b280210101d0b2001213b20012032470d09410021010c150b02402047203f6a280200450d002047280200101d0b0240204720406a2802002209450d00204728020c21012009203f7421090340024020012d00002043470d00200120446a280200204571450d002001203f6a280200101d0b200120416a2101200920466a22090d000b0b2047203d6a21010240204720416a280200450d00204720426a280200101d0b200121472001203e470d090b2026450d002027101d0b2022450d022025450d01411c214820242025411c6c6a2149410c214a4108214b4114214c4104214d4110214e4109214f41ffffffff03215041702151202421524102213c0c0e0b02402052204a6a2802002209450d00205228020421012009204d7421090340024020012d0000204f470d002001204b6a280200205071450d002001204d6a280200101d0b2001204e6a2101200920516a22090d000b0b02402052204b6a280200450d002052204d6a280200101d0b205220486a210102402052204c6a280200450d002052280210101d0b2001215220012049470d070b2023450d002024101d0b0240201c450d0002402021450d00202141146c21092020210103400240200141046a280200450d002001280200101d0b200141146a21012009416c6a22090d000b0b201f450d002020101d0b201e450d02201d450d0141042153201b201d4104746a215441102155410921564108215741ffffffff03215841702159201b215a4103213c0c0d0b0240205a2802082209450d00205a2802002101200920537421090340024020012d00002056470d00200120576a280200205871450d00200120536a280200101d0b200120556a2101200920596a22090d000b0b205a20556a21010240205a20536a280200450d00205a280200101d0b2001215a20012054470d050b201a450d00201b101d0b02402017410047201941017371450d002018101d0b02402015410047201141017371450d002016101d0b0240200f410047201441017371450d002010101d0b02402005450d000240200c450d00200c41286c2109200b210103400240200141046a280200450d002001280200101d0b0240200141106a280200450d002001410c6a280200101d0b200141286a2101200941586a22090d000b0b200a450d00200b101d0b02402008450d0002402006450d00200641047421092004210103400240200141046a280200450d002001280200101d0b200141106a2101200941706a22090d000b0b2003450d002004101d0b200241306a24000f0b4100213c0c040b4101213c0c050b4102213c0c060b4103213c0c070b410121010c070b410221010c060b410221010c050b410221010c040b410221010c030b410221010c020b410221010c010b410221010c000b0bb505000240024002400240024002400240024002400240200041ff0171417f6a220041aa014b0d00024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020000eab014a00000000000000000000000000010101010103030404050506060707080809094b0a0a0b0b0c0c0d0d4c4d0e0e0f0f10101111121213131414151516161717181819191a1a1b1b1c1c1d1d1e1e1f1f20204e212122224f2323242450252526262727282829292a2a512b2b2c2c2d2d2e2e2f2f30303131323233333434353536363737383839393a3a3b3b3c3c3d3d3e3e523f3f404041414242434344444545464647474848020202024a0b410a0f0b41080f0b41100f0b41040f0b41040f0b41040f0b41040f0b41040f0b41040f0b41040f0b41050f0b41050f0b41050f0b41050f0b41060f0b41070f0b410b0f0b410b0f0b410b0f0b410b0f0b410b0f0b410b0f0b410b0f0b410b0f0b410b0f0b410b0f0b410b0f0b410c0f0b410c0f0b410c0f0b410c0f0b410c0f0b410c0f0b41000f0b41010f0b41030f0b41030f0b41000f0b41000f0b41000f0b41000f0b41000f0b41010f0b41030f0b41030f0b41000f0b41000f0b41000f0b41000f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410f0f0b410f0f0b410e0f0b410f0f0b410f0f0b410f0f0b410f0f0b410f0f0b410f0f0b410f0f0b41110f0b41120f0b41050f0b41130f0b41140f0b41000f0b41020f0b41000f0b41020f0b410e0b6d01017f230041306b2203240020032002360204200320013602002003412c6a41023602002003411c6a4102360200200341023602242003420237020c200341d8b1c400360208200320033602282003200341046a3602202003200341206a360218200341086a200010cf01000b800203047f017e017f024002400240200041086a28020022032001490d0002400240024002402003200041046a280200470d00200341016a22042003490d0320034101742205200420042005491b2206ad4204862207422088a70d032007a722084100480d032003450d01200028020020034104742008101e2205450d020c050b200341016a2104200028020021050c050b2008101f22050d030b200841081020000b1021000b41c8aec400102c000b20002005360200200041046a20063602000b200520014104746a220541106a2005200320016b41047410cf031a200541086a200241086a29030037030020052002290300370300200041086a20043602000bbf0303027f017e027f02402001450d000340200028026c21002001417f6a22010d000b0b4100210341002101024003402002450d010240200120002f01064f0d0020014103742104200141016a21012002417f6a2102200020046a41146a290200a74103470d010c020b0240024020002802002201450d0020003301044220862003ad842105410121060c010b2003ad210541002106410021010b2000101d2005a72103024002402005422088a7220720012f01064f0d00200121040c010b03400240024020012802002204450d00200641016a210620013301044220862003ad8421050c010b2003ad2105410021040b2001101d2005a72103200421012005422088a7220720042f01064f0d000b0b200420074102746a41f0006a2802002100200420074103746a41146a2902002105024020064101460d00410120066b21010340200028026c2100200141016a22010d000b0b410021012002417f6a21022005a74103470d000b0b0240200041f0c0c100460d00200028020021012000101d2001450d00200128020021042001101d2004450d00024020042802002201450d0003402004101d2001210420012802002200210120000d000b0b2004101d0b0b9d0503057f017e017f230041306b22022400200241106a200141246a290200370300200241086a2001411c6a29020037030020022001290214370300200241186a41106a200141106a280200360200200241186a41086a200141086a290200370300200220012902003703182000200241186a10482103024002400240024002400240024002402000411c6a280200200041206a2802002204470d00200441016a22052004490d0520044101742206200520052006491b2206ad4202862207422088a70d052007a722084100480d052004450d01200041186a28020020044102742008101e2205450d020c030b200041186a28020021050c030b2008101f22050d010b200841041020000b2000411c6a2006360200200041186a2005360200200041206a28020021040b200520044102746a2003360200200041206a2204200428020041016a360200200241186a41106a200241106a290300370300200241186a41086a200241086a29030037030020022002290300370318024002400240200041ec006a280200200041f0006a2802002204470d00200441016a22052004490d0320044101742203200520052003491b2203ad42187e2207422088a70d032007a722064100480d032004450d01200041e8006a280200200441186c2006101e2205450d020c040b200041e8006a28020021050c040b2006101f22050d020b200641041020000b1021000b200041ec006a2003360200200041e8006a2005360200200041f0006a28020021040b2005200441186c6a22042002290318370200200441106a200241186a41106a290300370200200441086a200241186a41086a290300370200200041f0006a22042004280200220441016a360200024020012d002c450d0020004101360254200041d8006a20043602000b200241306a24000ba68f0117097f017e5a7f037e047f017e117f017e177f017e1b7f027e137f037e497f027e017f017e117f047e117f017e1e7f23002203210420034180096b416071220324000240024002400240024002400240024002404110101f2205450d00200541063a00004120101f2206450d01200641063a001020064100360204200620032f00c0053b00012006412d3a0000200641036a200341c2056a2d00003a0000024020052d00004109470d00200528020841ffffffff0371450d002005280204101d0b2005101d200141106a2802002207412c6c21052001280208220841586a210902400240024002400240024003402005450d01200541546a2105200941286a210a2009412c6a220b2109200a2d00004107470d000b200320032f01a0033b01c005200b41046a280200200b41086a2802002205470d01200541016a22092005490d0e2005410174220a20092009200a491b220aad420486220c422088a70d0e200ca722074100480d0e2005450d04200b28020020054104742007101e2209450d050c0b0b4110101f2209450d0720094180023b010c200942828080802037020420092006360200200920032f01a0033b010e2001410c6a2802002007470d09200741016a22052007490d0d2007410174220a20052005200a491b2205ad422c7e220c422088a70d0d200ca7220a4100480d0d2007450d0120082007412c6c200a101e2208450d020c080b200b28020021090c0a0b200a101f22080d060b200a41041020000b2007101f22090d060b200741041020000b411041081020000b412041081020000b411041041020000b2001410c6a2005360200200141086a20083602000b200141106a200741016a220d36020020082007412c6c6a220520032f00b0043b0001200541073a0000200542818080801037000820052009360004200520032902c005370210200541036a200341b2046a2d00003a0000200541186a200341c8056a290200370200200541206a200341c0056a41106a290200370200200541286a200341c0056a41186a2802003602004100210e0c020b200b2009360200200b41046a200a360200200b41086a28020021050b200920054104746a22054180023b010c200542828080802037020420052006360200200520032f01c0053b010e200b41086a2205200528020041016a360200200341c0006a200b10442003280244417f6a210e200141106a280200210d200141086a28020021080b200d412c6c2105200841586a210902400340410021062005450d01200541546a2105200941286a210a2009412c6a220b2109200a2d00004103470d000b200b41086a2802002205450d00200541286c2109200b28020041186a2105410021060340200620052d0000456a2106200541286a2105200941586a22090d000b0b200d412c6c2105200841586a2109024003404100210a2005450d01200541546a2105200941286a210b2009412c6a22072109200b2d00004103470d000b200741086a2802002205450d00200541286c2109200728020041186a21054100210a0340200a20052d0000456a210a200541286a2105200941586a22090d000b0b200d412c6c2105200841606a21090240024003402005450d01200541546a2105200941206a210b2009412c6a22072109200b2d00004104470d000b200728020021050c010b410021050b02402005200a6a220fad220c421e88a70d00200c420286a72205417f4c0d0002400240024002400240024002402005450d00200510792208450d02200f0d010c030b41042108200f450d030b2008200f4102746a2110410021114101211241042113200141106a2114412c211541082116200141086a211741582118415421194128211a410b211b4118211c4103211d2008211e4100211f0c030b200541041020000b410021050c020b410021050c010b410121050b03400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020050e020001010b200141086a2802002121412c2123200141106a2802002220450d2f0c010b024002400240024002400240024002400240201f0e050001030405050b024020112006490d002014280200222020156c220a21052017280200222120186a220b210902400340410021072005450d01200520196a21052009201a6a210d200920156a22222109200d2d0000201d470d000b202220166a2802002205450d002005201a6c21092022280200201c6a2105410021070340200720052d0000456a21072005201a6a2105200920186a22090d000b0b201120076b220720114b0d060340200a450d03200a20196a210a200b201a6a2105200b20156a2209210b20052d0000201b470d000b200920166a28020020074d0d0720092802002007201c6c6a2802082109200341c0056a2007200110ad0320032802c405210520032802c0052012460d08201e200520096a3602000b201120126a2111201e20136a221e2010470d0c410021050c3b0b20212d0000202a470d34202128020c2205450d34202128020422702005202b6c6a2171410021720c1b0b412c101f2205450d07200541286a41002800c9a042360000200541206a41002900c1a042370000200541186a41002900b9a042370000200541106a41002900b1a042370000200541086a41002900a9a042370000200541002900a1a0423700000c2e0b20840121c10102400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020b601208c01712205207c460d002005208d01470d01410021050c430b20b701208c01712205208d01460d0102402005207c470d000340208a012081016b208e014d0d0520810128020c450d092081012090016a2205280200450d0d2081012092016a2205280200450d112081012095016a21052081012094016a220921810120052802000d000b2009218101200528020421c2010c160b0340208a012081016b208e014d0d0520810128020c450d092081012090016a2205280200450d0d2081012092016a2205280200450d112081012095016a21052081012094016a220921810120052802000d000b20092181010c170b20b701208c01712205208d01460d0102402005207c470d000340208a012081016b208e014d0d0620810128020c450d0a2081012090016a2205280200450d0e2081012092016a2205280200450d122081012095016a21052081012094016a220921810120052802000d000b20092181010c120b0340208a012081016b208e014d0d0620810128020c450d0a2081012090016a2205280200450d0e2081012092016a2205280200450d132081012095016a21052081012094016a220921810120052802000d000b20092181010c1a0b20b901207c470d1a20830120b801460d1a0c3f0b20b901207c470d2a20830120b801460d29410321050c3f0b208101208a01460d412081012096016a2105034020810128020c450d1120052089016a21052081012089016a228101208a01470d000c420b0b0240208101208a01460d00208101208f016a2105034020810128020c450d1320052089016a21052081012089016a228101208a01470d000b208a012181010b20b901207c470d240c230b410121b701208101208a01460d2a2081012096016a2105034020810128020c450d1320052089016a21052081012089016a228101208a01470d000b208a012181012085010d2b0c3f0b0240208101208a01460d00208101208f016a2105034020810128020c450d1520052089016a21052081012089016a228101208a01470d000b208a012181010b20b901207c470d240c230b208101208f016a21052081012089016a218101200528020421c2010c0d0b208101208f016a21052081012089016a2181010c0e0b208101208f016a21052081012089016a2181010c080b208101208f016a21052081012089016a2181010c100b2081012091016a218101200528020421c2010c090b2081012091016a2181010c0a0b2081012091016a2181010c040b2081012091016a2181010c0c0b2081012093016a218101200528020421c2010c050b2081012093016a2181010c060b2081012093016a2181010b200528020421c2010c060b2081012093016a2181010c070b2005208b016a218101200528020021c2010b410121b60120c101218401410121b701200320c20136027c20080d1f0c2d0b20052097016a2181010b410021b701410121b60120c1012184012003200528020422c20136027c20080d1a0c2b0b2005208b016a218101200528020021c2010b410121b701410021b60120c101218401200320c20136027c20080d1a0c290b20052097016a2181010b410021b60120c101218401410021b7012003200528020422c20136027c20080d170c270b0340208201208801460d29200341286a20820110ae032003280228228301450d292082012087016a218201208301208301200328022c208d01746a22b801470d250c000b0b20bf01220520e2016a21bf01200528020021bb02200341e0006a21bc02200328026421bd020c100b024020c2022d0000220520c402460d000240200520d002460d00200520c802470d2720c20228020c2205450d2720c20228020422d202200520d1026c6a21d302410a21720c210b20c20228020421d702200341e0006a21d802200328026421d9020c110b20c20228020c2205450d2520c20228020422da02200520c5026c6a21db02410c21720c210b412c101f2205450d04200541286a410028009da042360000200541206a4100290095a042370000200541186a410029008da042370000200541106a4100290085a042370000200541086a41002900fd9f42370000200541002900f59f423700000c2a0b411e101f2205450d04200541166a41002900e3a042370000200541106a41002900dda042370000200541086a41002900d5a042370000200541002900cda042370000429e808080e003210c0c2a0b200341c8056a290300210c2008101d20050d2a41002108412c21232020450d2e0b2021202020236c6a212441142125200341b0046a41146a2126200341b0076a212741012128200341c0056a4101722129410b212a4118212b410c212c4104212d4102212e200341a4076a212f200341a0076a21304113213120034190076a213241d700213320034184076a213420034180076a2135412d2136200341f4066a2137200341f0066a213841122139200341e4066a213a200341e0066a213b200341d0066a213c4106213d200341c0066a213e4100213f200341b0066a21404184082141200341a0066a21424137214320034194066a214420034190066a214520034184066a214620034180066a2147200341f4056a2148200341f0056a21494120214a200341c0056a41206a214b41d600214c4110214d200341c0056a41106a214e4108214f200341b0046a41086a215041ac0121514109215241ffffffff032153200341e8056a2154200341e4056a2155200341f8056a215620034188066a215720034198066a2158200341a8066a2159200341a4066a215a200341b8066a215b200341b4066a215c200341c8066a215d200341c4066a215e200341d8066a215f200341d4066a2160200341e8066a2161200341f8066a216220034188076a216320034198076a216420034194076a2165200341a8076a21664208216742042168422021694103216a4170216b41ff01216c411a216d4201216e41f0adc400216f4101211f0c040b412c41011020000b412c41011020000b411e41011020000b4100211f410121050c2e0b410121050c2d0b410321720c0e0b410421720c0e0b410521720c0e0b410621720c0e0b410721720c0e0b410821720c0e0b410921720c0e0b410b21720c0f0b410021050c110b410121050c100b410221050c0f0b410221050c0e0b410221050c0d0b410221050c0c0b410421050c0b0b410421050c0a0b410421050c090b410421050c080b410421050c070b410421050c060b410421050c050b410421050c040b410421050c030b410421050c020b410421050c010b208301450d0320830128020021c201410121b601410221b70120c101218401208301208b016a218301410121b901200320c20136027c2008450d01410221050b03400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020050e05000102030f0f0b208501450d3a410121050c370b410221b60141002184014100218501200320c10122c20136027c2008450d37410221050c360b200f20c2014d0d05200820c201208d01746a2802002209450d0b20bb0120ba01470d0320ba01207c6a220520ba01490d4a20ba01207c74220a20052005200a491b22bb01ad20800186220c20980188a70d4a200ca72205207f480d4a20ba01450d0120bd0120ba01208d01742005101e22bc010d020c090b208301208b016a2105208301450d0320830128020021c201410121b901410221b701410021b60120c1012184012005218301200320c20136027c20080d180c350b2005101f22bc01450d070b20bc0121bd0120bc0121be0120bc0121bf010b20bf0120ba01208d01746a20c201360200200341c0056a200328027c22c301200341c8006a10b003200341c0056a2097016a22c40128020021c50120032802c40521c00120032802c00522c601207c460d0220c00128020822052099014c0d4520c0012d000c210b024002402005450d0020c00128020021072005101f220a450d06200a2007200510ce031a0c010b4101210a0b20c001209a016a2d000021072003200936029c012003200328027c360298012003207f36029001200320073a008d012003200b3a008c01200320053602880120032005360284012003200a3602800102400240200328027022c701208601460d00200328027421c8010c010b209b01101f22c701450d07410021c80120c70141003b010620c701410036020020c7012097016a200341c0056a209c0110ce031a20034100360274200320c7013602700b20ba01207c6a21ba010c090b410121b901410221b70120052183012085010d120c330b200341d4056a4101360200200341023602a403200341d0056a200341a0036a360200200342023702c405200341e0aec4003602c0052003200341fc006a3602a003200341b0046a200341c0056a102820032902b404228001422088a7210920032802b00421c001208001a721c5010c010b200341c0056a208f016a28020021090b20032802702003280274200341f8006a28020010b203024020bb01450d0020bc01101d0b0240207d450d00207d412c6c217c207e21050340200510452005412c6a2105207c41546a227c0d000b0b0240200341d4006a280200450d00207e101d0b200020c00136020420004101360200200041086a2009ad42208620c501ad843702002008450d39200f450d392008101d200424000f0b200541011020000b200541041020000b41940341041020000b4102211f410121050c3c0b02400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020720e0d000102060708090b0c0f101112120b207020256a22732802002274450d4d2070202c6a2175410021760c410b20c7012097016a210a20c7012f01062207208d01742109417f21050240024002400240024003402009450d012005207c6a2105207f209901207c200a280200220b20c3014b1b200b20c301461b220b450d04200920b3016a2109200a208b016a210a200b207c460d000b20c8010d010c020b2007210520c801450d010b20c8012099016a21c80120c7012005208d01746a209b016a28020021c701410121720c380b200341f0006a2097016a22092009280200207c6a360200200329039801210c20032903900121c90120032903880121ca0120032903800121cb0120c7012f01062209209e014f0d0120c7012097016a220a2005207c6a220b208d01746a200a2005208d01746a220a200920056b208d017410cf031a200a20c30136020020c7012092016a2209200b209f01746a20092005209f01746a220920c701209d016a220a2f010020056b209f017410cf031a200920a0016a200c370200200920c901370210200920ca01370208200920cb01370200200a200a2f0100207c6a3b010020c601450d220c480b20c7012005209f01746a220520a9016a200329039801370200200520aa016a220929020021c901200920032903900137020020052093016a20032903880137020020052092016a2205290200210c200520032903800137020020c90120b5018320800185500d46200c20b40183500d46200ca7101d0c460b209b01101f2209450d1b2009207f3b01062009207f36020020092097016a200341c0056a209c0110ce03210b200341c0056a20a0016a22cc0120c70120a1016a290200370300200341c0056a2096016a22cd0120c70120a2016a29020037030020c40120c70120a3016a290200370300200320c7012902f4013703c00520c70128022021ce01200b20c70120a4016a20c701209d016a22072f010020a5016a220a208d017410ce03210b20092092016a20c70120a6016a200a209f017410ce03210d2007209d013b01002009200a3b0106200341b0046a20a0016a22cf0120cc01290300370300200341b0046a2096016a22d00120cd01290300370300200341b0046a2097016a22d10120c401290300370300200320032903c0053703b004024002402005209d014b0d0020c7012097016a220a2005207c6a220b208d01746a200a2005208d01746a220720c701209d016a220a2f010020056b208d017410cf031a200720c30136020020c7012092016a2207200b209f01746a20072005209f01746a220b200a2f010020056b209f017410cf031a200b20a0016a200c370200200b20c901370210200b20ca01370208200b20cb013702000c010b200b200520b0016a221f208d01746a200b200520a5016a2207208d01746a2205200a20ab017120076b208d017410cf031a200520c301360200200d201f209f01746a200d2007209f01746a22052009209d016a220a2f010020076b209f017410cf031a200520a0016a200c370200200520c901370210200520ca01370208200520cb013702000b200a200a2f0100207c6a3b0100200341a0036a20a0016a22d20120cf01290300370300200341a0036a2096016a22d30120d001290300370300200341a0036a2097016a22d40120d101290300370300200320032903b0043703a00320034190026a20a0016a22d50120d20129030037030020034190026a2096016a22d60120d30129030037030020034190026a2097016a22d70120d401290300370300200320032903a0033703900220c70128020022d801450d0120c7012f010421d901200921da010c260b20d20120d50129030037030020d30120d60129030037030020d40120d70129030037030020032003290390023703a00320d90120ab0171210720d8012f0106220520ac014d0d0220a701101f220b450d1b200b207f3b0106200b207f360200200b2097016a200341c0056a20a80110ce03210920d8012090016a280200212220cc0120d80120a1016a29020037030020cd0120d80120a2016a29020037030020c40120d80120a3016a290200370300200320d80120ae016a2902003703c005200920d80120a4016a20d801209d016a221f2f0100220a20a5016a2205208d017410ce032178200b2092016a20d80120a6016a2005209f017410ce032179200b209b016a20d80120af016a200a20b0016a220d208d017410ce032120201f209d013b0100200b20053b01060240200d450d00410021052020210903402009280200220a20053b0104200a200b3602002009208b016a2109200d2005207c6a2205470d000b0b20cf0120cc0129030037030020d00120cd0129030037030020d10120c401290300370300200320032903c0053703b00420cc0120cf0129030037030020cd0120d00129030037030020c40120d101290300370300200320032903b0043703c0050240024020d90120ab01712209209d014b0d0020d8012097016a22052007207c6a220d208d0174220a6a20052007208d017422206a2205201f2f0100227820076b2279208d017410cf031a200520ce0136020020d8012092016a2205200d209f01746a20052007209f01746a22052079209f017410cf031a200520a0016a20d20129030037020020052096016a20d30129030037020020052097016a20d401290300370200200520032903a003370200201f2078207c6a22053b010020d801209b016a221f20206a2097016a201f200a6a221f200520ab0171220a200d6b208d017410cf031a201f20da013602002009200a4f0d0120d80120206a20ad016a21050340200528020022092007207c6a22073b0104200920d8013602002005208b016a2105200a2007470d000c020b0b2078200720b0016a220a208d0174221f6a2078200720a5016a2205208d01746a2209200b209d016a220d2f010020056b208d017410cf031a200920ce013602002079200a209f01746a20792005209f01746a2209200d2f010020056b209f017410cf031a200920a0016a20d20129030037020020092096016a20d30129030037020020092097016a20d401290300370200200920032903a003370200200d200d2f0100207c6a22093b010020202007208d017422ce016a20b1016a2020201f6a220d200920ab01712207200a6b208d017410cf031a200d20da01360200200a20074b0d00200b20ce016a20b2016a210903402009280200220a2005207c6a22053b0104200a200b3602002009208b016a210920072005470d000b0b20d50120cc0129030037030020d60120cd0129030037030020d70120c401290300370300200320032903c00537039002024020d8012802002205450d0020d8012f010421d901200521d801202221ce01200b21da01410221720c370b202221ce0120a701101f22050d010c1c0b2009210b20a701101f2205450d1b0b2005207f3b01062005207f36020020052097016a200341c0056a20a80110ce0321072005200328027022093602940320032003280274207c6a3602742009207f3b01042003200536027020092005360200200520052f0106220a209f01746a220920a9016a20d501290300370200200920aa016a20d60129030037020020092093016a20d70129030037020020092092016a2003290390023702002007200a208d01746a20ce013602002005209b016a200a207c6a2209208d01746a200b360200200520093b0106200b20093b0104200b200536020020c6010d430c1c0b20d8012097016a22092007207c6a220a208d0174220b6a20092007208d0174220d6a2209200520076b221f208d017410cf031a200920ce0136020020d8012092016a2209200a209f01746a20092007209f01746a2209201f209f017410cf031a200920a0016a20d20129030037020020092096016a20d30129030037020020092097016a20d401290300370200200920032903a00337020020d801209d016a2005207c6a22053b010020d801209b016a2209200d6a2097016a2009200b6a2209200520ab0171220b200a6b208d017410cf031a200920da013602002007200b4f0d4120d801200a2099016a2205208d01746a20ad016a210903402009280200220a2005207c6a22053b0104200a20d8013602002009208b016a2109200b2005470d000c420b0b20830120b801460d23208301450d4b20830128020021c201410121b601410221b70120c101218401208301208b016a218301410121b901200320c20136027c20080d2b0c490b208201208801460d4a200341206a20820110ae032003280220228301450d4a2082012087016a2182012083012003280224208d01746a21b8010c210b024020830120b801460d00208301208b016a2105208301450d0220830128020021c201410121b901410221b701410021b60120c1012184012005218301200320c20136027c20080d2c0c480b410121b90120b801218301410621720c340b410221b701208201208801460d03200341106a20820110ae032082012087016a21820120032802102205450d2320052003280214208d01746a21b80120052183010c210b410121b901410221b70120052183012085010d250c470b410121b90120b801218301410821720c330b410221b701208201208801470d010b2088012182012085010d210c440b200341186a20820110ae032082012087016a21820120032802182205450d1f20052283012005200328021c208d01746a22b801470d260c1d0b20bc02280200220b20dd016a210a200b2f0106220d20df01742109417f210502400240024003402009450d01200520e5016a210520e60120e30120e501200a280200220720bb024b1b200720bb02461b2207450d03200920e7016a2109200a20e2016a210a200720e501460d000b20bd020d010c080b200d210520bd02450d070b20bd0220e3016a21bd02200b200520df01746a20e4016a21bc02410921720c310b200b20e9016a200520e801746a2220450d0520202802182109202028021c210520ea01200e36020020ec0120ed013a000020ef0120f0013a000020f101200536020020f30120f4013a000020f501200e36020020f70120f8013a000020f901200936020020fb0120fc013a000020fe0120ff013a000020810220e6013a00002083022084023b01002086022087023a00002088022002360200208a0220f4013a0000208b02200e360200208d0220f8013a0000200341c0056a20e9016a2278200e360200208f0220ed013a00002091022092023a0000209402200536020020dc0120f4013a00002003200e3602c405200320f8013a00c0052020280208220d20db016a2205ad220c20960288a70d53200c20950286a7220920e3014c0d53202020dd016a2122024002400240024002402009450d002009101f2207450d0d2022280200220d450d020c010b41082107200d450d010b4100210b410021090340024020092005470d00200520e5016a220a2005490d59200520e50174221f200a200a201f491b220aad20950286220c20980288a70d59200ca7221f20e601480d59024002402005450d002007200520e20174201f101e22070d010c0b0b201f101f2207450d0a0b200a21050b2007200b6a220a2097023a0000200a20e2016a2009360200200a20ba026a200341a0036a20df016a2d00003a0000200a20e5016a20032f01a0033b0000200b20db016a210b200920e5016a220a2109200d200a470d000b2005200a6b2097024f0d020c010b4100210a200541006b2097024f0d010b200a2097026a2209200a490d55200520e50174220b20092009200b491b2209ad20950286220c20980288a70d55200ca7220b20e601480d55024002402005450d002007200520e20174200b101e22070d010c0e0b200b101f2207450d0d0b200921050b200341b0046a200341c0056a10b3032007200a20e201746a220920032903b004370300200920dd016a200341b0046a20dd016a220b290300370300200341b0046a20dc0110b30320092099026a200b290300370300200920032903b004370310200341b0046a20910210b3032009209a026a200b29030037030020092090026a20032903b004370300200341b0046a208f0210b3032009209b026a200b2903003703002009208e026a20032903b004370300200341b0046a208d0210b3032009209c026a200b2903003703002009208c026a20032903b004370300200341b0046a208a0210b3032009209d026a200b29030037030020092089026a20032903b004370300200341b0046a20860210b3032009209e026a200b29030037030020092085026a20032903b004370300200341b0046a20830210b3032009209f026a200b29030037030020092082026a20032903b004370300200341b0046a20810210b303200920a0026a200b29030037030020092080026a20032903b004370300200341b0046a20fe0110b303200920a1026a200b290300370300200920fd016a20032903b004370300200341b0046a20fb0110b303200920a2026a200b290300370300200920fa016a20032903b004370300200341b0046a20f70110b303200920a3026a200b290300370300200920f6016a20032903b004370300200341b0046a20f30110b303200920a4026a200b290300370300200920f2016a20032903b004370300200341b0046a20ef0110b303200920a5026a200b290300370300200920ee016a20032903b004370300200341b0046a20ec0110b303200920a6026a200b290300370300200920eb016a20032903b00437030002400240024002402005200a2097026a2209470d00200520e5016a22092005490d58200520e50174220b20092009200b491b221fad20950286220c20980288a70d58200ca7220920e601480d582005450d012007200520e201742009101e22070d020c100b2005211f0c020b2009101f2207450d0e0b200521090b2007200920e201746a220520ff013a0000200520dd016a20a702290000370000200520032900b004370001200341b0046a20034180016a20a80210ce031a20db01101f2209450d06200920ff013a0000200341a0036a200341b0046a20a80210ce031a2022280200220520e3014c0d53024002402005450d002020280200210b2005101f220d450d0b200d200b200510ce03210b2005101f220d450d0c200d200b200510ce031a200b101d2005ad210c0c010b4101210d41014101200510ce031a2005ad210c410021050b200341b0046a200341a0036a20a80210ce031a202031000d21c901200341a0036a200341b0046a20a80210ce031a200341b0046a200341a0036a20a80210ce031a20034190026a200341b0046a20a80210ce031a20db01101f220b450d07200a20db016a210a20be0220a9027121be0220bf0220aa028322bf02200c8420c90120ac02868420ad0284210c200b20ff013a0000200b101d200341a0036a20034190026a20a80210ce031a200341b0046a200341a0036a20a80210ce031a024020092d000020ae02470d00200928020820af0271450d002009280204101d0b2009101d20034190026a200341b0046a20a80210ce031a200341b0046a20034190026a20a80210ce031a20b00220be02360200200341a0036a209a026a200a36020020b202201f360200200341a0036a2090026a200736020020b30220e601360200200341a0036a2093026a20950237020020b402200c370200200341a0036a20dd016a20053602002003200d3602a403200320e5013602a003200341b0046a200341a0036a104e20034180016a200341b0046a20a80210ce031a202020e501360210202020e101360214024020032d00c00520ae02470d0020de0128020020af0271450d0020032802c405101d0b024020dc012d000020ae02470d00200341c0056a2099026a28020020af0271450d00209402280200101d0b02402091022d000020ae02470d00200341c0056a209a026a28020020af0271450d00200341c0056a20b1026a280200101d0b0240208f022d000020ae02470d00200341c0056a209b026a28020020af0271450d002078280200101d0b0240208d022d000020ae02470d00200341c0056a209c026a28020020af0271450d00208b02280200101d0b0240208a022d000020ae02470d00200341c0056a209d026a28020020af0271450d00208802280200101d0b02402086022d000020ae02470d00200341c0056a209e026a28020020af0271450d0020b502280200101d0b02402083022d000020ae02470d00200341c0056a209f026a28020020af0271450d0020b602280200101d0b02402081022d000020ae02470d00200341c0056a20a0026a28020020af0271450d0020b702280200101d0b024020fe012d000020ae02470d00200341c0056a20a1026a28020020af0271450d0020b802280200101d0b024020fb012d000020ae02470d00200341c0056a20a2026a28020020af0271450d0020f901280200101d0b024020f7012d000020ae02470d00200341c0056a20a3026a28020020af0271450d0020f501280200101d0b024020f3012d000020ae02470d00200341c0056a20a4026a28020020af0271450d0020f101280200101d0b024020ef012d000020ae02470d00200341c0056a20a5026a28020020af0271450d0020b902280200101d0b024020ec012d000020ae02470d00200341c0056a20a6026a28020020af0271450d0020ea01280200101d0b20bf0220ab028421bf0220e10120e5016a21e10120bf0120e001470d130c430b20d20228020c0d3520d20228021021d402200341e0006a21d502200328026421d6020c320b20d802280200220b20c8026a210a200b2f0106220d20c602742109417f21050240024003402009450d01200520cb026a210520cc0220c90220cb02200a280200220720d7024b1b200720d702461b2207450d04200920cd026a2109200a20c7026a210a200720cb02460d000b20d9020d010c410b200d210520d902450d400b20d90220c9026a21d902200b200520c602746a20ca026a21d802410b21720c2f0b20da022802182205450d3220da0228021022dc02200520c602746a21dd02410221050c310b200b20cf026a200520ce02746a2205450d3d2005280210450d0c20c20220c7026a20052802143602000c3d0b201f41081020000b4192a5c200418001103a000b411041081020000b411041081020000b200941081020000b200541011020000b200541011020000b200b41081020000b200941081020000b41940341041020000b41c40341041020000b41c40341041020000b4192a6c2004135103a000b4102211f0c020b4102211f0c020b4103211f0c020b410121050c3d0b410121050c3c0b410121050c3b0b410121720c0e0b410221720c0f0b410321720c100b410421720c100b410521720c100b410721720c110b410021050c210b410021050c200b410121050c1f0b410121050c1e0b410121050c1d0b410221050c1c0b410221050c1b0b410221050c1a0b410321050c190b410421050c180b410421050c170b410421050c160b410421050c150b410421050c140b410421050c130b410421050c120b410421050c110b410421050c100b410421050c0f0b410421050c0e0b410421050c0d0b410021050c010b410121050b0340024002400240024002400240024002400240024002400240024002400240024002400240024020050e03000102020b207620744f0d020240024002400240024020752802002076202d7422206a22052d0000202a470d0020032005202d6a2205360290022008450d08200f200528020022054d0d0420082005202e746a2802002209450d00202f200e360200203020313a0000203220333a000020342009360200203520363a00002037200e360200203820393a0000203a2005360200203b202a3a0000203c203d3a0000203e203f3a0000204020413b0100204220433a000020442002360200204520363a00002046200e360200204720393a00002048200e360200204920313a0000204b204c3a0000200341c0056a20256a22772009360200204e20363a0000202920032f00b0043b00002029202e6a200341b0046a202e6a2d00003a0000200320393a00c0052003200e3602c40520732802002222207620286a221f490d0a2073207636020020752802002105200341b0046a202b6a220d2027360200200341b0046a204d6a227820753602002050200520206a2207204d6a220b3602002003201f3602b004200341b0046a202c6a22792005201f202d74227a6a227b3602002026200341c0056a36020020032022201f6b22743602b404200b2105024020072d0000220a2051460d00410021050340200720056a21090240200a206c712052470d002009204f6a280200205371450d002009202d6a280200101d0b2005450d0320502009204a6a3602002005204d6a21052009204d6a2d0000220a2051470d000b200720056a204d6a21050b2005207b470d020c030b410121050c150b2009204d6a2205207b460d010b0340205020052209204d6a22053602000240024020092d0000220a2052460d00200a2051470d010c030b2009204f6a280200205371450d002009202d6a280200101d0b200b2005470d000b0b024002400240024002402074450d00201f20702802142205470d0120272220200341c0056a22096b202d7622050d020c040b2075202610b403205028020022052079280200220b470d140c150b20202005202d7422056b210a207528020020056a2105200341c0056a22092027460d01034020262009204d6a360200200341a0036a200910b30320032d00a0032051460d13200520032903a0033703002005204f6a200341a0036a204f6a2903003703002073207328020020286a3602000240200a450d002005204d6a2105200a206b6a210a20262802002209200d280200470d010c030b0b200d2802002220202628020022096b202d762205450d020b02400240024002402078280200220b202d6a2207280200220a20226b20054f0d00202220056a227b2022490d39200a2028742222207b207b2022491b2222ad206886220c206988a70d39200ca7227b203f480d39200a450d01200b280200200a202d74207b101e220a0d020c0d0b200b280200210a0c020b207b101f220a450d0b0b200b200a360200200720223602000b200a201f20056a2207202d746a200a207a6a2074202d7410cf031a200320073602b0042007200b280208220a460d01207620056a202d74200a202d7422056b210a200b28020020056a210520092020460d00034020262009204d6a360200200341a0036a200910b30320032d00a0032051460d12200520032903a0033703002005204f6a200341a0036a204f6a290300370300200b204f6a2209200928020020286a360200200a450d022005204d6a2105200a206b6a210a20262802002209200d280200470d000b0b200320513a00a003205028020022052079280200220b470d110c120b200341a0036a204f6a2205203f360200200320673703a003200341a0036a202610b40320032802a003222220052802002209202d7422076a210b20032802a403217b2022210502402009450d00024002400240024020782802002220202d6a2274280200220520032802b404220d20032802b00422096a221f6b2007202d75220a4f0d00201f200a6a227a201f490d382005202874221f207a207a201f491b227aad206886220c206988a70d38200ca7221f203f480d382005450d0120202802002005202d74201f101e22050d020c0d0b202028020021050c020b201f101f2205450d0b0b202020053602002074207a3602000b20052009200a6a220a202d74221f6a20052009202d746a200d202d7410cf031a2003200a3602b00420222105200a20202802082209460d0020202802002205201f6a217420052009202d746a210a2022210903402007450d0e200341a0036a202e6a22052009206a6a2d00003a0000200320092f00013b01a00320092d0000220d2051460d0d2009202d6a290200210c2009202c6a280200211f200a200d3a0000200a202c6a201f360200200a202d6a200c37020020032f01a003210d200a206a6a20052d00003a0000200a20286a200d3b00002020204f6a2205200528020020286a3602002007206b6a21072009204d6a22052109200a204d6a220a2074470d000b0b2005200b460d0e0c0d0b200341c0056a20256a20283602002003206d3602a403204e200341a0036a3602002003206e3702c4052003206f3602c005200320034190026a3602a003200341b0046a200341c0056a102820032802b0042205450d1c20032902b4042180012000200536020420004101360200200041086a2080013702002008450d28200f450d282008101d0c280b20d502280200220b20c8026a210a200b2f0106220d20c602742109417f210502400240024003402009450d01200520cb026a210520cc0220c90220cb02200a280200220720d4024b1b200720d402461b2207450d03200920cd026a2109200a20c7026a210a200720cb02460d000b20d6020d010c160b200d210520d602450d150b20d60220c9026a21d602200b200520c602746a20ca026a21d502410121050c120b200b20cf026a200520ce02746a2205450d132005280210450d0720d20220c0026a20052802143602000c130b20dc02222020c7026a21dc022020280200210b200341e0006a21052003280264211f024003402005280200220720c8026a210a20072f0106222220c602742109417f210502400240024003402009450d01200520cb026a210520cc0220c90220cb02200a280200220d200b4b1b200d200b461b220d450d03200920cd026a2109200a20c7026a210a200d20cb02460d000b201f0d010c040b20222105201f450d030b201f20c9026a211f2007200520c602746a20ca026a21050c010b0b200720cf026a200520ce02746a2205450d002005280210450d03202020052802143602000b20dc0220dd02470d070c110b41e0adc40020762074104b000b41a99fc20041cc00103a000b4192a6c2004135103a000b41b0aec400102c000b207b41081020000b201f41081020000b4192a6c2004135103a000b410221050c080b2009204d6a2205200b470d010c020b200b2205200b460d010b03400240024020052d000022092052460d0020092051470d010c030b2005204f6a280200205371450d002005202d6a280200101d0b2005204d6a2205200b470d000b0b207b450d002022101d0b205028020022052079280200220b460d010b0340205020052209204d6a22053602000240024020092d0000220a2052460d00200a2051470d010c030b2009204f6a280200205371450d002009202d6a280200101d0b200b2005470d000b0b024020032802b4042205450d00024020032802b004220b20782802002207204f6a220a2802002209460d00200728020022072009202d746a2007200b202d746a2005202d7410cf031a0b200a200520096a3602000b024020032d00c0052052470d00200341c0056a204f6a280200205371450d0020032802c405101d0b0240204e2d00002052470d00200341c0056a202b6a280200205371450d002077280200101d0b0240204b2d00002052470d002054280200205371450d002055280200101d0b024020492d00002052470d002056280200205371450d002048280200101d0b024020472d00002052470d002057280200205371450d002046280200101d0b024020452d00002052470d002058280200205371450d002044280200101d0b024020422d00002052470d002059280200205371450d00205a280200101d0b024020402d00002052470d00205b280200205371450d00205c280200101d0b0240203e2d00002052470d00205d280200205371450d00205e280200101d0b0240203c2d00002052470d00205f280200205371450d002060280200101d0b0240203b2d00002052470d002061280200205371450d00203a280200101d0b024020382d00002052470d002062280200205371450d002037280200101d0b024020352d00002052470d002063280200205371450d002034280200101d0b024020322d00002052470d002064280200205371450d002065280200101d0b024020302d00002052470d002066280200205371450d00202f280200101d0b410f21050b200520766a2276207328020022744f0d0a410021050c000b0b20da0220c5026a22da0220db02460d0b410c2172410421050c090b20d20220d1026a22d20220d302460d0a410a2172410421050c080b20c601450d010b20c501450d0120c001101d4102211f0c020b4102211f0c020b4102211f0c020b410121050c160b410121050c150b410121050c140b2070202b6a22702071460d0d41002172410421050c000b0b41a99fc20041cc00103a000b20c20220c1026a22c20220c302460d024104211f410121050c100b200341e0006a41086a200341f0006a41086a28020036020020032003290370370360207d412c6c2105207e41586a2109024003404100210a2005450d01200541546a2105200941286a210b2009412c6a22072109200b2d00004103470d000b200741086a2802002205450d00200541286c2109200728020041186a21054100210a0340200a20052d0000456a210a200541286a2105200941586a22090d000b0b207d412c6c2105207e41606a21090240024003402005450d01200541546a2105200941206a210b2009412c6a22072109200b2d00004104470d000b200728020021050c010b410021050b411021db01200341c0056a41106a22dc01200341c8006a41106a280200360200410821dd01200341c0056a41086a22de01200341c8006a41086a290300370300200320032903483703c00520034180016a200341c0056a104720ba01450d00410221df0120bf0120ba014102746a21e0012005200a6a21e101410421e201417f21e30141940321e401410121e501410021e601417c21e701410521e801413421e901200341a4076a21ea0141e00121eb01200341c0056a41e0016a21ec01411321ed0141d00121ee01200341c0056a41d0016a21ef0141d70021f00120034184076a21f10141c00121f201200341c0056a41c0016a21f301412d21f401200341f4066a21f50141b00121f601200341c0056a41b0016a21f701411221f801200341e4066a21f90141a00121fa01200341c0056a41a0016a21fb01410b21fc0141900121fd01200341c0056a4190016a21fe01410621ff01418001218002200341c0056a4180016a21810241f000218202200341c0056a41f0006a21830241840821840241e000218502200341c0056a41e0006a218602413721870220034194066a21880241d000218902200341c0056a41d0006a218a0220034184066a218b0241c000218c02200341c0056a41c0006a218d024130218e02200341c0056a41306a218f024120219002200341c0056a41206a21910241d6002192024114219302200341c0056a41146a2194024204219502421c219602410f219702422021980241182199024128219a024138219b0241c800219c0241d800219d0241e800219e0241f800219f0241880121a00241980121a10241a80121a20241b80121a30241c80121a40241d80121a50241e80121a602200341b7046a21a702418c0121a80241807e21a902428080808080804021aa024280808080808c0121ab02422821ac024280808080800c21ad02410921ae0241ffffffff0321af02200341cc036a21b002412421b102200341a0036a41246a21b202200341bc036a21b302200341ac036a21b402200341a4066a21b502200341b4066a21b602200341c4066a21b702200341d4066a21b80220034194076a21b902410321ba024103211f0c020b024020bb01450d0020be01101d0b200341c0056a20034180016a418c0110ce031a200341b0046a200341c0056a1049411021c002200341b0046a41106a2802002205450d00412c21c10220032802b80422c2022005412c6c6a21c302410a21c402411c21c502410221c602410421c702410821c802417f21c90241940321ca02410121cb02410021cc02417c21cd02410521ce02413421cf02410921d002411421d1024104211f0c020b200341bc046a29020021800120032802b004210520032902b40421980120032802602003280264200328026810b203200020c0026a208001370200200041086a20980137020020002005360204200041003602002008450d06200f450d062008101d200424000f0b410121050c0c0b410121050c0b0b42ac808080c005210c0b2008101d0b2000200536020420004101360200200041086a200c3702000b200141086a280200217c0240200141106a2802002203450d002003412c6c2105207c21030340200310452003412c6a2103200541546a22050d000b0b2001410c6a280200450d00207c101d0b200424000f0b202120236a22212024470d010b200341c8006a41106a2205200141106a280200360200200341c8006a41086a227c200141086a290200370300200320012902003703482005280200227d20236c2105207c280200227e41586a217c0240024003402005450d01200541546a2105207c41286a2109207c20236a227f217c20092d00004108470d000b200341386a207f104420032802382109200328023c21050c010b410021090b2005410020091b210a207d412c6c2105207e41586a217c200941f8b3c20020091b2181010240024003402005450d01200541546a2105207c41286a2109207c412c6a227f217c20092d0000410a470d000b200341306a207f104420032802302109200328023421050c010b410021090b2005410020091b210b207d412c6c2105207e41586a217c200941f8b3c20020091b2182010240024003404100217f2005450d01200541546a2105207c41286a2109207c412c6a228301217c20092d00004109470d000b20830128020021840141012185010c010b41002185010b2003420037027441f0c0c100218601200341f0c0c100360270411c218701208201200b411c6c6a2188014114218901208101200a41146c6a218a014104218b0141ff01218c014101217c4102218d0141cf00218e01410c218f01412021900141282191014134219201413c21930141d00021940141c8002195014110219601410821970142022180014220219801417f219901410d219a01419403219b01418c03219c014106219d01410b219e014105219f01411821a001418c0221a10141840221a20141fc0121a301412421a401417921a50141940221a60141c40321a70141bc0321a80141cc0021a90141c40021aa0141ffff0321ab01410a21ac0141980321ad0141f40121ae0141b00321af01417a21b001416c21b10141fc0221b201417c21b30142808080807021b40142ffffffff0f21b501410021b601410021b701410021b801410021b901410021ba01410021bb01410421bc01410421bd01410421be01410421bf010c010b4101211f0c010b4102211f0c010b410121050c010b410121050c000b0b102e000b1021000bcdb6020f2b7f017ece017f027e257f017e7b7f017e0c7f017e0d7f017e347f017e237f230041d0006b2203240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d0000417f6a2204410d4b0d00024020040e0e00090607030a0c080e050d02040b000b200141186a2802002105200141146a2802002106200141106a28020021072001410c6a2802002108200141086a2802002109200141046a280200210a200241046a280200200241086a2802002204470d16200441016a220b2004490d5b2004410174220c200b200b200c491b220c4100480d5b2004450d2d20022802002004200c101e220b450d2e0c570b2001410c6a280200210b200141086a2802002107200141046a280200210520012d00012108200241046a280200200241086a2802002204470d0d200441016a22062004490d5a2004410174220d20062006200d491b220d4100480d5a2004450d1c20022802002004200d101e2206450d1d0c540b2001410c6a280200210e200141086a280200210f200141046a2802002110200241046a280200200241086a2802002204470d0d200441016a220b2004490d5920044101742205200b200b2005491b22054100480d592004450d1d200228020020042005101e220b450d1e0c510b2001410c6a2802002111200141086a2802002112200141046a2802002113200241046a280200200241086a2802002204470d0d200441016a220b2004490d5820044101742205200b200b2005491b22054100480d582004450d1e200228020020042005101e220b450d1f0c4e0b200141146a2802002114200141106a28020021152001410c6a2802002116200141086a2802002117200141056a2d00002118200141046a2d00002119200241046a280200200241086a2802002204470d0d200441016a220b2004490d5620044101742205200b200b2005491b22054100480d562004450d1f200228020020042005101e220b450d200c4b0b2001410c6a280200211a200141086a280200211b200141046a280200211c200241046a280200200241086a2802002204470d0d200441016a220b2004490d5620044101742205200b200b2005491b22054100480d562004450d20200228020020042005101e220b450d210c480b2001410c6a280200211d200141086a280200211e200141046a280200211f200241046a280200200241086a2802002204470d0d200441016a220b2004490d5520044101742205200b200b2005491b22054100480d552004450d21200228020020042005101e220b450d220c450b2001410c6a2802002106200141086a2802002120200141046a2802002121200241046a280200200241086a2802002204470d0d200441016a220b2004490d5420044101742205200b200b2005491b22054100480d542004450d22200228020020042005101e220b450d230c420b2001410c6a2802002106200141086a2802002122200141046a2802002123200241046a280200200241086a2802002204470d0d200441016a220b2004490d5320044101742205200b200b2005491b22054100480d532004450d23200228020020042005101e220b450d240c3f0b2001410c6a2802002106200141086a2802002124200141046a2802002125200241046a280200200241086a2802002204470d0e200441016a220b2004490d5220044101742205200b200b2005491b22054100480d522004450d26200228020020042005101e220b450d270c3c0b2001410c6a2802002126200141086a2802002127200141046a2802002128200241046a280200200241086a2802002204470d0e200441016a220b2004490d5120044101742205200b200b2005491b22054100480d512004450d27200228020020042005101e220b450d280c390b200141286a2802002129200141246a280200212a200141206a280200212b2001411c6a2802002108200141186a280200212c200141146a280200212d2001410c6a290200212e200141086a2802002109200141046a280200212f200241046a280200200241086a2802002204470d0e200441016a220b2004490d4f20044101742205200b200b2005491b22054100480d4f2004450d28200228020020042005101e220b450d290c360b2001410c6a2802002130200141086a2802002131200141046a2802002132200241046a280200200241086a2802002204470d0e200441016a220b2004490d4f20044101742205200b200b2005491b22054100480d4f2004450d29200228020020042005101e220b450d2a0c330b2001410c6a2802002133200141086a2802002134200141046a2802002135200241046a280200200241086a2802002204470d0e200441016a220b2004490d4e20044101742205200b200b2005491b22054100480d4e2004450d2a200228020020042005101e220b450d2b0c300b200141046a2802002104200241046a280200200241086a280200220b470d0e200b41016a2205200b490d4d200b4101742206200520052006491b22064100480d4d200b450d2b2002280200200b2006101e2205450d2c0c2d0b200228020021060c470b2002280200210b0c440b2002280200210b0c410b2002280200210b0c3e0b2002280200210b0c3b0b2002280200210b0c380b2002280200210b0c350b2002280200210b0c320b2002280200210b0c410b2002280200210b0c2e0b2002280200210b0c2b0b2002280200210b0c280b2002280200210b0c250b2002280200210b0c220b200228020021050c1f0b200d101f22060d370b200d41011020000b2005101f220b0d330b200541011020000b2005101f220b0d2f0b200541011020000b2005101f220b0d2b0b200541011020000b2005101f220b0d270b200541011020000b2005101f220b0d230b200541011020000b2005101f220b0d1f0b200541011020000b2005101f220b0d1b0b200541011020000b200c101f220b0d290b200c41011020000b2005101f220b0d150b200541011020000b2005101f220b0d110b200541011020000b2005101f220b0d0d0b200541011020000b2005101f220b0d090b200541011020000b2005101f220b0d050b200541011020000b2006101f22050d010b200641011020000b20022005360200200241046a2006360200200241086a280200210b0b200241086a200b41016a3602002005200b6a41083a00004101210d410021064100210b024002400240024003400240200b2006470d0020064101742205200641016a220720072005491b22054100480d24024002402006450d00200d20062005101e220d0d010c040b2005101f220d450d030b200521060b200d200b6a200441807f72200441ff0071200441077622051b3a0000200b41016a210b2005210420050d000b200b417f6a210a200241086a2107200241046a2137200b210503400240024002400240203728020020072802002204470d00200441016a22082004490d2720044101742209200820082009491b22094100480d272004450d01200228020020042009101e22080d020c060b200228020021080c020b2009101f2208450d040b2002200836020020372009360200200728020021040b2007200441016a360200200820046a200541807f72200541ff0071200541077622041b3a00002004210520040d000b0240200241046a2802002205200241086a28020022046b200a4d0d00200228020021050c040b2004200b6a22072004490d2220054101742204200720072004491b22044100480d22024002402005450d00200228020020052004101e2205450d010c040b2004101f22050d030b200441011020000b200541011020000b200941011020000b20022005360200200241046a2004360200200241086a28020021040b200241086a2004200b6a360200200520046a200d200b10ce031a4101213702402006450d00200d101d0b4101210d410521040c1c0b2002200b360200200241046a2005360200200241086a28020021040b410121eb01410821ec01200241086a200441016a360200200b20046a410a3a0000410021ed01200341246a22ee0141003602002003420137021c200320023602182035203341186c6a21ef01410721f00141ff0021f10141807f21f201410021f301410021f401203321f5010240024041004100460d004116214d0c010b4115214d411121040c1b0b411121040c1a0b2002200b360200200241046a2005360200200241086a28020021040b410121de01410821df01200241086a200441016a360200200b20046a41063a0000410021e001200341cc006a22e10141003602002003420137024420032002360240203220304104746a21e201410721e30141ff0021e40141807f21e501410021e601410021e701203021e8010240024041004100460d004112214d0c010b4111214d411121040c190b411121040c180b2002200b360200200241046a2005360200200241086a28020021040b200241086a200441016a360200200b20046a41003a0000202e422088a72107410121da014100210b4100210541002104202ea722db0121060240024002400340024020052004470d00200441016a220b2004490d1c200441017422dc01200b200b20dc01491b220b4100480d1c024002402004450d0020da012004200b101e22da010d010c040b200b101f22da01450d030b200b21040b20da0120056a200641807f72200641ff0071200641077622dc011b3a0000200541016a210520dc01210620dc010d000b200420056b20db014f0d02200520db016a220b2005490d1a20044101742206200b200b2006491b220b4100480d1a024002402004450d0020da012004200b101e22da01450d010c030b200b101f22da010d020b200b41011020000b200b41011020000b200b21040b20da0120056a202f20db0110ce031a02402009450d00202f101d200b21040b20db0120056a21dc01024002400240024002400340024020dc012004470d00200441016a220b2004490d1e20044101742205200b200b2005491b220b4100480d1e024002402004450d0020da012004200b101e22da010d010c040b200b101f22da01450d030b200b21040b20da0120dc016a200741807f72200741ff0071200741077622051b3a000020dc0141016a21dc012005210720050d000b024002400240202d450d002008210503400240024002400240200b20dc01470d00200b41016a2204200b490d24200b4101742206200420042006491b22044100480d24200b450d0120da01200b2004101e22da010d020c090b200b21040c020b2004101f22da01450d070b200b21dc012004210b0b20da0120dc016a200541807f72200541ff0071200541077622061b3a000020dc0141016a21dc012006210520060d000b200420dc016b20084f0d0620dc0120086a220b20dc01490d1f20044101742205200b200b2005491b220b4100480d1f2004450d0120da012004200b101e22da01450d020c050b200b2104410121dd010c060b200b101f22da010d030b200b41011020000b200b41011020000b200441011020000b200b21040b20da0120dc016a202d200810ce031a20dc0120086a21dc01410021dd01202c450d00202d101d0b202b20294104746a21c1022029210b0240024003400240024002400240200420dc01470d00200441016a22052004490d1e20044101742206200520052006491b222f4100480d1e2004450d0120da012004202f101e22da010d020c050b2004212f0c020b202f101f22da01450d030b200421dc01202f21040b20da0120dc016a200b41807f72200b41ff0071200b41077622051b3a000020dc0141016a21dc012005210b20050d000b02402029450d00411021c202410821c302410c21c402417f21c502410621c602410121c702410021c802410721c90241ff0021ca0241807f21cb02410221cc02410321cd0241c00021ce0241ff0121cf02410421d002410521d102202b21db01411d214d0c020b202b21db01410421040c180b202f41011020000b411121040c160b2002200b360200200241046a2005360200200241086a28020021040b200241086a200441016a360200200b20046a41053a0000200341c0006a410c6a220a4100360200200342013702442003200236024020282026410c6c6a21094101210741002105410021042026210b024002400240024002400340024020042005470d00200541016a22062005490d1d20054101742208200620062008491b22064100480d1d024002402005450d00200720052006101e22070d010c040b2006101f2207450d030b200341c0006a41086a200636020020032007360244200621050b200a200441016a2208360200200720046a200b41807f72200b41ff0071200b41077622061b3a0000200821042006210b20060d000b0240024002400240024002402026450d002026410c6c41746a210b202821040340200441046a28020022054102460d02200320042802002005200441086a280200200341c0006a105120032d00002205411a470d042004410c6a2104200b41746a220b4174470d000c030b0b202821090c010b2004410c6a21090b20282026410c6c6a20096b2104024003402004450d01200441746a21042009280204210b2009410c6a2109200b4102470d000b0b02402027450d002028101d0b200341c0006a41086a280200213d200328024421092003280240220541046a2108200341cc006a2802002237210b034002400240024002402008280200200541086a22062802002204470d00200441016a22072004490d232004410174220d20072007200d491b220d4100480d232004450d0120052802002004200d101e22070d020c090b200528020021070c020b200d101f2207450d070b200520073602002008200d360200200628020021040b2006200441016a360200200720046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b0240200541046a280200220b200541086a28020022046b20374f0d00200420376a22062004490d1f200b4101742204200620062004491b22044100480d1f200b450d022005280200200b2004101e220b450d030c070b2005280200210b0c070b20032f000120032d0003411074722107200341086a290300212e200328020421082004410c6a210402400340200b450d01200b41746a210b200428020421062004410c6a210420064102470d000b0b02402027450d002028101d0b0240200341c0006a41086a280200450d002003280244101d0b200020073b0001200020053a0000200041036a20074110763a0000200041086a202e370000200041046a20083600004100219c03410121c6014101210c4101219d030c040b2004101f220b0d040b200441011020000b200641011020000b200d41011020000b410d21040c160b2005200b360200200541046a2004360200200541086a28020021040b200541086a200420376a360200200b20046a2009203710ce031a0240203d450d002009101d0b4100213d410121374101210d41012138410121394101213a4101213b4101213c410621040c140b2002200b360200200241046a2005360200200241086a28020021040b200241086a200441016a360200200b20046a41013a0000202520064104746a21c8014100210b410021c901410021ca01410121cb0120062104024002400340024020c90120ca01470d00200b20c90141016a22052005200b491b22ca014100480d18024020c901450d0020cb0120c90120ca01101e22cb010d010c030b20ca01101f22cb01450d020b20cb0120c9016a200441807f72200441ff0071200441077622051b3a0000200b41026a210b20c90141016a21c9012005210420050d000b02402006450d00411021cc01410521cd01410121ce01410021cf01410421d001410221d101410721d20141ff0021d30141807f21d401417f21d501413f21d60141c00021d701202521d8014110214d0c020b202521d901410321040c140b20ca0141011020000b411121040c120b2002200b360200200241046a2005360200200241086a28020021040b200241086a200441016a360200200b20046a41073a00002023200641146c6a21b7014100210b410021b801410021b901410121ba0120062104024002400340024020b80120b901470d00200b20b80141016a22052005200b491b22b9014100480d16024020b801450d0020ba0120b80120b901101e22ba010d010c030b20b901101f22ba01450d020b20ba0120b8016a200441807f72200441ff0071200441077622051b3a0000200b41026a210b20b80141016a21b8012005210420050d000b02402006450d00411421bb01410421bc01410121bd01411021be01410721bf0141ff0021c00141807f21c101410021c201410221c301202321c401410f214d0c020b202321c501410221040c120b20b90141011020000b411121040c100b2002200b360200200241046a2005360200200241086a28020021040b200241086a200441016a360200200b20046a41033a0000202120064102746a21ab014100210b410021ac01410021ad01410121ae01200621040240024002400340024020ac0120ad01470d00200b20ac0141016a22052005200b491b22ad014100480d15024020ac01450d0020ae0120ac0120ad01101e22ae010d010c030b20ad01101f22ae01450d020b20ae0120ac016a200441807f72200441ff0071200441077622051b3a0000200b41026a210b20ac0141016a21ac012005210420050d000b2006450d01410121af01410421b001410721b10141ff0021b20141807f21b301410021b401410221b501202121b601410e214d0c020b20ad0141011020000b410121040c0f0b411121040c0e0b2002200b360200200241046a2005360200200241086a28020021040b41012188014108218901200241086a200441016a360200200b20046a41023a00004100218a01200341cc006a228b0141003602002003420137024420032002360240201f201d41286c6a218c014107218d0141ff00218e0141807f218f0141002190014100219101201d2192010240024041004100460d00410c214d0c010b410b214d411121040c0d0b411121040c0c0b2002200b360200200241046a2005360200200241086a28020021040b4101216841082169200241086a200441016a360200200b20046a41093a00004100216a200341cc006a226b41003602002003420137024420032002360240201c201a411c6c6a216c4107216d41ff00216e41807f216f4100217041002171201a21720240024041004100460d004107214d0c010b4106214d411121040c0b0b411121040c0a0b2002200b360200200241046a2005360200200241086a28020021040b200241086a200441016a360200200b20046a41003a00000240024002400240024002404104101f225c450d00205c41eec2b5ab0636000002400240024002400240024002400240024020194101460d00024020194102460d0020194103470d024100215d4101215e2017215f20162160201521614101216241012163410121644101101f2265450d1b410021040c180b2003410036023020034201370328200341306a21094101210741002105410021042017210b0340024020042005470d00200541016a22062005490d1a20054101742208200620062008491b22064100480d1a024002402005450d00200720052006101e22070d010c0b0b2006101f2207450d0a0b2003200636022c20032007360228200621050b2009200441016a2208360200200720046a200b41807f72200b41ff0071200b41077622061b3a0000200821042006210b20060d000b201620144104746a21d2022014450d03201621d3022017450d04410421d402201620144104746a22d50241706a21d602410021d702410121d802411021d902417f21da02410821db02410721dc0241ff0021dd0241807f21de02411a21df02201721e002410021e102201621e2024105214d0c0c0b4100215e20034100360230200342013703282003410c6a2014360200200341086a20153602002003201636020420032017360200200341c0006a2003200341286a105220032d004022e302411a470d01200341286a41086a2802002161200328022c21602003280228215f41012162410021634100215d41012118410121644101101f22650d090c190b4101215f410021044100210b20152105034002400240024002402004200b470d00200441016a220b2004490d1b20044101742206200b200b2006491b22604100480d1b2004450d01205f20042060101e225f0d020c0b0b200421600c020b2060101f225f450d090b2004210b206021040b205f200b6a200541807f72200541ff0071200541077622061b3a0000200b41016a210b2006210520060d000b2060200b6b20154f0d0c200b20156a2204200b490d1620604101742205200420042005491b22044100480d162060450d03205f20602004101e225f450d040c0b0b20032d0043411074210420032f0041210b200341c0006a41086a29030021f003200328024421f1030240200328022c450d002003280228101d0b200b20047221f203410e21040c140b201621d3020b20d30220d202460d06410f21040c120b2004101f225f0d070b200441011020000b200641011020000b206041011020000b410441011020000b410021040c0c0b411021040c0b0b411121040c0a0b200421600b205f200b6a2017201510ce031a200b20156a21614101215e02402016450d002017101d0b41002163410121624101215d41002118410121644101101f2265450d0b410021040c080b2002200b360200200241046a2005360200200241086a28020021040b200241086a200441016a360200200b20046a41043a0000200341c0006a410c6a220a4100360200200342013702442003200236024020132011410c6c6a21094101210741002105410021042011210b0240024002400240024002400340024020042005470d00200541016a22062005490d1020054101742208200620062008491b22064100480d10024002402005450d00200720052006101e22070d010c040b2006101f2207450d030b200341c0006a41086a200636020020032007360244200621050b200a200441016a2208360200200720046a200b41807f72200b41ff0071200b41077622061b3a0000200821042006210b20060d000b0240024002400240024002402011450d002011410c6c41746a21052013210b0340200b41046a28020022074102460d02200b41086a2802002108200b280200210a0240024002400240200341c0006a41086a2228280200200341c0006a410c6a22262802002204470d00200441016a22062004490d1920044101742227200620062027491b22274100480d192004450d01200328024420042027101e22060d020c0d0b200328024421060c020b2027101f2206450d0b0b20282027360200200320063602440b2026200441016a360200200620046a41f0003a00002003200a20072008200341c0006a105120032d00002206411a470d04200b410c6a210b200541746a22054174470d000c030b0b201321090c010b200b410c6a21090b20132011410c6c6a20096b2104024003402004450d01200441746a21042009280204210b2009410c6a2109200b4102470d000b0b02402012450d002013101d0b200341c0006a41086a280200213d200328024421092003280240220541046a2108200341cc006a2802002237210b034002400240024002402008280200200541086a22062802002204470d00200441016a22072004490d162004410174220d20072007200d491b220d4100480d162004450d0120052802002004200d101e22070d020c090b200528020021070c020b200d101f2207450d070b200520073602002008200d360200200628020021040b2006200441016a360200200720046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b0240200541046a280200220b200541086a28020022046b20374f0d00200420376a22062004490d12200b4101742204200620062004491b22044100480d12200b450d022005280200200b2004101e220b450d030c080b2005280200210b0c080b20032f000120032d0003411074722107200341086a290300212e20032802042108200b410c6a2104024003402005450d01200541746a21052004280204210b2004410c6a2104200b4102470d000b0b02402012450d002013101d0b0240200341c0006a41086a280200450d002003280244101d0b200020073b0001200020063a0000200041036a20074110763a0000200041086a202e370000200041046a20083600004100219d03410121c6014101210c0c050b2004101f220b0d050b200441011020000b200641011020000b200d41011020000b202741011020000b410c21040c080b2005200b360200200541046a2004360200200541086a28020021040b200541086a200420376a360200200b20046a2009203710ce031a0240203d450d002009101d0b4100213e410121374101210d41012138410121394101213a4101213b4101213c4101213d410721040c060b2002200b360200200241046a2005360200200241086a28020021040b4101214241082143200241086a200441016a360200200b20046a410b3a000041002144200341cc006a2245410036020020034201370244200320023602402010200e411c6c6a21464107214741ff00214841807f21494100214a4100214b200e214c0240024041004100460d004101214d0c010b4100214d411121040c050b411121040c040b20022006360200200241046a200d360200200241086a28020021040b200241086a220d200441016a360200200620046a20083a000002400240024002400240200241046a2802002206200d28020022046b200b4f0d002004200b6a22082004490d0920064101742204200820082004491b22044100480d092006450d01200228020020062004101e2206450d020c030b200228020021060c030b2004101f22060d010b200441011020000b20022006360200200241046a2004360200200241086a28020021040b200241086a2004200b6a360200200620046a2005200b10ce031a410021364101213702402007450d002005101d0b4101210d41012138410121394101213a4101213b4101213c4101213d4101213e4101213f4101214041012141410821040c020b2002200b360200200241046a200c360200200241086a28020021040b4101210c200241086a200441016a360200410021c601200b20046a41003a0000200341146a2005360200200341106a20063602002003200736020c20032008360208200320093602042003200a360200200341c0006a200320021053200320032900413703282003200341c0006a41086a29000037002f02400240024020032d00402204411a470d00410021c701410121374101210d41012138410121394101213a4101213b4101213c4101213d4101213e4101213f4101214041012141410121360c010b20002003290328370001200020043a0000200041086a200329002f3700000c010b410921040c010b410b21040b034002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040e12000102030405060708090a1c1d1e1f232429290b206520183a0000410121044101210b20612105034002400240024002402004200b470d00200420646a220b2004490de70220042064742206200b200b2006491b22664100480de7022004450d01206520042066101e22650d020c2b0b200421660c020b2066101f2265450d290b2004210b206621040b2065200b6a200541807f72200541ff0071200541077622061b3a0000200b20646a210b2006210520060d000b2066200b6b20614f0d15200b20616a2204200b490de20220664101742205200420042005491b22044100480de2022066450d13206520662004101e2265450d160c140b02402020450d002021101d0b200241086a2105200241046a210720ac01210b03400240024002400240200728020020052802002204470d00200441016a22062004490de70220044101742208200620062008491b22084100480de7022004450d01200228020020042008101e22060d020c280b200228020021060c020b2008101f2206450d260b2002200636020020072008360200200528020021040b2005200441016a360200200620046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b0240200241046a280200220b200241086a28020022046b20ac014f0d00200420ac016a22052004490de302200b4101742204200520052004491b22044100480de302200b450d0a2002280200200b2004101e220b450d0e0c0b0b2002280200210b0c0b0b20c50120b701460d27034020c501410c6a2802004104460d28024020c50141046a280200450d0020c501280200101d0b20c50141146a22c50120b701470d000c280b0b20d90120c801460d27034020d901410d6a2d00004105460d28024020d90141046a280200450d0020d901280200101d0b20d90141106a22d90120c801470d000c280b0b202b20294104746a210b02400340200b20db01460d0120db01280200210420db0141106a21db0120044108470d000b0b0240202a450d00202b101d0b200241086a2105200241046a210720dc01210b03400240024002400240200728020020052802002204470d00200441016a22062004490de30220044101742208200620062008491b22084100480de3022004450d01200228020020042008101e22060d020c260b200228020021060c020b2008101f2206450d240b2002200636020020072008360200200528020021040b2005200441016a360200200620046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b0240200241046a280200220b200241086a28020022046b20dc014f0d00200420dc016a22052004490ddf02200b4101742204200520052004491b22044100480ddf02200b450d0c2002280200200b2004101e220b450d0f0c0d0b2002280200210b0c0d0b410121380c5a0b4101213e410721040cdb020b4101213f0c060b410121c701410921040cd9020b2000411a3a0000024020012d00002204410e4b0d000240024002400240024002400240024002400240024002400240024020040e0f0009080703050a0b0d0e0c02060401000b2036450dd902200141086a280200450dd902200141046a280200101d200341d0006a24000f0b2037450dd8020240200141086a280200450d00200141046a280200101d0b0240200141146a2802002202450d00200141186a280200450d002002101d0b200141246a280200450dd802200141206a280200101d200341d0006a24000f0b2039450dd702410c21eb022001410c6a2802002204450d43411821ec02410421ed02200141046a28020022ee02200441186c6a21ef02411421f002411021f102410921f202410821f30241ffffffff0321f402417021f5024121214d0cab020b203f450dd602200141086a280200450dd602200141046a280200101d200341d0006a24000f0b200d450dd502200141046a2d000022044102460d2120044101460d2020040d222001410c6a280200450dd502200141086a280200101d200341d0006a24000f0b203e450dd402200141086a280200450dd402200141046a280200101d200341d0006a24000f0b2038450dd302410c21f6022001410c6a2802002204450d41411c21f702410421f802200141046a28020022f9022004411c6c6a21fa02410821fb02411421fc02411021fd02410921fe0241ffffffff0321ff0241702180034122214d0ca9020b2040450dd20202402001410c6a2802002204450d00200141046a2802002102200441286c210403400240200241046a280200450d002002280200101d0b0240200241106a280200450d002002410c6a280200101d0b200241286a2102200441586a22040d000b0b200141086a280200450dd202200141046a280200101d200341d0006a24000f0b2041450dd10202402001410c6a2802002204450d00200141046a28020021022004410474210403400240200241046a280200450d002002280200101d0b200241106a2102200441706a22040d000b0b200141086a280200450dd102200141046a280200101d200341d0006a24000f0b20c701450dd0020240200141086a280200450d00200141046a280200101d0b200141146a280200450dd002200141106a280200101d200341d0006a24000f0b203d450dcf02200141086a280200450dcf02200141046a280200101d200341d0006a24000f0b203c450dce022001410c6a2802002204450d3e4104218103200141046a28020022820320044104746a21830341102184034109218503410821860341ffffffff0321870341702188034123214d0ca6020b203a450dcd02410c2189032001410c6a2802002204450d3f411c218a034104218b03200141046a280200228c032004411c6c6a218d034108218e034114218f034110219003410921910341ffffffff0321920341702193034124214d0ca7020b203b450dcc0202402001410c6a2802002204450d00200141046a2802002102200441146c210403400240200241046a280200450d002002280200101d0b200241146a21022004416c6a22040d000b0b200141086a280200450dcc02200141046a280200101d200341d0006a24000f0b200110450ccb020b02402031450d002032101d0b200341c0006a41086a280200213d200328024421092003280240220541046a2108200341cc006a2802002237210b034002400240024002402008280200200541086a22062802002204470d00200441016a22072004490dde022004410174220d20072007200d491b220d4100480dde022004450d0120052802002004200d101e22070d020c220b200528020021070c020b200d101f2207450d200b200520073602002008200d360200200628020021040b2006200441016a360200200720046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b0240200541046a280200220b200541086a28020022046b20374f0d00200420376a22062004490dda02200b4101742204200620062004491b22044100480dda02200b450d0e2005280200200b2004101e220b450d110c0f0b2005280200210b0c0f0b2004101f220b450d030b2002200b360200200241046a2004360200200241086a28020021040b200241086a200420ac016a360200200b20046a20ae0120ac0110ce031a4100213f41012137024020ad01450d0020ae01101d0b4101210d41012138410121394101213a4101213b4101213c4101213d4101213e0b410121400c5f0b200441011020000b2004101f220b450d020b2002200b360200200241046a2004360200200241086a28020021040b200241086a200420dc016a360200200b20046a20da0120dc0110ce031a0240202f450d0020da01101d0b4101210d41002137202d450ddb0120dd01450ddc01202c450ddd01202d101d0cda010b200441011020000b2004101f2265450d020b200421660b2065200b6a205f206110ce031a02402060450d00205f101d0b200b20616a216702400240024020194102460d00024020194101460d0020190d02205d20164572450d030c2c0b205e450d2b2014450d2a2014410c6c210b201621040340024020042802002205450d00200441046a280200450d002005101d0b2004410c6a2104200b41746a220b0d000c2b0b0b2062450d2a2014450d29410421e402201620144104746a21e502411021e602410c21e702410821e802417421e902201621ea024120214d0c92020b2063201645720d290b2017101d0c280b200441011020000b2004101f220b450d020b2005200b360200200541046a2004360200200541086a28020021040b200541086a200420376a360200200b20046a2009203710ce031a0240203d450d002009101d0b4100213c410121374101210d41012138410121394101213a4101213b0cc3020b200441011020000b4101219d03410c21040cc5020b4101219c03410d21040cc4020b4101210b0c450b200041086a20f003370200200041046a20f103360200200020f20341087420e30272360200205c101d0c4a0b0240200141146a2802002204450d002001410c6a28020021022004410c6c2104034002402002280200220b450d00200241046a280200450d00200b101d0b2002410c6a2102200441746a22040d000b0b200141106a280200450db4022001410c6a280200101d200341d0006a24000f0b200141146a2802002204450d50410c21f3032001410c6a28020022f40320044104746a21f503411021f603410821f703410421f803417421f9034125214d0c8f020b2001410c6a280200450db202200141086a280200101d200341d0006a24000f0b411021fa03410c21fb03417421fc03410421fd03411e214d0c80020b2015450d5a2016101d0c5a0b200841011020000b200841011020000b206641011020000b200d41011020000b0240024002400240024002400240024002400240024002400240024002400240024002400240024002400240204d0e280100031a3c280504071e3f09080b0c0d0e100f37391312152552535455265f60292c2e30325d6769690b200328024421040c010b204a20426a2204204a490dcd02204a204274220b20042004200b491b220b2044480dcd0202400240204a450d002003280244204a200b101e22040d010c87010b200b101f2204450d86010b200341c0006a20436a200b360200200320043602442045280200214b0b2045204b20426a3602002004204b6a204c204972204c204871204c20477622041b3a000002402004450d002004214c200341c0006a20436a280200224a2045280200224b470dad014100214d0ce3010b200e450d15411c214e4118214f41142150410821514107215241ff00215341807f2154200341cc006a21554101215641002157411a2158201021594102214d0ce4010b2059204e6a215a2059280204220a450d152059204f6a2802002108205920506a2802002126205920516a290200212e2059280200210b2059280210210903400240024002400240200341c0006a20516a220528020020552802002204470d00200420566a22062004490dd00220042056742207200620062007491b22072057480dd0022004450d01200328024420042007101e22060d020c720b200328024421060c020b2007101f2206450d700b2005200736020020032006360244205528020021040b2055200420566a360200200620046a200b205472200b205371200b20527622041b3a00002004210b20040d000b2003202e37022c2003200a3602282003200341286a200341c0006a101b20032d0000225b2058470d372008210b03400240024002400240200528020020552802002204470d00200420566a22062004490dd00220042056742207200620062007491b22072057480dd0022004450d01200328024420042007101e22060d020c740b200328024421060c020b2007101f2206450d720b2005200736020020032006360244205528020021040b2055200420566a360200200620046a200b205472200b205371200b20527622041b3a00002004210b20040d000b02400240024002402005280200220b205528020022046b20084f0d00200420086a22062004490dcf02200b2056742204200620062004491b22042057480dcf02200b450d012003280244200b2004101e220b0d020c96010b2003280244210b0c020b2004101f220b450d94010b200520043602002003200b360244205528020021040b2055200420086a360200200b20046a2009200810ce031a02402026450d002009101d0b205a2159205a2046470dac010c170b200328024421040c010b207020686a22042070490dca022070206874220b20042004200b491b220b206a480dca02024002402070450d0020032802442070200b101e22040d010c84010b200b101f2204450d83010b200341c0006a20696a200b36020020032004360244206b28020021710b206b207120686a360200200420716a2072206f722072206e712072206d7622041b3a000002402004450d0020042172200341c0006a20696a2802002270206b2802002271470dae014106214d0ce8010b201a450d15411c21734118217441142175410821764107217741ff00217841807f2179200341cc006a217a4101217b4100217c411a217d4102217e4104217f201c2180014108214d0ce9010b20800120736a2181012080012802042208450d1520800120746a280200210720800120756a28020021820120800120766a290200212e208001280210218301208001280200210b03400240024002400240200341c0006a20766a228401280200207a2802002204470d002004207b6a22052004490dcd022004207b742206200520052006491b2206207c480dcd022004450d01200328024420042006101e22050d020c6f0b200328024421050c020b2006101f2205450d6d0b208401200636020020032005360244207a28020021040b207a2004207b6a360200200520046a200b207972200b207871200b20777622041b3a00002004210b20040d000b2003202e37022c200320083602282003200341286a200341c0006a101b20032d0000228501207d470d362083012007207e746a2186012007210b03400240024002400240208401280200207a2802002204470d002004207b6a22052004490dcd022004207b742206200520052006491b2206207c480dcd022004450d01200328024420042006101e22050d020c710b200328024421050c020b2006101f2205450d6f0b208401200636020020032005360244207a28020021040b207a2004207b6a360200200520046a200b207972200b207871200b20777622041b3a00002004210b20040d000b2007450dbe02208301218701410021040c9b020b200328024421040c010b2090012088016a2204209001490dc60220900120880174220b20042004200b491b220b208a01480dc60202400240209001450d002003280244209001200b101e22040d010c81010b200b101f2204450d80010b200341c0006a2089016a200b36020020032004360244208b012802002191010b208b012091012088016a36020020042091016a209201208f0172209201208e0171209201208d017622041b3a000002402004450d002004219201200341c0006a2089016a280200229001208b01280200229101470dad01410b214d0ceb010b201d450d1441082193014128219401410421950141242196014120219701411c219801411a2199014119219a014114219b014110219c014101219d01200341cc006a219e014100219f0141f00021a001410221a101410321a201417f21a301413f21a40141c00021a50141ff0121a601410721a70141ff0021a80141807f21a901201f21aa01410d214d0cec010b20032093016a220620aa0122042093016a2802003602002003200429020037030020042094016a21aa0120042d00182205209501460d1420042096016a280000212620042097016a280000212820042098016a280000210b20042099016a2d000021112004209a016a2c000021272004209b016a28020021092004209c016a2802002107200428020c2108200341186a2093016a2204200628020036020020032003290300370318200341286a2093016a220a2004280200360200200320032903183703282003200341286a200341c0006a105420032d00002204209901470d42200a20093602002003200736022c200320083602282003200341286a200341c0006a105420032d00002204209901470d4302400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402005209d01460d000240200520a101460d00200520a201470d02200341c0006a2093016a220b280200209e012802002204470d052004209d016a22052004490dde022004209d01742206200520052006491b2206209f01480dde022004450d0d200328024420042006101e22050d0e0cae010b200341c0006a2093016a2207280200209e012802002204470d022004209d016a22052004490ddd022004209d01742206200520052006491b2206209f01480ddd022004450d06200328024420042006101e22050d070caa010b200341c0006a2093016a2205280200209e012802002204470d022004209d016a22072004490ddc022004209d01742208200720072008491b2208209f01480ddc022004450d08200328024420042008101e22070d090caa010b200341c0006a2093016a2206280200209e012802002204470d032004209d016a22052004490ddb022004209d01742207200520052007491b2207209f01480ddb022004450d0d200328024420042007101e22050d0e0cac010b200328024421050c050b200328024421070c070b200328024421050c090b200328024421050c0b0b2006101f2205450da3010b2007200636020020032005360244209e0128020021040b209e012004209d016a360200200520046a20a1013a00002003200b20282026200341c0006a105120032d00002204209901460d0c0c650b2008101f2207450da1010b2005200836020020032007360244209e0128020021040b209e012004209d016a360200200720046a209d013a000002402005280200209e012802002204470d002004209d016a22072004490dd2022004209d01742208200720072008491b2208209f01480dd2022004450d07200328024420042008101e22070d080ca1010b200328024421070c080b2006101f2205450da0010b200b200636020020032005360244209e0128020021040b209e012004209d016a360200200520046a20a2013a00000240200b280200209e012802002204470d002004209d016a22052004490dcf022004209d01742206200520052006491b2206209f01480dcf022004450d08200328024420042006101e22050d090ca1010b200328024421050c090b2007101f2205450d9e010b2006200736020020032005360244209e0128020021040b209e012004209d016a360200200520046a209f013a0000034002400240024002402006280200209e012802002204470d002004209d016a22052004490dd0022004209d01742207200520052007491b2207209f01480dd0022004450d01200328024420042007101e22050d020c86010b200328024421050c020b2007101f2205450d84010b2006200736020020032005360244209e0128020021040b209e012004209d016a360200200520046a200b20a90172200b20a80171200b20a7017622041b3a00002004210b20040d000c040b0b2008101f2207450d99010b2005200836020020032007360244209e0128020021040b209e012004209d016a360200200720046a20a0013a00002003200b20282026200341c0006a105120032d00002204209901470d5a0b20aa01208c01470daf010c180b2006101f2205450d98010b200b200636020020032005360244209e0128020021040b209e012004209d016a360200200520046a202720a30173220420a4017120a501722004202720a3014a1b3a00000240024002400240200b280200209e012802002204470d002004209d016a22052004490dc8022004209d01742206200520052006491b2206209f01480dc8022004450d01200328024420042006101e22050d020c9b010b200328024421050c020b2006101f2205450d99010b200b200636020020032005360244209e0128020021040b209e012004209d016a360200200520046a201120a60171209f01473a000020aa01208c01470dad010c150b20ac0120af0174210b20b60120b0016a210620b60128020021040340024020ac0120ad01470d0020ac0120af016a220520ac01490dc502200b20052005200b491b22ad0120b401480dc502024020ac01450d0020ae0120ac0120ad01101e22ae010d010c630b20ad01101f22ae01450d620b20ae0120ac016a200420b30172200420b20171200420b1017622051b3a0000200b20b5016a210b20ac0120af016a21ac012005210420050d000b200621b601200620ab01470dad01410121040cc1020b20c40120bb016a21c50120c40128020c220920bc01460dc70120c401280204210a20c401280200210820b80120bd0174210520c40120be016a280200210b20c401280208220721040340024020b80120b901470d0020b80120bd016a220620b801490dc4022005200620062005491b22b90120c201480dc402024020b801450d0020ba0120b80120b901101e22ba010d010c630b20b901101f22ba01450d620b20ba0120b8016a200420c10172200420c00171200420bf017622061b3a0000200520c3016a210520b80120bd016a21b8012006210420060d000b02400240024020b90120b8016b20074f0d0020b80120076a220420b801490dc50220b90120bd01742205200420042005491b220420c201480dc50220b901450d0120ba0120b9012004101e22ba010d020c85010b20b90121040c010b2004101f22ba01450d83010b20ba0120b8016a2008200710ce031a200720046b20b8016a21050240200a450d002008101d0b024002402005450d00200720b8016a2105200421b9010c010b200420bd016a22052004490dc302200420bd01742206200520052006491b22b90120c201480dc302024002402004450d0020ba01200420b901101e22ba010d010c8a010b20b901101f22ba01450d89010b200421050b20ba0120056a20093a0000200520bd016a21b801200520bd017420c3016a21040340024020b80120b901470d0020b80120bd016a220520b801490dc4022004200520052004491b22b90120c201480dc402024020b801450d0020ba0120b80120b901101e22ba010d010c640b20b901101f22ba01450d630b20ba0120b8016a200b20c10172200b20c00171200b20bf017622051b3a0000200420c3016a210420b80120bd016a21b8012005210b20050d000b20c50121c40120c50120b701470dad010c080b20d80120cc016a21d90120d8012d000d222620cd01460dc70120d8012d000c210420d801280208210920d801280204212820d801280200210a024020ca0120c901470d0020c90120ce016a220b20c901490dc20220c90120ce01742205200b200b2005491b22ca0120cf01480dc202024020c901450d0020cb0120c90120ca01101e22cb010d010c84010b20ca01101f22cb01450d83010b20cb0120c9016a20043a000020c90120ce016a210420c90120ce0174220b20d0016a2108200b20d1016a21052009210b0340200821070240200420ca01470d00200420ce016a22062004490dc3022005200620062005491b22ca0120cf01480dc30202402004450d0020cb01200420ca01101e22cb010d010c640b20ca01101f22cb01450d630b20cb0120046a200b20d40172200b20d30171200b20d2017622061b3a0000200720d1016a2108200520d1016a2105200420ce016a21042006210b20060d000b0240024002402009450d004100210b024003402004200b6a2105200a200b6a2c0000220620d001460d010240200520ca01470d00200520ce016a22082005490dc7022007200820082007491b22ca0120cf01480dc70202402005450d0020cb01200520ca01101e22cb010d010c6d0b20ca01101f22cb01450d6c0b20cb0120046a200b6a200620d50173220520d6017120d701722005200620d5014a1b3a0000200720d1016a21072009200b20ce016a220b470d000b2004200b6a21050b2028450d020c010b200421052028450d010b200a101d0b024002400240024002400240202620d001470d0020ca012005470d02200520ce016a22042005490dc702200520ce0174220b20042004200b491b22ca0120cf01480dc7022005450d0120cb01200520ca01101e22cb010d020c90010b024020ca012005470d00200520ce016a22042005490dc702200520ce0174220b20042004200b491b220420cf01480dc7022005450d0320cb0120052004101e22cb010d040c91010b20ca0121040c030b20ca01101f22cb01450d8e010b20cb0120056a20cf013a00000c020b2004101f22cb01450d8d010b20cb0120056a20ce013a000002400240024002402004200520ce016a2205470d00200420ce016a220b2004490dc602200420ce01742205200b200b2005491b22ca0120cf01480dc6022004450d0120cb01200420ca01101e22cb010d020c91010b200421ca010c020b20ca01101f22cb01450d8f010b200421050b20cb0120056a202620d2017120d301733a00000b200520ce016a21c90120d90121d80120d90120c801470dad010c080b200328024421040c010b20e60120de016a220420e601490dbf0220e60120de0174220b20042004200b491b220b20e001480dbf020240024020e601450d00200328024420e601200b101e22040d010c7b0b200b101f2204450d7a0b200341c0006a20df016a200b3602002003200436024420e10128020021e7010b20e10120e70120de016a360200200420e7016a20e80120e5017220e80120e4017120e80120e3017622041b3a000002402004450d00200421e801200341c0006a20df016a28020022e60120e10128020022e701470dac014111214d0cec010b2030450d102030410474210a411021e9012032210403402004410d6a2d000022094102460d24200441086a28020021ea01200441046a2802002126200428020021282004410c6a2c000021060240024002400240200341c0006a41086a2207280200200341c0006a410c6a2205280200220b470d00200b41016a2208200b490dc302200b4101742227200820082027491b22274100480dc302200b450d012003280244200b2027101e22080d020c8a010b200328024421080c020b2027101f2208450d88010b20072027360200200320083602442005280200210b0b2005200b41016a3602002008200b6a2006417f73220b413f7141c00072200b2006417f4a1b3a0000024002400240024020072802002005280200220b470d00200b41016a2206200b490dc302200b4101742208200620062008491b22084100480dc302200b450d012003280244200b2008101e22060d020c8b010b200328024421060c020b2008101f2206450d89010b20072008360200200320063602442005280200210b0b2005200b41016a3602002006200b6a20094100473a0000200341286a41086a20ea013602002003202636022c20032028360228200441106a210b2003200341286a200341c0006a101b20032d000022ea01411a470d27200b2104200a41706a220a0d000ccc010b0b200328021c21040c010b20f30120eb016a220420f301490dbc0220f30120eb0174220b20042004200b491b220b20ed01480dbc020240024020f301450d00200328021c20f301200b101e22040d010c790b200b101f2204450d780b200341186a20ec016a200b3602002003200436021c20ee0128020021f4010b20ee0120f40120eb016a360200200420f4016a20f50120f2017220f50120f1017120f50120f0017622041b3a000002402004450d00200421f501200341186a20ec016a28020022f30120ee0128020022f401470dac014115214d0cef010b2033450d0e410121f601200341017221f701411821f801411421f901411021fa01410c21fb01200341286a410c6a21fc01420121fd01422021fe01410321ff01410721800241ff0021810241807f21820241002183024108218402200341286a41086a2185024104218602410921870241ffffffff0321880241ac012189024170218a024102218b02200341026a218c02411a218d024178218e02417c218f0241ff01219002417f219102413f21920241c00021930220352194024117214d0cf0010b20940220f8016a219502209402280200229602450d0e20940220f9016a28020021970220940220fa016a28020021980220940228020c219902209402290204212e4100219a0220fc014100360200200320fd0137022c209602202e20fe0188a7229b0220ff01746a219c022003200341186a360228202ea7219d024100219e0241004100460d8c02410121040c8d020b02402022450d002023101d0b200241086a2105200241046a210720b801210b03400240024002400240200728020020052802002204470d00200441016a22062004490dbe0220044101742208200620062008491b22084100480dbe022004450d01200228020020042008101e22060d020c7a0b200228020021060c020b2008101f2206450d780b2002200636020020072008360200200528020021040b2005200441016a360200200620046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b0240200241046a280200220b200241086a28020022046b20b8014f0d00200420b8016a22052004490dba02200b4101742204200520052004491b22044100480dba02200b450d2f2002280200200b2004101e220b450d320c300b2002280200210b0c300b02402024450d002025101d0b200241086a2105200241046a210720c901210b03400240024002400240200728020020052802002204470d00200441016a22062004490dbd0220044101742208200620062008491b22084100480dbd022004450d01200228020020042008101e22060d020c7a0b200228020021060c020b2008101f2206450d780b2002200636020020072008360200200528020021040b2005200441016a360200200620046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b0240200241046a280200220b200241086a28020022046b20c9014f0d00200420c9016a22052004490db902200b4101742204200520052004491b22044100480db902200b450d2a2002280200200b2004101e220b450d2d0c2b0b2002280200210b0c2b0b2010215a0b205a2046460d01411c21a602411421a702410c21a802410821a902410421aa02411021ab02410921ac0241ffffffff0321ad02417021ae024103214d0ccf010b205a2802042205450d00205a20a7026a2802002106205a20a9026a2802002107205a28021021080240205a20a8026a2802002204450d00200420aa0274210b200521040340024020042d000020ac02470d00200420a9026a28020020ad0271450d00200420aa026a280200101d0b200420ab026a2104200b20ae026a220b0d000b0b02402007450d002005101d0b205a20a6026a215a02402006450d002008101d0b205a2046470d96010b0240200f450d002010101d0b200341c0006a41086a280200213d200328024421092003280240220541046a2108200341cc006a2802002237210b034002400240024002402008280200200541086a22062802002204470d00200441016a22072004490db8022004410174220d20072007200d491b220d4100480db8022004450d0120052802002004200d101e22070d020c770b200528020021070c020b200d101f2207450d750b200520073602002008200d360200200628020021040b2006200441016a360200200720046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b0240200541046a280200220b200541086a28020022046b20374f0d00200420376a22062004490db402200b4101742204200620062004491b22044100480db402200b450d2e2005280200200b2004101e220b450d320c2f0b2005280200210b0c2f0b201c2181010b208101206c460da902411c21af02411421b002410c21b102410821b202410421b302411021b402410921b50241ffffffff0321b602417021b7024109214d0cd3010b2081012802042205450da80220810120b0026a280200210620810120b2026a28020021072081012802102108024020810120b1026a2802002204450d00200420b30274210b200521040340024020042d000020b502470d00200420b2026a28020020b60271450d00200420b3026a280200101d0b200420b4026a2104200b20b7026a220b0d000b0b02402007450d002005101d0b20810120af026a21810102402006450d002008101d0b208101206c470d96010ca8020b201f21aa010b20aa01208c01460d00034020aa0141186a2d00004104460d0120aa0141106a280200210420aa01410c6a280200210b024020aa0141046a280200450d0020aa01280200101d0b02402004450d00200b101d0b20aa0141286a22aa01208c01470d000b0b0240201e450d00201f101d0b200341c0006a41086a280200213d200328024421092003280240220541046a2108200341cc006a2802002237210b034002400240024002402008280200200541086a22062802002204470d00200441016a22072004490db3022004410174220d20072007200d491b220d4100480db3022004450d0120052802002004200d101e22070d020c720b200528020021070c020b200d101f2207450d700b200520073602002008200d360200200628020021040b2006200441016a360200200720046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b200541046a280200220b200541086a28020022046b20374f0d05200420376a22062004490dae02200b4101742204200620062004491b22044100480dae02200b450d352005280200200b2004101e220b450d3a0c360b203222b80220e201470d130cbc010b20352195020b20950220ef01460d9d02411821b902411421ba02411021bb02410421bc02410921bd02410821be0241ffffffff0321bf02417021c0024118214d0ce1010b209502280200220b450d9c0220950220ba026a280200210420950220bb026a280200210620950228020c21050240209502280204450d00200b101d0b02402004450d00200420bc0274210b200521040340024020042d000020bd02470d00200420be026a28020020bf0271450d00200420bc026a280200101d0b200420bb026a2104200b20c0026a220b0d000b0b20950220b9026a21950202402006450d002005101d0b20950220ef01470d9b010c9c020b20db01220520c2026a21db012005280200220620c302460db101200520c3026a280200210b2005280204210402400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200620c5026a220620c6024b0d00200520c4026a2802002108024002400240024020060e0700050203010607000b202f20dc01470d0b202f20c7026a2205202f490dda02202f20c702742206200520052006491b220620c802480dda02202f450d1b20da01202f2006101e22da010d1c0cb3010b202f20dc01470d06202f20c7026a2205202f490dd902202f20c702742206200520052006491b220720c802480dd902202f450d0e20da01202f2007101e22da010d0f0caf010b202f20dc01470d06202f20c7026a2205202f490dd802202f20c702742206200520052006491b220720c802480dd802202f450d1020da01202f2007101e22da010d110caf010b202f20dc01470d06202f20c7026a2205202f490dd702202f20c702742206200520052006491b220720c802480dd702202f450d1220da01202f2007101e22da010d130caf010b202f20dc01470d06202f20c7026a2205202f490dd602202f20c702742206200520052006491b220620c802480dd602202f450d1420da01202f2006101e22da010d150cab010b202f20dc01470d07202f20c7026a2205202f490dd502202f20c702742206200520052006491b220620c802480dd502202f450d1920da01202f2006101e22da010d1a0caf010b202f20dc01470d07202f20c7026a2205202f490dd402202f20c702742206200520052006491b220620c802480dd402202f450d1b20da01202f2006101e22da010d1c0caf010b202f20dc01470d07202f20c7026a2205202f490dd302202f20c702742206200520052006491b220620c802480dd302202f450d1d20da01202f2006101e22da010d1e0caf010b202f21070c090b202f21070c0b0b202f21070c0d0b202f21060c0f0b202f21060c110b202f21060c130b202f21060c150b202f21060c170b2007101f22da01450da0010b202f21dc010b20da0120dc016a20d1023a000020dc0120c7026a21050340024002400240024020072005470d00200720c7026a22052007490dcd02200720c702742206200520052006491b220620c802480dcd022007450d0120da0120072006101e22da010d020c760b200721060c020b2006101f22da01450d740b20072105200621070b20da0120056a200420cb0272200420ca0271200420c9027622dc011b3a0000200520c7026a210520dc01210420dc010d000b0340024002400240024020062005470d00200620c7026a22042006490dcd02200620c702742205200420042005491b220420c802480dcd022006450d0120da0120062004101e22da010d020c770b200621040c020b2004101f22da01450d750b20062105200421060b20da0120056a200b20cb0272200b20ca0271200b20c9027622dc011b3a0000200520c7026a210520dc01210b20dc010d000b200820ce027121dc01200820ca027121090240024002400240200820c90275220b0d0020dc01450d010b0340024020dc0120cf0271450d00200b20c502460d020b024002400240024020042005470d00200420c7026a22052004490dd002200420c702742206200520052006491b220620c802480dd0022004450d0120da0120042006101e22da010d020c93010b200421060c020b2006101f22da01450d91010b20042105200621040b20da0120056a200820cb02723a0000200b20ce027121dc01200b20ca02712109200520c7026a2105200b2108200b20c902752207210b20070d00200621042007210b20dc010d000b20062005470d020c010b200422062005470d010b200620c7026a22042006490dc902200620c70274220b20042004200b491b222f20c802480dc9022006450d1720da012006202f101e22da010d180ca6010b2006212f0c180b2007101f22da01450d9e010b202f21dc010b20da0120dc016a20cd023a000020dc0120c7026a21050340024002400240024020072005470d00200720c7026a22052007490dca02200720c702742206200520052006491b220620c802480dca022007450d0120da0120072006101e22da010d020c750b200721060c020b2006101f22da01450d730b20072105200621070b20da0120056a200420cb0272200420ca0271200420c9027622dc011b3a0000200520c7026a210520dc01210420dc010d000b0340024002400240024020062005470d00200620c7026a22042006490dca02200620c702742205200420042005491b220420c802480dca022006450d0120da0120062004101e22da010d020c760b200621040c020b2004101f22da01450d740b20062105200421060b20da0120056a200b20cb0272200b20ca0271200b20c9027622dc011b3a0000200520c7026a210520dc01210b20dc010d000b200820ce027121dc01200820ca027121090240024002400240200820c90275220b0d0020dc01450d010b0340024020dc0120cf0271450d00200b20c502460d020b024002400240024020042005470d00200420c7026a22052004490dcd02200420c702742206200520052006491b220620c802480dcd022004450d0120da0120042006101e22da010d020c91010b200421060c020b2006101f22da01450d8f010b20042105200621040b20da0120056a200820cb02723a0000200b20ce027121dc01200b20ca02712109200520c7026a2105200b2108200b20c902752207210b20070d00200621042007210b20dc010d000b20062005470d020c010b200422062005470d010b200620c7026a22042006490dc602200620c70274220b20042004200b491b222f20c802480dc6022006450d1720da012006202f101e22da010d180ca4010b2006212f0c180b2007101f22da01450d9c010b202f21dc010b20da0120dc016a20d0023a000020dc0120c7026a21050340024002400240024020072005470d00200720c7026a22052007490dc702200720c702742206200520052006491b220620c802480dc7022007450d0120da0120072006101e22da010d020c740b200721060c020b2006101f22da01450d720b20072105200621070b20da0120056a200420cb0272200420ca0271200420c9027622dc011b3a0000200520c7026a210520dc01210420dc010d000b0340024002400240024020062005470d00200620c7026a22042006490dc702200620c702742205200420042005491b220420c802480dc7022006450d0120da0120062004101e22da010d020c750b200621040c020b2004101f22da01450d730b20062105200421060b20da0120056a200b20cb0272200b20ca0271200b20c9027622dc011b3a0000200520c7026a210520dc01210b20dc010d000b200820ce027121dc01200820ca027121090240024002400240200820c90275220b0d0020dc01450d010b0340024020dc0120cf0271450d00200b20c502460d020b024002400240024020042005470d00200420c7026a22052004490dca02200420c702742206200520052006491b220620c802480dca022004450d0120da0120042006101e22da010d020c8f010b200421060c020b2006101f22da01450d8d010b20042105200621040b20da0120056a200820cb02723a0000200b20ce027121dc01200b20ca02712109200520c7026a2105200b2108200b20c902752207210b20070d00200621042007210b20dc010d000b20062005470d020c010b200422062005470d010b200620c7026a22042006490dc302200620c70274220b20042004200b491b222f20c802480dc3022006450d1720da012006202f101e22da010d180ca2010b2006212f0c180b2006101f22da01450d96010b202f21dc010b20da0120dc016a20c8023a000020dc0120c7026a21dc0103400240024002400240200620dc01470d00200620c7026a22052006490dc402200620c7027422dc012005200520dc01491b220520c802480dc4022006450d0120da0120062005101e22da010d020c6b0b200621050c020b2005101f22da01450d690b200621dc01200521060b20da0120dc016a200420cb0272200420ca0271200420c9027622071b3a000020dc0120c7026a21dc012007210420070d000b03400240024002400240200520dc01470d00200520c7026a22042005490dc402200520c702742206200420042006491b222f20c802480dc4022005450d0120da012005202f101e22da010d020c6c0b2005212f0c020b202f101f22da01450d6a0b200521dc01202f21050b20da0120dc016a200b20cb0272200b20ca0271200b20c9027622041b3a000020dc0120c7026a21dc012004210b20040d000c0d0b0b2006101f22da01450d97010b202f21dc010b20da0120dc016a20c7023a000020dc0120c7026a21dc0103400240024002400240200620dc01470d00200620c7026a22052006490dc102200620c7027422dc012005200520dc01491b220520c802480dc1022006450d0120da0120062005101e22da010d020c700b200621050c020b2005101f22da01450d6e0b200621dc01200521060b20da0120dc016a200420cb0272200420ca0271200420c9027622071b3a000020dc0120c7026a21dc012007210420070d000b03400240024002400240200520dc01470d00200520c7026a22042005490dc102200520c702742206200420042006491b222f20c802480dc1022005450d0120da012005202f101e22da010d020c710b2005212f0c020b202f101f22da01450d6f0b200521dc01202f21050b20da0120dc016a200b20cb0272200b20ca0271200b20c9027622041b3a000020dc0120c7026a21dc012004210b20040d000c0a0b0b2006101f22da01450d95010b202f21dc010b20da0120dc016a20cc023a000020dc0120c7026a21dc0103400240024002400240200620dc01470d00200620c7026a22052006490dbe02200620c7027422dc012005200520dc01491b220520c802480dbe022006450d0120da0120062005101e22da010d020c6f0b200621050c020b2005101f22da01450d6d0b200621dc01200521060b20da0120dc016a200420cb0272200420ca0271200420c9027622071b3a000020dc0120c7026a21dc012007210420070d000b03400240024002400240200520dc01470d00200520c7026a22042005490dbe02200520c702742206200420042006491b222f20c802480dbe022005450d0120da012005202f101e22da010d020c700b2005212f0c020b202f101f22da01450d6e0b200521dc01202f21050b20da0120dc016a200b20cb0272200b20ca0271200b20c9027622041b3a000020dc0120c7026a21dc012004210b20040d000c070b0b2006101f22da01450d93010b202f21dc010b20da0120dc016a20c6023a000020dc0120c7026a21dc0103400240024002400240200620dc01470d00200620c7026a22052006490dbb02200620c7027422dc012005200520dc01491b220520c802480dbb022006450d0120da0120062005101e22da010d020c6e0b200621050c020b2005101f22da01450d6c0b200621dc01200521060b20da0120dc016a200420cb0272200420ca0271200420c9027622071b3a000020dc0120c7026a21dc012007210420070d000b03400240024002400240200520dc01470d00200520c7026a22042005490dbb02200520c702742206200420042006491b222f20c802480dbb022005450d0120da012005202f101e22da010d020c6f0b2005212f0c020b202f101f22da01450d6d0b200521dc01202f21050b20da0120dc016a200b20cb0272200b20ca0271200b20c9027622041b3a000020dc0120c7026a21dc012004210b20040d000c040b0b2006101f22da01450d91010b202f21dc010b20da0120dc016a20c9023a000020dc0120c7026a21dc0103400240024002400240200620dc01470d00200620c7026a22052006490db802200620c7027422dc012005200520dc01491b220520c802480db8022006450d0120da0120062005101e22da010d020c6d0b200621050c020b2005101f22da01450d6b0b200621dc01200521060b20da0120dc016a200420cb0272200420ca0271200420c9027622071b3a000020dc0120c7026a21dc012007210420070d000b03400240024002400240200520dc01470d00200520c7026a22042005490db802200520c702742206200420042006491b222f20c802480db8022005450d0120da012005202f101e22da010d020c6e0b2005212f0c020b202f101f22da01450d6c0b200521dc01202f21050b20da0120dc016a200b20cb0272200b20ca0271200b20c9027622041b3a000020dc0120c7026a21dc012004210b20040d000b0b20db0120c102470da9010c090b202f101f22da01450d8e010b200621050b20da0120056a20093a0000200520c7026a21dc0120db0120c102470da7010c060b202f101f22da01450d8c010b200621050b20da0120056a20093a0000200520c7026a21dc0120db0120c102470da6010c030b202f101f22da01450d8a010b200621050b20da0120056a20093a0000200520c7026a21dc0120db0120c102470da2010b20c10221db010cb0010b2005280200210b0c310b20e202210502400340200520d4026a28020022080d0120e10220d8026a21e10220d502200520d9026a2205470d000cbd010b0b200520d9026a21e20220e10220d8026a212620e00220da026a21e002200520db026a290200212e2005280200210a200341286a20db026a22092802002104200328022c210b034002400240024002402004200b470d00200b20d8026a2206200b490dab02200b20d802742207200620062007491b220720d702480dab02200b450d012003280228200b2007101e22060d020c780b200328022821060c020b2007101f2206450d760b2003200736022c200320063602282007210b0b2009200420d8026a2207360200200620046a20e10220de027220e10220dd027120e10220dc027622061b3a000020072104200621e10220060d000b200320db026a202e370300200320083602042003200a360200200341c0006a2003200341286a105220032d004022e30220df02470d3f024020d6022005460d00202621e10220e0020d8b010b200541106a22d30220d202470dba010cb9010b20ea02220620e6026a21ea02024020062802042204450d000240200620e7026a280200220b450d00200b20e7026c210b0340024020042802002205450d00200420e4026a280200450d002005101d0b200420e7026a2104200b20e9026a220b0d000b0b200620e8026a280200450d00200620e4026a280200101d0b20ea0220e502470da2010b2015450d002016101d0b200341146a2067360200200341106a20663602002003206536020c20034284808080c0003702042003205c360200200341c0006a200320021053200320032900413703282003200341c0006a41086a29000037002f20032d00402204411a470d084100210d41012137410521040ca2020b024020ee0220ed026a280200450d0020ee02280200101d0b024020ee0220f0026a280200220b450d0020ee0228020c2104200b20ed0274210b0340024020042d000020f202470d00200420f3026a28020020f40271450d00200420ed026a280200101d0b200420f1026a2104200b20f5026a220b0d000b0b20ee0220ec026a2104024020ee0220f1026a280200450d0020ee0220eb026a280200101d0b200421ee02200420ef02470da0010b200141086a280200450d9302200141046a280200101d200341d0006a24000f0b024020f90220f6026a280200220b450d0020f9022802042104200b20f80274210b0340024020042d000020fe02470d00200420fb026a28020020ff0271450d00200420f8026a280200101d0b200420fd026a2104200b2080036a220b0d000b0b024020f90220fb026a280200450d0020f90220f8026a280200101d0b20f90220f7026a2104024020f90220fc026a280200450d0020f902280210101d0b200421f902200420fa02470d9f010b200141086a280200450d9102200141046a280200101d200341d0006a24000f0b0240208203280208220b450d002082032802002104200b20810374210b0340024020042d0000208503470d0020042086036a28020020870371450d0020042081036a280200101d0b20042084036a2104200b2088036a220b0d000b0b2082032084036a210402402082032081036a280200450d00208203280200101d0b20042182032004208303470d9e010b200141086a280200450d8f02200141046a280200101d200341d0006a24000f0b0240208c032089036a280200220b450d00208c032802042104200b208b0374210b0340024020042d0000209103470d002004208e036a28020020920371450d002004208b036a280200101d0b20042090036a2104200b2093036a220b0d000b0b0240208c03208e036a280200450d00208c03208b036a280200101d0b208c03208a036a21040240208c03208f036a280200450d00208c03280210101d0b2004218c032004208d03470d9d010b200141086a280200450d8d02200141046a280200101d200341d0006a24000f0b20002003290328370001200020043a0000200041086a200329002f3700000c210b200441106a22b80220e201460daa010b4110219403410d219503410221960341042197034109219803410821990341ffffffff03219a034170219b034113214d0cc8010b20b8022095036a2d0000209603460da60120b802280204210620b8022802002105024020b8022802082204450d00200420970374210b200521040340024020042d0000209803470d0020042099036a280200209a0371450d0020042097036a280200101d0b20042094036a2104200b209b036a220b0d000b0b20b8022094036a21b80202402006450d002005101d0b20b80220e201470d8601410a21040c96020b20032d0003219e0320032f0001219f03200341086a29030021a003200328020421a103200b20e201460d01411021a203200441106a21a303410d21a403410221a503410421a603410921a703410821a80341ffffffff0321a903417021aa034114214d0cc8010b20a30320a4036a2d000020a503460d0020a303280204210620a3032802002105024020a3032802082204450d00200420a60374210b200521040340024020042d000020a703470d00200420a8036a28020020a90371450d00200420a6036a280200101d0b200420a2036a2104200b20aa036a220b0d000b0b20a30320a2036a21a30302402006450d002005101d0b20a30320e201470d85010b209e0320e90174210402402031450d002032101d0b209f0320047221040240200341c0006a41086a280200450d002003280244101d0b200020043b0001200020ea013a0000200041036a20044110763a0000200041086a20a003370000200041046a20a1033600004100210b410121c6014101210c4101219d034101219c030c150b20032d000321ab0320032f000121ac03200341086a29030021ad03200328020421ae0302402026450d002009101d0b411021af03205a2046460d01411c21b003411421b103410c21b203410821b303410421b403411021b503410921b60341ffffffff0321b703417021b8034104214d0caf010b205a2802042205450d00205a20b1036a2802002106205a20b3036a2802002107205a28021021080240205a20b2036a2802002204450d00200420b40374210b200521040340024020042d000020b603470d00200420b3036a28020020b70371450d00200420b4036a280200101d0b200420b5036a2104200b20b8036a220b0d000b0b02402007450d002005101d0b205a20b0036a215a02402006450d002008101d0b205a2046470d750b20ab0320af037421040240200f450d002010101d0b20ac0320047221040240200341c0006a41086a280200450d002003280244101d0b200020043b00012000205b3a0000200041036a20044110763a0000200041086a20ad03370000200041046a20ae0336000041002105410121c6014101210c4101219d034101219c034101210b41012106410121070ce8010b20032d000321b90320032f000121ba03200341086a29030021bb03200328020421bc030240208201450d00208301101d0b411021bd03208101206c460d01411c21be03411421bf03410c21c003410821c103410421c203411021c303410921c40341ffffffff0321c503417021c603410a214d0cb4010b2081012802042205450d0020810120bf036a280200210620810120c1036a28020021072081012802102108024020810120c0036a2802002204450d00200420c20374210b200521040340024020042d000020c403470d00200420c1036a28020020c50371450d00200420c2036a280200101d0b200420c3036a2104200b20c6036a220b0d000b0b02402007450d002005101d0b20810120be036a21810102402006450d002008101d0b208101206c470d760b20b90320bd037421040240201b450d00201c101d0b20ba0320047221040240200341c0006a41086a280200450d002003280244101d0b200020043b000120002085013a0000200041036a20044110763a0000200041086a20bb03370000200041046a20bc0336000041002106410121c6014101210c4101219d034101219c034101210b0c100b2004101f220b450d020b2002200b360200200241046a2004360200200241086a28020021040b200241086a200420c9016a360200200b20046a20cb0120c90110ce031a4100214141012137024020ca01450d0020cb01101d0b4101210d41012138410121394101213a4101213b4101213c4101213d4101213e4101213f410121400c170b200441011020000b2004101f220b450d020b2002200b360200200241046a2004360200200241086a28020021040b200241086a200420b8016a360200200b20046a20ba0120b80110ce031a4100213b41012137024020b901450d0020ba01101d0b4101210d41012138410121394101213a0c81020b200441011020000b2004101f220b450d030b2005200b360200200541046a2004360200200541086a28020021040b200541086a200420376a360200200b20046a2009203710ce031a0240203d450d002009101d0b41002138410121374101210d0b410121390cf6010b200441011020000b20032f000120032d0003411074722109200341086a290300212e200328020421062007450d152008101d20aa01208c01470d160c170b20032f000120032d0003209c01747221090c130b410121060b410121070cd3010b024020ca0320c9036a280200450d0020ca03280200101d0b024020ca0320cc036a280200220b450d0020ca0328020c2104200b20c90374210b0340024020042d000020ce03470d00200420cf036a28020020d00371450d00200420c9036a280200101d0b200420cd036a2104200b20d1036a220b0d000b0b20ca0320c8036a2104024020ca0320cd036a280200450d0020ca0320c7036a280200101d0b200421ca03200420cb03470d6f0cd5010b024020d50320d2036a280200220b450d0020d5032802042104200b20d40374210b0340024020042d000020da03470d00200420d7036a28020020db0371450d00200420d4036a280200101d0b200420d9036a2104200b20dc036a220b0d000b0b024020d50320d7036a280200450d0020d50320d4036a280200101d0b20d50320d3036a2104024020d50320d8036a280200450d0020d503280210101d0b200421d503200420d603470d6f0cd9010b024020de03280208220b450d0020de032802002104200b20dd0374210b0340024020042d000020e103470d00200420e2036a28020020e30371450d00200420dd036a280200101d0b200420e0036a2104200b20e4036a220b0d000b0b20de0320e0036a2104024020de0320dd036a280200450d0020de03280200101d0b200421de03200420df03470d6f0cde010b024020e80320e5036a280200220b450d0020e8032802042104200b20e70374210b0340024020042d000020ed03470d00200420ea036a28020020ee0371450d00200420e7036a280200101d0b200420ec036a2104200b20ef036a220b0d000b0b024020e80320ea036a280200450d0020e80320e7036a280200101d0b20e80320e6036a2104024020e80320eb036a280200450d0020e803280210101d0b200421e803200420e903470d6f0cdf010b41002108410121c6014101210c4101219d034101219c034101210b41012106410121074101210520012d00002204410e4d0dd0010ce0010b2004101f220b450d040b2005200b360200200541046a2004360200200541086a28020021040b200541086a200420376a360200200b20046a2009203710ce031a0240203d450d002009101d0b41002140410121374101210d41012138410121394101213a4101213b4101213c4101213d4101213e4101213f0b410121410b41012136410821040cf2010b200441011020000b20f403220620f6036a21f403024020062802042204450d000240200620f3036a280200220b450d00200b20f3036c210b0340024020042802002205450d00200420f8036a280200450d002005101d0b200420f3036a2104200b20f9036a220b0d000b0b200620f7036a280200450d00200620f8036a280200101d0b20f40320f503470d730b200141106a280200450de2012001410c6a280200101d200341d0006a24000f0b20d302220420fa036a21d302024020042802042206450d00200428020821070240200420fb036a2802002204450d00200420fb036c210b200621040340024020042802002205450d00200420fd036a280200450d002005101d0b200420fb036a2104200b20fc036a220b0d000b0b2007450d002006101d0b20d30220d202470d6a411021040cee010b209502280200220b450dc30120950220ff036a28020021042095022080046a280200210620950228020c21050240209502280204450d00200b101d0b02402004450d00200420810474210b200521040340024020042d0000208204470d0020042083046a28020020840471450d0020042081046a280200101d0b20042080046a2104200b2085046a220b0d000b0b20950220fe036a21950202402006450d002005101d0b20950220ef01470d6a0cc3010b20032f000120032d0003411074722109200341086a290300212e2003280204210620aa01208c01470d030c040b20032f000120032d0003209c01747221090b2006290300212e200328020421060b20aa01208c01460d010b034020aa0141186a2d00004104460d0120aa0141106a280200210b20aa01410c6a2802002105024020aa0141046a280200450d0020aa01280200101d0b0240200b450d002005101d0b20aa0141286a22aa01208c01470d000b0b0240201e450d00201f101d0b0240200341c0006a41086a280200450d002003280244101d0b200020093b0001200020043a0000200041036a20094110763a0000200041086a202e370000200041046a20063600004100210c410121c601410b21040ce7010b20870422062089046a218704024020062802042204450d00024020062086046a280200220b450d00200b2086046c210b0340024020042802002205450d002004208b046a280200450d002005101d0b20042086046a2104200b208c046a220b0d000b0b2006208a046a280200450d002006208b046a280200101d0b208704208804470d6a0cd2010b20032d0043218d0420032f0041218e04200341c0006a20db026a29030021f003200328024421f1034104218f04201620144104746a41706a2005460d014110219004200541106a219104410c21920441742193044127214d0cb8010b20910422042090046a219104024020042802042206450d0020042802082107024020042092046a2802002204450d0020042092046c210b200621040340024020042802002205450d002004208f046a280200450d002005101d0b20042092046a2104200b2093046a220b0d000b0b2007450d002006101d0b20910420d202470d690b02402015450d002016101d0b20e302411a470d010b200341306a2802002161200328022c21602003280228215f41022118410021624101215e410021634100215d410121644101101f22650d680ce5010b208d0420d9027421040240200328022c450d002003280228101d0b208e0420047221f2030c740b20ad0141011020000b20b90141011020000b20b90141011020000b20ca0141011020000b200741011020000b200641011020000b200741011020000b200641011020000b20ca0141011020000b200541011020000b202f41011020000b200641011020000b200441011020000b200641011020000b200441011020000b200641011020000b200441011020000b200541011020000b202f41011020000b200541011020000b202f41011020000b200541011020000b202f41011020000b200541011020000b202f41011020000b200741011020000b200b41011020000b200b41011020000b200b41011020000b200b41011020000b200b41011020000b200841011020000b200841011020000b200d41011020000b200d41011020000b200441011020000b20ca0141011020000b200641011020000b200641011020000b200641011020000b20b90141011020000b200441011020000b202741011020000b200841011020000b20ca0141011020000b200441011020000b20ca0141011020000b200741011020000b200641011020000b200841011020000b200841011020000b200641011020000b200741011020000b200641011020000b200641011020000b200641011020000b200741011020000b200741011020000b200741011020000b200641011020000b200641011020000b200641011020000b200641011020000b202f41011020000b202f41011020000b202f41011020000b4101214d0c360b4102214d0c370b4103214d0c380b4104214d0c390b4105214d0c390b4107214d0c3a0b4109214d0c3c0b410a214d0c3d0b410c214d0c3e0b410d214d0c3f0b410d214d0c3f0b410e214d0c3f0b410f214d0c3f0b4110214d0c3f0b4112214d0c400b4113214d0c410b4114214d0c420b4116214d0c430b4118214d0c450b4119214d0c450b411a214d0c450b411b214d0c450b411c214d0c450b411d214d0c450b411d214d0c450b411d214d0c450b411d214d0c450b411e214d0c460b411f214d0c460b4120214d0c470b4121214d0c480b4122214d0c490b4123214d0c4a0b4124214d0c4b0b4125214d0c4c0b4126214d0c4c0b4127214d0c4c0b410021040c790b410221040c780b410321040c770b410421040c760b410421040c750b410521040c740b410521040c730b410521040c720b410521040c710b410a21040c700b410a21040c6f0b410a21040c6e0b410a21040c6d0b410e21040c6c0b411021040c6b0b410f21040c6a0b411021040c690b411121040c680b411121040c670b411121040c660b411121040c650b411121040c640b411121040c630b411121040c620b411121040c610b411121040c600b411121040c5f0b411121040c5e0b411121040c5d0b411121040c5c0b411121040c5b0b411121040c5a0b411121040c590b411121040c580b411121040c570b411121040c560b411121040c550b411121040c540b411121040c530b411121040c520b411121040c510b411121040c500b411121040c4f0b411121040c4e0b411121040c4d0b411121040c4c0b411121040c4b0b411121040c4a0b411121040c490b411121040c480b411121040c470b411121040c460b411121040c450b411121040c440b411121040c430b411121040c420b411121040c410b411121040c400b411121040c3f0b411121040c3e0b411121040c3d0b411121040c3c0b411121040c3b0b411121040c3a0b411121040c390b411121040c380b411121040c370b411121040c360b411121040c350b411121040c340b411121040c330b411121040c320b411121040c310b411121040c300b411121040c2f0b411121040c2e0b411121040c2d0b411121040c2c0b410221040b03400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040e06000102040607070b208701207f6a2107208701280200210b03400240024002400240208401280200207a2802002204470d002004207b6a22052004490d4b2004207b742206200520052006491b2206207c480d4b2004450d01200328024420042006101e22050d020c0d0b200328024421050c020b2006101f2205450d0b0b208401200636020020032005360244207a28020021040b207a2004207b6a360200200520046a200b207972200b207871200b20777622041b3a00002004210b20040d000b20072187012007208601470d130c3c0b200328022c21040c010b209a0220f6016a2204209a02490d44209a0220f60174220b20042004200b491b220b208302480d4402400240209a02450d00200328022c209a02200b101e22040d010c0a0b200b101f2204450d090b208502200b3602002003200436022c20fc01280200219e020b20fc01209e0220f6016a3602002004209e026a209b0220820272209b0220810271209b022080027622041b3a000002402004450d002004219b02208502280200229a0220fc01280200229e02470d12410221040c170b209c02209602460d01209602219f02410321040c160b209f022084026a21a002209f02290200222e20fe0188a7220420900271208602460d13200420f8017420f801752107202ea7210b0340024002400240024020850228020020fc012802002204470d00200420f6016a22052004490d47200420f601742206200520052006491b2206208302480d472004450d01200328022c20042006101e22050d020c0a0b200328022c21050c020b2006101f2205450d080b20850220063602002003200536022c20fc0128020021040b20fc01200420f6016a360200200520046a200b20820272200b20810271200b2080027622041b3a00002004210b20040d000b024002400240024020850228020020fc012802002204470d00200420f6016a220b2004490d46200420f601742205200b200b2005491b2205208302480d462004450d01200328022c20042005101e220b0d020c0c0b200328022c210b0c020b2005101f220b450d0a0b20850220053602002003200b36022c20fc0128020021040b20fc01200420f6016a360200200b20046a20072091027322042092027120930272200420072091024a1b3a000020a002219f0220a002209c02470d11209c02209c0222a002470d140c030b20960221a002410421040c140b209c0220a002460d01410521040c130b20a0022d0004210420a0022084026a21a0022004208602470d0f0b0240209d02450d00209602101d0b2099022097022086027422046a2106024002400240024002400240024002400240209702450d0020990220f8016a210b2004208a026a21072099022104034020042d00002105208c02200420ff016a2d00003a00002003200420f6016a2f00003b01002005208902460d022003413c6a208b026a2208208c022d00003a0000200320032f01003b013c20042086026a290200212e200320fb016a200420fb016a28020036020020f70120032f013c3b000020f701208b026a20082d00003a0000200320053a00002003202e370204200341c0006a2003200341286a102d20032d004022a102208d02462205450d05200b20fa016a210b2007208a026a2107200420fa016a22042006470d000c040b0b20990222042006460d020c010b200420fa016a22042006460d010b03400240024020042d0000220b208702460d00200b208902470d010c030b20042084026a28020020880271450d0020042086026a280200101d0b200420fa016a22042006470d000b0b0240209802450d00209902101d0b2085022802002126200328022c2194022003280228210520fc01280200220a210b0340024002400240024020052084026a2208280200200520fb016a22062802002204470d00200420f6016a22072004490d48200420f601742209200720072009491b2209208302480d482004450d0120052086026a28020020042009101e22070d020c0d0b20052086026a28020021070c020b2009101f2207450d0b0b2008200936020020052086026a2007360200200628020021040b2006200420f6016a360200200720046a200b20820272200b20810271200b2080027622041b3a00002004210b20040d000b02402008280200220b200628020022046b200a4f0d002004200a6a22072004490d44200b20f601742204200720072004491b2204208302480d44200b450d0220052086026a280200200b2004101e220b0d030c0b0b20052086026a280200210b0c030b20032d004321a20220032f004121a302200341c0006a2084026a29030021a402200328024421a50202402007450d00034002400240200b208e026a22042d00002207208702460d002007208902470d010c030b200b28020020880271450d00200b208f026a280200101d0b200b20fa016a210b200420fa016a2006470d000b0b0240209802450d00209902101d0b0240208502280200450d00200328022c101d0b2005450d0320950221940220950220ef01470d0b0c340b2004101f220b450d080b2008200436020020052086026a200b360200200628020021040b20062004200a6a360200200b20046a209402200a10ce031a02402026450d00209402101d0b20950221940220950220ef01470d070c310b20950220ef01460d12411821fe03411421ff03411021800441042181044109218204410821830441ffffffff032184044170218504411f214d0c0a0b200641011020000b200641011020000b200b41011020000b200941011020000b200541011020000b200441011020000b4117214d0c010b4117214d0c010b411121040c330b411121040c320b411121040c310b410021040c050b410121040c040b410321040c030b410421040c020b410421040c010b410521040c000b0b20a20220fa0174210402402034450d002035101d0b20a30220047221040240200341186a41086a280200450d00200328021c101d0b200020043b0001200020a1023a0000200041036a20044110763a0000200041086a20a402370000200041046a20a50236000041002107410121c6014101210c4101219d034101219c034101210b410121060b410121050b4101210820012d00002204410e4b0d100b02400240024020040e0f000b0a0904060c0d11120f02070501000b200141086a280200450d1b200141046a280200101d200341d0006a24000f0b0240200141086a280200450d00200141046a280200101d0b0240200141146a2802002202450d00200141186a280200450d002002101d0b200141246a280200450d1a200141206a280200101d200341d0006a24000f0b2007450d19410c21c7032001410c6a2802002204450d00411821c803410421c903200141046a28020022ca03200441186c6a21cb03411421cc03411021cd03410921ce03410821cf0341ffffffff0321d003417021d1034119214d0c140b200141086a280200450d18200141046a280200101d200341d0006a24000f0b200141086a280200450d17200141046a280200101d200341d0006a24000f0b2008450d16200141046a2d000022044102460d0e20044101460d0d20040d102001410c6a280200450d16200141086a280200101d200341d0006a24000f0b209d03450d15200141086a280200450d15200141046a280200101d200341d0006a24000f0b2005450d14410c21d2032001410c6a2802002204450d00411c21d303410421d403200141046a28020022d5032004411c6c6a21d603410821d703411421d803411021d903410921da0341ffffffff0321db03417021dc03411a214d0c100b200141086a280200450d13200141046a280200101d200341d0006a24000f0b200c450d1202402001410c6a2802002204450d00200141046a2802002102200441286c210403400240200241046a280200450d002002280200101d0b0240200241106a280200450d002002410c6a280200101d0b200241286a2102200441586a22040d000b0b200141086a280200450d12200141046a280200101d200341d0006a24000f0b02402001410c6a2802002204450d00200141046a28020021022004410474210403400240200241046a280200450d002002280200101d0b200241106a2102200441706a22040d000b0b200141086a280200450d11200141046a280200101d200341d0006a24000f0b20c601450d100240200141086a280200450d00200141046a280200101d0b200141146a280200450d10200141106a280200101d200341d0006a24000f0b209c03450d0f200141086a280200450d0f200141046a280200101d200341d0006a24000f0b200b450d0e2001410c6a2802002204450d00410421dd03200141046a28020022de0320044104746a21df03411021e003410921e103410821e20341ffffffff0321e303417021e403411b214d0c0b0b200141086a280200450d0d200141046a280200101d200341d0006a24000f0b2006450d0c410c21e5032001410c6a2802002204450d00411c21e603410421e703200141046a28020022e8032004411c6c6a21e903410821ea03411421eb03411021ec03410921ed0341ffffffff0321ee03417021ef03411c214d0c0a0b200141086a280200450d0b200141046a280200101d200341d0006a24000f0b02402001410c6a2802002204450d00200141046a2802002102200441146c210403400240200241046a280200450d002002280200101d0b200241146a21022004416c6a22040d000b0b200141086a280200450d0a200141046a280200101d200341d0006a24000f0b20011045200341d0006a24000f0b0240200141146a2802002204450d002001410c6a28020021022004410c6c2104034002402002280200220b450d00200241046a280200450d00200b101d0b2002410c6a2102200441746a22040d000b0b200141106a280200450d082001410c6a280200101d200341d0006a24000f0b200141146a2802002204450d00410c2186042001410c6a28020022870420044104746a21880441102189044108218a044104218b044174218c044126214d0c060b200141106a280200450d062001410c6a280200101d200341d0006a24000f0b2001410c6a280200450d05200141086a280200101d200341d0006a24000f0b411121040c110b411121040c100b411121040c0f0b411121040c0e0b411121040c0d0b200341d0006a24000f0b02402034450d002035101d0b200341186a41086a280200213d200328021c21092003280218220541046a2108200341246a2802002237210b034002400240024002402008280200200541086a22062802002204470d00200441016a22072004490d122004410174220d20072007200d491b220d4100480d122004450d0120052802002004200d101e22070d020c070b200528020021070c020b200d101f2207450d050b200520073602002008200d360200200628020021040b2006200441016a360200200720046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b0240024002400240200541046a280200220b200541086a28020022046b20374f0d00200420376a22062004490d11200b4101742204200620062004491b22044100480d11200b450d012005280200200b2004101e220b450d050c020b2005280200210b0c020b2004101f220b450d030b2005200b360200200541046a2004360200200541086a28020021040b200541086a200420376a360200200b20046a2009203710ce031a0240203d450d002009101d0b41002139410121374101210d410121380b4101213a0c040b200441011020000b200d41011020000b0240208201450d00208301101d0b208101218001208101206c470d060b0240201b450d00201c101d0b200341c0006a41086a280200213d200328024421092003280240220541046a2108200341cc006a2802002237210b034002400240024002402008280200200541086a22062802002204470d00200441016a22072004490d0d2004410174220d20072007200d491b220d4100480d0d2004450d0120052802002004200d101e22070d020c090b200528020021070c020b200d101f2207450d070b200520073602002008200d360200200628020021040b2006200441016a360200200720046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b0240024002400240200541046a280200220b200541086a28020022046b20374f0d00200420376a22062004490d0c200b4101742204200620062004491b22044100480d0c200b450d012005280200200b2004101e220b450d070c020b2005280200210b0c020b2004101f220b450d050b2005200b360200200541046a2004360200200541086a28020021040b200541086a200420376a360200200b20046a2009203710ce031a0240203d450d002009101d0b4100213a410121374101210d41012138410121390b4101213b0b4101213c0b4101213d410621040c030b200441011020000b200d41011020000b4108214d411121040c000b0b1021000b1021000b410141011020000bdf0401077f200441046a210502400240024002400240024002400240200441086a2802002004410c6a2802002206470d00200641016a22072006490d0520064101742208200720072008491b22074100480d052006450d01200528020020062007101e2208450d020c030b200528020021080c030b2007101f22080d010b200741011020000b200441086a2007360200200441046a20083602002004410c6a28020021060b2004410c6a2207200641016a360200200820066a20024101463a0000200441086a2109200441046a210a03400240024002400240200928020020072802002206470d00200641016a22082006490d052006410174220b20082008200b491b220b4100480d052006450d0120052802002006200b101e22080d020c060b200528020021080c020b200b101f2208450d040b2009200b360200200a2008360200200728020021060b2007200641016a360200200820066a200141807f72200141ff0071200141077622061b3a00002006210120060d000b024020024101470d002004410c6a2101200441086a2108200441046a210b03400240024002400240200828020020012802002206470d00200641016a22072006490d0620064101742209200720072009491b22094100480d062006450d01200528020020062009101e22070d020c080b200528020021070c020b2009101f2207450d060b20082009360200200b2007360200200128020021060b2001200641016a360200200720066a200341807f72200341ff0071200341077622061b3a00002006210320060d000b0b2000411a3a00000f0b1021000b200b41011020000b200941011020000bfe07030f7f017e017f200241086a2103200241046a21042001280200220521060240024002400240024003400240024002400240200428020020032802002207470d00200741016a22082007490d0520074101742209200820082009491b22094100480d052007450d01200228020020072009101e22080d020c060b200228020021080c020b2009101f2208450d040b2002200836020020042009360200200328020021070b2003200741016a360200200820076a200641807f72200641ff0071200641077622071b3a00002007210620070d000b200141086a280200210a2001280204220b2107024002402001410c6a280200220c450d00200b21072005450d00200b200c410c6c6a220d41746a210e200241086a210341002107200b210f0340200f210802400340200828020022100d01200741016a2107200d2008410c6a2208470d000c040b0b2008410c6a210f200741016a21112005417f6a2105200841046a290200211203400240024002400240200241046a220428020020032802002206470d00200641016a22092006490d0820064101742201200920092001491b22014100480d082006450d01200228020020062001101e22090d020c0a0b200228020021090c020b2001101f2209450d080b2002200936020020042001360200200328020021060b2003200641016a360200200920066a200741807f72200741ff0071200741077622061b3a00002006210720060d000b2012422088a72213210603400240024002400240200428020020032802002207470d00200741016a22092007490d0820074101742201200920092001491b22014100480d082007450d01200228020020072001101e22090d020c0b0b200228020021090c020b2001101f2209450d090b2002200936020020042001360200200328020021070b2003200741016a360200200920076a200641807f72200641ff0071200641077622071b3a00002007210620070d000b024002400240024020042802002206200328020022076b20134f0d00200720136a22092007490d0720064101742207200920092007491b22074100480d072006450d01200228020020062007101e22060d020c0b0b200228020021060c020b2007101f2206450d090b2002200636020020042007360200200328020021070b2003200720136a360200200620076a2010201310ce031a02402012a7450d002010101d0b0240200e2008460d002011210720050d010b0b2008410c6a21070b2007200b200c410c6c6a2202460d000340024020072802002206450d00200741046a280200450d002006101d0b2007410c6a22072002470d000b0b0240200a450d00200b101d0b2000411a3a00000f0b1021000b200941011020000b200141011020000b200141011020000b200741011020000bd806010a7f200128020421032001280200210441002105410121064100210720012802082208210902400240024002400240024002400340024020072005470d002005410174220a200541016a220b200b200a491b220a4100480d05024002402005450d0020062005200a101e22060d010c040b200a101f2206450d030b200a21050b200620076a200941807f72200941ff00712009410776220a1b3a0000200741016a2107200a2109200a0d000b200520076b20084f0d02200720086a22092007490d032005410174220a20092009200a491b22094100480d03024002402005450d00200620052009101e2206450d010c030b2009101f22060d020b200941011020000b200a41011020000b200921050b200620076a2004200810ce031a02402003450d002004101d0b200128020c210c02400240024002400240200520086b20076b200141146a28020022094f0d00200820076a220a20096a2203200a490d052005410174220a20032003200a491b220a4100480d052005450d0120062005200a101e2206450d020c030b200820096a20076a21030c030b200a101f22060d010b200a41011020000b200a21050b200620086a20076a200c200910ce031a200241086a210a200241046a210820032109034002400240024002402008280200200a2802002207470d00200741016a220b2007490d0520074101742204200b200b2004491b22044100480d052007450d01200228020020072004101e220b0d020c060b2002280200210b0c020b2004101f220b450d040b2002200b36020020082004360200200a28020021070b200a200741016a360200200b20076a200941807f72200941ff0071200941077622071b3a00002007210920070d000b024002400240200241046a2802002209200241086a28020022076b20034f0d00200720036a220a2007490d0320094101742207200a200a2007491b22074100480d032009450d01200228020020092007101e2209450d020c050b200228020021090c050b2007101f22090d030b200741011020000b1021000b200441011020000b20022009360200200241046a2007360200200241086a28020021070b200241086a200720036a360200200920076a2006200310ce031a02402005450d002006101d0b2000411a3a00000240200141106a280200450d00200c101d0b0bb70301087f2002410c6a2103200241046a2104200141086a28020022052106024002400240024003400240024002400240200241086a220728020020032802002208470d00200841016a22092008490d052008410174220a20092009200a491b220a4100480d052008450d0120042802002008200a101e22090d020c060b200428020021090c020b200a101f2209450d040b2007200a36020020042009360200200328020021080b2003200841016a360200200920086a200641807f72200641ff0071200641077622081b3a00002008210620080d000b2001280204210920012802002106024002400240200241086a28020022032002410c6a28020022086b20054f0d00200820056a22072008490d0320034101742208200720072008491b22084100480d032003450d01200241046a28020020032008101e2203450d020c050b200241046a28020021030c050b2008101f22030d030b200841011020000b1021000b200a41011020000b200241086a2008360200200241046a20033602002002410c6a28020021080b2002410c6a200820056a360200200320086a2006200510ce031a02402009450d002006101d0b2000411a3a00000ba707010c7f230041c080016b2202240041002103200141086a2104200141046a210541002106024002400240024002400240024002400240024002400240024003402003411f4b0d012005280200220720042802002208460d02200841016a21092008417f460d0720072009490d08200128020020086a2d0000210820042009360200200841ff00712003411f71742006722106200341076a21032008418001710d000b024020034120490d00410d210320086741686a41ff01714104490d030b200241086a41004180800110cd031a2006450d03200141086a210a200141046a210b41002108410021074101210c410021040340200b280200220d200a28020022096b200620046b220341808001200341808001491b2203490d06200920036a22052009490d09200d2005490d0a200241086a200128020020096a200310ce031a200a20053602000240024002400240200720086b20034f0d00200820036a22092008490d0f20074101742205200920092005491b22054100480d0f2007450d01200c20072005101e220c0d020c100b200320086a21090c020b2005101f220c450d0e0b200521070b200c20086a200241086a200310ce031a200921082006200320046a22044b0d000c050b0b410f21030c010b200241013a00b880012002411c6a41013602002002410136029480012002420137020c20024190afc4003602082002200241b880016a360290800120022002419080016a360218200241a080016a200241086a1028410521030b2000200336020420004101360200200041086a20022902a08001370200200041106a200241a080016a41086a2802003602000c090b4101210c41002107410021090b2000200c36020420004100360200200041146a2009360200200041106a41003602002000410c6a2009360200200041086a2007360200200241c080016a24000f0b200241013a008f8001200241b480016a4101360200200241013602bc8001200242013702a4800120024190afc4003602a0800120022002418f80016a3602b880012002200241b880016a3602b080012002419080016a200241a080016a1028200241ab80016a2002419880016a2802003600002002200229039080013700a38001200041053a000420004101360200200020022900a080013700052000410c6a200241a780016a2900003700002007450d06200c101d200241c080016a24000f0b417f2009102a000b20092007102b000b20092005102a000b2005200d102b000b1021000b200541011020000b200241c080016a24000be007010a7f230041c0006b22022400024002400240024002400240024002400240024002400240024002400240024020012802082203200128020c2204470d00200241013a000f2002413c6a4101360200200241013602242002420137022c20024190afc40036022820022002410f6a3602202002200241206a360238200241106a200241286a1028200241326a200241186a2802003601002002200229031037012a20022002412e6a29010037010620022002290128370300410521050c010b200441016a21062004417f460d0b20032006490d0c2001280200220720046a2d00002108410c21052001410c6a2006360200410021064100210902402008450d004101210920084101470d010b410120036b210a200441026a21042001410c6a210b4100210503402006411f4b0d02200a20046a4102460d032004450d0a20032004490d0b200720046a417f6a2d00002108200b2004360200200841ff00712006411f71742005722105200441016a2104200641076a21062008418001710d000b024020064120490d00410d210620086741686a41ff017141034d0d040b2009450d042004417f6a2104410021062001410c6a210b4100210a03402006411f4b0d0720032004460d082004417f460d0e2003200441016a2201490d0f200720046a2d00002108200b2001360200200841ff00712006411f7174200a72210a200641076a2106200121042008418001710d000b024020064120490d00410d210420086741686a41ff017141034d0d090b410121040c050b200020083a0005200020053a000420002002290300370106200041013602002000410c6a2002290106370100200241c0006a24000f0b410f21060c010b200241013a00102002413c6a4101360200200241013602242002420137022c20024190afc4003602282002200241106a3602202002200241206a3602382002200241286a1028410521060b2000200636020420004101360200200041086a2002290200370200200041106a200241086a280200360200200241c0006a24000f0b410021040b20002005360204200041003602002000410c6a200a360200200041086a2004360200200241c0006a24000f0b410f21040c010b200241013a00102002413c6a4101360200200241013602242002420137022c20024190afc4003602282002200241106a3602202002200241206a3602382002200241286a1028410521040b2000200436020420004101360200200041086a2002290200370200200041106a200241086a280200360200200241c0006a24000f0b417f2004102a000b20042003102b000b417f2006102a000b20062003102b000b417f200441016a102a000b200441016a2003102b000bbd0602057f027e0240024002402002450d00200241796a4100200241074b1b2103410021040340024002400240024002400240024002400240024002400240024002400240200120046a22052d0000220641187441187522074100480d002005410371450d01200441016a22042002490d0f0c100b4280808080102108200641f6b1c2006a2d000022054104460d0120054103460d0220054102470d08200441016a220620024f0d094280808080802021094280808080102108200120066a2d000041c00171418001460d0d0c110b0240200420034f0d000340200120046a220641046a280200200628020072418081828478710d01200441086a22042003490d000b0b0240200420024f0d000340200120046a2c00004100480d01200441016a22042002490d000b0b20042002490d0d0c0e0b42002109200441016a220520024f0d08200120056a2d00002105200641f001460d01200641f401470d022005411874411875417f4a0d06200541ff0171418f014d0d030c060b42002109200441016a220520024f0d07200120056a2d00002105200641e001460d03200641ed01470d042005411874411875417f4a0d05200541ff017141a001490d090c050b200541f0006a41ff01714130490d010c040b200541ff017141bf014b0d032007410f6a41ff017141024b0d03200541187441187541004e0d030b200441026a220620024f0d04200120066a2d000041c00171418001470d0a42002108200441036a220620024f0d0b200120066a2d000041c00171418001460d070c050b200541e0017141a001470d010c050b02402007411f6a41ff0171410c4f0d002005411874411875417f4a0d01200541ff017141bf014d0d050c010b200541ff017141bf014b0d00200741fe017141ee01470d0020054118744118754100480d040b4280808080802021090c080b420021090b420021080c060b428080808080e000210942808080801021080c050b42002108200441026a220620024f0d04200120066a2d000041c00171418001470d030b200641016a22042002490d000b0b20002001360204200041086a2002360200200041003602000f0b428080808080c000210942808080801021080b200020092008842004ad84370204200041013602000bca07010d7f230041c0086b22022400410021032001410c6a2104200141086a210541002106024002400240024002400240024002400240024002400240024003402003411f4b0d012005280200220720042802002208460d02200841016a21092008417f460d0720072009490d082001280200220a20086a2d0000210820042009360200200841ff00712003411f71742006722106200341076a21032008418001710d000b024020034120490d00410d210320086741686a41ff017141034d0d030b2006450d03200241086a410041800810cd031a2001410c6a210b200141086a210c4101210d4100210e41002108410021040340200720096b200620046b22034180082003418008491b2203490d05200920036a22052009490d0920072005490d0a200241086a200a20096a200310ce031a200b20053602000240024002400240200e20086b20034f0d00200820036a22052008490d0f200e4101742209200520052009491b22094100480d0f200e450d01200d200e2009101e220d0d020c100b200320086a21050c020b2009101f220d450d0e0b2009210e0b200d20086a200241086a200310ce031a02402006200320046a22044d0d00200b2802002109200c28020021072001280200210a200521080c010b0b200241086a200d2005105720022802084101470d050240200e450d00200d101d0b200041083a000420004101360200200241c0086a24000f0b410f21030c010b200241013a0098082002411c6a41013602002002410136028c082002420137020c20024190afc400360208200220024198086a36028808200220024188086a360218200241a8086a200241086a1028410521030b2000200336020420004101360200200041086a20022902a808370200200041106a200241a8086a41086a2802003602000c090b2000428080808010370200200041086a4200370200200241c0086a24000f0b200241013a009708200241bc086a41013602002002410136028c08200242013702ac0820024190afc4003602a808200220024197086a36028808200220024188086a3602b80820024198086a200241a8086a1028200241b3086a200241a0086a28020036000020022002290398083700ab08200041053a000420004101360200200020022900a8083700052000410c6a200241af086a290000370000200e450d07200d101d200241c0086a24000f0b2000200d3602042000410c6a2005360200200041086a200e36020020004100360200200241c0086a24000f0b417f2009102a000b20092007102b000b20092005102a000b20052007102b000b1021000b200941011020000b200241c0086a24000bb70b05077f017e037f017e017f230041d0016b22022400200241b0016a41186a22034200370300200241b0016a41106a22044200370300200241b0016a41086a22054200370300200242003703b001200241b0016a2001280200220620012802042207412020074120491b220810ce031a2001200720086b3602042001200620086a360200024002402007411f4d0d0020024190016a41186a2207200329030037030020024190016a41106a2208200429030037030020024190016a41086a22062005290300370300200220022903b00137039001200241f0006a41186a2007290300370300200241f0006a41106a2008290300370300200241f0006a41086a20062903003703002002200229039001370370410121070c010b410021070b200241b0016a41186a2208200241f0006a41186a290300370300200241b0016a41106a2206200241f0006a41106a290300370300200241b0016a41086a2203200241f0006a41086a290300370300200220022903703703b001024002400240024002402007450d00200241306a41186a2008290300370300200241306a41106a2006290300370300200241306a41086a2003290300370300200220022903b00137033020022001105a2002290300a7450d0120022903082109200241b0016a41186a22054200370300200241b0016a41106a220a4200370300200241b0016a41086a220b4200370300200242003703b001200241b0016a20012802002204200141046a22032802002207412020074120491b220810ce031a2003200720086b22063602002001200420086a22083602002007411f4d0d0220024190016a41186a2207200529030037030020024190016a41106a2204200a29030037030020024190016a41086a2205200b290300370300200220022903b00137039001200241d0006a41186a2007290300370300200241d0006a41106a2004290300370300200241d0006a41086a20052903003703002002200229039001370350200241b0016a2006412020064120491b22076a41004100412020076b2007411f4b1b10cd031a200241b0016a2008200710ce031a2003200620076b3602002001200820076a3602002006411f4d0d0320024190016a41186a2207200241b0016a41186a220329030037030020024190016a41106a2208200241b0016a41106a220429030037030020024190016a41086a2206200241b0016a41086a2205290300370300200220022903b00137039001200241f0006a41186a220a2007290300370300200241f0006a41106a220b2008290300370300200241f0006a41086a220c20062903003703002002200229039001370370200241b0016a2001105b20022802b0012201450d0420022902b401210d2003200241306a41186a2903003703002004200241306a41106a2903003703002005200241306a41086a2903003703002006200241d0006a41086a2903003703002008200241d0006a41106a2903003703002007200241d0006a41186a290300370300200241106a41086a220e200c290300370300200241106a41106a220c200b290300370300200241106a41186a220b200a290300370300200220022903303703b0012002200229035037039001200220022903703703102000200d37020c2000200136020820002009370300200041146a20022903b0013702002000411c6a2005290300370200200041246a20042903003702002000412c6a2003290300370200200041346a2002290390013702002000413c6a2006290300370200200041c4006a2008290300370200200041cc006a2007290300370200200041ec006a200b290300370200200041e4006a200c290300370200200041dc006a200e290300370200200041d4006a2002290310370200200241d0016a24000f0b20004100360208200241d0016a24000f0b20004100360208200241d0016a24000f0b20004100360208200241d0016a24000f0b20004100360208200241d0016a24000f0b20004100360208200241d0016a24000bbe0503057f027e037f230041106b22022400200241003a0008200241086a2001280200220320012802042204410047220510ce031a02400240024020042005490d00200141046a200420056b22063602002001200320056a22053602000240024002402004450d0020022d00082204ad210702400240200441037122034102460d00024020034101460d0020030d022004410276ad2107420121080c050b200241003a0008200241086a20052006410047220410ce031a20062004490d07200141046a200620046b3602002001200520046a3602002006450d0220023100084208862007844202882107420121080c040b200241003a0006200241003b0104200241046a200520064103200641034922031b220410ce031a200141046a200620046b3602002001200520046a36020020030d0120023301042002310006421086844208862007844202882107420121080c030b02400240200441027622044104460d0020040d0120024100360208200241086a200520064104200641044922031b220410ce031a200141046a200620046b3602002001200520046a36020020030d0220023502082107420121080c040b4200210820024200370308200241086a200520064108200641084922031b220410ce031a200141046a200620046b3602002001200520046a36020020030d0220022903082107420121080c030b200441046a220941084b0d0042002107200141046a210a410021030340200241003a0008200241086a20052006410047220410ce031a20062004490d05200a200620046b220b3602002001200520046a22053602002006450d0120023100082003410374413871ad86200784210742012108200b2106200341016a22042103200441ff01712009490d000c030b0b420021080b0b2000200737030820002008370300200241106a24000f0b20052004102a000b20042006102a000b20042006102a000bdd1805027f017e147f017e097f230041f0026b22022400200241186a200110b501024002400240024002400240024002400240024002402002280218450d00200228021c2203ad42287e2204422088a70d0a2004a72205417f4c0d0a2005450d012005101f2206450d032003450d020c040b20004100360200200241f0026a24000f0b4108210620030d020b41002116410021120c020b200541081020000b200241ec016a2105200241d8016a41086a2107200241d8016a41047221082002419d016a2109200241d8016a41076a210a200241206a410172210b200241a0026a210c200241eb016a220d41056a210e4100210f4100211041002111200321120340200141046a22132802002114200241003a00d801200241d8016a200128020022152014410047221610ce031a024002400240024002400240024020142016490d002013201420166b22173602002001201520166a22163602002014450d0920022d00d801221441044b0d090240024002400240024002400240024002400240024020140e050004020301000b200241086a200110b5012002280208450d13200228020c2214417f4c0d172014450d04201410792215450d0b2015200128020020132802002216201420162014491b221610ce031a201328020022172016490d0c2013201720166b3602002001200128020020166a36020020162014460d050c090b200241003602d801200241d8016a201620174104201741044922151b221410ce031a2013201720146b3602002001201620146a36020020150d1220022802d8012116200241106a200110b5012002280210450d1220022802142214417f4c0d162014450d06201410792217450d0c2017200128020020132802002215201420152014491b221510ce031a201328020022182015490d0d2013201820156b3602002001200128020020156a36020020152014470d070c0e0b200241d8016a2017412020174120491b22146a41004100412020146b2014411f4b1b10cd031a200241d8016a2016201410ce031a2013201720146b3602002001201620146a3602002017411f4d0d11200241c8016a41086a200a41086a2800003602002002200a2900003703c8012002200d290000370390012002200e2900003700950120022f01d801211420022d00da01211620022800db0121152009411f6a200241d8016a411f6a290000370000200941186a200241d8016a41186a290000370000200941106a200241d8016a41106a290000370000200941086a2007290000370000200920022900d8013700002015410876211a20142016411074722116410121180c0e0b200242003703d801200241d8016a20162017410820174108491b221410ce031a2013201720146b22153602002001201620146a2216360200201741074d0d1020022903d8012104200241d8016a201541c000201541c000491b22146a4100410041c00020146b2014413f4b1b10cd031a200241d8016a2016201410ce031a2013201520146b3602002001201620146a3602002015413f4d0d10200241c8016a41086a200a41086a28000036020020024190016a41086a200d41086a29000037030020024190016a41106a200d41106a29000037030020024190016a41186a200d41186a29000037030020024190016a41206a200d41206a29000037030020024190016a41256a200d41256a2900003700002002200a2900003703c8012002200d2900003703900120022800db012215410876211a20022f01d80120022d00da01411074722116410221180c0d0b200241a8026a200110b90220022802a8022215450d0f20022902ac022104200241c8016a41086a20022802d80136020020024190016a41086a200841086a29020037030020024190016a41106a200841106a29020037030020024190016a41186a200841186a29020037030020024190016a41206a200841206a29020037030020024190016a41286a200841286a29020037030020024190016a41306a200841306a280200360200200220043703c80120022008290200370390012015410876211a410021180c020b4101211541002014470d040b200241c8016a41086a20022802d80136020020024190016a41086a200841086a29020037030020024190016a41106a200841106a29020037030020024190016a41186a200841186a29020037030020024190016a41206a200841206a29020037030020024190016a41286a200841286a29020037030020024190016a41306a200841306a280200360200200220082902003703900120022014ad22044220862004843703c8012015410876211a410421180b0c090b4101211741002014460d070b2014450d0a2017101d0c0a0b2014450d092015101d0c090b20162014102a000b201441011020000b20162017102a000b201441011020000b20152018102a000b2017450d032016411876211520022014ad22194220862019843702cc01200220173602c801410321180b200241e0026a41086a221b200241c8016a41086a280200360200200241a8026a41086a221420024190016a41086a290300370300200241a8026a41106a221320024190016a41106a290300370300200241a8026a41186a221720024190016a41186a290300370300200241a8026a41206a221c20024190016a41206a290300370300200241a8026a41286a221d20024190016a41286a290300370300200241a8026a41306a221e20024190016a41306a280200360200200220022903c8013703e00220022002290390013703a80220024180016a41086a221f201b280200360200200241c8006a41086a221b2014290300370300200241c8006a41106a22202013290300370300200241c8006a41186a22212017290300370300200241c8006a41206a2222201c290300370300200241c8006a41286a221c201d290300370300200241c8006a41306a221d201e280200360200200220022903e00237038001200220022903a8023703482007200229038001370000200741086a201f28020036000020052002290348370000200541086a201b290300370000200541106a2020290300370000200541186a2021290300370000200541206a2022290300370000200541286a201c290300370000200541306a201d2802003600002002201a410874201541ff0171723602dc01200220183a00d801200220163b00d901200220164110763a00db01200c2004370300200241206a200241d8016a10b70220022d00202115200241a8026a411f6a2218200b411f6a2900003700002017200b41186a2900003703002013200b41106a2900003703002014200b41086a2900003703002002200b2900003703a80220154103460d03201141016a2116200241d8016a411f6a221b2018290000370000200241d8016a41186a22182017290300370300200241d8016a41106a2217201329030037030020072014290300370300200220022903a8023703d801024020112012470d00200f20162016200f491b2212ad42287e2219422088a70d052019a722144100480d0502402011450d00200620102014101e22060d010c070b2014101f2206450d060b200620106a221420153a0000201441206a201b290000370000201441196a2018290300370000201441116a2017290300370000201441096a2007290300370000201441016a20022903d801370000200f41026a210f201041286a21102016211120162003490d000b0b2000201236020420002006360200200041086a2016360200200241f0026a24000f0b200241e0026a41086a200241c8016a41086a280200360200200241a8026a41086a220520024190016a41086a290300370300200241a8026a41106a220120024190016a41106a290300370300200241a8026a41186a221420024190016a41186a290300370300200241a8026a41206a20024190016a41206a290300370300200241a8026a41286a20024190016a41286a290300370300200241a8026a41306a20024190016a41306a280200360200200220022903c8013703e00220022002290390013703a802200241033a0020200241a8026a411f6a200b411f6a2900003700002014200b41186a2900003703002001200b41106a2900003703002005200b41086a2900003703002002200b2900003703a8020b2000410036020002402011450d00200621050340024020052d00002201450d00024020014101470d00200541086a280200450d01200541046a280200101d200541286a2105201041586a22100d020c030b200541106a280200450d002005410c6a280200101d0b200541286a2105201041586a22100d000b0b02402012450d002006101d0b200241f0026a24000f0b1021000b201441081020000b102e000b900d010a7f23004180026b2202240002400240024002402001411041f8b3c200410041001002417f460d00200241e0016a41186a22034200370300200241e0016a41106a4200370300200241e0016a41086a22044200370300200242003703e001410020014110200241e0016a41204100100222052005417f461b220541204922060d03200241c0016a41186a2003290300370300200241c0016a41106a2203200241e0016a41106a290300370300200241c0016a41086a2004290300370300200220022903e0013703c001200241003a00e00120014110200241e0016a41012005412020061b2204100241016a41014b2205450d0320022d00e0012106200241186a200241c0016a41186a290300370300200241106a2003290300370300200241086a200241c0016a41086a290300370300200220022903c001370300200241003a00e00120014110200241e0016a4101200420056a2203100241016a41014b2204450d03200320046a210320022d00e0012204450d0120044101470d03200241f8016a4200370300200241e0016a41106a4200370300200241e8016a4200370300200242003703e00120014110200241e0016a4120200310022204417f460d032004411f4d0d03200241c0016a41186a2204200241e0016a41186a290300370300200241c0016a41106a2205200241e0016a41106a290300370300200241c0016a41086a2207200241e0016a41086a290300370300200220022903e0013703c001200241a0016a41186a22082004290300370300200241a0016a41106a22042005290300370300200241a0016a41086a22052007290300370300200220022903c0013703a00120024180016a41186a200829030037030020024180016a41106a200429030037030020024180016a41086a2005290300370300200220022903a00137038001200341206a2103410121050c020b200041023a002120024180026a24000f0b410021050b200241e0006a41186a20024180016a41186a290300370300200241e0006a41106a20024180016a41106a290300370300200241e0006a41086a20024180016a41086a2903003703002002200229038001370360200241003a00e00120014110200241e0016a41012003100241016a41014b2207450d0041002104024020022d00e0012208450d0020084101470d01200241f8016a4200370300200241e0016a41106a4200370300200241e8016a4200370300200242003703e00120014110200241e0016a4120200320076a10022201417f460d012001411f4d0d01200241c0016a41186a2201200241e0016a41186a290300370300200241c0016a41106a2203200241e0016a41106a290300370300200241c0016a41086a2204200241e0016a41086a290300370300200220022903e0013703c001200241a0016a41186a22072001290300370300200241a0016a41106a22012003290300370300200241a0016a41086a22032004290300370300200220022903c0013703a00120024180016a41186a200729030037030020024180016a41106a200129030037030020024180016a41086a2003290300370300200220022903a00137038001410121040b200241206a41186a220120024180016a41186a290300370300200241206a41106a220320024180016a41106a290300370300200241206a41086a220720024180016a41086a2903003703002002200229038001370320200241c0006a41186a2208200241e0006a41186a290300370300200241c0006a41106a2209200241e0006a41106a290300370300200241c0006a41086a220a200241e0006a41086a29030037030020022002290360370340200041186a200241186a290300370000200041106a200241106a290300370000200041086a200241086a29030037000020002002290300370000200241e0016a41186a220b2008290300370300200241e0016a41106a22082009290300370300200241e0016a41086a2209200a290300370300200241c0016a41086a220a2007290300370300200241c0016a41106a22072003290300370300200241c0016a41186a22032001290300370300200220022903403703e001200220022903203703c001200020053a0021200020063a0020200041c2006a20043a0000200020022903e0013700222000412a6a2009290300370000200041326a20082903003700002000413a6a200b290300370000200041c3006a20022903c001370000200041cb006a200a290300370000200041d3006a2007290300370000200041db006a200329030037000020024180026a24000f0b41df88c0004133103a000be90101047f230041b0016b220224000240024002402001411041f8b3c200410041001002417f460d002002421037020c20022001360208200241d8006a200241086a105e20022802582201450d02200241e0006a2802002103200228025c2104200241e8006a200241086a105f20022d006822054102460d01200241156a200241e8006a41017241c10010ce031a200020053a000c2000200336020820002004360204200020013602002000410d6a200241156a41c30010ce031a200241b0016a24000f0b200041023a000c200241b0016a24000f0b2004450d002001101d0b41df88c0004133103a000bdd0403027f017e0d7f230041d0006b22022400200241086a200110d50102400240024002400240024002400240024002402002280208450d00200228020c2203ad2204421b88a70d032004420586a72205417f4c0d032005450d012005101f2206450d042003450d020c050b20004100360200200241d0006a24000f0b4101210620030d030b410021054100210d0c030b102e000b200541011020000b200241306a41186a2107200241306a41106a2108200141046a21094100210a4100210b4100210c2003210d03402007420037030020084200370300200241306a41086a220e420037030020024200370330200141086a2205410020012802002009280200200241306a412020052802001002220f200f417f461b220f4120200f4120491b20052802006a360200200f411f4d0d02200c41016a2105200241106a41186a220f2007290300370300200241106a41106a22102008290300370300200241106a41086a2211200e290300370300200220022903303703100240200c200d470d00200a20052005200a491b220dad4205862204422088a70d042004a7220e4100480d040240200c450d002006200b200e101e22060d010c060b200e101f2206450d050b2006200b6a220c2002290310370000200c41186a200f290300370000200c41106a2010290300370000200c41086a2011290300370000200a41026a210a200b41206a210b2005210c20052003490d000b0b2000200d36020420002006360200200041086a2005360200200241d0006a24000f0b200041003602000240200d450d002006101d0b200241d0006a24000f0b1021000b200e41011020000bd10901087f230041a0016b2202240041002103200241003a0080012001280200200128020420024180016a410120012802081002210420012001280208200441016a41014b22046a2205360208024002402004450d00024020022d0080012204450d0020044101470d0120024180016a41186a2206420037030020024180016a41106a2207420037030020024180016a41086a220842003703002002420037038001200141086a220341002001280200200141046a28020020024180016a41202005100222042004417f461b2204412020044120491b20032802006a22053602002004411f4d0d01200241e0006a41186a22042006290300370300200241e0006a41106a22032007290300370300200241e0006a41086a220620082903003703002002200229038001370360200241c0006a41186a22072004290300370300200241c0006a41106a22042003290300370300200241c0006a41086a2203200629030037030020022002290360370340200241206a41186a2007290300370300200241206a41106a2004290300370300200241206a41086a200329030037030020022002290340370320410121030b200241186a200241206a41186a290300370300200241106a200241206a41106a290300370300200241086a200241206a41086a2903003703002002200229032037030041002106200241003a0080012001280200200141046a28020020024180016a4101200510022104200141086a22052005280200200441016a41014b22046a22053602002004450d01024020022d0080012204450d0020044101470d0220024180016a41186a2206420037030020024180016a41106a2207420037030020024180016a41086a220842003703002002420037038001200141086a220441002001280200200141046a28020020024180016a41202005100222012001417f461b2201412020014120491b20042802006a3602002001411f4d0d02200241e0006a41186a22012006290300370300200241e0006a41106a22042007290300370300200241e0006a41086a220520082903003703002002200229038001370360200241c0006a41186a22062001290300370300200241c0006a41106a22012004290300370300200241c0006a41086a2204200529030037030020022002290360370340200241206a41186a2006290300370300200241206a41106a2001290300370300200241206a41086a200429030037030020022002290340370320410121060b200241e0006a41186a2201200241206a41186a290300370300200241e0006a41106a2204200241206a41106a290300370300200241e0006a41086a2205200241206a41086a2903003703002002200229032037036020024180016a41186a2207200241186a29030037030020024180016a41106a2208200241106a29030037030020024180016a41086a2209200241086a2903003703002002200229030037038001200020033a0000200041216a20063a00002000200229038001370001200041096a2009290300370000200041116a2008290300370000200041196a2007290300370000200041226a20022903603700002000412a6a2005290300370000200041326a20042903003700002000413a6a2001290300370000200241a0016a24000f0b200041023a0000200241a0016a24000f0b200041023a0000200241a0016a24000b8b0202037f017e230041206b22022400024002402001411041f8b3c200410041001002417f460d002002411036020420022001360200200242003703102002410020014110200241106a41084100100222032003417f461b2203410820034108491b2204360208200341074d0d012002290310210520024100360210200241086a410020014110200241106a41042004100222012001417f461b22014104200141044922011b20046a36020020010d0120022802102101200241106a2002105e20022802102203450d01200020022902143703102000200336020c2000200136020820002005370300200241206a24000f0b2000410036020c200241206a24000f0b41df88c0004133103a000bc60401067f230041106b220224002002410036020820024201370300200120021062200141046a20021062200141086a20021062200228020421032002280208210402400240024002400240024002400240024002400240024002400240024020012d00184101470d0020032004470d01200441016a22032004490d0c20044101742205200320032005491b22054100480d0c2004450d03200228020020042005101e2203450d040c090b20032004470d01200441016a22032004490d0b20044101742205200320032005491b22054100480d0b2004450d04200228020020042005101e2203450d050c060b200228020021030c080b200228020021030c050b2005101f22030d050b200541011020000b2005101f22030d010b200541011020000b20022005360204200220033602000b200241086a200441016a360200200320046a41003a00000c020b20022005360204200220033602000b200241086a200441016a360200200320046a41013a00000b200128020c21062002200141146a280200220136020c2002410c6a2002106202400240024020022802042205200241086a28020022036b20014f0d00200320016a22042003490d0320054101742207200420042007491b22074100480d032005450d01200228020020052007101e2204450d020c040b200228020021040c040b2007101f22040d020b200741011020000b1021000b2002200736020420022004360200200721050b200420036a2006200110ce031a200041102004200320016a100302402005450d002004101d0b200241106a24000b9d0701037f024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020002802002202413f4b0d00200141046a280200200141086a2802002200470d01200041016a22032000490d1120004101742204200320032004491b22044100480d112000450d05200128020020002004101e2203450d060c170b2002418080014f0d01200141046a2802002203200141086a28020022006b41024f0d02200041026a22042000490d1020034101742200200420042000491b22004100480d102003450d08200128020020032000101e2203450d090c140b200128020021030c160b20024180808080044f0d01200141046a2802002203200141086a28020022006b41044f0d04200041046a22042000490d0e20034101742200200420042000491b22004100480d0e2003450d08200128020020032000101e22030d090c0f0b200128020021030c120b200141046a280200200141086a2802002202470d03200241016a22032002490d0c20024101742204200320032004491b22044100480d0c2002450d09200128020020022004101e22030d0a0c0e0b2004101f22030d110b200441011020000b200128020021030c050b200128020021030c070b2000101f22030d0b0b200041011020000b2000101f2203450d060b20012003360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200320006a20024102744102723600000f0b2004101f2203450d040b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41033a0000200028020021030240024002400240200141046a2802002202200428020022006b41044f0d00200041046a22042000490d0420024101742200200420042000491b22004100480d042002450d01200128020020022000101e22020d020c070b200128020021020c020b2000101f2202450d050b20012002360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200220006a20033600000f0b1021000b200041011020000b200441011020000b200041011020000b20012003360200200141046a2000360200200141086a28020021000b200141086a200041026a360200200320006a20024102744101723b00000f0b20012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a20024102743a00000bcf0101047f200020014105746a210320002104024002400340200320046b41ff004d0d014101210520042002460d0220042002412010d003450d02200441206a22062002460d0220062002412010d003450d02200441c0006a22062002460d0220062002412010d003450d02200441e0006a22062002460d0220044180016a210420062002412010d0030d000c020b0b024020042003460d00200020014105746a210603404101210520022004460d0220042002412010d003450d022006200441206a2204470d000b0b41000f0b20050b5201027e02402003450d0020022802000d00200128022c220342002003290308220420023502047d220520052004562005507222021b37030820004105410420021b3602000f0b41e8dac00041f403103a000bbc0d05057f027e017f017e047f230041b00a6b220424000240024002400240024002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120034102460d0220022802200d0220034103460d0320022802300d0320022802042105200241146a2802002106200241246a2802002107200241346a2802002108200441186a200128022429033042004220420010d203200128022c2202420020022903082209427f200429031820042903204200521b7d220a200a200956200a507222031b37030841052102024020030d004120101f220b450d05200b4200370000200b41176a4200370000200b41106a4200370000200b41086a4200370000200b411f6a41003a0000024020012802282802082005200b412010102203417e460d0020030d07024002400240024002402006450d00200441086a200141246a28020029033042002008ad220c420010d2032001412c6a2802002203420020032903082209427f200429030820042903104200521b7d220a200a200956200a507222031b37030820030d052008450d0120084100480d102008101f220d450d1141012103200d2105024020084102490d00200d41002008417f6a220310cd0320036a2105200821030b200541003a00000c020b4100210d0c020b410021034101210d4200210c0b200141286a2802002802082007200d200310102205417e460d0120050d0c200d450d02200c2003ad42208684210a0b200128020028021821064120101f220e450d09200e200b290000370000200e41186a200b41186a290000370000200e41106a200b41106a290000370000200e41086a200b41086a290000370000200628020c0d0a2006410c6a417f360200200441f8096a41186a200641e4006a290000370300200441f8096a41106a200641dc006a290000370300200441f8096a41086a200641d4006a2900003703002004200629004c3703f80902400240200641106a220f280200220541f0c0c100460d00200641146a28020021070c010b418009101f2205450d0f41002107200541003b010620054100360200200541086a20044180016a41f80810ce031a200641146a4100360200200641106a20053602000b0240024002400240034020052f01062210410574210841002102410021030240034020082002460d01200441f8096a200520026a41086a412010d0032201450d03200241206a2102200341016a21032001417f4a0d000b2003417f6a21100b02402007450d002007417f6a2107200520104102746a4180096a28020021050c010b0b200441286a41186a200441f8096a41186a290300370300200441286a41106a200441f8096a41106a290300370300200441286a41086a200441f8096a41086a290300370300200420042903f809370328200641186a2102410021072010210341000d010c020b200641186a21024101450d010b20044198016a420037030020044194016a41f0c0c100360200200441003602a00120044100360290012004420037038801200441f0c0c1003602840120044100360280012005200341c8006c6a41e8026a210220044180016a10320c010b200441f8096a411c6a200441286a41086a2903003702002004419c0a6a200441286a41106a290300370200200441a40a6a200441286a41186a290300370200200420023602880a200420033602840a2004200f3602800a200420053602fc09200420073602f8092004200429032837028c0a20044180016a411c6a420037020020044180016a41106a200441f0006a41086a290300370300200441a5016a2004290048370000200441ad016a200441c8006a41086a290000370000200441b5016a200441c8006a41106a290000370000200441bd016a200441c8006a41186a290000370000200441c4016a200441e7006a2800003600002004420037038001200441023a00a401200441f0c0c100360298012004200429037037038801200441f8096a20044180016a103121020b200442a0808080800437024c2004200e3602482004200a3702fc092004200d3602f80920044180016a200241186a200441c8006a200441f8096a10f8010240200428028001450d002004280284012202450d0020044188016a280200450d002002101d0b2006410c6a2202200228020041016a360200200b101d410421020c020b200c500d00200d101d0b200b101d0b20002002360200200441b00a6a24000f0b41e8dac00041f403103a000b41e8dac00041f403103a000b41e8dac00041f403103a000b41e8dac00041f403103a000b412041011020000b4198afc400102c000b412041011020000b10f901000b4198afc400102c000b1021000b200841011020000b41800941081020000bd50303017f027e017f230041c0006b220424000240024002402003450d0020022802000d00200228020421032004200128022429033042004220420010d203200128022c2202420020022903082205427f200429030020042903084200521b7d220620062005562006507222021b37030802400240024020020d004120101f2202450d0420024200370000200241176a4200370000200241106a4200370000200241086a42003700002002411f6a41003a00000240200128022828020820032002412010102203417e460d0020030d06200441106a20012802002802182203410c6a200341cc006a2003410020032802001b2002412010f7012004280210450d02200441206a41086a200441106a41086a220328020036020020042004290310370320200441306a41086a2207200328020036020020042004290310370330200141186a210302402001411c6a280200450d002003280200101d0b20032004290330370200200341086a2007280200360200410021010c030b2002101d0b20004105360200200441c0006a24000f0b200141206a4100360200410121010b2002101d2000410036020020002001360204200441c0006a24000f0b41e8dac00041f403103a000b412041011020000b4198afc400102c000ba80d06027f017e047f027e027f027e230041b0016b220424000240024002400240024002400240024002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120034102460d0220022802204101470d0220034103460d0320022802300d0320034104460d0420022802400d0420034105460d0520022802500d0520034106460d0620022802600d0620022802042105200241286a2903002106200241346a2802002107200241c4006a2802002108200241d4006a2802002109200241e4006a280200210a200441206a20012802242903304200200241146a2802002202ad420010d203200128022c220342002003290308220b427f200429032020042903284200521b7d220c200c200b56200c507222031b37030820030d0e024002402002450d0020024100480d0a2002101f2203450d0b2003210d4100210e024020024102490d00200341002002417f6a220e10cd03200e6a210d0b200d41003a0000200e41016a210e0c010b41002102410121034100210e0b024002400240200128022828020820052003200e10102205417e460d0020050d0a2003450d1120044180016a200e4120200e412049220d1b22056a41004100412020056b2005411f4b1b10cd031a20044180016a2003200510ce031a200d0d00200441306a41186a20044180016a41186a290000370300200441306a41106a20044180016a41106a290000370300200441306a41086a20044180016a41086a290000370300200420042900800137033002402002450d002003101d0b200441106a200141246a28020029033042002008ad420010d2032001412c6a280200220242002002290308220b427f200429031020042903184200521b7d220c200c200b56200c507222021b37030820020d112008450d0120084100480d0b2008101f2202450d0e2002210541002103024020084102490d00200241002008417f6a220310cd0320036a21050b200541003a0000200341016a21030c020b2002450d102003101d0c100b4100210841012102410021030b024002400240200141286a28020028020820072002200310102205417e460d0020050d0d2002450d112004420037038801200442003703800120044180016a20022003411020034110491b10ce031a2003410f4d0d0020044188016a290300210f200429038001211002402008450d002002101d0b2004200141246a2802002903304200200aad420010d2032001412c6a280200220242002002290308220b427f200429030020042903084200521b7d220c200c200b56200c507222021b37030820020d11200a450d01200a4100480d0b200a101f2202450d1041012103200221050240200a4102490d0020024100200a417f6a220310cd0320036a2105200a21030b200541003a00000c020b2008450d102002101d0c100b4100210a41012102410021030b02400240024002400240200141286a28020028020820092002200310102205417e460d0020050d112002450d13200141206a41003602002001411c6a280200210e20012802182108200142013702182001412c6a2802002205290308220b210c2006500d012006210c200b20065a0d0141012103200e450d022008101d200a0d030c040b200a450d122002101d0c120b2005200b200c7d3703082005290310210b200441d0006a41186a200541186a2903003703002004200c3703582004200c3703502004200b3703602001280200280218210720044180016a41186a200441306a41186a29030037030020044180016a41106a200441306a41106a29030037030020044180016a41086a200441306a41086a2903003703002004200429033037038001200441003602a8012004200e3602a401200420083602a001200441f0006a200720044180016a2010200f200441d0006a20022003200441a0016a1041200441f0006a41086a290300210c2004280274210e200428027021082005200429035820052903087c3703084101210320084101460d00200e450d0002402001411c6a2203280200450d00200141186a280200101d0b2003200c370200200141186a200e360200410021030b200a450d010b2002101d0b2000410036020020002003360204200441b0016a24000f0b41e8dac00041f403103a000b41e8dac00041f403103a000b41e8dac00041f403103a000b41e8dac00041f403103a000b41e8dac00041f403103a000b41e8dac00041f403103a000b41e8dac00041f403103a000b4198afc400102c000b1021000b200241011020000b4198afc400102c000b200841011020000b4198afc400102c000b200a41011020000b20004105360200200441b0016a24000b961006027f017e047f027e027f027e230041e0016b22042400024002400240024002400240024002400240024002400240024002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120034102460d0220022802204101470d0220034103460d0320022802300d0320034104460d0420022802400d0420034105460d0520022802500d0520034106460d0620022802600d0620022802042105200241286a2903002106200241346a2802002107200241c4006a2802002108200241d4006a2802002109200241e4006a280200210a200441286a20012802242903304200200241146a2802002202ad420010d203200128022c220342002003290308220b427f200429032820042903304200521b7d220c200c200b56200c507222031b37030820030d13024002402002450d0020024100480d0a2002101f2203450d0b2003210d4100210e024020024102490d00200341002002417f6a220e10cd03200e6a210d0b200d41003a0000200e41016a210e0c010b41002102410121034100210e0b024002400240200128022828020820052003200e10102205417e460d0020050d0a2003450d16200441f8006a200e4120200e412049220d1b22056a41004100412020056b2005411f4b1b10cd031a200441f8006a2003200510ce031a200d0d00200441386a41186a200441f8006a41186a290000370300200441386a41106a200441f8006a41106a290000370300200441386a41086a200441f8006a41086a2900003703002004200429007837033802402002450d002003101d0b200441186a200141246a28020029033042002008ad420010d2032001412c6a280200220242002002290308220b427f200429031820042903204200521b7d220c200c200b56200c507222021b37030820020d162008450d0120084100480d0b2008101f2202450d0e2002210541002103024020084102490d00200241002008417f6a220310cd0320036a21050b200541003a0000200341016a21030c020b2002450d152003101d0c150b4100210841012102410021030b024002400240200141286a28020028020820072002200310102205417e460d0020050d0d2002450d16200442003703c001200442003703b801200441b8016a20022003411020034110491b10ce031a2003410f4d0d00200441c0016a290300210f20042903b801211002402008450d002002101d0b200441086a200141246a2802002903304200200aad420010d2032001412c6a280200220242002002290308220b427f200429030820042903104200521b7d220c200c200b56200c507222021b37030820020d16200a450d01200a4100480d0b200a101f2202450d1041012103200221050240200a4102490d0020024100200a417f6a220310cd0320036a2105200a21030b200541003a00000c020b2008450d152002101d0c150b4100210a41012102410021030b02400240200141286a28020028020820092002200310102205417e460d0020050d0e2002450d15200141206a41003602002001412c6a2802002205290308220b210c02402006500d004101210e2006210c200b2006540d130b2005200b200c7d3703082005290310210b20044198016a41186a200541186a2903003703002004200c3703a0012004200c370398012004200b3703a801200441b8016a20012802002802182010200f20044198016a200441386a20022003102f4101210e20042d00b8014101470d01200441d8006a41086a200441f8006a41086a290300370300200441d8006a41106a200441f8006a41106a290300370300200441d8006a41186a200441f8006a41186a290300370300200541086a220320044198016a41086a29030020032903007c37030020042004290378370358200a0d130c140b200a450d142002101d0c140b200441f8006a41186a2203200441d1016a290000370300200441f8006a41106a220e200441c9016a290000370300200441f8006a41086a2208200441c1016a290000370300200420042900b901370378200441d8006a41086a22072008290300370300200441d8006a41106a2208200e290300370300200441d8006a41186a220e2003290300370300200541086a220320044198016a41086a29030020032903007c37030020042004290378370358200441b8016a41186a200e290300370300200441b8016a41106a2008290300370300200441b8016a41086a2007290300370300200420042903583703b8010240024002402001411c6a2802002205200141206a28020022036b41204f0d00200341206a220e2003490d0b20054101742203200e200e2003491b22034100480d0b2005450d01200141186a28020020052003101e2205450d020c110b200141186a28020021050c110b2003101f22050d0f0b200341011020000b41e8dac00041f403103a000b41e8dac00041f403103a000b41e8dac00041f403103a000b41e8dac00041f403103a000b41e8dac00041f403103a000b41e8dac00041f403103a000b41e8dac00041f403103a000b4198afc400102c000b1021000b200241011020000b4198afc400102c000b200841011020000b4198afc400102c000b200a41011020000b2001411c6a2003360200200141186a2005360200200141206a28020021030b200141206a200341206a360200200520036a220341186a200441b8016a41186a290300370000200341106a200441b8016a41106a290300370000200341086a200441b8016a41086a290300370000200320042903b8013700004100210e0b200a450d010b2002101d0b200041003602002000200e360204200441e0016a24000f0b20004105360200200441e0016a24000bd30403027f027e057f230041106b22042400024002400240024002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120022802042105200420012802242903184200200241146a2802002202ad420010d203200128022c2203420020032903082206427f200429030020042903084200521b7d220720072006562007507222031b37030820030d09200128020c21032001410036020c2003450d02200141106a29020022074280808080105a0d03024002400240024020022007422088a722084d0d002007a7220920086b200220086b220a4f0d012008200a6a220b2008490d082009410174220c200b200b200c491b220b4100480d082009450d0220032009200b101e2203450d030c090b2002200820022008491b21020c0b0b2003200822096a210b200a4102490d090c080b200b101f22030d060b200b41011020000b41e8dac00041f403103a000b41e8dac00041f403103a000b41dcdec00041fd00103a000b41d0cfc200102c000b1021000b20074220882106200bad210720032006a722096a210b200a4102490d010b200b410020022008417f7322086a10cd031a2003200920026a20086a22096a210b0b200b41003a0000200941016a21020b0240200128022828020820052003200210102208417e460d0020080d022007a72108024020012802302205450d00200141346a280200450d002005101d0b200141386a2002360200200141346a2008360200200141306a20033602000c010b2007a7450d002003101d0b20004105360200200441106a24000f0b4198afc400102c000b900101027f2001280200210402404120101f2205450d002005200429001c370000200541186a200441346a290000370000200541106a2004412c6a290000370000200541086a200441246a29000037000002402001411c6a2204280200450d00200141186a280200101d0b20004104360200200442a08080808004370200200141186a20053602000f0b412041011020000b960101027f2001280200280218210402404120101f2205450d002005200429004c370000200541186a200441e4006a290000370000200541106a200441dc006a290000370000200541086a200441d4006a29000037000002402001411c6a2204280200450d00200141186a280200101d0b20004104360200200442a08080808004370200200141186a20053602000f0b412041011020000b7703017f027e017f200128022c220441186a29030021052004290310210602404110101f2204450d00200420063700002004200537000802402001411c6a2207280200450d00200141186a280200101d0b20004104360200200742908080808002370200200141186a20043602000f0b411041011020000b6202017e027f200128022c290308210402404108101f2205450d002005200437000002402001411c6a2206280200450d00200141186a280200101d0b20004104360200200642888080808001370200200141186a20053602000f0b410841011020000bab03020b7f027e230041106b22042400024002402001280200280218220528020c22064100480d00200641ffffffff07460d00200541cc006a21072005410c6a200641016a2208360200200541106a2106200541146a28020021090240024003402006280200220b41086a210c200b2f0106220a41057421064100210d0240024003402006450d012007200c412010d003220e450d02200641606a2106200d41016a210d200c41206a210c200e417f4a0d000b200d417f6a210a0b2009450d022009417f6a2109200b200a4102746a4180096a21060c010b0b200b41e8026a200d41c8006c6a2206450d002006280200450d00200641106a290300210f200641086a29030021100c010b20042005411c6a2802002007200541206a280200280214110100200441086a290300210f200528020c2108200429030021100b2005410c6a2008417f6a3602004110101f2206450d01200620103700002006200f37000802402001411c6a220c280200450d00200141186a280200101d0b20004104360200200c42908080808002370200200141186a2006360200200441106a24000f0b103f000b411041011020000b7703017f027e017f2001280200220441086a29030021052004290300210602404110101f2204450d00200420063700002004200537000802402001411c6a2207280200450d00200141186a280200101d0b20004104360200200742908080808002370200200141186a20043602000f0b411041011020000b930101027f2001280200210402404120101f2205450d002005200429003c370000200541186a200441d4006a290000370000200541106a200441cc006a290000370000200541086a200441c4006a29000037000002402001411c6a2204280200450d00200141186a280200101d0b20004104360200200442a08080808004370200200141186a20053602000f0b412041011020000b6202017e027f2001280200290310210402404108101f2205450d002005200437000002402001411c6a2206280200450d00200141186a280200101d0b20004104360200200642888080808001370200200141186a20053602000f0b410841011020000bd70a04027f027e027f047e23004180036b220424000240024002400240024002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120022802042105200441286a20012802242903304200200241146a2802002202ad420010d203200128022c2203420020032903082206427f200429032820042903304200521b7d220720072006562007507222031b37030820030d0a024002402002450d0020024100480d052002101f2203450d062003210841002109024020024102490d00200341002002417f6a220910cd0320096a21080b200841003a0000200941016a21090c010b4100210241012103410021090b02400240200128022828020820052003200910102205417e460d0020050d042003450d0c2004200936029c01200420033602980120044180026a20044198016a10b7012004280280022205410f470d010b2002450d0b2003101d0c0b0b200441a0016a20044180026a41047241dc0010ce031a20042005360238200441386a410472200441a0016a41dc0010ce031a02402002450d002003101d0b20044100360288022004420137038002200441386a20044180026a10b20120042802880221030240200428028402450d00200428028002101d0b4200210720044180026a41086a22024200370300200442003703800241eaf3c100411b20044180026a1001200441a0016a41086a2205200229030037030020042004290380023703a00102400240200441a0016a411041f8b3c200410041001002417f460d0020044200370388022004420037038002200441a0016a411020044180026a4110410010022209417f460d072009410f4d0d0720044188026a2903002106200429038002210a0c010b4200210a420021060b2002420037030020044200370380024185f4c100411b20044180026a10012005200229030037030020042004290380023703a00102400240200441a0016a411041f8b3c200410041001002417f460d0020044200370388022004420037038002200441a0016a411020044180026a4110410010022202417f460d082002410f4d0d0820044188026a290300210b20042903800221070c010b4200210b0b2001412c6a2802002202290310220c200241186a290300220d844200510d07200441186a2007200b2003ad420010d203200441086a20042903182207200a7c220a200441186a41086a29030020067c200a200754ad7c200c200d10d103200242002002290308220620042903087d220720072006562007507222031b37030802402003450d00200441386a103c0c0b0b20012802002102200441a0016a200441386a41e00010ce031a20044198026a2002280218220241e4006a29000037030020044190026a200241dc006a29000037030020044180026a41086a200241d4006a2900003703002004200229004c37038002200441a0026a200441a0016a41e00010ce031a2002413c6a22032802002201200241386a280200470d09200141016a22052001490d0320014101742209200520052009491b2205ad4207862207422088a70d032007a722094100480d03024002402001450d00200241346a28020020014107742009101e2201450d010c0a0b2009101f22010d090b200941081020000b41e8dac00041f403103a000b41e8dac00041f403103a000b4198afc400102c000b1021000b200241011020000b41df88c0004133103a000b41df88c0004133103a000b4180dac300102c000b200241386a2005360200200241346a20013602002002413c6a28020021010b200241346a28020020014107746a20044180026a41800110ce031a2003200328020041016a360200410421020c010b410521020b2000200236020020044180036a24000b1600200041003602002000200141086a2802003602040ba50202057f027e230041106b2204240002400240024002402003450d0020022802000d0020034101460d0120022802100d0120034102460d0220022802200d02410521030240200141086a2802002205200241146a2802002206490d00200520066b200241246a2802002205470d0020022802042107200128020421082004200128022429033842002005ad420010d203200128022c2202420020022903082209427f200429030020042903084200521b7d220a200a200956200a507222021b37030820020d0020012802282802082007200820066a200510112202417e460d0020020d04410421030b20002003360200200441106a24000f0b41e8dac00041f403103a000b41e8dac00041f403103a000b41e8dac00041f403103a000b41b0afc400102c000b1600200041003602002000200141206a2802003602040ba50202057f027e230041106b2204240002400240024002402003450d0020022802000d0020034101460d0120022802100d0120034102460d0220022802200d02410521030240200141206a2802002205200241146a2802002206490d00200520066b200241246a2802002205470d0020022802042107200128021821082004200128022429033842002005ad420010d203200128022c2202420020022903082209427f200429030020042903084200521b7d220a200a200956200a507222021b37030820020d0020012802282802082007200820066a200510112202417e460d0020020d04410421030b20002003360200200441106a24000f0b41e8dac00041f403103a000b41e8dac00041f403103a000b41e8dac00041f403103a000b41b0afc400102c000ba60703037f037e057f230041f0006b220424000240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120022802042105200441106a200128022422032903204200200241146a2802002206ad2207420010d203200128022c2102427f2108024020042903184200520d00427f2004290310220820032903287c220920092008541b21080b200242002002290308220920087d220820082009562008507222031b37030841052102024020030d002004200141246a28020029033042002007420010d2032001412c6a2802002203420020032903082209427f200429030020042903084200521b7d220820082009562008507222031b37030820030d00024002402006450d0020064100480d052006101f2203450d074101210a2003210b024020064102490d00200341002006417f6a220a10cd03200a6a210b2006210a0b200b41003a00000c010b4100210a41012103420021070b0240024002400240200128022828020820052003200a10102206417e460d0020060d082003450d04200441d0006a41186a22052001280200280218220241e4006a290000370300200441d0006a41106a220b200241dc006a290000370300200441d0006a41086a220c200241d4006a2900003703002004200229004c370350200241306a220628020022012002412c6a280200470d03200141016a220d2001490d072001410174220e200d200d200e491b220dad42d8007e2208422088a70d072008a7220e4100480d072001450d01200241286a280200200141d8006c200e101e22010d020c0a0b2007500d032003101d0c030b200e101f2201450d080b2002412c6a200d360200200241286a2001360200200241306a28020021010b200241286a280200200141d8006c6a22022004290350370001200241053a0000200220042f004d3b002120022007200aad422086843700282002200336002420022004290320370330200241096a200c290300370000200241116a200b290300370000200241196a2005290300370000200241236a200441cf006a2d00003a0000200241d0006a200441c0006a290300370300200241c8006a200441206a41186a290300370300200241c0006a200441206a41106a290300370300200241386a200441206a41086a2903003703002006200628020041016a360200410421020b20002002360200200441f0006a24000f0b41e8dac00041f403103a000b41e8dac00041f403103a000b1021000b4198afc400102c000b200641011020000b200e41081020000bba0603027f017e087f230041d0006b220424002004200136021c2004200041f8b3c20020011b360218200441106a200441186a10b50102400240024002400240024002402004280210450d000240024002400240024020042802142205ad2206421c88a70d002006420486a72201417f4c0d00024002402001450d002001101f2207450d032005450d010c040b4108210720050d030b410021014100210b2007450d050c030b102e000b200141081020000b200441306a4104722108410021094100210a410021002005210b0340200441306a200441186a107a200441c0006a41086a220c200841086a280200360200200420082902003703402004280230220d4104460d02200041016a2101200441206a41086a220e200c2802003602002004200429034037032002402000200b470d002009200120012009491b220bad4204862206422088a70d052006a7220c4100480d0502402000450d002007200a200c101e22070d010c070b200c101f2207450d060b2007200a6a2200200d3602002000410c6a200e280200360200200041046a2004290320370200200941026a2109200a41106a210a2001210020012005490d000b2007450d020b200420013602282004200b36022420042007360220200441086a200441206a1044200441306a20022004280208200428020c20031102002004410036024820044201370340200428023021004101101f21010240024020004105470d002001450d06200141013a0000200442818080801037024420042001360240420121060c010b2001450d06200141003a0000200442818080801037024420042001360240200141014102101e2101024020004104470d002001450d08200141003a0001200442828080802037024420042001360240420221060c010b2001450d08200141013a0001200442828080802037024420042001360240200441306a200441c0006a10d101200441c8006a3502002106200428024021010b2001ad422086200684210602402004280224450d002004280220101d0b200441d0006a240020060f0b200b450d002007101d0b41ffbac00041f000103a000b1021000b200c41081020000b410141011020000b410141011020000b410241011020000b410241011020000b0700200010c0030bcb0401057f230041106b22022400200241003a0008200241086a2001280200220320012802042204410047220510ce031a024020042005490d00200141046a200420056b22063602002001200320056a22053602000240024002400240024002400240024002402004450d0020022d0008417f6a220441034b0d04024020040e0400030204000b20024100360208200241086a20052006410420064104491b220410ce031a200141046a200620046b3602002001200520046a360200200641034d0d052000200228020836020420004100360200200241106a24000f0b20004104360200200241106a24000f0b20024100360208200241086a20052006410420064104491b220410ce031a200141046a200620046b3602002001200520046a360200200641034d0d042000200228020836020420004102360200200241106a24000f0b20024200370308200241086a20052006410820064108491b220410ce031a200141046a200620046b3602002001200520046a360200200641074d0d04200041086a200229030837030020004101360200200241106a24000f0b20024200370308200241086a20052006410820064108491b220410ce031a200141046a200620046b3602002001200520046a360200200641074d0d04200041086a200229030837030020004103360200200241106a24000f0b20004104360200200241106a24000f0b20004104360200200241106a24000f0b20004104360200200241106a24000f0b20004104360200200241106a24000f0b20004104360200200241106a24000f0b20052004102a000bb10201027f200128023021030240024002400240200241ff017122024103470d0020030d0320004100360200200128020c22000d010c020b200141346a2802002104024020024102470d002003450d00200141386a2802002102200041013602002000410c6a2002360200200041086a2004360200200041046a2003360200200128020c22000d010c020b20004102360200200041086a4110360200200041046a4180d9c00036020002402003450d002004450d002003101d0b200128020c2200450d010b200141106a280200450d002000101d0b02402001411c6a280200450d002001280218101d0b200128022822012001280200417f6a22003602000240024020000d002001280208100520012001280204417f6a22003602042000450d010b0f0b2001101d0f0b41908ec300102c000b0a0041a0d0c200102c000ba50201027f230041306b2202240020024106360214200241df8ac00036021020022001200241106a107e0240024002400240200228020022012002280208220341f8b3c200410041001002417f460d00200241286a4200370300200241206a4200370300200241186a42003703002002420037031020012003200241106a4120410010022203417f460d012003411f4d0d0120002002290310370000200041186a200241106a41186a290300370000200041106a200241106a41106a290300370000200041086a200241106a41086a2903003700002002280204450d030c020b20004200370000200041186a4200370000200041106a4200370000200041086a420037000020022802040d010c020b41df88c0004133103a000b2001101d0b200241306a24000bb30101037f024002400240024020022802042203417f4c0d00200228020021044101210202402003450d002003101f2202450d030b20022004200310ce03210520034101742204200341046a220220022004491b22044100480d01024002402003450d00200520032004101e2205450d010c050b2004101f22050d040b200441011020000b102e000b1021000b200341011020000b200020023602082000200436020420002005360200200520036a20013600000bcd0f02077f017e230041106b22022400200241003602082002420137030002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001280200417f6a220341034b0d00024020030e0400040203000b200128020421014101101f2203450d1120024101360204200241086a22042004280200220541016a36020020022003360200200320056a41023a000020022802042205200428020022036b41204f0d06200341206a22042003490d1c20054101742203200420042003491b22034100480d1c2005450d0c200228020020052003101e2204450d0d0c1f0b200141086a2802002103200128020421014101101f2204450d11200241086a22052005280200220541016a3602002002410136020420022004360200200420056a41013a00002002200336020c2002410c6a200210622003450d2020034105742106200241086a220728020021042002280204210503400240024002400240200520046b41204f0d00200441206a22032004490d2020054101742204200320032004491b22044100480d202005450d01200228020020052004101e22080d020c140b20022802002108200421030c020b2004101f2208450d120b200220043602042002200836020020072802002103200421050b2007200341206a2204360200200820036a220341086a200141086a290000370000200341106a200141106a290000370000200341186a200141186a29000037000020032001290000370000200141206a2101200641606a22060d000c210b0b2001410c6a2802002103200141086a2802002108200128020421064101101f2201450d1120024101360204200241086a22042004280200220541016a36020020022001360200200120056a41043a000020022802042205200428020022016b41044f0d02200141046a22042001490d1a20054101742201200420042001491b22014100480d1a2005450d06200228020020052001101e2204450d070c180b200141086a2802002103200128020421084101101f2201450d1120024101360204200241086a22042004280200220541016a36020020022001360200200120056a41003a00002002200336020c2002410c6a2002106220022802042205200428020022016b20034f0d02200120036a22042001490d1920054101742201200420042001491b22014100480d192005450d07200228020020052001101e2204450d080c150b200141086a2802002103200128020421054101101f2201450d1120024101360204200241086a22042004280200220841016a36020020022001360200200120086a41033a00002005290300210920022802042205200428020022016b41084f0d03200141086a22042001490d1820054101742201200420042001491b22014100480d182005450d0a200228020020052001101e2204450d0b0c120b200228020021040c160b200228020021040c130b200228020021040c190b200228020021040c0f0b2001101f22040d110b200141011020000b2001101f22040d0d0b200141011020000b2003101f22040d120b200341011020000b2001101f22040d070b200141011020000b200441011020000b410141011020000b410141011020000b410141011020000b410141011020000b410141011020000b2002200136020420022004360200200241086a28020021010b200241086a2205200141086a360200200420016a20093700000240024002400240024020022802042204200528020022016b41c0004f0d00200141c0006a22052001490d0920044101742201200520052001491b22014100480d092004450d01200228020020042001101e2204450d020c030b200228020021040c030b2001101f22040d010b200141011020000b2002200136020420022004360200200241086a28020021010b200241086a200141c0006a360200200420016a220141086a200341086a290000370000200141106a200341106a290000370000200141186a200341186a290000370000200141206a200341206a290000370000200141286a200341286a290000370000200141306a200341306a290000370000200141386a200341386a290000370000200120032900003700000c090b2002200136020420022004360200200241086a28020021010b200241086a200120036a360200200420016a2008200310ce031a0c070b2002200136020420022004360200200241086a28020021010b200241086a2205200141046a360200200420016a20062800003600002002200336020c2002410c6a2002106202400240024020022802042204200528020022016b20034f0d00200120036a22052001490d0320044101742201200520052001491b22014100480d032004450d01200228020020042001101e2204450d020c040b200228020021040c040b2001101f22040d020b200141011020000b1021000b2002200136020420022004360200200241086a28020021010b200241086a200120036a360200200420016a2008200310ce031a0c020b2002200336020420022004360200200241086a28020021030b200241086a200341206a360200200420036a220341086a200141086a290000370000200341106a200141106a290000370000200341186a200141186a290000370000200320012900003700000b20002002290300370200200041086a200241086a280200360200200241106a24000be30203047f017e017f230041306b220124002001410636020c200141df8ac000360208200141106a41a68ec100200141086a108101410021020240024002400240200128021022032001280218220441f8b3c200410041001002417f460d002001410036020820032004200141086a41044100100241016a41044d0d01200128020821020b02402001280214450d002003101d0b024002402002450d002002ad4205862205422088a70d032005a722034100480d032003101f2206450d0441002104200621030340200141106a2004107d200341186a200141106a41186a290000370000200341106a200141106a41106a290000370000200341086a200141106a41086a29000037000020032001290010370000200341206a21032002200441016a2204470d000c020b0b410121060b200020023602082000200236020420002006360200200141306a24000f0b41df88c0004133103a000b1021000b200341011020000bc80101037f024002400240024020022802042203417f4c0d00200228020021044101210202402003450d002003101f2202450d030b20022004200310ce03210520034101742204200341036a220220022004491b22044100480d01024002402003450d00200520032004101e2205450d010c050b2004101f22050d040b200441011020000b102e000b1021000b200341011020000b200020023602082000200436020420002005360200200520036a220320012f00003b0000200341026a200141026a2d00003a00000bcf0703057f017e057f230041c0006b22012400200141206a41086a2202420037030020014200370320419590c000411d200141206a1001200141086a20022903003703002001200129032037030002400240024002400240024002402001411041f8b3c200410041001002417f460d002001421037021420012001360210200141206a200141106a105e20012802202202450d0102402001280224450d002002101d0b20002802002202450d06200041046a280200450d062002101d200141c0006a24000f0b024002400240024020002802002203450d00200041086a2802002104200028020421050c010b20014106360204200141df8ac000360200200141206a41a68ec1002001108101410021040240200128022022002001280228220241f8b3c200410041001002417f460d002001410036020020002002200141044100100241016a41044d0d05200128020021040b02402001280224450d002000101d0b02402004450d002004ad4205862206422088a70d022006a722004100480d022000101f2203450d0641002102200321000340200141206a2002107d200041186a200141206a41186a290000370000200041106a200141206a41106a290000370000200041086a200141206a41086a29000037000020002001290020370000200041206a21002004200241016a2202470d000b200421050c010b4101210341002104410021050b200141206a41086a2200420037030020014200370320419590c000411d200141206a1001200141086a200029030037030020012001290320370300200141003602282001420137032020012004360210200141106a200141206a106202402004450d00200441057421074100200028020022026b2108200128022021092001280224210a2003210003400240200a20086a411f4b0d00200241206a22042002490d03200a410174220b20042004200b491b22044100480d0302400240200a450d002009200a2004101e22090d010c060b2004101f2209450d050b2004210a0b200920026a22042000290000370000200441186a200041186a290000370000200441106a200041106a290000370000200441086a200041086a290000370000200841606a2108200241206a2102200041206a2100200741606a22070d000b200141286a20023602002001200a3602242001200936022020014110200920021003200a450d070c060b2001280224210220014110200128022022092000280200100320020d050c060b1021000b200441011020000b41df88c0004133103a000b41df88c0004133103a000b200041011020000b2009101d0b2005450d002003101d0b200141c0006a24000b130020004107360204200041d8d1c2003602000b130020004109360204200041d893c0003602000b130020004101360204200041ccd5c2003602000b8e1605017f017e037f017e067f23004180066b22042400200441b8036a200141e80110ce031a200441a0026a200441b8036a10870102400240024020042802a0024101470d00200041086a20042902a4023702002000420137020020032802002200450d020c010b200441a0026a41086a290300210520044198016a200441a0026a41106a41880110ce031a20042005370308200441086a41086a20044198016a41880110ce03210620044198016a41086a22014200370300200442003703980141b2b4c000411720044198016a1001200441b8036a41086a200129030037030020042004290398013703b80341002101024002400240024002400240024002400240024002400240024002400240200441b8036a411041f8b3c200410041001002417f460d00200441003602a002200441b8036a4110200441a0026a41044100100241016a41044d0d0120042802a00221010b41042107200120026a41808080024b0d0d410021080240200441106a410020042903084201511b2201450d002001450d000240024002402001108801220520012903202209520d0041032107200120021089010d114113101f2207450d0d2007410f6a41002800c1ba40360000200741086a41002900baba40370000200741002900b2ba40370000200741134133101e2207450d0e200720012900003700132007412b6a200141186a290000370000200741236a200141106a2900003700002007411b6a200141086a29000037000020044198016a41086a220a420037030020044200370398012007413320044198016a1001200441b8036a41086a200a29030037030020042004290398013703b803200441b8036a411041f8b3c200410041001002417f460d01200442003703a002200441b8036a4110200441a0026a41084100100241016a41084d0d0820042903a00242017c21052007101d4113210a4113101f22070d020c0f0b4101410220092005541b21070c100b420121052007101d4113210a4113101f2207450d0d0b2007410f6a41002800c1ba40360000200741086a41002900baba40370000200741002900b2ba403700002007200a4133101e2207450d0d200720012900003700132007412b6a200141186a290000370000200741236a200141106a2900003700002007411b6a200141086a29000037000020044198016a41086a2201420037030020044200370398012007413320044198016a1001200441b8036a41086a200129030037030020042004290398013703b803200420053703a002200441b8036a4110200441a0026a410810032007101d0b024020032802002207450d00200341086a28020021012003280204210b4100210c0240419bb5c000411041f8b3c200410041001002417f460d00200441003602b803419bb5c0004110200441b8036a41044100100241016a41044d0d0520042802b803210c0b4114101f2208450d06200841106a41002800b4b640360000200841086a41002900acb640370000200841002900a4b640370000200841144128101e220a450d07200a200c36001420044198016a41086a220842003703002004420037039801200a411820044198016a1001200441b8036a41086a200829030037030020042004290398013703b803200441003602a802200442013703a002200420013602980120044198016a200441a0026a1062024002400240024020042802a402220d20042802a802220c6b20014f0d00200c20016a2208200c490d0c200d410174220e20082008200e491b220e4100480d0c200d450d0120042802a002200d200e101e22080d020c0d0b20042802a00221080c020b200e101f2208450d0b0b2004200e3602a402200420083602a002200e210d0b2008200c6a2007200110ce031a200441b8036a41102008200c20016a10030240200d450d002008101d0b200a101d41012108200b450d002007101d0b20042903082105200441b8036a200441306a41e80010ce031a200441a0026a200441b8036a41086a41e00010ce031a20044198016a41186a220a200641186a29030037030020044198016a41106a220c200641106a29030037030020044198016a41086a220d200641086a290300370300200420062903003703980141002101024020054201520d00200441c0056a41186a200a290300370300200441c0056a41106a200c290300370300200441c0056a41086a200d29030037030020042004290398013703c005410121010b20044198016a200441a0026a41e00010ce031a200441e0056a41186a2206200441c0056a41186a220a290300370300200441e0056a41106a220c200441c0056a41106a220d290300370300200441e0056a41086a220b200441c0056a41086a220e290300370300200420042903c0053703e005200441a0026a20044198016a41e00010ce031a200441a0056a41186a220f2006290300370300200441a0056a41106a2206200c290300370300200441a0056a41086a220c200b290300370300200420042903e0053703a005200441b8036a200441a0026a41e00010ce031a200a200f290300370300200d2006290300370300200e200c290300370300200420042903a0053703c0054102210602402001450d00200441e0056a41186a200441c0056a41186a290300370300200441e0056a41106a200441c0056a41106a290300370300200441e0056a41086a200441c0056a41086a290300370300200420042903c0053703e005410121060b200441a2016a200441e0056a41086a290300370100200441aa016a200441e0056a41106a290300370100200441b2016a200441f8056a290300370100200420063a009901200441003a009801200420042903e00537019a012004200441b8036a20044198016a108a012004280204210620042802002101200441003a00b803200420014100473a00b903200441b8036a108b0102400240419bb5c000411041f8b3c200410041001002417f460d00200441003602b803419bb5c0004110200441b8036a41044100100241016a41044d0d0320042802b80341016a210a0c010b4101210a0b20044198016a41086a220c4200370300200442003703980141b2b4c000411720044198016a1001200441b8036a41086a200c29030037030020042004290398013703b80302400240200441b8036a411041f8b3c200410041001002417f460d002004410036029801200441b8036a411020044198016a41044100100241016a41044d0d04200428029801210c0c010b4100210c0b2004200a3602b803419bb5c0004110200441b8036a4104100320044198016a41086a220a4200370300200442003703980141b2b4c000411720044198016a1001200441b8036a41086a200a29030037030020042004290398013703b8032004417f2002200c6a220a200a2002491b36029801200441b8036a411020044198016a410410030240024002402001450d0002402006411b470d00200141ebbec100460d02200141ebbec100411b10d003450d020b20002001360204200041086a200636020020004100360200200745200872450d020c120b20004100360204200041086a200636020020004100360200200745200872450d010c110b20004104360204200041013602002007452008720d100b200341046a280200450d0f2007101d0c0f0b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b411441011020000b412841011020000b1021000b200e41011020000b411341011020000b413341011020000b200a41011020000b413341011020000b2000410136020020002007360204200441386a108c0120032802002200450d010b200341046a280200450d002000101d20044180066a24000f0b20044180066a24000beb1607017f027e037f017e017f037e047f23004180046b2202240002400240200129037022034202520d00200241086a20014188016a41e00010ce031a420021030c010b20024186016a2001410b6a2d00003a0000200241e8006a41086a2001411c6a290200370300200241e8006a410d6a200141216a290000370000200220012f00093b018401200220012902143703682001410c6a280200210520012d0008210620012802102107200241c0016a200141e4006a290000370300200241b8016a200141dc006a290000370300200241b0016a200141d4006a290000370300200241a8016a200141cc006a290000370300200241a0016a200141c4006a29000037030020024188016a41106a2001413c6a29000037030020024188016a41086a200141346a2900003703002002200129002c3703880120012903002108200241c8016a41106a200141f0006a220941106a290300370300200241c8016a41086a200941086a290300370300200220092903003703c80120014180016a290300210a2001290378210b4200210c200241a8026a41086a22094200370300200242003703a802418cb9c000410d200241a8026a1001200241086a41086a2009290300370300200220022903a80237030842002104024002400240024002400240024002400240024002400240200241086a411041f8b3c200410041001002417f460d00200242003703a802200241086a4110200241a8026a41084100100241016a41084d0d0120022903a80221040b024020034201520d00200b500d022004200a200a2004541b22032003200a7d200b827d210c0b200241a8026a200c10af01200241fc016a41026a20022d00aa023a0000200241086a41086a2209200241bb026a290000370300200241086a410d6a220d200241c0026a290000370000200220022f01a8023b01fc01200220022900b30237030820022800ab02210e20022800af02210f200241e0016a410d6a200d290000370000200241e0016a41086a2009290300370300200220022903083703e001200241ec036a41026a220920024184016a41026a2d00003a0000200241a8026a41086a220d200241e8006a41086a290300370300200241a8026a410d6a2210200241e8006a410d6a290000370000200220022f0184013b01ec03200220022903683703a8020240024002400240024002400240200641ff01714101470d00200241f0036a200541067610b00120022802f003210920022802f8032005413f7122054d0d01200241e8036a41026a200920054105746a220541026a2d00003a0000200241d0036a200541136a290000370300200241d5036a200541186a290000370000200220052f00003b01e8032002200529000b3703c80320052800072107200528000321054101210620022802f4030d020c030b200241e8036a41026a20092d00003a0000200241c8036a41086a200d290300370300200241c8036a410d6a2010290000370000200220022f01ec033b01e803200220022903a8023703c8030c030b4100210620022802f403450d010b2009101d0b2006450d010b200241f0036a41026a200241e8036a41026a2d00003a0000200241a8026a41086a200241c8036a41086a290300370300200241a8026a410d6a200241c8036a410d6a290000370000200220022f01e8033b01f003200220022903c8033703a802410021090c010b410121094115210741d7c0c10021050b200241a4026a41026a2206200241f0036a41026a2d00003a0000200241086a41086a220d200241a8026a41086a2210290300370300200241086a41106a200241a8026a41106a290300370300200220022f01f0033b01a402200220022903a80237030802402009450d002000200536020420004101360200200041086a200736020020014188016a108c0120024180046a24000f0b20024193026a200d29030037000020024198026a200241086a410d6a290000370000200220022f01a4023b018002200220073600870220022005360083022002200229030837008b02200220062d00003a008202200220083703a802201020014188016a41e00010ce03210d200241af036a200f360000200241ab036a200e360000200241a0036a200241c8016a41106a29030037030020024198036a2201200241c8016a41086a290300370300200241aa036a200241fc016a41026a2d00003a0000200241b3036a20022903e001370000200241bb036a200241e0016a41086a290300370000200241c0036a200241e0016a410d6a290000370000200220022903c80137039003200220022f01fc013b01a8032002410036021020024201370308200241a8026a200241086a10b101200d200241086a10b2010240024002400240024002402002290390034201520d0020012903002203420c882204420120044201561b22044200510d08200241a0036a2903002004802104200228020c2205200241106a28020022016b41024f0d01200141026a22092001490d0e20054101742201200920092001491b22014100480d0e2005450d04200228020820052001101e2205450d050c0b0b0240200228020c200241106a2802002201470d00200141016a22052001490d0e20014101742209200520052009491b22094100480d0e2001450d02200228020820012009101e2205450d030c090b200228020821050c090b200228020821050c0a0b2009101f22050d060b200941011020000b2001101f22050d060b200141011020000b41df88c0004133103a000b41c8b0c400102c000b41a88ec300102c000b2002200936020c20022005360208200241106a28020021010b200241106a200141016a360200200520016a41003a00000c020b2002200136020c20022005360208200241106a28020021010b200241106a200141026a360200200520016a2004a741047420037aa7417f6a22014101200141014b1b2201410f2001410f491b723b00000b024002400240200228020c2206200241106a28020022016b41204f0d00200141206a22052001490d0320064101742201200520052001491b22094100480d032006450d01200228020820062009101e2205450d020c040b200228020821050c040b2009101f22050d020b200941011020000b1021000b2002200936020c20022005360208200241106a2802002101200921060b200520016a2209200241a8036a2207290000370000200941186a200741186a290000370000200941106a200741106a290000370000200941086a200741086a2900003700000240024002400240200141206a2201418102490d00200241086a41186a22094200370300200241086a41106a22074200370300200241086a41086a220e42003703002002420037030820052001200241086a1000200241c8036a41186a2009290300370300200241c8036a41106a2007290300370300200241c8036a41086a200e290300370300200220022903083703c803200241c8036a412020024188016a20024180026a100b450d01200241c8036a412020024188016a20024180026a100c45210120060d020c030b2005200120024188016a20024180026a100b450d002005200120024188016a20024180026a100c45210120060d010c020b410121012006450d010b2005101d0b02402001450d00200241c8036a41186a20024180026a41186a290300370300200241c8036a41106a20024180026a41106a290300370300200241c8036a41086a20024180026a41086a29030037030020022002290380023703c80320022903a8022104200241086a200d41e00010ce031a420121030c010b200041d998c00036020420004101360200200041086a411a360200200d108c0120024180046a24000f0b200041086a2003370300200041306a2004370300200041106a20022903c803370300200041186a200241c8036a41086a290300370300200041206a200241c8036a41106a290300370300200041286a200241c8036a41186a290300370300200041386a200241086a41e00010ce031a2000410036020020024180046a24000bb00202027f017e230041206b22012400024002404113101f2202450d002002410f6a41002800c1ba40360000200241086a41002900baba40370000200241002900b2ba40370000200241134133101e2202450d01200220002900003700132002412b6a200041186a290000370000200241236a200041106a2900003700002002411b6a200041086a29000037000042002103200141106a41086a220042003703002001420037031020024133200141106a1001200141086a200029030037030020012001290310370300024002402001411041f8b3c200410041001002417f460d002001420037031020014110200141106a41084100100241016a41084d0d01200129031021030b2002101d200141206a240020030f0b41df88c0004133103a000b411341011020000b413341011020000b9e0604017f017e037f047e230041c0006b2202240042002103200241186a41086a220442003703002002420037031841dfb9c000411b200241186a1001200241306a41086a220520042903003703002002200229031837033002400240024002400240200241306a411041f8b3c200410041001002417f460d002002420037032020024200370318200241306a4110200241186a4110410010022206417f460d022006410f4d0d02200241206a2903002107200229031821080c010b42002108420021070b200442003703002002420037031841fab9c000411b200241186a1001200520042903003703002002200229031837033002400240200241306a411041f8b3c200410041001002417f460d002002420037032020024200370318200241306a4110200241186a4110410010022204417f460d032004410f4d0d03200241206a2903002109200229031821030c010b420021090b4200210a200241086a200320092001ad420010d203200241186a20002002290308220320087c2208200241086a41086a29030020077c2008200354ad7c410110f001024020022802184101470d00200228021c2104200241c0006a240020040f0b200241186a41106a2903002108200241186a41086a22042903002107200442003703002002420037031841aeb9c0004116200241186a1001200241306a41086a20042903003703002002200229031837033002400240200241306a411041f8b3c200410041001002417f460d002002420037032020024200370318200241306a4110200241186a4110410010022204417f460d042004410f4d0d04200241206a29030021032002290318210a0c010b420021030b200241186a41086a220442003703002002420037031841aeb9c0004116200241186a1001200241306a41086a20042903003703002002200229031837033020024200200320087d200a200754ad7d2208200a20077d2207200a56200820035620082003511b22041b37032020024200200720041b370318200241306a4110200241186a41101003200241c0006a240041000f0b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000bf78a0109027f017e087f017e037f037e037f0b7e077f23004190086b2203240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001280200417f6a2204410d4b0d00024002400240024002400240024020040e0e004805090d0c0608040b030a0102000b20034188076a41086a200141106a2903003703002003200141086a2903002205370388072005a7417f6a220441064b0d49200241096a2800002106200241056a280000210720022d0001210820022d00002102024020040e070018161715191a000b20034190076a2802002109200328028c07210a200241ff0171450d2f41f1b4c0002104412a2108410021064101210b2009450d750c740b200341dc016a41026a2001410b6a2d00003a0000200341c0016a41086a200141c0006a290300370300200341c0016a41106a200141c8006a290300370300200320012f00093b01dc012003200141386a2903003703c0012001410c6a280200210c200141106a280200210d200141146a280200210b200141186a2903002105200141206a290300210e200141286a280200210a2001412c6a280200210f200141306a2802002110200141346a2802002111200141086a2d00002106200141d8006a2903002112200141d0006a2903002113200341fc016a41026a200241046a2d00003a0000200341e0016a41086a200241156a290000370300200341e0016a410d6a2002411a6a2900003700002003200241026a2f01003b01fc0120032002410d6a2900003703e0012006417f6a220741034b0d49200241096a2800002108200241056a280000210420022d0001210920022d00002102024020070e0400131112000b200920027241ff0171450d2541c9b4c0002104412821080c6e0b20034190036a41206a200141246a29020037030020034190036a41186a2001411c6a29020037030020034190036a41106a200141146a29020037030020034190036a41086a2001410c6a290200370300200320012902043703900320034188076a41206a200241206a28020036020020034188076a41186a200241186a29020037030020034188076a41106a200241106a29020037030020034188076a41086a200241086a2902003703002003200229020037038807200341b8016a20034190036a20034188076a10c70220032802bc01210820032802b801210441002107410121064101210b410121094101210a4101210d4101210c410121104101211120012802002202410d4d0d7d0c7e0b200141086a28020021072001280204210b20022d00000d0a4101210620022d00014101470d0a200241096a280000210802402007450d00200b101d0b410021104101210b410121094101210a4101210d4101210c41012111410121074100210420012802002202410d4d0d7c0c7d0b20034190036a41206a200141246a29020037030020034190036a41186a2001411c6a29020037030020034190036a41106a200141146a29020037030020034190036a41086a2001410c6a290200370300200320012902043703900320034188076a41206a200241206a28020036020020034188076a41186a200241186a29020037030020034188076a41106a200241106a29020037030020034188076a41086a200241086a2902003703002003200229020037038807200341286a20034190036a20034188076a10a603200328022c2108200328022821044100210c410121064101210b410121094101210a4101210d0c780b20034190036a200141086a41c80010ce031a20034188076a41206a200241206a28020036020020034188076a41186a200241186a29020037030020034188076a41106a200241106a29020037030020034188076a41086a200241086a2902003703002003200229020037038807200320034190036a20034188076a10f40120032802042108200328020021040c190b20034190036a41386a200141c0006a29030037030020034190036a41306a200141386a29030037030020034190036a41286a200141306a29030037030020034190036a41206a200141286a29030037030020034190036a41186a200141206a29030037030020034190036a41106a200141186a29030037030020034190036a41086a200141106a2903003703002003200141086a2903003703900320034188076a41206a200241206a28020036020020034188076a41186a200241186a29020037030020034188076a41106a200241106a29020037030020034188076a41086a200241086a2902003703002003200229020037038807200341186a20034190036a20034188076a108e02200328021c2108200328021821044100210a410121064101210b410121090c740b200141086a29030020022d000020022d000110c8022104412d21080c170b20034190036a41206a200141286a29030037030020034190036a41186a200141206a29030037030020034190036a41106a200141186a29030037030020034190036a41086a200141106a2903003703002003200141086a2903003703900320034188076a41206a200241206a28020036020020034188076a41186a200241186a29020037030020034188076a41106a200241106a29020037030020034188076a41086a200241086a2902003703002003200229020037038807200341206a20034190036a20034188076a10cc0220032802242108200328022021044100210d410121064101210b410121094101210a0c730b20034180026a41046a22092001410e6a2f01003b0100200341a8066a41086a220a200141206a290300370300200341a8066a41106a220d200141286a2903003703002003200128010a360280022003200141186a2903003703a806200141106a2903002105200141086a2d0000210420012d0009210b200341b0056a41086a220c200241156a290000370300200341b0056a410d6a22102002411a6a29000037000020032002410d6a2900003703b00520022d0001210720022d0000210620044101460d0720044102460d0520044103470d42200720067241ff01710d062003200b3a009003200341f0026a41086a22024200370300200342003703f00241e9a4c1004119200341f0026a1001200341a0026a41086a2002290300370300200320032903f0023703a002200341a0026a411020034190036a410110030c140b20034190036a41306a200141386a29030037030020034190036a41286a200141306a29030037030020034190036a41206a200141286a29030037030020034190036a41186a200141206a29030037030020034190036a41106a200141186a29030037030020034190036a41086a200141106a2903003703002003200141086a2903003703900320034188076a41206a200241206a28020036020020034188076a41186a200241186a29020037030020034188076a41106a200241106a29020037030020034188076a41086a200241086a2902003703002003200229020037038807200341306a20034190036a20034188076a10e20220032802342108200328023021040c140b41f7b5c0002104412d21084101210620022d00000d1420022d000141ff01714102470d14200141086a29030021054200210e200341f0026a41086a22024200370300200342003703f00241878bc0004110200341f0026a1001200341a0026a41086a2002290300370300200320032903f0023703a002200341a0026a411041f8b3c200410041001002417f470d4120024200370300200342003703f002418cb9c000410d200341f0026a100120034190036a41086a2002290300370300200320032903f00237039003024020034190036a411041f8b3c200410041001002417f460d00200342003703880720034190036a411020034188076a41084100100241016a41084d0d3e200329038807210e0b200e2005540d42200341f0026a41086a22024200370300200342003703f00241878bc0004110200341f0026a100120034190036a41086a2002290300370300200320032903f00237039003200320053703880720034190036a411020034188076a41081003410021040c140b20034190036a41206a200141286a29030037030020034190036a41186a200141206a29030037030020034190036a41106a200141186a29030037030020034190036a41086a200141106a2903003703002003200141086a2903003703900320034188076a41206a200241206a28020036020020034188076a41186a200241186a29020037030020034188076a41106a200241106a29020037030020034188076a41086a200241086a2902003703002003200229020037038807200341106a20034190036a20034188076a10c901200328021421082003280210210441002109410121064101210b0c6d0b20034190036a41306a200141386a29030037030020034190036a41286a200141306a29030037030020034190036a41206a200141286a29030037030020034190036a41186a200141206a29030037030020034190036a41106a200141186a29030037030020034190036a41086a200141106a2903003703002003200141086a2903003703900320034188076a41206a200241206a28020036020020034188076a41186a200241186a29020037030020034188076a41106a200241106a29020037030020034188076a41086a200241086a2902003703002003200229020037038807200341086a20034190036a20034188076a108b03200328020c2108200328020821044100210b410121060c6b0b41f1b4c0002104412a2108410021104101210602402007450d00200b101d0b4101210b410121094101210a4101210d4101210c0c6f0b200720067241ff0171450d0d0b41c9b4c0002104412821080c0e0b200241046a2d00002104200241026a2f01002111200241096a2800002108200241056a280000210f200341d7046a200a290300370000200341df046a200d2d00003a00002003200b3a00c004200320053700c70420032003280280023600c104200320032903a8063700cf04200320092f01003b00c504200341f0056a410d6a2010290000370000200341f0056a41086a200c290300370300200320032903b0053703f0050240200641ff01710d00200341c8026a410d6a2202200341f0056a410d6a290000370000200341c8026a41086a2206200341f0056a41086a290300370300200320032903f0053703c802200741ff01714101470d0020034190036a410d6a200229000037000020034190036a41086a22022006290300370300200320032903c8023703900320034188076a41106a20034190036a41106a220729030037030020034188076a41086a22062002290300370300200320032903900337038807200341d0056a410d6a220b20034188076a410d6a2209290000370000200341d0056a41086a220a200629030037030020032003290388073703d0052009200b2900003700002006200a290300370300200320032903d0053703880720034190036a41186a200341c0046a41186a2903003703002007200341c0046a41106a2903003703002002200341c0046a41086a290300370300200320032903c004370390034112101f2202450d3f200241106a41002f00cca8413b0000200241086a41002900c4a841370000200241002900bca841370000200241124132101e2202450d402002201120044110747222043b0012200220083600192002200f360015200220032903880737001d200241146a20044110763a0000200241256a20034188076a41086a2903003700002002412a6a20034195076a290000370000200341f0026a41086a22044200370300200342003703f00220024132200341f0026a1001200341a0026a41086a2004290300370300200320032903f0023703a0024120101f2204450d412004200329039003370000200441186a20034190036a41186a290300370000200441106a20034190036a41106a290300370000200441086a20034190036a41086a290300370000200341a0026a41102004412010032004101d2002101d410021040c0e0b20034188076a41106a20034190036a41106a29020037030020034188076a41086a20034190036a41086a290200370300200320032902900337038807412a210841f1b4c00021040c0d0b200341d0016a290300211220032903c801211420032802c0012115200341f0056a41086a2207200341e0016a41086a290300370300200341f0056a410d6a2216200341e0016a410d6a2900003700002003200341fe016a2d00003a00a206200320032f01fc013b01a006200320032903e0013703f005200241ff0171450d0e410121020c0f0b200341c0016a41086a290300211220032903c001211420032903d00121132003200a3a009f022003200e370097022003200537008f022003200b36008b022003200d360087022003200c360083022003200341dc016a41026a2d00003a008202200320032f01dc013b018002200341f0056a41086a2207200341e0016a41086a290300370300200341f0056a410d6a220b200341e0016a410d6a2900003700002003200341fc016a41026a2d00003a00a206200320032f01fc013b01a006200320032903e0013703f005200241ff0171450d10410121020c110b200341f0056a41086a2206200341e0016a41086a290300370300200341f0056a410d6a2207200341e0016a410d6a2900003700002003200341fe016a2d00003a00a206200320032f01fc013b01a006200320032903e0013703f005200241ff0171450d13410121020c140b20034190076a2802002104200328028c072107200820027241ff0171450d17410021064101210b02402004450d002007101d0b410121090c060b20034190076a2802002109200328028c07210a200241ff0171450d1741f1b4c0002104412a2108410021074101210b2009450d5c0c5b0b200820027241ff0171450d170c590b41f7b5c000410041f7b5c000200841ff01714102461b200241ff01711b2104412d21084101210b4101210a41012109410121070c5b0b20034194076a280200210620034190076a280200210a200328028c072107200820027241ff0171450d1702402006450d00200641186c21042007210203400240200241046a280200450d002002280200101d0b0240200241106a280200450d002002410c6a280200101d0b200241186a2102200441686a22040d000b0b410021094101210b200a450d012007101d0c010b20034188076a410c6a280200210620034190076a280200210d200328028c072107200820027241ff0171450d1702402006450d002006410c6c21042007210203400240200241046a280200450d002002280200101d0b2002410c6a2102200441746a22040d000b0b410121094100210b200d450d002007101d0b410121060b200328028807417f6a220241064b0d5441c9b4c000210441282108024020020e07005c1c551e1f1d000b20034190076a280200450d5b200328028c07101d0c5b0b200341f0026a41086a22024200370300200342003703f00241fabac1004119200341f0026a1001200341a0026a41086a2002290300370300200320032903f0023703a0022003200537039003200341a0026a411020034190036a410810030b410021040b410121060b4101210b0c580b200341d0056a41086a2007290300370300200341d0056a410d6a2016290000370000200320032d00a2063a009a06200320032f01a0063b019806200320032903f0053703d00541012102200941ff01714101470d00200341c2046a20032d009a063a000020034190036a41086a200341d0056a41086a29030037030020034190036a410d6a200341d0056a410d6a290000370000200320032f0198063b01c004200320032903d00537039003410021020c010b412a210841f1b4c00021040b200341a8066a41026a2207200341c0046a41026a2d00003a000020034188076a41086a220920034190036a41086a29030037030020034188076a41106a20034190036a41106a290300370300200320032f01c0043b01a80620032003290390033703880720020d4420034183036a200929030037000020034188036a20034195076a290000370000200320032f01a8063b01f002200320083600f702200320043600f30220032003290388073700fb02200320072d00003a00f202200c41ff01714101470d0720034190036a200d41067610b0012003280290032104200328029803200d413f7122024d0d18200420024105746a22022f0000200241026a2d000041107472210720022d001f2109200228001b210a2002290013210e200229000b2105200228000721082002280003210b41012102200328029403450d420c410b200341d0056a41086a2007290300370300200341d0056a410d6a200b290000370000200320032d00a2063a009a06200320032f01a0063b019806200320032903f0053703d00541012102200941ff01714101470d00200341c2046a20032d009a063a000020034190036a41086a200341d0056a41086a29030037030020034190036a410d6a200341d0056a410d6a290000370000200320032f0198063b01c004200320032903d00537039003410021020c010b412a210841f1b4c00021040b200341a8066a41026a2207200341c0046a41026a2d00003a000020034188076a41086a220b20034190036a41086a29030037030020034188076a41106a20034190036a41106a290300370300200320032f01c0043b01a80620032003290390033703880720020d3b200341b3026a200b290300370000200341a0026a41186a220220034195076a290000370000200320032f01a8063b01a002200320083600a702200320043600a30220032003290388073700ab02200320072d00003a00a20220034190036a200341a0026a201310e902410121172003280290034101470d052003280298032108200328029403210420100d3c0c3d0b20032903d001211420032903c801211820032903c0012119200341f0026a41086a22024200370300200342003703f00241878ec2004118200341f0026a1001200341a0026a41086a2002290300370300200320032903f0023703a002410021020240200341a0026a411041f8b3c200410041001002417f460d002003421037028c072003200341a0026a3602880720034190036a20034188076a10a4032003290390034201520d2c200341a0036a290300211a200341a8036a290300211b200341b0036a290300211c200341b8036a290300211d200341c0036a290300211e200341c8036a290300211f200341d0036a2903002120200341d8036a2802002102200341dc036a290200212120032903980321222003200341e4036a2802003602dc03200320213702d403200320023602d003200320203703c8032003201f3703c0032003201e3703b8032003201d3703b0032003201c3703a8032003201b3703a0032003201a3703980320032022370390030b419f8ec20021044135210820022013a722064f0d4820034190036a410c6a200636020020034190036a41086a220241033a00002003410b3a00900320034190036a108b01200341f0026a41086a22044200370300200342003703f00241878ec2004118200341f0026a100120022004290300370300200320032903f002370390034104101f2202450d2d2002200636000020024104410c101e2202450d2e2002200bad422086200dad843700042002410c4118101e2202450d2f2002200537000c200241184130101e2202450d302002200e37001420022011ad4220862010ad843700242002200fad422086200aad8437001c2002413041e000101e2202450d31200220123e004820022013422088a73600442002201437003c200220183700342002201937002c20034190036a4110200241cc0010032002101d410021040c480b200341d0056a41086a2006290300370300200341d0056a410d6a2007290000370000200320032d00a2063a009a06200320032f01a0063b019806200320032903f0053703d00541012102200941ff01714101470d00200341c2046a20032d009a063a000020034190036a41086a200341d0056a41086a29030037030020034190036a410d6a200341d0056a410d6a290000370000200320032f0198063b01c004200320032903d00537039003410021020c010b412a210841f1b4c00021040b200341c8026a41026a2206200341c0046a41026a2d00003a000020034188076a41086a220720034190036a41086a29030037030020034188076a41106a20034190036a41106a290300370300200320032f01c0043b01c80220032003290390033703880720020d44200341bb066a2007290300370000200341a8066a41186a20034195076a290000370000200320032f01c8023b01a806200320083600af06200320043600ab0620032003290388073700b306200320062d00003a00aa06200341f0026a41086a22024200370300200342003703f00241878ec2004118200341f0026a1001200341a0026a41086a2002290300370300200320032903f0023703a002200341a0026a411041f8b3c200410041001002417f460d0b200342103702c4042003200341a0026a3602c00420034190036a200341c0046a10a4032003290390034201520d24200341a0036a290300210e200341a8036a2903002113200341b0036a2903002112200341b8036a2903002114200341c0036a2903002118200341c8036a2903002119200341d0036a290300211a200341d8036a2802002102200341dc036a2802002104200341e0036a2802002108200329039803211b2003200341e4036a28020022063602dc03200320083602d803200320043602d403200320023602d0032003201a3703c803200320193703c003200320183703b803200320143703b003200320123703a803200320133703a0032003200e370398032003201b37039003200320063602d407200320083602d007200320043602cc07200320023602c8072003201a3703c007200320193703b807200320183703b007200320143703a807200320123703a00720032013370398072003200e370390072003201b370388070c0c0b200c4108762107200d2104200f21090c3b0b20034190036a41306a290300210e20034190036a41286a2903002105200341f0026a41186a20034190036a41206a290300370300200341f0026a41106a20034190036a41186a290300370300200341f0026a41086a20034190036a41106a29030037030020032003290398033703f00220034190036a10a703200320034190036a3602c402200320034190036a3602bc0420034188076a41186a200229030037030020034188076a41106a2209200341a0026a41106a220429030037030020034188076a41086a220a200341a0026a41086a2208290300370300200320032903a00237038807200341c0046a20034188076a103320032802c804210720032902cc042113200341fc046a4100360200200341ec046a220b4200370200200341c0046a41206a41e8cfc200360200200341dc046a41f8b3c200360200200341d4046a22164200370200200341c0046a41106a41f0c0c100360200200341a4056a20022903003702002003419c056a200429030037020020034194056a2008290300370200200342083702f4042003428080808080013702e404200341003602cc04200320133702c404200320073602c004200320032903a00237028c052003200341bc046a360288052003200341c4026a36028405200320034190036a36028005200341c8026a200341c0046a20142012200341f0026a20034180026a200f2011102f20032d00c80222230d18200a2016290200370300200341a8066a41086a20034194076a280200360200200320032902cc04370388072003200329028c073703a80620034188086a200341a8066a10d502200341c0046a41286a2802002216200341c0046a41306a280200220441d8006c6a2108200b2802002115201621022004450d1620034191076a210720034190076a210b20162102034020022d00002104200341a8066a200241016a41d70010ce031a20044106460d16200b20043a00002003410b3a0088072007200341a8066a41d70010ce031a20034188076a108b01200241d8006a22022008470d000c180b0b41a39ac0004105200720034194076a28020010034101210b02402004450d002007101d0b410021094101210a0c060b4101210b2006412a200841ff017141014622021b21082002450d1002402009450d00200a101d0b410021074101210a41012109410121060c060b20034188076a41086a29030021054108101f2202450d242002200537000041999ac000410a2002410810032002101d410021044101210b4101210a4101210941012107410121060c470b4101210b2006412a200841ff017141014622021b21082002450d0f02402009450d00200a101d0b410021064101210a41012109410121070c040b0240200641186c2202450d00200720026a21042007210203402002280200200241086a2802002002410c6a280200200241146a2802001003200241186a22022004470d000b0b02402006450d00200641186c21042007210203400240200241046a280200450d002002280200101d0b0240200241106a280200450d002002410c6a280200101d0b200241186a2102200441686a22040d000b0b4101210b0240200a450d002007101d0b4100210a0c010b02402006410c6c2202450d00200720026a21042007210203402002280200200241086a28020010092002410c6a22022004470d000b0b02402006450d002006410c6c21042007210203400240200241046a280200450d002002280200101d0b2002410c6a2102200441746a22040d000b0b4101210a0240200d450d002007101d0b4100210b0b410121090b41012107410121060b410021040c410b200341103602d007200342013703c007200342013703b807200342013703b007200342013703a807200342013703a007200342013703980720034201370390072003420137038807200342808080808080c0003703c8070b20034190036a200341a8066a200510e90202402003280290034101470d00200328029803210820032802940321040c380b200341b0036a2903002114200341a8036a2903002118200341c0036a290300210e200341b8036a2903002105200341a0036a29030021132003290398032119200341d8006a2003290388074200200bad420010d2032013427f200329035820032903604200521b7d2212201356201250722204450d05412c210841a8d4c000210641012102200d0d060c290b20034190076a280200450d3f200328028c07101d0c3f0b200b450d3e024020034188076a410c6a2802002206450d00200328028c0721022006410c6c210603400240200241046a280200450d002002280200101d0b2002410c6a2102200641746a22060d000b0b20034190076a280200450d3e200328028c07101d0c3e0b2006450d3d20034190076a280200450d3d200328028c07101d0c3d0b2009450d3c024020034188076a410c6a2802002206450d00200328028c072102200641186c210603400240200241046a280200450d002002280200101d0b0240200241106a280200450d002002410c6a280200101d0b200241186a2102200641686a22060d000b0b20034190076a280200450d3c200328028c07101d0c3c0b410021022003280294030d280c290b20034190036a200c200b20034188076a10422003280290034101470d0320034198036a2802002108200328029403210641012102200d450d230b200c101d0c220b200741f1b4c00020021b2104410021074101210b20090d320c330b200741f1b4c00020021b2104410021064101210b20090d340c350b200341f0056a41186a220720034190036a410472220241186a280200360200200341f0056a41106a2209200241106a290200370300200341f0056a41086a220a200241086a290200370300200320022902003703f005200341c0046a41186a22024200370300200341c0046a41106a4200370300200341c0046a41086a22104200370300200342003703c004200c200b200341c0046a100020034180026a41026a221120032d00c2043a0000200341c8026a41086a220f200341d3046a290000370300200341c8026a410d6a22162002290000370000200320032f01c0043b018002200320032900cb043703c80220032800c304210620032800c7042108200341d0056a41026a20112d00003a00002010200f290300370300200341c0046a410d6a2016290000370000200320032f0180023b01d005200320032903c8023703c00420034190036a41186a200728020036020020034190036a41106a200929030037030020034190036a41086a200a290300370300200320032903f005370390034114101f2202450d18200241106a41002800c2f341360000200241086a41002900baf341370000200241002900b2f341370000200241144134101e2202450d19200220032f01d0053b00142002200836001b20022006360017200220032903c00437001f200241166a200341d0056a41026a2d00003a0000200241276a200341c0046a41086a2903003700002002412c6a200341c0046a410d6a290000370000200341f0026a41086a22074200370300200342003703f00220024134200341f0026a1001200341a0026a41086a2007290300370300200320032903f0023703a002200341a0026a20034190036a10612002101d0240200341a0036a280200450d00200328029c03101d0b200341b0056a41026a20034180026a41026a2d00003a000020034190036a41086a200341c8026a41086a29030037030020034190036a410d6a200341c8026a410d6a290000370000200320032f0180023b01b005200320032903c802370390034115101f2202450d1a2002410d6a4100290094f341370000200241086a410029008ff34137000020024100290087f341370000200241154135101e2202450d1b200220032f01b0053b00152002200836001c200220063600182002200329039003370020200241176a200341b2056a2d00003a0000200241286a20034190036a41086a2903003700002002412d6a20034190036a410d6a290000370000200341f0026a41086a22074200370300200342003703f00220024135200341f0026a1001200341a0026a41086a2007290300370300200320032903f0023703a002200341003602c804200342013703c0042003200b3602d005200341d0056a200341c0046a1062024020032802c404220a20032802c80422096b200b4f0d002009200b6a22072009490d1d200a4101742210200720072010491b22104100480d1d200a450d0520032802c004200a2010101e2207450d060c1e0b20032802c00421070c1e0b200241d8006a21020b20022008460d00034020022d000022044106460d01024020044105490d00200241286a280000450d00200241246a280000101d0b200241d8006a22022008470d000b0b410021172015450d002016101d0b20034198016a20032903800320034188036a29030020032903f8022213420010d20320032903f00220137d10a503200341a8016a200341a0026a20032903980120034198016a41086a290300109f012009200e200341a8016a41086a29030022127d200520032903a801221354ad7d2012200e7d2013200554ad7d20132005582012200e582012200e5122021b22041b22143703002003200520137d201320057d20041b221837039007200320132005562012200e5620021b2202ad370388070240024020020d002018201410f3010c010b200a10f5010b200341f4046a2802002228200341fc046a28020022044107746a2116200341f8046a2802002129202821020240024002402004450d0020034191076a2104200341f0056a410272210820034188076a4104722127200341b1076a21252028210202400340200341b0056a41186a220b200241186a290300370300200341b0056a41106a2209200241106a290300370300200341b0056a41086a220a200241086a290300370300200320022903003703b005200241206a2802002107200341a8066a200241246a41dc0010ce031a2007410f460d01200341d0056a41186a2215200b290300370300200341d0056a41106a22242009290300370300200341d0056a41086a2226200a290300370300200320032903b0053703d00520032007360288072027200341a8066a41dc0010ce031a200820032903b005370000200841086a200a290300370000200841106a2009290300370000200841186a200b29030037000020034180023b01f00520034190016a20034188076a200341f0056a108a01200328029001210720034188076a41086a41043a000020252007453a0000200420032903d005370000200441086a2026290300370000200441106a2024290300370000200441186a20152903003700002003410b3a00880720034188076a108b0120024180016a22022016470d000b201622022016470d020c030b20024180016a21020b20022016460d010b20034188076a41206a210920034188076a410b6a210820034188076a41246a2127200341f0056a410d6a2107200341f0056a41086a210b0340200320022f01003b01a0062003200241026a2d00003a00a206200241036a280000210a200241076a28000021152007200241186a290000370000200b200241136a29000037030020032002410b6a2900003703f005200241206a280200210420034188076a200241246a41dc0010ce031a2004410f460d01200341d0056a41086a2224200b290300370300200341d0056a410d6a22262007290000370000200320032d00a2063a009a06200320032f01a0063b019806200320032903f0053703d005200341a8066a20034188076a41dc0010ce031a20092004360200200820032903d005370000200841086a20242903003700002008410d6a20262900003700002003201536008f072003200a36008b07200320032d009a063a008a07200320032f0198063b0188072027200341a8066a41dc0010ce031a2009103c20024180016a22022016470d000b0b02402029450d002028101d0b200341d0026a280200210841002104024020234101470d0020032802cc0221040b024020032802c0042202450d0020032802c404450d002002101d0b2017450d1c200341c0046a41186a280200210a200341d0046a280200210202400240200341c0046a41146a280200220b450d00200b210920022107034020072802800921072009417f6a22090d000b0340200220022f01064102746a4180096a2802002102200b417f6a220b0d000c020b0b200221070b200341a4076a20022f010636020020034188076a41186a410036020020034188076a41146a20023602002003200a3602a807200341003602980720034200370390072003200736028c07200341003602880720034188076a103b0240200341f0046a2802002207450d00200341c0046a41286a2802002102200741d8006c21070340024020022d00004105490d00200241286a280200450d00200241246a280200101d0b200241d8006a2102200741a87f6a22070d000b0b200341ec046a280200450d1c200341e8046a280200101d20100d1d0c1e0b2010101f22070d180b201041011020000b10f002000b41df88c0004133103a000b200341a4036a4101360200200341183602c404200341c0adc4003602c0042003420137029403200341c8adc400360290032003200341c0046a3602a00320034190036a4184d9c20010cf01000b20034190036a41146a41013602002003411836028c07200341c0adc400360288072003420137029403200341c8adc40036029003200320034188076a3602a00320034190036a41bca4c40010cf01000b200341a4036a4101360200200341183602c404200341c0adc4003602c0042003420137029403200341c8adc400360290032003200341c0046a3602a00320034190036a4184d9c30010cf01000b41b8d0c200102c000b41d0d0c200102c000b41df88c0004133103a000b411241011020000b413241011020000b412041011020000b41df88c0004133103a000b410841011020000b410441011020000b410c41011020000b411841011020000b413041011020000b41e00041011020000b411441011020000b413441011020000b411541011020000b413541011020000b1021000b200320103602c404200320073602c0042010210a0b200720096a200c200b10ce031a200341a0026a411020072009200b6a10030240200a450d002007101d0b2002101d0240200d450d00200c101d0b200341d0056a41026a220220034180026a41026a2d00003a0000200341c0046a41086a2207200341c8026a41086a290300370300200341c0046a410d6a220b200341c8026a410d6a290000370000200320032f0180023b01d005200320032903c8023703c00420034190036a41086a41023a0000200341a0036a20083602002003419c036a200636020020034199036a20032f01d0053b0000200341a4036a20032903c004370200200341ac036a2007290300370200200341b1036a200b29000037000020022d000021022003410b3a00900320034190036a410b6a20023a000020034190036a108b01410021020b200341386a201820144200201220041b2213420010d203201920137d10a503200341c8006a200341a8066a2003290338200341386a41086a290300109f01200341a0036a200e200341c8006a41086a29030022127d20052003290348221354ad7d2012200e7d2013200554ad7d20132005582012200e582012200e5122041b22071b22143703002003200520137d201320057d20071b221837039803200320132005562012200e5620041b2204ad370390030240024020040d002018201410f3014100210420020d010c100b20034190036a41086a10f501410021042002450d0f0b200621040c0e0b2010450d010b200f101d0b4101210241002107200641044d0d060c070b2004101d0b200b41d7c0c10020021b21042008411520021b21082002450d012008210b0b20034190036a200341f0026a201310e9024101211702402003280290034101470d002003280298032108200328029403210420110d020c030b20034190036a41306a290300211820034190036a41286a2903002113200341b0056a41186a221620034190036a41206a290300370300200341b0056a41106a20034190036a41186a290300370300200341b0056a41086a20034190036a41106a29030037030020032003290398033703b00520034190036a10a703200320034190036a3602bc04200320034190036a3602800220034188076a41186a200341f0026a41186a220229030037030020034188076a41106a2224200341f0026a41106a220829030037030020034188076a41086a2225200341f0026a41086a2226290300370300200320032903f00237038807200341c0046a20034188076a103320032802c804212720032902cc042119200341fc046a4100360200200341ec046a22284200370200200341c0046a41206a41e8cfc200360200200341dc046a41f8b3c200360200200341d4046a22294200370200200341c0046a41106a41f0c0c100360200200341a4056a20022903003702002003419c056a200829030037020020034194056a2026290300370200200342083702f4042003428080808080013702e404200341003602cc04200320193702c404200320273602c004200320032903f00237028c05200320034180026a360288052003200341bc046a36028405200320034190036a36028005200320093a00a7072003200a3600a3072003200e37009b0720032005370093072003200b36008f072003200436008b07200320073b018807200320074110763a008a07200341003602b006200342013703a806200341a0026a200341c0046a20034188076a20142012200341b0056a20102015200341a8066a1041024020032802a00222230d0020252029290200370300200341a8066a41086a20034194076a280200360200200320032902cc04370388072003200329028c073703a80620034188086a200341a8066a10d502200341c0046a41286a2802002209200341c0046a41306a280200220441d8006c6a21082028280200210a20092102024002402004450d0020034191076a210720034190076a210b200921020240034020022d00002104200341a8066a200241016a41d70010ce031a20044106460d01200b20043a00002003410b3a0088072007200341a8066a41d70010ce031a20034188076a108b01200241d8006a22022008470d000c030b0b200241d8006a21020b20022008460d00034020022d000022044106460d01024020044105490d00200241286a280000450d00200241246a280000101d0b200241d8006a22022008470d000b0b41002117200a450d002009101d0b200341f0006a20032903c005201629030020032903b8052205420010d20320032903b00520057d10a50320034180016a200341f0026a2003290370200341f0006a41086a290300109f012024201820034180016a41086a290300220e7d2013200329038001220554ad7d200e20187d2005201354ad7d2005201358200e201858200e20185122021b22041b22123703002003201320057d200520137d20041b22143703900720032005201356200e20185620021b2202ad370388070240024020020d002014201210f3010c010b202510f5010b200341f4046a2802002228200341fc046a28020022044107746a2116200341f8046a2802002129202821020240024002402004450d0020034191076a2104200341f0056a410272210820034188076a4104722127200341b1076a21252028210202400340200341d0056a41186a220b200241186a290300370300200341d0056a41106a2209200241106a290300370300200341d0056a41086a220a200241086a290300370300200320022903003703d005200241206a2802002107200341a8066a200241246a41dc0010ce031a2007410f460d01200341c8026a41186a2215200b290300370300200341c8026a41106a22242009290300370300200341c8026a41086a2226200a290300370300200320032903d0053703c80220032007360288072027200341a8066a41dc0010ce031a200820032903d005370000200841086a200a290300370000200841106a2009290300370000200841186a200b29030037000020034180023b01f005200341e8006a20034188076a200341f0056a108a012003280268210720034188076a41086a41043a000020252007453a0000200420032903c802370000200441086a2026290300370000200441106a2024290300370000200441186a20152903003700002003410b3a00880720034188076a108b0120024180016a22022016470d000b201622022016470d020c030b20024180016a21020b20022016460d010b20034188076a41206a210920034188076a410b6a210820034188076a41246a2127200341f0056a410d6a2107200341f0056a41086a210b0340200320022f01003b01a0062003200241026a2d00003a00a206200241036a280000210a200241076a28000021152007200241186a290000370000200b200241136a29000037030020032002410b6a2900003703f005200241206a280200210420034188076a200241246a41dc0010ce031a2004410f460d01200341d0056a41086a2224200b290300370300200341d0056a410d6a22262007290000370000200320032d00a2063a009a06200320032f01a0063b019806200320032903f0053703d005200341a8066a20034188076a41dc0010ce031a20092004360200200820032903d005370000200841086a20242903003700002008410d6a20262900003700002003201536008f072003200a36008b07200320032d009a063a008a07200320032f0198063b0188072027200341a8066a41dc0010ce031a2009103c20024180016a22022016470d000b0b02402029450d002028101d0b200341a8026a280200210820032802a40221020240024002402023450d002002210420032802c00422020d010c020b2003200341ac026a280200360290072003200836028c0720032002360288074100210402402008450d002002101d0b20032802c0042202450d010b20032802c404450d002002101d0b2017450d00200341c0046a41186a280200210a200341d0046a280200210202400240200341c0046a41146a280200220b450d00200b210920022107034020072802800921072009417f6a22090d000b0340200220022f01064102746a4180096a2802002102200b417f6a220b0d000c020b0b200221070b200341a4076a20022f010636020020034188076a41186a410036020020034188076a41146a20023602002003200a3602a807200341003602980720034200370390072003200736028c07200341003602880720034188076a103b0240200341f0046a2802002207450d00200341c0046a41286a2802002102200741d8006c21070340024020022d00004105490d00200241286a280200450d00200241246a280200101d0b200241d8006a2102200741a87f6a22070d000b0b200341ec046a280200450d00200341e8046a280200101d20110d010c020b2011450d010b2010101d0b4100210241012107200641044b0d010b024020060e050505040002050b2011452007720d042010101d0c040b20100d010c030b2010452002720d020b200f101d0c010b200d450d00200c101d0b41002111410121064101210b410121094101210a4101210d4101210c410121100c0e0b20034188076a10b30141c9b4c0002104412821080c060b200a101d0b4101210a410121090b410121060c020b200a101d0b4101210a41012109410121070b024002400240200328028807417f6a220241064b0d0002400240024020020e0700060103040502000b2006450d0520034190076a280200450d05200328028c07101d0c050b2007450d0420034190076a280200450d04200328028c07101d0c040b200b450d03024020034188076a410c6a2802002206450d00200328028c0721022006410c6c210603400240200241046a280200450d002002280200101d0b2002410c6a2102200641746a22060d000b0b20034190076a280200450d03200328028c07101d0c030b20034188076a10b3010c020b2009450d0120034190076a280200450d01200328028c07101d0c010b200a450d00024020034188076a410c6a2802002206450d00200328028c072102200641186c210603400240200241046a280200450d002002280200101d0b0240200241106a280200450d002002410c6a280200101d0b200241186a2102200641686a22060d000b0b20034190076a280200450d00200328028c07101d0b4101210b410021060b410121090b4101210a0b4101210d0b4101210c0b410121100b410121110b4101210720012802002202410d4b0d010b024002400240024002400240024002400240024002400240024020020e0e0e050e0e0e03070206000e010e040e0b200c450d0d20012d00044101470d0d2001410c6a2201280200108c012001280200101d0c0d0b2010450d0c200141086a280200450d0c2001280204101d0c0c0b200a450d0b200141086a28020022024102460d0520024101470d0b200141106a280200450d0b2001410c6a280200101d0c0b0b200b450d0a200141086a2d00002202410e4b0d0820024106470d0a200141106a280200450d0a2001410c6a280200101d0c0a0b2011450d09200141086a2d000022024102490d0920024103460d0520024102470d06200141106a280200450d092001410c6a280200101d0c090b2006450d08200141086a10b3010c080b200d450d07200141086a2d00004101470d072001410c6a2201280200108c012001280200101d0c070b2009450d06200141086a2d000022024105460d0120024101470d062001410c6a2201280200108c012001280200101d0c060b200141106a280200450d052001410c6a280200101d0c050b2001410c6a2201280200108c012001280200101d0c040b200141346a280200450d03200141306a280200101d0c030b200141306a280200450d022001412c6a280200101d0c020b200141106a280200450d012001410c6a280200101d0c010b2007450d0020012802044101470d00200141086a2201280200108c012001280200101d0b200020083602042000200436020020034190086a24000bcf0e03067f017e0a7f23004180036b2201240002400240024002400240024002400240024002400240024002400240419bb5c000411041f8b3c200410041001002417f460d00200141003602a001419bb5c0004110200141a0016a41044100100241016a41044d0d0220012802a0012102410021030c010b410121030b41082104200141a0016a41086a22054200370300200142003703a00141a5bac000410d200141a0016a1001200141106a41086a2005290300370300200120012903a001370310024002400240200141106a411041f8b3c200410041001002417f460d00200142103702242001200141106a360220200141086a200141206a10d5012001280208450d07200128020c2206ad42f8007e2207422088a70d042007a72205417f4c0d042005450d012005101f2204450d052006450d020c060b4100210e4100210c0c070b4108210420060d040b4100210c4100210e2004450d040c050b41df88c0004133103a000b102e000b200541081020000b200141a0016a4101722108200141286a21094100210a410021054100210b2006210c02400340200141003a0090022001280220200128022420014190026a410120092802001002210d20092009280200200d41016a41014b220d6a220e360200200d450d014101210f024020012d009002220d4101460d00200d0d02200141003602a0012009410020012802202001280224200141a0016a4104200e1002220d200d417f461b220d4104200d4104491b20092802006a360200200d41034d0d0220012802a00121104100210f0b200141a0016a200141206a10d60120012d00a001210d20014190026a200841ef0010ce031a200d410d460d01200b41016a210e200141316a20014190026a41ef0010ce031a200141a0016a200141316a41ef0010ce031a0240200b200c470d00200a200e200e200a491b220cad42f8007e2207422088a70d072007a722114100480d070240200b450d00200420052011101e22040d010c060b2011101f2204450d050b200420056a220b200d3a0000200b41016a200141a0016a41ef0010ce031a200b41f4006a2010360200200b41f0006a200f360200200a41026a210a200541f8006a2105200e210b200e2006490d000c030b0b0240200b450d00200421010340200110d701200141f8006a2101200541887f6a22050d000b0b200c450d002004101d0b41df88c0004133103a000b200141a0016a200041f00010ce031a200c200e470d01200e41016a2205200e490d02200e4101742209200520052009491b220cad42f8007e2207422088a70d022007a722054100480d0202400240200e450d002004200e41f8006c2005101e2204450d010c030b2005101f22040d020b200541081020000b201141081020000b2004200e41f8006c220b6a200141a0016a41f00010ce03220541f4006a200236020020052003360270200141a0016a41086a22094200370300200142003703a00141a5bac000410d200141a0016a1001200141106a41086a2009290300370300200120012903a001370310200141003602a801200142013703a0012001200e41016a22063602900220014190026a200141a0016a106202402006450d00200b41f8006a210a2004210503400240024002400240024002400240024002400240200541f0006a2802004101470d00200141013a00900220012802a4012009280200220b470d01200b41016a220d200b490d0c200b410174220f200d200d200f491b220f4100480d0c200b450d0320012802a001200b200f101e220d0d040c0d0b200141003a00900220012802a4012009280200220b470d01200b41016a220d200b490d0b200b410174220f200d200d200f491b220f4100480d0b200b450d0520012802a001200b200f101e220d0d060c0d0b4101210f20012802a001210d0c030b4100210f20012802a001210d0c050b200f101f220d450d090b2001200f3602a4012001200d3602a0012009280200210b20012d009002210f0b2009200b41016a360200200d200b6a200f3a00000c030b200f101f220d450d070b2001200f3602a4012001200d3602a0012009280200210b20012d009002210f0b2009200b41016a360200200d200b6a200f3a0000200541f4006a280200210f024002400240024020012802a401220d2009280200220b6b41044f0d00200b41046a2210200b490d07200d410174220b20102010200b491b220b4100480d07200d450d0120012802a001200d200b101e220d0d020c0a0b20012802a001210d0c020b200b101f220d450d080b2001200b3602a4012001200d3602a0012009280200210b0b2009200b41046a360200200d200b6a200f3600000b2005200141a0016a10d801200541f8006a2105200a41887f6a220a0d000b0b20012802a4012105200141106a411020012802a001220b2009280200100302402005450d00200b101d0b02402006450d00200e41f8006c41f8006a2109200421050340200510d701200541f8006a2105200941887f6a22090d000b0b0240200c450d002004101d0b20014180036a24000f0b1021000b200f41011020000b200f41011020000b200b41011020000bef0301017f02400240024002400240024002400240024002400240024002400240024020002802002201410d4b0d0020010e0e0e010e0e0e02030405060e070e080e0b20002802044101470d0d200041086a2200280200108c012000280200101d0f0b200041086a10b3010f0b200041086a2d00002201410e4b0d0a20014106470d0b200041106a280200450d0b2000410c6a280200101d0f0b200041086a2d000022014105460d0520014101470d0a2000410c6a2200280200108c012000280200101d0f0b200041086a28020022014102460d0520014101470d09200041106a280200450d092000410c6a280200101d0f0b200041086a2d00004101470d082000410c6a2200280200108c012000280200101d0f0b20002d00044101470d072000410c6a2200280200108c012000280200101d0f0b200041086a280200450d062000280204101d0f0b200041086a2d000022014102490d0520014103460d0220014102470d03200041106a280200450d052000410c6a280200101d0f0b2000410c6a2200280200108c012000280200101d0f0b200041106a280200450d032000410c6a280200101d0f0b200041346a280200450d02200041306a280200101d0f0b200041306a280200450d012000412c6a280200101d0f0b200041106a280200450d002000410c6a280200101d0f0b0bf7ce0135037f017e027f017e027f027e057f037e167f027e027f017e027f027e0d7f027e067f027e097f077e027f037e127f027e017f017e0e7f017e067f017e227f017e017f017e017f017e017f027e027f017e027f027e037f027e027f017e0c7f017e057f017e027f017e067f23004190096b22012400200141a0056a41086a22024200370300200142003703a00541838cc1004113200141a0056a1001200141b8036a41086a2002290300370300200120012903a0053703b8030240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200141b8036a411041f8b3c200410041001002417f460d00200141003a009008200141b8036a411020014190086a41014100100241016a41014d0d0220012d0090082102200141b8036a411010092002450d00200141a0056a41086a22024200370300200142003703a005419590c000411d200141a0056a100120014190086a41086a2002290300370300200120012903a00537039008024020014190086a411041f8b3c200410041001002417f460d00200142103702ac04200120014190086a3602a804200141c0056a200141a8046a105e20012802c0052203450d0420012902c405210420014190086a41101009200141063602c405200141df8ac0003602c00520014190086a41a68ec100200141c0056a1081014100210502402001280290082202200128029808220641f8b3c200410041001002417f460d00200141003602c00520022006200141c0056a41044100100241016a41044d0d0320012802c00521050b0240200128029408450d002002101d0b024002402005450d002005ad4205862207422088a70d212007a722024100480d212002101f2208450d084100210620082102034020014190086a2006107d200241186a20014190086a41186a290000370000200241106a20014190086a41106a290000370000200241086a20014190086a41086a2900003700002002200129009008370000200241206a21022005200641016a2206470d000c020b0b410121080b02400240024020052004422088a7470d00024020082003460d002005450d00410021092008210220032106034020022006412010d0030d02200241206a2102200641206a2106200941016a22092005490d000b0b2005450d012008101d2004a70d020c030b2001419c086a200536020020014198086a20053602002001200836029408200141013a00900820014190086a108e010b2004a7450d010b2003101d0b200141a0056a41086a22024200370300200142003703a00541cebac1004118200141a0056a1001200141b8036a41086a22062002290300370300200120012903a0053703b80342002104024002400240200141b8036a411041f8b3c200410041001002417f460d002001420037039008200141b8036a411020014190086a41084100100241016a41084d0d0120012903900821040b20024200370300200142003703a0054195a8c1004115200141a0056a100120062002290300370300200120012903a0053703b80302400240200141b8036a411041f8b3c200410041001002417f460d002001420037039008200141b8036a411020014190086a41084100100241016a41084d0d0320012903900822074200520d0141ecd8c300102c000b42e80721070b200141a0056a41086a22024200370300200142003703a00541e9a4c1004119200141a0056a1001200141b8036a41086a2002290300370300200120012903a0053703b803200020047d200782210a0240200141b8036a411041f8b3c200410041001002417f460d00200141003a009008200141b8036a411020014190086a41014100100241016a41014d0d0720012d0090082102200141b8036a41101009200241004721050c090b200a4200520d09410121050c080b41df88c0004133103a000b41df88c0004133103a000b41bcacc300102c000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b200241011020000b4200210b200141a0056a41086a22024200370300200142003703a005418390c100410d200141a0056a1001200141b8036a41086a22062002290300370300200120012903a0053703b803420021040240200141b8036a411041f8b3c200410041001002417f460d002001420037039008200141b8036a411020014190086a41084100100241016a41084d0d0a20012903900821040b20024200370300200142003703a00541e6bac1004114200141a0056a100120062002290300370300200120012903a0053703b8030240200141b8036a411041f8b3c200410041001002417f460d002001420037039008200141b8036a411020014190086a41084100100241016a41084d0d0b200129039008210b0b200141a0056a41086a22024200370300200142003703a0054181a8c1004114200141a0056a1001200141b8036a41086a22062002290300370300200120012903a0053703b80302400240200141b8036a411041f8b3c200410041001002417f460d002001420037039008200141b8036a411020014190086a41084100100241016a41084d0d0d20012903900842017c21070c010b420121070b20014190086a41086a2007370300200141033a00900820014190086a108b0120024200370300200142003703a0054181a8c1004114200141a0056a100120062002290300370300200120012903a0053703b8032001200737039008200141b8036a411020014190086a4108100320024200370300200142003703a00541e6bac1004114200141a0056a100120062002290300370300200120012903a0053703b8032001200437039008200141b8036a411020014190086a41081003200141a8036a41fabac1004119108f0102400240024020012903a803a74101470d0020012903b0032107200141a0056a41086a22024200370300200142003703a0054195a8c1004115200141a0056a1001200141b8036a41086a2002290300370300200120012903a0053703b8032001200737039008200141b8036a411020014190086a410810030c010b200a500d010b200141a0056a41086a22024200370300200142003703a005418cb9c000410d200141a0056a1001200141b8036a41086a22062002290300370300200120012903a0053703b803420021070240200141b8036a411041f8b3c200410041001002417f460d002001420037039008200141b8036a411020014190086a41084100100241016a41084d0d0e20012903900821070b20024200370300200142003703a00541cebac1004118200141a0056a100120062002290300370300200120012903a0053703b8032001200737039008200141b8036a411020014190086a410810030b2004200b7d2005109001200141a0056a41086a22024200370300200142003703a00541aaa8c1004112200141a0056a1001200141b8036a41086a2002290300370300200120012903a0053703b8034100210c02400240200141b8036a411041f8b3c200410041001002417f460d00200142103702c4052001200141b8036a3602c00520014190086a200141c0056a105e200128029008220d450d1120014198086a280200210c200128029408210e0c010b4101210d4100210e0b41002103200141003602900820014190086a108201200141063602c405200141df8ac0003602c00520014190086a41a68ec100200141c0056a10810102402001280290082202200128029808220641f8b3c200410041001002417f460d00200141003602c00520022006200141c0056a41044100100241016a41044d0d0e20012802c00521030b0240200128029408450d002002101d0b02402003200c4d0d0020014198086a2108200c21020340200141063602c405200141df8ac0003602c00520014190086a41a68ec100200141c0056a10810141002105024020012802900822062008280200220941f8b3c200410041001002417f460d00200141003602c00520062009200141c0056a41044100100241016a41044d0d0420012802c00521050b0240200128029408450d002006101d0b200241016a21060240200520024d0d00200141063602c405200141df8ac0003602c00520014190086a2002200141c0056a107e200128029008220220082802001009200128029408450d002002101d0b2006210220032006470d000b0b200141063602c405200141df8ac0003602c00520014190086a41a68ec100200141c0056a108101200128029808210620012802900821022001200c3602c00520022006200141c0056a410410030240200128029408450d002002101d0b0240200c4105742209450d0041002105200d21060340200141a8046a41186a2208200641186a290000370300200141a8046a41106a2203200641106a290000370300200141a8046a41086a220c200641086a290000370300200120062900003703a8044112101f2202450d07200241106a41002f00cca8413b0000200241086a41002900c4a841370000200241002900bca841370000200241124132101e2202450d08200220012903a8043700122002412a6a2008290300370000200241226a20032903003700002002411a6a200c290300370000200141a0056a41086a22084200370300200142003703a00520024132200141a0056a1001200141b8036a41086a2008290300370300200120012903a0053703b80302400240200141b8036a411041f8b3c200410041001002417f460d00200141e8036a41186a22084200370300200141e8036a41106a22034200370300200141e8036a41086a220c4200370300200142003703e803200141b8036a4110200141e8036a412041001002220f417f460d07200f411f4d0d07200141c8036a41186a220f2008290300370300200141c8036a41106a22082003290300370300200141c8036a41086a2203200c290300370300200120012903e8033703c8032002101d200141c0056a41186a200f290300370300200141c0056a41106a2008290300370300200141c0056a41086a2003290300370300200120012903c8033703c0050c010b2002101d200141c0056a41186a4200370300200141c0056a41106a4200370300200141c0056a41086a4200370300200142003703c0050b2001410636029408200141df8ac00036029008200141a0076a200520014190086a107e02400240024020012802a0072202200141a0076a41086a2208280200220341f8b3c200410041001002417f470d0020014190086a41186a420037030020014190086a41106a420037030020014190086a41086a4200370300200142003703900820012802a4070d010c020b20014188046a41186a220c420037030020014188046a41106a220f420037030020014188046a41086a2210420037030020014200370388042002200320014188046a4120410010022203417f460d082003411f4d0d0820014190086a41186a200c29030037030020014190086a41106a200f29030037030020014190086a41086a201029030037030020012001290388043703900820012802a407450d010b2002101d0b024020014190086a200141c0056a412010d003450d0041002102200141003602a007200141a0076a108201200141063602c406200141df8ac0003602c006200141a0076a41a68ec100200141c0066a108101024020012802a00722032008280200220c41f8b3c200410041001002417f460d00200141003602c0062003200c200141c0066a41044100100241016a41044d0d0620012802c00621020b024020012802a407450d002003101d0b200220054d0d00200141063602c406200141df8ac0003602c006200141a0076a2005200141c0066a107e2008280200210320012802a00721084120101f2202450d0b200220012903c005370000200241186a200141c0056a41186a290300370000200241106a200141c0056a41106a290300370000200241086a200141c0056a41086a290300370000200820032002412010032002101d20012802a407450d002008101d0b200541016a2105200641206a2106200941606a22090d000b0b200e450d00200d101d0b200141b8036a41086a22024200370300200142003703b80341fd9bc0004116200141b8036a1001200141c0066a41086a2002290300370300200120012903b8033703c00602400240200141c0066a411041f8b3c200410041001002417f460d002001420037039008200141c0066a411020014190086a41084100100241016a41084d0d0820012903900822044200510d0f4200211120002004824200520d160c010b42002111200042e807824200520d150b41082108200141b8036a41086a22022011370300200120113703b80341939cc0004115200141b8036a1001200141c0066a41086a2002290300370300200120012903b8033703c0064100210f02400240200141c0066a411041f8b3c200410041001002417f460d00200142103702c4052001200141c0066a3602c00520014190086a200141c0056a1091012001280290082208450d112001280294082110418801210220014198086a280200220f4188016c2206450d010c120b41002110418801210241004188016c22060d110b200141003602c805200120083602c405200120083602c0052001200141a8046a3602cc05200f0d110c120b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b411241011020000b413241011020000b41df88c0004133103a000b412041011020000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41f0dcc200102c000b41df88c0004133103a000b41df88c0004133103a000b200820066a210620014190086a2008280260109201200820026a21020240024020012802a0082205450d0020014198036a20012903900820014190086a41086a290300200141a8086a350200420010d20320014198036a41086a2903002107200129039803211220012802a408450d012005101d0c010b42002112420021070b200141013602c805200120063602c405200120023602c0052001200141a8046a3602cc0502402008450d002008ad4220862113024020022006460d00200f4188016c41f87e6a2106200141a0086a2109200141a8086a2103200141a4086a210c4201210b034020014190086a200241e0006a2802001092010240024020092802002205450d0020014188036a20012903900820014190086a41086a2903002003350200420010d20320014188036a41086a2903002104200129038803210a200c280200450d012005101d0c010b4200210a420021040b02402012200a56200720045620072004511b0d002002ad422086200b842113200a2112200421070b20024188016a2102200b42017c210b200641f87e6a22060d000b0b20134280808080105a0d030b200f450d010b200f4188016c21022008211403402014103c20144188016a2114200241f87e6a22020d000b0b2010450d012008101d0c010b0240024002400240200f2013a722024d0d00200820024188016c6a220229031021042008200f417f6a22054188016c6a22064180016a29030021072006290360210b200641e8006a290300210a200641f0006a2903002112200641f8006a2903002113200641c8006a2903002153200641d0006a2903002154200641d8006a2903002155200641286a2903002156200641306a2903002157200641386a2903002158200641186a2903002159200641c0006a290300215d200641206a290300215c2006290300215e20062903082171200220062903103703102002290308217220022071370308200229030021712002205e370300200241206a2206290200215e2006205c370200200241c0006a2206290200215c2006205d370200200241186a2206290300215d20062059370300200241386a2206290200215920062058370200200241306a2206290200215820062057370200200241286a2206290200215720062056370200200241d8006a2206290200215620062055370200200241d0006a2206290200215520062054370200200241c8006a2206290200215420062053370200200241f8006a2013370300200241f0006a2012370300200241e8006a200a370300200228026021092002200b37036020024180016a2007370200200141c0056a41d8006a2056370300200141c0056a41d0006a2055370300200141c0056a41c8006a2054370300200141c0056a41c0006a205c370300200141c0056a41386a2059370300200141c0056a41306a2058370300200141c0056a41286a2057370300200141c0056a41206a205e370300200141c0056a41186a205d370300200120043703d005200120723703c805200120713703c005200120053602980820012010360294082001200836029008200141b8036a41086a22024200370300200142003703b80341939cc0004115200141b8036a1001200141c0066a41086a2002290300370300200120012903b8033703c006200141103602ac042001200141c0066a3602a80420014190086a200141a8046a10930102402005450d00200f4188016c41f87e6a21062008210203402002103c20024188016a2102200641f87e6a22060d000b0b02402010450d002008101d0b4113101f2202450d01410021052002410f6a41002800f99b40360000200241086a41002900f29b40370000200241002900ea9b40370000200241134126101e2202450d0220022009360013200141b8036a41086a22064200370300200142003703b80320024117200141b8036a1001200141c0066a41086a2006290300370300200120012903b8033703c006024002400240200141c0066a411041f8b3c200410041001002417f460d002001200141c0066a3602a804200141103602ac042001420037039808200142003703900820014100200141c0066a411020014190086a41104100100222062006417f461b2206411020064110491b3602b0042006410f4d0d0220014198086a22062903002104200129039008210720014190086a200141a8046a105e2001280290082205450d02200628020021082001280294082103200141c0066a411010092002101d2005450d010c060b2002101d41000d050b200141c0056a103c0c050b41df88c0004133103a000b4188ddc2002002200f104b000b411341011020000b412641011020000b024020084105742206450d00200521020340200220072004109401200241206a2102200641606a22060d000b0b200141b8086a2004370300200141b0086a2007370300200141a8086a2008360200200141a4086a200336020020014190086a41106a20053602002001419c086a200936020020014190086a41086a41013a0000200141053a00900820014190086a108b01200141b8036a41086a22024200370300200142003703b80341869bc0004116200141b8036a1001200141c0066a41086a2002290300370300200120012903b8033703c00602400240024002400240200141c0066a411041f8b3c200410041001002417f460d002001420037039008200141c0066a411020014190086a41084100100241016a41084d0d0220012903900821070c010b42e80721070b20014190086a200141c0056a41e00010ce031a42002104200141b8036a41086a22024200370300200142003703b80341a89cc0004115200141b8036a1001200141c0066a41086a2002290300370300200120012903b8033703c0060240200141c0066a411041f8b3c200410041001002417f460d00200142003703a804200141c0066a4110200141a8046a41084100100241016a41084d0d0220012903a80421040b200141a8046a200720007c20014190086a4100200410950120012802a8044101470d0320012802ac04200141a8046a41086a280200100a0c020b41df88c0004133103a000b41df88c0004133103a000b410221020c010b200141b8036a41086a22142011370300200120113703b80341bd9cc0004113200141b8036a1001200141c0066a41086a2014290300370300200120012903b8033703c006410021140240024002400240024002400240200141c0066a411041f8b3c200410041001002417f460d002001410036029008200141c0066a411020014190086a41044100100241016a41044d0d0120012802900821140b200141b8036a41086a22024200370300200142003703b80341d09cc0004119200141b8036a1001200141c0066a41086a2002290300370300200120012903b8033703c006410021020240200141c0066a411041f8b3c200410041001002417f460d002001410036029008200141c0066a411020014190086a41044100100241016a41044d0d0220012802900821020b0240024002400240201420024f0d002001419c086a210920014198086a21060240034020014190086a201410960120062802002205410f470d01201441016a22142002490d000c020b0b2001290390082104200141a8046a200941ec0010ce031a200141a0076a200141a8046a41ec0010ce031a200141a0086a2206200536020020012004370398082001201436029008200141a4086a200141a0076a41ec0010ce032109024020042000520d00200141c0066a41086a220620014190086a41086a29030037030020012001290390083703c006200141c0056a200941ec0010ce031a200141a8046a41086a22092006290300370300200120012903c0063703a80420014190086a200141c0056a41ec0010ce031a418001101f2215450d07201520012903a80437030020152005360210201541086a2009290300370300201541146a20014190086a41ec0010ce031a201441016a221420024f0d0320014190086a41106a211620014190086a41146a21032001419c086a210c20014190086a41086a21054101211741012106034020014190086a2014109601024020052802002209410f470d00201441016a22142002490d010c040b2001290390082104200141a8046a200c41ec0010ce031a200141a0076a200141a8046a41ec0010ce031a201620093602002005200437030020012014360290082003200141a0076a41ec0010ce03210820042000520d05200141a0056a41086a220f200529030037030020012001290390083703a005200141c0056a200841ec0010ce031a200141b8036a41086a2210200f290300370300200120012903a0053703b80320014190086a200141c0056a41ec0010ce031a024020172006470d00201741016a22082017490d0e2017410174220f20082008200f491b2208ad4207862204422088a70d0e2004a7220f4100480d0e024002402017450d0020152017410774200f101e22150d010c0c0b200f101f2215450d0b0b200821170b201520064107746a220820012903b803370300200841086a2010290300370300200841106a2009360200200841146a20014190086a41ec0010ce031a200641016a2106201441016a22142002490d000c030b0b2006103c0b4100211741082115410021060b41072118201520064107746a21162006450d060c070b4101211741072118201541014107746a211641010d060c050b2016103c41072118201520064107746a211620060d050c040b41df88c0004133103a000b41df88c0004133103a000b41800141081020000b200f41081020000b0240201522142016460d00410021020c020b410121020c010b41082119200141a8046a41086a211a20014190086a41086a211b4104211c20014190086a410472211d410c211e200141a8046a410c6a211f411021204114212141ec0021224180012123410f21244116212541aeb9c00021264100212741f8b3c2002128417f21294202212a423e212b41fe00212c4102212d4200212e417e212f41ff002130423f2131420121324115213341a89cc0002134410521354103213641e8002137200141a8046a41e8006a213841e000213920014199086a213a4106213b4113213c41bd9cc000213d4101213e41f800213f42e80021404220214141172142412e2143411f214441987f2145411821464120214742e4cab5fbb6ccdcb0e3002148423821494160214a20014198056a214b41c000214c412c214d4124214e411c214f413421502015211441002151410321020b034002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020020e0400010206060b20014190086a41106a210620014190086a41146a21080340200141c0066a41086a2205201441086a290300370300200120142903003703c006201441106a280200210220014190086a201441146a41ec0010ce031a2002410f460d09200141a0056a41086a22092005290300370300200120012903c0063703a005200141c0056a20014190086a41ec0010ce031a2006200236020020014190086a41086a2009290300370300200120012903a005370390082008200141c0056a41ec0010ce031a2006103c20144180016a22142016470d000b410121020c560b02402017450d002015101d0b4117101f2202450d012002410f6a41002900f89c40370000200241086a41002900f19c40370000200241002900e99c4037000020024117412e101e2202450d0220022000370017200141b8036a41086a22064200370300200142003703b8032002411f200141b8036a1001200141c0066a41086a2006290300370300200120012903b8033703c00602400240200141c0066a411041f8b3c200410041001002417f460d00200142103702c4052001200141c0066a3602c00520014190086a200141c0056a109701200128029008220d450d052001290294082104200141c0066a411010092004422088a721062004a7210e0c010b4108210d410021064100210e0b2002101d200d200641e8006c22026a210902400240024002402002450d00200241987f6a210520014190086a41047221032001419c086a210c20014199086a210f20014198086a2110200d2102034020022802002106200141c0056a200241046a41dc0010ce031a20064110460d0220014190086a200141c0056a41dc0010ce031a0240024002402006410f470d0020050d010c020b200241e0006a2802002108200141a8046a20014190086a41dc0010ce031a20012006360290082003200141a8046a41dc0010ce031a200141003b01c005200141386a20014190086a200141c0056a108a0120012802382106200c2008360200200f2006453a0000201041063a0000200141053a00900820014190086a108b012005450d010b200241e8006a2102200541987f6a21050c010b0b200922022009470d020c030b200d22022009470d010c020b200241e8006a22022009460d010b20014190086a410472210503402002280200210620014190086a200241046a41e40010ce031a20064110460d01200141c0056a20014190086a41e40010ce031a20012006360290082005200141c0056a41e40010ce031a02402006410f460d0020014190086a103c0b200241e8006a22022009470d000b0b200e450d06200d101d410221020c550b20001098014108217342002174200141b8036a41086a22754200370300200142003703b8034117217641c59ec100217741c59ec1004117200141b8036a1001200141a0056a41086a22782075290300370300200120012903b8033703a0054100217941f8b3c200217a4110217b417f217c200141a0056a411041f8b3c200410041001002417f460d12200141a8046a410472217d4105217e20014190086a410572217f412021800120014190086a41206a21810120014190086a410472218201421021830120014190086a41086a218401410f21850141dc002186014118218701411521880141dfd9c0002189014220218a014128218b014106218c0141ff01218d01410c218e01200141a8046a410c6a218f01413021900120014190086a41306a219101412c21920120014190086a412c6a21930141072194014101219501411c219601413c2197014134219801412421990141e000219a01410d219b01418cb9c000219c014102219d014116219e0141869bc000219f01411e21a00141909fc10021a101411b21a201413b21a301413321a401412b21a501412321a60141f60021a70141d30021a80141cb0021a90141c30021aa0141db0021ab01415821ac01422821ad01413821ae01410121510c040b411741011020000b412e41011020000b41df88c0004133103a000b024020510e04000e0d0c0c0b201420206a2802002102201429020821042014280200210520014190086a201420216a202210ce031a201420236a211420022024460d44200141a0076a20014190086a202210ce031a201a2002360200200120043703a804201f200141a0076a202210ce031a200141c0056a200510990120012802c0052103024002400240200141c0056a20196a22522802002202450d00200220357421094200210b2003210242002153420021544200215542002156420021570340200141f8026a2002109a01200141f8026a20196a290300210720012903f8022104201d2002290000370000201d20196a200220196a290000370000201d20206a200220206a290000370000201d20466a200220466a2900003700002001200536029008200141e8026a2004200720014190086a109b0122062046742046752208201876200673203e6aad204986204987202e10d203200720537c2004200b7c220b200454ad7c2153202e200141e8026a20196a2903002204200820274822061b20557c202e20012903e802220720061b220a20547c2254200a54ad7c21552004202e20061b20577c2007202e20061b220420567c2256200454ad7c2157200220476a21022009204a6a22090d000b20012802c405450d020c010b420021564200215742002154420021554200210b4200215320012802c405450d010b2003101d0b200141c0056a200510990120012802c005210e02400240024020522802002202450d002002203574210c4200210a200e21024200211242002111420021584200211342002159034020014190086a20466a2208200220466a220f29000037030020014190086a20206a2203200220206a2210290000370300201b200220196a220d29000037030020012002290000370390082020101f2206450d0e200620196a20272900a49b403700002006202729009c9b40370000200620202047101e2206450d0d2006200536001020062047204c101e2206450d0c20062001290390083700142006204d6a20082903003700002006204e6a20032903003700002006204f6a201b290300370000200141b8036a20196a2209202e3703002001202e3703b80320062050200141b8036a1001200141c0066a20196a2009290300370300200120012903b8033703c006410021090240200141c0066a202020284100410010022029460d00200120273a00a005200141c0066a2020200141a0056a203e20271002203e6a203e4d0d0c20012d00a00521090b2006101d2008200f29000037030020032010290000370300201b200d2900003703002001200229000037039008200141c8026a200520014190086a20092046742206204475200973203e6a2020109c01200141c8026a20466a29030020127c20012903d8022204200a7c220a200454ad7c2112202e200141c8026a20196a2903002204200620467520274822061b20587c202e20012903c802220720061b225820117c2211205854ad7c21582004202e20061b20597c2007202e20061b220420137c2213200454ad7c2159200220476a2102200c204a6a220c0d000b20012802c405450d020c010b420021134200215942002111420021584200210a4200211220012802c405450d010b200e101d0b42002107200141b8036a20196a225a4200370300200142003703b80320262025200141b8036a1001200141c0066a20196a225b205a290300370300200120012903b8033703c00602400240200141c0066a202020282027202710022029460d002001202e370398082001202e37039008200141c0066a202020014190086a20202027100222022029460d05200220244d0d05201b290300210420012903900821070c010b420021040b024002400240200a200b7c220b202a88201220537c200b200a54ad7c220a202b86842212200b85200a202a882253200a8584500d002012205384500d004100210202400340200141b8026a200b200a2002201c6a202c7110d4032002202d6a210220012903b8022212200b85200141b8026a20196a2903002253200a8584500d012012205384202e520d000b0b200141a8026a200b200a2002202c7110d40320012903a802200141a8026a20196a290300842112420021532002450d012012420052ad2112034020014188026a200b200a20272002202f6a2206200620024b1b220220307110d40320014198026a2012203286225c203284225d20532032862012203188842253205d205310d203205c205d2001290398022001290388025620014198026a20196a290300221220014188026a20196a290300225e562012205e511b1b211220020d000c030b0b42002153200b200a84420052ad21120c010b2012420052ad21120b0240024002400240024002402007202a882004202b8684220b2007852004202a88220a20048584500d00200b200a84500d004100210202400340200141f8016a200720042002201c6a202c7110d4032002202d6a210220012903f801220b200785200141f8016a20196a290300220a20048584500d01200b200a84202e520d000b0b200141e8016a200720042002202c7110d40320012903e801200141e8016a20196a29030084210b4200210a2002450d01200b420052ad210b0340200141c8016a2007200420272002202f6a2206200620024b1b220220307110d403200141d8016a200b203286225c203284225d200a203286200b20318884220a205d200a10d203205c205d20012903d80120012903c80156200141d8016a20196a290300220b200141c8016a20196a290300225e56200b205e511b1b210b20020d000b201220538450450d020c030b4200210a2007200484420052ad210b201220538450450d010c020b200b420052ad210b2012205384500d010b205820557c201120547c2207201154ad7c2154205920577c201320567c2204201354ad7c2111204b2d00002202202d460d0102402002203e470d0003402053215320122155200b200a84202e510d0a200141a8016a200420112055205310d103200141b8016a20072054200b200a10d1034101215f20012903b801225620012903a801225754200141b8016a20196a2903002212200141a8016a20196a290300221354201220135122021b0d042057205654201320125420021b0d0220014198016a20562012200b200a10d20320014188016a205720132055205310d203200420012903880122127d2213201120014188016a20196a2903007d2004201254ad7d225684500d02205420014198016a20196a2903007d215720072001290398012204542102200720047d2112200b2104200a21112013210b2056210a2055210720532154201220572002ad7d22538450450d000c040b0b0340200141f8006a200720542012205310d103200b2255200a225684202e510d08200141f8006a20196a290300210b2001290378210a200141e8006a200420112055205610d1034101215f200a2001290368225754200b200141e8006a20196a290300221354200b20135122021b0d032057200a542013200b5420021b0d01200141d8006a200a200b2012205310d203200141c8006a205720132055205610d20320042001290348220b7d220a2011200141c8006a20196a2903007d2004200b54ad7d221384500d012054200141d8006a20196a2903007d2157200720012903582204542102200720047d210b2012210420532111200a2112201321532055210720562154200b20572002ad7d220a8450450d000c030b0b4100215f0c010b2004200756201120545620112054511b215f0b4200210a205a4200370300200142003703b80320342033200141b8036a1001205b205a290300370300200120012903b8033703c0060240200141c0066a202020282027202710022029460d002001202e37039008200141c0066a202020014190086a201920271002203e6a20194d0d07200129039008210a0b20014190086a200510990120012802900821602001280294082161201b2802002262450d432060206220357422636a2164205f203e732165206021020340200141e8036a20466a2266200220466a2206290000370300200141e8036a20206a2267200220206a2209290000370300200141e8036a20196a2268200220196a2208290000370300200120022900003703e80320082900002104200929000021072002290000210b20014188046a20466a2203200629000037030020014188046a20206a220c200737030020014188046a20196a220f20043703002001200b3703880420022900002104201d20466a22692006290000370000201d20206a226a2009290000370000201d20196a226b2008290000370000201d2004370000200120053602900841002106024020014190086a109b012046742046752209410048206573203e470d00200141c8036a20466a2003290300370300200141c8036a20206a200c290300370300200141c8036a20196a200f29030037030020012001290388043703c803410121062009216c0b200141c0056a20466a226d200141c8036a20466a2210290300370300200141c0056a20206a226e200141c8036a20206a220d2903003703002052200141c8036a20196a220e290300370300200120012903c8033703c005024020060d00200220476a21022063204a6a22630d010c450b0b200141c0066a20466a226f206d290300370300200141c0066a20206a2270206e290300370300205b2052290300370300200120012903c0053703c006200220476a2102206020622035746a21630340200141a0056a20466a2206206f290300370300200141a0056a20206a22092070290300370300200141a0056a20196a2208205b290300370300200120012903c0063703a00520014190086a20466a200629030037030020014190086a20206a2009290300370300201b2008290300370300200120483703b806200120012903a00537039008200141b8066a20014190086a200a206c204674204675201876206c73203e6aad2049862049877e20007c109d0120022064460d4403402066200220466a22062900003703002067200220206a22092900003703002068200220196a2208290000370300200120022900003703e80320032006290000370300200c2009290000370300200f20082900003703002001200229000037038804200120053602900820082900002104200929000021072002290000210b20692006290000370000206a2007370000206b2004370000201d200b37000041002106024020014190086a109b012046742046752209410048206573203e470d0020102003290300370300200d200c290300370300200e200f29030037030020012001290388043703c803410121062009216c0b206d2010290300370300206e200d2903003703002052200e290300370300200120012903c8033703c005024020060d002063200220476a2202470d010c460b0b206f206d2903003703002070206e290300370300205b2052290300370300200120012903c0053703c006200220476a21020c000b0b410321020c4f0b410221020c4e0b410121020c4d0b41df88c0004133103a000b41b8a7c400102c000b41b8a7c400102c000b41df88c0004133103a000b41df88c0004133103a000b41c00041011020000b412041011020000b411041011020000b0240024002400240024002400240024002400240024020c501450d0020c40120c20120ce01746a210220c40120c20120df016a20ce01746a2106034020c20120c7014f0d04200141c0056a20022802002205109e0120012903c00520d001520d02200141a8046a20cc0120d10110ce031a20012903c006220a20012903a804220b54200141c0066a20cb016a2903002207200141a8046a20cb016a29030022045420072004511b450d03200120cf013a00e80320df0120c2016a220520c7014f0d0520062002280200360200200220d2016a2102200620d2016a210620c70120c20120cf016a22c201470d000c110b0b20c40120c20120ce01746a2102034020c20120c7014f0d03200141c0056a20022802002205109e0120012903c00520d001520d01200141a8046a20cc0120d10110ce031a20012903c006220a20012903a804220b5a200141c0066a20cb016a2903002207200141a8046a20cb016a29030022045a20072004511b0d02200120cf013a00e803200220d2016a210220c70120c20120cf016a22c201470d000c0f0b0b20df0120de016a21df0120c50120cf016a21c50120c20120cf016a22c20120c701470d060c0e0b20c20120cf016a21c2012001200a200b7d3703c0062001200720047d200a200b54ad7d3703c80620d301101f2202450d02200220d4016a20cd012f00eaa8413b0000200220cb016a20cd012900e2a841370000200220cd012900daa841370000200220d30120d501101e2202450d0320022005360012200141b8036a20cb016a220620d601370300200120d6013703b803200220d701200141b8036a1001200141a0056a20cb016a2006290300370300200120012903b8033703a005200141a0056a20d40110092002101d20ca01200141a8046a20d4016a290300200141a8046a20d8016a290300109401200141186a20c901200b2004109f01200141a0076a20cb016a220220d90120022903002207200141186a20cb016a2903007c20012903a007220a20012903187c2212200a542202ad7c220a2002200a200754200a2007511b22021b370300200120d901201220021b3703a00720da01200437030020db01200b37030020014190086a20cb016a20ce013a000020dc01200536020020c80120c90129000037000020c80120cb016a20c90120cb016a29000037000020c80120d4016a20c90120d4016a29000037000020c80120d8016a20c90120d8016a290000370000200120dd013a00900820014190086a108b0120df0120de016a21df0120c50120cf016a21c50120c20120c701470d040c0d0b41c8aac30020c20120c701104b000b41d8aac300200520c701104b000b411241011020000b412441011020000b410321510c010b410321510c010b410321020c450b410321020c440b20c1012903002104410021020240024002400240024020bb01a7220620bd01460d002006450d014100210203402002200620bd0176220520026a2209200420b201200920b801746a290300541b2102200620056b220620bd014b0d000b0b200420b201200220b801746a22062903002207520d0120bb012002ad580d022006200620bc016a200220be017320bb01a76a20b8017410cf031a20b30120b7018320bb0120ba018620bf017c8421b30120bb0120c0017c21bb0120c10120bc016a22c10120b901470d030c060b410010a001000b200220042007566a10a001000b41b0aac300102c000b41022151410321020c430b20012083013702c4052001200141a0056a3602c00520014190086a200141c0056a10a1012001280290082202450d0c2001280294082109410f210602400240024002402084012802002205450d0020022903002000520d0020014188046a2087016a220820022080016a29000037030020014188046a207b6a220320022087016a29000037030020014188046a20736a220c2002207b6a29000037030020012002290008370388042005207c6a2206ad20ad017e2204208a0188a70d122004a72205207c4c0d12024002402005450d002005101f220f0d010c1c0b4108210f0b200f2002208b016a200510ce03210520840120063602002001200636029408200120053602900820752074370300200120743703b80320772076200141b8036a100120782075290300370300200120012903b8033703a0052001207b3602c4052001200141a0056a3602c00520014190086a200141c0056a10a20102402006450d002005101d0b200141c0066a2087016a220f2008290300370300200141c0066a207b6a22102003290300370300200141c0066a20736a220d200c29030037030020012001290388043703c006208701101f2206450d1b2006207b6a20792900ec9e41370000200620736a20792900e49e41370000200620792900dc9e41370000200620870120ae01101e2205450d1c200520012903c00637001820052090016a200f2903003700002005208b016a201029030037000020052080016a200d29030037000020752074370300200120743703b803200520ae01200141b8036a100120782075290300370300200120012903b8033703a00502400240200141a0056a207b207a207920791002207c460d0020012083013702ec032001200141a0056a3602e80320014190086a200141e8036a10a3012001280290082206208501460d1f200141c0056a20820120860110ce031a200141a0056a207b10090c010b410f21060b200141a8046a200141c0056a20860110ce031a2006208501470d012005101d410f21060b2009450d020c010b200141a0076a200141a8046a20860110ce031a2005101d200141c8036a2087016a2008290300370300200141c8036a207b6a2003290300370300200141c8036a20736a200c29030037030020012001290388043703c8032009450d010b2002101d0b2006208501460d00200120063602a804207d200141a0076a20860110ce031a200141c0066a2087016a220e200141c8036a2087016a290300370300200141c0066a207b6a2252200141c8036a207b6a290300370300200141c0066a20736a2265200141c8036a20736a290300370300200120012903c8033703c00620752074370300200120743703b803208901208801200141b8036a100120782075290300370300200120012903b8033703a00502400240024002400240200141a0056a207b207a207920791002207c460d0020012083013702c4052001200141a0056a3602c00520014190086a200141c0056a10a401200128029008226d450d162001290294082204208a0188a7226e208b016c2209450d020c010b420021044108216d4200208a0188a7226e208b016c2209450d010b4100210d41002110206d2106034020014190086a2087016a2205200e29030037030020014190086a207b6a220820522903003703002084012065290300370300200120012903c00637039008208101200629000037000020810120736a2203200620736a290000370000208101207b6a220c2006207b6a2900003700002081012087016a220f20062087016a29000037000020a201101f2202450d09200220766a20792800d390413600002002207b6a20792900cc9041370000200220736a20792900c49041370000200220792900bc9041370000200220a20120a301101e2202450d0a200220012903900837001b200220a4016a2005290300370000200220a5016a2008290300370000200220a6016a208401290300370000200220a30120a701101e2202450d0b200220810129000037003b200220a8016a200f290000370000200220a9016a200c290000370000200220aa016a200329000037000020752074370300200120743703b803200220ab01200141b8036a100120782075290300370300200120012903b8033703a005024002400240200141a0056a207b207a207920791002207c470d00410221052002101d4102208d0171209d01470d010c020b200120793a00c005200141a0056a207b200141c0056a209501207910022095016a2095014d0d0e20012d00c0052105200141a0056a207b10092002101d2005208d0171209d01460d010b200d2005209501716a210d20102005207c73209501716a21100b2006208b016a2106200920ac016a22090d000b206e20106b21022004a7450d020c010b410021104100210d206e41006b21022004a7450d010b206d101d0b2002200d6b210202400240024002400240024020012802a804208c01470d00200141a8046a20736a2d0000208d0171208c01470d00208f0128020021062091012002360200209301201036020020014190086a208b016a200d360200207f20012903c006370000207f20736a2065290300370000207f207b6a2052290300370000207f2087016a200e290300370000200120793a00940820012094013a00900820014190086a108b0120022010720d0120014190086a208e016a2006360200208401207e3a00002001207e3a00900820014190086a108b01200610a5010c010b200141e8036a2087016a200e290300370300200141e8036a207b6a2052290300370300200141e8036a20736a2065290300370300200120012903c0063703e8032091012002360200209301201036020020014190086a208b016a200d360200207f20012903c006370000207f20736a2065290300370000207f207b6a2052290300370000207f2087016a200e29030037000020012095013a00940820012094013a00900820014190086a108b01200d200220106a4d0d00209601101f2206450d1f20062087016a207928008c9f413600002006207b6a20792900849f41370000200620736a20792900fc9e41370000200620792900f49e413700002006209601209701101e2206450d20200620012903c00637001c20062098016a200e29030037000020062092016a205229030037000020062099016a20652903003700004200210420754200370300200142003703b8032006209701200141b8036a100120782075290300370300200120012903b8033703a005200141a0056a207b10092006101d420021072010450d0220752074370300200120743703b80320a10120a001200141b8036a100120782075290300370300200120012903b8033703a005200141a0056a207b207a207920791002207c460d012001207437039008200141a0056a207b20014190086a2073207910022095016a20734d0d1220012903900821070c020b200141a8046a103c0c020b420021070b200141c0056a200141a8046a209a0110ce031a20754200370300200142003703b803209c01209b01200141b8036a100120782075290300370300200120012903b8033703a0050240200141a0056a207b207a207920791002207c460d002001207437039008200141a0056a207b20014190086a2073207910022095016a20734d0d0d20012903900821040b20752074370300200120743703b803209f01209e01200141b8036a100120782075290300370300200120012903b8033703a00502400240200141a0056a207b207a207920791002207c460d002001207437039008200141a0056a207b20014190086a2073207910022095016a20734d0d0f200129039008210b0c010b42e807210b0b20014190086a200141c0056a209a0110ce031a200141a0056a200b20047c20014190086a209d0120950120022010721b200710950120012802a005209501470d0020012802a40522020d010b20752074370300200120743703b80320772076200141b8036a100120782075290300370300200120012903b8033703a005200141a0056a207b207a207920791002207c470d330c010b2078280200210641ae9fc100410f100a20022006100a0b200141286a41878bc0004110108f01200129033021af0120012802282106200141a0056a41086a22024200370300200142003703a00541b895c0004115200141a0056a100120014190086a41086a2002290300370300200120012903a005370390080240024020014190086a411041f8b3c200410041001002417f460d00200141003a00c00520014190086a4110200141c0056a41014100100241016a41014d0d2420012d00c0050d010b4108101f2202450d2820024200370300200142818080801037029408200120023602900841978bc000411520014190086a10a6012002101d4108101f2202450d2920024200370300200142818080801037029408200120023602900841cd95c000411620014190086a10a6012002101d200141a0056a41086a22024200370300200142003703a00541f78ac0004110200141a0056a100120014190086a41086a22052002290300370300200120012903a00537039008200142003703c00520014190086a4110200141c0056a41081003200141013a00c00520024200370300200142003703a00541b895c0004115200141a0056a100120052002290300370300200120012903a0053703900820014190086a4110200141c0056a410110030b410821b001420021b101200141a0056a41086a22024200370300200142003703a00541978bc0004115200141a0056a100120014190086a41086a2002290300370300200120012903a00537039008024020014190086a411041f8b3c200410041001002417f460d00200142103702ac04200120014190086a3602a804200141c0056a200141a8046a10a70120012802c00522b001450d2420012902c40521b1010b410821b201420021b301200141a0056a41086a22024200370300200142003703a00541cd95c0004116200141a0056a100120014190086a41086a2002290300370300200120012903a00537039008024020014190086a411041f8b3c200410041001002417f460d00200142103702ac04200120014190086a3602a804200141c0056a200141a8046a10a70120012802c00522b201450d2520012902c40521b3010b200141a0056a41086a22024200370300200142003703a00541e395c0004114200141a0056a100120014190086a41086a2002290300370300200120012903a0053703900802400240024020014190086a411041f8b3c200410041001002417f460d00200142003703c00520014190086a4110200141c0056a41084100100241016a41084d0d14420120012903c00522042004501b21b40120b101422088a721b50120060d020c010b42e50021b40120b101422088a721b50120060d010b20b501417f6a220220b5014b0d1d200220b5014f0d1d20b00120024103746a2202450d1d200229030021af010b410020b50141016a220220b401a76b2206200620024b1b22b60120b5014b0d1d42ffffffff0f21b701410321b80120b00120b6014103746a21b90120b601450d00422021ba0120b30142208821bb01410821bc01410121bd01417f21be0142808080807021bf01427f21c00120b00121c101410221510c320b20b10120b701832104024020b50120b6016b2202450d00024020b601450d0020b00120b901200241037410cf031a0b2002ad42208620048421040b41002102024020b3014220882207a72208450d00024020084101460d004100210220082106034020022006410176220520026a220920af0120b20120094103746a290300541b2102200620056b220641014b0d000b0b2002200220af0120b20120024103746a290300220b566a20af01200b511b220220084b0d210b02400240024002400240024002400240200820b301a7470d00200841016a22062008490d492007a722094101742205200620062005491bad22b301420386220b422088a70d49200ba722064100480d4902402008450d0020b20120094103742006101e22b201450d020c010b2006101f22b201450d010b20b20120024103746a220641086a2006200820026b41037410cf031a200620af013703002004a72004422088220ba72202470d02200241016a22062002490d4820024101742205200620062005491bad2204420386220a422088a70d48200aa722064100480d482002450d0120b00120024103742006101e22b001450d030c020b200641081020000b2006101f22b001450d010b20b00120024103746a20af01370300200742017c220aa72202450d212002410176220620024f0d2220b20120064103746a2903002107024020024101710d002006417f6a220620024f0d2d20b20120064103746a29030020077c42018821070b20b30142ffffffff0f83200a42208684210a2001200b42017c220b422086200442ffffffff0f838437029408200120b0013602900841978bc000411520014190086a10a60102402004a7450d0020b001101d0b2001200a37029408200120b2013602900841cd95c000411620014190086a10a601024020b301a7450d0020b201101d0b200141a0056a41086a22094200370300200142003703a00541f78ac0004110200141a0056a100120014190086a41086a22022009290300370300200120012903a00537039008200120073703c00520014190086a4110200141c0056a41081003200b42ffffffff0f8320b401520d0320094200370300200142003703a005418cb9c000410d200141a0056a100120022009290300370300200120012903a0053703900842002104024020014190086a411041f8b3c200410041001002417f460d00200142003703c00520014190086a4110200141c0056a41084100100241016a41084d0d1720012903c00521040b200141a0056a41086a22024200370300200142003703a00541cb96c0004117200141a0056a100120014190086a41086a2002290300370300200120012903a0053703900820014190086a411041f8b3c200410041001002417f460d01200142003703c00520014190086a4110200141c0056a41084100100241016a41084d0d1720012903c005210b0c020b200641081020000b42e807210b0b200720b4014201887c200b7c2004560d0020014190086a108001200128029008210820012802940821c2010240024002402001280298082202450d0020024105742206410575220cad42287e2204422088a70d452004a722054100480d452005101f2203450d31200820066a210f2002410574210520032102200821060340200641086a2900002104200641106a29000021072006290000210b200241186a200641186a290000370000200241106a2007370000200241086a20043700002002200b370000200241206a4201370300200241286a2102200641206a2106200541606a22050d000b200f20086b41606a41057641016a210220c201450d020c010b4100210c410821034100210220c201450d010b2008101d0b42002104200141a0056a41086a22064200370300200142003703a00541f78ac0004110200141a0056a1001200141b8036a41086a2006290300370300200120012903a0053703b8030240200141b8036a411041f8b3c200410041001002417f460d002001420037039008200141b8036a411020014190086a41084100100241016a41084d0d1c20012903900821040b20012002360298082001200c36029408200120033602900820014190086a20b401427f7c4201200410a8010b200141b8036a41086a22024200370300200142003703b80341eb96c100411d200141b8036a100120092002290300370300200120012903b8033703a0050240200141a0056a411041f8b3c200410041001002417f460d00200142103702c4052001200141a0056a3602c00520014190086a200141c0056a10a90120012903a00822044202510d25200141b8086a2802002103200141b4086a280200210d200141b0086a2802002110200129039808211202400240024002400240024020012903900822112000520d002003ad221342287e2207422088a741004721062007a721020240024002400240024020044201520d0020060d182002417f4c0d1820012903a80821132002450d012002101f2208450d3a2003450d030c020b20060d172002417f4c0d172002450d052002101f2208450d3a410021c2014100210520030d060c070b410821082003450d010b200341286c21094100210520082102201021060340200641086a2903002104200641106a2903002107200641186a290300210b2006290300210a200241206a200641206a290300370300200241186a200b370300200241106a2007370300200241086a20043703002002200a370300200241286a2102200541016a2105200641286a2106200941586a22090d000c020b0b410021050b200141b0086a2012370300200141a8086a2013370300200141a4086a2005360200200141a0086a20033602002001419c086a200836020020014198086a4101360200200141023a00900820014190086a108e010b201220117c2000520d040c030b41082108410021c201410021052003450d010b200341286c21094100210520082102201021060340200641086a2903002104200641106a2903002107200641186a290300210b2006290300210a200241206a200641206a290300370300200241186a200b370300200241106a2007370300200241086a20043703002002200a370300200241286a2102200541016a2105200641286a2106200941586a22090d000b0b200141a8086a20123703002001419c086a200836020020014198086a20c201360200200141a0086a2005ad422086201384370300200141023a00900820014190086a108e01201220117c2000520d010b2003ad42287e2204422088a70d0e2004a72202417f4c0d0e0240024002402002450d002002101f22c201450d31410021054100210920030d010c020b410821c20141002105410021092003450d010b200341286c21084100210920c2012102201021060340200641086a2903002104200641106a2903002107200641186a290300210b2006290300210a200241206a200641206a290300370300200241186a200b370300200241106a2007370300200241086a20043703002002200a370300200241286a2102200941016a2109200641286a2106200841586a22080d000b0b2001419c086a200936020020014190086a41086a22082003360200200120c20136029408200141093a00900820014190086a108b0102402003450d002010200341286c6a210f4100210520102102034020014190086a41186a2203200241186a29030037030020014190086a41106a22c201200241106a2903003703002008200241086a2903003703002001200229030037039008200241206a29030021042001410e3602ac04200141988ec1003602a804200141c0056a2005200141a8046a107e200141c0056a41086a280200210c20012802c00521094120101f2206450d112006200129039008370000200641186a2003290300370000200641106a20c201290300370000200641086a20082903003700002006412041c000101e2206450d12200620043700202009200c2006412810032006101d024020012802c405450d002009101d0b200541016a2105200241286a2202200f470d000b0b0240200d450d002010101d0b2001410e3602c405200141988ec1003602c00520014190086a41a68ec100200141c0056a108101410021c20102402001280290082202200128029808220641f8b3c200410041001002417f460d00200141003602c00520022006200141c0056a41044100100241016a41044d0d2220012802c00521c2010b0240200128029408450d002002101d0b024020c20120054d0d0020014198086a21032005210203402001410e3602c405200141988ec1003602c00520014190086a41a68ec100200141c0056a10810141002109024020012802900822062003280200220841f8b3c200410041001002417f460d00200141003602c00520062008200141c0056a41044100100241016a41044d0d0c20012802c00521090b0240200128029408450d002006101d0b200241016a21060240200920024d0d002001410e3602c405200141988ec1003602c00520014190086a2002200141c0056a107e200128029008220220032802001009200128029408450d002002101d0b2006210220c2012006470d000b0b2001410e3602c405200141988ec1003602c00520014190086a41a68ec100200141c0056a10810120012802980821062001280290082102200120053602c00520022006200141c0056a410410030240200128029408450d002002101d0b200141b8036a41086a22024200370300200142003703b80341eb96c100411d200141b8036a1001200141a0056a41086a2002290300370300200120012903b8033703a005200141a0056a411010090c010b200d450d002010101d0b200141b8036a41086a22024200370300200142003703b80341a8bcc1004114200141b8036a1001200141a0056a41086a2002290300370300200120012903b8033703a00502400240200141a0056a411041f8b3c200410041001002417f460d002001420037039008200141a0056a411020014190086a41084100100241016a41084d0d1320012903900822044200510d27420021c30120002004824200520d040c010b420021c30120004201824200520d030b200141b8036a41086a220220c301370300200120c3013703b80341cea8c100410c200141b8036a1001200141a0056a41086a22062002290300370300200120012903b8033703a00502400240200141a0056a411041f8b3c200410041001002417f460d0020014200370398082001420037039008200141a0056a411020014190086a4110410010022205417f460d2b2005410f4d0d2b20014198086a290300210420012903900821070c010b42002107420021040b200120073703c006200120043703c806200141a8086a200437030020014190086a41106a200737030020014190086a41086a41013a00002001410a3a00900820014190086a108b01200141003a00e803200142003703a807200142003703a00720024200370300200142003703b80341bcbcc1004112200141b8036a100120062002290300370300200120012903b8033703a0050240200141a0056a411041f8b3c200410041001002417f460d00200142103702c4052001200141a0056a3602c00520014190086a200141c0056a10aa0120012802900822c401450d2c2001200129029408220437028c04200120c40136028804410021c50120014100360290042004a721c6012004422088a722c701450d0220014199086a21c801200141e8046a21c901200141c8046a21ca01410821cb01200141c0056a41086a21cc01410021cd01410221ce01410121cf01420121d00141e00021d101410421d201411221d301411021d401412421d501420021d601411621d701411821d801427f21d901200141c8086a21da01200141c0086a21db01200141bc086a21dc01410a21dd01417f21de01410021df01410021c501410021c201410321510c330b410021c70120014100360290042001420437038804410421c401410021c6010b410021c5010b20014188046a41086a20c70120c5016b36020020014188046a10ab01024020c601450d0020c401101d0b20012903a007200141a0076a41086a29030010ac01024020012d00e8030d0042002104200141b8036a41086a22144200370300200142003703b80341cebcc100410d200141b8036a1001200141a0056a41086a2014290300370300200120012903b8033703a0050240200141a0056a411041f8b3c200410041001002417f460d002001410036029008200141a0056a411020014190086a41044100100241016a41044d0d2a20013502900821040b200141086a20012903c006222e42002004420010d203200141c0066a41086a2214201429030022042004420042edeb82bdef9804200129030842c0843d8020012903104200521b2232202e5641002004501b22141b22077d202e202e203220141b220454ad7d3703002001202e20047d3703c006200141a8086a2007370300200141a0086a200437030020014190086a41086a41033a00002001410a3a00900820014190086a108b010b20012903c006212e200141a8086a200141c0066a41086a221429030037030020014190086a41106a202e37030020014190086a41086a41043a00002001410a3a00900820014190086a108b012014290300212e20012903c0062104200141b8036a41086a22144200370300200142003703b80341cea8c100410c200141b8036a1001200141a0056a41086a2014290300370300200120012903b8033703a0052001202e370398082001200437039008200141a0056a411020014190086a411010030b200141a0056a41086a221420c301370300200120c3013703a00541e0f2c1004111200141a0056a1001200141b8036a41086a2014290300370300200120012903a0053703b803200141b8036a4110100920014190096a24000f0b411b41011020000b413b41011020000b41f60041011020000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b102e000b412041011020000b41c00041011020000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b200541081020000b411841011020000b413841011020000b41df88c0004133103a000b411c41011020000b413c41011020000b41df88c0004133103a000b41f795c0004126103a000b41b0aec400102c000b4198d8c200102c000b4180d1c20020062002104b000b41df88c0004133103a000b41c8aec400102c000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41ecd8c300102c000b410841081020000b410841081020000b4180d1c20020062002104b000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b200241081020000b200541081020000b200241081020000b200241081020000b41012151410321020c0f0b410321020c0e0b410321020c0d0b02402061450d002060101d0b200510a5010240024002400240024002400240205f450d0020014190086a201e6a22022005360200201b20363a0000200120353a00900820014190086a108b0120382903002204500d01200141c0056a200141a8046a203f10ce031a200141a0056a200420007c220410ad0120014190086a200141c0056a203f10ce031a200141c0066a201b203910ce031a20012802a4052208200141a0056a20196a22062802002202470d022002203e6a22092002490d142002203e742208200920092008491b2208ad20407e2207204188a70d142007a722032027480d142002450d0320012802a005200220376c2003101e22090d040c0a0b20014190086a201e6a2005360200201b201c3a0000200120353a00900820014190086a108b01205a202e3703002001202e3703b803203d203c200141b8036a1001205b205a290300370300200120012903b8033703c00620012005203e6a36029008200141c0066a202020014190086a201c1003201a103c20142016470d0c0c050b20014190086a201a203910ce031a200120273b01c005200141c0006a20014190086a200141c0056a108a012001280240210620022005360200203a2006453a0000201b203b3a0000200120353a00900820014190086a108b01205a202e3703002001202e3703b803203d203c200141b8036a1001205b205a290300370300200120012903b8033703c00620012005203e6a36029008200141c0066a202020014190086a201c100320142016470d0a0c040b20012802a00521090c020b2003101f2209450d060b200120083602a405200120093602a0050b2009200220376c220f6a200141c0066a203910ce03210320062002203e6a220c360200200320396a20053602002042101f2202450d02200220246a20272900f89c40370000200220196a20272900f19c40370000200220272900e99c40370000200220422043101e2202450d0320022004370017205a202e3703002001202e3703b80320022044200141b8036a1001205b205a290300370300200120012903b8033703c00620012020360294082001200141c0066a36029008200141a0056a20014190086a10ae012002101d0240200c450d00200f20376a2106200921020340024020022802002024460d002002103c0b200220376a2102200620456a22060d000b0b02402008450d002009101d0b205a202e3703002001202e3703b803203d203c200141b8036a1001205b205a290300370300200120012903b8033703c00620012005203e6a36029008200141c0066a202020014190086a201c100320142016470d050b201621140b20142016470d070c060b411741011020000b412e41011020000b200341081020000b410021510c040b410021510c040b410021510c040b410121020c040b410021020c030b410321020c020b410321020c010b410321020c000b0b1021000ba00905027f017e037f027e097f230041d0006b220124004108210242002103200141186a41086a220442003703002001420037031841ddb8c000410d200141186a1001200141086a41086a2004290300370300200120012903183703084100210502400240024002400240024002400240024002400240200141086a411041f8b3c200410041001002417f460d00200142103702442001200141086a360240200141186a200141c0006a10d30120012802182202450d05200129021c2103200141186a41206a200041206a290300370300200141186a41186a200041186a290300370300200141186a41106a200041106a290300370300200141186a41086a200041086a290300370300200120002903003703182003422088a722052003a7470d02200141186a210020052003a7460d010c070b200141186a41206a200041206a290300370300200141186a41186a200041186a290300370300200141186a41106a200041106a2903003703002004200041086a29030037030020012000290300370318200141186a210041004200a7470d060b200541016a22042005490d0720054101742206200420042006491bad220742287e2208422088a70d072008a722044100480d072005450d012002200541286c2004101e2202450d020c040b200141186a21000c050b2004101f22020d020b200441081020000b41df88c0004133103a000b20034280808080708320078421030b2003422088a721050b2002200541286c22066a22042000290300370300200441206a200041206a290300370300200441186a200041186a290300370300200441106a200041106a290300370300200441086a200041086a290300370300200141186a41086a220942003703002001420037031841ddb8c000410d200141186a1001200141086a41086a20092903003703002001200129031837030820014100360248200142013703402001200541016a220a360218200141186a200141c0006a106202400240200a450d00200641286a210b200141c0006a41086a220c28020021002001280244210d200221060340200141186a200610d4012001280218210e0240024002400240200d20006b2009280200220f4f0d002000200f6a22042000490d07200d4101742210200420042010491b22114100480d07200d450d012001280240200d2011101e22100d020c080b2000200f6a2104200128024021100c020b2011101f2210450d060b20012011360244200120103602402011210d0b200c2004360200201020006a200e200f10ce031a0240200128021c450d00200e101d0b200641286a210620042100200b41586a220b0d000c020b0b200141c0006a41086a28020021042001280244210d200128024021100b200141086a41102010200410030240200d450d002010101d0b0240200a450d00200541286c41286a2104200221000340024020002d00002206450d00024020064101470d00200041086a280200450d01200041046a280200101d200041286a2100200441586a22040d020c030b200041106a280200450d002000410c6a280200101d0b200041286a2100200441586a22040d000b0b02402003a7450d002002101d0b200141d0006a24000f0b1021000b201141011020000bbd0104017f017e017f017e230041206b2203240042002104200341106a41086a220542003703002003420037031020012002200341106a1001200341086a2005290300370300200320032903103703000240024002402003411041f8b3c200410041001002417f460d002003420037031020034110200341106a41084100100241016a41084d0d0220032903102106200341101009420121040c010b0b2000200437030020002006370308200341206a24000f0b41df88c0004133103a000be096012f017f027e027f037e0e7f017e027f017e037f017e027f037e187f027e027f037e167f017e027f037e1d7f027e057f017e087f037e0e7f037e027f017e127f017e027f027e017f027e017f017e097f017e087f017e047f027e0b7f027e027f230041d0086b2202240002400240024002400240024002400240024002402001450d00200241e8036a41086a22014200370300200242003703e80341a590c1004117200241e8036a1001200241f0056a41086a2001290300370300200220022903e8033703f0050240024002400240024002400240200241f0056a411041f8b3c200410041001002417f460d00200242003703f806200241f0056a4110200241f8066a41084100100241016a41084d0d0220022903f80621030c010b420321030b200241e8036a41086a22014200370300200242003703e8034195a8c1004115200241e8036a1001200241f8066a41086a2001290300370300200220022903e8033703f80602400240200241f8066a411041f8b3c200410041001002417f460d00200242003703f005200241f8066a4110200241f0056a41084100100241016a41084d0d034200210420022903f00520037e22034200510d010c050b4200210442e80720037e22034200520d040b200241e8036a41086a22012004370300200220043703e80341c2ecc100411c200241e8036a1001200241f0046a41086a2001290300370300200220022903e8033703f0040240200241f0046a411041f8b3c200410041001002417f460d002002420037038007200242003703f806200241f0046a4110200241f8066a4110410010022201417f460d032001410f4d0d0320024180076a290300210320022903f80621040c050b420021030c040b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b2000200320032000541b22002004510d0442002104200241e8036a41086a22014200370300200242003703e80341c2ecc100411c200241e8036a1001200241f0046a41086a2001290300370300200220022903e8033703f0042003421086200080210002400240200241f0046a411041f8b3c200410041001002417f460d002002420037038007200242003703f806200241f0046a4110200241f8066a4110410010022201417f460d052001410f4d0d0520024180076a290300210320022903f80621040c010b420021030b200241a0036a200420032000420010d20320022903a003421088200241a8036a2903002200423086842104200042108821030b200241e8036a41086a22014200370300200242003703e80341deecc1004118200241e8036a1001200241f0046a41086a22052001290300370300200220022903e8033703f00402400240200241f0046a411041f8b3c200410041001002417f460d002002420037038007200242003703f806200241f0046a4110200241f8066a4110410010022206417f460d032006410f4d0d0320024180076a290300210720022903f80621000c010b42002100420021070b20014200370300200242003703e80341deecc1004118200241e8036a100120052001290300370300200220022903e8033703f0042002200020047c22043703f8062002200720037c2004200054ad7c37038007200241f0046a4110200241f8066a411010030b200241e8036a41086a22014200370300200242003703e8034181a8c1004114200241e8036a1001200241f0046a41086a22052001290300370300200220022903e8033703f004420021040240024002400240200241f0046a411041f8b3c200410041001002417f460d00200242003703f806200241f0046a4110200241f8066a41084100100241016a41084d0d0120022903f80621040b20014200370300200242003703e80341e0d7c1004115200241e8036a100120052001290300370300200220022903e8033703f0040240200241f0046a411041f8b3c200410041001002417f460d00200241f0046a411010090c070b200241e8036a41086a22014200370300200242003703e80341f6ecc100411b200241e8036a1001200241f0046a41086a22052001290300370300200220022903e8033703f004420021000240200241f0046a411041f8b3c200410041001002417f460d00200242003703f806200241f0046a4110200241f8066a41084100100241016a41084d0d0220022903f80621000b20014200370300200242003703e8034191edc1004116200241e8036a100120052001290300370300200220022903e8033703f00402400240200241f0046a411041f8b3c200410041001002417f460d00200242003703f806200241f0046a4110200241f8066a41084100100241016a41084d0d0420022903f80622034200520d0141d880c400102c000b42e80721030b200420007d2003824200520d070c060b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41c080c400102c000b20024188036a41deecc100411810e3010240024002400240200229039003220820024188036a41106a290300220984500d00200228028803450d01200241e8036a41086a22014200370300200242003703e80341a7edc1004116200241e8036a1001200241f0046a41086a2001290300370300200220022903e8033703f0044100210a02400240024002400240200241f0046a411041f8b3c200410041001002417f460d00200242103702f4052002200241f0046a3602f005200241f8066a200241f0056a105e20022802f806220b450d0220022802fc06210c20024180076a280200220a41057422010d010c040b4101210b4100210c41004105742201450d020b200b20016a210d4120210e4112210f41102110410021114108211241322113412a21144118211541222116411a21174200211841f8b3c2002119417f211a4201211b200241a0076a211c4130211d2002419c076a211e4210211f200b2120410021210c050b41df88c0004133103a000b410021010c040b410021010c030b410121010c020b410121010c010b410321010b0340024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020010e0400010212120b200241e8016a20082009200aad2203420010d20320024190076a2009370300200241f8066a41106a2008370300200241f8066a41086a41003a0000200241043a00f806200241f8066a108b01200241e8036a41086a22014200370300200242003703e80341bdedc1004111200241e8036a1001200241f0046a41086a2001290300370300200220022903e8033703f004200241f0046a411041f8b3c2004100410010022101200241e8016a41086a290300210420022903e8012100024002402001417f460d002002420037038007200242003703f806200241f0046a4110200241f8066a4110410010022201417f460d0f2001410f4d0d0f20024180076a290300210720022903f80621220c010b42002122420021070b200241d8016a202220072003420010d20302402000200484500d0020022903d8012203200241d8016a41086a290300222284500d0042002107200241e8036a41086a22014200370300200242003703e80341aeb9c0004116200241e8036a1001200241f0056a41086a22052001290300370300200220022903e8033703f00502400240200241f0056a411041f8b3c200410041001002417f460d002002420037038007200242003703f806200241f0056a4110200241f8066a4110410010022206417f460d112006410f4d0d1120024180076a290300212420022903f80621230c010b42002123420021240b200241c8016a202320037d202420227d2023200354ad7d2003202210d103200241b8016a20022903c801200241c8016a41086a2903002000200410d20320014200370300200242003703e80341cea8c100410c200241e8036a100120052001290300370300200220022903e8033703f005200241f0056a411041f8b3c2004100410010022101200241b8016a41086a290300210420022903b8012100024002402001417f460d002002420037038007200242003703f806200241f0056a4110200241f8066a4110410010022201417f460d122001410f4d0d1220024180076a290300210320022903f80621070c010b420021030b200241e8036a41086a22014200370300200242003703e80341cea8c100410c200241e8036a1001200241f0056a41086a2001290300370300200220022903e8033703f0052002200720007c22003703f8062002200320047c2000200754ad7c37038007200241f0056a4110200241f8066a411010030b200c450d12200b101d410121010c3c0b200241e8036a41086a22014200370300200242003703e80341ceedc1004112200241e8036a1001200241f0046a41086a2001290300370300200220022903e8033703f00402400240200241f0046a411041f8b3c200410041001002417f460d00200242003703f806200241f0046a4110200241f8066a41084100100241016a41084d0d0320022903f80642017c21040c010b420121040b200241e8036a41086a22014200370300200242003703e80341ceedc1004112200241e8036a1001200241f0046a41086a22052001290300370300200220022903e8033703f004200220043703f806200241f0046a4110200241f8066a4108100320014200370300200242003703e80341e0edc100411a200241e8036a100120052001290300370300200220022903e8033703f0040240200241f0046a411041f8b3c200410041001002417f460d00200242003703f806200241f0046a4110200241f8066a41084100100241016a41084d0d03200220022903f80622043703f005200241e8036a41086a22014200370300200242003703e8034191edc1004116200241e8036a1001200241f0046a41086a2001290300370300200220022903e8033703f00402400240200241f0046a411041f8b3c200410041001002417f460d00200242003703f806200241f0046a4110200241f8066a41084100100241016a41084d0d06200420022903f806520d010c020b200442e807510d010b200241e8036a41086a22014200370300200242003703e8034191edc1004116200241e8036a1001200241f0046a41086a22052001290300370300200220022903e8033703f004200220043703f806200241f0046a4110200241f8066a4108100320014200370300200242003703e8034181a8c1004114200241e8036a100120052001290300370300200220022903e8033703f004420021040240200241f0046a411041f8b3c200410041001002417f460d00200242003703f806200241f0046a4110200241f8066a41084100100241016a41084d0d0820022903f80621040b20014200370300200242003703e80341f6ecc100411b200241e8036a100120052001290300370300200220022903e8033703f004200220043703f806200241f0046a4110200241f8066a410810030b200241e8036a41086a22014200370300200242003703e80341faedc1004116200241e8036a1001200241f0046a41086a2001290300370300200220022903e8033703f004410021250240200241f0046a411041f8b3c200410041001002417f460d00200241003602f806200241f0046a4110200241f8066a41044100100241016a41044d0d0520022802f80621250b200241e8036a41086a22014200370300200242003703e8034190eec100411d200241e8036a1001200241f0046a41086a2001290300370300200220022903e8033703f004024002400240200241f0046a411041f8b3c200410041001002417f460d00200241003602f80641012126200241f0046a4110200241f8066a41044100100241016a41044d0d0820022802f806220141024f0d010c020b410421010b200121260b200241e8036a41086a22014200370300200242003703e80341c8d8c100411a200241e8036a1001200241f0046a41086a2001290300370300200220022903e8033703f004410021050240200241f0046a411041f8b3c200410041001002417f460d0020024190076a4200370300200241f8066a41106a4200370300200241f8066a41086a4200370300200242003703f806200241f0046a4110200241f8066a4120410010022201417f460d082001411f4d0d08200241f0056a41186a2201200241f8066a41186a2205290300370300200241f0056a41106a2206200241f8066a41106a2227290300370300200241f0056a41086a2228200241f8066a41086a2229290300370300200220022903f8063703f005200520012903003703002027200629030037030020292028290300370300200220022903f0053703f806410121050b4128101f2201450d0a200120053a0004200141f8b3c200360200200120022903f806370005200120022f00a8083b00252001410d6a200241f8066a41086a2206290300370000200141156a200241f8066a41106a22272903003700002001411d6a20024190076a2228290300370000200141276a200241aa086a2d00003a0000200241e8036a41086a22054200370300200242003703e80341adeec100411a200241e8036a1001200241f0046a41086a2005290300370300200220022903e8033703f004410021050240200241f0046a411041f8b3c200410041001002417f460d00202842003703002027420037030020064200370300200242003703f806200241f0046a4110200241f8066a4120410010022205417f460d092005411f4d0d09200241f0056a41186a2205200241f8066a41186a2206290300370300200241f0056a41106a2227200241f8066a41106a2228290300370300200241f0056a41086a2229200241f8066a41086a222a290300370300200220022903f8063703f0052006200529030037030020282027290300370300202a2029290300370300200220022903f0053703f806410121050b4128101f2227450d0b202720053a0004202741f8b3c200360200202720022903f806370005202720022f00a8083b00252027410d6a20024180076a290300370000202741156a200241f8066a41106a2903003700002027411d6a200241f8066a41186a290300370000202741276a200241a8086a41026a2d00003a0000200241003602c803200242083703c00320024188086a41186a200241c8086a3602002002410036029808200241f080c40036028c0820022001360288082002200241c0036a36029c082002200241c8086a360294082002200241c8086a36029008200241f8066a20024188086a10f502024002400240024020022d00f80722054102470d00200241023a00f0060c010b200241f0046a200241f8066a41800110ce031a2002200241f8066a4184016a2800003600e303200220022800f9073602e003200241f8066a41046a200241f0046a41800110ce03212120024188086a41106a4101360200200241e8036a200241f8066a41840110ce031a200241003602f806200241f8066a410472200241e8036a41840110ce031a200241f8066a4188016a20053a000020024181086a20022802e00336000020024184086a20022800e303360000200241f0056a2002419c086a200241f8066a10840320022d00f0064102470d010b4100212b200241003602d803200242083703d0032001101d4108212c4108212d4108212e4100212a0c010b200241f8066a200241f0056a41880110ce031a200241e8036a2001108503418801101f222c450d10202c200241f8066a41880110ce031a200241a8086a41186a20024188086a41186a280200360200200241a8086a41106a222f20024188086a41106a290300370300200241a8086a41086a20024188086a41086a29030037030020022002290388083703a808200241f8066a200241a8086a10f502024002400240024020022d00f80722294102470d004101212a4101212b0c010b20024181086a212a200241f8066a410472212d200241bc086a2130200241f9076a212e202f2802002131410221064188012105410021014101212b0340200241f0046a200241f8066a41800110ce031a2002202e41036a2800003600e3032002202e2800003602e0032021200241f0046a41800110ce031a202f203120016a222841016a360200200241e8036a200241f8066a41840110ce031a200220283602f806202d200241e8036a41840110ce031a200241f8066a4188016a20293a0000202a20022802e003360000202a41036a20022800e303360000200241f0056a2030200241f8066a108403200241f0056a4180016a2d00004102460d02200241f8066a200241f0056a41880110ce031a0240200141016a2228202b470d00200241e8036a20022802a80820022802ac08280210110300202841016a22292028490d432006202920292006491b222bad4288017e2204422088a70d432004a722294100480d4302402001417f460d00202c20052029101e222c0d010c100b2029101f222c450d0f0b202c20056a200241f8066a41880110ce031a200641026a210620054188016a2105200241f8066a200241a8086a10f50220282101200241f8066a4180016a2d000022294102470d000b202841016a212a0b202c212d200241f0066a41023a00000c010b200141016a212a202c212d0b20022802a808220520022802ac08220128020011040002402001280204450d002005101d0b2002202a3602d8032002202b3602d4032002202c3602d003202d212e0b200241f0056a20271086032002280290062230450d2241012132200241e8036a410172213341282134200241f0056a41286a213541242136200241f0056a41246a213741182138411021394108213a4120213b200241f8066a41206a213c42d000213d4220213e417f213f41052140428080808010214142002142427f21434100214441d000214541342146413c214741c40021484188012149419f04214a41e000214b41e801214c41f002214d41f803214e41a004214f41c800215041c0002151413821524130215341cc002154410121210c140b209901450d22209901208c016a219901209a01206e6a2101209a0120666a2263219a0120012d00000d112063208c016a229a0120716a219b012063209801470d170c160b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b202941081020000b412841041020000b412841041020000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41880141081020000b024002400240024002400240024002400240024002400240024002400240024002400240024020210e050001020304040b2020450d11200f101f2201450d0a200120106a20112f00ddc5413b0000200120126a20112900d5c541370000200120112900cdc5413700002001200f2013101e2201450d0b20012020290000370012200120146a202020156a290000370000200120166a202020106a290000370000200120176a202020126a290000370000200241e8036a20126a22052018370300200220183703e80320012013200241e8036a1001200241f0046a20126a2005290300370300200220022903e8033703f00402400240200241f0046a20102019201120111002201a460d002002201f3702fc062002200241f0046a3602f80620024180036a200241f8066a10d501200228028003450d0b200241e8026a200241f8066a10ca0220022903e802a7450d0b200241e8026a20106a290300210420022903f00221030c010b42002103420021040b2001101d42002100200242003703f805200242003703f005024002402008200320082003200854200420095420042009511b22011b22227d220320092004200920011b22237d2008202254ad7d220784500d00200241f8066a202010cb02200241f8066a20126a2903002204201820022903f8062200201b5620042018522004501b22011b21042000201b20011b2100200241f8066a200e6a28020021060240201c2802002201450d002000200484500d1020062001201d6c6a2105200621010340200241c0026a2001290300200120126a2903002003200710d203200241b0026a20022903c002200241c0026a20126a2903002000200410d103200241d0026a200120106a20022903b002200241b0026a20126a290300108703200241f0056a20022903d00220022903d802200241d0026a20106a29030010df012001201d6a22012005470d000b0b20002004842018510d0e200241a0026a200241f8066a20106a290300200241f8066a20156a2903002003200710d20320024190026a20022903a002200241a0026a20126a2903002000200410d10320024190026a20126a29030021042002290390022100201e280200450d012006101d0c010b420021040b200241f8016a2020200020227c2203200420237c2003200054ad7c108703200241f0056a20022903f801200229038002200241f8016a20106a29030010df0120022903f005200241f0056a20126a29030010ac012020200e6a220121202001200d470d0f410021010c3c0b2035280200215520372802002156200241a8086a20386a2257200241f0056a20386a290300370300200241a8086a20396a2258200241f0056a20396a290300370300200241a8086a203a6a2259200241f0056a203a6a290300370300200220022903f0053703a808200241e8036a200241a8086a10f60202400240024020022d00e8032032470d00200241f0046a20386a203320386a290000370300200241f0046a20396a203320396a290000370300200241f0046a203a6a2033203a6a290000370300200220332900003703f004200241f8066a200241f0046a10c902203c2802002201450d01200241f8066a203a6a290300215a20022903f8062104200241f8066a20366a280200450d022001101d0c020b203c20443602000b420021044200215a0b2055ad203d7e2200203e88a70d2a2000a72201203f4c0d2a0240024002402001450d002001101f225b450d0920552040742201450d020c010b4108215b20552040742201450d010b203020016a215c2004203e88205a203e8684225d2043205a2041541b215e4200215f4100216020302161410021620c1a0b2004203e88205a203e8684215d4200215f410021600c210b0240202a450d00202d206e6a2101206721050340024020012d0000450d00200120666a21012005208c016a22050d010c020b20012091016a2903002204208e012004208e015620012090016a2903002204208d01522004501b22061b22002004208d0120061b220484208d01510d04200241a8016a208f01208f012000200410d10320012092016a200241a8016a206a6a2903003703002001208b016a20022903a801370300200120666a21012005208c016a22050d000b0b20022802c003229401206b280200229501206c6c6a219601209501450d15209401219701410121620c190b20a6012802282201450d1e20a60128022022c201200120a5016c6a21c30120a60120a8016a21c401410321620c190b20e70120c8016a290300210420e7012903002100200241f0056a20cc016a222f20e70120d4016a290000370300200241f0056a20cd016a22a10120e70120d5016a290000370300200241f0056a20c8016a22a20120e70120d6016a290000370300200220e7012900603703f00520e7012802282229ad20d7017e220320d80188a70d272003a7220520d9014c0d2720e70120cc016a290300210320e701290310210720e701280220210102400240024002402005450d002005101f2221450d082029450d020c010b410821212029450d010b2001202920ca016c6a212841002106202121050340200520012903003703002005200120c8016a290300370308200520cb016a200120cb016a290300370300200520c5016a200120c5016a290300370300200520cc016a200120cc016a290300370300200520cd016a200120cd016a290300370300200520ca016a2105200620c7016a2106200120ca016a22012028470d000c020b0b410021060b200241f8066a20cc016a200337030020d301200737030020da01200636020020db01202936020020dc012021360200200220003703f806200220043703800720dd01101f2201450d01200120de016a20df012900e9d841370000200120df012900e2d841370000200120dd0120e001101e2231450d02203120022903f00537000f203120e1016a202f290300370000203120e2016a20a101290300370000203120e3016a20a201290300370000200241e8036a20c8016a222820e401370300200220e4013703e803203120e001200241e8036a1001200241f0046a20c8016a2028290300370300200220022903e8033703f004202820df01360200200220e5013703e8032002200241f8066a3602880820024188086a200241e8036a10f302200220d3013602880820024188086a200241e8036a10f30220dc012802002101200220da0128020022053602880820024188086a200241e8036a1062024002402005450d00200520ca016c21290340024002400240024020022802ec032206202828020022056b20c5014f0d00200520c5016a22212005490d41200620c70174222f20212021202f491b222120df01480d412006450d0120022802e80320062021101e22060d020c060b20022802e80321060c020b2021101f2206450d040b200220213602ec03200220063602e8030b2028200520c5016a360200200620056a220520c8016a200120cc016a290000370000200520cd016a200120c5016a290000370000200520cc016a200120cb016a2900003700002005200120cd016a290000370000200220013602880820024188086a200241e8036a10f302200120ca016a2101202920e6016a22290d000b0b200020c901542101200420d201512105200420d20154210620022802ec032129200241f0046a20cd0120022802e80322212028280200100302402029450d002021101d0b2001200620051b210120e70120d0016a21e7012031101d024020db01280200450d0020dc01280200101d0b200420d20120011b21d201200020c90120011b21c90120e70120d101470d0d200241e8036a41086a22634200370300200242003703e80341bdedc1004111200241e8036a1001200241f0046a41086a2063290300370300200220022903e8033703f004200220d20137038007200220c9013703f806200241f0046a4110200241f8066a4110100320ce014188016c22634188016d2178024002402063450d002078ad4205862204422088a70d3d2004a722014100480d3d2001101f22cd01450d0d20ce01450d010c1d0b410121cd014100217820ce010d1c0b4100210520cf010d1c0c1d0b202141011020000b41b0b0c400102c000b410f41011020000b412f41011020000b200141081020000b200541081020000b41df88c0004133103a000b411241011020000b413241011020000b41c080c400102c000b41c080c400102c000b200141011020000b410021210c040b410421210c050b410021010c2a0b410121010c290b410221010c280b410321010c270b410321010c260b410321010c250b410021010c050b410221010c040b410121010c030b410321010c020b410321010c010b410321010b0340024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020010e0400010204040b20930120696a219301202e202a20666c6a2198012067219901202e2163024002400240024003402063219a0120980120636b206d4d0d07209a01206e6a2d0000450d01209a01206f6a2d0000450d02209a0120726a2d0000450d0320990120746a219901209a0120756a2163209a0120766a2d00000d000b410321010c030b209a0120716a219b01209a0120666a2263209801470d150c140b209a0120706a2163410121010c010b209a0120736a2163410221010b209a01200120666c6a229a0120716a219b012063209801460d10410121010c240b209b01206a6a2903002104209b0129030021000340206320666a210102402063206e6a2d0000450d002001216320682001470d010c140b20632083016a29030022032004206320716a2903002207200054200320045420032004511b22051b21042007200020051b21002063209a0120051b219a012001216320682001470d000b410221010c230b209a0120693a008001209501450d02209a012083016a219c01209a01208a016a219d01410221620c150b410221010c400b02400240024020620e0400010204040b20612201450d272001203b6a2161202e202a20496c6a212941002105202e2106024002400340202920066b204a4d0d012006204b6a22282001460d02200520282001203b10d00322282044476a21052028450d022006204c6a22282001460d02200520282001203b10d00322282044476a21052028450d022006204d6a22282001460d02200520282001203b10d00322282044476a21052028450d022006204e6a22282001460d02200520282001203b10d00322282044476a21052006204f6a210620280d000c020b0b024020062029460d0003402006204b6a22062001460d02200520062001203b10d00322282044476a21052028450d02200620346a22062029470d000b0b2061205c470d0b0c280b202a20054d0d05202e200520496c22066a222820506a2043202e20066a220620506a290300220320062903402204205e7c22002004542206ad7c220720062007200354200020045a1b22061b37030020282043200020061b370340200241f8066a20386a2206200120386a290000370300200241f8066a20396a2228200120396a290000370300200241f8066a203a6a22292001203a6a290000370300200220012900003703f806024020552060470d00205520326a22012055490d442055203274222f20012001202f491b2201ad203d7e2204203e88a70d442004a7222f2044480d44024002402055450d00205b205520456c202f101e225b0d010c090b202f101f225b450d080b200121550b205b206020456c6a220120443602242001200536022020012042370300200120386a2042370300200120396a20423703002001203a6a204237030020292903002104202829030021002006290300210320022903f8062107200120443a0048200120516a2003370300200120526a2000370300200120536a200437030020012007370328200120546a20022800e303360000200120022802e003360049206020326a21602061205c470d0b0c270b02402097012802282201450d002001206c6c21062097012802202089016a21010340202a200128020022054d0d050240202e200520666c6a22052d0080010d002005290340220420052081016a290300220084500d00200241d8006a208e01208d012097012903002203208d0110d203200241e8006a209701206a6a2903002207208d01208d01208d0110d20320024198016a2003208d01208d01208d0110d20320024188016a208f012002290398012007200229037084200229036084208d015220024198016a206a6a2903002203200229036820022903587c7c22072003547222281b208f01200720281b2004200010d103200241f8006a20970120786a290300208d0120022903880120024188016a206a6a29030010d20320052083016a2228208f0120282903002204200241f8006a206a6a2903007c2005290330220020022903787c22032000542228ad7c22002028200020045420002004511b22281b3703002005208f01200320281b3703300b2001206c6a21012006208b016a22060d000b0b209701206c6a229701209601470d0b410021010c210b209401206c6a212f02402094012802282205450d0020940128022021012005206c6c210503400240209c012001460d0020012085016a209d0120890110d003450d002001206c6a21012005208b016a22050d010c020b20940120786a22062903002104209c0129030021002001209a0120716a22282903002203209401207a6a222929030022077d3703002001200020047d2003200754ad7d370308202829030021042006209c01290300370300202920043703002001206c6a21012005208b016a22050d000b0b202f219401202f209601470d0b0b200241f8066a20786a222f209a0120776a290300370300207b209a0120796a290300370300200241f8066a206a6a222d209a01207c6a2903003703002002209a012903603703f806209a012802282229ad207d7e2204207e88a70d2d2004a72205207f4c0d2d209a0120786a2903002104209a01206a6a2903002100209a012802202101209a012903102103209a01290300210702400240024002402005450d002005101f2221450d082029450d020c010b410821212029450d010b2001202920716c6a2128410021062021210503402005200129030037030020052001206a6a29030037030820052085016a20012085016a29030037030020052089016a20012089016a290300370300200520786a200120786a2903003703002005207a6a2001207a6a290300370300200520716a2105200620696a2106200120716a22012028470d000c020b0b410021060b209a01206e6a2d00002131209a012080016a2903002122209a01206c6a2903002123209a012081016a2903002124209a012082016a290300219e01209a012083016a290300219f01209a0120716a29030021a001024002400240024020022802b403200241b0036a206a6a22052802002201470d00200120696a22282001490d44200120697422a1012028202820a101491b22a201ad2084017e22a301207e88a70d4420a301a722a1012065480d442001450d0120022802b003200120666c20a101101e22280d020c090b20022802b00321280c020b20a101101f2228450d070b200220a2013602b403200220283602b003200528020021010b2028200120666c6a220120233703502001209e01370340200120a00137033020012003370310200120003703082001200737030020012021360220200120022903f806370360200120312065473a008001200120022800f0053600810120012080016a202237030020012081016a202437030020012083016a209f01370300200120786a200437030020012085016a200636020020012086016a20293602002001207c6a202d290300370300200120796a207b290300370300200120776a202f29030037030020012087016a2088012800003600002005200528020020696a360200202e212d2093012064490d060c260b20c201222820a9016a2105202820a5016a21c20120022802b003220620aa0128020020ab016c6a212f0240024002400340202f200622016b20ac014d0d03200120ad016a22062005460d172006200520ae0110d003450d17200120af016a22062005460d012006200520ae0110d003450d01200120b0016a22062005460d022006200520ae0110d003450d020240200120b2016a22292005460d00200120b4016a21062029200520ae0110d0030d010b0b200120b3016a21010c160b200120ab016a21010c150b200120b1016a21010c140b2001202f460d140340200120ad016a22062005460d142006200520ae0110d003450d14200620a9016a2201202f470d000c150b0b4198adc4002005202a104b000b4198adc4002005202a104b000b202f41081020000b200541081020000b20a10141081020000b41022121410321010c370b410021620c070b410021620c070b410121620c070b410221620c080b410221010c130b410221010c120b410121010c110b410221010c100b410321010c0f0b410321010c0e0b410321010c0d0b410321010c0c0b410321010c0b0b202820b5013a0048200241286a20a60120a4016a290300220020b6012028290300220420b60110d203200241386a202820a4016a290300220320b60120a601290300220720b60110d203200241c8006a200720b601200420b60110d20320a60120b8016a290300220420b901200420b9015620a60120b7016a290300220420b601522004501b22051b2207200420b60120051b220484500d04200241186a20ba012002290348200020b60152200320b6015271200229033020b6015272200229034020b6015272200241c8006a20a4016a2903002200200229032820022903387c7c22032000547222051b20ba01200320051b2007200410d103202820b7016a2206200241186a20a4016a2903002200370300202820022903182203370310200120bb016a220520ba012000200529030022047c2003200129035022007c22032000542205ad7c22002005200020045420002004511b22051b370300200120ba01200320051b37035020c401200120ad016a2205460d00200520c40120ae0110d003450d00200120a4016a220520ba01200529030022042006290300220020bc0186202820b8016a2205290300220320bc01888420b60120005022281b7c20012903002200200320bc018620bd0120281b7c22032000542228ad7c22002028200020045420002004511b22281b370300200120ba01200320281b370300200241f8066a20b7016a20c40120b7016a2900002203370300200241f8066a20b8016a20c40120b8016a2900002207370300200241f8066a20a4016a20c40120a4016a2900002222370300200220c40129000022233703f8062006290300210420052903002100200241f0056a20b7016a22282003370300200241f0056a20b8016a22292007370300200241f0056a20a4016a222f2022370300200220233703f005024020012802282205200120be016a2231280200470d00200520b5016a22062005490d2c200520b5017422a1012006200620a101491b22a101ad20bf017e220320bc0188a70d2c2003a722a20120c001480d2c2005450d02200120ae016a280200200520c1016c20a201101e22060d030c060b200120ae016a28020021060c030b20c20120c301470d050c0d0b20a201101f2206450d030b203120a101360200200120ae016a2006360200200120a9016a28020021050b2006200520c1016c6a220520022903f0053703102005200420bc0186200020bc01888420b60120045022061b3703082005200020bc018620bd0120061b370300200520a9016a2028290300370300200520ae016a2029290300370300200520b7016a202f290300370300200120a9016a2201200128020020b5016a36020020c20120c301470d030c0a0b41a8adc400102c000b20a20141081020000b410321620c010b410321620c010b410321010c010b410321010c000b0b20c60120636a21850120ce014188016c216620c6014180016a2163200241b0076a219a014100210520cd012101024002400340206341a47f6a280200216e206341a07f6a28020021cc01200241f0056a206341a87f6a41d80010ce031a20632d00004102460d01200241f8066a200241f0056a41d80010ce031a200241e8036a41186a2268209a0141186a290000370300200241e8036a41106a2271209a0141106a290000370300200241e8036a41086a22c501209a0141086a2900003703002002209a012900003703e8030240206e450d0020cc01101d0b200120022903e803370000200141186a2068290300370000200141106a2071290300370000200141086a20c50129030037000020634188016a2163200541016a2105200141206a2101206641f87e6a22660d000c020b0b206341086a2263208501460d0020c60120ce014188016c6a219a01034020634180016a2d00004102460d0120634188016a21010240206341246a280200450d00206341206a280200101d0b20012163209a012001470d000b0b20cf01450d010b20c601101d0b200220783602f404200220cd013602f004200220053602f80441a7edc1004116200241f0046a10e8024100216602400240024002400240024020054105742263450d0020634105752268ad4205862204422088a70d232004a722014100480d232001101f226e450d0220cd0120636a20cd01470d010c030b4101216e4100216820cd0120636a20cd01460d020b2005410574229a0141606a4105762166200241f8066a4101722105206e216320cd0121010340200241f0056a41186a200141186a290000370300200241f0056a41106a200141106a290000370300200241f0056a41086a200141086a290000370300200220012900003703f005200241f8066a200241f0056a10f6020240024020022d00f8064101470d00200241e8036a41186a200541186a290000370300200241e8036a41106a200541106a290000370300200241e8036a41086a200541086a290000370300200220052900003703e8030c010b200241e8036a41186a4200370300200241e8036a41106a4200370300200241e8036a41086a4200370300200242003703e8030b200141206a2101206320022903e803370000206341186a200241e8036a41186a290300370000206341106a200241e8036a41106a290300370000206341086a200241e8036a41086a290300370000206341206a2163209a0141606a229a010d000b206641016a216620780d020c030b200141011020000b2078450d010b20cd01101d0b2066ad2204421b88a70d0a2004420586a72263417f4c0d0a024002400240024002402063450d002063101f2205450d022066450d010c030b4101210520660d020b41002166410021630c020b206341011020000b2066410574219a014160206e6b217120052163206e2101034020632001290000370000206341186a200141186a290000370000206341106a200141106a290000370000206341086a200141086a290000370000206341206a2163200141206a2101209a0141606a229a010d000b206e20664105746a20716a41057641016a21630b2002206336028007200220663602fc06200220053602f80641aaa8c1004112200241f8066a10e80202402066450d002005101d0b2068450d09206e101d0c090b20a60120a5016a22a60120a701460d0341032121410321010c1a0b20024188086a20386a2201205729030037030020024188086a20396a2205205829030037030020024188086a203a6a22062059290300370300200220022903a8083703880802402056450d002030101d0b205b450d00200241f8066a20386a22282001290300370300200241f8066a20396a22292005290300370300200241f8066a203a6a2221200629030037030020022002290388083703f8060240200241c0036a203a6a2206280200220520022802c403470d00200241f0056a202710850320022802c40322012006280200222f6b203f20022802f005223020326a223120312030491b22304f0d00202f20306a2230202f490d1c2001203274222f20302030202f491b222fad203d7e2204203e88a70d1c2004a722302044480d1c024002402001450d0020022802c003200120456c2030101e22010d010c140b2030101f2201450d130b2002202f3602c403200220013602c0030b20022802c003200520456c6a2201205b360220200120022903f80637022c200120346a2060360200200120366a2055360200200120423703102001205f2042205a204154222f1b3703082001205d2043202f1b370300200120386a2042370300200120466a2021290300370200200120476a2029290300370200200120486a20282903003702002006200520326a360200200241f0056a2027108603200241f0056a203b6a28020022300d150b2027101d0240202a20264f0d000240202a450d00202a4188016c2101202d41206a216303400240206341046a280200450d002063280200101d0b20634188016a2163200141f87e6a22010d000b0b0240202b450d00202c101d0b0240200241c8036a2802002263450d00206341d0006c210120022802c00341206a216303400240206341046a280200450d002063280200101d0b206341d0006a2163200141b07f6a22010d000b0b20022802c403450d0320022802c003101d0c030b202a2025202a2025491b2264ad4288017e2204422088a70d072004a72201417f4c0d07024002402001450d002001101f22050d01200141081020000b410821050b41002165200241003602b803200220643602b403200220053602b0032064450d004188012166202e202a4188016c22676a2168410121694108216a200241c0036a41086a216b41d000216c419f04216d418001216e418802216f4190022170413021714190032172419803217341e07b217441a0042175419804217641f80021774118217841f00021794110217a200241f8066a41106a217b41e800217c4230217d4220217e417f217f41d80021800141c80021810141c000218201413821830142880121840141282185014124218601418401218701200241f3056a218801412021890141e000218a0141b07f218b0141f87e218c014200218d014201218e01427f218f014148219001414021910141b87f2192014100219301410221210c150b410821a401200241c0036a41086a2802002201450d0041d00021a50120022802c00322a601200141d0006c6a21a701412c21a801412821a901200241b0036a41086a21aa0141880121ab01419f0421ac0141e00021ad01412021ae0141e80121af0141f00221b00141900221b10141f80321b20141980321b30141a00421b401410121b501420021b601411821b701411021b801420121b901427f21ba0141d80021bb01422021bc0142808080807021bd01412421be01423021bf01410021c001413021c101410321210c150b20022802d00321c50120022902b403210320022802b00321c6010240200241d0036a20a4016a2802002201450d0020014188016c210520c50141206a210103400240200141046a280200450d002001280200101d0b20014188016a2101200541f87e6a22050d000b0b024020022802d403450d0020c501101d0b0240200241c8036a2802002201450d00200141d0006c210520022802c00341206a210103400240200141046a280200450d002001280200101d0b200141d0006a2101200541b07f6a22050d000b0b024020022802c403450d0020022802c003101d0b20c601450d00200220c6013602a808200220033702ac08200241e8036a41086a22014200370300200242003703e80341a7edc1004116200241e8036a1001200241f0046a41086a2001290300370300200220022903e8033703f004200241f0046a411041f8b3c200410041001002417f460d01200242103702f4052002200241f0046a3602f005200241f8066a200241f0056a105e20022802f8062229450d1120022802fc0621c70120024180076a28020041057422c8010d020c030b420021c901200241e8036a41086a22634200370300200242003703e80341bdedc1004111200241e8036a1001200241f0046a41086a2063290300370300200220022903e8033703f004200241f0046a411041f8b3c200410041001002417f460d032002420037038007200242003703f806200241f0046a4110200241f8066a4110410010022263417f460d0e2063410f4d0d0e20022903f80621c9010c030b41012129410021c701410041057422c801450d010b202921010340410f101f2205450d05200541076a41002900e9d841370000200541002900e2d8413700002005410f412f101e2205450d062005200129000037000f200541276a200141186a22ca012900003700002005411f6a200141106a2206290000370000200541176a200141086a22cb01290000370000200241e8036a41086a22c5014200370300200242003703e8032005412f200241e8036a1001200241f0056a41086a22cc0120c501290300370300200220022903e8033703f005200241f0056a411010092005101d4112101f2205450d07200541106a41002f0087d74122283b0000200541086a41002900ffd6412204370000200541002900f7d6412200370000200541124132101e2205450d08200520012900003700122005412a6a20ca01290000370000200541226a20062900003700002005411a6a20cb0129000037000020c5014200370300200242003703e80320054132200241e8036a100120cc0120c501290300370300200220022903e8033703f005410021cc010240200241f0056a411041f8b3c200410041001002417f460d00200241003602f806200241f0056a4110200241f8066a41044100100241016a41044d0d0520022802f80621cd01200241f0056a41101009410121cc010b2005101d024020cd01410020cc011b22cc0141014d0d004112101f2205450d0a200541106a20283b0000200541086a200437000020052000370000200541124132101e2205450d0b200520012900003700122005412a6a20ca01290000370000200541226a20062900003700002005411a6a20cb0129000037000020c5014200370300200242003703e80320054132200241e8036a1001200241f0046a41086a20c501290300370300200220022903e8033703f004200220cc01417f6a3602f806200241f0046a4110200241f8066a410410032005101d0b200141206a210120c80141606a22c8010d000b0b2003422088a721ce01024020c701450d002029101d0b20ce01450d0c2003a721cf0141880121d00120c60120ce014188016c6a21d101410821c80120c60141086a29030021d20120c60129030021c901411021cd01200241f8066a41106a21d30141f80021d401411821cc0141f00021d50141e80021d601423021d701422021d801417f21d901413021ca01412821cb01200241f8066a41286a21da012002419c076a21db01412021c501200241f8066a41206a21dc01410f21dd01410721de01410021df01412f21e001412721e101411f21e201411721e301420021e401420121e501410121c701415021e60120c60121e701410421210c110b200241e8036a41086a22634200370300200242003703e80341c7eec1004115200241e8036a1001200241f0046a41086a2063290300370300200220022903e8033703f00402400240200241f0046a411041f8b3c200410041001002417f460d00200241003602f806200241f0046a4110200241f8066a41044100100241016a41044d0d0a20023502f80621040c010b423c21040b200241086a20c90142002004420010d203200241e8036a41086a22634200370300200242003703e80341c2ecc100411c200241e8036a1001200241f0046a41086a2063290300370300200220022903e8033703f004200242003703800720024289f48bdcc4002002290308428094ebdc038020022903104200521b3703f806200241f0046a4110200241f8066a411010030c120b102e000b41df88c0004133103a000b410f41011020000b412f41011020000b411241011020000b413241011020000b411241011020000b413241011020000b41df88c0004133103a000b203041081020000b41df88c0004133103a000b41e882c40041004100104b000b41df88c0004133103a000b41012121410321010c030b410321010c020b410321010c010b410321010c000b0b200241f8066a10800120022802f806210520022802fc06216602402002280280072263450d002063410574220141057522c501ad42287e2204422088a70d012004a7229a014100480d01209a01101f2268450d02200520016a216e2063410574219a0120682163200521010340200141086a2900002104200141106a290000210020012900002103206341186a200141186a290000370000206341106a2000370000206341086a200437000020632003370000206341206a4201370300206341286a2163200141206a2101209a0141606a229a010d000b206e20056b41606a41057641016a216e2066450d040c030b410021c501410821684100216e20660d020c030b1021000b209a0141081020000b2005101d0b2002410e3602ec03200241988ec1003602e803200241f8066a41a68ec100200241e8036a108101410021630240024020022802f8062201200228028007229a0141f8b3c200410041001002417f460d00200241003602e8032001209a01200241e8036a41044100100241016a41044d0d0120022802e80321630b024020022802fc06450d002001101d0b200241f0056a206310b30220022802f0052171024002400240206e20022802f805470d0020712068460d01417f219a0120682163207121010340209a0141016a229a01206e4f0d0220632001412010d0030d01200141206a2105206341206a2166206341286a2163200141286a210120662903002005290300510d000b0b2002206e36028007200220c5013602fc06200220683602f806200241f8066a42004200200410a80120022802f405450d012071101d200241d0086a24000f0b024020022802f405450d002071101d0b20c501450d002068101d0b200241d0086a24000f0b41df88c0004133103a000bb10803027f017e107f230041f0036b22022400200241086a200110d50102400240024002400240024002400240024002402002280208450d00200228020c2203ad4288017e2204422088a70d032004a72205417f4c0d032005450d012005101f2206450d042003450d020c050b20004100360200200241f0036a24000f0b4108210620030d030b4100210f4100210d0c030b102e000b200541081020000b200241b0026a4104722107200141086a2108200241306a41186a2109200241306a41106a210a4100210b4100210c410021052003210d0340200141046a220e280200210f200828020021102002410036029003200841002001280200200f20024190036a410420101002220f200f417f461b220f4104200f410449220f1b20082802006a36020002400240200f0d00200228029003211120024190036a200110a301200228029003410f460d00200241b0026a20024190036a41e00010ce031a20094200370300200a4200370300200241306a41086a2210420037030020024200370330200841002001280200200e280200200241306a412020082802001002220f200f417f461b220f4120200f4120491b20082802006a3602000240200f411f4d0d0020024190016a41186a200929030037030020024190016a41106a200a29030037030020024190016a41086a2010290300370300200220022903303703900120022802b0022110200241b4016a200741dc0010ce031a201121120c020b200241b0026a108c010b410f21100b20024190036a200241b4016a41dc0010ce031a20024190026a41186a220e20024190016a41186a29030037030020024190026a41106a221120024190016a41106a29030037030020024190026a41086a221320024190016a41086a2903003703002002200229039001370390022010410f460d02200541016a210f200241306a20024190036a41dc0010ce031a200241106a41186a2214200e290300370300200241106a41106a220e2011290300370300200241106a41086a22112013290300370300200220022903900237031002402005200d470d00200b200f200f200b491b220dad4288017e2204422088a70d042004a722134100480d0402402005450d002006200c2013101e22060d010c060b2013101f2206450d050b2006200c6a22052010360200200541046a200241306a41dc0010ce031a200541e0006a2012360200200541fc006a2014290300370200200541f4006a200e290300370200200541ec006a2011290300370200200541e4006a2002290310370200200b41026a210b200c4188016a210c200f2105200f2003490d000b0b2000200d36020420002006360200200041086a200f360200200241f0036a24000f0b2000410036020002402005450d002006210503402005103c20054188016a2105200c41f87e6a220c0d000b0b0240200d450d002006101d0b200241f0036a24000f0b1021000b201341081020000bf30202027f037e230041306b22022400024002404113101f2203450d002003410f6a41002800f99b40360000200341086a41002900f29b40370000200341002900ea9b40370000200341134126101e2203450d0120032001360013200241206a41086a220142003703002002420037032020034117200241206a1001200241086a2001290300370300200220022903203703000240024002402002411041f8b3c200410041001002417f460d00200220023602102002411036021420024200370328200242003703202002410020024110200241206a41104100100222012001417f461b2201411020014110491b3602182001410f4d0d02200241286a290300210420022903202105200241206a200241106a105e20022802202201450d0220022902242106200020043703082000200537030020002006370214200020013602100c010b200041003602100b2003101d200241306a24000f0b41df88c0004133103a000b411341011020000b412641011020000bc90401077f230041106b2202240020024100360208200242013703002000280200210320022000280208220036020c2002410c6a200210620240024002400240024002402000450d0020004188016c2104200241086a22052802002100200228020421060340200341e0006a28020021070240024002400240200620006b41044f0d00200041046a22082000490d0620064101742200200820082000491b22004100480d062006450d01200228020020062000101e22060d020c070b200228020021060c020b2000101f2206450d050b2002200036020420022006360200200528020021000b2005200041046a360200200620006a20073600002003200210b201024002400240024020022802042206200528020022076b41204f0d00200741206a22002007490d0620064101742207200020002007491b22004100480d062006450d01200228020020062000101e22080d020c080b200228020021080c020b2000101f2208450d060b200220003602042002200836020020052802002107200021060b2005200741206a2200360200200820076a220741086a200341ec006a290000370000200741106a200341f4006a290000370000200741186a200341fc006a2900003700002007200341e4006a29000037000020034188016a2103200441f87e6a22040d000b200128020020012802042008200010032006450d050c040b200228020421032001280200200128020420022802002208200241086a280200100320030d030c040b1021000b200041011020000b200041011020000b2008101d0b200241106a24000be90504027f017e017f047e230041206b220324000240024002404118101f2204450d00200441106a41002900e9ba40370000200441086a41002900e1ba40370000200441002900d9ba40370000200441184138101e2204450d0120042000290000370018200441306a200041186a290000370000200441286a200041106a290000370000200441206a200041086a29000037000042002105200341106a41086a220642003703002003420037031020044138200341106a1001200341086a2006290300370300200320032903103703000240024002402003411041f8b3c200410041001002417f460d00200342003703182003420037031020034110200341106a4110410010022206417f460d022006410f4d0d02200341186a2903002107200329031021052004101d411421064114101f2204450d010c050b420021072004101d411421064114101f22040d040b200641011020000b41df88c0004133103a000b411841011020000b413841011020000b200441106a41002800d5ba40360000200441086a41002900cdba40370000200441002900c5ba403700000240200420064134101e2204450d00200420002900003700142004412c6a200041186a290000370000200441246a200041106a2900003700002004411c6a200041086a29000037000042002108200341106a41086a220642003703002003420037031020044134200341106a1001200341086a2006290300370300200320032903103703000240024002402003411041f8b3c200410041001002417f460d00200342003703182003420037031020034110200341106a4110410010022206417f460d022006410f4d0d02200341186a2903002109200329031021080c010b420021090b2004101d20002008200120052005200156200720025620072002511b22041b22017c220a20092002200720041b22027c200a200854ad7c10e2012000200520017d200720027d2005200154ad7d10e701200341206a24000f0b41df88c0004133103a000b413441011020000bc30b03027f017e047f23004180026b22052400200541086a220642003703002005420037030041d09cc000411920051001200541f0016a41086a2006290300370300200520052903003703f00141002106024002400240024002400240024002400240024002400240024002400240200541f0016a411041f8b3c200410041001002417f460d0020054100360278200541f0016a4110200541f8006a41044100100241016a41044d0d01024020052802782206450d0020052006417f6a1096012005280208410f460d01200541f8006a200541f80010ce031a20052903782107200541f8006a41086a103c20072001580d01200041b09dc00036020420004101360200200041086a41c7003602002002103c20054180026a24000f0b410021060b200541086a220842003703002005420037030041d09cc000411920051001200541f0016a41086a2008290300370300200520052903003703f0012005200641016a360278200541f0016a4110200541f8006a4104100320052001370378200541f8006a41086a200241e00010ce032109200520043703e001200520033a00e801411a101f2202450d01200241186a41002f00e89b403b0000200241106a41002900e09b40370000200241086a41002900d89b40370000200241002900d09b403700002002411a4134101e2208450d022008200636001a200541086a22024200370300200542003703002008411e20051001200541f0016a41086a2002290300370300200520052903003703f0012005410036020820054201370300200529037821014108101f220a450d032005410836020420022002280200220b41086a3602002005200a360200200a200b6a20013700002009200510b20102400240024002400240024002400240024002400240200541e8016a2d000022024101460d0020024102470d012005280204200541086a2802002202470d03200241016a220a2002490d162002410174220b200a200a200b491b220b4100480d162002450d0720052802002002200b101e220a450d080c130b2005280204200541086a2802002202470d01200241016a220a2002490d152002410174220b200a200a200b491b220b4100480d152002450d0420052802002002200b101e220a450d050c100b2005280204200541086a2802002202470d02200241016a220a2002490d142002410174220b200a200a200b491b220b4100480d142002450d0720052802002002200b101e220a450d080c0d0b2005280200210a0c0f0b2005280200210a0c100b2005280200210a0c0b0b200b101f220a0d0b0b200b41011020000b200b101f220a0d0b0b200b41011020000b200b101f220a0d050b200b41011020000b41df88c0004133103a000b411a41011020000b413441011020000b410841011020000b2005200b3602042005200a360200200541086a28020021020b200541086a200241016a360200200a20026a41003a00000c040b2005200b3602042005200a360200200541086a28020021020b200541086a200241016a360200200a20026a41013a00000c020b2005200b3602042005200a360200200541086a28020021020b200541086a200241016a360200200a20026a41023a00000b200541e0016a29030021010240024002402005280204220a200541086a28020022026b41084f0d00200241086a220b2002490d03200a4101742202200b200b2002491b22024100480d03200a450d012005280200200a2002101e220a450d020c040b2005280200210a0c040b2002101f220a0d020b200241011020000b1021000b200520023602042005200a360200200541086a28020021020b200541086a220b200241086a360200200a20026a200137000020052802042102200541f0016a41102005280200220a200b280200100302402002450d00200a101d0b2008101d2009103c20054184016a200636020020054181016a20033a0000200541f8006a41086a41023a0000200541053a0078200541f8006a108b01200041003602002000200636020420054180026a24000b9a0604027f017e047f017e230041a0036b220224000240024002400240411a101f2203450d00200341186a41002f00e89b403b0000200341106a41002900e09b40370000200341086a41002900d89b40370000200341002900d09b403700002003411a4134101e2203450d012003200136001a200241e0016a41086a22014200370300200242003703e0012003411e200241e0016a1001200241086a2001290300370300200220022903e0013703000240024002402002411041f8b3c200410041001002417f460d002002200236021020024110360214200242003703e0012002410020024110200241e0016a41084100100222012001417f461b2201410820014108491b360218200141074d0d0620022903e0012104200241e0016a200241106a10a30120022802e0012101200241c4026a200241e0016a41047241dc0010ce031a2001410f460d0620024184016a200241c4026a41dc0010ce031a20022001360220200241206a41047220024184016a41dc0010ce032105200241003a00e00120022802102002280214200241e0016a4101200241186a22012802001002210620012001280200200641016a41014b22066a22073602002006450d0220022d00e001220641034f0d02200242003703e001200241106a41086a2208410020022802102002280214200241e0016a41082007100222012001417f461b2201410820014108491b20082802006a360200200141074d0d0520022903e001210920022802202101200241e0016a200541dc0010ce031a2002200241236a2800003600c702200220022800203602c4022001410f460d06200241206a200241e0016a41dc0010ce031a200220022800c70236008701200220022802c4023602840120002001360208200020043703002000410c6a200241206a41dc0010ce031a200041f0006a20063a0000200041e8006a20093702002000200228028401360071200041f4006a2002280087013600000c010b2000410f3602080b2003101d200241a0036a24000f0b200241206a103c41df88c0004133103a000b411a41011020000b413441011020000b200241206a103c0b41df88c0004133103a000bec0603027f017e0b7f23004190036b22022400200241086a200110d50102400240024002400240024002400240024002400240024002402002280208450d00200228020c2203ad42e8007e2204422088a70d032004a72205417f4c0d032005450d012005101f2206450d042003450d020c050b2000410036020020024190036a24000f0b4108210620030d030b4100210d4100210b0c030b102e000b200541081020000b200241c8016a4104722107200141086a210541002108410021094100210a2003210b0340200241003a00a8022001280200200141046a220c280200200241a8026a410120052802001002210d20052005280200200d41016a41014b220d6a360200200d450d040240024020022d00a802220d4101460d00200d0d06200241a8026a200241106a41dc0010ce031a410f210c0c010b200241a8026a200110a30120022802a802410f460d04200241c8016a200241a8026a41e00010ce031a200c280200210d2005280200210c2002410036028c03200541002001280200200d2002418c036a4104200c1002220d200d417f461b220d4104200d4104491b20052802006a360200200d41034d0d03200228028c03210e20022802c801210c200241ec006a200741dc0010ce031a200241a8026a200241ec006a41dc0010ce031a200c410f460d05200241106a200241a8026a41dc0010ce031a200241a8026a200241106a41dc0010ce031a200c4110460d060b200a41016a210d200241c8016a200241a8026a41dc0010ce031a0240200a200b470d002008200d200d2008491b220bad42e8007e2204422088a70d072004a7220f4100480d070240200a450d0020062009200f101e22060d010c090b200f101f2206450d080b200620096a220a200c360200200a41046a200241c8016a41dc0010ce031a200a41e0006a200e360200200841026a2108200941e8006a2109200d210a200d2003490d000b0b2000200b36020420002006360200200041086a200d36020020024190036a24000f0b200241c8016a108c010b200241a8026a200241ec006a41dc0010ce031a0b200241a8026a200241106a41dc0010ce031a0b200041003602000240200a450d0020062105034002402005280200410f460d002005103c0b200541e8006a2105200941987f6a22090d000b0b0240200b450d002006101d0b20024190036a24000f0b1021000b200f41081020000bc382010d027f027e067f017e0a7f017e037f017e017f017e297f027e337f230041b0026b2201240020014190026a41086a220242003703002001420037039002419efcc000411420014190026a1001200141f0016a41086a200229030037030020012001290390023703f0010240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200141f0016a411041f8b3c200410041001002417f460d0020014200370350200141f0016a4110200141d0006a41084100100241016a41084d0d02200129035022034200510d044200210420002003824200520d120c010b42002104200042e807824200520d110b20014190026a41086a22022004370300200120043703900241b2fcc000411420014190026a1001200141f0016a41086a200229030037030020012001290390023703f001200141f0016a411041f8b3c200410041001002417f460d1020014100360250200141f0016a4110200141d0006a41044100100241016a41044d0d0120012802502202450d104108210520014190026a41086a22064200370300200142003703900241dfd9c000411520014190026a1001200141f0016a41086a200629030037030020012001290390023703f0014100210602400240200141f0016a411041f8b3c200410041001002417f460d0020014210370294022001200141f0016a36029002200141d0006a20014190026a10a40120012802502205450d06200141d8006a2802002106200128025421070c010b410021070b4200210320014190026a41086a22084200370300200142003703900241c6fcc000411420014190026a1001200141f0016a41086a2209200829030037030020012001290390023703f001200141d0006a200141f0016a10600240200128025c220a450d00200128025822082001290360220b422088a76b20066a2109200129035021030240200ba7450d00200a101d0b20092002490d070c060b200842003703002001420037039002418cb9c000410d20014190026a10012009200829030037030020012001290390023703f001410021080240200141f0016a411041f8b3c200410041001002417f460d0020014200370350200141f0016a4110200141d0006a41084100100241016a41084d0d04200129035021030b200620024f0d050c060b41df88c0004133103a000b41df88c0004133103a000b41f0a8c300102c000b41df88c0004133103a000b41df88c0004133103a000b0240200820024f0d00200820026b220220066a220820024f0d052005200841286c6a29032021030c010b20014190026a41086a22024200370300200142003703900241dafcc000411420014190026a1001200141f0016a41086a200229030037030020012001290390023703f0010240200141f0016a411041f8b3c200410041001002417f460d0020014200370350200141f0016a4110200141d0006a41084100100241016a41084d0d02200129035020037c21030c010b420520037c21030b20014190026a41086a220242003703002001420037039002419efcc000411420014190026a1001200141f0016a41086a200229030037030020012001290390023703f00102400240024002400240200141f0016a411041f8b3c200410041001002417f460d0020014200370350200141f0016a4110200141d0006a41084100100241016a41084d0d022001290350220b4200520d0141a88ec300102c000b42e807210b0b2003200b7c427f7c22032003200b827d210302402007450d002005101d0b20032000520d0c4108210c20014190026a41086a22024200370300200142003703900241dfd9c000411520014190026a1001200141f0016a41086a200229030037030020012001290390023703f0014100210d02400240200141f0016a411041f8b3c200410041001002417f460d0020014210370294022001200141f0016a36029002200141d0006a20014190026a10a4012001280250220c450d07200141d8006a280200210d2001280254210e0c010b4100210e0b20014190026a41086a22024200370300200142003703900241b2fcc000411420014190026a1001200141f0016a41086a200229030037030020012001290390023703f0014100210f0240200141f0016a411041f8b3c200410041001002417f460d0020014100360250200141f0016a4110200141d0006a41044100100241016a41044d0d032001280250210f0b4200210320014190026a41086a220242003703002001420037039002418cb9c000410d20014190026a1001200141f0016a41086a200229030037030020012001290390023703f0010240200141f0016a411041f8b3c200410041001002417f460d0020014200370350200141f0016a4110200141d0006a41084100100241016a41084d0d02200129035021030b0240024002400240200d41286c2202450d00200c41206a2903002003520d00200141f0016a41186a2206200c41186a290300370300200141f0016a41106a2208200c41106a290300370300200141f0016a41086a2205200c41086a2903003703002001200c2903003703f0014120101f2210450d0b201020012903f001370000201041186a2006290300370000201041106a2008290300370000201041086a2005290300370000200c20026a200c41286a2202460d02200d41286c41586a21054120210841012106410121110340200241206a2903002003520d04200141f0016a41186a2207200241186a290300370300200141f0016a41106a220a200241106a290300370300200141f0016a41086a2209200241086a290300370300200120022903003703f00102400240024020112006470d00200641016a22122006490d2a20064101742213201220122013491b2213ad420586220b422088a70d2a200ba722124100480d2a2006450d01201020064105742012101e22100d020c0c0b200621130c010b2012101f2210450d0a0b200241286a2102201020086a220620012903f001370000200641186a2007290300370000200641106a200a290300370000200641086a2009290300370000200841206a2108201141016a211120132106200541586a22050d000c020b0b4101211041002111410021130b200f200d20116b22064d0d0a0c0b0b4101211141012113200f200d41016b22064b0d0a0c090b20062113200f200d20116b22064b0d090c080b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b201241011020000b41df88c0004133103a000b4188a9c30020082006104b000b412041011020000b2013450d012010101d0c010b20014190026a41086a22024200370300200142003703900241eefcc000411c20014190026a1001200141f0016a41086a200229030037030020012001290390023703f00102400240024002400240024002400240200141f0016a411041f8b3c200410041001002417f460d0020014200370350200141f0016a4110200141d0006a41084100100241016a41084d0d022001290350210b0c010b42e807210b0b20014190026a41086a22024200370300200142003703900241c6fcc000411420014190026a1001200141f0016a41086a200229030037030020012001290390023703f00120014100360258200142013703504108101f2202450d01200142888080808001370254200120023602502002200b20037c370000200241084110101e2202450d0220014290808080c0013702542002200f20066b221436000820012002360250200120113602900220014190026a200141d0006a10620240024002402011450d002011410574210a4100200141d0006a41086a28020022066b210520012802502109200128025421072010210203400240200720056a411f4b0d00200641206a22082006490d2320074101742212200820082012491b22084100480d23024002402007450d00200920072008101e22090d010c060b2008101f2209450d050b200821070b200920066a22082002290000370000200841186a200241186a290000370000200841106a200241106a290000370000200841086a200241086a290000370000200541606a2105200641206a2106200241206a2102200a41606a220a0d000b200141d8006a200636020020012007360254200120093602500c010b200141d8006a280200210620012802542107200128025021090b200141f0016a411020092006100302402007450d002009101d0b02402013450d002010101d0b20014190026a41086a220242003703002001420037039002418afdc000410e20014190026a1001200141f0016a41086a200229030037030020012001290390023703f0014100210602400240200141f0016a411041f8b3c200410041001002417f460d0020014210370294022001200141f0016a36029002200141d0006a20014190026a105e20012802502212450d0620012802542115200141d8006a280200220641ffffff3f712213450d010c070b4101211241002115410041ffffff3f7122130d060b410821100c060b200841011020000b41df88c0004133103a000b410841011020000b411041011020000b41df88c0004133103a000b20134104742202101f22100d00200241081020000b4100210202402012201220064105746a460d002006410574220841606a2107200141086a21052010210220122106034020012006109a01200129030021032002200529030037030820022003370300200241106a2102200641206a2106200841606a22080d000b200741057641016a21020b20014190026a41086a2206420037030020014200370390024198fdc000411820014190026a1001200141d0006a41086a2006290300370300200120012903900237035020014100360298022001420137039002200120023602f001200141f0016a20014190026a10620240024020024104742207450d0020062802002102200128029002210a2001280294022105201021060340200641086a29030021032006290300210b0240024002400240200520026b41104f0d00200241106a22082002490d1f20054101742209200820082009491b22094100480d1f2005450d01200a20052009101e220a0d020c0a0b200241106a21080c020b2009101f220a450d080b200921050b200641106a2106200a20026a220220033700082002200b37000020082102200741706a22070d000b20014198026a200836020020012005360294022001200a360290020c010b200628020021082001280294022105200128029002210a0b200141d0006a4110200a2008100302402005450d00200a101d0b02402013450d002010101d0b20014190026a41086a22024200370300200142003703900241b0fdc000411220014190026a1001200141f0016a41086a200229030037030020012001290390023703f00102400240200141f0016a411041f8b3c200410041001002417f460d0020014100360250200141f0016a4110200141d0006a41044100100241016a41044d0d0a200128025021050c010b410221050b200141a8026a4200370300200141a0026a420037030020014198026a42003703002001420037039002200520146a220aad42307e2203422088a70d172003a72202417f4c0d17024002402002450d002002101f2209450d0d200921020c010b41082109410821020b200141d0006a41186a220620014190026a41186a290300370300200141d0006a41106a220820014190026a41106a290300370300200141d0006a41086a20014190026a41086a2903003703002001200129039002370350024002400240200a4102490d002011200f6a20056a417f6a200d6b21050340200141f0016a41186a2006290300370300200141f0016a41106a2008290300370300200141f0016a41086a200141d0006a41086a2207290300370300200120012903503703f0012002420037030820024200370300200729030021032008290300210b20012903502116200241286a2006290300370300200241206a200b370300200241186a2003370300200241106a2016370300200241306a21022005417f6a22050d000b200a417f6a21060c010b41002106200a450d010b200242003703082002420037030020022001290350370310200241186a200141d8006a290300370300200241206a200141e0006a290300370300200241286a200141d0006a41186a290300370300200641016a21060b200120063602582001200a3602542001200936025020014190026a41086a22024200370300200142003703900241c2fdc000411320014190026a1001200141f0016a41086a200229030037030020012001290390023703f00120014110360294022001200141f0016a36029002200141d0006a20014190026a1085020240200a450d002009101d0b200141d0006a41086a2014360200200141023a0054200141063a0050200141d0006a108b012015450d002012101d200e0d010c020b200e450d010b200c101d0b20014190026a41086a22022004370300200120043703900241c6fcc000411420014190026a1001200141f0016a41086a200229030037030020012001290390023703f001200141d0006a200141f0016a1060200128025c2217450d172001280260211820012903502000520d1620014190026a41086a2202420037030020014200370390024198fdc000411820014190026a1001200141d0006a41086a20022903003703002001200129039002370350200141d0006a4110100920024200370300200142003703900241c6fcc000411420014190026a1001200141f0016a41086a200229030037030020012001290390023703f0010240024002400240024002400240200141f0016a411041f8b3c200410041001002417f460d002001200141f0016a3602900220014110360294022001420037035020014100200141f0016a4110200141d0006a41084100100222022002417f461b2202410820024108491b220636029802200241074d0d05200129035021042001410036025020014198026a4100200141f0016a4110200141d0006a41042006100222022002417f461b22024104200241044922021b20066a36020020020d0520012802502102200141d0006a20014190026a105e20012802502219450d052001290254211a200141f0016a41101009200120023602c801200120043703c00120012802c801211b410821094200211620014190026a41086a22024200370300200142003703900241c2fdc000411320014190026a1001200141f0016a41086a200229030037030020012001290390023703f0010240200141f0016a411041f8b3c200410041001002417f460d0020014210370294022001200141f0016a36029002200141d0006a20014190026a10860220012802502209450d0a20012902542116200141f0016a411010090b20014190026a41086a220242003703002001420037039002418cb9c000410d20014190026a1001200141f0016a41086a2206200229030037030020012001290390023703f0014200210b0240200141f0016a411041f8b3c200410041001002417f460d0020014200370350200141f0016a4110200141d0006a41084100100241016a41084d0d042001290350210b0b20024200370300200142003703900241dafcc000411420014190026a10012006200229030037030020012001290390023703f001200141f0016a411041f8b3c200410041001002417f460d0120014200370350200141f0016a4110200141d0006a41084100100241016a41084d0d042001290350211c0c020b02402018450d002017101d0b41ae9fc100410f100a41a3fec0004135100a200141b0026a24000f0b4205211c0b4200210420014190026a41086a220242003703002001420037039002418efec000411520014190026a1001200141f0016a41086a200229030037030020012001290390023703f00102400240200141f0016a411041f8b3c200410041001002417f460d002001420037035820014200370350200141f0016a4110200141d0006a4110410010022202417f460d072002410f4d0d07200141d8006a2903002104200129035021000c010b420921000b20092016422088a7221d41306c6a2102024002400240201b450d00201b417f6a211041002108024020092002460d002009201d41306c6a220641506a2202290300200641586a29030084500d02200141a8026a200641786a290000370300200141a0026a200641706a29000037030020014198026a200641686a2900003703002001200641606a29000037039002410121080b410021120c020b4100211241002110410021080c010b410121120b200141d9006a20014190026a41086a290300370000200141e1006a20014190026a41106a290300370000200141e9006a20014190026a41186a290300370000200120083a005020012001290390023700514101211e200141d0006a4101722106024002402008450d00200620002004109401200141f0016a41186a200641186a290000370300200141f0016a41106a200641106a290000370300200141f0016a41086a200641086a290000370300200120062900003703f0014120101f221e450d09201e20012903f001370000201e41186a200141f0016a41186a2206290300370000201e41106a200141f0016a41106a2208290300370000201e41086a200141f0016a41086a2205290300370000200141d0006a4101722107410221114120210a4101210d4101211f410020106b220c41016a4101460d010340201241ff01710d0220092002460d02200241506a2210290300200241586a29030084500d022006200241786a2900003703002008200241706a2900003703002005200241686a2900003703002001200241606a2900003703f001200720012903f001370000200741086a2005290300370000200741106a2008290300370000200741186a2006290300370000200141013a005020072000200410940120014190026a41186a2202200629030037030020014190026a41106a2212200829030037030020014190026a41086a22132005290300370300200120012903f0013703900220062002290300370300200820122903003703002005201329030037030020012001290390023703f0010240200d201f470d00200d41016a2202200d490d1d2011200220022011491b221fad4205862203422088a70d1d2003a722024100480d1d0240200d450d00201e200a2002101e221e0d010c080b2002101f221e450d070b201e200a6a220220012903f001370000200241186a2006290300370000200241106a2008290300370000200241086a2005290300370000201141026a2111200a41206a210a4100211220102102200c200d41016a220d6a4101470d000c020b0b200141f0016a41186a200641186a290000370300200141f0016a41106a200641106a290000370300200141f0016a41086a200641086a290000370300200120062900003703f0014100210d4100211f0b4108212020014190026a41086a22024200370300200142003703900241dfd9c000411520014190026a1001200141f0016a41086a200229030037030020012001290390023703f0014100212102400240200141f0016a411041f8b3c200410041001002417f460d0020014210370294022001200141f0016a36029002200141d0006a20014190026a10a40120012802502220450d0a200141d8006a2802002111200128025421210c010b410021110b200141013602502020201141286c6a210e024002400240024002400240201a422088a72205450d00410021224100212302402005200e20206b41286e2202200220054b1b2202450d00200241057422064100480d202006101f2208450d1220012008360250200221230b20202102200521082001280250222421060340200e20026b419f014d0d0220062002290000370000200641186a200241186a290000370000200641106a200241106a290000370000200641086a200241086a29000037000020084101460d0320062002290028370020200641386a200241c0006a290000370000200641306a200241386a290000370000200641286a200241306a29000037000020084102460d0420062002290050370040200641d8006a200241e8006a290000370000200641d0006a200241e0006a290000370000200641c8006a200241d8006a29000037000020084103460d0520062002290078370060200641f8006a20024190016a290000370000200641f0006a20024188016a290000370000200641e8006a20024180016a290000370000202241046a212220064180016a2106200241a0016a21022008417c6a22080d000c060b0b4100212320012802502124410021220c040b200e2002460d032020201141286c6a2112410121070240034020062002290000370000200641186a200241186a290000370000200641106a200241106a290000370000200641086a200241086a29000037000020082007220a460d01200a41016a2107200641206a21062012200241286a2202470d000b0b2022200a6a21220c030b202241017221220c020b202241027221220c010b202241037221220b201c200b7c210b201e200d4105746a2125024002400240024002402005450d00200e2020460d012005417f732106201141286c2108202021020340200141f0016a41186a200241186a290300370300200141f0016a41106a200241106a290300370300200141f0016a41086a200241086a290300370300200120022903003703f001200641016a2206450d03200241286a2102200841586a22080d000c020b0b200e2020460d00200141d0006a41186a202041186a290300370300200141d0006a41106a202041106a290300370300200141d0006a41086a202041086a29030037030020012020290300370350202041286a2106202029032021040c020b0240201e2025460d00200141f0016a41186a201e41186a2202290000370300200141f0016a41106a201e41106a2206290000370300200141f0016a41086a201e41086a22082900003703002001201e2900003703f0012008290000210420062900002100201e290000210320014190026a41186a200229000037030020014190026a41106a200037030020014190026a41086a20043703002001200337039002201e41206a210841022105200e2106200b21040c030b410021114108210c02402021450d002020101d0b410021070c100b200241206a2903002104200141d0006a41186a200141f0016a41186a290300370300200141d0006a41106a200141f0016a41106a290300370300200141d0006a41086a200141f0016a41086a290300370300200120012903f001370350200241286a21060b20014190026a41186a200141d0006a41186a29030037030020014190026a41106a200141d0006a41106a29030037030020014190026a41086a200141d0006a41086a290300370300200120012903503703900241002105201e21080b417f417f200e20066b41286d2202202520086b4105766a220720072002491b220241016a220720072002491b2211ad42287e2200422088a70d182000a72202417f4c0d18024002402002450d002002101f220c450d0c200c21260c010b4108210c410821260b200c200129039002370300200c41186a20014190026a41186a290300370300200c41106a20014190026a41106a290300370300200c41086a20014190026a41086a29030037030020262004370320024002402005450d0020082025460d01200841086a2900002104200841106a29000021002008290000210320014190026a41186a200841186a29000037030020014190026a41106a200037030020014190026a41086a20043703002001200337039002200841206a21080c100b02402006200e460d00200141d0006a41186a200641186a2202290300370300200141d0006a41106a200641106a2205290300370300200141d0006a41086a200641086a22072903003703002001200629030037035020014190026a41086a200729030037030020014190026a41106a200529030037030020014190026a41186a20022903003703002001200629030037039002200641286a2102200629032021044100210f0c110b20082025460d00200141f0016a41186a200841186a2202290000370300200141f0016a41106a200841106a2205290000370300200141f0016a41086a200841086a2207290000370300200120082900003703f00120072900002104200529000021002008290000210320014190026a41186a200229000037030020014190026a41106a200037030020014190026a41086a20043703002001200337039002200841206a21080c0f0b4101210720210d100c110b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b200241011020000b200941011020000b41df88c0004133103a000b41df88c0004133103a000b412041011020000b41df88c0004133103a000b41df88c0004133103a000b200241081020000b200641011020000b200241081020000b410021020c090b4102210f200b2104200621020b4102210a41022106412821050340200141d0006a41186a221220014190026a41186a2214290300370300200141d0006a41106a221020014190026a41106a2215290300370300200141d0006a41086a221320014190026a41086a22272903003703002001200129039002370350024020062207417f6a22062011470d002006417f417f200e20026b41286d2226202520086b4105766a221120112026491b222641016a221120112026491b6a22262006490d0b200a20262026200a491b2211ad42287e2200422088a70d0b2000a722064100480d0b0240024020074101470d002006101f220c0d010c060b200c20052006101e220c450d050b200c21260b202620056a22062001290350370300200641186a2012290300370300200641106a2010290300370300200641086a2013290300370300200641206a2004370300024002400240024002400240200f41ff017122064101460d0020064102470d0120082025460d05200841086a2900002104200841106a2900002100200829000021032014200841186a29000037030020152000370300202720043703002001200337039002200841206a2108420121004102210f0c020b200e2002460d042014200241186a2903003703002015200241106a2903003703002027200241086a290300370300200120022903003703900220022903202104420121004101210f200241286a21020c030b200e2002470d014102210f024020082025460d00200141f0016a41186a200841186a2206290000370300200141f0016a41106a200841106a2212290000370300200141f0016a41086a200841086a2210290000370300200120082900003703f0012010290000210420122900002100200829000021032014200629000037030020152000370300202720043703002001200337039002200841206a2108420121000c010b420021000c020b200b21040c010b2012200241186a22062903003703002010200241106a22122903003703002013200241086a221029030037030020012002290300370350201029030021042012290300210020022903002103201420062903003703002015200037030020272004370300200120033703900220022903202104420121004100210f200241286a21020b200a41026a210a200741016a2106200541286a210520004200520d010b0b2021450d010b2020101d0b0240200741144b0d0041012128200741014d0d03417f21292007417f6a212a4128212b2026200741286c6a212c4102212d4120212e4118212f41102130410821314103213241f0002133415821344178213541702136416821374160213841c80021394100213a0c040b2007410176223bad42287e2204422088a70d062004a72202417f4c0d064108213c024002402002450d002002101f223d450d03203d213e0c010b4108213d4108213e0b4158213f202641586a2140202641a87f6a21414100214241042143417f21444101214542032146422021474103214841022149417d214a4128214b4178214c4120214d4118214e4110214f417e2150417421514164215241502153410521544109215541f000215641c800215741c0002158413821594130215a410a215b4104215c4100215d4100215e2007215f4101213a0c040b200641081020000b200241081020000b410021020c020b410121020c010b410121020b0240034002400240024002400240024002400240024002400240024002400240024002400240024002400240024020020e020001010b20012007360258200120113602542001200c36025020014190026a41086a22654200370300200142003703900241dfd9c000411520014190026a1001200141f0016a41086a2202206529030037030020012001290390023703f00120014110360294022001200141f0016a36029002200141d0006a20014190026a10870202402011450d00200c101d0b20654200370300200142003703900241d5fdc000411220014190026a10012002206529030037030020012001290390023703f00141002166024002400240200141f0016a411041f8b3c200410041001002417f460d0020014210370294022001200141f0016a36029002200141d0006a20014190026a105e20012802502267450d02200141d8006a2802002168200128025421660c010b41012167410021680b200141d8016a4200370300200141d0016a4200370300200141c8016a4200370300200142003703c0012068ad2204421b88a70d172004420586a72265417f4c0d17024002402065450d002065101f22690d01206541011020000b410121690b200141d0006a41186a2206200141c0016a41186a290300370300200141d0006a41106a2208200141c0016a41106a290300370300200141d0006a41086a2205200141c0016a41086a290300370300200120012903c00137035002400240024020684102490d002068417f6a210220692165034020652001290350370000206541186a2006290300370000206541106a2008290300370000206541086a2005290300370000206541206a21652002417f6a22020d000b2068417f6a216a0c010b4100216a206921652068450d010b20652001290350370000206541186a200141d0006a41186a290300370000206541106a200141d0006a41106a290300370000206541086a200141d0006a41086a290300370000206a41016a216a0b2009201d41306c6a21652016a7216b4100216c4158216d4150216e4178216f4118217020014190026a41186a2171417021724110217320014190026a41106a2174416821754108217620014190026a41086a217741602178410121794105217a201b450d024102213a0c090b41df88c0004133103a000b02400240024002400240024002400240024002400240203a0e0400010203030b2007202a220220296a222a490d0402402007202a6b2206202d490d0020262002202b6c6a2202202e6a22052903002026202a202b6c6a2208202e6a220a29030022045a0d00200141f0016a202f6a22122008202f6a2210290300370300200141f0016a20306a2213200820306a220f290300370300200141f0016a20316a220e200820316a2214290300370300200120082903003703f001200820022903003703002014200220316a290300370300200f200220306a29030037030020102002202f6a290300370300200a2005290300370300024020062032490d00200820336a29030020045a0d0041022108202c210503402005220220346a2002290300370300200220356a2002202e6a290300370300200220366a2002202f6a290300370300200220376a200220306a290300370300200220386a200220316a290300370300200820286a220820064f0d012002202b6a2105200220396a2903002004540d000b0b200220012903f001370300200220043703202002202f6a2012290300370300200220306a2013290300370300200220316a200e2903003703000b202c20346a212c202a0d090c0e0b205f21604100215f41012161206020446a2210450d1502400240024002400240024020262010204b6c6a204d6a29030020262060204b6c22026a20536a29030022045a0d002041206020546c20487422056a2102034020102045460d02201020446a21102004200229030022005421062002203f6a21022000210420060d000c030b0b206020506a2105204120026a21064100215f41002102034020052002460d05200220456a21022004200629030022005a21082006203f6a21062000210420080d000b200220456a2161206020026b20446a2210450d030c020b410021100b20602010490d08206020074b0d0a0240206020106b22612045762208450d00204020056a210220262010204b6c6a21060340200141d0006a204d6a22052006204d6a220a290300370300200141d0006a204e6a22122006204e6a2213290300370300200141d0006a204f6a220f2006204f6a220e290300370300200141d0006a203c6a22142006203c6a2215290300370300200120062903003703502002203c6a222729030021042002204f6a222529030021002002204e6a222029030021032002290300210b200a2002204d6a222129030037030020132003370300200e2000370300201520043703002006200b37030020212005290300370300202020122903003703002025200f29030037030020272014290300370300200220012903503703002002203f6a21022006204b6a2106200820446a22080d000b0b2010450d010b206120554b0d00206020074b0d0820262010204b6c6a2162410021630c1c0b2010215f205d205e460d190c1a0b20602161205d205e460d160c170b20652009460d012065206d6a21022065206e6a2265290300200229030084500d01201b2079460d0b2079201b6b2102034020092065460d022065206d6a21062065206e6a2265290300200629030084500d02200220796a22020d000c0b0b0b20652009460d00024003402065206d6a29030021042065206e6a2202290300210020712065206f6a2903003703002074206520726a2903003703002077206520756a2903003703002001206520786a290300370390022000200484500d01200141d0006a20706a22062071290300370300200141d0006a20736a22082074290300370300200141d0006a20766a220520772903003703002001200129039002370350200141e0016a200141d0006a10fb01200141c0016a20706a220a2071290300370300200141c0016a20736a22122074290300370300200141c0016a20766a2210207729030037030020012001290390023703c001024020012802e0012079460d002002216520092002470d010c030b0b200141f0016a20766a22132010290300370300200141f0016a20736a22102012290300370300200141f0016a20706a2212200a290300370300200120012903c0013703f001200141e0016a20766a2802002102200141306a20706a220a2012290300370300200141306a20736a22122010290300370300200141306a20766a22102013290300370300200120012903f001370330200141106a20706a2213200a290300370300200141106a20736a220a2012290300370300200141106a20766a2212201029030037030020012001290330370310200620132903003703002008200a29030037030020052012290300370300200120012903103703500240206a20024d0d002065206e6a216520692002207a746a22022001290350370000200220706a2006290300370000200220736a2008290300370000200220766a2005290300370000206c20796a216c4100211b41000d0a4103213a0c110b4198a9c3002002206a104b000b200141306a41186a200141f0016a41186a290300370300200141306a41106a200141f0016a41106a290300370300200141306a41086a200141f0016a41086a290300370300200120012903f0013703300b0240206b450d002009101d0b024002400240206a206841ffffff3f7122652065206a4b1b2208450d0020672165206921024100214d0340024020652002460d0020652002412010d003450d004116101f2206450d032006410e6a41002900d7d940370000200641086a41002900d1d940370000200641002900c9d940370000200641164136101e2206450d04200620652900003700162006412e6a206541186a290000370000200641266a206541106a2900003700002006411e6a206541086a29000037000020014190026a41086a2205420037030020014200370390022006413620014190026a1001200141d0006a41086a20052903003703002001200129039002370350200141d0006a411010092006101d0b206541206a2165200241206a2102204d41016a224d2008490d000b0b2069206a4105746a2165206a21050240024002400240024002400240206a4104490d00200141d0006a41206a213c20014190016a214f200141b0016a214e200141d0016a213f200141e8006a2106200141e0006a214d200141d8006a210820652102206a2105034020064200370300204d420037030020084200370300200142003703500240203c2002460d00200241606a200141d0006a412010d0030d030b20064200370300204d420037030020084200370300200142003703500240204f2002460d00200241406a200141d0006a412010d0030d040b20064200370300204d420037030020084200370300200142003703500240204e2002460d00200241a07f6a200141d0006a412010d0030d050b20064200370300204d42003703002008420037030020014200370350200241807f6a21650240203f2002460d002065200141d0006a412010d0030d060b2005417c6a210520652102206520696b41ff004b0d000b0b20652069460d052005417f6a2102200141d0006a41206a2106200141e8006a214d200141e0006a2108200141d8006a21050340204d4200370300200842003703002005420037030020014200370350024020062065460d00206541606a200141d0006a412010d0030d060b2002417f6a21022069206541606a2265470d000c060b0b2005417f6a21020c030b2005417e6a21020c020b2005417d6a21020c010b2005417c6a21020b200241016a2265206a206a20654b1b216a0b200141ec006a2022360200200141d0006a41186a2023360200200141e4006a2024360200200141d0006a41106a200d360200200141dc006a201f360200200141d0006a41086a2265201e360200200141033a0054200141063a0050200141d0006a108b0120014190026a41086a22024200370300200142003703900241d5fdc000411220014190026a1001200141f0016a41086a200229030037030020012001290390023703f00120014100360258200142013703502001206a3602900220014190026a200141d0006a1062024002400240206a450d00206a41057421054100206528020022026b214d2001280250213c2001280254210820692165034002402008204d6a411f4b0d00200241206a22062002490d232008410174224f20062006204f491b22064100480d23024002402008450d00203c20082006101e223c0d010c060b2006101f223c450d050b200621080b203c20026a22062065290000370000200641186a206541186a290000370000200641106a206541106a290000370000200641086a206541086a290000370000204d41606a214d200241206a2102206541206a2165200541606a22050d000b200141d8006a2002360200200120083602542001203c3602500c010b20652802002102200128025421082001280250213c0b200141f0016a4110203c2002100302402008450d00203c101d0b02402068450d002069101d0b20014190026a41086a22654200370300200142003703900241e7fdc000411620014190026a1001200141f0016a41086a2202206529030037030020012001290390023703f0012001206c360250200141f0016a4110200141d0006a4104100320654200370300200142003703900241fdfdc000411120014190026a10012002206529030037030020012001290390023703f00102400240200141f0016a411041f8b3c200410041001002417f460d0020014100360250200141f0016a4110200141d0006a41044100100241016a41044d0d06200128025041016a21650c010b410121650b20014190026a41086a22024200370300200142003703900241fdfdc000411120014190026a1001200141f0016a41086a200229030037030020012001290390023703f00120012065360250200141f0016a4110200141d0006a4104100302402066450d002067101d0b201aa7450d202019101d0c200b200641011020000b411641011020000b413641011020000b202a2007102a000b41df88c0004133103a000b20102060102a000b20602010417f6a225f490d160b20602007102b000b4100213a0c050b4103213a0c050b4102213a0c070b4103213a0c070b4103213a0c070b410021020c0e0b410121020c0d0b410121020c0c0b410121020c0b0b410121020c0a0b410121020c090b410121020c080b410121020c070b410021020c050b410121020c040b410221020c030b410121020c020b410221020c010b410321020b034002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020020e0400010204040b205d205e470d13410121020c170b205d20456a2202205d490d1a205d2045742206200220022006491b2202ad2046862204204788a70d1a2004a722062042480d1a02400240205d450d00205c205d2048742006101e225c0d010c030b2006101f225c450d020b2002215d410221020c160b205c205e2048746a220220613602042002205f360200205e20456a2264215e20642049490d02410121630c140b200641041020000b0240024020630e020001010b2060201020446a225f490d1602402060205f6b22612049490d0020262010204b6c6a2202204d6a22082903002026205f204b6c6a2206204d6a220529030022045a0d00200141f0016a204e6a220a2006204e6a2212290300370300200141f0016a204f6a22132006204f6a220f290300370300200141f0016a203c6a220e2006203c6a2214290300370300200120062903003703f0012006200229030037030020142002203c6a290300370300200f2002204f6a29030037030020122002204e6a29030037030020052008290300370300024020612048490d00200620566a29030020045a0d0041022106206221080240034020082202204d6a200220576a2903003703002002204e6a200220586a2903003703002002204f6a200220596a2903003703002002203c6a2002205a6a29030037030020022002204b6a2208290300370300200620456a220620614f0d01200220566a2903002004540d000b0b2002204b6a21020b200220012903f001370300200220043703202002204e6a200a2903003703002002204f6a20132903003703002002203c6a200e2903003703000b205f450d0f2062203f6a2162205f21102061205b490d0d410021020c140b0240024002400240205c2064220e20446a22642048746a2202280200450d00205c200e2048746a220a20516a2802002205200228020422064d0d004102215e200e41024d0d04205c200e204a6a22022048746a2802042208200620056a4d0d014103215e200e41034d0d04200a20526a280200200820056a4d0d010c050b200e2048490d0120022802042106205c200e204a6a22022048746a28020421080b20082006490d010b200e20506a21020b200e200220456a22254d0d03200e20024d0d04205c20022048746a2215280204222020152802006a2202205c20252048746a2227280200225e490d05200220074b0d06201520436a21212026205e204b6c6a220f20272802042214204b6c22066a210a2002204b6c2108024002400240024002402002205e6b221220146b220220144f0d00203d200a2002204b6c220610ce031a203e20066a210520142045480d0120022045480d01204020086a2108200a2102034020082002203f6a22122005203f6a22132005204c6a2903002002204c6a29030054220a1b22062903003703002008204d6a2006204d6a2903003703002008204e6a2006204e6a2903003703002008204f6a2006204f6a2903003703002008203c6a2006203c6a29030037030020052013200a1b2105200f20122002200a1b22024f0d042008203f6a2108203e2106203e2005490d000c050b0b203d200f200610ce031a203e20066a210520142045480d01201220144c0d01202620086a2113203e2106200f210203402002200a2006200a204d6a2903002006204d6a2903005422121b22082903003703002002204d6a2008204d6a2903003703002002204e6a2008204e6a2903003703002002204f6a2008204f6a2903003703002002203c6a2008203c6a29030037030020062006204b6a20121b21062002204b6a2102200a204b6a200a20121b220a20134f0d04200520064b0d000c040b0b200a21020c010b200f21020b203e21060b20022006200520066b22082008204b706b10ce031a2021202020146a3602002015205e36020020272027203c6a2025204473200e6a20487410cf031a2064215e206420454b0d0d0b205f0d060c010b200e215e205f0d060b0240205d450d00205c101d0b203b450d06203d101d410021020c110b4188bfc3002025200e104b000b4188bfc3002002200e104b000b205e2002102a000b20022007102b000b4101213a0c020b4101213a0c020b410021020c0a0b410121020c090b410121020c080b410021630c030b410121630c030b410021020c040b410221020c030b410321020c020b410321020c010b410321020c000b0b0b205f2060102a000b102e000b1021000b2018450d002017101d0b200141b0026a24000b980201027f230041306b220224000240024002404113101f2203450d002003410f6a410028008f9d40360000200341086a41002900889d40370000200341002900809d40370000200341134126101e2203450d0120032001360013200241206a41086a220142003703002002420037032020034117200241206a1001200241086a200129030037030020022002290320370300024002402002411041f8b3c200410041001002417f460d002002421037021420022002360210200241206a200241106a105e20022802202201450d0420002002290224370204200020013602000c010b20004100360208200042013702000b2003101d200241306a24000f0b411341011020000b412641011020000b41df88c0004133103a000bb20504027f017e017f037e230041206b220224000240024002404114101f2203450d00200341106a41002800d5ba40360000200341086a41002900cdba40370000200341002900c5ba40370000200341144134101e2203450d01200320012900003700142003412c6a200141186a290000370000200341246a200141106a2900003700002003411c6a200141086a29000037000042002104200241106a41086a220542003703002002420037031020034134200241106a1001200241086a2005290300370300200220022903103703000240024002402002411041f8b3c200410041001002417f460d00200242003703182002420037031020024110200241106a4110410010022205417f460d022005410f4d0d02200241186a2903002106200229031021042003101d4118101f2203450d010c050b420021062003101d4118101f22030d040b411841011020000b41df88c0004133103a000b411441011020000b413441011020000b200341106a41002900e9ba40370000200341086a41002900e1ba40370000200341002900d9ba403700000240200341184138101e2203450d0020032001290000370018200341306a200141186a290000370000200341286a200141106a290000370000200341206a200141086a29000037000042002107200241106a41086a220142003703002002420037031020034138200241106a1001200241086a2001290300370300200220022903103703000240024002402002411041f8b3c200410041001002417f460d00200242003703182002420037031020024110200241106a4110410010022201417f460d022001410f4d0d02200241186a2903002108200229031021070c010b420021080b2003101d2000200720047c22043703002000200820067c2004200754ad7c370308200241206a24000f0b41df88c0004133103a000b413841011020000bc60201037f230041206b2201240002400240024002404110101f2202450d00200241086a41002900a49b403700002002410029009c9b4037000020002802002103200241104120101e2202450d01200220033600102002412041c000101e2202450d02200220002900043700142002412c6a2000411c6a290000370000200241246a200041146a2900003700002002411c6a2000410c6a290000370000200141106a41086a220042003703002001420037031020024134200141106a1001200141086a2000290300370300200120012903103703004100210002402001411041f8b3c200410041001002417f460d00200141003a001020014110200141106a41014100100241016a41014d0d0420012d001021000b2002101d200141206a240020000f0b411041011020000b412041011020000b41c00041011020000b41df88c0004133103a000bec1004097f047e097f027e230041a0036b220524000240024002400240024002400240024002400240024002402004450d0020054190036a41086a22064200370300200542003703900341939dc000411d20054190036a1001200541f0026a41086a200629030037030020052005290390033703f002410021060240200541f0026a411041f8b3c200410041001002417f460d0020054180026a4200370300200541e8016a41106a4200370300200541e8016a41086a4200370300200542003703e801200541f0026a4110200541e8016a4120410010022206417f460d0b2006411f4d0d0b200541a0016a41186a200541e8016a41186a290300370300200541a0016a41106a200541e8016a41106a290300370300200541a0016a41086a200541e8016a41086a290300370300200520052903e8013703a001410121060b4128101f2207450d0b200720063a0004200741f8b3c200360200200720052903a001370005200720052f00e8013b00252007410d6a200541a8016a290300370000200741156a200541b0016a2903003700002007411d6a200541b8016a290300370000200741276a200541ea016a2d00003a0000200541a0016a200710ba0120052d00a001450d012004417f6a2108200541e8016a41206a2109200541a0016a4101722106200541e8016a41c0006a220a2002460d02200541e8016a41186a210b200541e8016a41106a210c200541c8026a210d4200210e4200210f42002110420021110340200b200f370300200c200e370300200520103703e801200520113703f0012009200641c10010ce0321040240200a2002412010d0030d00200541f0026a41186a2212200441186a2213290200370300200541f0026a41106a2214200441106a2215290200370300200541f0026a41086a2216200441086a2217290200370300200520042902003703f0024110101f2218450d07201841086a41002900a49b403700002018410029009c9b40370000201841104120101e2218450d0a201820013600102018412041c000101e2218450d0b201820052903f0023700142018412c6a2012290300370000201841246a20142903003700002018411c6a201629030037000020054190036a41086a2219420037030020054200370390032018413420054190036a1001200541d0026a41086a221a201929030037030020052005290390033703d002200541d0026a411041f8b3c20041004100100221192018101d2019417f470d00200d2c00002118200541d0026a41186a22192013290000370300200541d0026a41106a22132015290000370300201a2017290000370300200520042900003703d00220054190016a200541d0026a109a0120054190016a41086a290300211b200529039001211c20054180016a200541d0026a109a01200541d0006a20052903800120054180016a41086a2903002018200320182003411874411875481b2204ad423886423887420010d20320122019290300370300201420132903003703002016201a290300370300200520052903d0023703f002200541e0006a2001200541f0026a20042008109c01201b200f7c201c200e7c220f201c54ad7c200541e0006a41186a2903007c200f20052903707c220e200f54ad7c210f200541d0006a41086a29030020117c2005290350221c20107c2211201c54ad7c200541e0006a41086a2903007c201120052903607c2210201154ad7c21110b200541a0016a200710ba0120052d00a0010d000c040b0b4200210e4200210f42002110420021110c030b42002110420021114200210e4200210f0c010b200541c8026a21164200210e4200210f42002110420021110340200541e8016a41186a200f370300200541e8016a41106a200e370300200520103703e801200520113703f0012009200641c10010ce032118200541f0026a41186a2202200641186a290000370300200541f0026a41106a220a200641106a290000370300200541f0026a41086a220b200641086a290000370300200520062900003703f0024110101f2204450d03200441086a41002900a49b403700002004410029009c9b40370000200441104120101e2204450d04200420013600102004412041c000101e2204450d05200420052903f0023700142004412c6a2002290300370000200441246a200a2903003700002004411c6a200b29030037000020054190036a41086a220c420037030020054200370390032004413420054190036a1001200541d0026a41086a2212200c29030037030020052005290390033703d002200541d0026a411041f8b3c200410041001002210c2004101d0240200c417f470d0020162c00002104200541d0026a41186a220c201841186a290000370300200541d0026a41106a2214201841106a2900003703002012201841086a290000370300200520182900003703d002200541c0006a200541d0026a109a01200541c0006a41086a290300211b2005290340211c200541306a200541d0026a109a0120052005290330200541306a41086a2903002004200320042003411874411875481b2204ad423886423887420010d2032002200c290300370300200a2014290300370300200b2012290300370300200520052903d0023703f002200541106a2001200541f0026a20042008109c01201b200f7c201c200e7c220f201c54ad7c200541106a41186a2903007c200f20052903207c220e200f54ad7c210f200541086a29030020117c2005290300221c20107c2211201c54ad7c200541106a41086a2903007c201120052903107c2210201154ad7c21110b200541a0016a200710ba0120052d00a0010d000b0b2007101d0b2000200e37031020002010370300200041186a200f37030020002011370308200541a0036a24000f0b411041011020000b412041011020000b41c00041011020000b412041011020000b41c00041011020000b41df88c0004133103a000b412841041020000bbd1207017f017e087f047e017f037e067f23004180016b2203240042002104200341086a41086a2205420037030020034200370308418cb9c000410d200341086a1001200341d8006a41086a2005290300370300200320032903083703580240024002400240024002400240200341d8006a411041f8b3c200410041001002417f460d0020034200370308200341d8006a4110200341086a41084100100241016a41084d0d01200329030821040b200341086a41106a427f370300200341086a41286a41023a0000200341086a41186a2002370300200341286a20002900003703002003427f3703104201210220034201370308200341d8006a200110ea0120032802582106200328025c2107024002400240024002400240024020032802602208450d000240200341d8006a41186a22092000460d00200341f9006a210a200841286c210b420121022006210c0340200c41086a290300210d200c41106a290300210e200c41186a290300210f200c2903002110200341d8006a41206a200c41206a290300370300200341d8006a41186a200f370300200341d8006a41106a2211200e370300200341d8006a41086a200d370300200320103703580240024020092900002000290000510d002011290300220d2004580d010c050b2003290308210d4200210220034200370308200d4201510d060b200c41286a210c200b41586a220b0d000c020b0b200841286c210b200341086a41186a29030021122003290318211320032903102114200329030821022006210c0340200c41086a290300210d200c41106a290300210e200c41186a290300210f200c2903002110200341d8006a41206a200c41206a290300370300200341d8006a41186a200f370300200341d8006a41106a200e370300200341d8006a41086a200d370300200342003703082003201037035820024201510d03200c41286a210c42002102200b41586a220b0d000b0b4100210902402007450d002006101d0b4108210a4100211520024201510d050c0b0b2003200a2800003602502003200a41036a280000360053200c41286a210c200341e0006a290300210e200341f8006a2d0000210b200341f0006a290300210f200329035821100c030b200c41286a210c0c010b200341086a41186a29030021122003290318211320032903102114200c41286a210c0b200341e0006a2903002202201320142003290358220d54201320025420132002511b220b1b210e200d2014200b1b2110200341e8006a2903002202201220122002541b210d200341f8006a2d0000410272210b200341f0006a290300210f420021020b2003200328005336004b200320032802503602482003200328004b360043200320032802483602402003200328004336003b200320032802403602384128101f220a450d04200a2010370300200a200b3a0020200a200f370318200a200d370310200a2003280238360021200a200e370308200a41246a200328003b36000002400240200c2006200841286c6a2216460d002006200841286c6a2108200341d8006a41186a210b200341f9006a221741036a21184101210941012115034002400240024002400240200b2000460d000340200341d8006a41206a2219200c41206a290300370300200b200c41186a290300370300200341d8006a41106a2211200c41106a290300370300200341d8006a41086a221a200c41086a2903003703002003200c29030037035802400240200b2900002000290000510d002011290300220d2004580d010c040b2003290308210d4200210220034200370308200d4201510d040b2008200c41286a220c470d000c080b0b200341086a41186a290300210e2003290318210d2003290310210f200329030821020340200341d8006a41206a200c41206a290300370300200b200c41186a290300370300200341d8006a41106a200c41106a290300370300200341d8006a41086a200c41086a2903003703002003200c2903003703582003420037030820024201510d03420021022008200c41286a220c470d000c070b0b2003201728000036025020032018280000360053200c41286a210c201a290300211020192d00002111200b290300210e2003290358210f0c020b200341086a41186a290300210e2003290318210d2003290310210f0b200c41286a210c200341d8006a41086a2903002202200d200f2003290358221354200d200254200d2002511b22111b21102013200f20111b210f200341d8006a41106a2903002202200e200e2002541b210d200341d8006a41206a2d00004102722111200b290300210e420021020b2003200328005336004b200320032802503602482003200328004b36004320032003280248360240200341d8006a41206a221920113a0000200b200e370300200341d8006a41106a221a200d3703002017200328024036000020182003280043360000200320103703602003200f370358024020152009470d00200941016a22112009490d0620094101742215201120112015491b2215ad42287e220d422088a70d06200da722114100480d0602402009450d00200a200941286c2011101e220a0d010c080b2011101f220a450d070b200a200941286c6a22112003290358370300201141206a2019290300370300201141186a200b290300370300201141106a201a290300370300201141086a200341d8006a41086a290300370300200941016a2109200c2016470d000c020b0b41012109410121150b02402007450d002006101d0b20024201520d060b200341d8006a41206a2200200541206a290300370300200341d8006a41186a220b200541186a290300370300200341d8006a41106a2211200541106a290300370300200341d8006a41086a2208200541086a2903003703002003200529030037035820092015470d04200941016a220c2009490d0120094101742205200c200c2005491b2215ad42287e2202422088a70d012002a7220c4100480d01024002402009450d00200a200941286c200c101e220a450d010c060b200c101f220a0d050b200c41081020000b41df88c0004133103a000b1021000b201141081020000b412841081020000b200a200941286c6a220c2003290358370300200c41206a2000290300370300200c41186a200b290300370300200c41106a2011290300370300200c41086a2008290300370300200941016a21090b200320093602602003201536025c2003200a3602582001200341d8006a10f10120034180016a24000bc30201027f230041f0016b220224000240024002404112101f2203450d00200341106a41002f00eaa8413b0000200341086a41002900e2a841370000200341002900daa841370000200341124124101e2203450d012003200136001220024188016a41086a2201420037030020024200370388012003411620024188016a1001200241e8006a41086a2001290300370300200220022903880137036802400240200241e8006a411041f8b3c200410041001002417f460d002002421037027c2002200241e8006a36027820024188016a200241f8006a10e1022002290388014201520d04200241086a20024188016a41086a41e00010ce031a20004201370300200041086a200241086a41e00010ce031a0c010b200042003703000b2003101d200241f0016a24000f0b411241011020000b412441011020000b41df88c0004133103a000bc20502037f037e230041306b220424000240024002404114101f2205450d00200541106a41002800d5ba40360000200541086a41002900cdba40370000200541002900c5ba40370000200541144134101e2205450d01200520012900003700142005412c6a200141186a290000370000200541246a200141106a2900003700002005411c6a200141086a290000370000200441086a22064200370300200442003703002005413420041001200441206a41086a200629030037030020042004290300370320024002400240200441206a411041f8b3c200410041001002417f460d002004420037030820044200370300200441206a411020044110410010022206417f460d022006410f4d0d02200441086a2903002107200429030021080c010b42002108420021070b2005101d20042001200820027c2202200720037c2002200854ad7c10ec01200441106a290300210820042903082102024002400240024020042903004200510d0042002109200441086a220542003703002004420037030041aeb9c000411620041001200441206a41086a2201200529030037030020042004290300370320200441206a411041f8b3c200410041001002417f460d012004420037030820044200370300200441206a411020044110410010022206417f460d072006410f4d0d07200441086a2903002103200429030021070c020b200221090c020b42002107420021030b200542003703002004420037030041aeb9c000411620041001200120052903003703002004200429030037032020044200200320087d2007200254ad7d2208200720027d2202200756200820035620082003511b22051b37030820044200200220051b370300200441206a4110200441101003420021080b2000200937030020002008370308200441306a24000f0b41df88c0004133103a000b411441011020000b413441011020000b41df88c0004133103a000b7e01017f230041c0006b220124002001412e36020c2001419d96c000360208200120003602142001413c6a411b3602002001412c6a4102360200200141183602342001420237021c200141b8b1c4003602182001200141146a3602382001200141086a3602302001200141306a360228200141186a41c8b1c40010cf01000bb60504027f017e0e7f017e230041d0006b22022400200241086a200110d5010240024002400240024002400240024002402002280208450d00200228020c2203ad42287e2204422088a70d032004a72205417f4c0d032005450d012005101f2206450d042003450d020c050b20004100360200200241d0006a24000f0b4108210620030d030b4100210e4100210d0c030b102e000b200541081020000b200141046a2107200241306a41186a2108200241306a41106a21094100210a4100210b4100210c2003210d0240034020024200370330200141086a2205410020012802002007280200200241306a410820052802001002220e200e417f461b220e4108200e4108491b20052802006a220f360200200e41074d0d01200229033021042008420037030020094200370300200241306a41086a22104200370300200242003703302005410020012802002007280200200241306a4120200f1002220e200e417f461b220e4120200e4120491b20052802006a360200200e411f4d0d01200c41016a210e200241106a41186a220f2008290300370300200241106a41106a22112009290300370300200241106a41086a22122010290300370300200220022903303703100240200c200d470d00200a200e200e200a491b220dad42287e2213422088a70d042013a722054100480d040240200c450d002006200b2005101e22060d010c060b2005101f2206450d050b2006200b6a22052004370300200541206a200f290300370300200541186a2011290300370300200541106a2012290300370300200541086a2002290310370300200a41026a210a200b41286a210b200e210c200e2003490d000c020b0b200041003602000240200d450d002006101d0b200241d0006a24000f0b2000200d36020420002006360200200041086a200e360200200241d0006a24000f0b1021000b200541081020000ba20403057f017e037f230041106b2202240020024100360208200242013703002000280200210320022000280208220036020c2002410c6a200210620240024002400240024002402000450d002003200041286c6a2104200241086a22052802002100200228020421060340200329030021070240024002400240200620006b41084f0d00200041086a22082000490d0620064101742209200820082009491b220a4100480d062006450d0120022802002006200a101e22090d020c070b200041086a2108200228020021090c020b200a101f2209450d050b2002200a36020420022009360200200a21060b20052008360200200920006a20073700000240024002400240200620086b41204f0d00200841206a22002008490d062006410174220a20002000200a491b220a4100480d062006450d0120092006200a101e22090d020c080b200841206a21000c020b200a101f2209450d060b2002200a36020420022009360200200a21060b20052000360200200920086a220841086a200341106a290000370000200841106a200341186a290000370000200841186a200341206a2900003700002008200341086a290000370000200341286a22032004470d000b200128020020012802042009200010032006450d050c040b200228020421032001280200200128020420022802002209200241086a280200100320030d030c040b1021000b200a41011020000b200a41011020000b2009101d0b200241106a24000ba77f05057f057e057f017e097f230041d0096b22022400200241003a00f00820012802002001280204200241f0086a410120012802081002210320012001280208200341016a41014b22036a2204360208024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402003450d0020022d00f0082203410e4b0d07024020030e0f000b0709040c0e0a10060f03050d02000b200241003a00f0082001280200200141046a280200200241f0086a4101200410022103200141086a22042004280200200341016a41014b22036a3602002003450dc10120022d00f008450d130cc1010b2000410f360200200241d0096a24000f0b200241003a00f0082001280200200141046a280200200241f0086a4101200410022103200141086a22042004280200200341016a41014b22036a3602002003450d1420022d00f00822034101460d1320030d14200241f0086a200110a30120022802f008210320024190086a200241f0086a41047241dc0010ce031a2003410f460d14200241b0076a20024190086a41dc0010ce031a41e000101f2201450d9d0120012003360200200141046a200241b0076a41dc0010ce031a20014108762104410121030c250b200241003a00f0082001280200200141046a280200200241f0086a4101200410022103200141086a22042004280200200341016a41014b22036a3602002003450dbd0120022d00f008450d0f0cbd010b200241003a00f008410421032001280200200141046a280200200241f0086a4101200410022104200141086a22052005280200200441016a41014b22046a22053602002004450d1c20022d00f00822044102460d1b20044101460d1a20040d1c20024188096a420037030020024180096a4200370300200241f0086a41086a4200370300200242003703f00841042103200141086a220441002001280200200141046a280200200241f0086a41202005100222012001417f461b2201412020014120491b20042802006a3602002001411f4d0d1c200241e0066a41086a2201200241f0086a411f6a2d00003a0000200220022f00f1083b01980720022002290087093703e00620022d00f008210520022800f308210620022900ff08210720022900f7082108200241a0076a41086a220320012d00003a0000200220022f01980722013b019407200220022903e0063703a00720024190086a41086a20032d00003a0000200220013b018807200220022903a007370390082008422088a721012008a72104410121030c1e0b200241003a00f0082001280200200141046a280200200241f0086a4101200410022103200141086a22042004280200200341016a41014b22036a3602002003450d2920022d00f008220341044b0d29024020030e050027252624000b200241e8046a200110ca0220022903e804a7450d29200241f8046a290300210720022903f0042108200241f0086a200110bb0220022d00f00822034102460d292002418c096a2902002109200241fc086a290200210a20022f00f108210120022d00f308210420022902f408210b200220024184096a2902003703a0082002200a370398082002200b3703900820012004411074722101410121040c280b200241003a00f0082001280200200141046a280200200241f0086a4101200410022103200141086a22042004280200200341016a41014b22036a22043602002003450d1220022d00f00822054101460d114103210320050d13200241c0046a200110d50120022802c004450d1320022802c4042104200241f0086a200110a30120022802f008210520024190086a200241f0086a41047241dc0010ce031a2005410f460d13200241b0076a20024190086a41dc0010ce031a41e000101f2201450d9d0120012005360200200141046a200241b0076a41dc0010ce031a410121030c140b200241003a00f0082001280200200141046a280200200241f0086a4101200410022103200141086a22012001280200200341016a41014b6a3602002000410f360200200241d0096a24000f0b2000410f360200200241d0096a24000f0b200241003a00f0082001280200200141046a280200200241f0086a4101200410022103200141086a22042004280200200341016a41014b22036a3602002003450d1420022d00f00822034101460d1220030d14200241f0086a200110bb0220022d00f00822034102460d1420022d00f308210c20022f00f108210d2002418c096a290200210720024188096a280200210420024184096a2802002105200241f0086a41106a2802002106200241fc086a280200210e20022902f4082108200241d8006a200110ca022002280258450d14200d200c411074722101200241d8006a41106a29030021094101210c2002290360210a0c130b200241003a00f0082001280200200141046a280200200241f0086a4101200410022103200141086a22042004280200200341016a41014b22036a3602002003450d6620022d00f008220341094b0d66024020030e0a00363334313839353b32000b200241f0086a200110920220022802f0082203450d6620022902f4082107200241a0036a200110d5012007a7210420022802a003450d6520022802a403210c200441087621012003410876210f20074220882107410121100c360b200241003a00f0082001280200200141046a280200200241f0086a4101200410022103200141086a22042004280200200341016a41014b22036a22043602002003450d880120022d00f008220541064b0d880141022106024020050e0700b5012b2c2a2d2e000b200241186a200110d5012002280218450d8801200228021c2204417f4c0d8e012004450d6e200410792203450d9a01200141086a2205200441002001280200200141046a280200200320042005280200100222012001417f461b2201200120044b1b220120052802006a36020020012004470d6f0cb3010b200241003a00f008410421052001280200200141046a280200200241f0086a4101200410022103200141086a22042004280200200341016a41014b22036a22063602002003450d820120022d00f008220d410e4b0d82010240200d0e0f005354810150585b565d525e4f51594e000b200241f0086a200110bb0220022d00f00822044102460d820120022d00f308210620022f00f108210d2002418c096a290200210720024188096a280200210e20024184096a2802002103200241f0086a41106a350200210b200241fc086a350200211120022902f4082108200241b0016a200110ca0220022903b001a7450d8201200241b0016a41106a290300210a20022903b8012109200241003a00f0082001280200200141046a280200200241f0086a4101200141086a22012802001002210520012001280200200541016a41014b22056a3602002005450d820120022d00f008220c41024b0d8201200d200641107472210f200b422086201184210b410121050c80010b200241003a00f0082001280200200141046a280200200241f0086a4101200410022103200141086a22042004280200200341016a41014b22036a3602002003450d034105210320022d00f008220441034b0dae01024020040e0400191718000b200241f0086a200110a403200241a0076a41086a220120024190096a28020036020020024190086a41086a2204200241a8096a29030037030020024190086a41106a2205200241b0096a290300370300200220024188096a2903003703a0072002200241a0096a29030037039008200241c0096a290300210a200241b8096a29030021082002419c096a280200210e20024198096a280200210620024194096a280200210c200241f0086a41106a290300210720022903f808210920022903f0084201520d2c20024188076a41086a2001280200360200200241b0076a41086a2004290300370300200241b0076a41106a2005290300370300200220022903a0073703880720022002290390083703b007410121030caf010b200241003a00f0082001280200200141046a280200200241f0086a4101200410022103200141086a22042004280200200341016a41014b22036a220d3602002003450d5e20022d00f008220f410b4b0d5e410921030240200f0e0c004445424748464ba301434a41000b200241f0086a200110a30120022802f008210320024190086a200241f0086a41047241dc0010ce031a2003410f460d5e200241b0076a20024190086a41dc0010ce031a41e000101f2204450d9b0120042003360200200441046a200241b0076a41dc0010ce031a200241d0026a200110ca0220022903d002a7450d5d200241e0026a290300210720022903d8022208422088a7210e2008a7210c410121030c600b200241003a00f0082001280200200141046a280200200241f0086a4101200410022103200141086a22042004280200200341016a41014b22036a3602002003450dae0120022d00f008450d050cae010b200241003a00f0082001280200200141046a280200200241f0086a4101200410022103200141086a22042004280200200341016a41014b22036a22043602002003450d014106210320022d00f008220541044b0da801024020050e050024212220000b200241f0086a200110a30120022802f008210120024190086a200241f0086a41047241dc0010ce031a2001410f460da801200241b0076a20024190086a41dc0010ce031a41e000101f2204450d940120042001360200200441046a200241b0076a41dc0010ce031a410121030caa010b410521030caa010b410621030ca6010b200241e0046a200110d50120022802e004450dad0120022802e4042203417f4c0d86012003450d35200310792204450d8e01200141086a2205200341002001280200200141046a280200200420032005280200100222012001417f461b2201200120034b1b220120052802006a36020020012003470d360ca4010b200241086a200110f1022002290308a7450dad012002290310210720004100360200200041086a2007370300200241d0096a24000f0b200241d0046a200110f10220022903d004a7450da80120022903d80421072000410a360200200041086a2007370300200241d0096a24000f0b200241f0086a200110bb024102210320022d00f00822014102470d100b2000410f360200200241d0096a24000f0b20024188096a420037030020024180096a4200370300200241f0086a41086a4200370300200242003703f008200141086a220541002001280200200141046a280200200241f0086a41202004100222032003417f461b2203412020034120491b20052802006a3602002003411f4d0d00200241a0076a41086a2203200241f0086a411f6a2d00003a0000200220022f00f1083b01940720022002290087093703a00720022d00f008210520022800f308210420022900ff08210720022900f7082108200241b0076a41086a20032d00003a0000200220022f0194073b019c07200220022903a0073703b007200241c8046a200110d5014103210320022802c804450d0120022802cc042106200241003a00f0082001280200200141046a280200200241f0086a4101200141086a22012802001002210e20012001280200200e41016a41014b220e6a360200200e450d012008422088a7210e2008a7210120022d00f008210c20024188076a41086a200241b0076a41086a2d00003a0000200220022f019c073b018407200220022903b00737038807410221030c020b410321030b0b200241f0086a41086a220d20024188076a41086a2d00003a0000200220022f0184073b01e00620022002290388073703f008200220022f01de063b01ac07024020034103470d002000410f360200200241d0096a24000f0b200241f8066a41086a220f200d2d00003a0000200220022f01e0063b01dc06200220022903f0083703f806200220022f01ac073b01da06200020053a0005200020033a000420004109360200200041146a2007370200200041106a200e3602002000410c6a2001360200200041086a20043602002000200c3a0025200041286a2006360200200020022f01dc063b00062000411c6a20022903f806370200200041246a200f2d00003a0000200020022f01da063b0126200241d0096a24000f0b200241f0086a200110bb0220022d00f00822034102460d0120022d00f308210c20022f00f108210d2002418c096a290200210720024188096a280200210420024184096a2802002105200241f0086a41106a2802002106200241fc086a280200210e20022902f408210820024188016a200110ca02200229038801a7450d0120024188016a41106a2903002109200229039001210a200241f0006a200110ca022002290370a7450d01200d200c41107472210120024180016a29030021112002290378210b4102210c0b200020013b000d200041033602002000410f6a20014110763a0000200041c8006a2011370200200041c0006a200b370200200041386a2009370200200041306a200a370200200041286a2007370000200041246a2004360000200041206a20053600002000411c6a2006360000200041186a200e360000200041106a20083700002000410c6a20033a0000200041086a200c360200200241d0096a24000f0b2000410f360200200241d0096a24000f0b200241a0016a200110f10220022903a001a7450d0120022903a8012207422088a721012007a72104410221030c020b200241003a00f008410421032001280200200141046a280200200241f0086a4101200510022104200141086a22012001280200200441016a41014b22016a3602002001450d0020022d00f0082105410321030c020b0b0b200241f0086a41086a220e20024190086a41086a2d00003a0000200220022f0188073b01e00620022002290390083703f008200220022f01f8063b01ac07024020034104470d002000410f360200200241d0096a24000f0b200241b0076a41086a220c200e2d00003a0000200220022f01e0063b019c07200220022903f0083703b007200220022f01ac073b018407200020053a0009200041086a20033a000020004104360200200041186a2007370200200041146a2001360200200041106a20043602002000410c6a2006360200200020022f019c073b000a200041206a20022903b007370000200041286a200c2d00003a0000200020022f0184073b012a200241d0096a24000f0b200241f0086a200110bb0220024190086a41086a22042002418c096a280200360200200220024184096a2902003703900820022d00f00822054102460d970120022d00f308210d20022f00f108210f20024190096a280200210c200241fc086a290200210720022902f4082109200241a0076a41086a200428020036020020022002290390083703a00720024190066a200110ca0241052103200229039006a7450d7220024190066a41106a290300210a200229039806210b20024180066a200110f102200229038006a7450d722002290388062108200241f8056a200110d50120022802f805450d7220022802fc05220e417f4c0d75200e450d70200e10792206450d8701200141086a2204200e41002001280200200141046a2802002006200e2004280200100222012001417f461b22012001200e4b1b220120042802006a3602002001200e470d710c90010b200241c0066a200110ca0220022903c006a7450d9601200241d0066a290300210820022903c806210a200241b0066a200110f10220022903b006a7450d960120022903b806210b20024188096a4200370300200241f0086a41106a4200370300200241f0086a41086a4200370300200242003703f00841002106200141086a220341002001280200200141046a280200200241f0086a41202003280200100222042004417f461b2204412020044120491b20032802006a3602002004411f4d0d4c2002419e076a20022d00f2083a000020024190086a41086a200241f0086a411f6a2d00003a0000200220022f01f0083b019c0720022002290087093703900820022f01f40820022d00f60841107472210420022d00f308210520022900f708210920022900ff082107410121060c4d0b200241e8056a200110f10220022903e805a7450d950120022903f0052107200241e0056a200110d50120022802e005450d950120022802e4052206417f4c0d732006450d51200610792205450d8001200141086a2204200641002001280200200141046a280200200520062004280200100222012001417f461b2201200120064b1b220120042802006a36020020012006470d520c8d010b20022f00f10820022d00f308411074722104200241fc086a2802002105200241f0086a41106a280200210620024184096a280200210e20024188096a280200210c2002418c096a290200210820022902f40821070b200020033602042000410e360200200041246a2008370200200041206a200c3602002000411c6a200e360200200041186a2006360200200041146a20053602002000410c6a2007370200200041086a2004410874200141ff017172360200200241d0096a24000f0b200241d8056a200110d50120022802d805450d0520022802dc0522034108762101410521040c030b200241c8056a200110d50120022802c805450d0420022802cc052103200241b0056a200110ca0220022903b005a7450d04200241c0056a290300210720022903b8052108200241a0056a200110f10220022903a005a7450d0420022903a805210920024198056a200110d501200228029805450d04200228029c052101200241a0086a20073703002002200837039808200220013602900820034108762101410321040c030b200241d0056a200110d50120022802d005450d0320022802d40522034108762101410421040c010b20024180056a200110ca02200229038005a7450d0220024190056a29030021072002200229038805370390082002200737039808410221040b0b200241f0086a41106a20024190086a41106a290300220a370300200241f0086a41086a20024190086a41086a290300220b370300200241b0076a41086a2205200b370300200241b0076a41106a2206200a3703002002200229039008220a3703b0072002200a3703f008200041386a2007370200200041306a20083702002000410c6a2001410874200341ff017172360200200041086a20043602002000410c360200200041286a2009370200200041106a20022903b007370200200041186a2005290300370200200041206a2006290300370200200241d0096a24000f0b200241f0086a41106a20024190086a41106a290300370300200241f0086a41086a20024190086a41086a29030037030020022002290390083703f0082000410f360200200241d0096a24000f0b200241b0046a200110f10220022903b004a7450d880120022903b8042207422088a721012007a72105410521030c020b20024188096a420037030020024180096a4200370300200241f0086a41086a4200370300200242003703f00841002105200141086a220641002001280200200141046a280200200241f0086a41202004100222012001417f461b2201412020014120491b20062802006a3602002001411f4d0d19200241e0066a41086a2201200241f0086a411f6a2d00003a0000200220022f00f1083b01980720022002290087093703e00620022d00f008210620022800f308210420022900ff08210720022900f7082108200241b0076a41086a20012d00003a0000200220022f0198073b019c07200220022903e0063703b0072008422088a721012008a721054101210e0c1a0b200241a0046a200110f10220022903a004a7450d860120022903a8042207422088a721012007a72105410421030b0c86010b20024188096a420037030020024180096a4200370300200241f0086a41086a4200370300200242003703f00841002105200141086a220641002001280200200141046a280200200241f0086a41202004100222042004417f461b2204412020044120491b20062802006a220e3602002004411f4d0d18200241e0066a41086a2205200241f0086a411f6a2d00003a0000200220022f00f1083b01980720022002290087093703e00620022d00f008210620022800f308210420022900f708210820022900ff08210720024190086a41086a20052d00003a0000200220022f0198073b01ac07200220022903e00637039008410121050c190b200241286a200110d5012002280228450d5e200228022c2204417f4c0d642004450d3e200410792203450d72200141086a2205200441002001280200200141046a280200200320042005280200100222012001417f461b2201200120044b1b220120052802006a36020020012004470d3f0c7d0b200241206a200110d5012002280220450d5d20022802242204417f4c0d632004450d3f200410792203450d72200141086a2205200441002001280200200141046a280200200320042005280200100222012001417f461b2201200120044b1b220120052802006a36020020012004470d400c7b0b200242003703f00841042106200141086a220341002001280200200141046a280200200241f0086a41082004100222012001417f461b2201410820014108491b20032802006a360200200141074d0d5c20022903f00821070c88010b200241c0006a200110d5012002280240450d5b20022802442213ad42187e2207422088a70d612007a72204417f4c0d612004450d432004101f22030d44200441041020000b200241d0006a200110d5012002280250450d5a20022802542212ad420c7e2207422088a70d602007a72204417f4c0d602004450d442004101f22030d45200441041020000b0c82010b200241d0036a200110d50120022802d003450d3520022802d4032203410876210f42002107410521100c080b20024190046a200110f102200229039004a7450d34200229039804220842208821072008a722044108762101410a21100c090b200241c0036a200110d50120022802c003450d3320022802c4032103200241f0086a200110bb0220022d00f00822044102460d3320022d00f308210c20022f00f108210f2002418c096a290200210820024184096a2802002105200241f0086a41106a2802002106200241fc086a280200210e20022902f4082107200220024188096a280200360290082002200837029408200241b8036a200110d50120022802b803450d3320022802bc03210d200241b0036a200110d50120022802b003450d33200f200c4110747221012007422088a7210c2008422088a721122003410876210f200229039008210820022802b403ad21094200210a410321100c0a0b200241c8036a200110d50120022802c803450d3220022802cc032203410876210f42002107410421100c050b200241f0086a200110bb0220022d00f00822034102460d3120022902f40822084220882107410821102008a72204410876210120022f00f10820022d00f30841107472210f200241fc086a280200210c200241f0086a41106a280200210e20024184096a280200210620024188096a28020021052002418c096a29020021080c080b200241f0086a200110920220022802f0082203450d3020022902f4082107200241a8036a200110d5012007a7210420022802a803450d2f20022802ac03210c200441087621012003410876210f20074220882107410221100b0c050b200241f0086a200110bb0220022d00f00822034102460d2e20022d00f308210420022f00f108210d2002418c096a290200210820024188096a280200210520024184096a2802002106200241f0086a41106a280200210e200241fc086a280200210c20022902f408210b200241e0036a200110ca0220022903e003a7450d2e200241e0036a41106a290300210a20022903e8032109200241d8036a200110d50120022802d803450d2e200d200441107472210f20022802dc032112200b4220882107200ba722044108762101410621100c050b200241f8036a200110d50120022802f803450d2d20022802fc032203410876210f42002107410721100b0c020b20024180046a200110f102200229038004a7450d2b200229038804220842208821072008a722044108762101410921100b0b0b20004107360200200041c0006a200a370200200041386a2009370200200041346a200d360200200041306a2012360200200041286a2008370200200041246a2005360200200041206a20063602002000411c6a200e360200200041186a200c360200200041086a20103602002000410c6a200f410874200341ff017172360200200041106a20074220862001ad42ffffff07834208862004ad42ff01838484370200200241d0096a24000f0b410121042001280200200141046a28020041014100200141086a28020010021a41002003460d6e0b2003450d762004101d0c760b410021014100210e0b200241a0076a41086a220c200241b0076a41086a2d00003a0000200220022f019c073b019407200220022903b0073703a0070240200e450d0020024190086a41086a2203200c2d00003a0000200220022f019407220e3b01ac07200220022903a0073703900820024188076a41086a20032d00003a00002002200e3b018407200220022903900837038807410321030b0c6e0b0b200241a0076a41086a220c20024190086a41086a2d00003a0000200220022f01ac073b01940720022002290390083703a00702402005450d00200241b0076a41086a200c2d00003a0000200220022f0194073b019c07200220022903a0073703b007200241003a00f0082001280200200141046a280200200241f0086a4101200e10022105200141086a22012001280200200541016a41014b22016a3602002001450d0020022d00f008210e20024188076a41086a200241b0076a41086a2d00003a0000200220022f019c073b018407200220022903b007370388072008422088a721012008a72105410221030c6d0b0c6c0b410c21030c1e0b200241f8026a200110d501410d210320022802f802450d1d20022802fc022104200241003a00f0082001280200200141046a280200200241f0086a4101200141086a22012802001002210520012001280200200541016a41014b22056a3602002005450d1d20022d00f0082105410421030c600b20024188096a420037030020024180096a4200370300200241f0086a41086a4200370300200242003703f008200141086a220341002001280200200141046a280200200241f0086a4120200d100222012001417f461b2201412020014120491b20032802006a3602002001411f4d0d1b200241e0066a41086a2201200241f0086a411f6a2d00003a0000200220022f00f1083b01980720022002290087093703e00620022d00f008210520022800f308210420022900ff08210720022900f7082108200241a0076a41086a220320012d00003a0000200220022f01980722013b019407200220022903e0063703a00720024190086a41086a220620032d00003a0000200220013b01ac07200220022903a00737039008200241b0076a41086a220320062d00003a0000200220013b019c0720022002290390083703b00720024188076a41086a20032d00003a0000200220013b018407200220022903b007370388072008422088a7210e2008a7210c410a21030c5f0b200241e8026a200110d5014102410d20022802e8021b210320022802ec0221040c040b200241f0026a200110d501410d210320022802f002450d1a20022802f4022104200241003a00f0082001280200200141046a280200200241f0086a4101200141086a22012802001002210520012001280200200541016a41014b22056a3602002005450d1a20022d00f0082105410321030c5d0b20024190036a200110f102410d2103200229039003a7450d19200229039803210720024188036a200110d501200228028803450d19200228028c0321042007422088a7210e2007a7210c410721030c1a0b200241f0086a200110a30120022802f008210320024190086a200241f0086a41047241dc0010ce031a2003410f460d17200241b0076a20024190086a41dc0010ce031a41e000101f2204450d5520042003360200200441046a200241b0076a41dc0010ce031a200241003a00f0082001280200200141046a280200200241f0086a4101200141086a22032802001002210520032003280200200541016a41014b22056a22063602002005450d1620022d00f008220541024b0d16200242003703f008200141086a220341002001280200200141046a280200200241f0086a41082006100222012001417f461b2201410820014108491b20032802006a360200200141074d0d1620022903f0082207422088a7210e2007a7210c410521030c5b0b20024180036a200110d5014106410d2002280280031b210320022802840321040b0c170b20024188096a420037030020024180096a4200370300200241f0086a41086a4200370300200242003703f008200141086a220641002001280200200141046a220e280200200241f0086a4120200d100222032003417f461b2203412020034120491b20062802006a220c3602002003411f4d0d14200241e0066a41086a2203200241f0086a411f6a2d00003a0000200220022f00f1083b01980720022002290087093703e00620022d00f008210520022800f308210420022900f708210820022900ff082107200241a0076a41086a220d20032d00003a0000200220022f01980722033b019407200220022903e0063703a007200241b0076a41086a220f200d2d00003a0000200220033b019c07200220022903a0073703b00720024190086a41086a200f2d00003a0000200220033b01ac07200220022903b00737039008200241003a00f0082001280200200e280200200241f0086a4101200c1002210120062006280200200141016a41014b22016a3602002001450d2b20022d00f008210620024188076a41086a20024190086a41086a2d00003a0000200220022f01ac073b0184072002200229039008370388072008422088a7210e2008a7210c410b21030c580b20024188096a420037030020024180096a420037030041082103200241f0086a41086a4200370300200242003703f008200141086a220441002001280200200141046a280200200241f0086a4120200d100222012001417f461b2201412020014120491b20042802006a3602002001411f4d0d13200241e0066a41086a2201200241f0086a411f6a2d00003a0000200220022f00f1083b01980720022002290087093703e00620022d00f008210520022800f308210420022900ff08210720022900f7082108200241a0076a41086a220620012d00003a0000200220022f01980722013b019407200220022903e0063703a00720024188076a41086a20062d00003a0000200220013b018407200220022903a007370388072008422088a7210e2008a7210c0c570b200241f0086a2001105e20022802f0082204450d342004410876210f20022902f4082108410f21050c2e0b200241c0026a200110d50120022802c002450d3320022802c4022204410876210f410c21050c0a0b20024190026a200110d501200228029002450d322002280294022103200241f8016a200110ca0220022903f801a7450d3220024188026a290300210b2002290380022108410521050c2f0b200241003a00f0082001280200200141046a280200200241f0086a4101200610022103200141086a22012001280200200341016a41014b22016a3602002001450d3120022d00f008210c410d21050c050b200241a0026a200110f10220022802a002450d30410a210520022903a80221080c0c0b200241c8016a200110ca0220022903c801a7450d2f200241d8016a290300210b20022903d0012108410221050c010b200241e0016a200110ca0220022903e001a7450d2e200241f0016a290300210b20022903e8012108410321050b0c290b200241003a00f0082001280200200141046a280200200241f0086a410120061002210341082105200141086a22012001280200200341016a41014b22016a3602002001450d2c20022d00f008220c41034f0d2c0b0c290b20024198026a200110d501200228029802450d2a200228029c022214ad42247e2207422088a70d352007a72203417f4c0d352003450d222003101f22040d23200341041020000b200241c8026a200110d50120022802c802450d2920022802cc022204410876210f410e21050b0c010b410721050b0c220b200241f0086a200110bb0220022d00f00822044102460d2520022f00f10820022d00f30841107472210f200241fc086a290200210b20024184096a280200210320024188096a280200210e2002418c096a290200210720022902f4082108410921050c220b200241b0026a200110f10220022802b002450d24410b210520022903b80221080b0c1e0b2004103c2004101d0b410d21030b0b0c410b2004450d002003101d0b2000410f360200200241d0096a24000f0b0b200241ac076a41026a22032002419c076a41026a2d00003a0000200241f0086a41086a220e20024190086a41086a2d00003a0000200220022f019c073b01ac0720022002290390083703f00802402006450d0020024198076a41026a20032d00003a0000200241a0076a41086a200e2d00003a0000200220022f01ac073b019807200220022903f0083703a007200241a8066a200110d5014105210320022802a806450d3b20022802ac062206417f4c0d272006450d2520061079220c450d3a200141086a220e200641002001280200200141046a280200200c2006200e280200100222012001417f461b2201200120064b1b2201200e2802006a36020020012006470d260c3c0b410521030c3a0b410121032001280200200141046a28020041014100200141086a28020010021a41002004460d3e0b20040d1d0c1e0b410121032001280200200141046a28020041014100200141086a28020010021a41002004460d3b0b20040d1b0c1c0b410121052001280200200141046a28020041014100200141086a28020010021a41002006460d3b0b2006450d422005101d0c420b410121032001280200200141046a28020041014100200141086a28020010021a41002004460d440b20040d170c180b410421030b2013450d0242002107200141086a210c200141046a21154100210f410021044100210e201321160340200241386a200110d5012002280238450d15200228023c2206417f4c0d1d024002402006450d00200610792210450d28200c200641002001280200201528020020102006200c280200100222052005417f461b2205200520064b1b2205200c2802006a36020020052006460d010c160b410121102001280200201528020041014100200c28020010021a41002006470d150b200241306a200110d5012002280230450d1420022802342205417f4c0d1d024002402005450d00200510792212450d26200c200541002001280200201528020020122005200c2802001002220d200d417f461b220d200d20054b1b220d200c2802006a360200200d2005460d010c150b410121122001280200201528020041014100200c28020010021a41002005470d140b200e41016a210d0240200e2016470d00200f200d200d200f491b2216ad42187e2208422088a70d1f2008a722144100480d1f0240200e450d00200320042014101e22030d010c240b2014101f2203450d230b200320046a220e2010360200200e41146a2005360200200e41106a2005360200200e410c6a2012360200200e41046a2006ad220842208620088437020020074280808080107c2107200f41026a210f200441186a2104200d210e200d2013490d000c040b0b410421030b2012450d0242002107200141086a210f200141046a21154100210c410021054100210e201221100340200241c8006a200110d5012002280248450d07200228024c2204417f4c0d1b024002402004450d0020041079220d450d1f200f2004410020012802002015280200200d2004200f280200100222062006417f461b2206200620044b1b2206200f2802006a36020020062004460d010c080b4101210d2001280200201528020041014100200f28020010021a41002004470d070b200e41016a21060240200e2010470d00200c20062006200c491b2210ad420c7e2208422088a70d1d2008a722164100480d1d0240200e450d00200320052016101e22030d010c200b2016101f2203450d1f0b200320056a220e200d360200200e41046a2004ad220842208620088437020020074280808080107c2107200c41026a210c2005410c6a21052006210e20062012490d000c040b0b41002116420021070b2003450d1220072016ad842107410621060c3e0b41002110420021070b2003450d1020072010ad842107410721060c3c0b410d21030c2c0b2004450d00200d101d0b0240200e450d002003210103400240200141046a280200450d002001280200101d0b2001410c6a2101200541746a22050d000b0b20100d0c0c0d0b410421040b024002402014450d004200210720024188096a211720024184096a2118200241fc086a21194100210e411c210641002103201421130340200241f0086a200110bb0220022d00f008220c4102460d08200341016a210520022d00f308210d20022f00f108210f2002418c096a29020021082017280200211020182802002112200241f0086a41106a28020021152019280200211620022902f4082109024020032013470d00200e20052005200e491b2213ad42247e220a422088a70d16200aa7221a4100480d1602402003450d002004200641646a201a101e22040d010c1a0b201a101f2204450d190b200420066a22032008370000200341676a200f200d41107472220d4110763a0000200341656a200d3b00002003417c6a2010360000200341786a2012360000200341746a2015360000200341706a2016360000200341686a2009370000200341646a200c3a000020074280808080107c2107200e41026a210e200641246a21062005210320052014490d000c020b0b41002113420021070b2004450d0620072013ad8421082004410876210f410621050b0b0b0b0b200220022f01b00722013b01f008200220013b01e006200041386a200a370000200041306a2009370000200041186a200b370000200041106a20083700002000200c3a0009200041086a20053a000020004105360200200041286a2007370000200041246a200e360000200041206a20033600002000410c6a200f410874200441ff017172360000200020022f01e0063b000a200241d0096a24000f0b2013450d002004101d0b200220022f01b0073b01f0082000410f360200200241d0096a24000f0b2005450d002012101d0b2006450d002010101d0b0240200e450d002003210103400240200141046a280200450d002001280200101d0b0240200141106a280200450d002001410c6a280200101d0b200141186a2101200441686a22040d000b0b2016450d010b2003101d0b2000410f360200200241d0096a24000f0b410121062001280200200141046a28020041014100200141086a28020010021a4100200e460d1f0b200e450d002006101d0b0c1e0b4101210c2001280200200141046a28020041014100200141086a28020010021a41002006460d160b2006450d14200c101d0c140b102e000b1021000b200441011020000b201641041020000b201a41041020000b201441041020000b41e00041081020000b200541011020000b200341011020000b200641011020000b41e00041081020000b41e00041081020000b200441011020000b200641011020000b200441011020000b200441011020000b41e00041081020000b41e00041081020000b200e41011020000b200641011020000b0c010b20024194076a41026a20024198076a41026a2d00003a000020024188076a41086a200241a0076a41086a2d00003a00002002200a3703b007200220022f0198073b019407200220022903a007370388072002200b3703c007200220083703b807410421032006210e0b0c060b200241f0086a41086a220120024188076a41086a2d00003a0000200220022f0184073b01e00620022002290388073703f008200220022f01de063b01ac0702402003410d470d002000410f360200200241d0096a24000f0b200241f8066a41086a220d20012d00003a0000200220022f01e0063b01dc06200220022903f0083703f806200220022f01ac073b01da06200020053a0009200041086a20033a000020004106360200200041186a2007370200200041146a200e360200200041106a200c3602002000410c6a2004360200200020063a0029200020022f01dc063b000a200041206a20022903f806370200200041286a200d2d00003a0000200020022f01da063b012a200241d0096a24000f0b2004ad22074220862007842107410321060c0d0b2004ad22074220862007842107410521060c0c0b200541087621042006ad22084220862008842109410221030c080b200241c0076a200a37030020024188076a41086a200241a0076a41086a2802003602002002200b3703b807200220022903a007370388072002200e3602b007410321030b200f200d4110747221040b0c050b2004450d08200020043602042000410b360200200041086a2003ad2207422086200784370200200241d0096a24000f0b0b0b200241f0086a41086a220c20024188076a41086a2d00003a0000200220022f0184073b01e00620022002290388073703f008200220022f01de063b01ac07024020034106470d002000410f360200200241d0096a24000f0b200241f8066a41086a220d200c2d00003a0000200220022f01e0063b01dc06200220022903f0083703f806200220022f01ac073b01da06200020063a0009200041086a20033a000020004108360200200041186a2007370200200041146a2001360200200041106a20053602002000410c6a20043602002000200e3a0029200020022f01dc063b000a200041206a20022903f806370200200041286a200d2d00003a0000200020022f01da063b012a200241d0096a24000f0b0b200241a0076a41026a220120024194076a41026a2d00003a000020024190086a41086a220d20024188076a41086a280200360200200241f0086a41086a220f200241b0076a41086a290300370300200241f0086a41106a2210200241b0076a41106a290300370300200220022f0194073b01a007200220022903880737039008200220022903b0073703f008024020034105470d002000410f360200200241d0096a24000f0b20024184076a41026a221220012d00003a0000200241f8066a41086a2201200d280200360200200241e0066a41086a220d200f290300370300200241e0066a41106a220f2010290300370300200220022f01a0073b01840720022002290390083703f806200220022903f0083703e0062000410f6a20044110763a00002000410d6a20043b0000200041086a20033a00002000410d360200200041186a2007370200200041106a20093702002000410c6a20053a0000200041346a200e360200200041306a20063602002000412c6a200c360200200020022f0184073b00092000410b6a20122d00003a0000200041206a20022903f806370200200041286a2001280200360200200041386a20022903e006370200200041c0006a200d290300370200200041c8006a200f290300370200200041d8006a200a370200200041d0006a2008370200200241d0096a24000f0b2000410f360200200241d0096a24000f0b2004ad22074220862007842107410121060b20004101360200200041106a20073702002000410c6a2003360200200041086a2006360200200241d0096a24000f0b2000410f360200200241d0096a24000f0b2000410f360200200241d0096a24000bdd0504027f017e0f7f017e230041d0006b22022400200241086a200110d5010240024002400240024002400240024002402002280208450d00200228020c2203ad42287e2204422088a70d032004a72205417f4c0d032005450d012005101f2206450d042003450d020c050b20004100360200200241d0006a24000f0b4108210620030d030b4100210f4100210d0c030b102e000b200541081020000b200241306a41186a2107200241306a41106a2108200141046a21094100210a4100210b4100210c2003210d024003402007420037030020084200370300200241306a41086a220e420037030020024200370330200141086a2205410020012802002009280200200241306a412020052802001002220f200f417f461b220f4120200f412049220f1b20052802006a2210360200200f0d01200241106a41186a22112007290300370300200241106a41106a22122008290300370300200241106a41086a2213200e29030037030020022002290330370310200242003703302005410020012802002009280200200241306a410820101002220f200f417f461b220f4108200f4108491b20052802006a360200200f41074d0d01200c41016a210f200229033021042007201129030037030020082012290300370300200e2013290300370300200220022903103703300240200c200d470d00200a200f200f200a491b220dad42287e2214422088a70d042014a722054100480d040240200c450d002006200b2005101e22060d010c060b2005101f2206450d050b2006200b6a22052002290330370300200541186a2007290300370300200541106a2008290300370300200541086a200e290300370300200541206a2004370300200a41026a210a200b41286a210b200f210c200f2003490d000c020b0b200041003602000240200d450d002006101d0b200241d0006a24000f0b2000200d36020420002006360200200041086a200f360200200241d0006a24000f0b1021000b200541081020000bd60501097f230041c0006b220124000240024002400240411a101f2202450d00200241186a41002f00e89b403b0000200241106a41002900e09b40370000200241086a41002900d89b40370000200241002900d09b403700002002411a4134101e2202450d012002200036001a200141306a41086a22034200370300200142003703302002411e200141306a1001200141206a41086a200329030037030020012001290330370320200141206a411010092002101d4113101f2202450d022002410f6a410028008f9d40360000200241086a41002900889d40370000200241002900809d40370000200241134126101e2202450d0320022000360013200141306a41086a220342003703002001420037033020024117200141306a1001200141206a41086a200329030037030020012001290330370320200141206a411010092002101d200120001099012001280204210420012802002105024002400240024020012802082202450d0020024105742106200521030340200141186a2207200341186a290000370300200141106a2208200341106a290000370300200141086a2209200341086a290000370300200120032900003703004110101f2202450d02200241086a41002900a49b403700002002410029009c9b40370000200241104120101e2202450d03200220003600102002412041c000101e2202450d04200341206a2103200220012903003700142002412c6a2007290300370000200241246a20082903003700002002411c6a2009290300370000200141306a41086a220742003703002001420037033020024134200141306a1001200141206a41086a200729030037030020012001290330370320200141206a411010092002101d200641606a22060d000b0b02402004450d002005101d0b200141c0006a24000f0b411041011020000b412041011020000b41c00041011020000b411a41011020000b413441011020000b411341011020000b412641011020000b890303047f017e027f230041306b22032400200341206a41086a220442003703002003420037032020002001200341206a1001200341086a41086a20042903003703002003200329032037030820034100360228200342013703202002280200210120032002280208220236021c2003411c6a200341206a106202400240024002402002450d002002410374210520042802002102200328022421060340200129030021070240024002400240200620026b41084f0d00200241086a22002002490d0720064101742208200020002008491b22094100480d072006450d01200328022020062009101e22080d020c080b200241086a2100200328022021080c020b2009101f2208450d060b2003200936022420032008360220200921060b200141086a210120042000360200200820026a200737000020002102200541786a22050d000c020b0b2004280200210020032802242106200328022021080b200341086a411020082000100302402006450d002008101d0b200341306a24000f0b1021000b200941011020000bc20304027f017e087f017e230041106b220224002002200110d50102400240024002400240024002400240024002402002280200450d0020022802042203ad2204421d88a70d032004420386a72205417f4c0d032005450d012005101f2206450d042003450d020c050b20004100360200200241106a24000f0b4108210620030d030b410021054100210b0c030b102e000b200541081020000b200141046a210741002108410021094100210a2003210b034020024200370308200141086a2205410020012802002007280200200241086a410820052802001002220c200c417f461b220c4108200c4108491b20052802006a360200200c41074d0d02200a41016a2105200229030821040240200a200b470d002008200520052008491b220bad420386220d422088a70d04200da7220c4100480d040240200a450d0020062009200c101e22060d010c060b200c101f2206450d050b200620096a2004370300200841026a2108200941086a21092005210a20052003490d000b0b2000200b36020420002006360200200041086a2005360200200241106a24000f0b200041003602000240200b450d002006101d0b200241106a24000f0b1021000b200c41081020000bb50d03017f017e097f230041d0006b2204240042002105200441206a41086a220642003703002004420037032041eb96c100411d200441206a1001200441086a220720062903003703002004200429032037030002400240024002400240024002400240024002402004411041f8b3c200410041001002417f460d002004421037021420042004360210200441206a200441106a10a90120042903304202510d0102402004280244450d00200441c0006a280200101d0b200041046a280200450d092000280200101d200441d0006a24000f0b2006420037030020044200370320418cb9c000410d200441206a100120072006290300370300200420042903203703000240024002402004411041f8b3c200410041001002417f460d002004420037032020044110200441206a41084100100241016a41084d0d01200429032021050b02402002a74101470d00200441206a41086a2206420037030020044200370320418897c100411a200441206a1001200441086a20062903003703002004200429032037030002402004411041f8b3c200410041001002417f460d002004420037032020044110200441206a41084100100241016a41084d0d0320042903202005580d00200041046a280200450d0c2000280200101d200441d0006a24000f0b200441206a41086a2206420037030020044200370320418897c100411a200441206a1001200441086a2006290300370300200420042903203703002004200142018620057c37032020044110200441206a410810030b200028020821062000280204210820002802002109200441206a41086a220042003703002004420037032041eb96c100411d200441206a1001200441086a20002903003703002004200429032037030020044100360228200442013703204108101f2200450d032004428880808080013702242004200036022020002005370000200041084110101e2200450d04200442908080808002370224200020013700082004200036022020042006360210200441106a200441206a106202400240024002402006450d002009200641286c6a210a200441206a41086a220b280200210c2004280224210720092100034002400240024002402007200c6b41204f0d00200c41206a2206200c490d062007410174220d20062006200d491b220e4100480d062007450d0120042802202007200e101e220d0d020c070b200c41206a21062004280220210d0c020b200e101f220d450d050b2004200e3602242004200d360220200e21070b200b2006360200200d200c6a220c41186a200041186a290000370000200c41106a200041106a290000370000200c41086a200041086a290000370000200c2000290000370000200041206a29030021050240200720066b41074b0d00200641086a220c2006490d032007410174220e200c200c200e491b220c4100480d03024002402007450d00200d2007200c101e220d0d010c070b200c101f220d450d060b2004200c3602242004200d360220200c21070b200b200641086a220c360200200d20066a2005370000200a200041286a2200470d000b0b200441286a28020021002004280224210702400240024002400240024002400240024002400240024020024201520d0020072000470d01200041016a22062000490d0c20004101742207200620062007491b22074100480d0c2000450d03200428022020002007101e22060d040c140b20072000470d01200041016a22062000490d0b20004101742207200620062007491b22074100480d0b2000450d05200428022020002007101e22060d060c140b200428022021060c030b20042802202106200721070c050b2007101f2206450d100b20042007360224200420063602200b200441206a41086a220b200041016a220d360200200620006a41013a000002402007200d6b41074b0d00200d41086a220c200d490d072007410174220e200c200c200e491b220c4100480d072007450d0420062007200c101e22060d050c110b2007210c0c050b2007101f2206450d0e0b20042007360224200420063602200b200441286a200041016a220d360200200620006a41003a0000200441102006200d10032007450d0f0c0e0b200c101f2206450d0c0b2004200c360224200420063602200b200b200041096a22003602002006200d6a200337000020044110200620001003200c0d0b0c0c0b1021000b200e41011020000b200c41011020000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b410841011020000b411041011020000b200741011020000b200741011020000b200c41011020000b2006101d0b2008450d002009101d0b200441d0006a24000bc20306037f017e017f027e017f027e230041106b22022400200242003703002001410020012802002001280204200241082001280208100222032003417f461b2203410820034108491b20012802086a22043602080240024002400240200341074d0d002002290300210520024200370300200141086a220641002001280200200141046a280200200241082004100222032003417f461b2203410820034108491b20062802006a360200200341074d0d00200229030021072002200110a40120022802002204450d0020022902042108200241003a00002001280200200141046a28020020024101200141086a22032802001002210620032003280200200641016a41014b22066a22093602002006450d0120022d00004101470d014200210a20024200370300200141086a220341002001280200200141046a280200200241082009100222012001417f461b2201410820014108491b20032802006a360200200141074d0d022002290300210b4201210a0c030b20004202370310200241106a24000f0b4200210a0b0b2000200b3703182000200a3703102000200737030820002005370300200041246a2008370200200041206a2004360200200241106a24000bc60303027f017e097f230041106b220224002002200110d50102400240024002400240024002400240024002402002280200450d0020022802042203ad2204421e88a70d032004420286a72205417f4c0d032005450d012005101f2206450d042003450d020c050b20004100360200200241106a24000f0b4104210620030d030b410021054100210b0c030b102e000b200541041020000b200141086a210741002108410021094100210a2003210b0340200141046a28020021052007280200210c2002410036020c20074100200128020020052002410c6a4104200c100222052005417f461b2205410420054104491b20072802006a360200200541034d0d02200a41016a2105200228020c210c0240200a200b470d002008200520052008491b220bad4202862204422088a70d042004a7220d4100480d040240200a450d0020062009200d101e22060d010c060b200d101f2206450d050b200620096a200c360200200841026a2108200941046a21092005210a20052003490d000b0b2000200b36020420002006360200200041086a2005360200200241106a24000f0b200041003602000240200b450d002006101d0b200241106a24000f0b1021000b200d41041020000b880301097f230041306b22012400200141206a41086a220242003703002001420037032041bcbcc1004112200141206a1001200141086a41086a20022903003703002001200129032037030820014100360228200142013703202000280200210320012000280208220036021c2001411c6a200141206a106202400240024002402000450d002000410274210420022802002100200128022421050340200328020021060240024002400240200520006b41044f0d00200041046a22072000490d0720054101742208200720072008491b22094100480d072005450d01200128022020052009101e22080d020c080b200041046a2107200128022021080c020b2009101f2208450d060b2001200936022420012008360220200921050b200341046a210320022007360200200820006a2006360000200721002004417c6a22040d000c020b0b2002280200210720012802242105200128022021080b200141086a411020082007100302402005450d002008101d0b200141306a24000f0b1021000b200941011020000bb60202047f027e230041206b22022400200241106a41086a220342003703002002420037031041aeb9c0004116200241106a1001200241086a22042003290300370300200220022903103703000240024002402002411041f8b3c200410041001002417f460d00200242003703182002420037031020024110200241106a4110410010022205417f460d022005410f4d0d02200241186a2903002106200229031021070c010b42002107420021060b200342003703002002420037031041aeb9c0004116200241106a100120042003290300370300200220022903103703002002427f200620017c200720007c22002007542203ad7c22072003200720065420072006511b22031b3703182002427f200020031b37031020024110200241106a41101003200241206a24000f0b41df88c0004133103a000b990201037f230041306b220224000240024002404117101f2203450d002003410f6a41002900f89c40370000200341086a41002900f19c40370000200341002900e99c4037000020034117412e101e2203450d0120032001370017200241206a41086a22044200370300200242003703202003411f200241206a1001200241086a200429030037030020022002290320370300024002402002411041f8b3c200410041001002417f460d002002421037021420022002360210200241206a200241106a10970120022802202204450d0420002002290224370204200020043602000c010b20004100360208200042083702000b2003101d200241306a24000f0b411741011020000b412e41011020000b41df88c0004133103a000b9d0501077f230041106b2202240020024100360208200242013703002000280200210320022000280208220036020c2002410c6a20021062024002400240024002402000450d00200041e8006c2104200241086a2105034020052802002100200228020421060240024002400240024002400240024002402003280200410f470d0020062000470d01200041016a22062000490d0b20004101742207200620062007491b22074100480d0b2000450d03200228020020002007101e22060d040c0c0b20062000470d01200041016a22062000490d0a20004101742207200620062007491b22074100480d0a2000450d05200228020020002007101e22060d060c0c0b200228020021060c030b200228020021060c050b2007101f2206450d080b2002200736020420022006360200200528020021000b2005200041016a360200200620006a41003a0000200341e8006a2103200441987f6a22040d030c040b2007101f2206450d060b2002200736020420022006360200200528020021000b2005200041016a360200200620006a41013a00002003200210b201200341e0006a2802002107024002400240024020022802042206200528020022006b41044f0d00200041046a22082000490d0620064101742200200820082000491b22004100480d062006450d01200228020020062000101e22060d020c090b200228020021060c020b2000101f2206450d070b2002200036020420022006360200200528020021000b2005200041046a360200200620006a2007360000200341e8006a2103200441987f6a22040d000b0b200228020421002001280200200128020420022802002203200241086a280200100302402000450d002003101d0b200241106a24000f0b1021000b200741011020000b200741011020000b200041011020000bf60201037f230041306b22022400024002404110101f2203450d00200341086a410029009dba4037000020034100290095ba40370000200341104120101e2203450d0120032001370010200241106a41086a220442003703002002420037031020034118200241106a1001200241086a2004290300370300200220022903103703000240024002402002411041f8b3c200410041001002417f460d00200241106a41186a4200370300200241106a41106a4200370300200241186a42003703002002420037031020024110200241106a4120410010022204417f460d022004411f4d0d0220002002290310370000200041186a200241106a41186a290300370000200041106a200241106a41106a290300370000200041086a200241106a41086a2903003700000c010b20004200370000200041186a4200370000200041106a4200370000200041086a42003700000b2003101d200241306a24000f0b41df88c0004133103a000b411041011020000b412041011020000b890201027f230041306b22022400024002400240410f101f2203450d00200341076a41002900b4bf41370000200341002900adbf413700002003410f411e101e2203450d012003200136000f200241206a41086a220142003703002002420037032020034113200241206a1001200241086a200129030037030020022002290320370300024002402002411041f8b3c200410041001002417f460d002002421037021420022002360210200241206a200241106a105e20022802202201450d0420002002290224370204200020013602000c010b20004100360208200042013702000b2003101d200241306a24000f0b410f41011020000b411e41011020000b41df88c0004133103a000bc10903017f017e057f230041e0006b2202240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020002903002203423f560d00200141046a280200200141086a2802002200470d01200041016a22042000490d1120004101742205200420042005491b22054100480d112000450d05200128020020002005101e2204450d060c190b2003428080015a0d01200141046a2802002204200141086a28020022006b41024f0d02200041026a22052000490d1020044101742200200520052000491b22004100480d102004450d08200128020020042000101e2204450d090c160b200128020021040c180b20034280808080045a0d01200141046a2802002204200141086a28020022006b41044f0d04200041046a22052000490d0e20044101742200200520052000491b22004100480d0e2004450d08200128020020042000101e22040d090c120b200128020021040c140b4108200379a74103766b22064104490d0e200141046a280200200141086a2802002205470d03200541016a22042005490d0c20054101742207200420042007491b22044100480d0c2005450d09200128020020052004101e22070d0a0c110b2005101f22040d130b200541011020000b200128020021040c050b200128020021070c070b2000101f22040d0d0b200041011020000b2000101f2204450d090b20012004360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200420006a2003a7410274410272360000200241e0006a24000f0b2004101f2207450d070b20012007360200200141046a2004360200200141086a28020021050b200141086a2204200541016a360200200720056a200641027441736a3a0000200220002903002203370308200141046a210703400240024002400240200728020020042802002200470d00200041016a22052000490d0520004101742208200520052008491b22084100480d052000450d01200128020020002008101e22050d020c060b200128020021050c020b2008101f2205450d040b2001200536020020072008360200200428020021000b2004200041016a360200200520006a2003a73a0000200342088821032006417f6a22060d000b20022003370308200350450d03200241e0006a24000f0b1021000b200841011020000b41c0dac300102c000b2002200241086a360240200241f0c0c100360244200241c8006a41146a4100360200200241286a41146a411c360200200241346a411d360200200241106a41146a4103360200200241f8b3c2003602582002420137024c200241d8dac3003602482002411d36022c20024203370214200241e0b0c4003602102002200241c8006a3602382002200241c4006a3602302002200241c0006a3602282002200241286a360220200241106a41e0dac30010cf01000b200041011020000b200441011020000b20012004360200200141046a2000360200200141086a28020021000b200141086a200041026a360200200420006a2003a74102744101723b0000200241e0006a24000f0b20012004360200200141046a2005360200200141086a28020021000b200141086a200041016a360200200420006a2003a74102743a0000200241e0006a24000ba1ce0103067f017e047f230041106b22022400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020002802002203450d0020034101460d010c020b02400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d1220034101742205200420042005491b22054100480d122003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a000002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d1220034101742205200420042005491b22054100480d122003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a0000200041086a200110b101200028020022034101470d010b02400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d1120034101742205200420042005491b22054100480d112003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a00000240200041086a28020022034101470d0002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d1220034101742205200420042005491b22054100480d122003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2206200341016a360200200420036a41003a00002000410c6a28020021072002200041146a280200220336020c2002410c6a2001106202400240024002400240200141046a2802002205200628020022046b20034f0d00200420036a22062004490d1220054101742204200620062004491b22044100480d122005450d01200128020020052004101e2205450d020c030b200128020021050c030b2004101f22050d010b200441011020000b20012005360200200141046a2004360200200141086a28020021040b200141086a200420036a360200200520046a2007200310ce031a200041086a28020021030b024020034102470d0002400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d1220034101742205200420042005491b22054100480d122003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a0000200041086a28020021030b024020034103470d0002400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d1220034101742205200420042005491b22054100480d122003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2206200341016a360200200420036a41023a00002000410c6a28020021072002200041146a280200220336020c2002410c6a2001106202400240024002400240200141046a2802002205200628020022046b20034f0d00200420036a22062004490d1220054101742204200620062004491b22044100480d122005450d01200128020020052004101e2205450d020c030b200128020021050c030b2004101f22050d010b200441011020000b20012005360200200141046a2004360200200141086a28020021040b200141086a200420036a360200200520046a2007200310ce031a200041086a28020021030b024020034104470d0002400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d1220034101742205200420042005491b22054100480d122003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41033a0000200041106a290300210802400240024002400240200141046a2802002204200528020022036b41084f0d00200341086a22052003490d1220044101742203200520052003491b22034100480d122004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341086a360200200420036a2008370000200041086a28020021030b024020034105470d0002400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d1220034101742205200420042005491b22054100480d122003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2206200341016a360200200420036a41043a00002000410c6a28020021072002200041146a280200220336020c2002410c6a2001106202400240024002400240200141046a2802002205200628020022046b20034f0d00200420036a22062004490d1220054101742204200620062004491b22044100480d122005450d01200128020020052004101e2205450d020c030b200128020021050c030b2004101f22050d010b200441011020000b20012005360200200141046a2004360200200141086a28020021040b200141086a200420036a360200200520046a2007200310ce031a200041086a28020021030b024002400240024002400240024020034106470d0002400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d1820034101742205200420042005491b22044100480d182003450d01200128020020032004101e2205450d020c030b200128020021050c030b2004101f22050d010b200441011020000b20012005360200200141046a2004360200200141086a28020021030b200141086a2204200341016a360200200520036a41053a00002000410c6a28020021032002200041146a280200220536020c2002410c6a2001106202402005450d002003200541186c6a2109200141046a210703402003280200210a2002200341086a280200220536020c2002410c6a2001106202400240024002402007280200220b200428020022066b20054f0d00200620056a220c2006490d19200b4101742206200c200c2006491b22064100480d19200b450d012001280200200b2006101e220b0d020c070b2001280200210b0c020b2006101f220b450d050b2001200b36020020072006360200200428020021060b2004200620056a360200200b20066a200a200510ce031a2003410c6a280200210a2002200341146a280200220536020c2002410c6a2001106202400240024002402007280200220b200428020022066b20054f0d00200620056a220c2006490d19200b4101742206200c200c2006491b22064100480d19200b450d012001280200200b2006101e220b0d020c080b2001280200210b0c020b2006101f220b450d060b2001200b36020020072006360200200428020021060b2004200620056a360200200b20066a200a200510ce031a200341186a22032009470d000b0b200041086a28020021030b20034107470d04024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d1520034101742205200420042005491b22054100480d152003450d01200128020020032005101e2204450d020c050b200128020021040c050b2005101f22040d030b200541011020000b200641011020000b200641011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2206200341016a360200200420036a41063a00002000410c6a28020021052002200041146a280200220336020c2002410c6a200110622003450d0020052003410c6c6a2109200141046a210a03402005280200210b2002200541086a280200220336020c2002410c6a200110620240024002400240200a2802002207200628020022046b20034f0d00200420036a220c2004490d1320074101742204200c200c2004491b22044100480d132007450d01200128020020072004101e22070d020c060b200128020021070c020b2004101f2207450d040b20012007360200200a2004360200200628020021040b2006200420036a360200200720046a200b200310ce031a2005410c6a22052009470d000b0b200028020022034102470d020c030b200441011020000b20034102460d010b20034103460d010c020b02400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d0e20034101742205200420042005491b22054100480d0e2003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41023a0000200028020022034103470d010b02400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d0d20034101742205200420042005491b22054100480d0d2003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41033a000002400240200041086a2802004101470d0002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d0f20034101742206200420042006491b22064100480d0f2003450d01200128020020032006101e2204450d020c030b200128020021040c030b2006101f22040d010b200641011020000b20012004360200200141046a2006360200200141086a28020021030b200141086a200341016a360200200420036a41003a00002000410c6a200110bc022002200041306a36020c2002410c6a200110f302200041086a2802004102470d010b02400240024002400240200141046a28020020052802002203470d00200341016a22042003490d0e20034101742205200420042005491b22054100480d0e2003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a00002000410c6a200110bc022002200041306a36020c2002410c6a200110f3022002200041c0006a36020c2002410c6a200110f3020b41042104200028020022034104470d010c020b4104210420034104460d010b20034105460d010c020b02400240024002400240200120046a280200200141086a2802002203470d00200341016a22042003490d0a20034101742205200420042005491b22054100480d0a2003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41043a00000240200041086a22032d000022044101470d0002400240024002400240200141046a28020020052802002204470d00200441016a22052004490d0b20044101742206200520052006491b22064100480d0b2004450d01200128020020042006101e2205450d020c030b200128020021050c030b2006101f22050d010b200641011020000b20012005360200200141046a2006360200200141086a28020021040b200141086a2206200441016a360200200520046a41003a000002400240024002400240200141046a2802002205200628020022046b41204f0d00200441206a22062004490d0b20054101742204200620062004491b22044100480d0b2005450d01200128020020052004101e2205450d020c030b200128020021050c030b2004101f22050d010b200441011020000b20012005360200200141046a2004360200200141086a28020021040b200141086a200441206a360200200520046a220441186a200341196a290000370000200441106a200341116a290000370000200441086a200341096a2900003700002004200329000137000020032d000021040b0240200441ff01714102470d0002400240024002400240200141046a280200200141086a2802002204470d00200441016a22052004490d0b20044101742206200520052006491b22064100480d0b2004450d01200128020020042006101e2205450d020c030b200128020021050c030b2006101f22050d010b200641011020000b20012005360200200141046a2006360200200141086a28020021040b200141086a200441016a360200200520046a41013a0000200041106a200110b10120032d000021040b0240200441ff01714103470d0002400240024002400240200141046a280200200141086a2802002204470d00200441016a22052004490d0b20044101742206200520052006491b22064100480d0b2004450d01200128020020042006101e2205450d020c030b200128020021050c030b2006101f22050d010b200641011020000b20012005360200200141046a2006360200200141086a28020021040b200141086a2206200441016a360200200520046a41023a000002400240024002400240200141046a28020020062802002204470d00200441016a22052004490d0b20044101742206200520052006491b22064100480d0b2004450d01200128020020042006101e2205450d020c030b200128020021050c030b2006101f22050d010b200641011020000b20012005360200200141046a2006360200200141086a28020021040b200141086a200441016a360200200520046a200341016a2d00003a00000b200028020022034105470d010b02400240024002400240200141046a220b280200200141086a22052802002203470d00200341016a22042003490d0920034101742206200420042006491b22064100480d092003450d01200128020020032006101e2204450d020c030b200128020021040c030b2006101f22040d010b200641011020000b20012004360200200141046a2006360200200141086a28020021030b2005200341016a360200200420036a41053a00000240024002400240024002400240200041086a2d000022034101470d0002400240024002400240200b28020020052802002203470d00200341016a22042003490d1020034101742206200420042006491b22064100480d102003450d01200128020020032006101e2204450d020c030b200128020021040c030b2006101f22040d010b200641011020000b20012004360200200141046a2006360200200141086a28020021030b200141086a200341016a360200200420036a41003a00002000410c6a200110bc022002200041306a36020c2002410c6a200110f302024002400240024002400240024002400240024002400240024002400240200041096a2d000022034101460d0020034102470d01200b28020020052802002203470d03200341016a22042003490d1a20034101742206200420042006491b22064100480d1a2003450d08200128020020032006101e22040d090c110b200b28020020052802002203470d01200341016a22042003490d1920034101742206200420042006491b22064100480d192003450d04200128020020032006101e22040d050c0f0b200b28020020052802002203470d02200341016a22042003490d1820034101742206200420042006491b22064100480d182003450d09200128020020032006101e22040d0a0c100b200128020021040c040b200128020021040c060b200128020021040c080b2006101f2204450d0a0b20012004360200200141046a2006360200200141086a28020021030b2005200341016a360200200420036a41013a00000c060b2006101f2204450d080b20012004360200200141046a2006360200200141086a28020021030b2005200341016a360200200420036a41023a00000c030b2006101f2204450d060b20012004360200200141046a2006360200200141086a28020021030b2005200341016a360200200420036a41003a00000b200041086a2d000021030b200341ff01714102470d05024002400240200b28020020052802002203470d00200341016a22042003490d0d20034101742206200420042006491b22064100480d0d2003450d01200128020020032006101e2204450d020c060b200128020021040c060b2006101f22040d040b200641011020000b200641011020000b200641011020000b200641011020000b20012004360200200141046a2006360200200141086a28020021030b200141086a200341016a360200200420036a41013a00002002200041106a36020c2002410c6a200110f302200041086a2d000021030b0240200341ff01714103470d0002400240024002400240200b28020020052802002203470d00200341016a22042003490d0a20034101742206200420042006491b22064100480d0a2003450d01200128020020032006101e2204450d020c030b200128020021040c030b2006101f22040d010b200641011020000b20012004360200200141046a2006360200200141086a28020021030b200141086a200341016a360200200420036a41023a00002002200041106a36020c2002410c6a200110f302200041086a2d000021030b0240200341ff01714104470d0002400240024002400240200b28020020052802002203470d00200341016a22042003490d0a20034101742206200420042006491b22064100480d0a2003450d01200128020020032006101e2204450d020c030b200128020021040c030b2006101f22040d010b200641011020000b20012004360200200141046a2006360200200141086a28020021030b2005200341016a360200200420036a41033a0000200041086a2d000021030b0240200341ff01714105470d0002400240024002400240200b28020020052802002203470d00200341016a22042003490d0a20034101742206200420042006491b22064100480d0a2003450d01200128020020032006101e2204450d020c030b200128020021040c030b2006101f22040d010b200641011020000b20012004360200200141046a2006360200200141086a28020021030b200141086a200341016a360200200420036a41043a0000200041206a200110622002200041106a36020c2002410c6a200110f302200041086a2d000021030b0240200341ff01714106470d0002400240024002400240200b28020020052802002203470d00200341016a22042003490d0a20034101742206200420042006491b22064100480d0a2003450d01200128020020032006101e2204450d020c030b200128020021040c030b2006101f22040d010b200641011020000b20012004360200200141046a2006360200200141086a28020021030b200141086a200341016a360200200420036a41053a00002000410c6a28020021032002200041146a280200220436020c2002410c6a2001106202402004450d00200441246c210403402003200110bc02200341246a21032004415c6a22040d000b0b200041086a2d000021030b0240200341ff01714107470d0002400240024002400240200b28020020052802002203470d00200341016a22042003490d0a20034101742206200420042006491b22064100480d0a2003450d01200128020020032006101e2204450d020c030b200128020021040c030b2006101f22040d010b200641011020000b20012004360200200141046a2006360200200141086a28020021030b2005200341016a360200200420036a41063a0000200041086a2d000021030b0240024002400240024002400240200341ff01714108470d0002400240024002400240200b28020020052802002203470d00200341016a22042003490d1020034101742206200420042006491b22064100480d102003450d01200128020020032006101e2204450d020c030b200128020021040c030b2006101f22040d010b200641011020000b20012004360200200141046a2006360200200141086a28020021030b2005200341016a360200200420036a41073a000002400240024002400240024002400240024002400240024002400240200041096a2d000022034101460d0020034102470d01200b28020020052802002203470d03200341016a22042003490d1920034101742206200420042006491b22064100480d192003450d08200128020020032006101e22040d090c100b200b28020020052802002203470d01200341016a22042003490d1820034101742206200420042006491b22064100480d182003450d04200128020020032006101e22040d050c0e0b200b28020020052802002203470d02200341016a22042003490d1720034101742206200420042006491b22064100480d172003450d09200128020020032006101e22040d0a0c0f0b200128020021040c040b200128020021040c060b200128020021040c080b2006101f2204450d090b20012004360200200141046a2006360200200141086a28020021030b2005200341016a360200200420036a41013a00000c060b2006101f2204450d070b20012004360200200141046a2006360200200141086a28020021030b2005200341016a360200200420036a41023a00000c030b2006101f2204450d050b20012004360200200141046a2006360200200141086a28020021030b2005200341016a360200200420036a41003a00000b200041086a2d000022034109470d05024002400240200b28020020052802002203470d00200341016a22042003490d0d20034101742206200420042006491b22064100480d0d2003450d01200128020020032006101e2204450d020c060b200128020021040c060b2006101f22040d040b200641011020000b200641011020000b200641011020000b200641011020000b20012004360200200141046a2006360200200141086a28020021030b200141086a200341016a360200200420036a41083a00002000410c6a200110bc02200041086a2d000021030b0240200341ff0171410a470d0002400240024002400240200b28020020052802002203470d00200341016a22042003490d0a20034101742206200420042006491b22064100480d0a2003450d01200128020020032006101e2204450d020c030b200128020021040c030b2006101f22040d010b200641011020000b20012004360200200141046a2006360200200141086a28020021030b200141086a200341016a360200200420036a41093a0000200041106a200110b101200041086a2d000021030b0240200341ff0171410b470d0002400240024002400240200b28020020052802002203470d00200341016a22042003490d0a20034101742206200420042006491b22064100480d0a2003450d01200128020020032006101e2204450d020c030b200128020021040c030b2006101f22040d010b200641011020000b20012004360200200141046a2006360200200141086a28020021030b200141086a200341016a360200200420036a410a3a0000200041106a200110b101200041086a2d000021030b0240200341ff0171410c470d0002400240024002400240200b28020020052802002203470d00200341016a22042003490d0a20034101742206200420042006491b22064100480d0a2003450d01200128020020032006101e2204450d020c030b200128020021040c030b2006101f22040d010b200641011020000b20012004360200200141046a2006360200200141086a28020021030b200141086a200341016a360200200420036a410b3a00002000410c6a20011062200041086a2d000021030b0240200341ff0171410d470d0002400240024002400240200b28020020052802002203470d00200341016a22042003490d0a20034101742206200420042006491b22064100480d0a2003450d01200128020020032006101e2204450d020c030b200128020021040c030b2006101f22040d010b200641011020000b20012004360200200141046a2006360200200141086a28020021030b2005200341016a360200200420036a410c3a000002400240024002400240200b28020020052802002203470d00200341016a22042003490d0a20034101742206200420042006491b22064100480d0a2003450d01200128020020032006101e2204450d020c030b200128020021040c030b2006101f22040d010b200641011020000b20012004360200200141046a2006360200200141086a28020021030b2005200341016a360200200420036a200041096a2d00003a0000200041086a2d000021030b0240200341ff0171410e470d0002400240024002400240200b28020020052802002203470d00200341016a22042003490d0a20034101742206200420042006491b22064100480d0a2003450d01200128020020032006101e2204450d020c030b200128020021040c030b2006101f22040d010b200641011020000b20012004360200200141046a2006360200200141086a28020021030b200141086a200341016a360200200420036a410d3a00002000410c6a20011062200041086a2d000021030b02400240200341ff0171410f470d0002400240024002400240200b28020020052802002203470d00200341016a22042003490d0b20034101742206200420042006491b22064100480d0b2003450d01200128020020032006101e2204450d020c030b200128020021040c030b2006101f22040d010b200641011020000b20012004360200200141046a2006360200200141086a28020021030b200141086a220c200341016a360200200420036a410e3a00002000410c6a28020021032002200041146a280200220436020c2002410c6a200110622004450d0020044105742107200141046a210903400240024002400240200b2802002206200528020022046b41204f0d00200441206a220a2004490d0b20064101742204200a200a2004491b22044100480d0b2006450d01200128020020062004101e22060d020c060b200128020021060c020b2004101f2206450d040b2001200636020020092004360200200c28020021040b2005200441206a360200200620046a220441186a200341186a290000370000200441106a200341106a290000370000200441086a200341086a29000037000020042003290000370000200341206a2103200741606a22070d000b0b200028020022034106470d020c030b200441011020000b20034106460d010b20034107460d010c050b02400240024002400240200141046a2206280200200141086a22032802002204470d00200441016a22052004490d0620044101742207200520052007491b22074100480d062004450d01200128020020042007101e2205450d020c030b200128020021050c030b2007101f22050d010b200741011020000b20012005360200200141046a2007360200200141086a28020021040b2003200441016a360200200520046a41063a00000240200041086a22052d000022044101470d0002400240024002400240200628020020032802002204470d00200441016a22072004490d072004410174220b20072007200b491b220b4100480d072004450d0120012802002004200b101e2207450d020c030b200128020021070c030b200b101f22070d010b200b41011020000b20012007360200200141046a200b360200200141086a28020021040b200141086a200441016a360200200720046a41003a00002000410c6a280200200110b2012002200041106a36020c2002410c6a200110f302200041086a2d000021040b0240200441ff01714102470d0002400240024002400240200628020020032802002204470d00200441016a22072004490d072004410174220b20072007200b491b220b4100480d072004450d0120012802002004200b101e2207450d020c030b200128020021070c030b200b101f22070d010b200b41011020000b20012007360200200141046a200b360200200141086a28020021040b200141086a200441016a360200200720046a41013a00002000410c6a2001106220052d000021040b0240200441ff01714103470d0002400240024002400240200628020020032802002204470d00200441016a22072004490d072004410174220b20072007200b491b220b4100480d072004450d0120012802002004200b101e2207450d020c030b200128020021070c030b200b101f22070d010b200b41011020000b20012007360200200141046a200b360200200141086a28020021040b200141086a220b200441016a360200200720046a41023a00002000410c6a2001106202400240024002400240200141046a280200200b2802002204470d00200441016a22072004490d072004410174220b20072007200b491b220b4100480d072004450d0120012802002004200b101e2207450d020c030b200128020021070c030b200b101f22070d010b200b41011020000b20012007360200200141046a200b360200200141086a28020021040b2003200441016a360200200720046a200541016a2d00003a000020052d000021040b0240200441ff01714104470d0002400240024002400240200628020020032802002204470d00200441016a22072004490d072004410174220b20072007200b491b220b4100480d072004450d0120012802002004200b101e2207450d020c030b200128020021070c030b200b101f22070d010b200b41011020000b20012007360200200141046a200b360200200141086a28020021040b200141086a220b200441016a360200200720046a41033a00002000410c6a2001106202400240024002400240200141046a280200200b2802002204470d00200441016a22072004490d072004410174220b20072007200b491b220b4100480d072004450d0120012802002004200b101e2207450d020c030b200128020021070c030b200b101f22070d010b200b41011020000b20012007360200200141046a200b360200200141086a28020021040b2003200441016a360200200720046a200541016a2d00003a000020052d000021040b0240200441ff01714105470d0002400240024002400240200628020020032802002204470d00200441016a22072004490d072004410174220b20072007200b491b220b4100480d072004450d0120012802002004200b101e2207450d020c030b200128020021070c030b200b101f22070d010b200b41011020000b20012007360200200141046a200b360200200141086a28020021040b200141086a200441016a360200200720046a41043a00002000410c6a280200200110b20102400240024002400240024002400240024002400240024002400240024002400240024002400240200041096a2d000022044101460d0020044102470d01200628020020032802002204470d03200441016a22072004490d162004410174220b20072007200b491b220b4100480d162004450d0820012802002004200b101e22070d090c100b200628020020032802002204470d01200441016a22072004490d152004410174220b20072007200b491b220b4100480d152004450d0420012802002004200b101e22070d050c0e0b200628020020032802002204470d02200441016a22072004490d142004410174220b20072007200b491b220b4100480d142004450d0920012802002004200b101e22070d0a0c0f0b200128020021070c040b200128020021070c060b200128020021070c080b200b101f2207450d090b20012007360200200141046a200b360200200141086a28020021040b2003200441016a360200200720046a41013a00000c060b200b101f2207450d070b20012007360200200141046a200b360200200141086a28020021040b2003200441016a360200200720046a41023a00000c030b200b101f2207450d050b20012007360200200141046a200b360200200141086a28020021040b2003200441016a360200200720046a41003a00000b200041106a290300210802400240024020062802002207200328020022046b41084f0d00200441086a220b2004490d0a20074101742204200b200b2004491b22044100480d0a2007450d01200128020020072004101e2207450d020c060b200128020021070c060b2004101f22070d040b200441011020000b200b41011020000b200b41011020000b200b41011020000b20012007360200200141046a2004360200200141086a28020021040b2003200441086a360200200720046a200837000020052d000021040b0240200441ff01714106470d0002400240024002400240200628020020032802002204470d00200441016a22072004490d072004410174220b20072007200b491b220b4100480d072004450d0120012802002004200b101e2207450d020c030b200128020021070c030b200b101f22070d010b200b41011020000b20012007360200200141046a200b360200200141086a28020021040b200141086a200441016a360200200720046a41053a00002000410c6a2001106220052d000021040b0240200441ff01714107470d0002400240024002400240200628020020032802002204470d00200441016a22072004490d072004410174220b20072007200b491b220b4100480d072004450d0120012802002004200b101e2207450d020c030b200128020021070c030b200b101f22070d010b200b41011020000b20012007360200200141046a200b360200200141086a28020021040b200141086a200441016a360200200720046a41063a0000200041106a200110b1012000410c6a2001106220052d000021040b0240200441ff01714108470d0002400240024002400240200628020020032802002204470d00200441016a22072004490d072004410174220b20072007200b491b220b4100480d072004450d0120012802002004200b101e2207450d020c030b200128020021070c030b200b101f22070d010b200b41011020000b20012007360200200141046a200b360200200141086a28020021040b2003200441016a360200200720046a41073a00000240024002400240024020062802002207200328020022046b41204f0d00200441206a220b2004490d0720074101742204200b200b2004491b22044100480d072007450d01200128020020072004101e2207450d020c030b200128020021070c030b2004101f22070d010b200441011020000b20012007360200200141046a2004360200200141086a28020021040b2003200441206a360200200720046a220441186a200541196a290000370000200441106a200541116a290000370000200441086a200541096a2900003700002004200529000137000020052d000021040b0240200441ff01714109470d0002400240024002400240200628020020032802002204470d00200441016a22072004490d072004410174220b20072007200b491b220b4100480d072004450d0120012802002004200b101e2207450d020c030b200128020021070c030b200b101f22070d010b200b41011020000b20012007360200200141046a200b360200200141086a28020021040b2003200441016a360200200720046a41083a000020052d000021040b0240200441ff0171410a470d0002400240024002400240200628020020032802002204470d00200441016a22072004490d072004410174220b20072007200b491b220b4100480d072004450d0120012802002004200b101e2207450d020c030b200128020021070c030b200b101f22070d010b200b41011020000b20012007360200200141046a200b360200200141086a28020021040b2003200441016a360200200720046a41093a00000240024002400240024020062802002207200328020022046b41204f0d00200441206a220b2004490d0720074101742204200b200b2004491b22044100480d072007450d01200128020020072004101e2207450d020c030b200128020021070c030b2004101f22070d010b200441011020000b20012007360200200141046a2004360200200141086a28020021040b2003200441206a360200200720046a220441186a200541196a290000370000200441106a200541116a290000370000200441086a200541096a2900003700002004200529000137000020052d000021040b0240200441ff0171410b470d0002400240024002400240200628020020032802002204470d00200441016a22072004490d072004410174220b20072007200b491b220b4100480d072004450d0120012802002004200b101e2207450d020c030b200128020021070c030b200b101f22070d010b200b41011020000b20012007360200200141046a200b360200200141086a28020021040b2003200441016a360200200720046a410a3a00000240024002400240024020062802002207200328020022046b41204f0d00200441206a220b2004490d0720074101742204200b200b2004491b22044100480d072007450d01200128020020072004101e2207450d020c030b200128020021070c030b2004101f22070d010b200441011020000b20012007360200200141046a2004360200200141086a28020021040b2003200441206a360200200720046a220441186a200541196a290000370000200441106a200541116a290000370000200441086a200541096a2900003700002004200529000137000002400240024002400240200628020020032802002204470d00200441016a22072004490d072004410174220b20072007200b491b220b4100480d072004450d0120012802002004200b101e2207450d020c030b200128020021070c030b200b101f22070d010b200b41011020000b20012007360200200141046a200b360200200141086a28020021040b2003200441016a360200200720046a200541216a2d00003a000020052d000021040b0240200441ff0171410c470d0002400240024002400240200628020020032802002204470d00200441016a22052004490d0720044101742206200520052006491b22064100480d072004450d01200128020020042006101e2205450d020c030b200128020021050c030b2006101f22050d010b200641011020000b20012005360200200141046a2006360200200141086a28020021040b2003200441016a360200200520046a410b3a00000b200028020022034107470d040b024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d0320034101742205200420042005491b22054100480d032003450d01200128020020032005101e2204450d020c040b200128020021040c040b2005101f22040d020b200541011020000b1021000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41073a0000024002400240024002400240024002400240200041086a28020022034101470d0002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d1b20034101742205200420042005491b22054100480d1b2003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a00002000410c6a28020021042002200041146a280200220736020c2002410c6a2001106202402007450d00200141046a210b03400240024002400240200b28020020052802002203470d00200341016a22062003490d1c2003410174220a20062006200a491b220a4100480d1c2003450d0120012802002003200a101e22060d020c070b200128020021060c020b200a101f2206450d050b20012006360200200b200a360200200528020021030b2005200341016a360200200620036a20042d00003a0000200441016a21042007417f6a22070d000b0b200041186a20011062200041086a28020021030b20034102470d03024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d1820034101742205200420042005491b22054100480d182003450d01200128020020032005101e2204450d020c040b200128020021040c040b2005101f22040d020b200541011020000b200a41011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a00002000410c6a28020021042002200041146a280200220736020c2002410c6a2001106202402007450d00200141046a210b03400240024002400240200b28020020052802002203470d00200341016a22062003490d182003410174220a20062006200a491b220a4100480d182003450d0120012802002003200a101e22060d020c070b200128020021060c020b200a101f2206450d050b20012006360200200b200a360200200528020021030b2005200341016a360200200620036a20042d00003a0000200441016a21042007417f6a22070d000b0b200041186a20011062200041086a28020021030b20034103470d03024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d1420034101742205200420042005491b22054100480d142003450d01200128020020032005101e2204450d020c040b200128020021040c040b2005101f22040d020b200541011020000b200a41011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41023a00002000410c6a20011062200041106a200110bc02200041346a20011062200041386a20011062200041086a28020021030b024020034104470d0002400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d1320034101742205200420042005491b22054100480d132003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41033a00002000410c6a20011062200041086a28020021030b024020034105470d0002400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d1320034101742205200420042005491b22054100480d132003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41043a00002000410c6a20011062200041086a28020021030b024020034106470d0002400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d1320034101742205200420042005491b22054100480d132003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41053a00002000410c6a200110bc022002200041386a36020c2002410c6a200110f302200041306a20011062200041086a28020021030b024020034107470d0002400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d1320034101742205200420042005491b22054100480d132003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41063a00002000410c6a20011062200041086a28020021030b024020034108470d0002400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d1320034101742205200420042005491b22054100480d132003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41073a00002000410c6a200110bc02200041086a28020021030b024020034109470d0002400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d1320034101742205200420042005491b22054100480d132003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41083a0000200041106a200110b101200041086a28020021030b02402003410a470d0002400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d1320034101742205200420042005491b22054100480d132003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41093a0000200041106a200110b1010b41082104200028020022034108470d010c020b4108210420034108460d010b20034109460d010c020b02400240024002400240200141046a280200200120046a2802002203470d00200341016a22052003490d0f20034101742206200520052006491b22064100480d0f2003450d01200128020020032006101e2205450d020c030b200128020021050c030b2006101f22050d010b200641011020000b20012005360200200141046a2006360200200141086a28020021030b200141086a2206200341016a360200200520036a41083a00000240200020046a22032d000022044101470d0002400240024002400240200141046a28020020062802002204470d00200441016a22052004490d1020044101742206200520052006491b22064100480d102004450d01200128020020042006101e2205450d020c030b200128020021050c030b2006101f22050d010b200641011020000b20012005360200200141046a2006360200200141086a28020021040b200141086a200441016a360200200520046a41003a00002000410c6a280200200110b201200041086a2d000021040b0240200441ff01714102470d0002400240024002400240200141046a280200200141086a2802002204470d00200441016a22052004490d1020044101742206200520052006491b22064100480d102004450d01200128020020042006101e2205450d020c030b200128020021050c030b2006101f22050d010b200641011020000b20012005360200200141046a2006360200200141086a28020021040b200141086a2206200441016a360200200520046a41013a000002400240024002400240200141046a2802002205200628020022046b41204f0d00200441206a22062004490d1020054101742204200620062004491b22044100480d102005450d01200128020020052004101e2205450d020c030b200128020021050c030b2004101f22050d010b200441011020000b20012005360200200141046a2004360200200141086a28020021040b200141086a2206200441206a360200200520046a220441186a200341196a290000370000200441106a200341116a290000370000200441086a200341096a2900003700002004200329000137000002400240024002400240200141046a28020020062802002204470d00200441016a22052004490d1020044101742206200520052006491b22064100480d102004450d01200128020020042006101e2205450d020c030b200128020021050c030b2006101f22050d010b200641011020000b20012005360200200141046a2006360200200141086a28020021040b200141086a200441016a360200200520046a200341216a2d00003a000020032d000021040b0240200441ff01714103470d0002400240024002400240200141046a280200200141086a2802002204470d00200441016a22052004490d1020044101742206200520052006491b22064100480d102004450d01200128020020042006101e2205450d020c030b200128020021050c030b2006101f22050d010b200641011020000b20012005360200200141046a2006360200200141086a28020021040b200141086a2206200441016a360200200520046a41023a000002400240024002400240200141046a2802002205200628020022046b41204f0d00200441206a22062004490d1020054101742204200620062004491b22044100480d102005450d01200128020020052004101e2205450d020c030b200128020021050c030b2004101f22050d010b200441011020000b20012005360200200141046a2004360200200141086a28020021040b200141086a200441206a360200200520046a220441186a200341196a290000370000200441106a200341116a290000370000200441086a200341096a2900003700002004200329000137000020032d000021040b0240200441ff01714104470d0002400240024002400240200141046a280200200141086a2802002204470d00200441016a22052004490d1020044101742206200520052006491b22064100480d102004450d01200128020020042006101e2205450d020c030b200128020021050c030b2006101f22050d010b200641011020000b20012005360200200141046a2006360200200141086a28020021040b200141086a200441016a360200200520046a41033a0000200041106a200110b10120032d000021040b0240200441ff01714105470d0002400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d1020034101742205200420042005491b22054100480d102003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41043a0000200041106a200110b1010b200028020022034109470d010b02400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d0e20034101742205200420042005491b22054100480d0e2003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41093a000002400240200041046a22032d00004101470d0002400240024002400240200141046a28020020052802002204470d00200441016a22062004490d1020044101742207200620062007491b22074100480d102004450d01200128020020042007101e2206450d020c030b200128020021060c030b2007101f22060d010b200741011020000b20012006360200200141046a2007360200200141086a28020021040b200141086a200441016a360200200620046a41003a0000200041086a200110622000410c6a280200200110b201200041046a2d00004102470d010b02400240024002400240200141046a28020020052802002204470d00200441016a22052004490d0f20044101742206200520052006491b22064100480d0f2004450d01200128020020042006101e2205450d020c030b200128020021050c030b2006101f22050d010b200641011020000b20012005360200200141046a2006360200200141086a28020021040b200141086a2206200441016a360200200520046a41013a000002400240024002400240200141046a2802002205200628020022046b41204f0d00200441206a22062004490d0f20054101742204200620062004491b22044100480d0f2005450d01200128020020052004101e2205450d020c030b200128020021050c030b2004101f22050d010b200441011020000b20012005360200200141046a2004360200200141086a28020021040b200141086a2206200441206a360200200520046a220441186a200341196a290000370000200441106a200341116a290000370000200441086a200341096a29000037000020042003290001370000200041286a2001106202400240024002400240200141046a28020020062802002204470d00200441016a22052004490d0f20044101742206200520052006491b22064100480d0f2004450d01200128020020042006101e2205450d020c030b200128020021050c030b2006101f22050d010b200641011020000b20012005360200200141046a2006360200200141086a28020021040b200141086a200441016a360200200520046a200341216a2d00003a00000b20002802002203410a470d010c020b2003410a460d010b2003410b460d010c020b02400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d0b20034101742205200420042005491b22054100480d0b2003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a410a3a000002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d0b20034101742205200420042005491b22054100480d0b2003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a0000200041086a200110b10120002802002203410b470d010b02400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d0a20034101742205200420042005491b22054100480d0a2003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a410b3a000002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d0a20034101742205200420042005491b22054100480d0a2003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2206200341016a360200200420036a41003a0000200041046a280200210720022000410c6a280200220336020c2002410c6a2001106202400240024002400240200141046a2802002205200628020022046b20034f0d00200420036a22062004490d0a20054101742204200620062004491b22044100480d0a2005450d01200128020020052004101e2205450d020c030b200128020021050c030b2004101f22050d010b200441011020000b20012005360200200141046a2004360200200141086a28020021040b200141086a200420036a360200200520046a2007200310ce031a20002802002203410c470d010c020b2003410c460d010b2003410d460d010c020b02400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d0720034101742205200420042005491b22054100480d072003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a410c3a00000240200041086a28020022034101470d0002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d0820034101742205200420042005491b22054100480d082003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a00002002200041306a36020c2002410c6a200110f3022000410c6a200110bc02200041086a28020021030b024020034102470d0002400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d0820034101742205200420042005491b22054100480d082003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a00002002200041106a36020c2002410c6a200110f302200041086a28020021030b024020034103470d0002400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d0820034101742205200420042005491b22054100480d082003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41023a00002000410c6a200110622002200041186a36020c2002410c6a200110f302200041286a200110b101200041106a20011062200041086a28020021030b024020034104470d0002400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d0820034101742205200420042005491b22054100480d082003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41033a00002000410c6a20011062200041086a28020021030b024020034105470d0002400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d0820034101742205200420042005491b22054100480d082003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41043a00002000410c6a200110620b2000280200410d470d010b02400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d0620034101742205200420042005491b22054100480d062003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a410d3a00000240200041086a22042d000022034101470d0002400240024002400240200141046a28020020052802002203470d00200341016a22052003490d0720034101742206200520052006491b22064100480d072003450d01200128020020032006101e2205450d020c030b200128020021050c030b2006101f22050d010b200641011020000b20012005360200200141046a2006360200200141086a28020021030b200141086a2206200341016a360200200520036a41003a0000200041d0006a280200210702400240024002400240200141046a2802002205200628020022036b41044f0d00200341046a22062003490d0720054101742203200620062003491b22034100480d072005450d01200128020020052003101e2205450d020c030b200128020021050c030b2003101f22050d010b200341011020000b20012005360200200141046a2003360200200141086a28020021030b200141086a2206200341046a360200200520036a2007360000200041106a290300210802400240024002400240200141046a2802002205200628020022036b41084f0d00200341086a22062003490d0720054101742203200620062003491b22034100480d072005450d01200128020020052003101e2205450d020c030b200128020021050c030b2003101f22050d010b200341011020000b20012005360200200141046a2003360200200141086a28020021030b200141086a2206200341086a360200200520036a2008370000200041186a290300210802400240024002400240200141046a2802002205200628020022036b41084f0d00200341086a22062003490d0720054101742203200620062003491b22034100480d072005450d01200128020020052003101e2205450d020c030b200128020021050c030b2003101f22050d010b200341011020000b20012005360200200141046a2003360200200141086a28020021030b200141086a2206200341086a360200200520036a2008370000200041206a290300210802400240024002400240200141046a2802002205200628020022036b41084f0d00200341086a22062003490d0720054101742203200620062003491b22034100480d072005450d01200128020020052003101e2205450d020c030b200128020021050c030b2003101f22050d010b200341011020000b20012005360200200141046a2003360200200141086a28020021030b200141086a2206200341086a360200200520036a2008370000200041286a290300210802400240024002400240200141046a2802002205200628020022036b41084f0d00200341086a22062003490d0720054101742203200620062003491b22034100480d072005450d01200128020020052003101e2205450d020c030b200128020021050c030b2003101f22050d010b200341011020000b20012005360200200141046a2003360200200141086a28020021030b200141086a2206200341086a360200200520036a2008370000200041306a290300210802400240024002400240200141046a2802002205200628020022036b41084f0d00200341086a22062003490d0720054101742203200620062003491b22034100480d072005450d01200128020020052003101e2205450d020c030b200128020021050c030b2003101f22050d010b200341011020000b20012005360200200141046a2003360200200141086a28020021030b200141086a2206200341086a360200200520036a2008370000200041386a290300210802400240024002400240200141046a2802002205200628020022036b41084f0d00200341086a22062003490d0720054101742203200620062003491b22034100480d072005450d01200128020020052003101e2205450d020c030b200128020021050c030b2003101f22050d010b200341011020000b20012005360200200141046a2003360200200141086a28020021030b200141086a2206200341086a360200200520036a2008370000200041c0006a290300210802400240024002400240200141046a2802002205200628020022036b41084f0d00200341086a22062003490d0720054101742203200620062003491b22034100480d072005450d01200128020020052003101e2205450d020c030b200128020021050c030b2003101f22050d010b200341011020000b20012005360200200141046a2003360200200141086a28020021030b200141086a2206200341086a360200200520036a2008370000200041c8006a290300210802400240024002400240200141046a2802002205200628020022036b41084f0d00200341086a22062003490d0720054101742203200620062003491b22034100480d072005450d01200128020020052003101e2205450d020c030b200128020021050c030b2003101f22050d010b200341011020000b20012005360200200141046a2003360200200141086a28020021030b200141086a2206200341086a360200200520036a2008370000200041d4006a280200210702400240024002400240200141046a2802002205200628020022036b41044f0d00200341046a22062003490d0720054101742203200620062003491b22034100480d072005450d01200128020020052003101e2205450d020c030b200128020021050c030b2003101f22050d010b200341011020000b20012005360200200141046a2003360200200141086a28020021030b200141086a2206200341046a360200200520036a2007360000200041d8006a280200210702400240024002400240200141046a2802002205200628020022036b41044f0d00200341046a22062003490d0720054101742203200620062003491b22034100480d072005450d01200128020020052003101e2205450d020c030b200128020021050c030b2003101f22050d010b200341011020000b20012005360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200520036a200736000020042d000021030b0240200341ff01714102470d0002400240024002400240200141046a280200200141086a2802002203470d00200341016a22052003490d0720034101742206200520052006491b22064100480d072003450d01200128020020032006101e2205450d020c030b200128020021050c030b2006101f22050d010b200641011020000b20012005360200200141046a2006360200200141086a28020021030b200141086a2207200341016a360200200520036a41013a0000200041186a200110b1012000410c6a280200210b2002200041146a280200220336020c2002410c6a2001106202400240024002400240200141046a2802002206200728020022056b20034f0d00200520036a22072005490d0720064101742205200720072005491b22054100480d072006450d01200128020020062005101e2206450d020c030b200128020021060c030b2005101f22060d010b200541011020000b20012006360200200141046a2005360200200141086a28020021050b200141086a200520036a360200200620056a200b200310ce031a20042d000021030b0240200341ff01714103470d0002400240024002400240200141046a280200200141086a2802002203470d00200341016a22052003490d0720034101742206200520052006491b22064100480d072003450d01200128020020032006101e2205450d020c030b200128020021050c030b2006101f22050d010b200641011020000b20012005360200200141046a2006360200200141086a28020021030b200141086a2207200341016a360200200520036a41023a00002000410c6a200110bc022002200041c0006a36020c2002410c6a200110f302200041d0006a200110b101200041306a280200210b2002200041386a280200220336020c2002410c6a2001106202400240024002400240200141046a2802002206200728020022056b20034f0d00200520036a22072005490d0720064101742205200720072005491b22054100480d072006450d01200128020020062005101e2206450d020c030b200128020021060c030b2005101f22060d010b200541011020000b20012006360200200141046a2005360200200141086a28020021050b200141086a200520036a360200200620056a200b200310ce031a20042d000021030b200341ff01714104470d0002400240024002400240200141046a280200200141086a2802002203470d00200341016a22052003490d0620034101742206200520052006491b22064100480d062003450d01200128020020032006101e2205450d020c030b200128020021050c030b2006101f22050d010b200641011020000b20012005360200200141046a2006360200200141086a28020021030b200141086a2206200341016a360200200520036a41033a00002002200041386a36020c2002410c6a200110f302200041c8006a200110b10102400240024002400240200141046a2802002205200628020022036b41204f0d00200341206a22062003490d0620054101742203200620062003491b22034100480d062005450d01200128020020052003101e2205450d020c030b200128020021050c030b2003101f22050d010b200341011020000b20012005360200200141046a2003360200200141086a28020021030b200141086a2206200341206a360200200520036a220341186a200441196a290000370000200341106a200441116a290000370000200341086a200441096a290000370000200320042900013700002000412c6a28020021072002200041346a280200220336020c2002410c6a2001106202400240024002400240200141046a2802002205200628020022046b20034f0d00200420036a22062004490d0620054101742204200620062004491b22044100480d062005450d01200128020020052004101e2205450d020c030b200128020021050c030b2004101f22050d010b200441011020000b20012005360200200141046a2004360200200141086a28020021040b200141086a200420036a360200200520046a2007200310ce031a0b2000280200410e470d0302400240024002400240200141046a280200200141086a2802002203470d00200341016a22042003490d0520034101742205200420042005491b22054100480d052003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a410e3a0000024020002802044101470d0002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d0620034101742206200420042006491b22064100480d062003450d01200128020020032006101e2204450d020c030b200128020021040c030b2006101f22040d010b200641011020000b20012004360200200141046a2006360200200141086a28020021030b200141086a200341016a360200200420036a41003a0000200041086a280200200110b201200041046a2802004102470d040b024002400240200141046a28020020052802002203470d00200341016a22042003490d0320034101742205200420042005491b22054100480d032003450d01200128020020032005101e2204450d020c040b200128020021040c040b2005101f22040d020b200541011020000b1021000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a0000200041086a200110bc020b200241106a24000bb70201027f0240024002400240024002402000280200220141064b0d0020010e0705010502050304050b02402000410c6a2802002202450d00200028020421012002410c6c210203400240200141046a280200450d002001280200101d0b2001410c6a2101200241746a22020d000b0b200041086a280200450d04200041046a280200101d0f0b200041086a280200450d032000280204101d0f0b200041086a280200450d022000280204101d0f0b200041086a280200450d012000280204101d0f0b02402000410c6a2802002202450d0020002802042101200241186c210203400240200141046a280200450d002001280200101d0b0240200141106a280200450d002001410c6a280200101d0b200141186a2101200241686a22020d000b0b200041086a280200450d00200041046a280200101d0f0b0bef1004047f017e087f037e230041b0046b22022400200241106a200110b5010240024002400240024002400240024002402002280210450d00200241003a00880220024188026a2001280200220320012802042204410047220510ce031a20042005490d04200141046a200420056b3602002001200320056a3602002004450d0120022d008802220441ff00714101470d022004411874411875417f4c0d03420221060c080b20004203370370200241b0046a24000f0b20004203370370200241b0046a24000f0b20004203370370200241b0046a24000f0b200241a8016a200110b60102400240024020022d00a8014102460d00200241c8036a41206a200241a8016a41206a280200360200200241c8036a41186a200241a8016a41186a290300370300200241c8036a41106a200241a8016a41106a290300370300200241c8036a41086a200241a8016a41086a290300370300200220022903a8013703c80320024188026a41386a2207420037030020024188026a41306a2208420037030020024188026a41286a2209420037030020024188026a41206a220a420037030020024188026a41186a220b420037030020024188026a41106a220c420037030020024188026a41086a220d4200370300200242003703880220024188026a20012802002203200141046a220e280200220441c000200441c000491b220510ce031a200e200420056b3602002001200320056a3602002004413f4d0d00200241f0036a41386a2007290300370300200241f0036a41306a2008290300370300200241f0036a41286a2009290300370300200241f0036a41206a200a290300370300200241f0036a41186a200b290300370300200241f0036a41106a200c290300370300200241f0036a41086a200d29030037030020022002290388023703f00320022001105a2002280200450d002002290308210f200141046a220e2802002104200241003a00880220024188026a200128020022072004410047220510ce031a20042005490d04200e200420056b22033602002001200720056a22053602002004450d002002310088022210500d01200241003a00880220024188026a20052003410047220410ce031a20032004490d05200141046a200320046b3602002001200520046a3602002003450d0042022010420f838622114204540d00420121062002310088024208862010844204882011420c882210420120104201561b7e22102011540d020b420221060c050b420021060b20024180016a41206a200241c8036a41206a28020036020020024180016a41186a200241c8036a41186a29030037030020024180016a41106a200241c8036a41106a29030037030020024180016a41086a200241c8036a41086a290300370300200241e8026a41086a200241f0036a41086a290300370300200241e8026a41106a200241f0036a41106a290300370300200241e8026a41186a200241f0036a41186a290300370300200241e8026a41206a200241f0036a41206a290300370300200241e8026a41286a200241f0036a41286a290300370300200241e8026a41306a200241f0036a41306a290300370300200241e8026a41386a200241f0036a41386a290300370300200220022903c80337038001200220022903f0033703e8020c030b20052004102a000b20052004102a000b20042003102a000b200241a8016a41206a220420024180016a41206a280200360200200241a8016a41186a220520024180016a41186a290300370300200241a8016a41106a220320024180016a41106a290300370300200241a8016a41086a220e20024180016a41086a29030037030020024188026a41086a2207200241e8026a41086a29030037030020024188026a41106a2208200241e8026a41106a29030037030020024188026a41186a2209200241e8026a41186a29030037030020024188026a41206a220a200241e8026a41206a29030037030020024188026a41286a220b200241e8026a41286a29030037030020024188026a41306a220c200241e8026a41306a29030037030020024188026a41386a220d200241e8026a41386a29030037030020022002290380013703a801200220022903e80237038802024020064202520d0020004203370370200241b0046a24000f0b200241d8006a41206a2004280200360200200241d8006a41186a2005290300370300200241d8006a41106a2003290300370300200241d8006a41086a200e290300370300200241186a41086a2007290300370300200241186a41106a2008290300370300200241186a41186a2009290300370300200241186a41206a200a290300370300200241186a41286a200b290300370300200241186a41306a200c290300370300200241186a41386a200d290300370300200220022903a80137035820022002290388023703180b20024188026a200110b7012002280288022101200241e8026a20024188026a41047241dc0010ce031a02402001410f470d0020004203370370200241b0046a24000f0b200241a8016a200241e8026a41dc0010ce031a2000200f37030020002002290358370308200041106a200241d8006a41086a290300370300200041186a200241d8006a41106a290300370300200041206a200241d8006a41186a290300370300200041286a200241d8006a41206a2802003602002000200229031837022c200041346a200241186a41086a2903003702002000413c6a200241186a41106a290300370200200041c4006a200241186a41186a290300370200200041cc006a200241186a41206a290300370200200041d4006a200241186a41286a290300370200200041dc006a200241c8006a290300370200200041e4006a200241d0006a29030037020020004188016a200136020020004180016a201037030020002011370378200020063703702000418c016a200241a8016a41dc0010ce031a200241b0046a24000bca0301077f230041106b22022400200241003a0003200241036a2001280200220320012802042204410047220510ce031a0240024020042005490d00200141046a200420056b22063602002001200320056a22053602000240024002402004450d000240024020022d0003220341037122044102460d00024020044101460d0020040d0220034102762101410121040c050b200241003a000b2002410b6a20052006410047220410ce031a20062004490d06200141046a200620046b3602002001200520046a3602002006450d0220022d000b4108742003724102762101410121040c040b41002104200241003a000e200241003b010c2002410c6a200520064103200641034922071b220810ce031a200141046a200620086b3602002001200520086a36020020070d0320022f010c20022d000e411074724108742003724102762101410121040c030b200341034b0d004100210420024100360204200241046a200520064104200641044922081b220310ce031a200141046a200620036b3602002001200520036a36020020080d0120022802042101410121040c020b410021040b0b2000200136020420002004360200200241106a24000f0b20052004102a000b20042006102a000b870801067f230041f0006b22022400200241003a0050200241d0006a2001280200220320012802042204410047220510ce031a02400240024020042005490d00200141046a200420056b22063602002001200320056a2205360200024002402004450d0020022d0050220441ef014b0d010c030b200041023a0000200241f0006a24000f0b02400240024002400240200441847e6a220441034b0d00024002400240024020040e0400010203000b200241003b0150200241d0006a20052006410220064102491b220410ce031a200141046a200620046b3602002001200520046a360200200641014d0d0420022f0150220441ef014b0d09200041023a0000200241f0006a24000f0b20024100360250200241d0006a20052006410420064104491b220410ce031a200141046a200620046b3602002001200520046a360200200641034d0d04410121012002280250220441ffff034b0d09200041023a0000200241f0006a24000f0b200041023a0000200141046a20062006410420064104491b22006b3602002001200520006a360200200241f0006a24000f0b41002103200241d0006a2006412020064120491b22046a41004100412020046b2004411f4b1b10cd031a200241d0006a2005200410ce031a200141046a200620046b3602002001200520046a3602002006411f4d0d032002412c6a41026a200241d0006a41026a2d00003a0000200241186a200241df006a290000370300200241206a200241e7006a290000370300200241286a200241d0006a411f6a2d00003a0000200220022f00503b012c2002200229005737031020022800532104410121030c040b200041023a0000200241f0006a24000f0b200041023a0000200241f0006a24000f0b200041023a0000200241f0006a24000f0b0b200241cc006a41026a22012002412c6a41026a2d00003a0000200241306a41086a2205200241106a41086a290300370300200241306a41106a2206200241106a41106a290300370300200241306a41186a2207200241106a41186a2d00003a0000200220022f012c3b014c2002200229031037033002402003450d002002410c6a41026a20012d00003a0000200241d0006a41086a2005290300370300200241d0006a41106a2006290300370300200241d0006a41186a20072d00003a0000200220022f014c3b010c20022002290330370350410021010c030b200041023a0000200241f0006a24000f0b20052004102a000b410121010b200020022f010c3b0001200020013a0000200041046a2004360200200041086a2002290350370200200041036a2002410e6a2d00003a0000200041106a200241d0006a41086a290300370200200041186a200241d0006a41106a290300370200200041206a200241d0006a41186a280200360200200241f0006a24000bb4820105067f057e047f037e097f230041e0096b22022400200241003a00800920024180096a2001280200220320012802042204410047220510ce031a02400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020042005490d00200141046a200420056b22063602002001200320056a2205360200024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402004450d0020022d0080092204410e4b0d07024020040e0f000b0709040c0e0a10060f03050d02000b200241003a00800920024180096a20052006410047220410ce031a20062004490d9301200141046a200620046b3602002001200520046a3602002006450ddc0120022d008009450d130cdc010b2000410f360200200241e0096a24000f0b200241003a00800920024180096a20052006410047220410ce031a20062004490d9201200141046a200620046b3602002001200520046a3602002006450d1420022d00800922044101460d1320040d1420024180096a200110b7012002280280092104200241a0086a20024180096a41047241dc0010ce031a2004410f460d14200241c0076a200241a0086a41dc0010ce031a41e000101f2201450da60120012004360200200141046a200241c0076a41dc0010ce031a20014108762105410121040c250b200241003a00800920024180096a20052006410047220410ce031a20062004490d9201200141046a200620046b3602002001200520046a3602002006450dd80120022d008009450d0f0cd8010b200241003a00800920024180096a20052006410047220410ce031a20062004490d920141042103200141046a200620046b22073602002001200520046a22043602002006450d1c20022d00800922054102460d1b20054101460d1a20050d1c20024180096a2007412020074120491b22056a41004100412020056b2005411f4b1b10cd031a20024180096a2004200510ce031a41042103200141046a200720056b3602002001200420056a3602002007411f4d0d1c20024198076a41086a220520024180096a411f6a2d00003a0000200220022f0081093b01be0720022002290097093703980720022d00800921012002280083092104200229008f0921082002290087092109200241f8066a41086a220620052d00003a0000200220022f01be0722053b01bc0720022002290398073703f806200241a0086a41086a20062d00003a0000200220053b01e806200220022903f8063703a0082009422088a721052009a72106410121030c1e0b200241003a00800920024180096a20052006410047220410ce031a20062004490d9201200141046a200620046b3602002001200520046a3602002006450d2920022d008009220441044b0d29024020040e050027252624000b200241e0046a200110f20220022903e004a7450d29200241f0046a290300210820022903e804210920024180096a200110b60120022d00800922044102460d292002419c096a290200210a2002418c096a290200210b20022f008109210120022d0083092105200229028409210c200220024194096a2902003703b0082002200b3703a8082002200c3703a00820012005411074722101410121050c280b200241003a00800920024180096a20052006410047220410ce031a20062004490d9201200141046a200620046b22033602002001200520046a22043602002006450d1220022d00800922054101460d114103210420050d13200241b8046a200110b50120022802b804450d1320022802bc04210520024180096a200110b7012002280280092106200241a0086a20024180096a41047241dc0010ce031a2006410f460d13200241c0076a200241a0086a41dc0010ce031a41e000101f2201450da90120012006360200200141046a200241c0076a41dc0010ce031a410121040c140b200241003a00800920024180096a20052006410047220410ce031a20062004490d9201200141046a200620046b3602002001200520046a3602002000410f360200200241e0096a24000f0b2000410f360200200241e0096a24000f0b200241003a00800920024180096a20052006410047220410ce031a20062004490d9101200141046a200620046b3602002001200520046a3602002006450d1420022d00800922044101460d1220040d1420024180096a200110b60120022d00800922044102460d1420022d008309210d20022f008109210e2002419c096a290200210820024198096a280200210520024194096a280200210620024180096a41106a28020021032002418c096a28020021072002290284092109200241c8006a200110f2022002280248450d14200e200d411074722101200241c8006a41106a290300210a4101210d2002290350210b0c130b200241003a00800920024180096a20052006410047220410ce031a20062004490d9101200141046a200620046b3602002001200520046a3602002006450d6620022d008009220441094b0d66024020040e0a00353233303738343a31000b20024180096a200110ba022002280280092204450d66200229028409210820024198036a200110b5012008a72105200228029803450d65200228029c03210d200541087621012004410876210f20084220882108410121100c350b200241003a00800920024180096a20052006410047220410ce031a20062004490d9101200141046a200620046b22033602002001200520046a22073602002006450d810120022d008009220541064b0d810141022106024020050e0700d0012b2c2a2d2e000b200241186a200110b5012002280218450d8101200228021c2205417f4c0d97012005450d6d200510792204450daa0120042001280200200141046a22032802002206200520062005491b220610ce031a200328020022072006490dab012003200720066b3602002001200128020020066a36020020062005470d6e0cce010b200241003a00800920024180096a20052006410047220410ce031a20062004490d910141042103200141046a200620046b22073602002001200520046a22103602002006450dbd0120022d0080092206410e4b0dbd01024020060e0f0053547950585b565d525e4f51594e000b20024180096a200110b60120022d00800922044102460dbd0120022d008309210f20022f00810921102002419c096a290200210820024198096a280200210e20024194096a280200210520024180096a41106a350200210c2002418c096a35020021112002290284092109200241a0016a200110f20220022903a001a7450dbd01200241a0016a41106a290300210b20022903a801210a200141046a22072802002106200241003a00800920024180096a2001280200220d2006410047220310ce031a20062003490db7012007200620036b3602002001200d20036a3602002006450dbd0120022d008009220d41024b0dbd012010200f41107472210f200c422086201184210c410121030c780b200241003a00800920024180096a20052006410047220410ce031a20062004490d9101200141046a200620046b22033602002001200520046a22053602002006450d034105210420022d008009220641034b0dc801024020060e0400191718000b200241003602800920024180096a20052003410420034104491b220610ce031a200141046a220d200320066b22073602002001200520066a2205360200200341034d0dc8012002280280092103200242003703800920024180096a20052007410820074108491b220610ce031a200d200720066b220e3602002001200520066a2205360200200741074d0dc8012002290380092109200242003703800920024180096a2005200e4108200e4108491b220610ce031a200141046a220d200e20066b22073602002001200520066a2205360200200e41074d0dc8012002290380092108200242003703800920024180096a20052007410820074108491b220610ce031a200d200720066b220e3602002001200520066a2205360200200741074d0dc801200229038009210a200242003703800920024180096a2005200e4108200e4108491b220610ce031a200141046a220d200e20066b22073602002001200520066a2205360200200e41074d0dc801200229038009210b200242003703800920024180096a20052007410820074108491b220610ce031a200d200720066b220e3602002001200520066a2205360200200741074d0dc801200229038009210c200242003703800920024180096a2005200e4108200e4108491b220610ce031a200141046a220d200e20066b22073602002001200520066a2205360200200e41074d0dc8012002290380092111200242003703800920024180096a20052007410820074108491b220610ce031a200d200720066b220e3602002001200520066a2205360200200741074d0dc8012002290380092112200242003703800920024180096a2005200e4108200e4108491b220610ce031a200141046a220d200e20066b22073602002001200520066a2205360200200e41074d0dc8012002290380092113200241003602800920024180096a20052007410420074104491b220610ce031a200d200720066b220e3602002001200520066a2205360200200741034d0dc8012002280280092107200241003602800920024180096a2005200e4104200e4104491b220610ce031a200141046a200e20066b3602002001200520066a360200200e41034d0dc8012002280280092101200220133703b008200220123703a808200220113703a008410121040cc9010b200241003a00800920024180096a20052006410047220410ce031a20062004490d9101200141046a200620046b220e3602002001200520046a220f3602002006450d5e20022d0080092210410b4b0d5e41092104024020100e0c004344414748464bbe01424a40000b20024180096a200110b7012002280280092104200241a0086a20024180096a41047241dc0010ce031a2004410f460d5e200241c0076a200241a0086a41dc0010ce031a41e000101f2205450db10120052004360200200541046a200241c0076a41dc0010ce031a200241c8026a200110f20220022903c802a7450d5d200241d8026a290300210820022903d0022209422088a721032009a72107410121040c600b200241003a00800920024180096a20052006410047220410ce031a20062004490d9101200141046a200620046b3602002001200520046a3602002006450dc90120022d008009450d050cc9010b200241003a00800920024180096a20052006410047220410ce031a20062004490d9101200141046a200620046b22033602002001200520046a22053602002006450d014106210420022d008009220641044b0dc201024020060e050024212220000b20024180096a200110b7012002280280092101200241a0086a20024180096a41047241dc0010ce031a2001410f460dc201200241c0076a200241a0086a41dc0010ce031a41e000101f2205450da10120052001360200200541046a200241c0076a41dc0010ce031a410121040cc4010b410521040cc4010b410621040cc0010b200241d8046a200110b50120022802d804450dc80120022802dc042204417f4c0d8f012004450d34200410792206450d980120062001280200200141046a22032802002205200420052004491b220510ce031a200328020022072005490d99012003200720056b3602002001200128020020056a36020020052004470d350cbe010b200241086a2001105a2002290308a7450dc8012002290310210820004100360200200041086a2008370300200241e0096a24000f0b200241c8046a2001105a20022903c804a7450dc30120022903d00421082000410a360200200041086a2008370300200241e0096a24000f0b20024180096a200110b601200241a0086a41086a22062002418c096a290200370300200241a0086a41106a220320024194096a290200370300200241a0086a41186a22072002419c096a29020037030020022002290284093703a0084102210420022d00800922014102470d100b2000410f360200200241e0096a24000f0b20024180096a2003412020034120491b22056a41004100412020056b2005411f4b1b10cd031a20024180096a2004200510ce031a200141046a200320056b3602002001200420056a3602002003411f4d0d00200241f8066a41086a220420024180096a411f6a2d00003a0000200220022f0081093b01bc0720022002290097093703f80620022d00800921062002280083092105200229008f0921082002290087092109200241c0076a41086a20042d00003a0000200220022f01bc073b01fc08200220022903f8063703c007200241c0046a200110b5014103210420022802c004450d0120022802c4042103200141046a220e2802002107200241003a00800920024180096a2001280200220f2007410047220d10ce031a2007200d490d9801200e2007200d6b3602002001200f200d6a3602002007450d012009422088a721072009a7210120022d008009210d200241e8066a41086a200241c0076a41086a2d00003a0000200220022f01fc083b01f606200220022903c0073703e806410221040c020b410321040b0b20024180096a41086a220e200241e8066a41086a2d00003a0000200220022f01f6063b019807200220022903e80637038009200220022f01e6063b01fe08024020044103470d002000410f360200200241e0096a24000f0b200241d8066a41086a220f200e2d00003a0000200220022f0198073b01e40620022002290380093703d806200220022f01fe083b01d606200020063a0005200020043a000420004109360200200041146a2008370200200041106a20073602002000410c6a2001360200200041086a20053602002000200d3a0025200041286a2003360200200020022f01e4063b00062000411c6a20022903d806370200200041246a200f2d00003a0000200020022f01d6063b0126200241e0096a24000f0b20024180096a200110b60120022d00800922044102460d0120022d008309210d20022f008109210e2002419c096a290200210820024198096a280200210520024194096a280200210620024180096a41106a28020021032002418c096a28020021072002290284092109200241f8006a200110f2022002290378a7450d01200241f8006a41106a290300210a200229038001210b200241e0006a200110f2022002290360a7450d01200e200d411074722101200241f0006a29030021112002290368210c4102210d0b200020013b000d200041033602002000410f6a20014110763a0000200041c8006a2011370200200041c0006a200c370200200041386a200a370200200041306a200b370200200041286a2008370000200041246a2005360000200041206a20063600002000411c6a2003360000200041186a2007360000200041106a20093700002000410c6a20043a0000200041086a200d360200200241e0096a24000f0b2000410f360200200241e0096a24000f0b20024190016a2001105a200229039001a7450d012002290398012208422088a721052008a72106410221030c020b200241003a00800920024180096a20042007410047220510ce031a20072005490d840141042103200141046a200720056b3602002001200420056a3602002007450d0020022d0080092101410321030c020b0b0b20024180096a41086a2207200241a0086a41086a2d00003a0000200220022f01e8063b019807200220022903a00837038009200220022f01d8063b01fe08024020034104470d002000410f360200200241e0096a24000f0b200241c0076a41086a220d20072d00003a0000200220022f0198073b01fc0820022002290380093703c007200220022f01fe083b01f606200020013a0009200041086a20033a000020004104360200200041186a2008370200200041146a2005360200200041106a20063602002000410c6a2004360200200020022f01fc083b000a200041206a20022903c007370000200041286a200d2d00003a0000200020022f01f6063b012a200241e0096a24000f0b20024180096a200110b60120022d00800922064102460db10120022f00810920022d0083094110747221052002419c096a290200210b20024194096a290200210a2002418c096a2902002108200229028409210920024188066a200110f202200229038806a7450d6b20024188066a41106a290300210c2002290390062111200241f8056a2001105a20022903f805a7450d6b2002290380062112200241f0056a200110b50120022802f005450d6b20022802f4052203417f4c0d7e2003450d6920031079220d450da001200d2001280200200141046a220e2802002207200320072003491b220710ce031a200e280200220f2007490da101200e200f20076b3602002001200128020020076a36020020072003470d6a0cac010b200241b8066a200110f20220022903b806a7450db001200241c8066a290300210b20022903c006210c200241a8066a2001105a20022903a806a7450db00120022903b006211120024198096a420037030020024180096a41106a420037030020024188096a4200370300200242003703800920024180096a20012802002206200141046a22032802002204412020044120491b220510ce031a2003200420056b3602002001200620056a3602002004411f4d0d4c2002419a076a20022d0082093a0000200220022f0180093b01980720022d00830921062002290087092109200229008f092108200229009709210a200231009f09211220022f018409210420022d0086092105200241a0066a200110b501200420054110747221054105210420022802a006450da50120022802a4062203417f4c0d7d2003450d6b20031079220d450da101200d2001280200200141046a220e2802002207200320072003491b220710ce031a200e280200220f2007490da201200e200f20076b3602002001200128020020076a36020020072003470d6c0caa010b200241e0056a2001105a20022903e005a7450daf0120022903e8052108200241d8056a200110b50120022802d805450daf0120022802dc052203417f4c0d7c2003450d50200310792206450d910120062001280200200141046a22072802002205200320052003491b220510ce031a2007280200220d2005490d92012007200d20056b3602002001200128020020056a36020020052003470d510ca8010b20022f00810920022d00830941107472210520024198076a41186a200729030037030020024198076a41106a200329030037030020024198076a41086a2006290300370300200220022903a008370398070b200241f8066a41186a220620024198076a41186a290300370300200241f8066a41106a220320024198076a41106a290300370300200241f8066a41086a220720024198076a41086a29030037030020022002290398073703f806200041086a2005410874200141ff017172360200200020043602042000410e3602002000410c6a20022903f806370200200041146a20072903003702002000411c6a2003290300370200200041246a2006290300370200200241e0096a24000f0b200241d0056a200110b50120022802d005450d0520022802d40522044108762101410521050c030b200241c0056a200110b50120022802c005450d0420022802c4052104200241a8056a200110f20220022903a805a7450d04200241b8056a290300210820022903b005210920024198056a2001105a200229039805a7450d0420022903a005210a20024190056a200110b501200228029005450d042002280294052101200241b0086a2008370300200220093703a808200220013602a00820044108762101410321050c030b200241c8056a200110b50120022802c805450d0320022802cc0522044108762101410421050c010b200241f8046a200110f20220022903f804a7450d0220024188056a290300210820022002290380053703a008200220083703a808410221050b0b20024180096a41106a200241a0086a41106a290300220b37030020024180096a41086a200241a0086a41086a290300220c370300200241c0076a41086a2206200c370300200241c0076a41106a2203200b370300200220022903a008220b3703c0072002200b37038009200041386a2008370200200041306a20093702002000410c6a2001410874200441ff017172360200200041086a20053602002000410c360200200041286a200a370200200041106a20022903c007370200200041186a2006290300370200200041206a2003290300370200200241e0096a24000f0b20024180096a41106a200241a0086a41106a29030037030020024180096a41086a200241a0086a41086a290300370300200220022903a008370380092000410f360200200241e0096a24000f0b200241a8046a2001105a20022903a804a7450da20120022903b0042208422088a721012008a72106410521040c020b4100210620024180096a2003412020034120491b22076a41004100412020076b2007411f4b1b10cd031a20024180096a2005200710ce031a200141046a200320076b3602002001200520076a3602002003411f4d0d1820024198076a41086a220120024180096a411f6a2d00003a0000200220022f0081093b01be0720022002290097093703980720022d008009210d2002280083092105200229008f0921082002290087092109200241c0076a41086a20012d00003a0000200220022f01be073b01fc0820022002290398073703c0072009422088a721012009a72106410121030c190b20024198046a2001105a200229039804a7450da00120022903a0042208422088a721012008a72106410421040b0ca0010b4100210e20024180096a2003412020034120491b22066a41004100412020066b2006411f4b1b10cd031a20024180096a2005200610ce031a200141046a200320066b22073602002001200520066a22063602002003411f4d0d1720024198076a41086a220320024180096a411f6a2d00003a0000200220022f0081093b01be0720022002290097093703980720022d008009210d20022800830921052002290087092109200229008f092108200241a0086a41086a20032d00003a0000200220022f01be073b01fe0820022002290398073703a0084101210e0c180b200241286a200110b5012002280228450d57200228022c2205417f4c0d6d2005450d3d200510792204450d840120042001280200200141046a22032802002206200520062005491b220610ce031a200328020022072006490d85012003200720066b3602002001200128020020066a36020020062005470d3e0c98010b200241206a200110b5012002280220450d5620022802242205417f4c0d6c2005450d3e200510792204450d850120042001280200200141046a22032802002206200520062005491b220610ce031a200328020022072006490d86012003200720066b3602002001200128020020066a36020020062005470d3f0c96010b200242003703800920024180096a20072003410820034108491b220410ce031a41042106200141046a200320046b3602002001200720046a360200200341074d0d5520022903800921080ca3010b200241c0006a200110b5012002280240450d5420022802442214ad42187e2208422088a70d6a2008a72205417f4c0d6a2005450d422005101f22040d43200541041020000b20024180096a200110ab022002280280092204450d532002290284092108410721060ca1010b200241c8036a200110b50120022802c803450d3620022802cc032204410876210f42002108410521100c080b20024188046a2001105a200229038804a7450d35200229039004220942208821082009a722054108762101410a21100c090b200241b8036a200110b50120022802b803450d3420022802bc03210420024180096a200110b60120022d00800922054102460d3420022d008309210d20022f008109210f2002419c096a290200210920024194096a280200210620024180096a41106a28020021032002418c096a28020021072002290284092108200220024198096a2802003602a008200220093702a408200241b0036a200110b50120022802b003450d3420022802b403210e200241a8036a200110b50120022802a803450d34200f200d4110747221012008422088a7210d2009422088a721152004410876210f20022903a008210920022802ac03ad210a4200210b410321100c0a0b200241c0036a200110b50120022802c003450d3320022802c4032204410876210f42002108410421100c050b20024180096a200110b60120022d00800922044102460d3220022902840922094220882108410821102009a72205410876210120022f00810920022d00830941107472210f2002418c096a280200210d20024180096a41106a280200210720024194096a280200210320024198096a28020021062002419c096a29020021090c080b20024180096a200110ba022002280280092204450d312002290284092108200241a0036a200110b5012008a7210520022802a003450d3020022802a403210d200541087621012004410876210f20084220882108410221100b0c050b20024180096a200110b60120022d00800922044102460d2f20022d008309210520022f008109210e2002419c096a290200210920024198096a280200210620024194096a280200210320024180096a41106a28020021072002418c096a280200210d200229028409210c200241d8036a200110f20220022903d803a7450d2f200241d8036a41106a290300210b20022903e003210a200241d0036a200110b50120022802d003450d2f200e200541107472210f20022802d4032115200c4220882108200ca722054108762101410621100c050b200241f0036a200110b50120022802f003450d2e20022802f4032204410876210f42002108410721100b0c020b200241f8036a2001105a20022903f803a7450d2c200229038004220942208821082009a722054108762101410921100b0b0b20004107360200200041c0006a200b370200200041386a200a370200200041346a200e360200200041306a2015360200200041286a2009370200200041246a2006360200200041206a20033602002000411c6a2007360200200041186a200d360200200041086a20103602002000410c6a200f410874200441ff017172360200200041106a20084220862001ad42ffffff07834208862005ad42ff01838484370200200241e0096a24000f0b4101210641002004460d89010b2004450d92012006101d0c92010b41002101410021030b200241f8066a41086a2207200241c0076a41086a2d00003a0000200220022f01fc083b01bc07200220022903c0073703f80602402003450d00200241a0086a41086a220420072d00003a0000200220022f01bc0722033b01fe08200220022903f8063703a008200241e8066a41086a20042d00003a0000200220033b01f606200220022903a0083703e806410321040b0c89010b0b200241f8066a41086a2203200241a0086a41086a2d00003a0000200220022f01fe083b01bc07200220022903a0083703f8060240200e450d00200241c0076a41086a20032d00003a0000200220022f01bc073b01fc08200220022903f8063703c007200241003a00800920024180096a20062007410047220310ce031a20072003490d66200141046a200720036b3602002001200620036a3602002007450d0020022d0080092103200241e8066a41086a200241c0076a41086a2d00003a0000200220022f01fc083b01f606200220022903c0073703e8062009422088a721012009a72106410221040c88010b0c87010b410c21040c1f0b200241f0026a200110b501410d210420022802f002450d1e20022802f4022105200141046a22072802002106200241003a00800920024180096a2001280200220d2006410047220310ce031a20062003490d6e2007200620036b3602002001200d20036a3602002006450d1e20022d0080092106410421040c030b20024180096a200e4120200e4120491b22046a41004100412020046b2004411f4b1b10cd031a20024180096a200f200410ce031a200141046a200e20046b3602002001200f20046a360200200e411f4d0d1c20024198076a41086a220120024180096a411f6a2d00003a0000200220022f0081093b01be0720022002290097093703980720022d00800921062002280083092105200229008f0921082002290087092109200241f8066a41086a220420012d00003a0000200220022f01be0722013b01bc0720022002290398073703f806200241a0086a41086a220320042d00003a0000200220013b01fe08200220022903f8063703a008200241c0076a41086a220420032d00003a0000200220013b01fc08200220022903a0083703c007200241e8066a41086a20042d00003a0000200220013b01f606200220022903c0073703e8062009422088a721032009a72107410a21040c7b0b200241e0026a200110b5014102410d20022802e0021b210420022802e40221050c050b200241e8026a200110b501410d210420022802e802450d1b20022802ec022105200141046a22072802002106200241003a00800920024180096a2001280200220d2006410047220310ce031a20062003490d6c2007200620036b3602002001200d20036a3602002006450d1b20022d0080092106410321040b0c780b20024188036a2001105a410d2104200229038803a7450d19200229039003210820024180036a200110b501200228028003450d1920022802840321052008422088a721032008a72107410721040c1a0b20024180096a200110b7012002280280092104200241a0086a20024180096a41047241dc0010ce031a2004410f460d17200241c0076a200241a0086a41dc0010ce031a41e000101f2205450d6b20052004360200200541046a200241c0076a41dc0010ce031a200141046a22072802002104200241003a00800920024180096a2001280200220d2004410047220610ce031a20042006490d6c2007200420066b22033602002001200d20066a22073602002004450d1620022d008009220641024b0d16200242003703800920024180096a20072003410820034108491b220410ce031a200141046a200320046b3602002001200720046a360200200341074d0d162002290380092208422088a721032008a72107410521040c760b200241f8026a200110b5014106410d20022802f8021b210420022802fc0221050b0c170b20024180096a200e4120200e4120491b22046a41004100412020046b2004411f4b1b10cd031a20024180096a200f200410ce031a200141046a200e20046b22033602002001200f20046a2204360200200e411f4d0d1420024198076a41086a220720024180096a411f6a2d00003a0000200220022f0081093b01be0720022002290097093703980720022d008009210620022800830921052002290087092109200229008f092108200241f8066a41086a220d20072d00003a0000200220022f01be0722073b01bc0720022002290398073703f806200241c0076a41086a220e200d2d00003a0000200220073b01fc08200220022903f8063703c007200241a0086a41086a200e2d00003a0000200220073b01fe08200220022903c0073703a008200241003a00800920024180096a20042003410047220710ce031a20032007490d6a200141046a200320076b3602002001200420076a3602002003450d2d20022d008009210d200241e8066a41086a200241a0086a41086a2d00003a0000200220022f01fe083b01f606200220022903a0083703e8062009422088a721032009a72107410b21040c730b20024180096a200e4120200e4120491b22046a41004100412020046b2004411f4b1b10cd031a20024180096a200f200410ce031a200141046a200e20046b3602002001200f20046a360200200e411f4d0d134108210420024198076a41086a220120024180096a411f6a2d00003a0000200220022f0081093b01be0720022002290097093703980720022d00800921062002280083092105200229008f0921082002290087092109200241f8066a41086a220320012d00003a0000200220022f01be0722013b01bc0720022002290398073703f806200241e8066a41086a20032d00003a0000200220013b01f606200220022903f8063703e8062009422088a721032009a721070c720b200241c0026a200110b50120022802c002450d6f20022802c4022216ad2208421b88a70d482008420586a72205417f4c0d482005450d222005101f22040d23200541011020000b200241b0026a200110b50120022802b002450d6e20022802b4022204410876210f410c21030c0a0b20024180026a200110b501200228028002450d6d2002280284022105200241e8016a200110f20220022903e801a7450d6d200241f8016a290300210c20022903f0012109410521030c270b200241003a00800920024180096a20102007410047220410ce031a20072004490d56200141046a200720046b3602002001201020046a3602002007450d6c20022d008009210d410d21030c050b20024190026a2001105a200228029002450d6b410a210320022903980221090c0c0b200241b8016a200110f20220022903b801a7450d6a200241c8016a290300210c20022903c0012109410221030c010b200241d0016a200110f20220022903d001a7450d69200241e0016a290300210c20022903d8012109410321030b0c210b200241003a00800920024180096a20102007410047220410ce031a20072004490d52200141046a200720046b3602002001201020046a3602002007450d6720022d008009220d41034f0d67410821030b0c210b20024188026a200110b501200228028802450d65200228028c022216ad42247e2208422088a70d3e2008a72205417f4c0d3e2005450d1a2005101f22040d1b200541041020000b200241b8026a200110b50120022802b802450d6420022802bc022204410876210f410e21030b0c010b410721030b0c1a0b20024180096a200110b60120022d00800922044102460d6020022f00810920022d00830941107472210f2002418c096a290200210c20024194096a280200210520024198096a280200210e2002419c096a29020021082002290284092109410921030c1a0b200241a0026a2001105a20022802a002450d5f410b210320022903a80221090b0c160b2005103c2005101d0b410d21040b0b0c5c0b2005450d002004101d0b2000410f360200200241e0096a24000f0b410521040c580b4101210441002005460d5a0b20050d170c180b4101210441002005460d570b20050d150c160b4101210641002003460d570b2003450d5d2006101d0c5d0b4101210441002005460d600b20050d110c120b410421040b024002402014450d00420021084100210e4100210541002107201421150340200241386a200110b5012002280238450d11200228023c2203417f4c0d29024002402003450d0020031079220f450d36200f2001280200200141046a220d2802002206200320062003491b220610ce031a200d28020022102006490d37200d201020066b3602002001200128020020066a36020020062003460d010c120b4101210f41002003470d110b200241306a200110b5012002280230450d1020022802342206417f4c0d29024002402006450d00200610792210450d3220102001280200200141046a2217280200220d2006200d2006491b220d10ce031a20172802002218200d490d3320172018200d6b36020020012001280200200d6a360200200d2006460d010c110b4101211041002006470d100b200741016a210d024020072015470d00200e200d200d200e491b2215ad42187e2209422088a70d2b2009a722174100480d2b02402007450d00200420052017101e22040d010c300b2017101f2204450d2f0b200420056a2207200f360200200741146a2006360200200741106a20063602002007410c6a2010360200200741046a2003ad220942208620098437020020084280808080107c2108200e41026a210e200541186a2105200d2107200d2014490d000c020b0b41002115420021080b2004450d1020082015ad842108410621060c5e0b410121040b024002402016450d0020024180096a41176a211020024198096a211920024190096a211a20024180096a41086a211b200141046a210e20024180096a410f6a211c420021084100210d410021074100210320162118034020194200370300201a4200370300201b4200370300200242003703800920024180096a2001280200220f200e2802002205412020054120491b220610ce031a200e200520066b3602002001200f20066a3602002005411f4d0d0b200341016a210620024198076a41086a2205201041086a2d00003a0000200220022f008109220f3b01be072002201029000037039807201c290000210920022d00800921152002280083092117200229008709210a200241f8066a41086a221420052d00003a00002002200f3b01bc0720022002290398073703f806024020032018470d00200d20062006200d491b2218ad420586220b422088a70d29200ba722054100480d2902402003450d00200420072005101e22040d010c2c0b2005101f2204450d2b0b200420076a220520153a00002005410f6a2009370000200541076a200a370000200541036a2017360000200541016a20022f01bc073b00002005411f6a20142d00003a0000200541176a20022903f80637000020084280808080107c2108200d41026a210d200741206a21072006210320062016490d000c020b0b41002118420021080b2004450d4b20082018ad8421092004410876210f410f21030c020b410421040b024002402016450d004200210820024198096a211920024194096a211a2002418c096a211b41002107411c21034100210520162118034020024180096a200110b60120022d008009220d4102460d0a200541016a210620022d008309210e20022f008109210f2002419c096a290200210920192802002110201a280200211520024180096a41106a2802002117201b2802002114200229028409210a024020052018470d002007200620062007491b2218ad42247e220b422088a70d27200ba7221c4100480d2702402005450d002004200341646a201c101e22040d010c2b0b201c101f2204450d2a0b200420036a22052009370000200541676a200f200e41107472220e4110763a0000200541656a200e3b00002005417c6a2010360000200541786a2015360000200541746a2017360000200541706a2014360000200541686a200a370000200541646a200d3a000020084280808080107c2108200741026a2107200341246a21032006210520062016490d000c020b0b41002118420021080b2004450d4920082018ad8421092004410876210f410621030b0b0b0b0b200220022f01c00722013b018009200220013b01e806200041386a200b370000200041306a200a370000200041186a200c370000200041106a20093700002000200d3a0009200041086a20033a000020004105360200200041286a2008370000200041246a200e360000200041206a20053600002000410c6a200f410874200441ff017172360000200020022f01e8063b000a200241e0096a24000f0b410d21040c450b2018450d420c410b20180d400c410b2006450d002010101d0b2003450d00200f101d0b02402007450d002004210103400240200141046a280200450d002001280200101d0b0240200141106a280200450d002001410c6a280200101d0b200141186a2101200541686a22050d000b0b2015450d010b2004101d0b2000410f360200200241e0096a24000f0b4101210d41002003460d420b2003450d00200d101d0b0c470b4101210d41002003460d3e0b2003450d38200d101d0c380b20052004102a000b20042006102a000b20042006102a000b20042006102a000b20042006102a000b20042006102a000b20042006102a000b20042006102a000b20042006102a000b20042006102a000b20042006102a000b20042006102a000b20042006102a000b20042006102a000b20042006102a000b20042006102a000b102e000b1021000b20052007102a000b200541011020000b201c41041020000b201741041020000b41e00041081020000b200641011020000b200d2018102a000b200441011020000b20052007102a000b200341011020000b20062010102a000b41e00041081020000b200d2007102a000b41e00041081020000b20032007102a000b20042007102a000b20042007102a000b200541011020000b20062007102a000b200341011020000b2005200d102a000b200541011020000b20062007102a000b200541011020000b20062007102a000b20032006102a000b20032006102a000b41e00041081020000b41e00041081020000b20062004102a000b20072003102a000b20032006102a000b200341011020000b2007200f102a000b200341011020000b2007200f102a000b2004101d0b200220022f01c0073b0180092000410f360200200241e0096a24000f0b0c0c0b20024180096a41086a2201200241e8066a41086a2d00003a0000200220022f01f6063b019807200220022903e80637038009200220022f01e6063b01fe0802402004410d470d002000410f360200200241e0096a24000f0b200241d8066a41086a220e20012d00003a0000200220022f0198073b01e40620022002290380093703d806200220022f01fe083b01d606200020063a0009200041086a20043a000020004106360200200041186a2008370200200041146a2003360200200041106a20073602002000410c6a20053602002000200d3a0029200020022f01e4063b000a200041206a20022903d806370200200041286a200e2d00003a0000200020022f01d6063b012a200241e0096a24000f0b2005ad22084220862008842108410321060c0d0b2005ad22084220862008842108410521060c0c0b200641087621052003ad22094220862009842109410221040c080b200241f8066a41026a20024198076a41026a2d00003a00002002200c3703a008200220022f0198073b01f806200220113703b0082002200b3703a808200dad422086201284210b2003ad220c422086200c84210c410421040c070b200241b0086a200c370300200220113703a808200220033602a0082003ad422086200dad84210c2012422088a721072012a72103410321040c060b2006450d09200020063602042000410b360200200041086a2004ad2208422086200884370200200241e0096a24000f0b0b0b20024180096a41086a2207200241e8066a41086a2d00003a0000200220022f01f6063b019807200220022903e80637038009200220022f01e6063b01fe08024020044106470d002000410f360200200241e0096a24000f0b200241d8066a41086a220e20072d00003a0000200220022f0198073b01e40620022002290380093703d806200220022f01fe083b01d6062000200d3a0009200041086a20043a000020004108360200200041186a2008370200200041146a2001360200200041106a20063602002000410c6a2005360200200020033a0029200020022f01e4063b000a200041206a20022903d806370200200041286a200e2d00003a0000200020022f01d6063b012a200241e0096a24000f0b0b0b20024198076a41026a220d200241f8066a41026a2d00003a000020024180096a41086a220e200241a0086a41086a29030037030020024180096a41106a220f200241a0086a41106a290300370300200220022f01f8063b019807200220022903a00837038009024020044105470d002000410f360200200241e0096a24000f0b200241e8066a41026a2210200d2d00003a0000200241c0076a41086a220d200e290300370300200241c0076a41106a220e200f290300370300200220022f0198073b01e80620022002290380093703c0072000410f6a20054110763a00002000410d6a20053b0000200041086a20043a00002000410d360200200041306a200c370200200041286a200b370200200041206a200a370200200041186a2008370200200041106a20093702002000410c6a20063a0000200020022f01e8063b00092000410b6a20102d00003a0000200041386a20022903c007370200200041c0006a200d290300370200200041c8006a200e290300370200200041d8006a2001360200200041d0006a2007ad4220862003ad84370200200241e0096a24000f0b2000410f360200200241e0096a24000f0b2005ad22084220862008842108410121060b20004101360200200041106a20083702002000410c6a2004360200200041086a2006360200200241e0096a24000f0b2000410f360200200241e0096a24000f0b2000410f360200200241e0096a24000b130020004101360204200041b0d8c2003602000b9f0803037f017e077f0240024002400240024002400240024002400240024002402001280200417f6a220241064b0d0002400240024002400240024002400240024002400240024002400240024020020e0700040203010506000b2001410c6a2802002202417f4c0d17200128020421034101210102402002450d002002101f2201450d100b20012003200210ce0321012000410c6a2002360200200041086a200236020020002001360204200041013602000f0b2001410c6a2802002202417f4c0d16200128020421012002450d052002101f22030d06200241011020000b2001410c6a2802002202417f4c0d15200128020421012002450d062002101f22030d07200241011020000b20004104360200200041086a200141086a2903003703000f0b200041023602000f0b2001410c6a2802002204ad42187e2205422088a70d122005a72203417f4c0d12200128020421022003450d052003101f2206450d0b2004450d060c100b2001410c6a2802002207ad420c7e2205422088a70d112005a72202417f4c0d11200128020421032002450d062002101f2204450d0b410c21092007450d070c0c0b410121030b20032001200210ce0321012000410c6a2002360200200041086a200236020020002001360204200041053602000f0b410121030b20032001200210ce0321012000410c6a2002360200200041086a200236020020002001360204200041033602000f0b4104210620040d0a0b410021080c0a0b41042104410c210920070d050b410021080c050b41e8d0c200102c000b200241011020000b200341041020000b200241041020000b2003200720096c6a210c41002108200421020340200341086a2802002201417f4c0d052003280200210a024002402001450d002001101f220b0d010c040b4101210b0b200b200a200110ce03210a200241086a2001360200200241046a20013602002002200a360200200220096a2102200841016a2108200320096a2203200c470d000b0b2000200436020420004107360200200020096a2008360200200041086a20073602000f0b200141011020000b2002200441186c6a210741002108200621010340200241086a2802002203417f4c0d0220022802002109024002402003450d002003101f220a0d010c050b4101210a0b200a2009200310ce03210a200241146a2802002209417f4c0d022002410c6a280200210b024002402009450d002009101f220c0d010c060b4101210c0b200c200b200910ce03210b200141146a2009360200200141106a20093602002001410c6a200b360200200141086a2003360200200141046a20033602002001200a360200200141186a2101200841016a2108200241186a22022007470d000b0b20002006360204200041063602002000410c6a2008360200200041086a20043602000f0b102e000b200341011020000b200941011020000bcb0703037f047e077f230022022103200241e0026b416071220224002001411c6a22042902002105200420022903f801370200200141146a22042902002106200420022903f0013702002001410c6a22042902002107200420022903e801370200200241003a00e00120012902042108200120022903e00137020420022005370378200220063703702002200737036820022008370360200141246a2d00002109200241e0016a41176a22042002290078370000200241e0016a41106a220a2002290071370300200241e0016a41086a220b2002290069370300200220022900613703e00102400240024002402008a741ff01714101470d00200241186a41176a2004290000370000200241186a41106a200a290300370300200241186a41086a200b290300370300200220022903e0013703184115101f2204450d012004410d6a41002900c89b40370000200441086a41002900c39b40370000200441002900bb9b40370000200441154135101e2204450d0220042002290318370015200420093a00342004412c6a2002412f6a220a290000370000200441256a200241186a41106a220b2903003700002004411d6a200241186a41086a290300370000200241e0016a41086a220c4200370300200242003703e00120044135200241e0016a1001200241e0006a41086a200c290300370300200220022903e001370360200241e0016a200241e0006a105c20022d0081024102460d03200241e0006a200241e0016a41e30010ce031a200241386a41206a220c200241e0006a41206a2d00003a0000200241386a41186a220d200241e0006a41186a290300370300200241386a41106a220e200241e0006a41106a290300370300200241386a41086a220f200241e0006a41086a29030037030020022002290360370338200241e0016a200241e0006a41216a41c20010ce031a200141046a220141206a200241e0016a41c1006a2d00003a0000200141186a200241e0016a41396a290000370000200141106a200241e0016a41316a290000370000200141086a200241e0016a41296a290000370000200120022900810237000020002002290318370001200041096a200241186a41086a290300370000200041116a200b290300370000200041186a200a290000370000200041206a20093a0000200041013a0000200041216a2002290338370000200041296a200f290300370000200041316a200e290300370000200041396a200d290300370000200041c1006a200c2d00003a00002004101d200324000f0b200041003a0000200324000f0b411541011020000b413541011020000b41a49ac20041d700103a000b13002000410c36020420004198ddc2003602000b13002000410936020420004195a5c0003602000b130020004110360204200041e0e4c2003602000bb70101057f230041206b22022400200241186a22034200370300200241106a22044200370300200241086a2205420037030020024200370300024002404120101f2206450d0020062002290300370000200641186a2003290300370000200641106a2004290300370000200641086a20052903003700002006412041c000101e2206450d01200042c0808080900437020420002006360200200641003a0020200241206a24000f0b412041011020000b41c00041011020000b4901017f230041106b2202240020024100360208200242013703002002410036020c2002410c6a20021062200041086a200228020836020020002002290300370200200241106a24000bd10301047f230041d0006b2202240002400240410f101f2203450d00200341076a41002900b39b40370000200341002900ac9b403700002003410f412f101e2203450d012003200129000037000f200341276a200141186a2900003700002003411f6a200141106a290000370000200341176a200141086a290000370000200241306a41086a22014200370300200242003703302003412f200241306a1001200241206a41086a200129030037030020022002290330370320024002400240200241206a411041f8b3c200410041001002417f460d00200241306a41186a4200370300200241306a41106a42003703002001420037030020024200370330200241206a4110200241306a4120410010022201417f460d022001411f4d0d02200241186a2201200241306a41186a290300370300200241106a2204200241306a41106a290300370300200241086a2205200241306a41086a29030037030020022002290330370300200041013a000020002002290300370001200041096a2005290300370000200041116a2004290300370000200041196a20012903003700000c010b200041003a00000b2003101d200241d0006a24000f0b41df88c0004133103a000b410f41011020000b412f41011020000bf70401027f02400240024020012d0000417f6a2202410b4b0d004109210302400240024002400240024002400240024002400240024020020e0c000406020809070b05030a01000b41e000101f2202450d0c2002200141046a28020010c201200041046a2002360200200041106a200141106a290300370300200041086a200141086a290300370300200041013a00000f0b2000410c3a00000f0b200020012d00013a0001200041046a200141046a280200360200200041043a00000f0b20002001290001370001200041196a200141196a290000370000200041116a200141116a290000370000200041096a200141096a2900003700002000410a3a00000f0b200041046a200141046a280200360200410221030b200020033a00000f0b200020012d00013a0001200041046a200141046a280200360200200041033a00000f0b200041086a200141086a290300370300200041046a200141046a280200360200200041073a00000f0b41e000101f2202450d052002200141046a28020010c201200041046a2002360200200041086a200141086a290300370300200020012d00013a0001200041053a00000f0b200041046a200141046a280200360200200041063a00000f0b20002001290001370001200041096a200141096a290000370000200041116a200141116a290000370000200041196a200141196a290000370000200041216a200141216a2d00003a00002000410b3a00000f0b20002001290001370001200041196a200141196a290000370000200041116a200141116a290000370000200041096a200141096a290000370000200041083a00000f0b41c8f3c200102c000b41e00041081020000b41e00041081020000bb91c04047f027e027f027e23004180016b220224000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001280200417f6a2203410d4b0d00024002400240024002400240024020030e0e002b05090d0a0608040b030c0102000b200241206a200141086a10b90120004101360200200041106a200241206a41086a290300370300200041086a200229032037030020024180016a24000f0b200241206a200141086a10c301200041086a200241206a41d80010ce031a2000410d36020020024180016a24000f0b200128020422044102460d0b4101210320044101470d29200141086a10c40121010c160b2001410c6a2802002203417f4c0d29200128020421012003450d0e2003101f22040d0f200341011020000b4102210320012d000422044102460d0a20044101470d29200141086a280200210541e000101f2204450d2e20042001410c6a28020010c501410121030c0b0b200141086a28020022034102460d0b20034101470d292001410c6a22032d00004101470d14200141106a2802002104410121030c150b200241206a200141086a10c60120004107360200200041c0006a200241206a41386a290300370300200041386a200241206a41306a290300370300200041306a200241206a41286a290300370300200041286a200241206a41206a290300370300200041206a200241206a41186a290300370300200041186a200241206a41106a290300370300200041106a200241206a41086a290300370300200041086a200229032037030020024180016a24000f0b20004100360200200041086a200141086a29030037030020024180016a24000f0b200141086a22042d0000417f6a220341044b0d27024020030e05001d191b17000b2001410c6a10c4012101410121030c1d0b41032103200141086a22042d000022054103460d0b4102210320054102460d0a4101210320054101470d27200241046a200441066a2f00003b0100200241286a200141206a290200370300200241206a41106a200141286a2d00003a00002002200441026a2800003602002002200141186a290200370320200141106a2902002106200141096a2d000021010c0c0b200241206a200141086a10c10120004106360200200041286a200241206a41206a290300370300200041206a200241206a41186a290300370300200041186a200241206a41106a290300370300200041106a200241206a41086a290300370300200041086a200229032037030020024180016a24000f0b2000410a360200200041086a200141086a29030037030020024180016a24000f0b200141086a280200417f6a220341044b0d25024020030e05001b161814000b200141386a2903002106200141306a2903002107410121032001410c6a2d00004101470d1b200141106a28020021010c1c0b200241206a200141086a10c70120004105360200200041386a200241206a41306a290300370300200041306a200241206a41286a290300370300200041286a200241206a41206a290300370300200041206a200241206a41186a290300370300200041186a200241206a41106a290300370300200041106a200241206a41086a290300370300200041086a200229032037030020024180016a24000f0b41012103200141086a2d00004101470d082001410c6a28020021040c090b200241026a200141046a220441036a2d00003a0000200241206a41086a200141186a2902003703002002412d6a2001411d6a290000370000200220042f00013b01002002200141106a290200370320200141256a2d00004100472108200141286a28020021092001410c6a2802002104200141086a28020021050b200020022f01003b0005200020033a0004200020083a0025200041093602002000410c6a2004360200200041086a2005360200200041106a2002290320370200200041286a2009360200200041076a200241026a2d00003a0000200041186a200241206a41086a2903003702002000411d6a2002412d6a29000037000020024180016a24000f0b410121032001410c6a22042d00004101470d0a200141106a28020021040c0b0b410121040b20042001200310ce0321012000410c6a2003360200200041086a2003360200200020013602042000410b36020020024180016a24000f0b200141106a29030021060c010b20042d000141004721010b200020013a00092000200228020036010a20004104360200200041086a20033a0000200041106a2006370300200041186a20022903203703002000410e6a200241046a2f01003b0100200041206a200241206a41086a290300370300200041286a200241206a41106a29030037030020024180016a24000f0b200241086a200141186a290200370300200241106a200141206a2802003602002002200141106a290200370300200141246a350200200141286a310000422086842106200141096a2f00002001410b6a2d00004110747221052001410c6a2802002104410021030b200241206a41106a200241106a280200360200200241206a41086a200241086a2903003703002002200229030037032020032005410874722101410221030b200020033602042000410e3602002000410c6a2004360200200041086a2001360200200041106a2002290320370200200041246a2006370200200041186a200241206a41086a290300370200200041206a200241206a41106a28020036020020024180016a24000f0b200241fe006a200341036a2d00003a0000200241286a2001411c6a290200370300200241206a41106a200141246a290200370300200241386a2001412c6a2d00003a0000200220032f00013b017c2002200141146a290200370320200141106a2802002104410021030b2002411c6a41026a200241fc006a41026a2d00003a0000200241086a200241206a41086a290300370300200241106a200241206a41106a290300370300200241186a200241206a41186a280200360200200220022f017c3b011c20022002290320370300200141386a2903002106200141306a2903002107410121050c020b200241fe006a200441036a2d00003a0000200241286a2001411c6a290200370300200241206a41106a200141246a290200370300200241386a2001412c6a2d00003a0000200220042f00013b017c2002200141146a290200370320200141106a2802002104410021030b410221052002411c6a41026a200241fc006a41026a2d00003a0000200241086a200241206a41086a290300370300200241106a200241206a41106a290300370300200241186a200241206a41186a280200360200200220022f017c3b011c20022002290320370300200141c8006a290300210a200141c0006a290300210b200141386a2903002106200141306a29030021070b200020022f011c3b000d20004103360200200041c8006a200a370300200041c0006a200b370300200041386a2006370300200041306a20073703002000410c6a20033a0000200041086a2005360200200041106a2004360200200041146a20022903003702002000410f6a2002411e6a2d00003a00002000411c6a200241086a290300370200200041246a200241106a2903003702002000412c6a200241186a28020036020020024180016a24000f0b200141106a2903002106410521030c060b2001410c6a28020022034108762104410521010c090b41032103200241fe006a200441036a2d00003a0000200241286a200141206a290200370300200241206a41106a200141286a2d00003a0000200220042f00013b017c2002200141186a290200370320200141106a29020021062001410c6a28020021010c040b200241206a41106a200141206a2903003703002002200141186a2903003703282002200141106a2802003602202001410c6a28020022034108762104200141286a290300210b410321010c070b200141106a2903002106410421030c020b2001410c6a28020022034108762104410421010c050b41022103200241fc006a41026a200441036a2d00003a0000200241286a200141206a290200370300200241206a41106a200141286a2d00003a0000200220042f00013b017c2002200141186a290200370320200141296a2d00004100472104200141106a29020021062001410c6a28020021010b200020022f017c3b0009200020043a00292000200228010036012a200041086a20033a0000200041106a20063703002000410c6a2001360200200041186a20022903203703002000410b6a200241fe006a2d00003a0000200041206a200241206a41086a290300370300200041286a200241206a41106a2d00003a00002000412e6a200241046a2f01003b01002000410836020020024180016a24000f0b2002200141186a2903003703282002200141106a29030037032041022101410021030c020b200241086a2001411c6a290200370300200241106a200141246a2802003602002002200141146a290200370300200141286a3502002001412c6a31000042208684210b2001410d6a2f00002001410f6a2d0000411074722104200141106a2802002101410021030b2002412c6a200241086a290300370200200241346a200241106a2802003602002002200229030037022420022001360220410121010b2000410c360200200041386a2006370300200041306a2007370300200041086a2001360200200041106a2002290320370300200041286a200b3703002000410c6a2004410874200341ff017172360200200041186a200241206a41086a290300370300200041206a200241206a41106a29030037030020024180016a24000f0b10c801000b4184adc300102c000b102e000b41d0a7c400102c000b41888cc300102c000b419cadc300102c000b41bcc4c300102c000b41d4c4c300102c000b41e00041081020000bcd0803047f037e017f230041306b220224000240024020012d0000417f6a220341034b0d00024002400240024002400240024002400240024020030e0400030102000b200041d0006a200141d0006a280200360200200041c8006a200141c8006a290300370300200041c0006a200141c0006a290300370300200041386a200141386a290300370300200041306a200141306a290300370300200041286a200141286a290300370300200041206a200141206a290300370300200041186a200141186a290300370300200041106a200141106a290300370300200041086a200141086a290300370300200041013a0000200241306a24000f0b41012104200141046a2d00004101470d02200141086a28020021050c030b200141386a2903002106200141306a2903002107200141c0006a2903002108200241286a200141196a290000370300200241206a200141116a290000370300200241186a200141096a290000370300200220012900013703102001412c6a2802002203417f4c0d08200141246a28020021012003450d032003101f22040d04200341011020000b2001410c6a2802002203417f4c0d07200141046a2802002104200141106a29030021062003450d042003101f22010d05200341011020000b2002410e6a200141076a2d00003a0000200241106a41086a200141146a290000370300200241206a2001411c6a290000370300200241286a200141246a2d00003a00002002200141056a2f00003b010c20022001410c6a290000370310200141086a2800002105410021040b200141306a2802002203417f4c0d05200141c0006a2903002106200141386a2903002107200141286a2802002109200141c8006a2903002108024002402003450d002003101f22010d01200341011020000b410121010b20012009200310ce032101200041c0006a2006370300200041386a2007370300200041046a20043a0000200041086a2005360200200041c8006a2008370300200041306a20033602002000412c6a2003360200200041286a2001360200200041056a20022f010c3b0000200041076a2002410e6a2d00003a00002000410c6a2002290310370200200041146a200241106a41086a2903003702002000411c6a200241206a290300370200200041246a200241286a280200360200200041033a0000200241306a24000f0b410121040b20042001200310ce032101200041386a2006370300200041306a2007370300200041c0006a20083703002000412c6a2003360200200041286a2003360200200041246a2001360200200041043a000020002002290310370001200041096a200241186a290300370000200041116a200241206a290300370000200041196a200241286a290300370000200241306a24000f0b410121010b20012004200310ce0321012000410c6a2003360200200041086a2003360200200041046a2001360200200041106a2006370300200041023a0000200241306a24000f0b41a4a4c400102c000b102e000bd91c04057f027e027f027e23004180016b22012400024002400240024002400240024002400240024041e000101f2202450d0002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020002802002200280200417f6a2203410d4b0d00024002400240024002400240024020030e0e002c05090d0a0608040b030c0102000b200141086a200041086a10b90120024101360200200241106a200141086a41086a2903003703002002200129030837030820014180016a240020020f0b200141086a200041086a10c301200241086a200141086a41d80010ce031a2002410d36020020014180016a240020020f0b200028020422044102460d0b4101210320044101470d2a200041086a10c40121000c160b2000410c6a2802002203417f4c0d2a200028020421002003450d0e2003101f22040d0f200341011020000b4102210320002d000422044102460d0a20044101470d2a200041086a280200210541e000101f2204450d2f20042000410c6a28020010c501410121030c0b0b200041086a28020022034102460d0b20034101470d2a2000410c6a22032d00004101470d14200041106a2802002104410121030c150b200141086a200041086a10c60120024107360200200241c0006a200141086a41386a290300370300200241386a200141086a41306a290300370300200241306a200141086a41286a290300370300200241286a200141086a41206a290300370300200241206a200141086a41186a290300370300200241186a200141086a41106a290300370300200241106a200141086a41086a2903003703002002200129030837030820014180016a240020020f0b200241003602002002200041086a29030037030820014180016a240020020f0b200041086a22042d0000417f6a220341044b0d28024020030e05001d191b17000b2000410c6a10c4012100410121030c1d0b41032103200041086a22042d000022054103460d0b4102210320054102460d0a4101210320054101470d28200141e4006a200441066a2f00003b0100200141106a200041206a290000370300200141086a41106a200041286a2d00003a00002001200441026a2800003602602001200041186a290000370308200041106a2900002106200041096a2d000021000c0c0b200141086a200041086a10c10120024106360200200241286a200141086a41206a290300370300200241206a200141086a41186a290300370300200241186a200141086a41106a290300370300200241106a200141086a41086a2903003703002002200129030837030820014180016a240020020f0b200041086a29030021062002410a3602002002200637030820014180016a240020020f0b200041086a280200417f6a220341044b0d26024020030e05001b161814000b200041386a2903002106200041306a2903002107410121032000410c6a2d00004101470d1b200041106a28020021000c1c0b200141086a200041086a10c70120024105360200200241386a200141086a41306a290300370300200241306a200141086a41286a290300370300200241286a200141086a41206a290300370300200241206a200141086a41186a290300370300200241186a200141086a41106a290300370300200241106a200141086a41086a2903003703002002200129030837030820014180016a240020020f0b41012103200041086a2d00004101470d082000410c6a2802002104410021050c090b200141e0006a41026a200041046a220441036a2d00003a0000200141086a41086a200041186a290000370300200141156a2000411d6a290000370000200120042f00013b01602001200041106a290000370308200041256a2d00004100472108200041286a28020021092000410c6a2800002104200041086a28000021050b200220012f01603b0005200220033a00042002200436020c200220053602082002200129030837021020022009360228200220083a002520024109360200200241076a200141e2006a2d00003a0000200241186a200141106a2903003702002002411d6a200141156a29000037000020014180016a240020020f0b410121032000410c6a22042d00004101470d0a200041106a28020021040c0b0b410121040b20042000200310ce0321002002200336020c20022003360208200220003602042002410b36020020014180016a240020020f0b200041106a29030021060c010b20042d000141004721000b200220003a0009200220033a00082002200128026036010a2002200637031020022001290308370318200241043602002002410e6a200141e0006a41046a2f01003b0100200241206a200141106a290300370300200241286a200141186a29030037030020014180016a240020020f0b200141086a41086a200041186a290000370300200141086a41106a200041206a290000370300200141086a41186a200041286a2d00003a00002001200041106a290000370308200041096a2f00002000410b6a2d00004110747241087421052000410c6a2800002104410021030b200141e0006a41186a200141086a41186a280200360200200141e0006a41106a200141086a41106a290300370300200141e0006a41086a200141086a41086a2903003703002001200129030837036020032005722100410221030b2002200436020c2002200036020820022003360204200220012903603702102002410e360200200241186a200141e8006a290300370200200241206a200141f0006a290300370200200241286a200141e0006a41186a28020036020020014180016a240020020f0b200141fe006a200341036a2d00003a0000200141106a2000411c6a290200370300200141086a41106a200041246a290200370300200141206a2000412c6a2d00003a0000200120032f00013b017c2001200041146a290200370308200041106a2802002104410021030b200141046a41026a200141fc006a41026a2d00003a0000200141e0006a41086a200141086a41086a290300370300200141e0006a41106a200141086a41106a290300370300200141e0006a41186a200141086a41186a280200360200200120012f017c3b010420012001290308370360200041386a2903002106200041306a2903002107410121050c020b200141fe006a200441036a2d00003a0000200141106a2000411c6a290200370300200141086a41106a200041246a290200370300200141206a2000412c6a2d00003a0000200120042f00013b017c2001200041146a290200370308200041106a2802002104410021030b41022105200141046a41026a200141fc006a41026a2d00003a0000200141e0006a41086a200141086a41086a290300370300200141e0006a41106a200141086a41106a290300370300200141e0006a41186a200141086a41186a280200360200200120012f017c3b010420012001290308370360200041c8006a290300210a200041c0006a290300210b200041386a2903002106200041306a29030021070b2002200b37034020022007370330200220033a000c20022005360208200220012f01043b000d200220043602102002200129036037021420024103360200200241c8006a200a370300200241386a20063703002002410f6a200141066a2d00003a00002002411c6a200141e8006a290300370200200241246a200141f0006a2903003702002002412c6a200141f8006a28020036020020014180016a240020020f0b200041106a2903002106410521030c060b2000410c6a28020022034108762104410521000c090b41032103200141fe006a200441036a2d00003a0000200141106a200041206a290000370300200141086a41106a200041286a2d00003a0000200120042f00013b017c2001200041186a290000370308200041106a29000021062000410c6a28000021000c040b200141086a41106a200041206a2903003703002001200041186a2903003703102001200041106a2802003602082000410c6a28020022034108762104200041286a290300210b410321000c070b200041106a2903002106410421030c020b2000410c6a28020022034108762104410421000c050b41022103200141fc006a41026a200441036a2d00003a0000200141106a200041206a290000370300200141086a41106a200041286a2d00003a0000200120042f00013b017c2001200041186a290000370308200041296a2d00004100472104200041106a29000021062000410c6a28000021000b200220012f017c3b0009200220033a0008200220063703102002200036020c20022001290308370318200220043a00292002200128016036012a2002410b6a200141fe006a2d00003a0000200241206a200141086a41086a290300370300200241286a200141186a2d00003a00002002412e6a200141e4006a2f01003b01002002410836020020014180016a240020020f0b2001200041186a2903003703102001200041106a29030037030841022100410021030c020b200141e8006a2000411c6a290200370300200141e0006a41106a200041246a2802003602002001200041146a290200370360200041286a3502002000412c6a31000042208684210b2000410d6a2f00002000410f6a2d0000411074722104200041106a2802002100410021030b200141146a200141e8006a2903003702002001411c6a200141f0006a2802003602002001200129036037020c20012000360208410121000b2002200737033020022000360208200220012903083703102002200b3703282002410c360200200241386a200637030020022004410874200341ff01717236020c200241186a200141086a41086a290300370300200241206a200141186a29030037030020014180016a240020020f0b41e00041081020000b10c801000b4184adc300102c000b102e000b41d0a7c400102c000b41888cc300102c000b419cadc300102c000b41bcc4c300102c000b41d4c4c300102c000b41e00041081020000bb91c04047f027e027f027e23004180016b220224000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001280200417f6a2203410d4b0d00024002400240024002400240024020030e0e002b05090d0a0608040b030c0102000b200241206a200141086a10b90120004101360200200041106a200241206a41086a290300370300200041086a200229032037030020024180016a24000f0b200241206a200141086a10c301200041086a200241206a41d80010ce031a2000410d36020020024180016a24000f0b200128020422044102460d0b4101210320044101470d29200141086a10c40121010c160b2001410c6a2802002203417f4c0d29200128020421012003450d0e2003101f22040d0f200341011020000b4102210320012d000422044102460d0a20044101470d29200141086a280200210541e000101f2204450d2e20042001410c6a28020010c501410121030c0b0b200141086a28020022034102460d0b20034101470d292001410c6a22032d00004101470d14200141106a2802002104410121030c150b200241206a200141086a10c60120004107360200200041c0006a200241206a41386a290300370300200041386a200241206a41306a290300370300200041306a200241206a41286a290300370300200041286a200241206a41206a290300370300200041206a200241206a41186a290300370300200041186a200241206a41106a290300370300200041106a200241206a41086a290300370300200041086a200229032037030020024180016a24000f0b20004100360200200041086a200141086a29030037030020024180016a24000f0b200141086a22042d0000417f6a220341044b0d27024020030e05001d191b17000b2001410c6a10c4012101410121030c1d0b41032103200141086a22042d000022054103460d0b4102210320054102460d0a4101210320054101470d27200241046a200441066a2f00003b0100200241286a200141206a290200370300200241206a41106a200141286a2d00003a00002002200441026a2800003602002002200141186a290200370320200141106a2902002106200141096a2d000021010c0c0b200241206a200141086a10c10120004106360200200041286a200241206a41206a290300370300200041206a200241206a41186a290300370300200041186a200241206a41106a290300370300200041106a200241206a41086a290300370300200041086a200229032037030020024180016a24000f0b2000410a360200200041086a200141086a29030037030020024180016a24000f0b200141086a280200417f6a220341044b0d25024020030e05001b161814000b200141386a2903002106200141306a2903002107410121032001410c6a2d00004101470d1b200141106a28020021010c1c0b200241206a200141086a10c70120004105360200200041386a200241206a41306a290300370300200041306a200241206a41286a290300370300200041286a200241206a41206a290300370300200041206a200241206a41186a290300370300200041186a200241206a41106a290300370300200041106a200241206a41086a290300370300200041086a200229032037030020024180016a24000f0b41012103200141086a2d00004101470d082001410c6a28020021040c090b200241026a200141046a220441036a2d00003a0000200241206a41086a200141186a2902003703002002412d6a2001411d6a290000370000200220042f00013b01002002200141106a290200370320200141256a2d00004100472108200141286a28020021092001410c6a2802002104200141086a28020021050b200020022f01003b0005200020033a0004200020083a0025200041093602002000410c6a2004360200200041086a2005360200200041106a2002290320370200200041286a2009360200200041076a200241026a2d00003a0000200041186a200241206a41086a2903003702002000411d6a2002412d6a29000037000020024180016a24000f0b410121032001410c6a22042d00004101470d0a200141106a28020021040c0b0b410121040b20042001200310ce0321012000410c6a2003360200200041086a2003360200200020013602042000410b36020020024180016a24000f0b200141106a29030021060c010b20042d000141004721010b200020013a00092000200228020036010a20004104360200200041086a20033a0000200041106a2006370300200041186a20022903203703002000410e6a200241046a2f01003b0100200041206a200241206a41086a290300370300200041286a200241206a41106a29030037030020024180016a24000f0b200241086a200141186a290200370300200241106a200141206a2802003602002002200141106a290200370300200141246a350200200141286a310000422086842106200141096a2f00002001410b6a2d00004110747221052001410c6a2802002104410021030b200241206a41106a200241106a280200360200200241206a41086a200241086a2903003703002002200229030037032020032005410874722101410221030b200020033602042000410e3602002000410c6a2004360200200041086a2001360200200041106a2002290320370200200041246a2006370200200041186a200241206a41086a290300370200200041206a200241206a41106a28020036020020024180016a24000f0b200241fe006a200341036a2d00003a0000200241286a2001411c6a290200370300200241206a41106a200141246a290200370300200241386a2001412c6a2d00003a0000200220032f00013b017c2002200141146a290200370320200141106a2802002104410021030b2002411c6a41026a200241fc006a41026a2d00003a0000200241086a200241206a41086a290300370300200241106a200241206a41106a290300370300200241186a200241206a41186a280200360200200220022f017c3b011c20022002290320370300200141386a2903002106200141306a2903002107410121050c020b200241fe006a200441036a2d00003a0000200241286a2001411c6a290200370300200241206a41106a200141246a290200370300200241386a2001412c6a2d00003a0000200220042f00013b017c2002200141146a290200370320200141106a2802002104410021030b410221052002411c6a41026a200241fc006a41026a2d00003a0000200241086a200241206a41086a290300370300200241106a200241206a41106a290300370300200241186a200241206a41186a280200360200200220022f017c3b011c20022002290320370300200141c8006a290300210a200141c0006a290300210b200141386a2903002106200141306a29030021070b200020022f011c3b000d20004103360200200041c8006a200a370300200041c0006a200b370300200041386a2006370300200041306a20073703002000410c6a20033a0000200041086a2005360200200041106a2004360200200041146a20022903003702002000410f6a2002411e6a2d00003a00002000411c6a200241086a290300370200200041246a200241106a2903003702002000412c6a200241186a28020036020020024180016a24000f0b200141106a2903002106410521030c060b2001410c6a28020022034108762104410521010c090b41032103200241fe006a200441036a2d00003a0000200241286a200141206a290200370300200241206a41106a200141286a2d00003a0000200220042f00013b017c2002200141186a290200370320200141106a29020021062001410c6a28020021010c040b200241206a41106a200141206a2903003703002002200141186a2903003703282002200141106a2802003602202001410c6a28020022034108762104200141286a290300210b410321010c070b200141106a2903002106410421030c020b2001410c6a28020022034108762104410421010c050b41022103200241fc006a41026a200441036a2d00003a0000200241286a200141206a290200370300200241206a41106a200141286a2d00003a0000200220042f00013b017c2002200141186a290200370320200141296a2d00004100472104200141106a29020021062001410c6a28020021010b200020022f017c3b0009200020043a00292000200228010036012a200041086a20033a0000200041106a20063703002000410c6a2001360200200041186a20022903203703002000410b6a200241fe006a2d00003a0000200041206a200241206a41086a290300370300200041286a200241206a41106a2d00003a00002000412e6a200241046a2f01003b01002000410836020020024180016a24000f0b2002200141186a2903003703282002200141106a29030037032041022101410021030c020b200241086a2001411c6a290200370300200241106a200141246a2802003602002002200141146a290200370300200141286a3502002001412c6a31000042208684210b2001410d6a2f00002001410f6a2d0000411074722104200141106a2802002101410021030b2002412c6a200241086a290300370200200241346a200241106a2802003602002002200229030037022420022001360220410121010b2000410c360200200041386a2006370300200041306a2007370300200041086a2001360200200041106a2002290320370300200041286a200b3703002000410c6a2004410874200341ff017172360200200041186a200241206a41086a290300370300200041206a200241206a41106a29030037030020024180016a24000f0b10c801000b4184adc300102c000b102e000b41d0a7c400102c000b41888cc300102c000b419cadc300102c000b41bcc4c300102c000b41d4c4c300102c000b41e00041081020000bb20a01047f230041206b2202240002400240024002402001280200417f6a220341094b0d0002400240024002400240024002400240024002400240024002400240024002400240024020030e0a00060304010708050902000b2001410c6a2802002203417f4c0d124101210402402003450d00200128020421052003101f2204450d1420042005200310ce031a0b20002004360204200041013602002000410c6a2003360200200041086a2003360200200041106a200141106a280200360200200241206a24000f0b2000410536020020002001280204360204200241206a24000f0b2000410a360200200041086a200141086a290300370300200241206a24000f0b2001280204210441012103200141086a22052d00004101470d062001410c6a28020021050c070b2000410436020020002001280204360204200241206a24000f0b4101210320012d00044101470d06200141086a28020021010c070b2001410c6a2802002203417f4c0d0c2003450d09200128020421052003101f2204450d0e20042005200310ce031a0c0a0b4101210320012d00044101470d06200141086a28020021040c070b2000410736020020002001280204360204200241206a24000f0b20004109360200200041086a200141086a290300370300200241206a24000f0b2002411e6a200541036a2d00003a0000200241086a200141186a290200370300200241106a200141206a290200370300200241186a200141286a2d00003a0000200220052f00013b011c2002200141106a2902003703002001410c6a2802002105410021030b20002004360204200020022f011c3b0009200041086a20033a00002000410c6a2005360200200041106a20022903003702002000410b6a2002411e6a2d00003a0000200041186a200241086a290300370200200041206a200241106a290300370200200041286a200241186a2802003602002000412c6a2001412c6a29020037020020004103360200200241206a24000f0b2002411e6a200141046a220341036a2d00003a0000200241086a200141146a290200370300200241106a2001411c6a290200370300200241186a200141246a2d00003a0000200220032f00013b011c20022001410c6a290200370300200141086a2802002101410021030b200020022f011c3b0005200020033a000420004108360200200041086a20013602002000410c6a2002290300370200200041076a2002411e6a2d00003a0000200041146a200241086a2903003702002000411c6a200241106a290300370200200041246a200241186a280200360200200241206a24000f0b2002411e6a200141046a220341036a2d00003a0000200241086a200141146a290200370300200241106a2001411c6a290200370300200241186a200141246a2d00003a0000200220032f00013b011c20022001410c6a290200370300200141086a2802002104410021030b200020033a0004200020022f011c3b0005200041086a20043602002000410c6a2002290300370200200041386a200141386a290300370300200041306a200141306a290300370300200041076a2002411e6a2d00003a0000200041146a200241086a2903003702002000411c6a200241106a290300370200200041246a200241186a280200360200200141286a280200210120004106360200200041286a2001360200200241206a24000f0b410121040b20002004360204200041023602002000410c6a2003360200200041086a2003360200200041106a200141106a280200360200200241206a24000f0b41a8a9c300102c000b102e000b200341011020000b200341011020000be70d03047f017e057f230041206b220224000240024002400240024002400240024020012d0000417f6a2203410e4b0d000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020030e0f00090607030a0c080d050e02040b01000b41012103200141046a2d00004101470d0e200141086a28020021040c0f0b2001410c6a2802002205ad2206421b88a70d162006420586a72203417f4c0d16200141046a28020021072003450d112003101f2208450d172005450d120c1b0b2000410c3a0000200041046a200141046a280200360200200241206a24000f0b200041053a0000200041106a200141106a290300370300200041086a200141086a290300370300200041186a200141186a280200360200200241206a24000f0b2000410d3a0000200020012d00014100473a0001200241206a24000f0b2000410a3a0000200041086a200141086a290300370300200241206a24000f0b200041033a0000200041106a200141106a290300370300200041086a200141086a290300370300200241206a24000f0b200041043a0000200241206a24000f0b200041083a0000200020012d00013a0001200241206a24000f0b200041023a0000200041106a200141106a290300370300200041086a200141086a290300370300200241206a24000f0b2001410c6a280200220aad42247e2206422088a70d0d2006a72204417f4c0d0d200141046a28020021032004450d0a2004101f220b450d0f200a450d0b0c100b2000410e3a0000200041046a200141046a280200360200200241206a24000f0b200041073a0000200241206a24000f0b41012103200141046a2d00004101470d03200141086a28020021010c040b2000410b3a0000200041086a200141086a290300370300200241206a24000f0b2002411e6a200141076a2d00003a0000200241086a200141146a290000370300200241106a2001411c6a290000370300200241186a200141246a2d00003a00002002200141056a2f00003b011c20022001410c6a290000370300200141086a2800002104410021030b200041046a20033a0000200041056a20022f011c3b0000200041086a20043602002000410c6a2002290300370200200041306a200141306a290300370300200041286a200141286a290300370300200041076a2002411e6a2d00003a0000200041146a200241086a2903003702002000411c6a200241106a290300370200200041246a200241186a280200360200200141016a2d00002101200041013a0000200020013a0001200241206a24000f0b2002411e6a200141076a2d00003a0000200241086a200141146a290000370300200241106a2001411c6a290000370300200241186a200141246a2d00003a00002002200141056a2f00003b011c20022001410c6a290000370300200141086a2800002101410021030b200041093a0000200041056a20022f011c3b0000200041046a20033a0000200041086a20013602002000410c6a2002290300370200200041076a2002411e6a2d00003a0000200041146a200241086a2903003702002000411c6a200241106a290300370200200041246a200241186a280200360200200241206a24000f0b4101210820050d090b41002105410021010c090b4104210b200a0d050b410021040c050b41a880c400102c000b102e000b200341011020000b200441041020000b200a41246c2105410021042002411e6a2109200b210103400240024020032d00004101470d00200341046a2802002107410121080c010b2009200341036a2d00003a0000200341046a2800002107200341016a2f00002108200241186a200341206a2d00003a0000200241106a200341186a290000370300200241086a200341106a290000370300200220083b011c2002200341086a290000370300410021080b200341246a2103200120083a0000200141046a2007360200200141036a20092d00003a0000200141016a20022f011c3b0000200141206a200241186a280200360200200141186a200241106a290300370200200141106a200241086a290300370200200141086a2002290300370200200141246a2101200441016a21042005415c6a22050d000b0b200041063a00002000410c6a2004360200200041086a200a360200200041046a200b360200200241206a24000f0b20054105742104416020076b21092008210120072103034020012003290000370000200141186a200341186a290000370000200141106a200341106a290000370000200141086a200341086a290000370000200141206a2101200341206a2103200441606a22040d000b200720054105746a20096a41057641016a21010b2000410f3a00002000410c6a2001360200200041086a2005360200200041046a2008360200200241206a24000b0a004198dac300102c000ba9830105037f027e047f017e057f23004190056b220324000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d00002204417f6a2205410b4b0d000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020050e0c00070405020809060c030b01000b200141106a2903002106200141086a2903002107200141046a280200210420022d0001210820022d00002105200341d8026a22092002411a6a290100370300200341c0026a41106a200241126a290100370300200341c0026a41086a2002410a6a2901003703002003200241026a2901003703c0022005450d1d410121090c1e0b20022d0001210920022d00002105200341d8026a22042002411a6a290100370300200341d0026a200241126a290100370300200341c0026a41086a2002410a6a2901003703002003200241026a2901003703c0022005450d0c410121040c0d0b200141046a280200210420022d000120022d000072450d0e2004103c2004101d20012d00002104410021090c070b200341d8016a41186a200141196a290000370300200341d8016a41106a200141116a290000370300200341d8016a41086a200141096a290000370300200320012900013703d80120022d0001210920022d00002105200341c0026a41186a22042002411a6a290100370300200341c0026a41106a200241126a290100370300200341c0026a41086a2002410a6a2901003703002003200241026a2901003703c0022005450d0e410121040c0f0b200141046a280200210920012d0001210820022d0001210a20022d00002105200341d8026a22042002411a6a290100370300200341d0026a200241126a290100370300200341c0026a41086a2002410a6a2901003703002003200241026a2901003703c0022005450d10410121040c110b200141046a280200210a20012d0001210b20022d0001210920022d00002105200341d8026a22042002411a6a290100370300200341d0026a200241126a290100370300200341c0026a41086a2002410a6a2901003703002003200241026a2901003703c0022005450d12410121040c130b200341f0036a41186a200141196a290000370300200341f0036a41106a200141116a290000370300200341f0036a41086a200141096a290000370300200320012900013703f00320022d0001210920022d00002105200341c0026a41186a22042002411a6a290100370300200341c0026a41106a200241126a290100370300200341c0026a41086a2002410a6a2901003703002003200241026a2901003703c0022005450d14410121040c150b200141046a280200210820022d0001210920022d00002105200341d8026a22042002411a6a290100370300200341d0026a200241126a290100370300200341c0026a41086a2002410a6a2901003703002003200241026a2901003703c0022005450d19410121040c1a0b4101210920022d000120022d0000720d01200141046a28020010a5010c740b4101210920022d000120022d000072450d1a0b41c9b4c000210241282105200441ff017122044101460d0220044105470d772009450d77200141046a2201280200103c2001280200101d0c770b200141216a2d00002109200341286a41186a200141196a290000370300200341286a41106a200141116a290000370300200341286a41086a200141096a2900003703002003200129000137032820022d0001210820022d00002105200341c0026a41186a22042002411a6a290100370300200341c0026a41106a200241126a290100370300200341c0026a41086a2002410a6a2901003703002003200241026a2901003703c0022005450d19410121040c1a0b20022d0001210920022d00002105200341d8026a22042002411a6a290100370300200341d0026a200241126a290100370300200341c0026a41086a2002410a6a2901003703002003200241026a2901003703c0022005450d1b410121040c1c0b200141046a2201280200103c2001280200101d0c740b20034180056a41026a20032d00c2023a0000200341d8046a41086a200341d3026a290000370300200341d8046a410d6a22082004290000370000200320032f01c0023b018005200320032900cb023703d80441012104200941ff01714101470d0020032800c302210220032800c7022105200341f0036a41026a20034180056a41026a2d00003a0000200341c0026a41086a200341d8046a41086a290300370300200341c0026a410d6a2008290000370000200320032f0180053b01f003200320032903d8043703c002410021040c010b412a210541f1b4c00021020b200341b8016a41026a2209200341f0036a41026a2d00003a0000200341b0036a41086a2208200341c0026a41086a290300370300200341b0036a41106a200341c0026a41106a290300370300200320032f01f0033b01b801200320032903c0023703b00320040d30200341b3026a2008290300370000200341b8026a200341b0036a410d6a290000370000200320032f01b8013b01a002200320053600a702200320023600a302200320032903b0033700ab02200320092d00003a00a2024115101f2202450d3d2002410d6a41002900c89b40370000200241086a41002900c39b40370000200241002900bb9b40370000200241154135101e2202450d3e200220032903a0023700152002412d6a200341b8026a290300370000200241256a200341a0026a41106a2903003700002002411d6a200341a0026a41086a29030037000020034180056a41086a2205420037030020034200370380052002413520034180056a1001200341d8046a41086a200529030037030020032003290380053703d804200341d8046a411041f8b3c20041004100100221052002101d2005417f460d214115101f2202450d4b2002410d6a41002900c89b40370000200241086a41002900c39b40370000200241002900bb9b40370000200241154135101e2202450d4c200220032903a0023700152002412d6a200341a0026a41186a290300370000200241256a200341a0026a41106a2903003700002002411d6a200341a0026a41086a2903003700004200210c20034180056a41086a2205420037030020034200370380052002413520034180056a1001200341f0046a41086a200529030037030020032003290380053703f004200341c0026a200341f0046a105c024020032d00e102220941024622050d00200341f0046a411010090b200341d0036a41086a2208200341ea026a290100370300200341d0036a41106a200341f2026a290100370300200341d0036a41186a200341fa026a290100370300200341b0036a41086a220a2003418b036a290000370300200341b0036a41106a20034193036a290000370300200341b0036a41186a2003419b036a290000370300200320032901e2023703d003200320034183036a2900003703b00320034182036a2d0000210420033000e00221062002101d20050d6b200341d8016a41186a200341d0036a41186a290300370300200341d8016a41106a200341d0036a41106a290300370300200341d8016a41086a200829030037030020034188016a41086a200a29030037030020034188016a41106a200341b0036a41106a29030037030020034188016a41186a200341b0036a41186a290300370300200320032903d0033703d801200320032903b00337038801410021020240200441ff01714101470d004115101f2202450d5e2002410d6a41002900c89b40370000200241086a41002900c39b40370000200241002900bb9b40370000200241154135101e2202450d5f20022003290388013700152002412d6a200341a0016a290300370000200241256a20034198016a2903003700002002411d6a20034188016a41086a2903003700000b20094101470d2a4115101f2205450d5f2005410d6a41002900c89b40370000200541086a41002900c39b40370000200541002900bb9b40370000200541154135101e2205450d60200520032903d8013700152005412d6a200341d8016a41186a290300370000200541256a200341d8016a41106a2903003700002005411d6a200341d8016a41086a29030037000020034180056a41086a2208420037030020034200370380052005413520034180056a1001200341f0046a41086a200829030037030020032003290380053703f004200341c0026a200341f0046a105c20032d00e1024102460d61200341f0036a200341c0026a41c20010ce031a200341f0036a41c2006a20043a0000200341b3046a200329038801370000200341bb046a20034188016a41086a290300370000200341c3046a20034188016a41106a290300370000200341cb046a20034188016a41186a29030037000020034180056a41086a2204420037030020034200370380052005413520034180056a1001200341f0046a41086a200429030037030020032003290380053703f004200341003602c802200342013703c0024120101f2204450d62200420032903f003370000200441086a200341f0036a41086a290300370000200441106a200341f0036a41106a290300370000200441186a200341f0036a41186a290300370000200342a080808080043702c402200320043602c0022004412041c000101e2204450d63200420034190046a2d00003a0020200342c080808090043702c402200320043602c00220034191046a200341c0026a10ca0120032802c4022104200341f0046a411020032802c0022208200341c8026a280200100302402004450d002008101d0b2005101d410121082002450d340c680b200141086a290300210720012d0001210220034180056a41086a220542003703002003420037038005418cb9c000410d20034180056a1001200341f0046a41086a200529030037030020032003290380053703f004420021060240200341f0046a411041f8b3c200410041001002417f460d00200342003703c002200341f0046a4110200341c0026a41084100100241016a41084d0d3a20032903c00221060b20034180056a41086a22054200370300200342003703800541869bc000411620034180056a1001200341f0046a41086a200529030037030020032003290380053703f004200341f0046a411041f8b3c200410041001002417f460d23200342003703c002200341f0046a4110200341c0026a41084100100241016a41084d0d3a20032903c002210c0c240b20034180056a41026a20032d00c2023a0000200341d8046a41086a200341d3026a290000370300200341d8046a410d6a22082004290000370000200320032f01c0023b018005200320032900cb023703d80441012104200941ff01714101470d0020032800c302210220032800c702210520034188016a41026a20034180056a41026a2d00003a0000200341c0026a41086a200341d8046a41086a290300370300200341c0026a410d6a2008290000370000200320032f0180053b018801200320032903d8043703c002410021040c010b412a210541f1b4c00021020b200341e8006a41026a220920034188016a41026a2d00003a0000200341d0036a41086a2208200341c0026a41086a290300370300200341d0036a41106a200341c0026a41106a290300370300200320032f0188013b0168200320032903c0023703d00320040d2c20034183046a200829030037000020034188046a200341d0036a410d6a290000370000200320032f01683b01f003200320053600f703200320023600f303200320032903d0033700fb03200320092d00003a00f203200341c0026a200341d8016a10c0014101210420032d00c0024101470d18200341ba016a20032d00c3023a0000200341b0036a41086a200341d4026a290200370300200341b0036a410d6a200341d9026a290000370000200320032f00c1023b01b8012003200341cc026a2902003703b003200341c0026a41086a28020021054100210420032802c40221020c190b20034180056a41026a20032d00c2023a0000200341d8046a41086a200341d3026a290000370300200341d8046a410d6a220b2004290000370000200320032f01c0023b018005200320032900cb023703d80441012104200a41ff01714101470d0020032800c302210220032800c7022105200341f0036a41026a20034180056a41026a2d00003a0000200341c0026a41086a200341d8046a41086a290300370300200341c0026a410d6a200b290000370000200320032f0180053b01f003200320032903d8043703c002410021040c010b41f1b4c0002102412a21050b200341b8016a41026a220a200341f0036a41026a2d00003a0000200341b0036a41086a220b200341c0026a41086a290300370300200341b0036a41106a200341c0026a41106a290300370300200320032f01f0033b01b801200320032903c0023703b00320040d29200341c8006a41026a2204200a2d00003a0000200341a0026a41086a220a200b290300370300200341a0026a410d6a220b200341b0036a410d6a290000370000200320032f01b8013b0148200320032903b0033703a002200341d3026a200a290300370000200341d8026a200b290000370000200320053600c702200320023600c302200320042d00003a00c202200320032f01483b01c002200320032903a0023700cb02200341186a200341c0026a2009200810cb01200328021c2105200328021821020c290b20034180056a41026a20032d00c2023a0000200341d8046a41086a200341d3026a290000370300200341d8046a410d6a22082004290000370000200320032f01c0023b018005200320032900cb023703d80441012104200941ff01714101470d0020032800c302210220032800c7022105200341f0036a41026a20034180056a41026a2d00003a0000200341c0026a41086a200341d8046a41086a290300370300200341c0026a410d6a2008290000370000200320032f0180053b01f003200320032903d8043703c002410021040c010b41f1b4c0002102412a21050b200341b8016a41026a2209200341f0036a41026a2d00003a0000200341b0036a41086a2208200341c0026a41086a290300370300200341b0036a41106a200341c0026a41106a290300370300200320032f01f0033b01b801200320032903c0023703b00320040d2620034183046a200829030037000020034188046a200341b0036a410d6a290000370000200320032f01b8013b01f003200320053600f703200320023600f303200320032903b0033700fb03200320092d00003a00f203200341c0026a200341f0036a10c0014101210420032d00c0024101470d14200341ca006a20032d00c3023a000020034188016a41086a200341d4026a29020037030020034188016a410d6a200341d9026a290000370000200320032f00c1023b01482003200341cc026a29020037038801200341c0026a41086a28020021054100210420032802c40221020c150b20034180056a41026a20032d00c2023a0000200341d8046a41086a200341d3026a290000370300200341d8046a410d6a22082004290000370000200320032f01c0023b018005200320032900cb023703d80441012104200941ff01714101470d0020032800c302210220032800c7022105200341d8016a41026a20034180056a41026a2d00003a0000200341c0026a41086a200341d8046a41086a290300370300200341c0026a410d6a2008290000370000200320032f0180053b01d801200320032903d8043703c002410021040c010b41f1b4c0002102412a21050b200341b8016a41026a2209200341d8016a41026a2d00003a0000200341b0036a41086a2208200341c0026a41086a290300370300200341b0036a41106a200341c0026a41106a290300370300200320032f01d8013b01b801200320032903c0023703b00320040d23200341c8006a41026a20092d00003a0000200341a0026a41086a2008290300370300200341a0026a410d6a200341b0036a410d6a290000370000200320032f01b8013b0148200320032903b0033703a002410f101f2204450d32200441076a41002900b39b40370000200441002900ac9b403700002004410f412f101e2204450d33200420032903f00337000f200441276a200341f0036a41186a22082903003700002004411f6a200341f0036a41106a220a290300370000200441176a200341f0036a41086a220b29030037000020034180056a41086a2209420037030020034200370380052004412f20034180056a1001200341d8046a41086a200929030037030020032003290380053703d804200341d8046a411041f8b3c20041004100100221092004101d2009417f460d16419fb3c0002102410f21050c230b20034180056a41026a20032d00c2023a0000200341d8046a41086a200341d3026a290000370300200341d8046a410d6a220a2009290000370000200320032f01c0023b018005200320032900cb023703d80441012109200841ff01714101470d0020032800c302210220032800c7022105200341d8016a41026a20034180056a41026a2d00003a0000200341c0026a41086a200341d8046a41086a290300370300200341c0026a410d6a200a290000370000200320032f0180053b01d801200320032903d8043703c002410021090c010b41f1b4c0002102412a21050b200341b8016a41026a2208200341d8016a41026a2d00003a0000200341b0036a41086a220a200341c0026a41086a290300370300200341b0036a41106a200341c0026a41106a290300370300200320032f01d8013b01b801200320032903c0023703b00320090d0b20034183046a200a290300370000200341f0036a41186a200341bd036a290000370000200320032f01b8013b01f003200320053600f703200320023600f303200320032903b0033700fb03200320082d00003a00f20320034180056a41086a2202420037030020034200370380054189b2c000411820034180056a1001200341f0046a41086a200229030037030020032003290380053703f004200341f0046a411041f8b3c200410041001002417f460d0a200342003703c802200342003703c002200341f0046a4110200341c0026a4110410010022202417f460d2c2002410f4d0d2c20032903c002200756200341c8026a290300220c200656200c2006511b450d0a41a1b2c0002102410d21050c0b0b20034180056a41026a20032d00c2023a0000200341d8046a41086a200341d3026a290000370300200341d8046a410d6a220a2004290000370000200320032f01c0023b018005200320032900cb023703d80441012104200941ff01714101470d0020032800c302210220032800c7022105200341d8016a41026a20034180056a41026a2d00003a0000200341c0026a41086a200341d8046a41086a290300370300200341c0026a410d6a200a290000370000200320032f0180053b01d801200320032903d8043703c002410021040c010b41f1b4c0002102412a21050b200341b8016a41026a2209200341d8016a41026a2d00003a0000200341b0036a41086a220a200341c0026a41086a290300370300200341b0036a41106a200341c0026a41106a290300370300200320032f01d8013b01b801200320032903c0023703b00320040d1d20034183046a200a290300370000200341f0036a41186a200341bd036a290000370000200320032f01b8013b01f003200320053600f703200320023600f303200320032903b0033700fb03200320092d00003a00f203200341c0026a200810920120032802d002220a450d0f200341dc026a280200210b200341c0026a41186a280200210220032802d4022104200341106a200341f0036a20032902c402220642208620033502c002842207200341cc026a350200422086200642208884220610cc012003280210450d144185b3c0002102411a21052004450d1d200a101d0c1d0b200141046a2802002102200341f0036a200141086a290300220610ad01024020032802f803220520024d0d00024020032802f003200241e8006c6a2202280200410f460d002002103c0b2002410f360200200241046a200341c0026a41e40010ce031a0b4117101f2202450d342002410f6a41002900f89c40370000200241086a41002900f19c40370000200241002900e99c4037000020024117412e101e2202450d352002200637001720034180056a41086a2204420037030020034200370380052002411f20034180056a1001200341f0046a41086a200429030037030020032003290380053703f004200341103602c4022003200341f0046a3602c002200341f0036a200341c0026a10ae012002101d20032802f003210402402005450d00200541e8006c210520042102034002402002280200410f460d002002103c0b200241e8006a2102200541987f6a22050d000b0b20032802f403450d582004101d0c580b20034180056a41026a20032d00c2023a0000200341d8046a41086a200341d3026a290000370300200341d8046a410d6a220a2004290000370000200320032f01c0023b018005200320032900cb023703d80441012104200841ff01714101470d0020032800c302210220032800c7022105200341f0036a41026a20034180056a41026a2d00003a0000200341c0026a41086a200341d8046a41086a290300370300200341c0026a410d6a200a290000370000200320032f0180053b01f003200320032903d8043703c002410021040c010b412a210541f1b4c00021020b200341b8016a41026a2208200341f0036a41026a2d00003a0000200341b0036a41086a220a200341c0026a41086a290300370300200341b0036a41106a200341c0026a41106a290300370300200320032f01f0033b01b801200320032903c0023703b00320040d19200341fb006a200a290300370000200341e8006a41186a2204200341b0036a410d6a290000370000200320032f01b8013b01682003200536006f2003200236006b200320032903b003370073200320082d00003a006a200341a0026a41186a2004290300370300200341a0026a41106a200341e8006a41106a290300370300200341a0026a41086a200341e8006a41086a290300370300200320032903683703a00220034188016a41186a200341286a41186a29030037030020034188016a41106a200341286a41106a29030037030020034188016a41086a200341286a41086a290300370300200320093a00a80120032003290328370388014115101f2202450d2a2002410d6a41002900c89b40370000200241086a41002900c39b40370000200241002900bb9b40370000200241154135101e2202450d2b200220032903a0023700152002412d6a200341a0026a41186a290300370000200241256a200341a0026a41106a2903003700002002411d6a200341a0026a41086a29030037000020034180056a41086a2204420037030020034200370380052002413520034180056a1001200341f0046a41086a200429030037030020032003290380053703f004200341f0036a200341f0046a105c20032d00910422044102470d0920034180056a41086a22044200370300200342003703800541939dc000411d20034180056a1001200341f0046a41086a2209200429030037030020032003290380053703f004200341f0046a411041f8b3c200410041001002417f460d12200341d8026a4200370300200341c0026a41106a4200370300200341c0026a41086a4200370300200342003703c002200341f0046a4110200341c0026a4120410010022204417f460d362004411f4d0d3620034180056a41026a220b20032d00c2023a0000200341d8046a41086a2204200341d3026a290000370300200341d8046a410d6a2209200341d8026a290000370000200320032f01c0023b018005200320032900cb023703d80420032800c302210820032800c702210a200341d0016a41026a220d200b2d00003a0000200341b8016a41086a220b2004290300370300200341b8016a410d6a220e2009290000370000200320032f0180053b01d001200320032903d8043703b801200341d4016a41026a200d2d00003a00002004200b2903003703002009200e290000370000200320032f01d0013b01d401200320032903b8013703d8044115101f2204450d3a2004410d6a41002900c89b40370000200441086a41002900c39b40370000200441002900bb9b40370000200441154135101e2204450d3b200420032f01d4013b00152004200a36001c20042008360018200420032903d804370020200441176a200341d4016a41026a2d00003a0000200441286a200341d8046a41086a2903003700002004412d6a200341e5046a29000037000020034180056a41086a2209420037030020034200370380052004413520034180056a1001200341f0046a41086a220b200929030037030020032003290380053703f004200341c0026a200341f0046a105c20032d00e1024102460d3c200341d0036a41186a220d200341c0026a41186a290300370300200341d0036a41106a220e200341c0026a41106a290300370300200341d0036a41086a220f200341c0026a41086a290300370300200320032903c0023703d00320032d00e0022110200341d8016a200341e1026a41c20010ce031a200341b0036a41186a2211200d290300370300200341b0036a41106a220d200e290300370300200341b0036a41086a220e200f290300370300200320032903d0033703b003200341c0026a200341d8016a41c20010ce031a200341d8016a41186a220f2011290300370300200341d8016a41106a2211200d290300370300200341d8016a41086a200e290300370300200320032903b0033703d80120032d00e102210d2009420037030020034200370380052004413520034180056a1001200b200929030037030020032003290380053703f0044120101f2209450d3d200920032903d801370000200941186a200f290300370000200941106a2011290300370000200941086a200341d8016a41086a2903003700002009412041c000101e2209450d3e200941013a0021200920103a0020200941c000418001101e2209450d3f200920032903a0023700222009413a6a200341a0026a41186a290300370000200941326a200341a0026a41106a2903003700002009412a6a200341a0026a41086a290300370000200341e2026a4100200d4101461b220b450d15200941c2006a41013a0000200941db006a200b41186a290000370000200941d3006a200b41106a290000370000200941cb006a200b41086a2900003700002009200b29000037004341e300210b0c160b20034180056a41026a20032d00c2023a0000200341d8046a41086a200341d3026a290000370300200341d8046a410d6a22082004290000370000200320032f01c0023b018005200320032900cb023703d80441012104200941ff01714101470d0020032800c302210220032800c7022105200341f0036a41026a20034180056a41026a2d00003a0000200341c0026a41086a200341d8046a41086a290300370300200341c0026a410d6a2008290000370000200320032f0180053b01f003200320032903d8043703c002410021040c010b412a210541f1b4c00021020b200341b8016a41026a2209200341f0036a41026a22082d00003a0000200341b0036a41086a220a200341c0026a41086a220b290300370300200341b0036a41106a200341c0026a41106a290300370300200320032f01f0033b01b801200320032903c0023703b00320040d16200341c8006a41026a220420092d00003a0000200341a0026a41086a2209200a290300370300200341a0026a410d6a220a200341b0036a410d6a290000370000200320032f01b8013b0148200320032903b0033703a002200820042d00003a0000200b2009290300370300200341c0026a410d6a200a290000370000200320032f01483b01f003200320032903a0023703c002410f101f2204450d29200441076a41002900b39b40370000200441002900ac9b403700002004410f412f101e2204450d2a200420032f01f0033b000f2004200536001620042002360012200420032903c00237001a200441116a200341f2036a2d00003a0000200441226a200341c0026a41086a290300370000200441276a200341cd026a29000037000020034180056a41086a2202420037030020034200370380052004412f20034180056a1001200341d8046a41086a200229030037030020032003290380053703d804200341d8046a411010092004101d41012109410121080c4d0b200341086a200341f0036a2007200610cc012003280208450d0b41aeb2c0002102411a21050b2004103c2004101d410021084101210920012d000022044101470d540c530b410b2105419a80c10021020b200341c8006a41026a2209200341b8016a41026a2d00003a000020034188016a41086a2208200341b0036a41086a29030037030020034188016a41106a200341b0036a41106a290300370300200320032f01b8013b0148200320032903b0033703880120040d12200341d3026a2008290300370000200341c0026a41186a220420034195016a290000370000200320032f01483b01c002200320053600c702200320023600c30220032003290388013700cb02200320092d00003a00c202200341c0026a200341f0036a412010d003450d0a41aeb3c0002102410b21050c120b410b2105419a80c10021020b200341e8006a41026a2209200341c8006a41026a2d00003a0000200341d0036a41086a220820034188016a41086a290300370300200341d0036a41106a20034188016a41106a290300370300200320032f01483b016820032003290388013703d00320040d10200341d8016a41026a220420092d00003a0000200341a0026a41086a22092008290300370300200341a0026a410d6a2208200341d0036a410d6a290000370000200320032f01683b01d801200320032903d0033703a002200341d3026a2009290300370000200341d8026a2008290000370000200320053600c702200320023600c302200320042d00003a00c202200320032f01d8013b01c002200320032903a0023700cb02200341206a200341c0026a200a200b10cb0120032802242105200328022021020c100b200341c8006a41186a200341aa046a290100370300200341c8006a41106a200341a2046a290100370300200341c8006a41086a2003419a046a290100370300200341d0036a41026a200341b5046a2d00003a0000200341d8016a41086a200341c6046a290100370300200341e5016a200341cb046a29000037000020032003290192043703482003200341b3046a2f00003b01d0032003200341be046a2901003703d801200341ba046a280100210a200341b6046a2801002108200341b2046a2d000021090c0e0b41b9b3c0002102410d21050c0e0b41e1b2c0002102412421050c0d0b200341c0026a41186a2008290300370300200341c0026a41106a200a290300370300200341c0026a41086a200b290300370300200320032903f0033703c00220034188016a41026a200341c8006a41026a2d00003a0000200341d8016a41086a200341a0026a41086a290300370300200341d8016a410d6a200341a0026a410d6a290000370000200320032f01483b018801200320032903a0023703d801410f101f2204450d2a200441076a41002900b39b40370000200441002900ac9b403700002004410f412f101e2209450d2b200920032903c00237000f200941276a200341c0026a41186a2903003700002009411f6a200341c0026a41106a290300370000200941176a200341c0026a41086a29030037000020034180056a41086a2204420037030020034200370380052009412f20034180056a1001200341f0046a41086a200429030037030020032003290380053703f0044120101f2204450d2c200420032f0188013b00002004200536000720042002360003200420032903d80137000b200441026a20034188016a41026a2d00003a0000200441136a200341d8016a41086a290300370000200441186a200341e5016a290000370000200341f0046a41102004412010032004101d2009101d0c480b42e807210c0b200341c0026a200441e00010ce031a200341f0036a200c20067c200341c0026a20022007109501200341f8036a280200210520032802f403210220032802f003210a2004101d410121084100210920024100200a4101461b210220012d000022044101470d4a0c490b20034180056a41086a22024200370300200342003703800541c8b2c000411920034180056a1001200341f0046a41086a200229030037030020032003290380053703f004410021090240200341f0046a411041f8b3c200410041001002417f460d00200341003602c002200341f0046a4110200341c0026a41044100100241016a41044d0d2120032802c00221090b20034180056a41086a22054200370300200342003703800541c8b2c000411920034180056a1001200341f0046a41086a2208200529030037030020032003290380053703f0042003200941016a3602c002200341f0046a4110200341c0026a410410034120101f2202450d31200220032903f003370000200341d4026a428180808010370200200241186a200341f0036a41186a290300370000200241106a200341f0036a41106a290300370000200241086a200341f0036a41086a290300370000200320073703c002200320023602d002200320063703c8022009200341c0026a10cd0120054200370300200342003703800541939cc000411520034180056a10012008200529030037030020032003290380053703f00441002102200341f0046a411041f8b3c200410041001002417f460d0a200342103702dc012003200341f0046a3602d801200341c0026a200341d8016a10910120032802c0022208450d35200341c8026a280200210220032802c402210a0c0b0b200341c8006a41186a2209200341f0036a41186a290300370300200341c8006a41106a220d200341f0036a41106a290300370300200341c8006a41086a220e200341f0036a41086a290300370300200320032903f00337034820042002470d03200441016a22052004490d222004410174220f20052005200f491b220fad420586220c422088a70d22200ca722054100480d222004450d0f200a20044105742005101e220a0d100c3c0b2004200341d8016a41186a290300370300200341c0026a41106a200341d8016a41106a290300370300200341c0026a41086a200341d8016a41086a290300370300200320032903d8013703c002410f101f2205450d3041002102200541076a41002900b39b40370000200541002900ac9b403700002005410f412f101e2205450d31200520032903c00237000f200541276a200341d8026a2903003700002005411f6a200341c0026a41106a290300370000200541176a200341c0026a41086a29030037000020034180056a41086a2204420037030020034200370380052005412f20034180056a1001200341d8046a41086a200429030037030020032003290380053703d804200341d8046a411010092005101d0c440b20044200370300200342003703800541939dc000411d20034180056a10012009200429030037030020032003290380053703f0044120101f2204450d31200420032903a002370000200441186a200341a0026a41186a290300370000200441106a200341a0026a41106a290300370000200441086a200341a0026a41086a290300370000200341f0046a41102004412010032004101d410021090c040b200441ff01714101470d0820034180056a41086a22054200370300200342003703800541939dc000411d20034180056a1001200341f0046a41086a200529030037030020032003290380053703f0044120101f2205450d3a2005200329038801370000200541186a20034188016a41186a290300370000200541106a20034188016a41106a290300370000200541086a20034188016a41086a290300370000200341f0046a41102005412010032005101d410021054100210820020d3d0c090b2004210f0c0c0b200941c2006a41003a000041c300210b0b200341f0046a41102009200b10032009101d2004101d20034180056a41086a22044200370300200342003703800541939dc000411d20034180056a1001200341f0046a41086a200429030037030020032003290380053703f0044120101f2204450d29200420032903a002370000200441186a200341a0026a41186a290300370000200441106a200341a0026a41106a290300370000200441086a200341a0026a41086a290300370000200341f0046a41102004412010032004101d200341d0036a41026a200341d4016a41026a2d00003a0000200341d8016a41086a200341d8046a41086a290300370300200341d8016a410d6a200341d8046a410d6a290000370000200320032f01d4013b01d003200320032903d8043703d801410121090b410021040b200341e5026a20093a0000200341ed026a200a360000200341e9026a2008360000200341c0026a410d6a200341c8006a41086a290300370000200341d5026a200341c8006a41106a290300370000200341dd026a200341c8006a41186a290300370000200341e6026a20032f01d0033b0100200341e8026a200341d2036a2d00003a0000200341f1026a20032903d801370000200341f9026a200341d8016a41086a290300370000200341fe026a200341d8016a410d6a290000370000200320043a00c402200320032903483700c502200320034188016a3602c00220034180056a41086a2204420037030020034200370380052002413520034180056a1001200341d8046a41086a200429030037030020032003290380053703d804200341003602f803200342013703f0034120101f2204450d152004200329038801370000200441086a20034188016a41086a290300370000200441106a20034188016a41106a290300370000200441186a20034188016a41186a290300370000200342a080808080043702f403200320043602f0032004412041c000101e2204450d162004200341a8016a2d00003a0020200342c080808090043702f403200320043602f003200341c0026a410472200341f0036a10ca0120032802f4032104200341d8046a411020032802f0032209200341f0036a41086a280200100302402004450d002009101d0b2002101d200342e4cab5fbb6ccdcb0e3003703b001200341b0016a200341e8006a427f109d01200341c0026a41086a41073a0000200341c9026a2003290368370000200341d1026a200341e8006a41086a290300370000200341d9026a200341e8006a41106a290300370000200341e1026a200341e8006a41186a290300370000200341e9026a2003290328370000200341f1026a200341286a41086a290300370000200341f9026a200341286a41106a29030037000020034181036a200341286a41186a290300370000200341053a00c002200341c0026a108b01410021020b410121094101210820012d000022044101460d3e0c3f0b410821084100210a0b200341c0026a200410c201200341c8006a41186a220b200341f0036a41186a290300370300200341c8006a41106a220d200341f0036a41106a290300370300200341c8006a41086a220e200341f0036a41086a290300370300200320032903f003370348200a2002470d33200241016a22052002490d172002410174220a20052005200a491b220aad4288017e220c422088a70d17200ca722054100480d172002450d02200820024188016c2005101e2208450d030c330b20034180056a41086a22054200370300200342003703800541939dc000411d20034180056a1001200341d8046a41086a200529030037030020032003290380053703d804200341d8046a41101009410021054100210820020d340b41002104200820054572450d340c350b2005101f22080d300b200541081020000b2005101f220a450d2c0b200a20024105746a22052003290348370000200541186a2009290300370000200541106a200d290300370000200541086a200e29030037000041012109200341c0026a41186a200241016a360200200341d4026a200f360200200320063703c802200320073703c0022003200b3602dc022003200a3602d0022008200341c0026a10cd01410021020c350b200341d4026a4101360200200341183602f403200341c0adc4003602f003200342013702c402200341c8adc4003602c0022003200341f0036a3602d002200341c0026a41e0f3c20010cf01000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b411541011020000b413541011020000b410f41011020000b412f41011020000b411541011020000b413541011020000b410f41011020000b412f41011020000b412041011020000b41c00041011020000b41df88c0004133103a000b411741011020000b412e41011020000b1021000b411541011020000b413541011020000b41df88c0004133103a000b410f41011020000b412f41011020000b412041011020000b411541011020000b413541011020000b4193f1c100419f01103a000b412041011020000b41c00041011020000b41800141011020000b412041011020000b412041011020000b410f41011020000b412f41011020000b412041011020000b41df88c0004133103a000b411541011020000b413541011020000b411541011020000b413541011020000b41f5d7c10041d300103a000b412041011020000b41c00041011020000b200541011020000b412041011020000b200820024188016c220f6a200341c0026a41e00010ce0322052009360260200541fc006a200b290300370200200541f4006a200d290300370200200541ec006a200e290300370200200520032903483702642003200241016a22023602c8022003200a3602c402200320083602c00220034180056a41086a22054200370300200342003703800541939cc000411520034180056a1001200341f0046a41086a200529030037030020032003290380053703f004200341103602dc012003200341f0046a3602d801200341c0026a200341d8016a10930102402002450d00200f4188016a21052008210203402002103c20024188016a2102200541f87e6a22050d000b0b0240200a450d002008101d0b200341d8026a2006370300200341d0026a2007370300200341cc026a200936020041002108200341c8026a41003a0000200341053a00c002200341c0026a108b012004103c2004101d410121090b4100210220012d000022044101470d080c070b20034180056a41086a2204420037030020034200370380052002413520034180056a1001200341f0046a41086a220a200429030037030020032003290380053703f004200341c0026a200341f0046a105c20032d00e1024102460d0b200341f0036a200341c0026a41e30010ce031a20034192046a20032903d8013701002003419a046a200341d8016a41086a290300370100200341a2046a200341d8016a41106a290300370100200341aa046a200341d8016a41186a290300370100200320093a0091042004420037030020034200370380052002413520034180056a1001200a200429030037030020032003290380053703f004200341003602c802200342013703c0024120101f2204450d0c200420032903f003370000200441086a200341f0036a41086a290300370000200441106a200341f0036a41106a290300370000200441186a200341f0036a41186a290300370000200342a080808080043702c402200320043602c0022004412041c000101e2204450d0d200420034190046a2d00003a0020200342c080808090043702c402200320043602c00220034191046a200341c0026a10ca0120032802c4022104200341f0046a411020032802c0022209200341c0026a41086a280200100302402004450d002009101d0b2002101d410121042008200545720d010b2005101d0b02402002452004720d002002101d0b2006210c0b4200210620034180056a41086a22024200370300200342003703800541a89cc000411520034180056a1001200341f0046a41086a200229030037030020032003290380053703f004420021070240200341f0046a411041f8b3c200410041001002417f460d00200342003703c002200341f0046a4110200341c0026a41084100100241016a41084d0d0720032903c00221070b20034180056a41086a220242003703002003420037038005418cb9c000410d20034180056a1001200341f0046a41086a200229030037030020032003290380053703f0040240200341f0046a411041f8b3c200410041001002417f460d00200342003703c002200341f0046a4110200341c0026a41084100100241016a41084d0d0820032903c00221060b200342e4cab5fbb6ccdcb0e300370368200341e8006a200341a0026a427f427f200c20077e20067c410210d001200341c0026a41086a41083a0000200341c9026a20032903a002370000200341d1026a200341a0026a41086a290300370000200341d9026a200341b0026a290300370000200341e1026a200341b8026a290300370000200341053a00c002200341c0026a108b010b410021020b410121090b4101210820012d000022044101470d010b2008450d01200141046a2201280200103c2001280200101d0c010b20044105470d002009450d00200141046a2201280200103c2001280200101d0b200020053602042000200236020020034190056a24000f0b41df88c0004133103a000b41df88c0004133103a000b41f5d7c10041d300103a000b412041011020000b41c00041011020000bf90801037f200141046a2802002102200141086a280200210302400240024002400240024002400240024002400240024002400240024020002d00004101470d0020022003470d01200341016a22022003490d0c20034101742204200220022004491b22044100480d0c2003450d03200128020020032004101e2202450d040c090b20022003470d01200341016a22022003490d0b20034101742204200220022004491b22044100480d0b2003450d04200128020020032004101e2202450d050c060b200128020021020c080b200128020021020c050b2004101f22020d050b200441011020000b2004101f22020d010b200441011020000b20012002360200200141046a2004360200200141086a28020021030b200141086a200341016a360200200220036a41003a00000c020b20012002360200200141046a2004360200200141086a28020021030b200141086a2204200341016a360200200220036a41013a000002400240024002400240200141046a2802002202200428020022036b41204f0d00200341206a22042003490d0620024101742203200420042003491b22034100480d062002450d01200128020020022003101e2202450d020c030b200128020021020c030b2003101f22020d010b200341011020000b20012002360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200220036a220341186a200041196a290000370000200341106a200041116a290000370000200341086a200041096a290000370000200320002900013700000b200141046a2802002102200141086a28020021030240024002400240024002400240024002400240024020002d00214101470d0020022003470d01200341016a22022003490d0b20034101742204200220022004491b22044100480d0b2003450d03200128020020032004101e2202450d040c090b20022003470d01200341016a22002003490d0a20034101742202200020002002491b22024100480d0a2003450d04200128020020032002101e2200450d050c060b200128020021020c080b200128020021000c050b2004101f22020d050b200441011020000b2002101f22000d010b200241011020000b20012000360200200141046a2002360200200141086a28020021030b200141086a200341016a360200200020036a41003a00000f0b20012002360200200141046a2004360200200141086a28020021030b200141086a2204200341016a360200200220036a41013a0000024002400240200141046a2802002202200428020022036b41204f0d00200341206a22042003490d0320024101742203200420042003491b22034100480d032002450d01200128020020022003101e2202450d020c040b200128020021020c040b2003101f22020d020b200341011020000b1021000b20012002360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200220036a220141186a2000413a6a290000370000200141106a200041326a290000370000200141086a2000412a6a2900003700002001200041226a2900003700000b980f03087f017e077f230041d0006b22042400200441306a41086a220542003703002004420037033041c6b3c0004118200441306a1001200441c0006a41086a2005290300370300200420042903303703404100210502400240024002400240024002400240024002400240024002400240200441c0006a411041f8b3c200410041001002417f460d00200441003a0010200441c0006a4110200441106a41014100100241016a41014d0d0120042d001021050b0240024002400240200341187441187541077620037341187441808080086a41187520054118744118754c0d0041deb3c0002105411d21060c010b411a101f2205450d04200541186a41002f00e89b403b0000200541106a41002900e09b40370000200541086a41002900d89b40370000200541002900d09b403700002005411a4134101e2205450d052005200236001a200441306a41086a22064200370300200442003703302005411e200441306a1001200441c0006a41086a200629030037030020042004290330370340200441c0006a411041f8b3c20041004100100221062005101d0240024002400240024002402006417f460d00200441106a41186a200141186a290000370300200441106a41106a200141106a290000370300200441106a41086a200141086a290000370300200420012900003703104110101f2205450d0c200541086a41002900a49b403700002005410029009c9b40370000200541104120101e2205450d0d200520023600102005412041c000101e2205450d0e200520042903103700142005412c6a200441106a41186a2207290300370000200541246a200441106a41106a22082903003700002005411c6a200441106a41086a2209290300370000200441306a41086a220642003703002004420037033020054134200441306a1001200441c0006a41086a200629030037030020042004290330370340200441c0006a411041f8b3c20041004100100221062005101d2006417f470d05200420021099012007200141186a2900003703002008200141106a2900003703002009200141086a29000037030020042001290000370310200428020822052004280204220a470d01200541016a22062005490d072005410174220b20062006200b491b220aad420586220c422088a70d07200ca722064100480d072005450d02200428020020054105742006101e220d0d030c150b41fbb3c0002105412221060c050b2004280200210d0c020b2006101f220d450d120b2004200a3602042004200d3602000b200441086a200541016a220b360200200d20054105746a22062004290310370000200641186a200441106a41186a290300370000200641106a200441106a41106a290300370000200641086a200441106a41086a2903003700004113101f2206450d0e2006410f6a410028008f9d40360000200641086a41002900889d40370000200641002900809d40370000200641134126101e220e450d0f200e2002360013200441306a41086a2206420037030020044200370330200e4117200441306a1001200441c0006a41086a20062903003703002004200429033037034020044100360218200442013703102004200b360230200441306a200441106a106202400240200b450d00200541057441206a210f4100200441106a41086a28020022066b21102004280210211120042802142112200d210503400240201220106a411f4b0d00200641206a220b2006490d0620124101742213200b200b2013491b220b4100480d06024002402012450d0020112012200b101e22110d010c090b200b101f2211450d080b200b21120b201120066a220b2005290000370000200b41186a200541186a290000370000200b41106a200541106a290000370000200b41086a200541086a290000370000201041606a2110200641206a2106200541206a2105200f41606a220f0d000b200441186a200636020020042012360214200420113602100c010b200441106a41086a280200210620042802142112200428021021110b200441c0006a411020112006100302402012450d002011101d0b200e101d200a450d00200d101d0b2007200141186a2900003703002008200141106a2900003703002009200141086a290000370300200420012900003703104110101f2205450d09200541086a41002900a49b403700002005410029009c9b40370000200541104120101e2205450d0a200520023600102005412041c000101e2205450d0b200520042903103700142005412c6a200441286a290300370000200541246a200441106a41106a2903003700002005411c6a200441106a41086a290300370000200441306a41086a220642003703002004420037033020054134200441306a1001200441c0006a41086a2006290300370300200420042903303703404101101f2206450d0c200620033a0000200441c0006a41102006410110032006101d2005101d410021050b2000200636020420002005360200200441d0006a24000f0b1021000b200b41011020000b41df88c0004133103a000b411a41011020000b413441011020000b411041011020000b412041011020000b41c00041011020000b411041011020000b412041011020000b41c00041011020000b410141011020000b411341011020000b412641011020000b200641011020000ba90604027f017e017f037e230041306b22042400024002400240024002404114101f2205450d00200541106a41002800d5ba40360000200541086a41002900cdba40370000200541002900c5ba40370000200541144134101e2205450d01200520012900003700142005412c6a200141186a290000370000200541246a200141106a2900003700002005411c6a200141086a29000037000042002106200441206a41086a220742003703002004420037032020054134200441206a1001200441106a41086a200729030037030020042004290320370310024002400240200441106a411041f8b3c200410041001002417f460d002004420037032820044200370320200441106a4110200441206a4110410010022207417f460d022007410f4d0d02200441286a2903002108200429032021060c010b420021080b2005101d0240024020062002542205200820035420082003511b450d0041d4d4c0002105411521010c010b200441086a20014104200620027d2206200820037d2005ad7d2208103d024020042802082205450d00200428020c21010c010b4118101f2205450d05200541106a41002900e9ba40370000200541086a41002900e1ba40370000200541002900d9ba40370000200541184138101e2205450d0620052001290000370018200541306a200141186a290000370000200541286a200141106a290000370000200541206a200141086a29000037000042002109200441206a41086a220742003703002004420037032020054138200441206a1001200441106a41086a20072903003703002004200429032037031002400240200441106a411041f8b3c200410041001002417f460d002004420037032820044200370320200441106a4110200441206a4110410010022207417f460d062007410f4d0d06200441286a290300210a200429032021090c010b4200210a0b2005101d2001200920027c2202200a20037c2002200954ad7c10e70120012006200810e201410021050b2000200136020420002005360200200441306a24000f0b41df88c0004133103a000b411441011020000b413441011020000b41df88c0004133103a000b411841011020000b413841011020000bfd0403037f027e067f230041306b220224000240024002404113101f2203450d002003410f6a41002800f99b40360000200341086a41002900f29b40370000200341002900ea9b40370000200341134126101e2204450d0120042000360013200241186a41086a220342003703002002420037031820044117200241186a1001200241086a41086a2003290300370300200220022903183703082002410036022020024201370318200141086a2903002105200129030021064110101f2203450d02200320063700002003200537000820024290808080800237021c20022003360218200128021021072002200141186a280200220336022c2002412c6a200241186a106202400240024002402003450d0020034105742108200241186a41086a280200210020022802182109200228021c210a2007210303400240024002400240200a20006b41204f0d00200041206a220b2000490d07200a410174220c200b200b200c491b220c4100480d07200a450d012009200a200c101e22090d020c080b200041206a210b0c020b200c101f2209450d060b200c210a0b200920006a22002003290000370000200041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a290000370000200b2100200341206a2103200841606a22080d000b200241206a200b3602002002200a36021c200220093602180c010b200241206a280200210b200228021c210a200228021821090b200241086a41102009200b10030240200a450d002009101d0b2004101d0240200141146a280200450d002007101d0b200241306a24000f0b1021000b200c41011020000b411341011020000b412641011020000b411041011020000b110020012000280200200028020410ef020b4b02017f017e230041206b2202240020012902002103200241146a20012902083702002002200337020c20022000360208200241e8b1c400360204200241f8b3c200360200200210bb03000b95140f017f017e027f017e057f017e0a7f037e077f037e027f027e027f027e027f230041a0016b2206240042002107200641086a41086a2208420037030020064200370308418cb9c000410d200641086a1001200641f8006a41086a200829030037030020062006290308370378024002400240024002400240024002400240200641f8006a411041f8b3c200410041001002417f460d0020064200370308200641f8006a4110200641086a41084100100241016a41084d0d01200629030821070b200641086a41106a2003370300200641086a41286a20053a0000200641086a41186a2004370300200641286a22092000290000370300200620023703104201210a20064201370308200641f8006a200110ea012006280278210b200628027c210c200628028001220d450d02200641f8006a41186a220e2000460d01200d41286c210f4201210a200b21050340200541086a2903002104200541106a2903002102200541186a290300210320052903002110200641f8006a41206a200541206a290300370300200641f8006a41186a2003370300200641f8006a41106a22112002370300200641f8006a41086a2004370300200620103703780240024002400240200e2900002000290000510d0020112903002007580d01200641e8006a41086a200e41086a2903003703002006200e2903003703682011290300210220062903800121032006290378211042014201520d030c020b200641e8006a41086a200941086a290300370300200629030821044200210a2006420037030820062009290300370368200641086a41186a2903002102200629031821032006290310211020044201510d010c020b42004201520d010b200541286a2111200a21040c050b200541286a2105200f41586a220f0d000c030b0b41df88c0004133103a000b200d41286c2105200b41286a2111200641206a290300210220062903182103200629031021102006290308210a0340200641e8006a41086a200941086a290300370300420021042006420037030820062009290300370368200a4201510d02201141286a21114200210a200541586a22050d000b0b4100210e0240200c450d00200b101d0b4108211241002113200a4201510d010c040b200641d8006a41086a2205200641e8006a41086a29030037030020062006290368370358200641c8006a41086a220f200529030037030020062006290358370348200641386a41086a2205200f2903003703002006200629034837033802400240024002404128101f2212450d00201220062903383703182012201037030020122003370308201241206a2005290300370300201241106a2002370300024002402011200b200d41286c6a460d00200641f8006a41186a220f2000460d0141282114200b200d41286c6a221541586a21164101211741202118411021194108211a4201211b4228211c4220211d4100211e4101210e41012113410021050c030b4101210e41012113200c0d030c040b41282122200b200d41286c6a222341586a2124200641086a41186a290300212520062903182126200629031021272006290308210441012128410821294200212a4201212b4110212c200641f8006a41106a212d4228212e4220212f41002130412021314101210e41012113410121050c010b412841081020000b03400240024002400240024020050e020001010b201121050340200641f8006a20186a221f200520186a290300370300200f200541186a290300370300200641f8006a20196a220d200520196a290300370300200641f8006a201a6a22202005201a6a290300370300200620052903003703780240024002400240200f2900002000290000510d00200d2903002007580d01200641e8006a201a6a200f201a6a2903003703002006200f290300370368200d29030021022006290380012103200629037821104201201b520d030c020b200641e8006a201a6a2009201a6a2903003703002006290308210a420021042006420037030820062009290300370368200641086a41186a29030021022006290318210320062903102110200a201b510d010c020b4200201b520d010b200641d8006a201a6a2211200641e8006a201a6a29030037030020062006290368370358200641c8006a201a6a2221201129030037030020062006290358370348200d2002370300200f2006290348370300200f201a6a202129030037030020062003370380012006201037037802402013200e470d00200e20176a2211200e490d0b200e2017742213201120112013491b2213ad201c7e2202201d88a70d0b2002a72211201e480d0b0240200e450d002012200e20146c2011101e22120d010c060b2011101f2212450d050b200520146a21112012200e20146c6a22212006290378370300202120186a201f290300370300202141186a200f290300370300202120196a200d2903003703002021201a6a2020290300370300200e20176a210e20162005460d03410021050c060b2015200520146a2205470d000c020b0b2011210502400340200641e8006a20296a2211200920296a2903003703002006202a370308200620092903003703682004202b510d01420021042023200520226a2205470d000c020b0b200641d8006a20296a220d201129030037030020062006290368370358200641c8006a20296a2211200d29030037030020062006290358370348202d2025370300200f2006290348370300200f20296a201129030037030020062026370380012006202737037802402013200e470d00200e20286a2211200e490d08200e202874220d20112011200d491b2213ad202e7e2204202f88a70d082004a722112030480d080240200e450d002012200e20226c2011101e22120d010c030b2011101f2212450d020b200520226a21112012200e20226c6a220d2006290378370300200d20316a200641f8006a20316a290300370300200d41186a200f290300370300200d202c6a202d290300370300200d20296a200641f8006a20296a290300370300200e20286a210e4200210420242005470d020b200c450d040c030b201141081020000b410121050c000b0b200b101d0b20044201520d030b200641f8006a41206a2209200841206a290300370300200641f8006a41186a220f200841186a290300370300200641f8006a41106a2200200841106a290300370300200641f8006a41086a221a200841086a29030037030020062008290300370378200e2013470d01200e41016a2205200e490d00200e4101742211200520052011491b2213ad42287e2204422088a70d002004a722054100480d0002400240200e450d002012200e41286c2005101e2212450d010c030b2005101f22120d020b200541081020000b1021000b2012200e41286c6a22052006290378370300200541206a2009290300370300200541186a200f290300370300200541106a2000290300370300200541086a201a290300370300200e41016a210e0b2006200e360280012006201336027c200620123602782001200641f8006a10f101200641a0016a24000ba20b02037f017e0240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200028020022024101460d00024020024102460d0020024103470d02200141046a280200200141086a2802002202470d05200241016a22032002490d1720024101742204200320032004491b22044100480d172002450d0b200128020020022004101e2203450d0c0c150b200141046a280200200141086a2802002202470d02200241016a22032002490d1620024101742204200320032004491b22044100480d162002450d06200128020020022004101e2203450d070c120b200141046a280200200141086a2802002202470d02200241016a22032002490d1520024101742204200320032004491b22044100480d152002450d07200128020020022004101e2203450d080c0f0b200141046a280200200141086a2802002202470d03200241016a22032002490d1420024101742204200320032004491b22044100480d142002450d0a200128020020022004101e2203450d0b0c0c0b200128020021030c100b200128020021030c0d0b200128020021030c100b200128020021030c090b2004101f22030d0b0b200441011020000b2004101f22030d070b200441011020000b2004101f22030d090b200441011020000b2004101f22030d010b200441011020000b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41013a0000200041046a280200210302400240024002400240200141046a2802002202200428020022006b41044f0d00200041046a22042000490d0b20024101742200200420042000491b22004100480d0b2002450d01200128020020022000101e2202450d020c030b200128020021020c030b2000101f22020d010b200041011020000b20012002360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200220006a20033600000f0b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41023a0000200041086a290300210502400240024002400240200141046a2802002202200428020022006b41084f0d00200041086a22032000490d0920024101742200200320032000491b22004100480d092002450d01200128020020022000101e2202450d020c030b200128020021020c030b2000101f22020d010b200041011020000b20012002360200200141046a2000360200200141086a28020021000b200141086a200041086a360200200220006a20053700000f0b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41033a0000200041046a280200210302400240024002400240200141046a2802002202200428020022006b41044f0d00200041046a22042000490d0720024101742200200420042000491b22004100480d072002450d01200128020020022000101e2202450d020c030b200128020021020c030b2000101f22020d010b200041011020000b20012002360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200220006a20033600000f0b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41043a0000200041086a2903002105024002400240200141046a2802002202200428020022006b41084f0d00200041086a22032000490d0320024101742200200320032000491b22004100480d032002450d01200128020020022000101e2202450d020c040b200128020021020c040b2000101f22020d020b200041011020000b1021000b20012002360200200141046a2000360200200141086a28020021000b200141086a200041086a360200200220006a20053700000bd61701267f230041900d6b2203240020034100360210419bb5c0004110200341106a41041003200341086a2204420037030020034200370300418cb9c000410d20031001200341106a41086a2205200429030037030020032003290300370310200320003703f00c200341106a4110200341f00c6a41081003200442003703002003420037030041eab8c0004111200310012005200429030037030020032003290300370310200341106a4110200141201003024002404110101f2204450d00200441086a410029009dba4037000020044100290095ba40370000200441104120101e2205450d0120052000427f7c370010200341086a22044200370300200342003703002005411820031001200341106a41086a2206200429030037030020032003290300370310200341106a41102001412010032005101d20044200370300200342003703004199b9c0004115200310012006200429030037030020032003290300370310200341106a41102002412010032004420037030020034200370300418cb9c000410d2003100120062004290300370300200320032903003703100240200341106a411041f8b3c200410041001002417f460d00200342003703f00c02400240200341106a4110200341f00c6a41084100100241016a41084d0d0020032903f00c4200510d02200341086a2204420037030020034200370300418cb9c000410d20031001200341106a41086a20042903003703002003200329030037031041002107427f21000240200341106a411041f8b3c200410041001002417f460d00200342003703f00c200341106a4110200341f00c6a41084100100241016a41084d0d0220032903f00c427f7c21000b200341106a410041e00c10cd031a41002108410021094100210a4100210b4100210c4100210d4100210e4100210f410021104100211141002112410021134100211441002115410021164100211741002118410021194100211a4100211b4100211c4100211d4100211e4100211f41002120410021214100212241002123410021244100212541002126410021270340200341f00c6a42002000427f7c2000501b220010af01200341106a202722014103704105746a220441186a200341f00c6a41186a290200370000200441106a200341f00c6a41106a290200370000200441086a200341f00c6a41086a290200370000200420032902f00c370000200141016a21274100210541002102024003402001200141036e2206417d6c6a4102470d01200341106a20056a220441df006a2d000022262004411f6a2d000022287120262028722004413f6a2d00007172211c200441de006a2d000022262004411e6a2d000022287120262028722004413e6a2d00007172211b200441dd006a2d000022262004411d6a2d000022287120262028722004413d6a2d00007172211a200441dc006a2d000022262004411c6a2d000022287120262028722004413c6a2d000071722119200441db006a2d000022262004411b6a2d000022287120262028722004413b6a2d000071722118200441da006a2d000022262004411a6a2d000022287120262028722004413a6a2d000071722117200441d9006a2d00002226200441196a2d00002228712026202872200441396a2d000071722116200441d8006a2d00002226200441186a2d00002228712026202872200441386a2d000071722115200441d7006a2d00002226200441176a2d00002228712026202872200441376a2d000071722114200441d6006a2d00002226200441166a2d00002228712026202872200441366a2d000071722113200441d5006a2d00002226200441156a2d00002228712026202872200441356a2d000071722112200441d4006a2d00002226200441146a2d00002228712026202872200441346a2d000071722111200441d3006a2d00002226200441136a2d00002228712026202872200441336a2d000071722110200441d2006a2d00002226200441126a2d00002228712026202872200441326a2d00007172210f200441d1006a2d00002226200441116a2d00002228712026202872200441316a2d00007172210e200441d0006a2d00002226200441106a2d00002228712026202872200441306a2d00007172210d200441cf006a2d000022262004410f6a2d000022287120262028722004412f6a2d00007172210c200441ce006a2d000022262004410e6a2d000022287120262028722004412e6a2d00007172210b200441cd006a2d000022262004410d6a2d000022287120262028722004412d6a2d00007172210a200441cc006a2d000022262004410c6a2d000022287120262028722004412c6a2d000071722109200441cb006a2d000022262004410b6a2d000022287120262028722004412b6a2d000071722108200441ca006a2d000022262004410a6a2d000022287120262028722004412a6a2d000071722107200441c9006a2d00002226200441096a2d00002228712026202872200441296a2d00007172211d200441c8006a2d00002226200441086a2d00002228712026202872200441286a2d00007172211e200441c7006a2d00002226200441076a2d00002228712026202872200441276a2d00007172211f200441c6006a2d00002226200441066a2d00002228712026202872200441266a2d000071722120200441c5006a2d00002226200441056a2d00002228712026202872200441256a2d000071722121200441c4006a2d00002226200441046a2d00002228712026202872200441246a2d000071722122200441c3006a2d00002226200441036a2d00002228712026202872200441236a2d000071722123200441c2006a2d00002226200441026a2d00002228712026202872200441226a2d000071722124200441c1006a2d00002226200441016a2d00002228712026202872200441216a2d000071722125200441c0006a2d0000222620042d00002228712026202872200441206a2d000071722126200541800c460d01200341106a20052006410574200141096e41e0006c6b6a6a220441ff006a201c3a0000200441fe006a201b3a0000200441fd006a201a3a0000200441fc006a20193a0000200441fb006a20183a0000200441fa006a20173a0000200441f9006a20163a0000200441f8006a20153a0000200441f7006a20143a0000200441f6006a20133a0000200441f5006a20123a0000200441f4006a20113a0000200441f3006a20103a0000200441f2006a200f3a0000200441f1006a200e3a0000200441f0006a200d3a0000200441ef006a200c3a0000200441ee006a200b3a0000200441ed006a200a3a0000200441ec006a20093a0000200441eb006a20083a0000200441ea006a20073a0000200441e9006a201d3a0000200441e8006a201e3a0000200441e7006a201f3a0000200441e6006a20203a0000200441e5006a20213a0000200441e4006a20223a0000200441e3006a20233a0000200441e2006a20243a0000200441e1006a20253a0000200441e0006a20263a0000200541e0006a210520062101200241016a22024111490d000b0b202741d100470d000b2003201c3a008f0d2003201b3a008e0d2003201a3a008d0d200320193a008c0d200320183a008b0d200320173a008a0d200320163a00890d200320153a00880d200320143a00870d200320133a00860d200320123a00850d200320113a00840d200320103a00830d2003200f3a00820d2003200e3a00810d2003200d3a00800d2003200c3a00ff0c2003200b3a00fe0c2003200a3a00fd0c200320093a00fc0c200320083a00fb0c200320073a00fa0c2003201d3a00f90c2003201e3a00f80c2003201f3a00f70c200320203a00f60c200320213a00f50c200320223a00f40c200320233a00f30c200320243a00f20c200320253a00f10c200320263a00f00c200341086a220442003703002003420037030041fbb8c000411120031001200341106a41086a2205200429030037030020032003290300370310200341106a4110200341f00c6a41201003200442003703002003420037030041a5bac000410d200310012005200429030037030020032003290300370310200341106a41101009200341900d6a24000f0b41df88c0004133103a000b41df88c0004133103a000b41f0f3c200102c000b411041011020000b412041011020000bc41905027f017e157f017e097f230041f0026b22022400200241186a200110d501024002400240024002400240024002400240024002402002280218450d00200228021c2203ad42287e2204422088a70d0a2004a72205417f4c0d0a2005450d012005101f2206450d032003450d020c040b20004100360200200241f0026a24000f0b4108210620030d020b41002116410021130c020b200541081020000b200241ec016a2105200241d8016a41086a2107200241d8016a41047221082002419d016a2109200241d8016a41076a210a200241206a410172210b200241a0026a210c200241eb016a220d41056a210e20024190026a210f410021104100211141002112200321130340200241003a00d8012001280200200141046a2214280200200241d8016a4101200141086a22152802001002211620152015280200201641016a41014b22166a22173602002016450d0220022d00d801221641044b0d0202400240024002400240024002400240024002400240024002400240024020160e050004020301000b200241086a200110d5012002280208450d10200228020c2216417f4c0d142016450d04201610792218450d0a20152016410020012802002014280200201820162015280200100222142014417f461b2214201420164b1b221420152802006a36020020142016460d050c090b20142802002116200241003602d8012015410020012802002016200241d8016a41042017100222162016417f461b22164104201641044922161b20152802006a36020020160d0f20022802d8012116200241106a200110d5012002280210450d0f20022802142217417f4c0d132017450d06201710792219450d0a20152017410020012802002014280200201920172015280200100222142014417f461b2214201420174b1b221420152802006a36020020142017470d070c0b0b200241d8016a41186a221b4200370300200241d8016a41106a2219420037030020074200370300200242003703d8012015410020012802002014280200200241d8016a41202017100222162016417f461b2216412020164120491b20152802006a3602002016411f4d0d0e200241c8016a41086a200a41086a2800003602002002200a2900003703c8012002200d290000370390012002200e2900003700950120022f01d801211520022d00da01211620022800db0121182009411f6a200241d8016a411f6a290000370000200941186a201b290000370000200941106a2019290000370000200941086a2007290000370000200920022900d8013700002018410876211b20152016411074722116410121190c0b0b200242003703d8012015410020012802002014280200200241d8016a41082017100222162016417f461b2216410820164108491b20152802006a2217360200201641074d0d0d20022903d8012104200f4200370300200241d8016a41306a4200370300200241d8016a41286a4200370300200241d8016a41206a4200370300200241d8016a41186a4200370300200241d8016a41106a420037030020074200370300200242003703d8012015410020012802002014280200200241d8016a41c0002017100222162016417f461b221641c000201641c000491b20152802006a3602002016413f4d0d0d200241c8016a41086a200a41086a28000036020020024190016a41086a200d41086a29000037030020024190016a41106a200d41106a29000037030020024190016a41186a200d41186a29000037030020024190016a41206a200d41206a29000037030020024190016a41256a200d41256a2900003700002002200a2900003703c8012002200d2900003703900120022800db012218410876211b20022f01d80120022d00da01411074722116410221190c0a0b200241a8026a2001105e20022802a8022218450d0c20022902ac022104200241c8016a41086a20022802d80136020020024190016a41086a200841086a29020037030020024190016a41106a200841106a29020037030020024190016a41186a200841186a29020037030020024190016a41206a200841206a29020037030020024190016a41286a200841286a29020037030020024190016a41306a200841306a280200360200200220043703c80120022008290200370390012018410876211b410021190c020b410121182001280200201428020041014100201528020010021a41002016470d040b200241c8016a41086a20022802d80136020020024190016a41086a200841086a29020037030020024190016a41106a200841106a29020037030020024190016a41186a200841186a29020037030020024190016a41206a200841206a29020037030020024190016a41286a200841286a29020037030020024190016a41306a200841306a280200360200200220082902003703900120022016ad22044220862004843703c8012018410876211b410421190b0c060b410121192001280200201428020041014100201528020010021a41002017460d040b2017450d072019101d0c070b2016450d062018101d0c060b201641011020000b201741011020000b2019450d032016411876211820022017ad221a422086201a843702cc01200220193602c801410321190b200241e0026a41086a221c200241c8016a41086a280200360200200241a8026a41086a221520024190016a41086a290300370300200241a8026a41106a221420024190016a41106a290300370300200241a8026a41186a221720024190016a41186a290300370300200241a8026a41206a221d20024190016a41206a290300370300200241a8026a41286a221e20024190016a41286a290300370300200241a8026a41306a221f20024190016a41306a280200360200200220022903c8013703e00220022002290390013703a80220024180016a41086a2220201c280200360200200241c8006a41086a221c2015290300370300200241c8006a41106a22212014290300370300200241c8006a41186a22222017290300370300200241c8006a41206a2223201d290300370300200241c8006a41286a221d201e290300370300200241c8006a41306a221e201f280200360200200220022903e00237038001200220022903a8023703482007200229038001370000200741086a202028020036000020052002290348370000200541086a201c290300370000200541106a2021290300370000200541186a2022290300370000200541206a2023290300370000200541286a201d290300370000200541306a201e2802003600002002201b410874201841ff0171723602dc01200220193a00d801200220163b00d901200220164110763a00db01200c2004370300200241206a200241d8016a10b70220022d00202118200241a8026a411f6a2219200b411f6a2900003700002017200b41186a2900003703002014200b41106a2900003703002015200b41086a2900003703002002200b2900003703a80220184103460d03201241016a2116200241d8016a411f6a221c2019290000370000200241d8016a41186a22192017290300370300200241d8016a41106a2217201429030037030020072015290300370300200220022903a8023703d801024020122013470d002010201620162010491b2213ad42287e221a422088a70d05201aa722154100480d0502402012450d00200620112015101e22060d010c070b2015101f2206450d060b200620116a221520183a0000201541206a201c290000370000201541196a2019290300370000201541116a2017290300370000201541096a2007290300370000201541016a20022903d801370000201041026a2110201141286a21112016211220162003490d000b0b2000201336020420002006360200200041086a2016360200200241f0026a24000f0b200241e0026a41086a200241c8016a41086a280200360200200241a8026a41086a220520024190016a41086a290300370300200241a8026a41106a220120024190016a41106a290300370300200241a8026a41186a221520024190016a41186a290300370300200241a8026a41206a20024190016a41206a290300370300200241a8026a41286a20024190016a41286a290300370300200241a8026a41306a20024190016a41306a280200360200200220022903c8013703e00220022002290390013703a802200241033a0020200241a8026a411f6a200b411f6a2900003700002015200b41186a2900003703002001200b41106a2900003703002005200b41086a2900003703002002200b2900003703a8020b2000410036020002402012450d00200621050340024020052d00002201450d00024020014101470d00200541086a280200450d01200541046a280200101d200541286a2105201141586a22110d020c030b200541106a280200450d002005410c6a280200101d0b200541286a2105201141586a22110d000b0b02402013450d002006101d0b200241f0026a24000f0b1021000b201541081020000b102e000bd90f03047f017e037f230041206b2202240002400240024020012d000022034101460d0020030d0241012103200141016a21010c010b2001410c6a2802002104200141046a2802002101410021030b200241106a20043602002002200136020c200220033602082000200241086a107f200241206a24000f0b20024100360210200242013703080240024002400240024002400240024002404101101f2203450d002002410136020c200241086a41086a22042004280200220541016a36020020022003360208200320056a41023a00000240024002400240024002400240200141086a2802004101470d00200228020c20042802002203470d01200341016a22042003490d0d20034101742205200420042005491b22054100480d0d2003450d03200228020820032005101e2204450d040c0a0b200228020c20042802002203470d01200341016a22042003490d0c20034101742205200420042005491b22054100480d0c2003450d04200228020820032005101e2204450d050c070b200228020821040c090b200228020821040c060b2005101f22040d060b200541011020000b2005101f22040d020b200541011020000b410141011020000b2002200536020c20022004360208200241106a28020021030b200241086a41086a2205200341016a360200200420036a41003a0000200141186a290300210602400240024002400240200228020c2204200528020022036b41084f0d00200341086a22052003490d0820044101742203200520052003491b22034100480d082004450d01200228020820042003101e2204450d020c030b200228020821040c030b2003101f22040d010b200341011020000b2002200336020c20022004360208200241106a28020021030b200241086a41086a2207200341086a360200200420036a20063700002001410c6a28020021032002200141146a280200220136021c2002411c6a200241086a10622001450d022003200141286c6a21080240024003400240024002400240200228020c2204200728020022096b41204f0d00200941206a22012009490d0a20044101742205200120012005491b22014100480d0a2004450d01200228020820042001101e22050d020c050b200228020821050c020b2001101f2205450d030b2002200136020c2002200536020820072802002109200121040b2007200941206a2201360200200520096a220941186a200341186a290000370000200941106a200341106a290000370000200941086a200341086a29000037000020092003290000370000200341206a29030021060240200420016b41074b0d00200141086a22092001490d0720044101742201200920092001491b22014100480d07024002402004450d00200520042001101e22050d010c050b2001101f2205450d040b2002200136020c20022005360208200728020021010b2007200141086a360200200520016a20063700002008200341286a2203470d000c050b0b200141011020000b200141011020000b2002200536020c20022004360208200241106a28020021030b200241086a41086a2205200341016a360200200420036a41013a0000200141186a290300210602400240024002400240200228020c2204200528020022036b41084f0d00200341086a22052003490d0620044101742203200520052003491b22034100480d062004450d01200228020820042003101e2204450d020c030b200228020821040c030b2003101f22040d010b200341011020000b2002200336020c20022004360208200241106a28020021030b200241086a41086a2205200341086a360200200420036a2006370000200141206a290300210602400240024002400240200228020c2204200528020022036b41084f0d00200341086a22052003490d0620044101742203200520052003491b22034100480d062004450d01200228020820042003101e2204450d020c030b200228020821040c030b2003101f22040d010b200341011020000b2002200336020c20022004360208200241106a28020021030b200241086a41086a2207200341086a360200200420036a20063700002001410c6a28020021032002200141146a280200220136021c2002411c6a200241086a10622001450d002003200141286c6a210803400240024002400240200228020c2204200728020022096b41204f0d00200941206a22012009490d0620044101742205200120012005491b22014100480d062004450d01200228020820042001101e22050d020c070b200228020821050c020b2001101f2205450d050b2002200136020c2002200536020820072802002109200121040b2007200941206a2201360200200520096a220941186a200341186a290000370000200941106a200341106a290000370000200941086a200341086a29000037000020092003290000370000200341206a29030021060240200420016b41074b0d00200141086a22092001490d0320044101742201200920092001491b22014100480d03024002402004450d00200520042001101e22050d010c070b2001101f2205450d060b2002200136020c20022005360208200728020021010b2007200141086a360200200520016a20063700002008200341286a2203470d000b0b200228020c210120022802082103200241106a220420042802003602002002200336020c200241043602082000200241086a107f02402001450d002003101d0b200241206a24000f0b1021000b200141011020000b200141011020000bc90301057f230041106b2202240041002103200241003a000f200128020020012802042002410f6a410120012802081002210420012001280208200441016a41014b22046a22053602080240024002402004450d0002400240024020022d000f220641037122044102460d0020044101460d0120040d0220064102762104410121030c050b20024100360208200220063a000841012103200141086a220441002001280200200141046a280200200241086a41017241032005100222012001417f461b22014103200141034922011b20042802006a36020020010d03200228020841027621040c040b41002103200241003b0106200220063a00062001280200200141046a280200200241066a4101724101200510022104200141086a22012001280200200441016a220141014b6a36020020014102490d0120022f01064102762104410121030c030b200641034b0d02200141046a28020021044100210320024100360200200141086a2206410020012802002004200241042005100222012001417f461b22014104200141044922011b20062802006a36020020010d0020022802002104410121030c020b0c010b410021030b2000200436020420002003360200200241106a24000bf19601060a7f027e057f027e037f087e230041d0026b22022400200241003a001020012802002001280204200241106a410120012802081002210320012001280208200341016a41014b22036a22043602080240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402003450d0020022d00102203410c4b0d0a024020030e0d00090607030a0c080e050d0204000b41002105200241003a00102001280200200141046a280200200241106a4101200410022103200141086a22012001280200200341016a41014b22016a3602002001450d10024020022d00102201450d004101210520014101470d110b200020053a0001200041003a0000200041026a200241106a41ee0010ce031a200241d0026a24000f0b2000410d3a0000200241d0026a24000f0b200241003a00102001280200200141046a280200200241106a4101200410022103200141086a22042004280200200341016a41014b22036a22043602002003450d4a20022d0010220341054b0d4a024020030e06003836373539000b200241286a4200370300200241206a22064200370300200241106a41086a2207420037030020024200370310200141086a220841002001280200200141046a2209280200200241106a41202004100222032003417f461b2203412020034120491b20082802006a220a3602002003411f4d0d4a20022f012e2103200228012a210420022f0128210520022d0027210b200229001f210c2002290017210d2002280013210e20022f0011210f20022d00102110200642003703002007420037030020024200370328200242003703102008410020012802002009280200200241106a4120200a100222062006417f461b2206412020064120491b20082802006a22113602002006411f4d0d4a2002412e6a2f010021122002412a6a2801002107200241286a2f01002109200241276a2d0000210a200241106a410f6a2900002113200229001721142002280013210620022f0011211520022d00102116200242003703182002420037031041002108200141086a221741002001280200200141046a280200200241106a41102011100222012001417f461b2201411020014110491b20172802006a3602002001410f4d0d4a2012ad42ffff03832118200241106a41086a29030021192002290310211a0c4e0b200241003a00102001280200200141046a280200200241106a4101200410022103200141086a22042004280200200341016a41014b22036a22043602002003450d1620022d001022034102460d1420034101460d1320030d1620024200370318200242003703104100210b200141086a220341002001280200200141046a280200200241106a41102004100222012001417f461b2201411020014110491b20032802006a3602002001410f4d0d16200241106a41086a290300210d200229031021132002350097022002419b026a310000422086842118200241a8026a290300210c20022903a0022114200228029c022101200228009302210e20022f009102210f20022d00900221100c150b200241003a00102001280200200141046a280200200241106a4101200410022103200141086a22042004280200200341016a41014b22036a22043602002003450d1020022d001022034101460d0e20030d1041002103200241003a00102001280200200141046a280200200241106a4101200410022104200141086a22012001280200200441016a41014b22016a3602002001450d1020022d001021010c0f0b200241003a00102001280200200141046a280200200241106a4101200410022103200141086a22042004280200200341016a41014b22036a3602002003450d4e20022d0010450d0c0c4e0b200241003a00102001280200200141046a280200200241106a4101200410022103200141086a22042004280200200341016a41014b22036a22043602002003450d164103210520022d0010220341034b0d16024020030e040015164d000b20024188026a22054200370300200241f0016a41106a4200370300200241f0016a41086a4200370300200242003703f001200141086a220341002001280200200141046a220b280200200241f0016a41202004100222042004417f461b2204412020044120491b20032802006a220e3602002004411f4d0d162005290300210d200241fb016a3100002118200229038002210c20022802fc01210920022800f301210720022f00f101210620022d00f001210820023500f70121132002420037031820024200370310200341002001280200200b280200200241106a4110200e100222012001417f461b2201411020014110491b20032802006a3602002001410f4d0d1620132018422086842118200241186a2903002213422088a7210a2002290310211b2013a7210b4200211341002105420021140c4c0b200241003a00102001280200200141046a280200200241106a4101200410022103200141086a22042004280200200341016a41014b22036a22043602002003450d0820022d00100d0820024200370310200141086a220341002001280200200141046a280200200241106a41082004100222012001417f461b2201410820014108491b20032802006a360200200141074d0d0820022903102118200041033a0000200041086a2018370300200020022800a801360001200041046a200241a8016a41036a280000360000200041106a200241106a41e00010ce031a200241d0026a24000f0b200241003a00102001280200200141046a280200200241106a4101200410022103200141086a22042004280200200341016a41014b22036a22043602002003450d1e20022d001022034101460d0d20030d1e20024188026a220e420037030020024180026a4200370300200241f0016a41086a4200370300200242003703f00141002105200141086a220b41002001280200200141046a280200200241f0016a41202004100222032003417f461b2203412020034120491b200b2802006a22043602002003411f4d0d1920023500f701200241fb016a310000422086842118200e290300210c200229038002210d20022802fc01210320022800f301210b20022f00f101210e20022d00f001210f410121050c1a0b200241003a00102001280200200141046a280200200241106a4101200410022103200141086a22042004280200200341016a41014b22036a22043602002003450d0520022d00100d0520024188026a2205420037030020024180026a4200370300200241f0016a41086a4200370300200242003703f001200141086a220341002001280200200141046a220b280200200241f0016a41202004100222042004417f461b2204412020044120491b20032802006a220e3602002004411f4d0d05200241f0016a410b6a310000211820022800f301210f20022f00f101211020022d00f001210820022802fc012104200229038002210c20023500f701210d200241e1016a22062005290300370000200220183c00d4012002200d3e02d0012002200c3700d901200220043600d501200b2802002104200241003602102003410020012802002004200241106a4104200e100222012001417f461b2201410420014104491b20032802006a360200200141034d0d0520022802102101200241d0016a41096a29000021182006290000210c20022800d501210320023502d001210d200041136a20023100d4013c00002000410f6a200d3e0000200041206a200c370000200041186a2018370000200041013a0000200041146a20033600002000410b6a200f360000200041096a20103b0000200041086a20083a0000200041046a2001360000200020022f00a8013b0001200041036a200241aa016a2d00003a0000200041286a200241106a41c80010ce031a200241d0026a24000f0b200241003a00102001280200200141046a280200200241106a4101200410022103200141086a22042004280200200341016a41014b22036a22043602002003450d3d20022d0010220341084b0d3d024020030e090037333432383a363c000b200141046a220b280200210320024100360210200141086a2205410020012802002003200241106a41042004100222032003417f461b2203410420034104491b20052802006a2204360200200341034d0d3d20022802102103420021182002420037031820024200370310200541002001280200200b280200200241106a41102004100222012001417f461b2201411020014110491b20052802006a3602002001410f4d0d3d2002290214220c422088a72105200228021c210f20022802102101200ca721104100210b420021130c3c0b2000410d3a0000200241d0026a24000f0b200241003a00102001280200200141046a280200200241106a4101200410022103200141086a22042004280200200341016a41014b22036a22043602002003450d3d20022d0010220341034b0d3d024020030e0400141213000b20024188026a220e420037030020024180026a4200370300200241f0016a41086a220f4200370300200242003703f001200141086a220b41002001280200200141046a2210280200200241f0016a41202004100222032003417f461b2203412020034120491b200b2802006a22083602002003411f4d0d3d200241fb016a2207310000210d200e290300211820022802fc01210620022800f301210320022f00f101210420022d00f001210520023500f7012113200229038002210c200e4200370300200f42003703002002420037038002200242003703f001200b410020012802002010280200200241f0016a41202008100222012001417f461b2201412020014120491b200b2802006a3602002001411f4d0d3d20073100002114200241fc016a2802002101200241f0016a41106a290300211920022d00f001210b20022f00f101210e20022800f301210f20023500f701211a200241e1016a200241f0016a41186a290300370000200220193700d901200220013600d5012002411f6a200241d0016a41086a290300370000200241276a200241d0016a41106a290300370000200241106a411f6a200241d0016a41186a2d00003a0000200220143c00d4012002201a3e02d0012002200f3600132002200e3b00112002200b3a0010200220022903d00137001720024190026a41186a2201200241106a41186a29030037030020024190026a41106a220b200241106a41106a29030037030020024190026a41086a220e200241106a41086a290300370300200220022903103703900220024180016a411f6a220f201842188822144220883c0000200220063b018c012002418e016a20064110763a00002002200ca722103b01900120024192016a20104110763a0000200241b5016a200e290300370000200241bd016a200b290300370000200241c5016a200129030037000020022013200d42208684220d3e0087012002200d4220883c008b01200220064118763a008f01200220143e009b012002200c4218882018422886842218370093012002200336008301200220043b008101200220053a008001200220143e02a80120022002290390023700ad012002200f2d00003a00ac01200228008b01210f200228008f01210e200da7210b410021100c140b200241003a00102001280200200141046a280200200241106a4101200410022103200141086a22042004280200200341016a41014b22036a22043602002003450d2620022d0010220341044b0d26024020030e0500231e201b000b200141046a28020021054100210320024100360210200141086a220b410020012802002005200241106a41042004100222012001417f461b2201410420014104491b200b2802006a360200200141034d0d2620022802102101420021130c240b200241003a00102001280200200141046a280200200241106a4101200410022103200141086a22042004280200200341016a41014b22036a22043602002003450d2720022d0010220341044b0d27024020030e0500271e201b000b20024188026a2205420037030020024180026a4200370300200241f0016a41086a4200370300200242003703f001200141086a220341002001280200200141046a220b280200200241f0016a41202004100222042004417f461b2204412020044120491b20032802006a220e3602002004411f4d0d27200241fb016a310000211820023100f001211920023300f101211c20023500f301211d200229038002211b20023500f701210c20022802fc012104200241e1016a2005290300221a370000200220043600d501200220183c00d4012002200c3e02d0012002201b3700d901200241d0016a41086a310000211e20022903d0012118200b2802002104200241003602102003410020012802002004200241106a4104200e100222042004417f461b2204410420044104491b20032802006a2205360200200441034d0d272002280210210e20024188026a2204420037030020024180026a220b4200370300200241f0016a41086a4200370300200242003703f001200141086a220f41002001280200200141046a2210280200200241f0016a41202005100222032003417f461b2203412020034120491b200f2802006a22083602002003411f4d0d272004290300210d200b2903002113200241fc016a2802002103200241fb016a310000210c20022800f301210420022f00f101210520022d00f001210b20023500f701211f2010280200211020024100360210200f410020012802002010200241106a41042008100222012001417f461b2201410420014104491b200f2802006a360200200141034d0d27201e42388620184208888421142018423886201d42188684201c420886842019842119201f200c422086842118201b421888201a42288684210c201a421888211a201ea741ff0171211020022802102108201ba72101410021060c1b0b2000410d3a0000200241d0026a24000f0b2000410d3a0000200241d0026a24000f0b2000410d3a0000200241d0026a24000f0b200241106a200110a40120022802102201450d4120022902142118200041093a0000200041086a2018370000200041046a2001360000200020022f00a8013b0001200041036a200241aa016a2d00003a0000200041106a200241106a41e00010ce031a200241d0026a24000f0b20024188026a2205420037030020024180026a4200370300200241f0016a41086a4200370300200242003703f001200141086a220341002001280200200141046a280200200241f0016a41202004100222012001417f461b2201412020014120491b20032802006a3602002001411f4d0d01200241fb016a310000210d20022800f301210f20022f00f101211020022d00f0012101200229038002210c20023500f701211320022802fc012103200241e1016a20052903002218370000200220033600d5012002200d3c00d401200220133e02d0012002200c3700d901200c423888201842088684a7210e2018423088a721042018421088a7210520022903d001210d20022903d801210c2018a7210b410121030b200020033a00012000410c3a0000200041206a20043b00002000411c6a20053600002000411a6a200b3b0000200041196a200e3a0000200041116a200c370000200041096a200d370000200041056a200f360000200041036a20103b0000200041026a20013a0000200041226a200241106a41ce0010ce031a200241d0026a24000f0b2000410d3a0000200241d0026a24000f0b20024188026a220e420037030020024180026a4200370300200241f0016a41086a4200370300200242003703f00141002105200141086a220b41002001280200200141046a280200200241f0016a41202004100222032003417f461b2203412020034120491b200b2802006a220b3602002003411f4d0d0d200229038002221842ffffff0783210c2018428080807883210d20022802fc01220341ffffff077121052003418080807871210320023500f701200241fb016a310000422086842118200e290300211320022800f301210e20022f00f101210f20022d00f0012110410121040c0e0b20024188026a2205420037030020024180026a4200370300200241f0016a41086a4200370300200242003703f001200141086a220b41002001280200200141046a220e280200200241f0016a41202004100222032003417f461b2203412020034120491b200b2802006a220f3602002003411f4d0d022005290300210c200241f0016a410b6a310000210d200229038002211820022802fc01211020022800f301210320022f00f101210420022d00f001210520023500f7012113200e280200210e20024100360210200b41002001280200200e200241106a4104200f100222012001417f461b2201410420014104491b200b2802006a360200200141034d0d0220022802102101200220103b018c012002418e016a20104110763a000020022013200d42208684220d3e00870120024180016a410b6a200d4220883c000020022018a7220b3b01900120024192016a200b4110763a00002002419f016a200c4238883c00002002419b016a200c4218883e000020022018421888200c4228868437009301200220104118763a008f012002200336008301200220043b008101200220053a0080012018423888200c42088684a72110200c4230882118200c421088a7210e2002290087012113200229008f01210d200ca7210f4101210b0c010b20024188026a220e4200370300200241f0016a41106a4200370300200241f0016a41086a4200370300200242003703f001200141086a220b41002001280200200141046a220f280200200241f0016a41202004100222032003417f461b2203412020034120491b200b2802006a22103602002003411f4d0d01200241fb016a310000211820022800f301210320022f00f101210420022d00f001210520022802fc012108200229038002210c20023500f701210d200241c1026a200e290300370000200220183c00b4022002200d3e02b0022002200c3700b902200220083600b502200242003703b001200242003703a801200b41002001280200200f280200200241a8016a41102010100222012001417f461b2201411020014110491b200b2802006a3602002001410f4d0d01200241a8016a41086a290300210c20022903a8012114200241106a410f6a2201200241b0026a41086a2903003700002002412f6a200241c8026a2d00003a000020022003360013200220043b0011200220053a0010200220022903b0023700172002200241c0026a2903003700272001290000210d20022900172113200233012e2118200228012a210e20022f0128210f20022d002721104102210b0b200020022800a801360001200041043a00002000412b6a20184220883c0000200041276a20183e0000200041386a200c370000200041306a20143700002000412c6a2001360000200041236a200e360000200041216a200f3b0000200041206a20103a0000200041186a200d370000200041106a20133700002000410c6a20033600002000410a6a20043b0000200041096a20053a0000200041086a200b3a0000200041c0006a2002290310370300200041046a200241ab016a280000360000200041c8006a200241106a41086a290300370300200041d0006a200241106a41106a290300370300200041d8006a200241106a41186a290300370300200041e0006a200241106a41206a290300370300200041e8006a200241386a290300370300200241d0026a24000f0b2000410d3a0000200241d0026a24000f0b200241f0016a41186a22054200370300200241f0016a41106a4200370300200241f0016a41086a4200370300200242003703f0014100210b200141086a220341002001280200200141046a280200200241f0016a41202004100222012001417f461b2201412020014120491b20032802006a3602002001411f4d0d01200241fb016a310000211820022d00f001210120022f00f101210320022800f301210420023500f701210c20022802fc01210e200229038002210d200241e1016a20052903003700002002200d3700d9012002200e3600d5012002419f026a200241d0016a41086a290300370000200241a7026a200241d0016a41106a29030037000020024190026a411f6a200241d0016a41186a2d00003a0000200220183c00d4012002200c3e02d0012002200436009302200220033b009102200220013a009002200220022903d00137009702200229039002221342388820024190026a41086a290300220c420886842118200c422088a721092013421888a721072013420888a7210620024190026a41186a290300210d20022903a002210c2013a72108410121054100210a0c370b200241f0016a41186a22054200370300200241f0016a41106a4200370300200241f0016a41086a220b4200370300200242003703f001200141086a220341002001280200200141046a220e280200200241f0016a41202004100222042004417f461b2204412020044120491b20032802006a220f3602002004411f4d0d00200241fb016a2207310000211820022d00f001210420022f00f101211020022800f301210820023500f701210c20022802fc012106200229038002210d200241d0016a41116a20052903003700002002200d3700d901200220063600d501200241106a410f6a200241d0016a41086a290300370000200241276a200241d0016a41106a290300370000200241106a411f6a200241d0016a41186a2d00003a0000200220183c00d4012002200c3e02d00120022008360013200220103b0011200220043a0010200220022903d001370017200241106a41186a290300210d200241106a41086a290300211a2002290320210c2002290310211920054200370300200b42003703002002420037038002200242003703f001200341002001280200200e280200200241f0016a4120200f100222042004417f461b2204412020044120491b20032802006a22053602002004411f4d0d00200241fc016a2802002103200241f0016a41106a29030021182007310000211320022800f301211020022f00f101210f20022d00f001210e20023500f7012114200241b0026a41116a20024188026a290300370000200220133c00b402200220143e02b002200220183700b902200220033600b5022002420037031820024200370310200141086a220341002001280200200141046a220b280200200241106a41102005100222042004417f461b2204411020044110491b20032802006a22053602002004410f4d0d00200241106a41086a2903002114200229031021132002420037031820024200370310200341002001280200200b280200200241106a41102005100222012001417f461b2201411020014110491b20032802006a3602002001410f4d0d002019423888201a4208868421182019421888a721072019420888a721062019a72108200241106a41086a290300211c2002290310211e2002419f016a2201200241c8026a2d00003a000020022010360083012002200f3b0081012002200e3a008001200220022903b002370087012002200241b0026a41086a29030037008f012002200241c0026a29030037009701201a422088a7418080807871201a422088a741ffffff07717221092001310000211a2002290097012119200228009301210a200228008f01210b200229008701211b410221050c360b2000410d3a0000200241d0026a24000f0b200141046a280200210320024100360210200141086a2205410020012802002003200241106a41042004100222012001417f461b2201410420014104491b20052802006a360200200141034d0d2b20022802102103200241a8016a411d6a200241106a411d6a290000370000200241a8016a41186a200241106a41186a290200370300200241a8016a41106a200241106a41106a290200370300200241a8016a41086a200241106a41086a290200370300200220022902103703a801410221100c020b200241106a2001105e20022802102203450d2a2002290214210c200241106a2001105e200ca7210b2002280210220e450d2920022902142118200241a8016a411d6a200241106a411d6a290000370000200241a8016a41186a200241106a41186a290200370300200241a8016a41106a200241106a41106a290200370300200241a8016a41086a200241106a41086a290200370300200220022902103703a801200c422088a7210f410321100c010b200241f0016a41186a220b4200370300200241f0016a41106a4200370300200241f0016a41086a4200370300200242003703f001200141086a220341002001280200200141046a280200200241f0016a41202004100222012001417f461b2201412020014120491b20032802006a3602002001411f4d0d29200241fb016a310000210d20022800f301210320022f00f101210420022d00f001210520023500f701210c200229038002211820022802fc012101200241c1026a200b2903002213370000200241b5016a200241106a41086a290000370000200241bd016a200241106a41106a290000370000200241c5016a200241106a41186a290000370000200220013600b5022002200d3c00b402200220183700b9022002200c3e02b002200220022900103700ad01200220022802c4023602a8012002200241b0026a41186a2d00003a00ac012018421888201342288684211820022802b402210f20022802b802210e200ca7210b410121100b200241106a411d6a2208200241a8016a411d6a290000370000200241106a41186a2201200241a8016a41186a290300370300200241106a41106a2206200241a8016a41106a290300220c370300200241106a41086a2207200241a8016a41086a290300220d37030020024180016a41086a2209200d37030020024180016a41106a220a200c37030020024180016a41186a2215200129030037030020024180016a411d6a22162008290000370000200220022903a801220c370380012002200c370310200041063a0000200041186a2018370000200041146a200e360000200041106a200f3600002000410c6a200b360000200041086a2003360000200041066a20043b0000200041056a20053a0000200041046a20103a0000200020022f00a8013b0001200041036a200241aa016a2d00003a0000200041206a200229038001370000200041286a2009290300370000200041306a200a290300370000200041386a20152903003700002000413d6a2016290000370000200041e8006a200241106a41206a290300370300200041e0006a2001290300370300200041d8006a2006290300370300200041d0006a2007290300370300200041c8006a2002290310370300200241d0026a24000f0b0b200241e1016a200c3700002002200d3700d901200220033600d501200220183e02d001200220184220883c00d4012005450d03200141046a2208280200211020024100360210200141086a2205410020012802002010200241106a41042004100222042004417f461b2204410420044104491b20052802006a2210360200200441034d0d032002280210210620082802002104200241003602102005410020012802002004200241106a41042010100222042004417f461b2204410420044104491b20052802006a2210360200200441034d0d0320022802102104200141046a28020021084100210520024100360210200141086a2207410020012802002008200241106a41042010100222012001417f461b2201410420014104491b20072802006a360200200141034d0d03200228021021012002419b016a200c42188822133e00002002419f016a20134220883c00002002200da722103b01900120024192016a20104110763a0000200220033b018c012002418e016a20034110763a0000200220183e0087012002418b016a20184220883c00002002200d421888200c422886843700930120024190026a41186a20024180016a41186a29030037030020024190026a41106a200229039001370300200220034118763a008f0120024190026a41086a20024180016a41086a2903003703002002200b360083012002200e3b0081012002200f3a0080012002200229038001370390020c020b4200210c4200210d4200211341002103410021040b200241e1016a20134200843700002002200d200c843700d901200220032005723600d501200220183e02d001200220184220883c00d4012004450d01200241b0026a41186a200241d0016a41186a2d00003a0000200241b0026a41106a200241d0016a41106a290300370300200241b0026a41086a200241d0016a41086a290300370300200220022903d0013703b002200141046a22052802002104200241003602a801200141086a2203410020012802002004200241a8016a4104200b100222042004417f461b2204410420044104491b20032802006a220b360200200441034d0d0120022802a801210620052802002104200241003602a8012003410020012802002004200241a8016a4104200b100222042004417f461b2204410420044104491b20032802006a2205360200200441034d0d0120022802a8012104200141046a2802002103200241003602a801200141086a220b410020012802002003200241a8016a41042005100222012001417f461b2201410420014104491b200b2802006a360200200141034d0d0120022802a80121012002411f6a200241b0026a41086a290300370000200241276a200241b0026a41106a2903003700002002412f6a200241b0026a41186a2d00003a00002002200e3600132002200f3b0011200220103a0010200220022903b00237001720024190026a41186a200241106a41186a29030037030020024190026a41106a200241106a41106a29030037030020024190026a41086a200241106a41086a2903003703002002200229031037039002410121050b200241a8016a41186a20024190026a41186a2903002218370300200241a8016a41106a20024190026a41106a290300220c370300200241a8016a41086a20024190026a41086a290300220d37030020024180016a41086a2203200d37030020024180016a41106a220b200c37030020024180016a41186a220e20183703002002200229039002221837038001200220183703a801200041073a0000200041046a20053a0000200041306a20013600002000412c6a2004360000200041286a2006360000200020022f00a8013b0001200041036a200241aa016a2d00003a0000200041056a2002290380013700002000410d6a2003290300370000200041156a200b2903003700002000411d6a200e290300370000200041346a20022902103702002000413c6a200241106a41086a290200370200200041c4006a200241106a41106a290200370200200041cc006a200241106a41186a290200370200200041d4006a200241306a290200370200200041dc006a200241106a41286a290200370200200041e4006a200241106a41306a290200370200200041ec006a200241c8006a280200360200200241d0026a24000f0b200241a8016a41186a20024190026a41186a290300370300200241a8016a41106a20024190026a41106a290300370300200241a8016a41086a20024190026a41086a29030037030020022002290390023703a8012000410d3a0000200241d0026a24000f0b4200210c20024200370318200242003703104104210341002105200141086a220b41002001280200200141046a280200200241106a41102004100222012001417f461b2201411020014110491b200b2802006a3602002001410f4d0d0b200241106a41086a2903002113200229031021144200210d0c080b200241f0016a41186a22054200370300200241f0016a41106a4200370300200241f0016a41086a4200370300200242003703f001200141086a220341002001280200200141046a220b280200200241f0016a41202004100222042004417f461b2204412020044120491b20032802006a220e3602002004411f4d0d0c200241f0016a410b6a310000211820022d00f001210f20022f00f101211020022800f301210820023500f701210c20022802fc012104200229038002210d200241b0026a41186a200529030022134238883c0000200241c4026a20134218883e02002002200da722053b00b902200241b0026a410b6a20054110763a0000200241106a410b6a20183c00002002200d4218882013422886843702bc02200241106a41186a200241c1026a290000370300200220044118763a00b802200220044110763a00b702200220043b00b502200220183c00b4022002200c3e02b0022002200c3e001720022008360013200220103b00112002200f3a0010200220022800b50236021c200220022900b902370320200241003a00a8012001280200200b280200200241a8016a4101200e1002210120032003280200200141016a41014b22016a3602002001450d0c20022d00a801210b200241206a2903002218421888200241286a290300220d42288684210c200d421888211a200241186a2903002214423888a72110200229031021192018a72101410421060b0c270b200141046a220b280200210520024100360210200141086a2203410020012802002005200241106a41042004100222042004417f461b2204410420044104491b20032802006a220e360200200441034d0d08200228021021052002420037031820024200370310200341002001280200200b280200200241106a4110200e100222042004417f461b2204411020044110491b20032802006a220b3602002004410f4d0d08200241106a41086a290300210d2002290310210c20024188026a22044200370300200241f0016a41106a4200370300200241f0016a41086a4200370300200242003703f001200141086a220341002001280200200141046a280200200241f0016a4120200b100222012001417f461b2201412020014120491b20032802006a3602002001411f4d0d08200241fb016a310000211320022800f301210120022f00f101210f20022d00f001211020023500f701211420022802fc0121032002290380022118200241c1026a20042903002219370000200220183700b902200220033600b502200220133c00b402200220143e02b0022018423888201942088684a7210e201942308821182019421088a72104200241b0026a41086a290300211320022903b00221142019a7210b410221030c070b200241f0016a41186a2205420037030020024180026a4200370300200241f0016a41086a4200370300200242003703f001200141086a220341002001280200200141046a280200200241f0016a41202004100222012001417f461b2201412020014120491b20032802006a3602002001411f4d0d092005290300211820022d00f001210320022f00f101210420022800f301210520022802fc012101200229038002210d20023500f701211320024190026a410b6a200241f0016a410b6a31000022143c000020024190026a41186a2018370300200220133e0097022002200d3703a0022002200136029c022002200536009302200220043b009102200220033a009002200d421888201842288684210c2001ad4220862013201442208684221342088884211420134238862005ad421886842004ad42ffff0383420886842003ad42ff0183842119200141187621102018421888211a200da72101410221060c020b2002420037031820024200370310200141086a220341002001280200200141046a280200200241106a41102004100222012001417f461b2201411020014110491b20032802006a3602002001410f4d0d06200241106a41086a29030021132002290310211420023502d00120023100d401422086842118200241e1016a290000210d20022900d901210c20022800d5012105410321030c030b200241f0016a41186a22054200370300200241f0016a41106a4200370300200241f0016a41086a4200370300200242003703f001200141086a220341002001280200200141046a280200200241f0016a41202004100222012001417f461b2201412020014120491b20032802006a3602002001411f4d0d0720052903002118200241f0016a410b6a310000210d20022d00f001210420022f00f101210520022900f3012113200229038002210c2002418e016a220b20022802fc0122034110763a000020024180016a410b6a200d3c000020024180016a411f6a20184238883c00002002419b016a2018421888221a3e000020024192016a200ca722014110763a0000200220033b018c012002201337008301200220053b008101200220043a008001200220013b0190012002200341187622103a008f012002200c421888201842288684220c3700930120024180016a41086a350200200233018c01200b310000421086844220868421142002290380012119410321060b0c220b200242003703b001200242003703a801200141086a220341002001280200200141046a280200200241a8016a41102004100222012001417f461b2201411020014110491b20032802006a3602002001410f4d0d03200241a8016a41086a290300211320022903a801211420023500172002411b6a310000422086842118200241286a290300210d2002290320210c200228021c21052002280013210420022f0011210b20022d0010210e410121030b0b0b200020022800a8013600012000410a3a00002000412b6a20184220883c0000200041276a20183e0000200041386a200d370000200041306a200c3700002000412c6a2005360000200041236a2004360000200041216a200b3b0000200041206a200e3a0000200041186a2013370000200041106a20143700002000410c6a20013600002000410a6a200f3b0000200041096a20103a0000200041086a20033a0000200041c0006a2002290310370300200041046a200241ab016a280000360000200041c8006a200241106a41086a290300370300200041d0006a200241106a41106a290300370300200041d8006a200241106a41186a290300370300200041e0006a200241106a41206a290300370300200041e8006a200241386a290300370300200241d0026a24000f0b2000410d3a0000200241d0026a24000f0b20024188026a2205420037030020024180026a4200370300200241f0016a41086a220b4200370300200242003703f001200141086a220341002001280200200141046a220e280200200241f0016a41202004100222042004417f461b2204412020044120491b20032802006a220f3602002004411f4d0d002005290300211a200241fb016a22103100002114200229038002211b20022802fc01210820022800f301210620022f00f101210720022d00f001210920023500f701211920054200370300200b42003703002002420037038002200242003703f001200341002001280200200e280200200241f0016a4120200f100222042004417f461b2204412020044120491b20032802006a220e3602002004411f4d0d0020024188026a290300210d20024180026a2903002113200241fc016a28020021032010310000211820022800f301210420022f00f101210520022d00f001210b20023500f701210c200241003a00102001280200200141046a2210280200200241106a4101200e1002210f200141086a220e200e280200200f41016a41014b220f6a220a360200200f450d0020022d0010210f2010280200211020024100360210200e410020012802002010200241106a4104200a100222102010417f461b2210410420104104491b200e2802006a220a360200201041034d0d002002280210210e200141046a280200211020024100360210200141086a2215410020012802002010200241106a4104200a100222012001417f461b2201410420014104491b20152802006a360200200141034d0d00200c2018422086842118201b421888201a42288684210c2008ad422086201920144220868442ffffffffff1f83221942088884211420194238862006ad421886842007ad42ffff0383420886842009ad42ff018384211920084118762110201a421888211a20022802102108201ba72101410121060c1c0b2000410d3a0000200241d0026a24000f0b200241286a4200370300200241206a4200370300200241106a41086a420037030020024200370310200141086a220841002001280200200141046a2206280200200241106a41202004100222032003417f461b2203412020034120491b20082802006a22073602002003411f4d0d1520022f012e2103200228012a210420022f0128210520022d0027210b200229001f210c2002290017210d2002280013210e20022f0011210f20022d00102110200241003a001020012802002006280200200241106a410120071002210120082008280200200141016a41014b22016a3602002001450d1520022d00102116410421080c190b200241286a4200370300200241206a4200370300200241106a41086a420037030020024200370310200141086a220341002001280200200141046a280200200241106a41202004100222012001417f461b2201412020014120491b20032802006a3602002001411f4d0d1420022f012e2103200228012a210420022f0128210520022d0027210b200229001f210c2002290017210d2002280013210e20022f0011210f20022d00102110410221080c180b200141046a280200210320024100360210200141086a2205410020012802002003200241106a41042004100222012001417f461b2201410420014104491b20052802006a36020041032108200141034d0d132002280210210e0c170b200241286a4200370300200241206a22064200370300200241106a41086a2207420037030020024200370310200141086a220841002001280200200141046a2209280200200241106a41202004100222032003417f461b2203412020034120491b20082802006a220a3602002003411f4d0d1220022f012e2103200228012a210420022f0128210520022d0027210b200229001f210c2002290017210d2002280013210e20022f0011210f20022d00102110200642003703002007420037030020024200370328200242003703102008410020012802002009280200200241106a4120200a100222012001417f461b2201412020014120491b20082802006a3602002001411f4d0d122002412e6a33010021182002412a6a2801002107200241286a2f01002109200241276a2d0000210a2002411f6a2900002113200229001721142002280013210620022f0011211520022d00102116410121080c160b200241286a4200370300200241206a4200370300200241106a41086a420037030020024200370310200141086a220541002001280200200141046a280200200241106a41202004100222032003417f461b2203412020034120491b20052802006a3602002003411f4d0d1120022f012e2103200228012a210420022f0128210520022d0027210b200229001f210c2002290017210d2002280013210e20022f0011210f20022d00102110200241086a200110d5012002280208450d11200228020c2208417f4c0d122008450d0f200810792206450d13200141086a2207200841002001280200200141046a280200200620082007280200100222012001417f461b2201200120084b1b220120072802006a36020020012008470d100c140b4104210b200141046a28020021034100210520024100360210200141086a220e410020012802002003200241106a41042004100222012001417f461b2201410420014104491b200e2802006a360200200141034b0d020c0b0b200141046a220b280200210320024100360210200141086a2205410020012802002003200241106a41042004100222032003417f461b2203410420034104491b20052802006a2204360200200341034d0d0a20022802102103200241003a00102001280200200b280200200241106a410120041002210120052005280200200141016a41014b22016a3602002001450d0a20022d0010220441034f0d0a4102210b0c070b200141046a28020021034100210520024100360210200141086a220b410020012802002003200241106a41042004100222012001417f461b2201410420014104491b200b2802006a3602004103210b200141034d0d090b200228021021030c030b20024188026a220b420037030020024180026a4200370300200241f0016a41086a220f4200370300200242003703f001200141086a220541002001280200200141046a2210280200200241f0016a41202004100222032003417f461b2203412020034120491b20052802006a22083602002003411f4d0d07200241fb016a2207310000210d200b290300211820022802fc01210620022800f301210320022f00f101210e20022d00f001210420023500f7012113200229038002210c200b4200370300200f42003703002002420037038002200242003703f0012005410020012802002010280200200241f0016a41202008100222012001417f461b2201412020014120491b20052802006a3602002001411f4d0d0720073100002114200241fc016a2802002101200241f0016a41106a290300211920022d00f001210520022f00f101210b20022800f301210f20023500f701211a200241e1016a200241f0016a41186a290300370000200220193700d901200220013600d501200241106a410f6a200241d0016a41086a290300370000200241276a200241d0016a41106a290300370000200241106a411f6a200241d0016a41186a2d00003a0000200220143c00d4012002201a3e02d0012002200f3600132002200b3b0011200220053a0010200220022903d00137001720024190026a41186a200241106a41186a29030037030020024190026a41106a200241106a41106a29030037030020024190026a41086a200241106a41086a2903003703002002200229031037039002200220063b018c012002418e016a20064110763a00002002200ca722013b01900120024192016a20014110763a00002002200c421888201842288684221b370093012002419b016a201842188822143e000020024180016a411f6a20144220883c000020022013200d42208684221a3e0087012002201a4220883c008b01200220064118763a008f0120022003360083012002200e3b008101200220043a008001200c423888201842088684210c2018423888200235029002200233019402200231009602421086844220868442088684210d20024190026a410f6a290000211320024190026a411f6a3100002119200229009702211820022900a7022114200228008b012110200228008f012105201ba7210f201aa721014107210b0c060b200141046a220b280200210320024100360210200141086a2205410020012802002003200241106a41042004100222032003417f461b2203410420034104491b20052802006a2204360200200341034d0d06200228021021032002420037031820024200370310200541002001280200200b280200200241106a41102004100222042004417f461b2204411020044110491b20052802006a3602002004410f4d0d06200241186a290300210d2002290310210c200241106a2001105e20022802102201450d0620022902142218422088a721052018a72110420021184101210b420021130c050b200141046a28020021034100210520024100360210200141086a220b410020012802002003200241106a41042004100222012001417f461b2201410420014104491b200b2802006a360200200141034d0d05200228021021034105210b0b0c030b200141046a220b280200210320024100360210200141086a2205410020012802002003200241106a41042004100222032003417f461b2203410420034104491b20052802006a2204360200200341034d0d0320022802102103200241003a00102001280200200b280200200241106a410120041002210120052005280200200141016a41014b22016a3602002001450d0320022d001021044106210b0b410021050c010b20024188026a2205420037030020024180026a42003703004108210b200241f0016a41086a4200370300200242003703f001200141086a220341002001280200200141046a280200200241f0016a41202004100222012001417f461b2201412020014120491b20032802006a3602002001411f4d0d01200241fb016a310000210c20022800f301210320022f00f101210e20022d00f001210420023500f701211320022802fc0121012002290380022118200241c1026a2005290300220d370000200220183700b902200220013600b5022002200c3c00b402200220133e02b0022018423888200d42088684210c200d423888210d2018421888a7210f20022902b4022218422088a721052013a721012018a721100b200020022800a801360001200041053a0000200041c8006a2019370000200041c0006a2014370000200041386a2013370000200041306a2018370000200041286a200d370000200041206a200c3700002000411c6a200f360000200041106a20013600002000410c6a20033600002000410a6a200e3b0000200041096a20043a0000200041086a200b3a0000200041d0006a2002290310370300200041046a200241ab016a280000360000200041d8006a200241106a41086a290300370300200041e0006a200241106a41106a290300370300200041e8006a200241286a290300370300200041146a2005ad4220862010ad84370000200241d0026a24000f0b2000410d3a0000200241d0026a24000f0b200b450d002003101d0b200241106a411d6a200241a8016a411d6a290000370000200241106a41186a200241a8016a41186a290300370300200241106a41106a200241a8016a41106a290300370300200241106a41086a200241a8016a41086a290300370300200220022903a8013703102000410d3a0000200241d0026a24000f0b410121062001280200200141046a28020041014100200141086a28020010021a41002008460d040b2008450d002006101d0b2000410d3a0000200241d0026a24000f0b102e000b200841011020000b2008ad22184220862018842114410521080b200020022800a8013600012000410b3a0000200041cb006a20184220883c0000200041c7006a20183e0000200041d8006a2019370000200041d0006a201a370000200041c3006a2007360000200041c1006a20093b0000200041c0006a200a3a0000200041386a2013370000200041306a20143700002000412c6a20063600002000412a6a20153b0000200041296a20163a0000200041276a20033b0000200041236a2004360000200041216a20053b0000200041206a200b3a0000200041186a200c370000200041106a200d3700002000410c6a200e3600002000410a6a200f3b0000200041096a20103a0000200041086a20083a0000200041046a200241ab016a280000360000200041e8006a200241106a41086a290300370300200041e0006a2002290310370300200241d0026a24000f0b200020022f00a8013b0001200041083a0000200041306a20184220883c00002000412c6a20183e00002000413d6a200d370000200041356a2013370000200041056a2019370000200041cc006a2008360000200041c8006a200e360000200041c5006a200f3a0000200041316a2003360000200041286a2004360000200041266a20053b0000200041256a200b3a0000200041046a20063a0000200041d0006a2002290310370300200041036a200241aa016a2d00003a0000200041d8006a200241106a41086a290300370300200041e0006a200241206a290300370300200041e8006a200241286a2903003703002000411d6a201a421886200c42288884370000200041156a200c4218862001ad42ffffff0783843700002000410d6a2010ad423886201442ffffffffffffffff008384370000200241d0026a24000f0b20002002280010360001200041023a0000200041146a20184220883c0000200041106a20183e0000200041e8006a201c370000200041e0006a201e370000200041d8006a2014370000200041d0006a2013370000200041c8006a201a370000200041c0006a2019370000200041306a201b370000200041216a200d370000200041196a200c3700002000412c6a20103600002000412a6a200f3b0000200041296a200e3a0000200041156a20093600002000410c6a20073600002000410a6a20063b0000200041096a20083a0000200041086a20053a0000200041046a200241136a280000360000200041386a200aad422086200bad84370000200241d0026a24000f0b2000410d3a0000200241d0026a24000bc40101017f024020002d0000417b6a220141064b0d00024002400240024020010e0700010404020403000b200041086a2d00004101470d03200041146a280200450d03200041106a280200101d0f0b200041046a2d00004103470d0202402000410c6a280200450d00200041086a280200101d0b200041186a280200450d02200041146a280200101d0f0b200041086a280200450d01200041046a280200101d0f0b200041086a2d00004105490d00200041306a280200450d002000412c6a280200101d0b0bf8d20105067f017e017f017e027f230041106b220224000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020002d0000417f6a2203410b4b0d0002400240024020030e0c0008050602090a070c040b01000b200141046a280200200141086a2802002203470d13200341016a22042003490d5220034101742205200420042005491b22054100480d522003450d27200128020020032005101e2204450d280c500b200141046a280200200141086a2802002203470d0b200341016a22042003490d4c20034101742205200420042005491b22054100480d4c2003450d18200128020020032005101e2204450d190c4a0b200141046a2205280200200141086a22042802002203470d0b200341016a22062003490d5020034101742207200620062007491b22074100480d502003450d19200128020020032007101e2206450d1a0c450b200141046a280200200141086a2802002203470d0b200341016a22042003490d4f20034101742205200420042005491b22054100480d4f2003450d1a200128020020032005101e2204450d1b0c420b200141046a280200200141086a2802002203470d0b200341016a22042003490d4920034101742205200420042005491b22054100480d492003450d1b200128020020032005101e2204450d1c0c3f0b200141046a280200200141086a2802002203470d0b200341016a22042003490d4d20034101742205200420042005491b22054100480d4d2003450d1c200128020020032005101e2204450d1d0c3c0b200141046a280200200141086a2802002203470d0b200341016a22042003490d4c20034101742205200420042005491b22054100480d4c2003450d1d200128020020032005101e2204450d1e0c390b200141046a280200200141086a2802002203470d0b200341016a22042003490d4620034101742205200420042005491b22054100480d462003450d1e200128020020032005101e2204450d1f0c360b200141046a280200200141086a2802002203470d0c200341016a22042003490d4a20034101742205200420042005491b22054100480d4a2003450d21200128020020032005101e2204450d220c330b200141046a280200200141086a2802002203470d0c200341016a22042003490d4920034101742205200420042005491b22054100480d492003450d22200128020020032005101e2204450d230c300b200141046a280200200141086a2802002203470d0c200341016a22042003490d4820034101742205200420042005491b22054100480d482003450d23200128020020032005101e2204450d240c2d0b200141046a280200200141086a2802002203470d0c200341016a22042003490d4220034101742205200420042005491b22054100480d422003450d24200128020020032005101e2204450d250c2a0b200141046a280200200141086a2802002203470d0c200341016a22042003490d4120034101742205200420042005491b22054100480d412003450d25200128020020032005101e2204450d260c270b200128020021040c3f0b200128020021060c3a0b200128020021040c370b200128020021040c340b200128020021040c310b200128020021040c2e0b200128020021040c2b0b200128020021040c3d0b200128020021040c270b200128020021040c240b200128020021040c210b200128020021040c1e0b200128020021040c1b0b2005101f22040d310b200541011020000b2007101f22060d2b0b200741011020000b2005101f22040d270b200541011020000b2005101f22040d230b200541011020000b2005101f22040d1f0b200541011020000b2005101f22040d1b0b200541011020000b2005101f22040d170b200541011020000b2005101f22040d280b200541011020000b2005101f22040d110b200541011020000b2005101f22040d0d0b200541011020000b2005101f22040d090b200541011020000b2005101f22040d050b200541011020000b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41093a000002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d1d20034101742205200420042005491b22044100480d1d2003450d01200128020020032004101e2205450d020c030b200128020021050c030b2004101f22050d010b200441011020000b20012005360200200141046a2004360200200141086a28020021030b200141086a2204200341016a360200200520036a41003a0000200041046a280200210320022000410c6a280200220036020c2002410c6a200110622000450d142003200041286c6a2109200141046a2105024002400340024002400240024020052802002206200428020022006b41204f0d00200041206a22072000490d1f20064101742200200720072000491b22004100480d1f2006450d01200128020020062000101e22060d020c050b200128020021060c020b2000101f2206450d030b2001200636020020052000360200200428020021000b2004200041206a360200200620006a220041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a29000037000020002003290000370000200341206a2903002108024002400240024020052802002206200428020022006b41084f0d00200041086a22072000490d1f20064101742200200720072000491b22004100480d1f2006450d01200128020020062000101e22060d020c060b200128020021060c020b2000101f2206450d040b2001200636020020052000360200200428020021000b2004200041086a360200200620006a20083700002009200341286a2203470d000c170b0b200041011020000b200041011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a410b3a00000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200041086a2d0000417f6a220341044b0d000240024002400240024020030e050004020301000b200141046a280200200141086a2802002203470d08200341016a22042003490d3920034101742205200420042005491b22054100480d392003450d11200128020020032005101e2204450d120c210b200141046a280200200141086a2802002203470d04200341016a22042003490d3820034101742205200420042005491b22054100480d382003450d0a200128020020032005101e2204450d0b0c1e0b200141046a280200200141086a2802002203470d04200341016a22042003490d3720034101742205200420042005491b22054100480d372003450d0b200128020020032005101e2204450d0c0c1b0b200141046a280200200141086a2802002203470d04200341016a22042003490d3620034101742205200420042005491b22054100480d362003450d0c200128020020032005101e2204450d0d0c180b200141046a280200200141086a2802002203470d05200341016a22042003490d3520034101742205200420042005491b22054100480d352003450d0f200128020020032005101e2204450d100c150b200141046a28020020052802002203470d05200341016a22042003490d3420034101742205200420042005491b22054100480d342003450d10200128020020032005101e2204450d110c120b200128020021040c1a0b200128020021040c170b200128020021040c140b200128020021040c190b200128020021040c100b200128020021040c0d0b2005101f22040d130b200541011020000b2005101f22040d0f0b200541011020000b2005101f22040d0b0b200541011020000b2005101f22040d0f0b200541011020000b2005101f22040d050b200541011020000b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d2520044101742203200520052003491b22034100480d252004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a2900003700002003200429000037000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d2520044101742203200520052003491b22034100480d252004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041296a220441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200041d8006a2903002108200041d0006a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22002003490d2520044101742203200020002003491b22034100480d252004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a220120083700082001200a370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d2320044101742203200520052003491b22034100480d232004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200420036a220141186a200041096a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41043a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d2120044101742203200520052003491b22034100480d212004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a2900003700002003200429000037000002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d2120034101742205200420042005491b22054100480d212003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a200041296a2d00003a0000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41033a00002000410c6a280200210002400240024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d1f20044101742203200520052003491b22034100480d1f2004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a2000360000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41053a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1d20044101742203200520052003491b22034100480d1d2004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a290000370000200320042900003700002000412c6a28020021062002200041346a280200220336020c2002410c6a2001106202400240024002400240200141046a2802002200200528020022046b20034f0d00200420036a22052004490d1d20004101742204200520052004491b22044100480d1d2000450d01200128020020002004101e2200450d020c030b200128020021000c030b2004101f22000d010b200441011020000b20012000360200200141046a2004360200200141086a28020021040b200141086a200420036a360200200020046a2006200310ce031a200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1b20044101742203200520052003491b22034100480d1b2004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a2900003700002003200429000037000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1b20044101742203200520052003491b22034100480d1b2004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200420036a220141186a200041296a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41073a0000200041056a2104200141046a28020021062005280200210302400240024002400240024002400240024002400240200041046a2d00004101470d0020062003470d01200341016a22052003490d1f20034101742206200520052006491b22064100480d1f2003450d03200128020020032006101e2205450d040c090b20062003470d01200341016a22052003490d2320034101742206200520052006491b22064100480d232003450d04200128020020032006101e2205450d050c060b200128020021050c080b200128020021050c050b2006101f22050d050b200641011020000b2006101f22050d010b200641011020000b20012005360200200141046a2006360200200141086a28020021030b200141086a2206200341016a360200200520036a41003a000002400240024002400240200141046a2802002205200628020022036b41204f0d00200341206a22062003490d2020054101742203200620062003491b22034100480d202005450d01200128020020052003101e2205450d020c030b200128020021050c030b2003101f22050d010b200341011020000b20012005360200200141046a2003360200200141086a28020021030b200141086a2206200341206a360200200520036a220341186a200441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200041286a280200210502400240024002400240200141046a2802002204200628020022036b41044f0d00200341046a22062003490d2020044101742203200620062003491b22034100480d202004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a2206200341046a360200200420036a20053600002000412c6a280200210502400240024002400240200141046a2802002204200628020022036b41044f0d00200341046a22062003490d2020044101742203200620062003491b22034100480d202004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a2206200341046a360200200420036a2005360000200041306a280200210002400240024002400240200141046a2802002204200628020022036b41044f0d00200341046a22052003490d2020044101742203200520052003491b22034100480d202004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a2000360000200241106a24000f0b20012005360200200141046a2006360200200141086a28020021030b200141086a2206200341016a360200200520036a41013a000002400240024002400240200141046a2802002205200628020022036b41204f0d00200341206a22062003490d1920054101742203200620062003491b22034100480d192005450d01200128020020052003101e2205450d020c030b200128020021050c030b2003101f22050d010b200341011020000b20012005360200200141046a2003360200200141086a28020021030b200141086a2206200341206a360200200520036a220341186a200441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200041286a280200210502400240024002400240200141046a2802002204200628020022036b41044f0d00200341046a22062003490d1920044101742203200620062003491b22034100480d192004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a2206200341046a360200200420036a20053600002000412c6a280200210502400240024002400240200141046a2802002204200628020022036b41044f0d00200341046a22062003490d1920044101742203200620062003491b22034100480d192004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a2206200341046a360200200420036a2005360000200041306a280200210002400240024002400240200141046a2802002204200628020022036b41044f0d00200341046a22052003490d1920044101742203200520052003491b22034100480d192004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a2000360000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41063a00000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200041046a2d000022034101460d00024020034102460d0020034103470d02200141046a280200200141086a2802002203470d05200341016a22042003490d2e20034101742205200420042005491b22054100480d2e2003450d0b200128020020032005101e2204450d0c0c150b200141046a280200200141086a2802002203470d02200341016a22042003490d2d20034101742205200420042005491b22054100480d2d2003450d06200128020020032005101e2204450d070c120b200141046a28020020052802002203470d02200341016a22042003490d2c20034101742205200420042005491b22054100480d2c2003450d07200128020020032005101e2204450d080c0f0b200141046a280200200141086a2802002203470d03200341016a22042003490d2b20034101742205200420042005491b22054100480d2b2003450d0a200128020020032005101e2204450d0b0c0c0b200128020021040c100b200128020021040c0d0b200128020021040c100b200128020021040c090b2005101f22040d0b0b200541011020000b2005101f22040d070b200541011020000b2005101f22040d090b200541011020000b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d2220044101742203200520052003491b22034100480d222004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041056a220441186a290000370000200341106a200441106a290000370000200341086a200441086a2900003700002003200429000037000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d2220044101742203200520052003491b22034100480d222004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200420036a220141186a200041256a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d2020044101742203200520052003491b22034100480d202004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200420036a220141186a200041056a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a0000200041086a280200210002400240024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d1e20044101742203200520052003491b22034100480d1e2004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a2000360000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41033a0000200041086a28020021032002200041106a280200220436020c2002410c6a200110620240024002402004450d0020044105742107200141046a21090340024002400240024020092802002206200528020022046b41204f0d00200441206a220b2004490d1f20064101742204200b200b2004491b22044100480d1f2006450d01200128020020062004101e22060d020c060b200128020021060c020b2004101f2206450d040b2001200636020020092004360200200528020021040b2005200441206a360200200620046a220441186a200341186a290000370000200441106a200341106a290000370000200441086a200341086a29000037000020042003290000370000200341206a2103200741606a22070d000b0b200041146a280200210320022000411c6a280200220436020c2002410c6a200110622004450d1020044105742106200141086a2100200141046a21070340024002400240024020072802002205200028020022046b41204f0d00200441206a22092004490d1e20054101742204200920092004491b22044100480d1e2005450d01200128020020052004101e22050d020c060b200128020021050c020b2004101f2205450d040b2001200536020020072004360200200028020021040b2000200441206a360200200520046a220441186a200341186a290000370000200441106a200341106a290000370000200441086a200341086a29000037000020042003290000370000200341206a2103200641606a22060d000c110b0b200441011020000b200441011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a00000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200041086a2d000022034101460d00024020034102460d0020034103470d02200141046a280200200141086a2802002203470d05200341016a22042003490d2c20034101742200200420042000491b22004100480d2c2003450d0b200128020020032000101e2204450d0c0c150b200141046a280200200141086a2802002203470d02200341016a22042003490d2b20034101742205200420042005491b22054100480d2b2003450d06200128020020032005101e2204450d070c120b200141046a28020020052802002203470d02200341016a22042003490d2a20034101742205200420042005491b22054100480d2a2003450d07200128020020032005101e2204450d080c0f0b200141046a280200200141086a2802002203470d03200341016a22042003490d2920034101742205200420042005491b22054100480d292003450d0a200128020020032005101e2204450d0b0c0c0b200128020021040c100b200128020021040c0d0b200128020021040c100b200128020021040c090b2005101f22040d0b0b200541011020000b2005101f22040d070b200541011020000b2000101f22040d090b200041011020000b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d2020044101742203200520052003491b22034100480d202004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200041386a2903002108200041306a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22002003490d2020044101742203200020002003491b22034100480d202004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a220120083700082001200a370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1e20044101742203200520052003491b22034100480d1e2004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200420036a220141186a200041096a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1c20044101742203200520052003491b22034100480d1c2004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a2900003700002003200429000037000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1c20044101742203200520052003491b22034100480d1c2004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041296a220441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200041d8006a2903002108200041d0006a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22052003490d1c20044101742203200520052003491b22034100480d1c2004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341106a360200200420036a220320083700082003200a370000200041e8006a2903002108200041e0006a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22002003490d1c20044101742203200020002003491b22034100480d1c2004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a220120083700082001200a370000200241106a24000f0b20012004360200200141046a2000360200200141086a28020021030b200141086a200341016a360200200420036a41033a0000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41083a000002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200041046a2d0000417f6a220341034b0d00024020030e0400040203000b200141046a280200200141086a2802002203470d07200341016a22042003490d2b20034101742205200420042005491b22054100480d2b2003450d0f200128020020032005101e2204450d100c1b0b200141046a28020020052802002203470d03200341016a22042003490d2a20034101742205200420042005491b22054100480d2a2003450d08200128020020032005101e2204450d090c180b200141046a280200200141086a2802002203470d03200341016a22042003490d2920034101742205200420042005491b22054100480d292003450d09200128020020032005101e2204450d0a0c150b200141046a280200200141086a2802002203470d03200341016a22042003490d2820034101742205200420042005491b22054100480d282003450d0a200128020020032005101e2204450d0b0c120b200141046a280200200141086a2802002203470d04200341016a22042003490d2720034101742205200420042005491b22054100480d272003450d0d200128020020032005101e2204450d0e0c0f0b200128020021040c150b200128020021040c120b200128020021040c0f0b200128020021040c140b200128020021040c0b0b2005101f22040d0f0b200541011020000b2005101f22040d0b0b200541011020000b2005101f22040d070b200541011020000b2005101f22040d0b0b200541011020000b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1b20044101742203200520052003491b22034100480d1b2004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200420036a220141186a200041056a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41043a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1920044101742203200520052003491b22034100480d192004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041056a220441186a290000370000200341106a200441106a290000370000200341086a200441086a2900003700002003200429000037000002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d1920034101742205200420042005491b22054100480d192003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a200041256a2d00003a0000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41033a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1720044101742203200520052003491b22034100480d172004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200420036a220141186a200041056a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1520044101742203200520052003491b22034100480d152004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041056a220441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200041c8006a280200210602400240024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d1520044101742203200520052003491b22034100480d152004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341046a360200200420036a200636000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1520044101742203200520052003491b22034100480d152004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041256a220441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200041cc006a280200210002400240024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d1520044101742203200520052003491b22034100480d152004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a2000360000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1320044101742203200520052003491b22034100480d132004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041056a220441186a290000370000200341106a200441106a290000370000200341086a200441086a2900003700002003200429000037000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1320044101742203200520052003491b22034100480d132004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041256a220441186a290000370000200341106a200441106a290000370000200341086a200441086a2900003700002003200429000037000002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d1320034101742205200420042005491b22054100480d132003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a200041c5006a2d00003a0000200041c8006a280200210602400240024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d1320044101742203200520052003491b22034100480d132004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341046a360200200420036a2006360000200041cc006a280200210002400240024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d1320044101742203200520052003491b22034100480d132004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a2000360000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41043a000002400240024002400240024002400240024002400240024002400240024002400240200041086a2d000022034101460d0020034102470d01200141046a280200200141086a2802002203470d03200341016a22042003490d2220034101742205200420042005491b22054100480d222003450d07200128020020032005101e2204450d080c0f0b200141046a28020020052802002203470d01200341016a22042003490d2120034101742205200420042005491b22054100480d212003450d04200128020020032005101e2204450d050c0c0b200141046a280200200141086a2802002203470d02200341016a22042003490d2020034101742205200420042005491b22054100480d202003450d07200128020020032005101e2204450d080c090b200128020021040c0b0b200128020021040c0c0b200128020021040c070b2005101f22040d070b200541011020000b2005101f22040d070b200541011020000b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a0000200041186a2903002108200041106a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22002003490d1a20044101742203200020002003491b22034100480d1a2004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a220120083700082001200a370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1820044101742203200520052003491b22034100480d182004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a290000370000200320042900003700002000412c6a280200210002400240024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d1820044101742203200520052003491b22034100480d182004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a2000360000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1620044101742203200520052003491b22034100480d162004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200041386a2903002108200041306a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22002003490d1620044101742203200020002003491b22034100480d162004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a220120083700082001200a370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41033a000002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d1420034101742205200420042005491b22054100480d142003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a0000200041086a290300210802400240024002400240200141046a2802002204200528020022036b41084f0d00200341086a22002003490d1420044101742203200020002003491b22034100480d142004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341086a360200200420036a2008370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a410a3a000002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200041086a2d0000417f6a220341034b0d00024020030e0400040203000b200141046a280200200141086a2802002203470d07200341016a22042003490d2520034101742205200420042005491b22054100480d252003450d0f200128020020032005101e2204450d100c1b0b200141046a28020020052802002203470d03200341016a22042003490d2420034101742205200420042005491b22054100480d242003450d08200128020020032005101e2204450d090c180b200141046a280200200141086a2802002203470d03200341016a22042003490d2320034101742205200420042005491b22054100480d232003450d09200128020020032005101e2204450d0a0c150b200141046a280200200141086a2802002203470d03200341016a22042003490d2220034101742205200420042005491b22054100480d222003450d0a200128020020032005101e2204450d0b0c120b200141046a280200200141086a2802002203470d04200341016a22042003490d2120034101742205200420042005491b22054100480d212003450d0d200128020020032005101e2204450d0e0c0f0b200128020021040c150b200128020021040c120b200128020021040c0f0b200128020021040c140b200128020021040c0b0b2005101f22040d0f0b200541011020000b2005101f22040d0b0b200541011020000b2005101f22040d070b200541011020000b2005101f22040d0b0b200541011020000b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a00002000412c6a280200210602400240024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d1520044101742203200520052003491b22034100480d152004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341046a360200200420036a2006360000200041386a2903002108200041306a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22052003490d1520044101742203200520052003491b22034100480d152004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341106a360200200420036a220320083700082003200a37000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1520044101742203200520052003491b22034100480d152004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200420036a220141186a200041096a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41043a0000200041186a2903002108200041106a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22002003490d1320044101742203200020002003491b22034100480d132004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a220120083700082001200a370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41033a0000200041186a2903002108200041106a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22002003490d1120044101742203200020002003491b22034100480d112004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a220120083700082001200a370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a00002000410c6a280200210002400240024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d0f20044101742203200520052003491b22034100480d0f2004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a2000360000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a0000200041186a2903002108200041106a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22002003490d0d20044101742203200020002003491b22034100480d0d2004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a220120083700082001200a370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a0000200141046a28020021042005280200210302400240024002400240024002400240024002400240200041016a2d00004101470d0020042003470d01200341016a22042003490d1620034101742200200420042000491b22004100480d162003450d03200128020020032000101e2204450d040c090b20042003470d01200341016a22042003490d1520034101742200200420042000491b22004100480d152003450d04200128020020032000101e2204450d050c060b200128020021040c080b200128020021040c050b2000101f22040d050b200041011020000b2000101f22040d010b200041011020000b20012004360200200141046a2000360200200141086a28020021030b200141086a200341016a360200200420036a41003a0000200241106a24000f0b20012004360200200141046a2000360200200141086a28020021030b200141086a200341016a360200200420036a41013a0000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41053a00000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200041086a2d0000417f6a220341074b0d000240024002400240024002400240024020030e080005020301060704000b200528020020042802002203470d0c200341016a22062003490d3e20034101742207200620062007491b22074100480d3e2003450d19200128020020032007101e2206450d1a0c330b200528020020042802002203470d07200341016a22062003490d3d20034101742207200620062007491b22074100480d3d2003450d10200128020020032007101e2206450d110c300b200528020020042802002203470d07200341016a22062003490d3c20034101742207200620062007491b22074100480d3c2003450d11200128020020032007101e2206450d120c2d0b200528020020042802002203470d07200341016a22062003490d3b20034101742207200620062007491b22074100480d3b2003450d12200128020020032007101e2206450d130c2a0b200528020020042802002203470d07200341016a22062003490d3a20034101742207200620062007491b22074100480d3a2003450d13200128020020032007101e2206450d140c270b200528020020042802002203470d08200341016a22062003490d3920034101742207200620062007491b22074100480d392003450d16200128020020032007101e2206450d170c240b200528020020042802002203470d08200341016a22062003490d3820034101742207200620062007491b22074100480d382003450d17200128020020032007101e2206450d180c210b200528020020042802002203470d08200341016a22062003490d3720034101742207200620062007491b22074100480d372003450d18200128020020032007101e2206450d190c1e0b200528020020042802002203470d08200341016a22062003490d3620034101742207200620062007491b22074100480d362003450d19200128020020032007101e2206450d1a0c1b0b200128020021060c290b200128020021060c260b200128020021060c230b200128020021060c200b200128020021060c270b200128020021060c1c0b200128020021060c190b200128020021060c160b200128020021060c130b2007101f22060d1f0b200741011020000b2007101f22060d1b0b200741011020000b2007101f22060d170b200741011020000b2007101f22060d130b200741011020000b2007101f22060d190b200741011020000b2007101f22060d0d0b200741011020000b2007101f22060d090b200741011020000b2007101f22060d050b200741011020000b2007101f22060d010b200741011020000b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41003a00002000410c6a28020021070240024002400240024020052802002206200428020022036b41044f0d00200341046a22092003490d1e20064101742203200920092003491b22034100480d1e2006450d01200128020020062003101e2206450d020c030b200128020021060c030b2003101f22060d010b200341011020000b20012006360200200141046a2003360200200141086a28020021030b2004200341046a360200200620036a2007360000200041186a2903002108200041106a290300210a0240024002400240024020052802002200200428020022036b41104f0d00200341106a22052003490d1e20004101742203200520052003491b22034100480d1e2000450d01200128020020002003101e2200450d020c030b200128020021000c030b2003101f22000d010b200341011020000b20012000360200200141046a2003360200200141086a28020021030b2004200341106a360200200020036a220120083700082001200a370000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41073a00000240024002400240024020052802002206200428020022036b41204f0d00200341206a22072003490d1c20064101742203200720072003491b22034100480d1c2006450d01200128020020062003101e2206450d020c030b200128020021060c030b2003101f22060d010b200341011020000b20012006360200200141046a2003360200200141086a28020021030b2004200341206a360200200620036a220341186a200041096a220641186a290000370000200341106a200641106a290000370000200341086a200641086a290000370000200320062900003700000240024002400240024020052802002205200428020022036b41204f0d00200341206a22062003490d1c20054101742203200620062003491b22034100480d1c2005450d01200128020020052003101e2205450d020c030b200128020021050c030b2003101f22050d010b200341011020000b20012005360200200141046a2003360200200141086a28020021030b2004200341206a360200200520036a220141186a200041296a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41063a00002000410c6a28020021070240024002400240024020052802002206200428020022036b41044f0d00200341046a22092003490d1a20064101742203200920092003491b22034100480d1a2006450d01200128020020062003101e2206450d020c030b200128020021060c030b2003101f22060d010b200341011020000b20012006360200200141046a2003360200200141086a28020021030b2004200341046a360200200620036a200736000002400240024002400240200528020020042802002203470d00200341016a22052003490d1a20034101742206200520052006491b22064100480d1a2003450d01200128020020032006101e2205450d020c030b200128020021050c030b2006101f22050d010b200641011020000b20012005360200200141046a2006360200200141086a28020021030b2004200341016a360200200520036a200041096a2d00003a0000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41023a00002000410c6a28020021070240024002400240024020052802002206200428020022036b41044f0d00200341046a22092003490d1820064101742203200920092003491b22034100480d182006450d01200128020020062003101e2206450d020c030b200128020021060c030b2003101f22060d010b200341011020000b20012006360200200141046a2003360200200141086a28020021030b2004200341046a360200200620036a200736000002400240024002400240024002400240024002400240024002400240024002400240200041096a2d000022034101460d0020034102470d01200528020020042802002203470d03200341016a22002003490d2420034101742205200020002005491b22054100480d242003450d07200128020020032005101e2200450d080c0f0b200528020020042802002203470d01200341016a22002003490d2320034101742205200020002005491b22054100480d232003450d04200128020020032005101e2200450d050c0c0b200528020020042802002203470d02200341016a22002003490d2220034101742205200020002005491b22054100480d222003450d07200128020020032005101e2200450d080c090b200128020021000c0b0b200128020021000c0c0b200128020021000c070b2005101f22000d070b200541011020000b2005101f22000d070b200541011020000b2005101f22000d010b200541011020000b20012000360200200141046a2005360200200141086a28020021030b2004200341016a360200200020036a41003a00000c0e0b20012000360200200141046a2005360200200141086a28020021030b2004200341016a360200200020036a41013a0000200241106a24000f0b20012000360200200141046a2005360200200141086a28020021030b2004200341016a360200200020036a41023a0000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41083a00000240024002400240024020052802002205200428020022036b41204f0d00200341206a22062003490d1620054101742203200620062003491b22034100480d162005450d01200128020020052003101e2205450d020c030b200128020021050c030b2003101f22050d010b200341011020000b20012005360200200141046a2003360200200141086a28020021030b2004200341206a360200200520036a220141186a200041096a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41043a00002000410c6a28020021060240024002400240024020052802002200200428020022036b41044f0d00200341046a22052003490d1420004101742203200520052003491b22034100480d142000450d01200128020020002003101e2200450d020c030b200128020021000c030b2003101f22000d010b200341011020000b20012000360200200141046a2003360200200141086a28020021030b2004200341046a360200200020036a2006360000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41033a00002000410c6a28020021060240024002400240024020052802002200200428020022036b41044f0d00200341046a22052003490d1220004101742203200520052003491b22034100480d122000450d01200128020020002003101e2200450d020c030b200128020021000c030b2003101f22000d010b200341011020000b20012000360200200141046a2003360200200141086a28020021030b2004200341046a360200200020036a2006360000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41053a00002000410c6a28020021060240024002400240024020052802002200200428020022036b41044f0d00200341046a22052003490d1020004101742203200520052003491b22034100480d102000450d01200128020020002003101e2200450d020c030b200128020021000c030b2003101f22000d010b200341011020000b20012000360200200141046a2003360200200141086a28020021030b2004200341046a360200200020036a2006360000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41013a00002000410c6a28020021070240024002400240024020052802002206200428020022036b41044f0d00200341046a22092003490d0e20064101742203200920092003491b22034100480d0e2006450d01200128020020062003101e2206450d020c030b200128020021060c030b2003101f22060d010b200341011020000b20012006360200200141046a2003360200200141086a28020021030b2004200341046a360200200620036a2007360000200041286a2903002108200041206a290300210a0240024002400240024020052802002206200428020022036b41104f0d00200341106a22072003490d0e20064101742203200720072003491b22034100480d0e2006450d01200128020020062003101e2206450d020c030b200128020021060c030b2003101f22060d010b200341011020000b20012006360200200141046a2003360200200141086a28020021030b200141086a220b200341106a360200200620036a220320083700082003200a370000200041106a28020021032002200041186a280200220036020c2002410c6a200110622000450d0020004105742107200141046a210c0340024002400240024020052802002206200428020022006b41204f0d00200041206a22092000490d0e20064101742200200920092000491b22004100480d0e2006450d01200128020020062000101e22060d020c060b200128020021060c020b2000101f2206450d040b20012006360200200c2000360200200b28020021000b2004200041206a360200200620006a220041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a29000037000020002003290000370000200341206a2103200741606a22070d000b0b200241106a24000f0b200041011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a410c3a0000200041026a2104200141046a2802002106200528020021030240024002400240024002400240024002400240024020002d00014101470d0020062003470d01200341016a22002003490d0b20034101742205200020002005491b22054100480d0b2003450d03200128020020032005101e2200450d040c090b20062003470d01200341016a22002003490d0a20034101742205200020002005491b22054100480d0a2003450d04200128020020032005101e2200450d050c060b200128020021000c080b200128020021000c050b2005101f22000d050b200541011020000b2005101f22000d010b200541011020000b20012000360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200020036a41003a000002400240024002400240200141046a28020020052802002203470d00200341016a22002003490d0720034101742205200020002005491b22054100480d072003450d01200128020020032005101e2200450d020c030b200128020021000c030b2005101f22000d010b200541011020000b20012000360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200020036a20042d00003a0000200241106a24000f0b20012000360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200020036a41013a0000024002400240200141046a2802002200200528020022036b41204f0d00200341206a22052003490d0320004101742203200520052003491b22034100480d032000450d01200128020020002003101e2200450d020c040b200128020021000c040b2003101f22000d020b200341011020000b1021000b20012000360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200020036a220141186a200441186a290000370000200141106a200441106a290000370000200141086a200441086a29000037000020012004290000370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a000002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d0520034101742205200420042005491b22054100480d052003450d01200128020020032005101e2204450d020c030b200128020021040c030b2005101f22040d010b200541011020000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d0520044101742203200520052003491b22034100480d052004450d01200128020020042003101e2204450d020c030b200128020021040c030b2003101f22040d010b200341011020000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041086a220441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200041046a2802002100024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d0320044101742203200520052003491b22034100480d032004450d01200128020020042003101e2204450d020c040b200128020021040c040b2003101f22040d020b200341011020000b1021000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a2000360000200241106a24000b130020004106360204200041efbbc0003602000bce0101047f230041206b22002400024002400240419bb5c000411041f8b3c200410041001002417f460d002000410036021041012101419bb5c0004110200041106a41044100100241016a41044d0d0220002802102102419bb5c000411010090c010b410021010b200041106a41086a2203420037030020004200370310419db4c0004115200041106a1001200041086a20032903003703002000200029031037030020002002410020011b36021020004110200041106a41041003200041206a24000f0b41df88c0004133103a000b13002000410b360204200041dcf5c2003602000b970101057f230041206b22022400200241186a22034200370300200241106a22044200370300200241086a220542003703002002420037030002404120101f2206450d0020062002290300370000200042a0808080800437020420002006360200200641186a2003290300370000200641106a2004290300370000200641086a2005290300370000200241206a24000f0b412041011020000bd31206037f017e057f017e037f027e230041d0016b22012400200141b0016a41086a22024200370300200142003703b00141fbb8c0004111200141b0016a100120014190016a41086a22032002290300370300200120012903b0013703900120014190016a4110100920024200370300200142003703b001419db4c0004115200141b0016a100120032002290300370300200120012903b0013703900120014190016a4110100920024200370300200142003703b00141b2b4c0004117200141b0016a100120032002290300370300200120012903b0013703900120014190016a411010092001418cb9c000410d108f01200129030821042001280200210520024200370300200142003703b00141eab8c0004111200141b0016a1001200141f0006a41086a2002290300370300200120012903b001370370024002400240024002400240024002400240200141f0006a411041f8b3c200410041001002417f460d00200141c8016a4200370300200141b0016a41106a420037030020024200370300200142003703b001200141f0006a4110200141b0016a4120410010022202417f460d022002411f4d0d0220014190016a41186a2206200141b0016a41186a220229030037030020014190016a41106a2207200141b0016a41106a220329030037030020014190016a41086a2208200141b0016a41086a2209290300370300200120012903b00137039001200141f0006a4110100920022006290300370300200320072903003703002009200829030037030020012001290390013703b001200141106a41186a2002290300370300200141106a41106a2003290300370300200141106a41086a2009290300370300200120012903b0013703100c010b200141b0016a41186a20014190016a41186a290300370300200141b0016a41106a20014190016a41106a2903003703002002200329030037030020012001290390013703b001200141106a41186a4200370300200141106a41106a4200370300200141106a41086a4200370300200142003703100b410821064200210a200141b0016a41086a22024200370300200142003703b00141ddb8c000410d200141b0016a1001200141f0006a41086a2002290300370300200120012903b0013703700240200141f0006a411041f8b3c200410041001002417f460d0020014210370294012001200141f0006a36029001200141b0016a20014190016a10d30120012802b0012206450d0420012902b401210a200141f0006a411010090b200141b0016a41086a22024200370300200142003703b0014199b9c0004115200141b0016a1001200141f0006a41086a2002290300370300200120012903b00137037002400240200141f0006a411041f8b3c200410041001002417f460d00200141c8016a4200370300200141b0016a41106a420037030020024200370300200142003703b001200141f0006a4110200141b0016a4120410010022202417f460d032002411f4d0d0320014190016a41186a2207200141b0016a41186a220229030037030020014190016a41106a2208200141b0016a41106a220329030037030020014190016a41086a220b200141b0016a41086a2209290300370300200120012903b00137039001200141f0006a4110100920022007290300370300200320082903003703002009200b29030037030020012001290390013703b001200141306a41186a2002290300370300200141306a41106a2003290300370300200141306a41086a2009290300370300200120012903b0013703300c010b200141b0016a41186a20014190016a41186a290300370300200141b0016a41106a20014190016a41106a290300370300200220014190016a41086a29030037030020012001290390013703b001200141306a41186a4200370300200141306a41106a4200370300200141306a41086a4200370300200142003703300b200141f0006a41186a22024200370300200141f0006a41106a22034200370300200141f0006a41086a2209420037030020014200370370200141f0006a100d200141d0006a41186a2002290300370300200141d0006a41106a2003290300370300200141d0006a41086a200929030037030020012001290370370350200141b0016a41186a2207200141106a41186a290300370300200141b0016a41106a2208200141106a41106a290300370300200141b0016a41086a220b200141106a41086a290300370300200120012903103703b00120024200370300200342003703002009420037030020014200370370200141b0016a41202004420020051b2204427f7c200141f0006a100e450d0620014190016a41186a2205200229030037030020014190016a41106a220c200329030037030020014190016a41086a220d20092903003703002001200129037037039001200220052903003703002003200c2903003703002009200d29030037030020012001290390013703702007200229030037030020082003290300370300200b2009290300370300200120012903703703b001024002400240200a422088220ea72202200aa7470d00200241016a22032002490d05200ea74101742209200320032009491bad220f42287e220e422088a70d05200ea722034100480d052002450d012006200241286c2003101e2206450d020c070b200a210f0c070b2003101f22060d050b200341081020000b41df88c0004133103a000b41df88c0004133103a000b1021000b41df88c0004133103a000b200a422088220ea721020b2006200241286c6a220241003a0000200241196a200141c8016a290300370000200241116a200141c0016a290300370000200241096a200141b8016a290300370000200220012903b001370001200241216a200128009001360000200241246a20014193016a280000360000200f42ffffffff0f83200e4220864280808080107c84210a0b2000200129031037001420002004370300200020012903503700342000412c6a200141106a41186a290300370000200041246a200141106a41106a2903003700002000411c6a200141106a41086a2903003700002000413c6a200141d0006a41086a290300370000200041c4006a200141d0006a41106a290300370000200041cc006a200141d0006a41186a290300370000200041ec006a200141306a41186a290300370000200041e4006a200141306a41106a290300370000200041dc006a200141306a41086a290300370000200020012903303700542000410c6a200a37020020002006360208200141d0016a24000b9e0a06037f027e017f017e027f017e230041c0006b220724002004a72108024002400240024002400240024002400240024002400240024002400240024020014201520d004101210920084101470d01427f200320067c200220057c22012002542208ad7c22022008200220035420022003511b22081b210a427f200120081b210b4100210c4201210d200450450d060c070b4101210c20084101470d012002200556200320065620032006511b450d02200320067d2002200554ad7d210a200220057d210b4200210d4100210c41012109200150450d030c040b200741086a20042005200642012002200310de01200741186a290300210a2007290310210b2007290308210d0c0a0b427f200320067c200220057c220b2002542208ad7c220a2008200a200354200a2003511b22081b210a427f200b20081b210b4200210d41002109200150450d010c020b200620037d2005200254ad7d210a200520027d210b4201210d4100210c410121092001500d010b200741306a41086a220842003703002007420037033041aeb9c0004116200741306a1001200741206a41086a220e20082903003703002007200729033037032002400240200741206a411041f8b3c200410041001002417f460d002007420037033820074200370330200741206a4110200741306a411041001002220f417f460d0a200f410f4d0d0a200741386a2903002101200729033021100c010b42002110420021010b200842003703002007420037033041aeb9c0004116200741306a1001200e20082903003703002007200729033037032020074200200120037d2010200254ad7d2203201020027d2202201056200320015620032001511b22081b37033820074200200220081b370330200741206a4110200741306a411010030b2004500d010b200c450d05200741306a41086a220842003703002007420037033041aeb9c0004116200741306a1001200741206a41086a220c200829030037030020072007290330370320200741206a411041f8b3c200410041001002417f460d012007420037033820074200370330200741206a4110200741306a4110410010022209417f460d072009410f4d0d07200741386a2903002103200729033021020c020b2009450d04200741306a41086a220842003703002007420037033041aeb9c0004116200741306a1001200741206a41086a220c200829030037030020072007290330370320200741206a411041f8b3c200410041001002417f460d022007420037033820074200370330200741206a4110200741306a4110410010022209417f460d072009410f4d0d07200741386a2903002103200729033021020c030b42002102420021030b200842003703002007420037033041aeb9c0004116200741306a1001200c20082903003703002007200729033037032020074200200320067d2002200554ad7d2204200220057d2205200256200420035620042003511b22081b37033820074200200520081b370330200741206a4110200741306a411010030c020b42002102420021030b200842003703002007420037033041aeb9c0004116200741306a1001200c2008290300370300200720072903303703202007427f200320067c200220057c22052002542208ad7c22022008200220035420022003511b22081b3703382007427f200520081b370330200741206a4110200741306a411010030b2000200b3703082000200d370300200041106a200a370300200741c0006a24000f0b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000bd20503027f037e017f230041206b220424004101210502402001a74101470d00200041086a2205427f2005290300220620037c2000290300220720027c22082007542205ad7c22072005200720065420072006511b22051b3703002000427f200820051b370300410021050b0240024002400240024002400240024020014201510d004200210620014200510d03200441106a41086a220042003703002004420037031041aeb9c0004116200441106a1001200441086a22052000290300370300200420042903103703002004411041f8b3c200410041001002417f460d01200442003703182004420037031020044110200441106a4110410010022209417f460d062009410f4d0d06200441186a2903002101200429031021060c020b2005450d02200441106a41086a220042003703002004420037031041aeb9c0004116200441106a1001200441086a22052000290300370300200420042903103703002004411041f8b3c200410041001002417f460d03200442003703182004420037031020044110200441106a4110410010022209417f460d062009410f4d0d06200441186a2903002101200429031021060c040b420021010b200042003703002004420037031041aeb9c0004116200441106a100120052000290300370300200420042903103703002004427f200120037c200620027c22032006542200ad7c22022000200220015420022001511b22001b3703182004427f200320001b37031020044110200441106a411010030b200441206a24000f0b42002106420021010b200042003703002004420037031041aeb9c0004116200441106a100120052000290300370300200420042903103703002004427f200120037c200620027c22032006542200ad7c22022000200220015420022001511b22001b3703182004427f200320001b37031020044110200441106a41101003200441206a24000f0b41df88c0004133103a000b41df88c0004133103a000b130020004102360204200041d0ffc2003602000bc20806027f017e017f047e017f037e230041d0006b22022400024002400240024002404110101f2203450d00200341086a41002900d3c740370000200341002900cbc740370000200341104130101e2203450d0120032001290000370010200341286a200141186a290000370000200341206a200141106a290000370000200341186a200141086a29000037000042002104200241c0006a41086a220542003703002002420037034020034130200241c0006a1001200241306a41086a200529030037030020022002290340370330024002400240024002400240200241306a411041f8b3c200410041001002417f460d002002420037034820024200370340200241306a4110200241c0006a4110410010022205417f460d052005410f4d0d05200241c8006a2903002106200229034021072002420037034820024200370340200241306a4110200241c0006a4110411010022205417f460d052005410f4d0d05200241c0006a41086a2903002108200229034021092003101d4114101f2203450d09200341106a41002800d5ba40360000200341086a41002900cdba40370000200341002900c5ba40370000200341144134101e2203450d0a200320012900003700142003412c6a200141186a290000370000200341246a200141106a2900003700002003411c6a200141086a29000037000042002104200241c0006a41086a220142003703002002420037034020034134200241c0006a1001200241306a41086a2205200129030037030020022002290340370330200241306a411041f8b3c200410041001002417f460d012002420037034820024200370340200241306a4110200241c0006a411041001002220a417f460d08200a410f4d0d08200241c8006a290300210b2002290340210c0c020b2003101d4200210b0c020b4200210c4200210b0b2003101d2001420037030020024200370340418cb9c000410d200241c0006a100120052001290300370300200220022903403703300240200241306a411041f8b3c200410041001002417f460d0020024200370340200241306a4110200241c0006a41084100100241016a41084d0d02200229034021040b4200210d2002420042002009420010d203200241106a200842002004420010d203200241206a200442002009420010d2034200210402404200420052200842005271200229030842005272200229031842005272200241286a2903002209200229030020022903107c7c2208200954720d00200620082002290320220d200754200820065420082006511b22011b20087d2007200d20011b2208200d54ad7d21042008200d7d210d0b2004200b200c200d56200b200456200b2004511b22011b210b200d200c20011b21040b200020043703002000200b370308200241d0006a24000f0b41df88c0004133103a000b41df88c0004133103a000b411041011020000b413041011020000b41df88c0004133103a000b411441011020000b413441011020000bbf1b05017f017e017f017e067f230041d0016b220324004200210420034190016a41086a22054200370300200342003703900141c4b9c000411b20034190016a1001200341a0016a41086a200529030037030020032003290390013703a0010240024002400240200341a0016a411041f8b3c200410041001002417f460d002003420037032820034200370320200341a0016a4110200341206a4110410010022205417f460d022005410f4d0d02200341286a290300210620032903202104411421074114101f2205450d010c030b42002106411421074114101f22050d020b200741011020000b41df88c0004133103a000b200541106a41002800d5ba40360000200541086a41002900cdba40370000200541002900c5ba4037000002400240024002400240024002400240024002400240024002400240200520074134101e2205450d00200520002900003700142005412c6a200041186a290000370000200541246a200041106a2900003700002005411c6a200041086a29000037000020034190016a41086a2207420037030020034200370390012005413420034190016a1001200341a0016a41086a200729030037030020032003290390013703a0012003200137032020032002370328200341a0016a4110200341206a411010032005101d2004200158200620025820062002511b0d0c4114101f2205450d02200541106a41002800d5ba40360000200541086a41002900cdba40370000200541002900c5ba40370000200541144134101e2205450d03200520002900003700142005412c6a200041186a290000370000200541246a200041106a2900003700002005411c6a200041086a290000370000200341086a2005413410e301200341086a41106a290300210120032903102102200328020821082005101d410e101f2205450d04200541066a41002900f7ba40370000200541002900f1ba403700002005410e412e101e2205450d052005200029000037000e200541266a200041186a2900003700002005411e6a200041106a290000370000200541166a200041086a29000037000020034190016a41086a2207420037030020034200370390012005412e20034190016a1001200341c0016a41086a200729030037030020032003290390013703c001200341c0016a411010092005101d02402002200184500d002008450d0020034190016a41086a22054200370300200342003703900141aeb9c000411620034190016a1001200341a0016a41086a2207200529030037030020032003290390013703a00102400240200341a0016a411041f8b3c200410041001002417f460d002003420037032820034200370320200341a0016a4110200341206a4110410010022208417f460d0b2008410f4d0d0b200341286a2903002106200329032021040c010b42002104420021060b20054200370300200342003703900141aeb9c000411620034190016a10012007200529030037030020032003290390013703a00120034200200620017d2004200254ad7d2201200420027d2202200456200120065620012006511b22051b37032820034200200220051b370320200341a0016a4110200341206a411010030b410e101f2205450d06200541066a41002900b3c541370000200541002900adc5413700002005410e412e101e2205450d072005200029000037000e200541266a200041186a2900003700002005411e6a200041106a290000370000200541166a200041086a29000037000020034190016a41086a2207420037030020034200370390012005412e20034190016a1001200341c0016a41086a200729030037030020032003290390013703c00102400240200341c0016a411041f8b3c200410041001002417f460d00200341206a41186a4200370300200341206a41106a4200370300200341206a41086a420037030020034200370320200341c0016a4110200341206a4120410010022207417f460d032007411f4d0d03200341a0016a41186a2207200341206a41186a2208290300370300200341a0016a41106a2209200341206a41106a220a290300370300200341a0016a41086a220b200341206a41086a220c290300370300200320032903203703a001200341c0016a411010092005101d20082007290300370300200a2009290300370300200c200b290300370300200320032903a001370320410e101f2205450d0b200541066a41002900e5c541370000200541002900dfc5413700002005410e412e101e2205450d0c2005200329032037000e200541266a200341386a2903003700002005411e6a200341206a41106a290300370000200541166a200341206a41086a29030037000020034190016a41086a2207420037030020034200370390012005412e20034190016a1001200341c0016a41086a200729030037030020032003290390013703c001200341c0016a411010092005101d410d2107410d101f2205450d010c0d0b2005101d410d2107410d101f22050d0c0b200741011020000b413441011020000b41df88c0004133103a000b411441011020000b413441011020000b410e41011020000b412e41011020000b410e41011020000b412e41011020000b41df88c0004133103a000b410e41011020000b412e41011020000b200541056a41002900e1ee41370000200541002900dcee41370000024002400240024002400240024002400240024020052007412d101e2205450d002005200029000037000d200541256a200041186a2900003700002005411d6a200041106a290000370000200541156a200041086a29000037000020034190016a41086a2207420037030020034200370390012005412d20034190016a1001200341c0016a41086a200729030037030020032003290390013703c001200341c0016a411010092005101d4112101f2205450d01200541106a41002f0087d7413b0000200541086a41002900ffd641370000200541002900f7d641370000200541124132101e2205450d02200520002900003700122005412a6a200041186a290000370000200541226a200041106a2900003700002005411a6a200041086a29000037000020034190016a41086a2207420037030020034200370390012005413220034190016a1001200341c0016a41086a200729030037030020032003290390013703c001200341c0016a411010092005101d200010e401200010e5014113101f2205450d032005410f6a41002800d5f341360000200541086a41002900cef341370000200541002900c6f341370000200541134133101e2205450d04200520002900003700132005412b6a200041186a290000370000200541236a200041106a2900003700002005411b6a200041086a29000037000020034190016a41086a2207420037030020034200370390012005413320034190016a1001200341c0016a41086a200729030037030020032003290390013703c001200341c0016a411010092005101d200341206a20001033024020032802282205450d00200328022c21072005200341206a41106a280200100f2007450d002005101d0b4112101f2205450d05200541106a41002f00cca8413b0000200541086a41002900c4a841370000200541002900bca841370000200541124132101e2205450d06200520002900003700122005412a6a200041186a290000370000200541226a200041106a2900003700002005411a6a200041086a29000037000020034190016a41086a2207420037030020034200370390012005413220034190016a1001200341c0016a41086a200729030037030020032003290390013703c001200341c0016a411010092005101d4118101f2205450d07200541106a41002900e9ba40370000200541086a41002900e1ba40370000200541002900d9ba40370000200541184138101e2205450d0820052000290000370018200541306a200041186a290000370000200541286a200041106a290000370000200541206a200041086a29000037000020034190016a41086a2207420037030020034200370390012005413820034190016a1001200341a0016a41086a200729030037030020032003290390013703a00102400240200341a0016a411041f8b3c200410041001002417f460d002003420037032820034200370320200341a0016a4110200341206a4110410010022207417f460d012007410f4d0d01200341286a290300210220032903202101410021072005101d2001200284504101710d0d0c0b0b410121072005101d4100410171450d0a0c0c0b41df88c0004133103a000b412d41011020000b411241011020000b413241011020000b411341011020000b413341011020000b411241011020000b413241011020000b411841011020000b413841011020000b20070d010b200341d0016a24000f0b024002404113101f2205450d002005410f6a41002800c1ba40360000200541086a41002900baba40370000200541002900b2ba40370000200541134133101e2205450d01200520002900003700132005412b6a200041186a2207290000370000200541236a200041106a22082900003700002005411b6a200041086a220929000037000020034190016a41086a220a420037030020034200370390012005413320034190016a1001200341c0016a41086a200a29030037030020032003290390013703c001200341c0016a411010092005101d200341206a41086a41013a0000200341296a2000290000370000200341316a2009290000370000200341396a2008290000370000200341c1006a2007290000370000200341023a0020200341206a108b01200341d0016a24000f0b411341011020000b413341011020000bde0104017f017e017f027e230041206b2203240042002104200341106a41086a220542003703002003420037031020012002200341106a1001200341086a2005290300370300200320032903103703000240024002402003411041f8b3c200410041001002417f460d00200342003703182003420037031020034110200341106a4110410010022201417f460d022001410f4d0d02200341186a290300210620032903102107200341101009420121040c010b0b2000200437030020002007370308200041106a2006370300200341206a24000f0b41df88c0004133103a000bec1201077f230041b0036b2201240002400240024002400240024002400240024002400240024002400240024002404112101f2202450d00200241106a41002f00ddc5413b0000200241086a41002900d5c541370000200241002900cdc541370000200241124132101e2202450d01200220002900003700122002412a6a200041186a290000370000200241226a200041106a2900003700002002411a6a200041086a290000370000200141e8016a41086a22004200370300200142003703e80120024132200141e8016a1001200141b0026a41086a2000290300370300200120012903e8013703b00202400240200141b0026a411041f8b3c200410041001002417f460d002001421037026c2001200141b0026a360268200141d0026a200141e8006a10eb0220012d00e80222034102460d0420014188016a41186a20014181036a29000037030020014188016a41106a200141f9026a29000037030020014188016a41086a200141f1026a290000370300200141e8016a41086a20014192036a290100370300200141e8016a41106a2001419a036a290100370300200141e8016a41186a200141a2036a290100370300200120012900e9023703880120012001418a036a2901003703e80120014189036a2d00002104200141b0026a411010090c010b410221030b200141286a41186a20014188016a41186a290300370300200141286a41106a220020014188016a41106a290300370300200141286a41086a220520014188016a41086a290300370300200141086a41086a2206200141e8016a41086a290300370300200141086a41106a2207200141e8016a41106a290300370300200141086a41186a200141e8016a41186a2903003703002001200129038801370328200120012903e8013703082002101d20034102460d0f200141e8006a41186a200141286a41186a290300370300200141e8006a41106a2000290300370300200141e8006a41086a2005290300370300200141c8006a41086a2006290300370300200141c8006a41106a2007290300370300200141c8006a41186a200141086a41186a2903003703002001200129032837036820012001290308370348410021020240200441ff01714101470d004112101f2202450d06200241106a41002f00ddc5413b0000200241086a41002900d5c541370000200241002900cdc541370000200241124132101e2202450d07200220012903483700122002412a6a200141e0006a290300370000200241226a200141c8006a41106a2903003700002002411a6a200141c8006a41086a2903003700000b0240024020034101470d004112101f2200450d09200041106a41002f00ddc5413b0000200041086a41002900d5c541370000200041002900cdc541370000200041124132101e2200450d0a200020012903683700122000412a6a20014180016a290300370000200041226a200141e8006a41106a2903003700002000411a6a200141e8006a41086a290300370000200141e8016a41086a22054200370300200142003703e80120004132200141e8016a1001200141b0026a41086a2005290300370300200120012903e8013703b002200141b0026a411041f8b3c200410041001002417f460d0b200142103702c4022001200141b0026a3602c002200141d0026a200141c0026a10eb0220012d00e80222054102460d0c20014188016a41106a200141d0026a41106a29030037030020014188016a41086a200141d0026a41086a290300370300200120012903d00237038801200141e8016a200141d0026a41196a41c70010ce031a200120053a00a00120014188016a41196a200141e8016a41c70010ce031a200141c1016a20043a0000200141c2016a2001290348370100200141ca016a200141c8006a41086a290300370100200141d2016a200141c8006a41106a290300370100200141da016a200141e0006a290300370100200141e8016a41086a22044200370300200142003703e80120004132200141e8016a1001200141b0026a41086a2004290300370300200120012903e8013703b002200141103602d4022001200141b0026a3602d00220014188016a200141d0026a10f9022000101d4101210420020d010c0e0b0240200441ff01714101470d00200141e8016a41086a22004200370300200142003703e80141c8d8c100411a200141e8016a1001200141b0026a41086a2000290300370300200120012903e8013703b0024120101f2200450d0d20002001290348370000200041186a200141c8006a41186a290300370000200041106a200141c8006a41106a290300370000200041086a200141c8006a41086a290300370000200141b0026a41102000412010032000101d410021004100210420020d010c0e0b200141e8016a41086a22004200370300200142003703e80141c8d8c100411a200141e8016a1001200141d0026a41086a2000290300370300200120012903e8013703d002200141d0026a4110100941002100410021042002450d0d0b200141e8016a41086a22054200370300200142003703e80120024132200141e8016a1001200141b0026a41086a2005290300370300200120012903e8013703b002200141b0026a411041f8b3c200410041001002417f460d03200142103702c4022001200141b0026a3602c002200141d0026a200141c0026a10eb0220012d00e8024102460d0420014188016a41106a200141d0026a41106a29030037030020014188016a41086a200141d0026a41086a290300370300200120012903d00237038801200141e8016a200141d0026a41196a41c70010ce031a20014188016a41196a200141e8016a41c70010ce032001290368370000200141a9016a200141e8006a41086a290300370000200141b1016a200141e8006a41106a290300370000200141b9016a20014180016a290300370000200120033a00a001200141e8016a41086a22034200370300200142003703e80120024132200141e8016a1001200141b0026a41086a2003290300370300200120012903e8013703b002200141103602d4022001200141b0026a3602d00220014188016a200141d0026a10f9022002101d410121032004200045720d0e0c0d0b411241011020000b413241011020000b41df88c0004133103a000b41f5d7c10041d300103a000b41df88c0004133103a000b411241011020000b413241011020000b411241011020000b413241011020000b41f5d7c10041d300103a000b41df88c0004133103a000b412041011020000b410021032004200045720d010b2000101d0b2002452003720d002002101d0b200141b0036a24000bd416010e7f230041c0026b220124000240024002400240024002400240024002400240024002400240024002404112101f2202450d00200241106a41002f00cbc5413b0000200241086a41002900c3c541370000200241002900bbc541370000200241124132101e2202450d01200220002900003700122002412a6a200041186a290000370000200241226a200041106a2900003700002002411a6a200041086a29000037000020014190026a41086a2200420037030020014200370390022002413220014190026a100120014180026a41086a20002903003703002001200129039002370380020240024020014180026a411041f8b3c200410041001002417f460d002001421037029402200120014180026a36029002200141c0006a20014190026a105e20012802402203450d0520012802442104200141b0016a20014190026a105f20012d00b00122054102460d04200141e0006a41186a200141c9016a290000370300200141e0006a41106a200141c1016a290000370300200141e0006a41086a200141b9016a290000370300200141a0026a41086a200141da016a290100370300200141a0026a41106a200141e2016a290100370300200141a0026a41186a200141ea016a290100370300200120012900b1013703602001200141d2016a2901003703a002200141d1016a2d0000210020014180026a411010090c010b410221050b200141206a41186a200141e0006a41186a290300370300200141206a41106a2206200141e0006a41106a290300370300200141206a41086a2207200141e0006a41086a290300370300200141086a2208200141a0026a41086a2209290300370300200141106a220a200141a0026a41106a220b290300370300200141186a200141a0026a41186a29030037030020012001290360370320200120012903a0023703002002101d20054102460d0e200141a0026a41186a200141206a41186a290300370300200b200629030037030020092007290300370300200141c0006a41086a2008290300370300200141c0006a41106a200a290300370300200141c0006a41186a200141186a290300370300200120012903203703a002200120012903003703404100210c0240200041ff01714101470d004112101f2202450d06200241106a41002f00cbc5413b0000200241086a41002900c3c541370000200241002900bbc541370000200241124132101e220c450d07200c2001290340370012200c412a6a200141d8006a290300370000200c41226a200141c0006a41106a290300370000200c411a6a200141c0006a41086a2903003700000b0240024002400240024020054101470d004112101f2202450d0c200241106a41002f00cbc5413b0000200241086a41002900c3c541370000200241002900bbc541370000200241124132101e220d450d0d200d20012903a002370012200d412a6a200141a0026a41186a290300370000200d41226a200141a0026a41106a290300370000200d411a6a200141a0026a41086a29030037000020014190026a41086a220242003703002001420037039002200d413220014190026a100120014180026a41086a2002290300370300200120012903900237038002200141b0016a20014180026a105d20012d00bc014102460d0e200141e0006a200141b0016a41d00010ce031a2001418d016a20003a00002001418e016a200129034037010020014196016a200141c0006a41086a2903003701002001419e016a200141c0006a41106a290300370100200141a6016a200141c0006a41186a29030037010020014190026a41086a220242003703002001420037039002200d413220014190026a100120014180026a41086a2002290300370300200120012903900237038002200141003602b801200142013703b0012001280260210e2001200128026822023602900220014190026a200141b0016a106202402002450d00200241057421094100200141b0016a41086a28020022006b210720012802b001210a20012802b4012108200e210203400240200820076a411f4b0d00200041206a22062000490d052008410174220b20062006200b491b22064100480d05024002402008450d00200a20082006101e220a0d010c090b2006101f220a450d080b200621080b200a20006a22062002290000370000200641186a200241186a290000370000200641106a200241106a290000370000200641086a200241086a290000370000200741606a2107200041206a2100200241206a2102200941606a22090d000b200141b8016a2000360200200120083602b4012001200a3602b0010b200141ec006a200141b0016a10ca0120012802b401210220014180026a411020012802b0012200200141b0016a41086a280200100302402002450d002000101d0b02402001280264450d00200e101d0b200d101d4101210e200c0d010c100b0240200041ff01714101470d0020014190026a41086a22024200370300200142003703900241adeec100411a20014190026a100120014180026a41086a20022903003703002001200129039002370380024120101f2202450d0f20022001290340370000200241186a200141c0006a41186a290300370000200241106a200141c0006a41106a290300370000200241086a200141c0006a41086a29030037000020014180026a41102002412010032002101d4100210d4100210e200c0d010c100b20014190026a41086a22024200370300200142003703900241adeec100411a20014190026a1001200141b0016a41086a200229030037030020012001290390023703b001200141b0016a411010094100210d4100210e200c450d0f0b20014190026a41086a220242003703002001420037039002200c413220014190026a100120014180026a41086a22002002290300370300200120012903900237038002200141b0016a20014180026a105d20012d00bc014102460d07200141e0006a200141b0016a41d00010ce031a200141ed006a20012903a002370000200141f5006a200141a0026a41086a290300370000200141fd006a200141a0026a41106a29030037000020014185016a200141a0026a41186a290300370000200120053a006c200242003703002001420037039002200c413220014190026a100120002002290300370300200120012903900237038002200141003602b801200142013703b001200128026021052001200128026822023602900220014190026a200141b0016a106202402002450d00200241057421094100200141b0016a41086a28020022006b210720012802b001210a20012802b40121082005210203400240200820076a411f4b0d00200041206a22062000490d032008410174220b20062006200b491b22064100480d03024002402008450d00200a20082006101e220a0d010c060b2006101f220a450d050b200621080b200a20006a22062002290000370000200641186a200241186a290000370000200641106a200241106a290000370000200641086a200241086a290000370000200741606a2107200041206a2100200241206a2102200941606a22090d000b200141b8016a2000360200200120083602b4012001200a3602b0010b200141ec006a200141b0016a10ca0120012802b401210220014180026a411020012802b0012200200141b8016a280200100302402002450d002000101d0b02402001280264450d002005101d0b200c101d41012102200e200d45720d100c0f0b1021000b200641011020000b200641011020000b411241011020000b413241011020000b2004450d002003101d0b41df88c0004133103a000b41f5d7c10041d300103a000b411241011020000b413241011020000b411241011020000b413241011020000b41f5d7c10041d300103a000b412041011020000b41002102200e200d45720d010b200d101d0b02400240200c45200272450d002004450d020c010b200c101d2004450d010b2003101d0b200141c0026a24000b130020004108360204200041dbc7c0003602000b8f0d05017f017e017f017e057f230041b0016b2203240042002104200341a0016a41086a22054200370300200342003703a00141c4b9c000411b200341a0016a100120034190016a41086a2005290300370300200320032903a00137039001024002400240024020034190016a411041f8b3c200410041001002417f460d00200342003703282003420037032020034190016a4110200341206a4110410010022205417f460d022005410f4d0d02200341286a290300210620032903202104411821074118101f2205450d010c030b42002106411821074118101f22050d020b200741011020000b41df88c0004133103a000b200541106a41002900e9ba40370000200541086a41002900e1ba40370000200541002900d9ba403700000240024002400240024002400240024002400240200520074138101e2205450d0020052000290000370018200541306a200041186a290000370000200541286a200041106a290000370000200541206a200041086a290000370000200341a0016a41086a22074200370300200342003703a00120054138200341a0016a100120034190016a41086a2007290300370300200320032903a00137039001200320013703202003200237032820034190016a4110200341206a411010032005101d2004200158200620025820062002511b0d084118101f2205450d02200541106a41002900e9ba40370000200541086a41002900e1ba40370000200541002900d9ba40370000200541184138101e2205450d0320052000290000370018200541306a200041186a290000370000200541286a200041106a290000370000200541206a200041086a290000370000200341086a2005413810e301200341086a41106a290300210120032802082107200329031021022005101d02402002200184500d002007450d00200341a0016a41086a22054200370300200342003703a00141aeb9c0004116200341a0016a100120034190016a41086a22072005290300370300200320032903a001370390010240024020034190016a411041f8b3c200410041001002417f460d00200342003703282003420037032020034190016a4110200341206a4110410010022208417f460d092008410f4d0d09200341286a2903002106200329032021040c010b42002104420021060b20054200370300200342003703a00141aeb9c0004116200341a0016a100120072005290300370300200320032903a0013703900120034200200620017d2004200254ad7d2201200420027d2202200456200120065620012006511b22051b37032820034200200220051b37032020034190016a4110200341206a411010030b4114101f2205450d04200541106a41002800d5ba40360000200541086a41002900cdba40370000200541002900c5ba40370000200541144134101e2205450d05200520002900003700142005412c6a200041186a290000370000200541246a200041106a2900003700002005411c6a200041086a290000370000200341a0016a41086a22074200370300200342003703a00120054134200341a0016a100120034190016a41086a2007290300370300200320032903a00137039001024020034190016a411041f8b3c200410041001002417f460d00200342003703282003420037032020034190016a4110200341206a4110410010022207417f460d022007410f4d0d02200341286a290300210220032903202101410021072005101d2001200284504101710d0a0c080b410121072005101d4100410171450d070c090b413841011020000b41df88c0004133103a000b411841011020000b413841011020000b411441011020000b413441011020000b41df88c0004133103a000b20070d010b200341b0016a24000f0b024002404113101f2205450d002005410f6a41002800c1ba40360000200541086a41002900baba40370000200541002900b2ba40370000200541134133101e2205450d01200520002900003700132005412b6a200041186a2207290000370000200541236a200041106a22082900003700002005411b6a200041086a2209290000370000200341a0016a41086a220a4200370300200342003703a00120054133200341a0016a1001200341206a41086a220b200a290300370300200320032903a001370320200341206a411010092005101d200b41013a0000200341296a2000290000370000200341316a2009290000370000200341396a2008290000370000200341c1006a2007290000370000200341023a0020200341206a108b01200341b0016a24000f0b411341011020000b413341011020000b13002000410a360204200041a082c3003602000b3901017f02404110101f2202450d002002420037000820024200370000200042908080808002370204200020023602000f0b411041011020000b880807047f017e097f047e017f017e017f230041c0006b220224000240024002400240024002400240024002400240410e101f2203450d00200341066a41002900f7ba40370000200341002900f1ba403700002003410e412e101e2204450d012004200129000037000e200441266a200141186a2900003700002004411e6a200141106a290000370000200441166a200141086a290000370000200241306a41086a22014200370300200242003703302004412e200241306a1001200241086a41086a2001290300370300200220022903303703080240024002400240200241086a411041f8b3c200410041001002417f460d002002421037021c2002200241086a3602182002200241186a10d5012002280200450d0b20022802042205ad42287e2206422088a70d032006a72201417f4c0d032001450d012001101f2207450d062005450d020c070b20004100360208200042083702000c080b4108210720050d050b4100210e420021062007450d080c050b102e000b410e41011020000b412e41011020000b200141081020000b200241186a41086a22032802002108200228021c21092002280218210a200241336a210b420021064100210c4100210d410021012005210e03402002420037033020034100200a2009200241306a410820081002220f200f417f461b220f4108200f4108491b20086a2208360200200f41074d0d0320022903302110200242003703382002420037033020034100200a2009200241306a411020081002220f200f417f461b220f4110200f4110491b20086a2208360200200f410f4d0d03200241306a41086a2903002111200229033021122002420037033020034100200a2009200241306a410820081002220f200f417f461b220f4108200f4108491b20086a2208360200200f41074d0d0320022903302113200241003a003020032008200a2009200241306a41012008100241016a41014b220f6a2208360200200f450d03200141016a210f20022d003021142002200b28000036002b200220022800303602282002200228002b3600332002200228022836023002402001200e470d00200c200f200f200c491b220ead42287e2215422088a70d062015a722164100480d0602402001450d002007200d2016101e22070d010c080b2016101f2207450d070b2007200d6a220141206a20143a00002001201137030820012012370300200141186a2010370300200141106a2013370300200141246a2002280033360000200141216a200228023036000020064280808080107c2106200c41026a210c200d41286a210d200f2101200f2005490d000b2007450d030b20002006200ead84370204200020073602000b2004101d200241c0006a24000f0b200e450d002007101d0b41df88c0004133103a000b1021000b201641081020000bdc0202027f027e230041206b22022400024002404114101f2203450d00200341106a41002800d5ba40360000200341086a41002900cdba40370000200341002900c5ba40370000200341144134101e2203450d01200320012900003700142003412c6a200141186a290000370000200341246a200141106a2900003700002003411c6a200141086a29000037000042002104200241106a41086a220142003703002002420037031020034134200241106a1001200241086a2001290300370300200220022903103703000240024002402002411041f8b3c200410041001002417f460d00200242003703182002420037031020024110200241106a4110410010022201417f460d022001410f4d0d02200241186a2903002105200229031021040c010b420021050b2003101d2000200537030820002004370300200241206a24000f0b41df88c0004133103a000b411441011020000b413441011020000bd10903037f037e017f23004190016b22042400024002400240024002404114101f2205450d00200541106a41002800d5ba40360000200541086a41002900cdba40370000200541002900c5ba40370000200541144134101e2205450d01200520012900003700142005412c6a200141186a290000370000200541246a200141106a2900003700002005411c6a200141086a29000037000020044180016a41086a2206420037030020044200370380012005413420044180016a1001200441f0006a41086a200629030037030020042004290380013703700240024002400240200441f0006a411041f8b3c200410041001002417f460d002004420037030820044200370300200441f0006a411020044110410010022206417f460d022006410f4d0d02200441086a2903002107200429030021080c010b42002108420021070b2005101d20044180016a41086a22054200370300200442003703800141c4b9c000411b20044180016a1001200441f0006a41086a200529030037030020042004290380013703700240200441f0006a411041f8b3c200410041001002417f460d002004420037030820044200370300200441f0006a411020044110410010022205417f460d022005410f4d0d0220082007844200520d002004290300200258200441086a290300220920035820092003511b0d0020004200370300200041013a0018200041106a4200370300200041086a420037030020044190016a24000f0b20044180016a41086a22054200370300200442003703800141c4b9c000411b20044180016a1001200441f0006a41086a2005290300370300200420042903800137037002400240200441f0006a411041f8b3c200410041001002417f460d002004420037030820044200370300200441f0006a411020044110410010022205417f460d062005410f4d0d062004290300200256200441086a290300220920035620092003511b450d0020012002200310e201410121010c010b4114101f2205450d06200541106a41002800d5ba40360000200541086a41002900cdba40370000200541002900c5ba40370000200541144134101e2205450d07200520012900003700142005412c6a200141186a220a290000370000200541246a200141106a2900003700002005411c6a200141086a29000037000020044180016a41086a2206420037030020044200370380012005413420044180016a1001200441086a200629030037030020042004290380013703002004411041f8b3c20041004100100221062005101d02402006417f470d00200110ed01200441386a2003370300200441306a2002370300200441086a41003a0000200441096a2001290000370000200441116a200141086a290000370000200441196a200141106a290000370000200441216a200a290000370000200441023a00002004108b010b20012002200310e201410021010b2000200220087d200820027d20082002582007200358200720035122051b22061b370308200020013a001820002008200256200720035620051bad370300200041106a200320077d2002200854ad7d200720037d2008200254ad7d20061b37030020044190016a24000f0b41df88c0004133103a000b41df88c0004133103a000b411441011020000b413441011020000b41df88c0004133103a000b411441011020000b413441011020000b9d0803037f017e077f23004190016b22012400200141106a41086a220242003703002001420037031041c8c2c1004113200141106a100120014180016a41086a20022903003703002001200129031037038001410021020240024002400240024020014180016a411041f8b3c200410041001002417f460d002001410036021020014180016a4110200141106a41044100100241016a41044d0d01200128021021020b4120101f2203450d01200320002900002204370000200341186a200041186a290000370000200341106a200041106a290000370000200341086a200041086a29000037000020032d000121052003101d20014180016a20054108742004a7220341c0017172410676220510b00102400240024002402003413f7122032001280288014f0d00200120012802800120034105746a2203109a012001290300200141086a290300844200510d010b0240200128028401450d00200128028001101d0b200141106a200210b001024020012802182203413f4d0d00200141186a21050340200241016a210202402001280214450d002001280210101d0b200141106a200210b0012005280200220341c0004f0d000b0b2001280210210620012802142107200141106a41186a2208200041186a290000370300200141106a41106a2209200041106a290000370300200141106a41086a220a200041086a29000037030020012000290000370310200341016a210520072003470d0620034101742207200520052007491b2207ad4205862204422088a70d052004a7220b4100480d052003450d0120062003410574200b101e2206450d020c060b20032000290000370000200341186a200041186a290000370000200341106a200041106a290000370000200341086a200041086a290000370000200141106a41086a20014180016a41086a28020036020020012001290380013703102005200141106a10e70220014190016a24000f0b200b101f22060d040b200b41011020000b41df88c0004133103a000b412041011020000b1021000b200241067420036a210b200620034105746a22032001290310370000200341186a2008290300370000200341106a2009290300370000200341086a200a2903003700000240200541c000470d00200141106a41086a220342003703002001420037031041c8c2c1004113200141106a100120014180016a41086a200329030037030020012001290310370380012001200241016a36021020014180016a4110200141106a410410030b2001200536021820012007360214200120063602102002200141106a10e702200141106a41086a2000290000370300200141106a41106a200041086a290000370300200141106a41186a200041106a290000370300200141306a200041186a2900003703002001200b360214200141013a0010200141106a108b0120014190016a24000bcc0304027f017e017f027e230041306b2204240020042001109a0102400240024002400240024002402004290300200441086a290300844200510d004114101f2205450d05200541106a41002800d5ba40360000200541086a41002900cdba40370000200541002900c5ba40370000200541144134101e2205450d06200520012900003700142005412c6a200141186a290000370000200541246a200141106a2900003700002005411c6a200141086a29000037000042002106200441206a41086a220742003703002004420037032020054134200441206a1001200441106a41086a200729030037030020042004290320370310200441106a411041f8b3c200410041001002417f460d012004420037032820044200370320200441106a4110200441206a4110410010022207417f460d042007410f4d0d04200441286a2903002108200429032021060c020b20004184b8c000360204200041086a4122360200410121010c020b420021080b2005101d2001200620027c2209200820037c2009200654ad7c10e201200041106a2003370300200041086a2002370300410021010b20002001360200200441306a24000f0b41df88c0004133103a000b411441011020000b413441011020000be10604027f017e017f057e230041206b22042400024002400240024002404114101f2205450d00200541106a41002800d5ba40360000200541086a41002900cdba40370000200541002900c5ba40370000200541144134101e2205450d01200520012900003700142005412c6a200141186a290000370000200541246a200141106a2900003700002005411c6a200141086a29000037000042002106200441106a41086a220742003703002004420037031020054134200441106a1001200441086a2007290300370300200420042903103703000240024002402004411041f8b3c200410041001002417f460d00200442003703182004420037031020044110200441106a4110410010022207417f460d022007410f4d0d02200441186a2903002108200429031021090c010b42002109420021080b2005101d20012009200220092009200256200820035620082003511b22051b220a7d20082003200820051b220b7d2009200a54ad7d10e20102400240024002402002200a7d22092003200b7d2002200a54ad7d220c84500d004118101f2205450d08200541106a41002900e9ba40370000200541086a41002900e1ba40370000200541002900d9ba40370000200541184138101e2205450d0920052001290000370018200541306a200141186a290000370000200541286a200141106a290000370000200541206a200141086a29000037000042002102200441106a41086a220742003703002004420037031020054138200441106a1001200441086a2007290300370300200420042903103703002004411041f8b3c200410041001002417f460d01200442003703182004420037031020044110200441106a4110410010022207417f460d072007410f4d0d07200441186a2903002103200429031021020c020b4200210c0c020b420021030b2005101d200120022009200220022009562003200c562003200c511b22051b22087d2003200c200320051b22067d2002200854ad7d10e701200c20067d2009200854ad7d210c2006200b7c2008200a7c2202200854ad7c2103200920087d21060b2000200637031020002002370300200041186a200c37030020002003370308200441206a24000f0b41df88c0004133103a000b411441011020000b413441011020000b41df88c0004133103a000b411841011020000b413841011020000bca0504027f017e017f027e230041306b2205240002400240024002404114101f2206450d00200641106a41002800d5ba40360000200641086a41002900cdba40370000200641002900c5ba40370000200641144134101e2206450d01200620012900003700142006412c6a200141186a290000370000200641246a200141106a2900003700002006411c6a200141086a29000037000042002107200541206a41086a220842003703002005420037032020064134200541206a1001200541106a41086a200829030037030020052005290320370310024002400240200541106a411041f8b3c200410041001002417f460d002005420037032820054200370320200541106a4110200541206a4110410010022208417f460d022008410f4d0d02200541286a2903002109200529032021070c010b420021090b2006101d024002400240200720027d220a200756200920037d2007200254ad7d220720095620072009511b450d00200041a6b8c000360204200041086a411d3602000c010b200541206a41086a220642003703002005420037032041c4b9c000411b200541206a1001200541106a41086a2006290300370300200520052903203703100240200541106a411041f8b3c200410041001002417f460d002005420037032820054200370320200541106a4110200541206a4110410010022206417f460d062006410f4d0d06200a20052903205a2007200541206a41086a29030022095a20072009511b0d00200041c3b8c000360204200041086a411a3602000c010b200541086a20012004200a2007103d20052802082206450d01200528020c210120002006360204200041086a20013602000b410121060c050b2001200a200710e201200041106a2003370300200041086a2002370300410021060c040b41df88c0004133103a000b411441011020000b413441011020000b41df88c0004133103a000b20002006360200200541306a24000be00702097f027e230041306b2202240002400240410e101f2203450d00200341066a41002900f7ba40370000200341002900f1ba403700002003410e412e101e2204450d012004200029000037000e200441266a200041186a2900003700002004411e6a200041106a290000370000200441166a200041086a290000370000200241186a41086a22054200370300200242003703182004412e200241186a1001200241086a41086a20052903003703002002200229031837030820024100360220200242013703182001280200210620022001280208220036022c2002412c6a200241186a106202400240024002400240024002402000450d00200041286c210720052802002108200228021c210003400240024002400240200020086b41084f0d00200841086a22092008490d0720004101742203200920092003491b220a4100480d072000450d0120022802182000200a101e22030d020c080b200841086a2109200228021821030c020b200a101f2203450d060b2002200a36021c20022003360218200a21000b20052009360200200320086a200641186a290000370000200641086a290300210b2006290300210c0240024002400240200020096b41104f0d00200941106a22082009490d072000410174220a20082008200a491b220a4100480d072000450d0120032000200a101e22030d020c090b200941106a21080c020b200a101f2203450d070b2002200a36021c20022003360218200a21000b200320096a2209200b3700082009200c37000020052008360200200641106a290300210b0240200020086b41074b0d00200841086a22092008490d042000410174220a20092009200a491b22094100480d04024002402000450d00200320002009101e22030d010c090b2009101f2203450d080b2002200936021c200220033602180b2005200841086a360200200320086a200b3700000240024002400240200228021c220020052802002203470d00200341016a22002003490d0720034101742208200020002008491b22004100480d072003450d01200228021820032000101e22090d020c0b0b200228021821090c020b2000101f2209450d090b2002200036021c200220093602180b2005200341016a2208360200200920036a200641206a2d00003a0000200641286a2106200741586a22070d000c020b0b20052802002108200228021c2100200228021821090b200241086a411020092008100302402000450d002009101d0b2004101d0240200141046a280200450d002001280200101d0b200241306a24000f0b1021000b200a41011020000b200a41011020000b200941011020000b200041011020000b410e41011020000b412e41011020000b940304027f017e017f017e230041206b22042400024002404118101f2205450d00200541106a41002900e9ba40370000200541086a41002900e1ba40370000200541002900d9ba40370000200541184138101e2205450d0120052001290000370018200541306a200141186a290000370000200541286a200141106a290000370000200541206a200141086a29000037000042002106200441106a41086a220742003703002004420037031020054138200441106a1001200441086a2007290300370300200420042903103703000240024002402004411041f8b3c200410041001002417f460d00200442003703182004420037031020044110200441106a4110410010022207417f460d022007410f4d0d02200441186a2903002108200429031021060c010b420021080b2005101d20012006200220062006200256200820035620082003511b22051b22027d20082003200820051b22037d2006200254ad7d10e7012000200337030820002002370300200441206a24000f0b41df88c0004133103a000b411841011020000b413841011020000bb70202047f027e230041206b22022400200241106a41086a220342003703002002420037031041aeb9c0004116200241106a1001200241086a22042003290300370300200220022903103703000240024002402002411041f8b3c200410041001002417f460d00200242003703182002420037031020024110200241106a4110410010022205417f460d022005410f4d0d02200241186a2903002106200229031021070c010b42002107420021060b200342003703002002420037031041aeb9c0004116200241106a1001200420032903003703002002200229031037030020024200200620017d2007200054ad7d2201200720007d2200200756200120065620012006511b22031b37031820024200200020031b37031020024110200241106a41101003200241206a24000f0b41df88c0004133103a000bba2504057f027e037f0a7e230041c0026b2203240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200128020022044101460d0020044102470d0f200341106a41026a200141076a2d00003a0000200341306a41086a2205200141186a290200370300200341306a410d6a22062001411d6a290000370000200320012f00053b01102003200141106a2902003703304128210720022d000020022d000172450d0141c9b4c00021040c190b200141306a2903002108200141286a29030021092003412c6a41026a200141076a2d00003a0000200341106a41086a200141186a290200370300200341106a410d6a2001411d6a290000370000200320012f00053b012c2003200141106a290200370310200141086a28020021052001410c6a280200210620012d0004210a200341a0026a41026a2201200241046a2d00003a000020034190016a41086a220b200241156a29000037030020034190016a410d6a220c2002411a6a2900003700002003200241026a2f01003b01a00220032002410d6a2900003703900120022d0000450d01410121010c020b200141c0006a2903002108200141386a2903002109200141306a290300210d200141286a290300210e2001410c6a2802002107200141086a280200210420012d00042101200341bc026a41026a2202200341106a41026a2d00003a0000200341a0026a41086a2005290300370300200341a0026a410d6a2006290000370000200320032f01103b01bc02200320032903303703a002200141ff01714101470d03200341d0006a200441067610b0012003280250210220032802582004413f7122014d0d0a2003419c026a41026a200220014105746a220141026a2d00003a000020034188026a200141136a2900003703002003418d026a200141186a290000370000200320012f00003b019c022003200129000b370380022001280007210720012800032104410121012003280254450d130c120b200241096a2800002107200241056a280000210420022d0001210220034180026a41026a20012d00003a0000200341f0006a41086a200b290300370300200341f0006a410d6a200c290000370000200320032f01a0023b018002200320032903900137037041012101200241ff01714101470d00200341a0026a41026a20034180026a41026a2d00003a000020034190016a41086a200341f0006a41086a29030037030020034190016a410d6a200341f0006a410d6a290000370000200320032f0180023b01a0022003200329037037039001410021010c010b412a210741f1b4c00021040b200341bc026a41026a2202200341a0026a41026a2d00003a0000200341d0006a41086a220b20034190016a41086a290300370300200341d0006a41106a20034190016a41106a290300370300200320032f01a0023b01bc02200320032903900137035020010d14200341c3006a200b290300370000200341c8006a200341d0006a410d6a290000370000200320032f01bc023b013020032007360037200320043600332003200329035037003b200320022d00003a003220022003412c6a41026a2d00003a0000200341a0026a41086a200341106a41086a290300370300200341a0026a410d6a2201200341106a410d6a290000370000200320032f012c3b01bc02200320032903103703a0020240200a41ff01714101470d0020034190016a200541067610b00120032802900121022003280298012005413f7122014d0d022003419c026a41026a200220014105746a220141026a2d00003a000020034188026a200141136a2900003703002003418d026a200141186a290000370000200320012f00003b019c022003200129000b370380022001280007210620012800032105410121012003280294010d030c040b2003419c026a41026a200341bc026a41026a2d00003a000020034180026a41086a200341a0026a41086a29030037030020034180026a410d6a2001290000370000200320032f01bc023b019c02200320032903a002370380020c040b2003419c026a41026a20022d00003a000020034180026a41086a200341a0026a41086a29030037030020034180026a410d6a200341a0026a410d6a290000370000200320032f01bc023b019c02200320032903a002370380020c100b41002101200328029401450d010b2002101d0b2001450d010b200341a0026a41026a2003419c026a41026a2d00003a000020034190016a41086a20034180026a41086a29030037030020034190016a410d6a20034180026a410d6a290000370000200320032f019c023b01a002200320032903800237039001410021010c010b4101210141d7c0c1002105411521060b2003418c016a41026a2202200341a0026a41026a2d00003a0000200341f0006a41086a220420034190016a41086a290300370300200341f0006a41106a20034190016a41106a290300370300200320032f01a0023b018c01200320032903900137037002402001450d0020062107200521040c0e0b200341e3006a2004290300370000200341e8006a200341fd006a290000370000200320032f018c013b015020032006360057200320053600532003200329037037005b200320022d00003a00524114101f2201450d05200141106a41002800d5ba40360000200141086a41002900cdba40370000200141002900c5ba40370000200141144134101e2201450d06200120032903303700142001412c6a200341c8006a290300370000200141246a200341306a41106a2903003700002001411c6a200341306a41086a2903003700004200210d200341f0006a41086a220242003703002003420037037020014134200341f0006a1001200341a0026a41086a2002290300370300200320032903703703a002200341a0026a411041f8b3c200410041001002417f460d0120034200370398012003420037039001200341a0026a411020034190016a4110410010022202417f460d042002410f4d0d0420034198016a290300210e200329039001210d2001101d411421024114101f2201450d020c070b4100210120032802540d070c080b4200210e2001101d411421024114101f22010d050b200241011020000b200341a4016a410136020020034118360254200341c0adc4003602502003420137029401200341c8adc400360290012003200341d0006a3602a00120034190016a41a08cc30010cf01000b41df88c0004133103a000b411441011020000b413441011020000b200141106a41002800d5ba40360000200141086a41002900cdba40370000200141002900c5ba4037000002400240024002400240200120024134101e2201450d00200120032903503700142001412c6a200341e8006a290300370000200141246a200341d0006a41106a2903003700002001411c6a200341d0006a41086a290300370000200341f0006a41086a220242003703002003420037037020014134200341f0006a1001200341a0026a41086a2002290300370300200320032903703703a002024002400240200341a0026a411041f8b3c200410041001002417f460d0020034200370398012003420037039001200341a0026a411020034190016a4110410010022202417f460d022002410f4d0d0220034198016a290300210f20032903900121100c010b420021104200210f0b2001101d200341f0006a41086a220142003703002003420037037002400240024002402010200f8422114200510d0041add5c0004114200341f0006a1001200341a0026a41086a2001290300370300200320032903703703a002200341a0026a411041f8b3c200410041001002417f460d0220034200370398012003420037039001200341a0026a411020034190016a4110410010022201417f460d062001410f4d0d0620034198016a29030021120c010b4199d5c0004114200341f0006a1001200341a0026a41086a2001290300370300200320032903703703a002200341a0026a411041f8b3c200410041001002417f460d0120034200370398012003420037039001200341a0026a411020034190016a4110410010022201417f460d062001410f4d0d0620034198016a29030021120b20032903900121130c010b42002113420021120b0240200920137c22142009542201200820127c2001ad7c221520085420152008511b450d004128210741aad6c00021040c0c0b0240200d20147d2216200d56200e20157d200d201454ad7d220d200e56200d200e511b450d00411d2107418dd6c00021040c0c0b20114200520d05200341f0006a41086a220142003703002003420037037041c4b9c000411b200341f0006a1001200341a0026a41086a2001290300370300200320032903703703a002200341a0026a411041f8b3c200410041001002417f460d0520034200370398012003420037039001200341a0026a411020034190016a4110410010022201417f460d042001410f4d0d0420032903900120095620034198016a290300220e200856200e2008511b450d05411f210741eed5c00021040c0b0b41df88c0004133103a000b413441011020000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b200341086a200341306a41022016200d103d024020032802082204450d00200328020c21070c060b0240201020097c22152010542201200f20087c2001ad7c220e200f54200e200f511b450d00412d210741c1d5c00021040c060b200341306a200341d0006a412010d003450d04200341306a2016200d10e201024002404114101f2201450d00200141106a41002800d5ba40360000200141086a41002900cdba40370000200141002900c5ba40370000200141144134101e2201450d01200120032903503700142001412c6a200341e8006a2204290300370000200141246a200341d0006a41106a2903003700002001411c6a200341d0006a41086a2903003700004200210d200341f0006a41086a220242003703002003420037037020014134200341f0006a100120034190016a41086a2002290300370300200320032903703703900120034190016a411041f8b3c20041004100100221022001101d02402002417f470d00200341d0006a10ed01200341c8016a200e370300200341c0016a201537030020034190016a41086a41003a000020034199016a2003290350370000200341a1016a200341d0006a41086a290300370000200341a9016a200341e0006a290300370000200341b1016a2004290300370000200341023a00900120034190016a108b010b200341d0006a2015200e10e201200341f0006a41086a220142003703002003420037037041aeb9c0004116200341f0006a1001200341a0026a41086a22022001290300370300200320032903703703a002024002400240200341a0026a411041f8b3c200410041001002417f460d0020034200370398012003420037039001200341a0026a411020034190016a4110410010022204417f460d022004410f4d0d0220034198016a290300210e200329039001210d0c010b4200210e0b200142003703002003420037037041aeb9c0004116200341f0006a100120022001290300370300200320032903703703a00220034200200e20127d200d201354ad7d2215200d20137d220f200d562015200e562015200e511b22011b3703980120034200200f20011b37039001200341a0026a411020034190016a4110100320034190016a41086a41023a000020034199016a2003290330370000200341a1016a200341306a41086a290300370000200341a9016a200341306a41106a290300370000200341b1016a200341306a41186a290300370000200341b9016a2003290350370000200341c1016a200341d0006a41086a290300370000200341c9016a200341d0006a41106a290300370000200341d1016a200341d0006a41186a290300370000200341023a009001200341f8016a2012370300200341f0016a2013370300200341e8016a2008370300200341e0016a200937030020034190016a108b010c070b41df88c0004133103a000b411441011020000b413441011020000b2002101d0b20010d00410121014115210741d7c0c10021040c010b200341a0026a41026a2003419c026a41026a2d00003a0000200341d0006a41086a20034180026a41086a290300370300200341d0006a410d6a20034180026a410d6a290000370000200320032f019c023b01a0022003200329038002370350410021010b2003418c016a41026a2202200341a0026a41026a2d00003a0000200341f0006a41086a2205200341d0006a41086a290300370300200341f0006a41106a200341d0006a41106a290300370300200320032f01a0023b018c012003200329035037037020010d01200341a3016a2005290300370000200341a8016a200341fd006a290000370000200320032f018c013b019001200320073600970120032004360093012003200329037037009b01200320022d00003a00920120034190016a200e200d10e20120034190016a2009200810e7010b410021040b2000200736020420002004360200200341c0026a24000bc70202047f047e230041206b22012400200141106a41086a220242003703002001420037031041aeb9c0004116200141106a1001200141086a22032002290300370300200120012903103703000240024002402001411041f8b3c200410041001002417f460d00200142003703182001420037031020014110200141106a4110410010022204417f460d022004410f4d0d02200141186a2903002105200129031021060c010b42002106420021050b200041086a290300210720002903002108200242003703002001420037031041aeb9c0004116200141106a100120032002290300370300200120012903103703002001427f200520077c200620087c22072006542202ad7c22062002200620055420062005511b22021b3703182001427f200720021b37031020014110200141106a41101003200141206a24000f0b41df88c0004133103a000b1c0020012802184190cfc200410b2001411c6a28020028020c1100000b900501137f02400240200128020022064100480d00200641ffffffff07460d002001200641016a360200200141046a2107200141086a28020021080c010b103f000b410021060340024002400240024002400240024002400240024020060e020001010b2007280200220a41086a210b200a2f0106220941057421064100210c0240024003402006450d012002200b412010d003220d450d02200641606a2106200c41016a210c200b41206a210b200d417f4a0d000b200c417f6a21090b2008450d022008417f6a2108200a20094102746a4180096a2107410021060c0a0b200a41e8026a200c41c8006c6a2206450d01200641186a210e2006411c6a280200210f41082110410c2111417f21124102211341900221144101211541742116410021170c080b200e280200220920106a210620092f0106221820116c210b4100210c0240024002400340200c210d200b450d01024002400240200420062802002006280208220c2005200c2005491b10d003220e450d004101210a200e20174e0d010c020b200c2005460d0520122015200c20054b1b210a0b200620116a2106200d20156a210c200b20166a210b200a2012470d010b0b200f0d010c030b2018210d200f450d020b200f20126a210f2009200d2013746a20146a210e410121060c090b2009418c016a220b200d410c6c6a2206450d0020062802002205450d01200b200d410c6c6a2802082206417f4c0d062006450d022006101f220b0d03200641011020000b200020012802102002200320042005200141146a28020028020c1105000c040b4100210b0c020b4101210b0b200b2005200610ce031a0b200020063602042000200b360200200041086a20063602000b20012001280200417f6a3602000f0b102e000b410121060c000b0bca16050f7f017e1f7f017e067f230041a0036b2204240020022802082105200228020421062002280200210702400240024002402001280200220841f0c0c100460d00200128020421090c010b419002101f2208450d0141002109200841003b010620084100360200200841086a200441e8006a41880210ce031a20014100360204200120083602000b0c010b41900241041020000b41002102024003400240024002400240024002400240024020020e020001010b200841086a210220082f0106220b410c6c210c4100210d024002400240024002400340200d210a200c450d01024002400240200720022802002002280208220d20052005200d4b1b10d003220e450d004101210f200e41004e0d010c020b2005200d460d06417f41012005200d491b210f0b2002410c6a2102200a41016a210d200c41746a210c200f417f470d010b0b20090d010c020b200b210a2009450d010b2009417f6a21092008200a4102746a4190026a2802002108410021020c0a0b200441186a20083602002001200128020841016a3602082004411c6a200aad4220862001ad843702002004200636020c2004200736020820042005ad370310200441c8006a41086a220c200341086a2802003602002004200329020037034820082f0106220d410b4f0d01200841086a2202200a410c6c2210410c6a22116a200220106a2202200d200a6b410c6c10cf031a2002200536020820022006360204200220073602002008418c016a220220116a200220106a2202200841066a220d2f0100200a6b410c6c10cf031a200241086a200c28020036020020022004290348370200200d200d2f010041016a3b01000c0a0b02402006450d002007101d0b200441e8006a41086a22022008200a410c6c6a220c4194016a220d2802003602002004200c418c016a220c290200370368200d200341086a280200360200200c2003290200370200200441086a41086a220c200228020036020020042004290368370308200041013602002000410c6a200c28020036020020002004290308370204200441a0036a24000f0b419002101f2212450d04201241003b010620124100360200201241086a200441e8006a41880210ce03210c200441e8006a41086a220d200841dc016a280200360200200420082902d401370368200841d4006a290200211320082802502114200c200841dc006a200841066a22102f010041796a2202410c6c221110ce03210c2012418c016a200841e0016a201110ce032111201041063b0100201220023b0106200441d8006a41086a200d2802003602002004200429036837035802400240200a41064b0d00200841086a2202200a410c6c220d410c6a22106a2002200d6a220c200841066a22022f0100200a6b410c6c10cf031a200c2005360208200c2006360204200c20073602002008418c016a220c20106a200c200d6a220c20022f0100200a6b410c6c10cf031a200c41086a200441c8006a41086a280200360200200c20042903483702000c010b200c200a410c6c220d41b87f6a22106a200c200d41ac7f6a220d6a220c200241ffff0371200a41796a220a6b410c6c10cf031a200c2005360208200c2006360204200c2007360200201120106a2011200d6a220c201241066a22022f0100200a6b410c6c10cf031a200c41086a200441c8006a41086a280200360200200c20042903483702000b41012110200220022f010041016a3b010041082115200441386a41086a2216200441d8006a41086a221728020036020020042004290358370338200441286a41086a221820162802003602002004200429033837032820082802002219450d0120082f0104211a41ffff03211b410a211c41c002211d4100211e41b802211f41d400212041d000212141dc01212241d401212341dc0021244106212541792126410c212741e0012128418c01212941ac02212a419002212b417a212c4102212d419402212e4104211141ac7f212f41b87f2130416c213141f80121320c060b200441c8006a20156a2235201828020036020020042004290328370348201a201b71210f20192f01062202201c4d0d01201d101f220a450d02200a201e3b0106200a201e360200200a20156a200441e8006a201f10ce032102201920206a2902002133201920216a2802002134200441e8006a20156a220b201920226a2802003602002004201920236a2902003703682002201920246a201920256a22362f0100220c20266a220d20276c220e10ce032137200a20296a201920286a200e10ce032138200a202b6a2019202a6a200c202c6a220e202d7410ce032139203620253b0100200a200d3b01060240200e450d00410021022039210c0340200c280200220d20023b0104200d200a360200200c20116a210c200e200220106a2202470d000b0b2017200b28020036020020042004290368370358200b20172802003602002004200429035837036802400240201a201b71220220254b0d00201920156a220d200f20276c220c20276a220e6a200d200c6a220d20362f0100221a200f6b20276c223910cf031a200d2013370204200d2014360200201920296a220d200e6a200d200c6a220c203910cf031a200c20156a2035280200360200200c20042903483702002036201a20106a220c3b01002019202b6a220d200f202d7422366a20156a200d200f20106a220e202d746a221a200c201b71220d200e6b202d7410cf031a201a20123602002002200d4f0d01201920366a202e6a210203402002280200220c200f20106a220f3b0104200c2019360200200220116a2102200d200f470d000c020b0b2037200f20276c220220306a220e6a20372002202f6a221a6a220c200a20256a220d2f0100200f20266a22026b20276c10cf031a200c2013370204200c20143602002038200e6a2038201a6a220c200d2f0100220e20026b20276c10cf031a200c20156a2035280200360200200c2004290348370200200d200e20106a220e3b01002039200f202d74221a6a20316a2039200f202c6a220c202d746a220d200e201b71220f200c6b202d7410cf031a200d2012360200200c200f4b0d00200a201a6a20326a210c0340200c280200220d200220106a22023b0104200d200a360200200c20116a210c200f2002470d000b0b2016200b280200360200200420042903683703382018201628020036020020042004290338370328024020192802002202450d0020192f0104211a203321132034211420022119200a2112410121020c070b2033211320342114200a21120b41c002101f2202450d03200241003b010620024100360200200241086a200441e8006a41b80210ce03210d20022001280200220c36029002200120023602002001200128020441016a360204200c41003b0104200c2002360200200d20022f0106220c410c6c22106a220d2013370204200220106a22104194016a200441286a41086a2802003602002010418c016a2004290328370200200d201436020020024190026a200c41016a220c4102746a20123602002002200c3b01062012200c3b0104201220023602000c060b201941086a220d200f410c6c220c410c6a22106a200d200c6a220d2002200f6b410c6c220a10cf031a200d2013370204200d20143602002019418c016a220d20106a200d200c6a220c200a10cf031a200c41086a200441c8006a41086a280200360200200c2004290348370200201941066a200241016a220c3b010020194190026a220d200f4102746a41086a200d200f41016a22024102746a220d200c41ffff0371221020026b41027410cf031a200d2012360200201a41ffff037120104f0d0520192002417f6a22024102746a4194026a210c0340200c280200220d200241016a22023b0104200d2019360200200c41046a210c20102002470d000c060b0b41c00241041020000b41900241041020000b41c00241041020000b410121020c000b0b20004100360200200441a0036a24000b7701017f230041c0006b220024002000411036020c200041eca8c100360208200041346a411e360200200041246a41023602002000411836022c20004202370214200041b8b1c4003602102000200041386a3602302000200041086a3602282000200041286a360220200041106a41c8b1c40010cf01000b13002000410a360204200041c08ec3003602000bed0201027f230041206b22022400024002404116101f2203450d002003410e6a41002900d7d940370000200341086a41002900d1d940370000200341002900c9d940370000200341164136101e2203450d01200320012900003700162003412e6a200141186a290000370000200341266a200141106a2900003700002003411e6a200141086a290000370000200241106a41086a220142003703002002420037031020034136200241106a1001200241086a2001290300370300200220022903103703000240024002402002411041f8b3c200410041001002417f460d002002410036021020024110200241106a41044100100241016a4105490d02200228021021012002410036021020024110200241106a41044104100241016a4105490d02200041086a200228021036020020002001360204200041013602000c010b200041003602000b2003101d200241206a24000f0b41df88c0004133103a000b411641011020000b413641011020000b130020004107360204200041a5edc0003602000b1300200041143602042000419896c3003602000b7801047f230041106b22022400200241003602082002420137030002404101101f2203450d00200220033602002002410136020420002002290300370200200241086a22042004280200220441016a2205360200200320046a41003a0000200041086a2005360200200241106a24000f0b410141011020000b3201017f02404104101f2202450d0020004284808080c00037020420002002360200200241003600000f0b410441011020000b3201017f02404108101f2202450d0020004288808080800137020420002002360200200242053700000f0b410841011020000b3201017f02404104101f2202450d0020004284808080c00037020420002002360200200241013600000f0b410441011020000b3201017f02404104101f2202450d0020004284808080c00037020420002002360200200241023600000f0b410441011020000b3901017f02404110101f2202450d002002420037000820024201370000200042908080808002370204200020023602000f0b411041011020000b3901017f02404110101f2202450d002002420037000820024209370000200042908080808002370204200020023602000f0b411041011020000b9e0403057f027e027f230041106b2202240020024100360208200242013703002000280200210320022000280208220036020c2002410c6a200210620240024002400240024002402000450d002003200041306c6a2104200241086a280200210520022802002106200228020421000340200341086a2903002107200329030021080240024002400240200020056b41104f0d00200541106a22092005490d062000410174220a20092009200a491b220a4100480d062000450d0120062000200a101e22060d020c070b200541106a21090c020b200a101f2206450d050b200a21000b200620056a22052007370008200520083700000240024002400240200020096b41204f0d00200941206a22052009490d062000410174220a20052005200a491b220a4100480d062000450d0120062000200a101e22060d020c080b200941206a21050c020b200a101f2206450d060b200a21000b200620096a220941186a200341286a290000370000200941106a200341206a290000370000200941086a200341186a2900003700002009200341106a290000370000200341306a22032004470d000b200241086a20053602002002200036020420022006360200200128020020012802042006200510032000450d050c040b200228020421032001280200200128020420022802002206200241086a280200100320030d030c040b1021000b200a41011020000b200a41011020000b2006101d0b200241106a24000bcf0506027f017e0b7f017e027f017e230041d0006b22022400200241086a200110d5010240024002400240024002400240024002402002280208450d00200228020c2203ad42307e2204422088a70d032004a72205417f4c0d032005450d012005101f2206450d042003450d020c050b20004100360200200241d0006a24000f0b4108210620030d030b4100210d4100210c0c030b102e000b200541081020000b200141046a2107200141086a2108200241306a41186a21094100210a4100210b410021052003210c0240034020024200370338200242003703302008410020012802002007280200200241306a411020082802001002220d200d417f461b220d4110200d4110491b20082802006a220e360200200d410f4d0d01200241306a41086a220f29030021042002290330211020094200370300200241306a41106a22114200370300200f4200370300200242003703302008410020012802002007280200200241306a4120200e1002220d200d417f461b220d4120200d4120491b20082802006a360200200d411f4d0d01200541016a210d200241106a41186a220e2009290300370300200241106a41106a22122011290300370300200241106a41086a2211200f2903003703002002200229033037031002402005200c470d00200a200d200d200a491b220cad42307e2213422088a70d042013a7220f4100480d0402402005450d002006200b200f101e22060d010c060b200f101f2206450d050b2006200b6a2205200437030820052010370300200541286a200e290300370300200541206a2012290300370300200541186a2011290300370300200541106a2002290310370300200a41026a210a200b41306a210b200d2105200d2003490d000c020b0b200041003602000240200c450d002006101d0b200241d0006a24000f0b2000200c36020420002006360200200041086a200d360200200241d0006a24000f0b1021000b200f41081020000ba00402087f017e230041106b2202240020024100360208200242013703002000280200210320022000280208220036020c2002410c6a200210620240024002400240024002402000450d002003200041286c6a2104200241086a220528020021002002280204210603400240024002400240200620006b41204f0d00200041206a22072000490d0620064101742208200720072008491b22094100480d062006450d01200228020020062009101e22080d020c070b200041206a2107200228020021080c020b2009101f2208450d050b2002200936020420022008360200200921060b20052007360200200820006a220041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a29000037000020002003290000370000200341206a290300210a0240024002400240200620076b41084f0d00200741086a22002007490d0620064101742209200020002009491b22094100480d062006450d01200820062009101e22080d020c080b200741086a21000c020b2009101f2208450d060b2002200936020420022008360200200921060b20052000360200200820076a200a3700002004200341286a2203470d000b200128020020012802042008200010032006450d050c040b200228020421032001280200200128020420022802002208200241086a280200100320030d030c040b1021000b200941011020000b200941011020000b2008101d0b200241106a24000b820101017f230041c0006b220424002004200136020c2004200036020820042003360214200420023602102004413c6a411f3602002004412c6a4102360200200441183602342004420237021c200441b8b1c4003602182004200441106a3602382004200441086a3602302004200441306a360228200441186a41c8b1c40010cf01000ba11102177f017e230041206b220224002000280204210320002802002104410121050240200128021841222001411c6a2802002802101106000d00024002402003450d00200420036a2106200141186a21072001411c6a2108200421094100210a4100210b024003402009210c200941016a2100024002400240024002400240024002400240024020092c0000220d4100480d00200d41ff0171210d0c010b02400240024020002006460d0020002d0000413f71210e200941026a22092100200d411f71210f200d41ff0171220d41e001490d010c020b4100210e20062109200d411f71210f200d41ff0171220d41e0014f0d010b200e200f41067472210d0c010b0240024020092006460d00200941016a2200211020092d0000413f71200e41067472210e200d41f001490d010c030b200621104100200e41067472210e200d41f0014f0d020b200e200f410c7472210d0b2000210941022100200d41776a220f411e4d0d010c020b0240024020102006460d00201041016a210920102d0000413f71210d0c010b4100210d200021090b200e410674200f411274418080f0007172200d72220d418080c400460d0841022100200d41776a220f411e4b0d010b41f400210e024002400240200f0e1f07010505000505050505050505050505050505050505050505040505050504070b41f200210e0c010b41ee00210e0b0c040b200d41dc00470d010b0c010b0240200d10ec020d0002400240200d41ffff034b0d00200d4180fe0371410876211141d8b7c200211241002113410021000c010b0240200d41ffff074b0d00200d4180fe037141087621164193bdc200211741002118410121000c010b200d41ef83384b0d01200d41e28b746a41e28d2c490d01200d419fa8746a419f18490d01200d41dee2746a410e490d01200d41feffff0071419ef00a460d01200d41a9b2756a4129490d01200d41cb91756a410a4d0d010c040b024003400240024020000e020001010b201241026a2114201320122d000122006a2110024002400240024002400240024020122d0000220e2011470d0020102013490d06201041b0024f0d05201341a8b8c2006a210e03402000450d022000417f6a2100200e2d0000210f200e41016a210e200f200d41ff0171470d000c0b0b0b200e20114b0d012010211320142112201441a8b8c200470d030c010b2010211320142112201441a8b8c200470d010b200d41ffff0371210e41d7bac20021004101210f02400340200041016a21100240024020002d000022144118744118752215417f4c0d0020102100200e20146b220e4100480d030c010b024020104193bdc200460d00200041016a2110200041026a2100200e201541ff007141087420102d0000726b220e41004e0d010c030b4190b3c400102c000b200f410173210f20004193bdc200470d000b0b200f410171450d070c0a0b410021000c040b410021000c030b201041af02102b000b20132010102a000b201741026a2114201820172d000122006a211002400240024002400240024020172d0000220e2016470d0020102018490d072010419f014f0d05201841d5bdc2006a210e03402000450d022000417f6a2100200e2d0000210f200e41016a210e200f200d41ff0171470d000c090b0b200e20164b0d012010211820142117201441d5bdc200470d030c010b2010211820142117201441d5bdc200470d010b200d41ffff0371210e41f3bec20021004101210f02400340200041016a21100240024020002d000022144118744118752215417f4c0d0020102100200e20146b220e4100480d030c010b0240201041f0c1c200460d00200041016a2110200041026a2100200e201541ff007141087420102d0000726b220e41004e0d010c030b4190b3c400102c000b200f410173210f200041f0c1c200470d000b0b200f410171450d050c080b410121000c020b410121000c010b0b2010419e01102b000b20182010102a000b200d41017267410276410773ad4280808080d000842119410321000b200d210e0b20022003360204200220043602002002200a3602082002200b36020c02400240200b200a490d000240200a450d00200a2003460d00200a20034f0d012004200a6a2c000041bf7f4c0d010b0240200b450d00200b2003460d00200b20034f0d012004200b6a2c000041bf7f4c0d010b20072802002004200a6a200b200a6b200828020028020c1100000d010340024002400240024002400240024020004101460d0041dc00210a024020004102460d0020004103470d062019422088a741ff0171417f6a220041044b0d06024020000e050006040503000b201942ffffffff8f608321194103210041fd00210a0c070b410121000c060b41002100200e210a0c050b201942ffffffff8f60834280808080c000842119410321000c040b201942ffffffff8f60834280808080208421194103210041fb00210a0c030b201942ffffffff8f60834280808080308421194103210041f500210a0c020b200e2019a7220f410274411c7176410f712200413072200041d7006a2000410a491b210a0240200f450d002019427f7c42ffffffff0f83201942808080807083842119410321000c020b201942ffffffff8f6083428080808010842119410321000c010b410121000240200d418001490d0041022100200d418010490d0041034104200d41808004491b21000b2000200b6a210a200b200c6b20096a210b20062009470d050c060b2007280200200a2008280200280210110600450d000b200241206a240041010f0b20022002410c6a3602182002200241086a36021420022002360210200241106a10ed02000b200241206a240041010f0b200b200c6b20096a210b20062009470d000b0b200a450d01200a2003460d010240200a20034f0d002004200a6a2c000041bf7f4a0d020b20042003200a200310ee02000b4100210a0b200141186a22002802002004200a6a2003200a6b2001411c6a220b28020028020c1100000d0020002802004122200b28020028021011060021050b200241206a240020050bc10201037f23004180016b220224000240024002400240200128020022034110710d002000280200210420034120710d012004ad41012001108b02210020024180016a240020000f0b20002802002104410021000340200220006a41ff006a2004410f712203413072200341d7006a2003410a491b3a00002000417f6a2100200441047622040d000b20004180016a22044181014f0d012001410141d6b6c2004102200220006a4180016a410020006b108c02210020024180016a240020000f0b410021000340200220006a41ff006a2004410f712203413072200341376a2003410a491b3a00002000417f6a2100200441047622040d000b20004180016a22044181014f0d012001410141d6b6c2004102200220006a4180016a410020006b108c02210020024180016a240020000f0b2004418001102a000b2004418001102a000bd40203037f017e027f230041306b220324004127210402400240024020004290ce00540d00412721040340200341096a20046a2205417c6a200020004290ce0080220642f0b17f7e7ca7220741e4006e220841017441aab4c2006a2f00003b00002005417e6a2008419c7f6c20076a41017441aab4c2006a2f00003b00002004417c6a2104200042ffc1d72f5621052006210020050d000b2006a7220541e3004c0d020c010b20002206a7220541e3004c0d010b200341096a2004417e6a22046a2006a7220741ffff037141e4006e2205419c7f6c20076a41ffff037141017441aab4c2006a2f00003b00000b02400240200541094a0d00200341096a2004417f6a22046a200541306a3a00000c010b200341096a2004417e6a22046a200541017441aab4c2006a2f00003b00000b2002200141f8b3c2004100200341096a20046a412720046b108c022104200341306a240020040be60601067f0240024002400240024002402001450d00412b418080c4002000280200220641017122011b2107200120056a21082006410471450d010c020b200541016a2108412d2107200028020022064104710d010b410021024101210120002802084101470d010c020b4100210902402003450d002003210a200221010340200920012d000041c00171418001466a2109200141016a2101200a417f6a220a0d000b0b200820036a20096b21084101210120002802084101460d010b200020072002200310c9030d012000280218200420052000411c6a28020028020c1100000f0b0240024002400240024002400240024002400240024002402000410c6a280200220920084d0d0020064108710d01200920086b2101410120002d0030220920094103461b2209410371450d0220094102460d034100210b200121090c040b200020072002200310c9030d0b2000280218200420052000411c6a28020028020c1100000f0b41012101200041013a003020004130360204200020072002200310c9030d0a200920086b21014101200041306a2d0000220920094103461b2209410371450d0320094102460d0441002108200121090c050b410021092001210b0c010b20014101762109200141016a410176210b0b417f2101200041046a210a200041186a21082000411c6a210602400340200141016a220120094f0d012008280200200a2802002006280200280210110600450d000c050b0b200041046a280200210a41012101200020072002200310c9030d07200041186a2209280200200420052000411c6a220328020028020c1100000d0720092802002100417f2109200328020041106a21030340200941016a2209200b4f0d06410121012000200a2003280200110600450d000c080b0b41002109200121080c010b20014101762109200141016a41017621080b417f2101200041046a210a200041186a21032000411c6a21020340200141016a220120094f0d022003280200200a2802002002280200280210110600450d000b0b410121010c030b200041046a280200210a41012101200041186a2209280200200420052000411c6a220328020028020c1100000d0220092802002100417f2109200328020041106a21030340200941016a220920084f0d02410121012000200a2003280200110600450d000c030b0b41000f0b41000f0b20010b1c002001280218419bcfc200410e2001411c6a28020028020c1100000bfab3010f0c7f017e027f027e0a7f027e037f017e067f027e067f037e027f027e407f230041e0036b22032400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001280200417f6a220441094b0d000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040e0a00060304010708050902000b2001410c6a2802002105200141086a2802002106200141106a280200210720012802042108200241096a2800002109200241056a280000210420022d0001210a20022d0000210b200341e4026a41026a220c200241046a2d00003a0000200341a8026a41086a220d200241156a290000370300200341a8026a410d6a220e2002411a6a2900003700002003200241026a2f01003b01e40220032002410d6a2900003703a802200b450d13410121020c140b20012802042105200241096a2800002109200241056a280000210420022d0001210620022d0000210b200341e4026a41026a2208200241046a2d00003a0000200341a8026a41086a2207200241156a290000370300200341a8026a410d6a220a2002411a6a2900003700002003200241026a2f01003b01e40220032002410d6a2900003703a802200b450d09410121020c0a0b20022d000120022d0000720d07200141086a290300210f200341e8026a41086a22024200370300200342003703e80241dafcc0004114200341e8026a100120034190016a41086a2002290300370300200320032903e802370390012003200f3703b80120034190016a4110200341b8016a410810030c580b200141306a280200210e2001412c6a280200211020012802042111200341b4016a41026a2001410b6a2d00003a0000200341f0006a41086a2001411c6a290200370300200341f0006a410d6a200141216a290000370000200320012f00093b01b4012003200141146a290200370370200141086a2d000021052001410c6a2802002106200141106a2802002108200241096a2800002109200241056a280000210420022d0001210720022d0000210b200341e4026a41026a220a200241046a2d00003a0000200341a8026a41086a220c200241156a290000370300200341a8026a410d6a220d2002411a6a2900003700002003200241026a2f01003b01e40220032002410d6a2900003703a802200b450d0a410121020c0b0b2001280204210a200241096a2800002109200241056a280000210420022d0001210520022d0000210b200341e4026a41026a2206200241046a2d00003a0000200341a8026a41086a2208200241156a290000370300200341a8026a410d6a22072002411a6a2900003700002003200241026a2f01003b01e40220032002410d6a2900003703a802200b450d0c410121020c0d0b200341f0006a41026a2205200141076a2d00003a0000200341c8026a41086a220e200141186a290200370300200341c8026a410d6a22112001411d6a290000370000200320012f00053b01702003200141106a2902003703c80220022d000120022d0000720d042001410c6a2802002109200141086a280200210420012d00042102200341e4026a41026a20052d00003a0000200341b8016a41086a200e290300370300200341b8016a410d6a2011290000370000200320032f01703b01e402200320032903c8023703b801200241ff01714101470d1e200341b8036a200441067610b00120032802b803210520032802c0032004413f7122024d0d22200341e0026a41026a200520024105746a220241026a2d00003a0000200341f0026a200241136a290000370300200341f5026a200241186a290000370000200320022f00003b01e0022003200229000b3703e80220022800072109200228000321044101210220032802bc03450d4b0c4a0b2001410c6a280200210d200141086a2802002106200141106a280200210e20012802042108200241096a2800002109200241056a280000210420022d0001210520022d0000210b200341e4026a41026a2207200241046a2d00003a0000200341a8026a41086a220a200241156a290000370300200341a8026a410d6a220c2002411a6a2900003700002003200241026a2f01003b01e40220032002410d6a2900003703a802200b450d10410121020c110b200141386a2903002112200141306a2903002113200141286a2802002114200341b4016a41026a200141076a2d00003a0000200341f0006a41086a200141186a290200370300200341f0006a410d6a2001411d6a290000370000200320012f00053b01b4012003200141106a290200370370200141086a28020021152001410c6a280200211620012d00042117200241096a2800002109200241056a280000210420022d0001211820022d00002119200341e4026a41026a221a200241046a2d00003a0000200341a8026a41086a221b200241156a290000370300200341a8026a410d6a221c2002411a6a2900003700002003200241026a2f01003b01e40220032002410d6a2900003703a8022019450d12410121020c130b20022d000120022d0000720d0120012802042102200341e8026a41086a22044200370300200342003703e80241b2fcc0004114200341e8026a100120034190016a41086a2004290300370300200320032903e80237039001200320023602b80120034190016a4110200341b8016a410410030c520b20022d000120022d000072450d130b41c9b4c0002104412821090c550b200341e0026a41026a20082d00003a0000200341c8026a41086a2007290300370300200341c8026a410d6a200a290000370000200320032f01e4023b01e002200320032903a8023703c80241012102200641ff01714101470d0020034190036a41026a200341e0026a41026a2d00003a0000200341b8016a41086a200341c8026a41086a290300370300200341b8016a410d6a200341c8026a410d6a290000370000200320032f01e0023b019003200320032903c8023703b801410021020c010b41f1b4c0002104412a21090b200341ac016a41026a220b20034190036a41026a2d00003a000020034190016a41086a2206200341b8016a41086a29030037030020034190016a41106a200341b8016a41106a290300370300200320032f0190033b01ac01200320032903b8013703900120020d49200341cb036a2006290300370000200341d0036a2003419d016a290000370000200320032f01ac013b01b803200320093600bf03200320043600bb0320032003290390013700c3032003200b2d00003a00ba034116101f2202450d262002410e6a41002900d7d940370000200241086a41002900d1d940370000200241002900c9d940370000200241164136101e2202450d27200220032903b8033700162002412e6a200341d0036a290300370000200241266a200341b8036a41106a290300370000411e21092002411e6a200341b8036a41086a290300370000200341e8026a41086a22044200370300200342003703e80220024136200341e8026a1001200341a8026a41086a2004290300370300200320032903e8023703a802200341a8026a411041f8b3c200410041001002210b2002101d418e83c1002104200b417f470d49200341e8026a41086a22024200370300200342003703e80241e7fdc0004116200341e8026a100120034190016a41086a2002290300370300200320032903e802370390014100210a024020034190016a411041f8b3c200410041001002417f460d00200341003602b80120034190016a4110200341b8016a41044100100241016a41044d0d2620032802b801210a0b200341e8026a41086a22024200370300200342003703e80241d5fdc0004112200341e8026a100120034190016a41086a2002290300370300200320032903e802370390014100210c20034190016a411041f8b3c200410041001002417f460d1d2003421037029403200320034190016a36029003200341b8016a20034190036a105e20032802b801220d450d2a200341c0016a280200210220032802bc01210c200a2005460d1e0c1f0b200341e0026a41026a200a2d00003a0000200341c8026a41086a200c290300370300200341c8026a410d6a200d290000370000200320032f01e4023b01e002200320032903a8023703c80241012102200741ff01714101470d00200341b8036a41026a200341e0026a41026a2d00003a0000200341b8016a41086a200341c8026a41086a290300370300200341b8016a410d6a200341c8026a410d6a290000370000200320032f01e0023b01b803200320032903c8023703b801410021020c010b41f1b4c0002104412a21090b2003418c016a41026a220b200341b8036a41026a2d00003a0000200341e8026a41086a2207200341b8016a41086a220a290300370300200341e8026a41106a200341b8016a41106a290300370300200320032f01b8033b018c01200320032903b8013703e80220020d46200341a3036a2007290300370000200341a8036a200341e8026a410d6a2202290000370000200320032f018c013b01900320032009360097032003200436009303200320032903e80237009b032003200b2d00003a009203200341e4026a41026a200341b4016a41026a2d00003a0000200a200341f0006a41086a290300370300200341b8016a410d6a2204200341f0006a410d6a290000370000200320032f01b4013b01e402200320032903703703b801200541ff01714101470d0d200341a8026a200641067610b00120032802a802210420032802b0022006413f7122024d0d16200341e0026a41026a200420024105746a220241026a2d00003a0000200341f0026a200241136a290000370300200341f5026a200241186a290000370000200320022f00003b01e0022003200229000b3703e80220022800072108200228000321064101210220032802ac02450d3b0c3a0b200341e0026a41026a20062d00003a0000200341c8026a41086a2008290300370300200341c8026a410d6a2007290000370000200320032f01e4023b01e002200320032903a8023703c80241012102200541ff01714101470d0020034190036a41026a200341e0026a41026a2d00003a0000200341b8036a41086a200341c8026a41086a290300370300200341b8036a410d6a200341c8026a410d6a290000370000200320032f01e0023b019003200320032903c8023703b803410021020c010b41f1b4c0002104412a21090b200341ac016a41026a220b20034190036a41026a2d00003a000020034190016a41086a2205200341b8036a41086a29030037030020034190016a41106a200341b8036a41106a290300370300200320032f0190033b01ac01200320032903b8033703900120020d43200341cb016a2005290300370000200341d0016a2003419d016a290000370000200320032f01ac013b01b801200320093600bf01200320043600bb0120032003290390013700c3012003200b2d00003a00ba01200341e8026a41086a22024200370300200342003703e80241c6fcc0004114200341e8026a1001200341a8026a41086a2002290300370300200320032903e8023703a802200341a8026a411041f8b3c200410041001002417f460d0f41a782c1002104411e21090c430b200341e0026a41026a200c2d00003a0000200341c8026a41086a200d290300370300200341c8026a410d6a200e290000370000200320032f01e4023b01e002200320032903a8023703c80241012102200a41ff01714101470d00200341b8036a41026a200341e0026a41026a2d00003a0000200341b8016a41086a200341c8026a41086a290300370300200341b8016a410d6a200341c8026a410d6a290000370000200320032f01e0023b01b803200320032903c8023703b801410021020c010b41f1b4c0002104412a21090b200341ac016a41026a220b200341b8036a41026a2d00003a000020034190016a41086a220a200341b8016a41086a29030037030020034190016a41106a200341b8016a41106a290300370300200320032f01b8033b01ac01200320032903b8013703900102402002450d004100210b410121052006450d422008101d200128020022024102470d490c480b2003418c016a41026a2202200b2d00003a0000200341f0006a41086a220b200a290300370300200341f0006a410d6a220a20034190016a410d6a290000370000200320032f01ac013b018c012003200329039001370370200341cb016a200b290300370000200341d0016a200a290000370000200320093600bf01200320043600bb01200320022d00003a00ba01200320032f018c013b01b801200320032903703700c301200320053602c003200320063602bc03200320083602b8032003200341b8016a200341b8036a2007108f0220032802042109200328020021044100210b41012105200128020022024102470d480c470b200341e0026a41026a20072d00003a0000200341c8026a41086a200a290300370300200341c8026a410d6a200c290000370000200320032f01e4023b01e002200320032903a8023703c80241012102200541ff01714101470d00200341b8036a41026a200341e0026a41026a2d00003a0000200341b8016a41086a200341c8026a41086a290300370300200341b8016a410d6a200341c8026a410d6a290000370000200320032f01e0023b01b803200320032903c8023703b801410021020c010b41f1b4c0002104412a21090b200341ac016a41026a220b200341b8036a41026a2d00003a000020034190016a41086a2205200341b8016a41086a29030037030020034190016a41106a200341b8016a41106a290300370300200320032f01b8033b01ac01200320032903b8013703900120020d07200341cb036a2005290300370000200341d0036a20034190016a410d6a290000370000200320032f01ac013b01b803200320093600bf03200320043600bb0320032003290390013700c3032003200b2d00003a00ba03200341b8016a200341b8036a10c0014101210220032d00b8014101470d052003418e016a20032d00bb013a0000200341e8026a41086a200341cc016a290200370300200341e8026a410d6a200341d1016a290000370000200320032f00b9013b018c012003200341c4016a2902003703e802200341b8016a41086a28020021094100210220032802bc0121040c060b200341e0026a41026a201a2d00003a0000200341c8026a41086a201b290300370300200341c8026a410d6a201c290000370000200320032f01e4023b01e002200320032903a8023703c80241012102201841ff01714101470d00200341b8036a41026a200341e0026a41026a2d00003a0000200341b8016a41086a200341c8026a41086a290300370300200341b8016a410d6a200341c8026a410d6a290000370000200320032f01e0023b01b803200320032903c8023703b801410021020c010b412a210941f1b4c00021040b2003418c016a41026a2219200341b8036a41026a2d00003a0000200341e8026a41086a2218200341b8016a41086a290300370300200341e8026a41106a200341b8016a41106a290300370300200320032f01b8033b018c01200320032903b8013703e80220020d3a200341a3036a2018290300370000200341a8036a200341e8026a410d6a290000370000200320032f018c013b01900320032009360097032003200436009303200320032903e80237009b03200320192d00003a0092032013201284500d08200341e4026a41026a2202200341b4016a41026a2d00003a0000200341b8016a41086a2204200341f0006a41086a290300370300200341b8016a410d6a200341f0006a410d6a290000370000200320032f01b4013b01e402200320032903703703b801201741ff01714101470d09200341a8026a201541067610b00120032802a802210420032802b0022015413f7122024d0d0c200341e0026a41026a200420024105746a220241026a2d00003a0000200341f0026a200241136a290000370300200341f5026a200241186a290000370000200320022f00003b01e0022003200229000b3703e80220022800072116200228000321154101210220032802ac02450d2b0c2a0b200141086a290300210f200341e8026a41086a22024200370300200342003703e80241eefcc000411c200341e8026a100120034190016a41086a2002290300370300200320032903e802370390012003200f3703b80120034190016a4110200341b8016a410810030c3d0b200341e0026a41026a200341e4026a41026a2d00003a0000200341e8026a41086a200341b8016a41086a29030037030020022004290000370000200320032f01e4023b01e002200320032903b8013703e8020c2e0b410b2109419a80c10021040b200341b4016a41026a220b2003418c016a41026a2d00003a000020034190036a41086a2205200341e8026a41086a29030037030020034190036a41106a200341e8026a41106a290300370300200320032f018c013b01b401200320032903e802370390032002450d010b4101210b410021052006450d362008101d200128020022024102470d3d0c3c0b200341b0016a41026a2202200b2d00003a0000200341f0006a41086a220b2005290300370300200341f0006a410d6a220520034190036a410d6a290000370000200320032f01b4013b01b0012003200329039003370370200341cb016a200b290300370000200341d0016a2005290000370000200320093600bf01200320043600bb01200320022d00003a00ba01200320032f01b0013b01b801200320032903703700c3012003200d3602c003200320063602bc03200320083602b803200341086a200341b8016a200341b8036a200e108f02200328020c2109200328020821044101210b41002105200128020022024102470d3c0c3b0b4114101f2202450d12200241106a41002800b58041360000200241086a41002900ad8041370000200241002900a58041370000200241144134101e2202450d13200220032903b801370014411821092002412c6a200341b8016a41186a290300370000200241246a200341b8016a41106a2903003700002002411c6a200341b8016a41086a290300370000200341e8026a41086a22044200370300200342003703e80220024134200341e8026a1001200341a8026a41086a2004290300370300200320032903e8023703a802200341a8026a411041f8b3c20041004100100221042002101d2004417f460d06200341e8026a41086a22024200370300200342003703e802418afdc000410e200341e8026a100120034190016a41086a2002290300370300200320032903e8023703900120034190016a411041f8b3c200410041001002417f460d0a2003421037029403200320034190016a36029003200341b8036a20034190036a105e20032802b8032202450d1520032802bc03210b200341c0036a2802002204200a4d0d0b2002200a4105746a2209200341b8016a460d0d2009200341b8016a412010d003450d0d41f582c100210441192109200b0d0c0c330b200341e0026a41026a200341e4026a41026a2d00003a0000200341e8026a41086a200341b8016a41086a290300370300200341e8026a410d6a200341b8016a410d6a290000370000200320032f01e4023b01e002200320032903b8013703e8020c2d0b41e083c100210441d00021090c310b200341e0026a41026a20022d00003a0000200341e8026a41086a2004290300370300200341e8026a410d6a200341b8016a410d6a290000370000200320032f01e4023b01e002200320032903b8013703e8020c220b4100210220032802ac020d230c240b4100210220032802bc030d270c280b4100210220032802ac020d1d0c1e0b41c582c10021040c2c0b4101210d41002102200a2005470d010b20022005460d0e0b41ac83c100210441162109200220054d0d0e200341d0016a4200370300200341c8016a4200370300200341c0016a4200370300200342003703b801200d20054105746a220b200341b8016a460d0d200b200341b8016a412010d0030d0e0c0d0b41dd82c10021040c280b41dd82c100210441182109200b450d270b2002101d0c260b200320043602c0032003200b3602bc03200320023602b803200341b8016a200a200341b8036a1090024200210f200341e8026a41086a22024200370300200342003703e802418582c1004112200341e8026a100120034190016a41086a2002290300370300200320032903e80237039001410021040240024020034190016a411041f8b3c200410041001002417f460d00200342003703c003200342003703b80320034190016a4110200341b8036a4110410010022202417f460d0a2002410f4d0d0a200341c0036a290300212320032903b803210f0c010b420021230b200341b8016a200f20231094010c2a0b200341cc016a4101360200200341183602bc03200341c0adc4003602b803200342013702bc01200341c8adc4003602b8012003200341b8036a3602c801200341b8016a41c0a9c30010cf01000b41df88c0004133103a000b411641011020000b413641011020000b411441011020000b413441011020000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b4200210f200341e8026a41086a22044200370300200342003703e802418efec0004115200341e8026a100120034190016a41086a2004290300370300200320032903e802370390010240024020034190016a411041f8b3c200410041001002417f460d00200342003703c001200342003703b80120034190016a4110200341b8016a4110410010022204417f460d042004410f4d0d04200341c0016a290300210f20032903b80121230c010b420921230b200341306a200341b8036a2023200f10cc012003280230450d0141c283c1002104411e21090b200c450d1a200d101d0c1a0b200341e8026a41086a22044200370300200342003703e80241fdfdc0004111200341e8026a100120034190016a41086a2004290300370300200320032903e802370390014100210b024020034190016a411041f8b3c200410041001002417f460d00200341003602b80120034190016a4110200341b8016a41044100100241016a41044d0d0220032802b801210b0b4116101f2204450d022004410e6a41002900d7d940370000200441086a41002900d1d940370000200441002900c9d940370000200441164136101e2204450d03200420032903b8033700162004412e6a200341d0036a290300370000200441266a200341c8036a2903003700002004411e6a200341b8036a41086a290300370000200341e8026a41086a22094200370300200342003703e80220044136200341e8026a100120034190016a41086a2009290300370300200320032903e802370390014104101f2209450d042009200b360000200941044108101e2209450d052009200536000420034190016a41102009410810032009101d2004101d02400240024020022005470d00200341b8016a41186a2204200341b8036a41186a290300370300200341b8016a41106a200341b8036a41106a290300370300200341b8016a41086a2209200341b8036a41086a290300370300200320032903b8033703b801200c2005470d0a200541016a22022005490d1a2005410174220b20022002200b491b220cad420586220f422088a70d1a200fa722024100480d1a2005450d01200d20054105742002101e220d450d020c0a0b200341b8016a41186a2209200341b8036a41186a290300370300200341b8016a41106a200341b8036a41106a290300370300200341b8016a41086a220b200341b8036a41086a290300370300200320032903b8033703b801200220054d0d08200d20054105746a220420032903b801370000200441186a2009290300370000200441106a200341b8016a41106a290300370000200441086a200b2903003700000c0a0b2002101f220d0d080b200241011020000b41df88c0004133103a000b41df88c0004133103a000b411641011020000b413641011020000b410441011020000b410841011020000b4198a9c30020052002104b000b200d20054105746a220220032903b801370000200241186a2004290300370000200241106a200341b8016a41106a290300370000200241086a2009290300370000200541016a21020b200341e8026a41086a22044200370300200342003703e80241d5fdc0004112200341e8026a100120034190016a41086a2004290300370300200320032903e80237039001200341003602c001200342013703b801200320023602900320034190036a200341b8016a10620240024002402002450d00200d20024105746a21084100200341b8016a41086a28020022046b210b20032802b801210620032802bc012105200d2102034002402005200b6a411f4b0d00200441206a22092004490d1320054101742207200920092007491b22094100480d13024002402005450d00200620052009101e22060d010c060b2009101f2206450d050b200921050b200620046a22092002290000370000200941186a200241186a290000370000200941106a200241106a290000370000200941086a200241086a290000370000200b41606a210b200441206a2104200241206a2209210220082009470d000b200341c0016a2004360200200320053602bc01200320063602b8010c010b200341b8016a41086a280200210420032802bc01210520032802b80121060b20034190016a411020062004100302402005450d002006101d0b0240200c450d00200d101d0b200341e8026a41086a22024200370300200342003703e80241e7fdc0004116200341e8026a100120034190016a41086a2002290300370300200320032903e80237039001410121052003200a41016a3602b80120034190016a4110200341b8016a410410030c090b200941011020000b2004101d0b20020d004101210241d7c0c1002115411521160c010b200341a8026a41026a200341e0026a41026a2d00003a0000200341b8016a41086a200341e8026a41086a290300370300200341b8016a410d6a200341e8026a410d6a290000370000200320032f01e0023b01a802200320032903e8023703b801410021020b200341ac016a41026a2209200341a8026a41026a2d00003a000020034190016a41086a2204200341b8016a41086a29030037030020034190016a41106a200341b8016a41106a290300370300200320032f01a8023b01ac01200320032903b8013703900102402002450d0020162109201521040c0d0b200341cb036a2004290300370000200341d0036a2003419d016a290000370000200320032f01ac013b01b803200320163600bf03200320153600bb0320032003290390013700c303200320092d00003a00ba03200341e8026a41086a22024200370300200342003703e80241fdfdc0004111200341e8026a100120042002290300370300200320032903e80237039001410021020240024002400240024002400240024002400240024002400240024002400240024020034190016a411041f8b3c200410041001002417f460d00200341003602b80120034190016a4110200341b8016a41044100100241016a41044d0d0120032802b80121020b0240024002400240024002400240024020022014470d00200341e8026a41086a22024200370300200342003703e80241c6fcc0004114200341e8026a100120034190016a41086a22042002290300370300200320032903e80237039001200341b8016a20034190016a106020032802c401221b450d0120032903c801211e20024200370300200342003703e8024198fdc0004118200341e8026a100120042002290300370300200320032903e802370390014100211520034190016a411041f8b3c200410041001002417f460d02200342103702ec02200320034190016a3602e802200341e8006a200341e8026a10d5012003280268450d07200328026c221aad221f421c88a70d0b201f420486a72202417f4c0d0b2002450d032002101f22190d04200241081020000b41dd84c1002104411121090c230b41b084c1002104412d21090c220b410821194108212d410021020c020b410821190b02400240201a450d00200341e8026a41086a280200211620032802ec02211c20032802e8022117410021184100210941002104201a21150340200342003703c001200342003703b80141002017201c200341b8016a41102016100222022002417f461b2202411020024110491b20166a21162002410f4d0d04200441016a2102200341b8016a41086a290300211f20032903b8012132024020042015470d002018200220022018491b2215ad4204862233422088a70d212033a722144100480d2102402004450d00201920092014101e22190d010c090b2014101f2219450d080b201920096a2204201f37030820042032370300201841026a2118200941106a2109200221042002201a490d000b200341f0026a201636020020190d010c040b41002102410021152019450d030b2019212d0b200341e8026a41086a22044200370300200342003703e802418afdc000410e200341e8026a100120034190016a41086a2004290300370300200320032903e802370390014100211a0240024020034190016a411041f8b3c200410041001002417f460d00200342103702ec02200320034190016a3602e802200341b8016a200341e8026a105e20032802b801221c450d0e200341c0016a280200212e20032802bc01211a0c010b4101211c4100212e0b4200211f200341e8026a41086a22044200370300200342003703e80241c986c100411c200341e8026a100120034190016a41086a2004290300370300200320032903e802370390010240024020034190016a411041f8b3c200410041001002417f460d00200342003703c001200342003703b80120034190016a4110200341b8016a4110410010022204417f460d082004410f4d0d08200341c0016a290300211f20032903b80121320c010b420121320b200341d8006a2032201f202ead420010d2034114101f2204450d08200341d8006a41086a290300211f20032903582134200441106a41002800d5ba40360000200441086a41002900cdba40370000200441002900c5ba40370000200441144134101e2204450d0920042003290390033700142004412c6a200341a8036a290300370000200441246a20034190036a41106a2903003700002004411c6a20034190036a41086a29030037000042002133200341e8026a41086a22094200370300200342003703e80220044134200341e8026a1001200341a8026a41086a2009290300370300200320032903e8023703a80202400240200341a8026a411041f8b3c200410041001002417f460d00200342003703c001200342003703b801200341a8026a4110200341b8016a4110410010022209417f460d092009410f4d0d09200341c0016a290300213220032903b80121330c010b420021320b2004101d0240024002400240024020332034542032201f542032201f511b450d00419f85c1002104412e2109201a0d010c020b200341e8026a41086a22044200370300200342003703e80241c2fdc0004113200341e8026a100120034190016a41086a2004290300370300200320032903e80237039001024002400240024020034190016a411041f8b3c200410041001002417f460d00200342103702ec02200320034190016a3602e802200341b8016a200341e8026a10860220032802b8012216450d15200341b8016a41086a2802002218450d1620032802bc01211741cd85c1002104412321092016290300201354201641086a290300223220125420322012511b450d0341082131200341e8026a41086a22044200370300200342003703e80241dfd9c0004115200341e8026a100120034190016a41086a2004290300370300200320032903e802370390014100213520034190016a411041f8b3c200410041001002417f460d01200342103702ec02200320034190016a3602e802200341b8016a200341e8026a10a40120032802b8012231450d17200341c0016a280200213620032802bc0121350c020b41ee84c100210441312109201a0d030c040b410021360b2031203641286c6a2130203121044100211402400240024002400340203020046b419f014d0d012004200341b8036a460d0220142004200341b8036a412010d003222f4100476a2114202f450d02200441286a222f200341b8036a460d022014202f200341b8036a412010d003222f4100476a2114202f450d02200441d0006a222f200341b8036a460d022014202f200341b8036a412010d003222f4100476a2114202f450d02200441f8006a222f200341b8036a460d02200441a0016a21042014202f200341b8036a412010d003222f4100476a2114202f0d000c020b0b20302004460d012031203641286c6a21300340200341b8036a2004460d0120142004200341b8036a412010d003222f4100476a2114202f450d012030200441286a2204470d000c020b0b2014201e422088a74f0d010b02402035450d002031101d0b200341b8016a200341b8036a10fb0141a686c100210420032802b8014101470d01200241ffffffff00712202202e41ffffff3f712204200420024b1b222f450d04200341c0016a280200213120032802bc012130201c210441002109420021374200213803404114101f2202450d11200241106a41002800b58041360000200241086a41002900ad8041370000200241002900a58041370000200241144134101e2202450d12200220042900003700142002412c6a200441186a290000370000200241246a200441106a2900003700002002411c6a200441086a290000370000200341e8026a41086a22144200370300200342003703e80220024134200341e8026a100120034190016a41086a2014290300370300200320032903e8023703900102400240024020034190016a411041f8b3c200410041001002417f460d00200341003602b80120034190016a4110200341b8016a41044100100241016a41044d0d0e20032802b801212e41002114200941016a21092002101d202e20304f0d010c020b41012114200941016a21092002101d41002030490d010b20140d00200341b8016a200410910242002132420021330240200341b8016a41086a28020020314d0d00202d41086a290300420020032802b80120316a2d000022021b2133202d290300420020021b21320b024020032802bc01450d0020032802b801101d0b203320387c203220377c2237203254ad7c21380b200441206a2104202d41106a212d2009202f490d000c060b0b41f085c1002104413621092035450d002031101d0b02402017450d002016101d0b201a450d010b201c101d0b02402015450d002019101d0b201ea7450d200c130b42002137420021380b2016201841306c6a2114201621020240024002400340201420026b41bf014d0d0141012109200241106a2204200341b8036a460d022004200341b8036a412010d003450d02200241c0006a2204200341b8036a460d022004200341b8036a412010d003450d02200241f0006a2204200341b8036a460d022004200341b8036a412010d003450d02200241a0016a2204200341b8036a460d02200241c0016a21022004200341b8036a412010d0030d000c020b0b024020022014460d00034041012109200241106a2202200341b8036a460d022002200341b8036a412010d003450d02200241206a22022014470d000b0b4100210920372013852038201285844200520d00200341b8036a41086a290300211f200341b8036a41106a2903002132200341b8036a41186a290300213320032903b80321342016201237030820162013370300200341b8016a41186a2033370300200341b8016a41106a2032370300200341b8016a41086a201f37030020162034370310201641186a201f370300201641206a2032370300201641286a2033370300200320343703b801201841144b0d014101213a201841014d0d1f417f213b2018417f6a213c4130213d2016201841306c6a213e4102213f41082140411021414128214241182143412021444103214541e80021464150214741782148417021494168214a4160214b4158214c4138214d410121020c1d0b200341386a20034190036a2034201f10ef012003290338200341c0006a29030010f30102402017450d002016101d0b0240201a450d00201c101d0b02402015450d002019101d0b41e586c10041fb86c10020091b21044116410f20091b2109201ea70d120c1f0b2018410176224ead42307e220f422088a70d05200fa72202417f4c0d054108210b024002402002450d002002101f224f450d12204f21500c010b4108214f410821500b4150210c201641506a21514130210d201641306a2152201641f07e6a21534100215441042155417f215641012139420321234220210f4103215741022158417d21594158215a4128210a412021074118210641102108417e215b4174215c4164215d41a87f215e41a07f215f4109216041e80021614178216241702163416821644160216541382166410a216741042168410021694100216a2018216b410221020c1b0b200341f0026a20163602002015450d002019101d0b41df88c0004133103a000b41df88c0004133103a000b201441081020000b41df88c0004133103a000b102e000b41df88c0004133103a000b41df88c0004133103a000b411441011020000b413441011020000b411441011020000b413441011020000b41df88c0004133103a000b41df88c0004133103a000b4188a9c30041004100104b000b41df88c0004133103a000b200241081020000b201b101d0c0c0b2004101d0b20020d004101210241d7c0c1002106411521080c010b200341a8026a41026a200341e0026a41026a2d00003a0000200341b8016a41086a200341e8026a41086a290300370300200341b8016a410d6a200341e8026a410d6a290000370000200320032f01e0023b01a802200320032903e8023703b801410021020b200341ac016a41026a2204200341a8026a41026a2d00003a000020034190016a41086a2209200341b8016a41086a29030037030020034190016a41106a200341b8016a41106a290300370300200320032f01a8023b01ac01200320032903b8013703900102402002450d00410121054101210b2008210920062104200128020022024102470d110c100b200341cb036a2009290300370000200341d0036a2003419d016a290000370000200320032f01ac013b01b803200320083600bf03200320063600bb0320032003290390013700c303200320042d00003a00ba03200341e8026a41086a22024200370300200342003703e80241c6fcc0004114200341e8026a1001200341a8026a41086a2002290300370300200320032903e8023703a8020240200341a8026a411041f8b3c200410041001002417f460d0041b980c1002104412621090c090b024002400240024002404114101f2202450d00200241106a41002800b58041360000200241086a41002900ad8041370000200241002900a58041370000200241144134101e2202450d012002200329039003370014411821092002412c6a20034190036a41186a290300370000200241246a20034190036a41106a2903003700002002411c6a20034190036a41086a290300370000200341e8026a41086a22044200370300200342003703e80220024134200341e8026a100120034190016a41086a2004290300370300200320032903e80237039001024002400240024002400240024020034190016a411041f8b3c200410041001002417f460d00200341003602b80120034190016a4110200341b8016a41044100100241016a41044d0d042002101d4114101f2202450d09200241106a41002800b58041360000200241086a41002900ad8041370000200241002900a58041370000200241144134101e2202450d0a200220032903b803370014412c21092002412c6a200341d0036a290300370000200241246a200341b8036a41106a2903003700002002411c6a200341b8036a41086a290300370000200341e8026a41086a22044200370300200342003703e80220024134200341e8026a100120034190016a41086a2004290300370300200320032903e8023703900120034190016a411041f8b3c200410041001002417f460d01200341003602b80120034190016a4110200341b8016a41044100100241016a41044d0d0520032802b801210b2002101d200341e8026a41086a22024200370300200342003703e80241fdfdc0004111200341e8026a100120034190016a41086a2002290300370300200320032903e8023703900120034190016a411041f8b3c200410041001002417f460d02200341003602b80120034190016a4110200341b8016a41044100100241016a41044d0d0620032802b801200e470d030c0b0b2002101d41df80c10021040c130b2002101d41ac81c10021040c120b4100200e460d080b41f780c1002104411621090c100b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b411441011020000b413441011020000b411441011020000b413441011020000b200341e8026a41086a22024200370300200342003703e80241ea81c100411b200341e8026a100120034190016a41086a2002290300370300200320032903e80237039001024002400240024020034190016a411041f8b3c200410041001002417f460d00200341003602b80120034190016a4110200341b8016a41044100100241016a41044d0d0220032802b801200b6a200e4f0d010c030b4101200b6a200e490d020b418d81c1002104411f21090c0a0b41df88c0004133103a000b200341e8026a41086a22024200370300200342003703e802418afdc000410e200341e8026a100120034190016a41086a2002290300370300200320032903e80237039001024002400240024002400240024002400240024020034190016a411041f8b3c200410041001002417f460d00200342103702ec02200320034190016a3602e802200341b8016a200341e8026a105e20032802b8012205450d0220032802bc01210641d881c1002104411221090240200341c0016a280200220720114d0d000240200520114105746a220220034190036a460d00200220034190036a412010d0030d010b419782c100210441102109200720104d0d00200520104105746a2202200341b8036a460d022002200341b8036a412010d003450d020b2006450d122005101d0c120b41d881c1002104411221090c110b200341a8026a200341b8036a10910220032802b002210220032802a8022109200341e8026a41086a22044200370300200342003703e80241d5fdc0004112200341e8026a100120034190016a41086a2004290300370300200320032903e80237039001410021040240024020034190016a411041f8b3c200410041001002417f460d00200342103702ec02200320034190016a3602e802200341b8016a200341e8026a105e20032802b8012224450d03200341c0016a280200210420032802bc0121390c010b41012124410021390b02400240200441ffffff3f7122042002200220044b1b2208450d0041002104200341d0016a210a200341c8016a210c200341c0016a210d2024210203400240200920046a2d0000450d00200a4200370300200c4200370300200d4200370300200342003703b801200341b8016a2002460d002002200341b8016a412010d003450d00200341b8016a200210fb014101210e20032802b8014101470d0020032802bc01200b4d0d030b200241206a2102200441016a22042008490d000b0b4100210e0b02402039450d002024101d0b024020032802ac02450d002009101d0b200320073602c001200320063602bc01200320053602b80120034190036a200341b8036a200e1b20112010200e1b200341b8016a1090024200210f200341e8026a41086a22024200370300200342003703e802418582c1004112200341e8026a100120034190016a41086a2002290300370300200320032903e8023703900120034190016a411041f8b3c200410041001002210202400240024002400240200e450d002002417f460d01200342003703c001200342003703b80120034190016a4110200341b8016a4110410010022202417f460d072002410f4d0d07200341c0016a290300210f20032903b80121230c020b2002417f460d02200342003703c001200342003703b80120034190016a4110200341b8016a4110410010022202417f460d072002410f4d0d07200341c0016a290300212b20032903b801210f0c030b420021234200210f0b200341106a20034190036a2023200f10f2012003290310200341106a41086a29030010f301200341c5016a20034190036a41086a290300370000200341cd016a200341a0036a290300370000200341d5016a200341a8036a29030037000041012105200341013a00bc01200341063a00b80120032003290390033700bd01200341b8016a108b010c0a0b4200212b0b200341206a20034190036a109a010240024002402003290320200341286a29030084500d004118101f2202450d08200241106a41002900e9ba40370000200241086a41002900e1ba40370000200241002900d9ba40370000200241184138101e2202450d09200220032903b803370018200241306a200341d0036a290300370000200241286a200341b8036a41106a290300370000200241206a200341b8036a41086a29030037000042002123200341e8026a41086a22044200370300200342003703e80220024138200341e8026a1001200341a8026a41086a2004290300370300200320032903e8023703a802200341a8026a411041f8b3c200410041001002417f460d01200342003703c001200342003703b801200341a8026a4110200341b8016a4110410010022204417f460d072004410f4d0d07200341c0016a290300211e20032903b80121232002101d411421044114101f2202450d020c0a0b4184b8c0002104412221090c120b4200211e2002101d411421044114101f22020d080b200441011020000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b411841011020000b413841011020000b200241106a41002800d5ba40360000200241086a41002900cdba40370000200241002900c5ba403700000240200220044134101e2202450d0020022003290390033700142002412c6a20034190036a41186a2204290300370000200241246a20034190036a41106a2903003700002002411c6a20034190036a41086a2903003700004200212a200341e8026a41086a22094200370300200342003703e80220024134200341e8026a1001200341a8026a41086a2009290300370300200320032903e8023703a802024002400240200341a8026a411041f8b3c200410041001002417f460d00200342003703c001200342003703b801200341a8026a4110200341b8016a4110410010022209417f460d022009410f4d0d02200341c0016a290300211220032903b801212a0c010b420021120b2002101d20034190036a202a200f20232023200f56201e202b56201e202b511b22021b220f7c22132012202b201e20021b222b7c2013202a54ad7c10e201200341b8036a2023200f7d201e202b7d2023200f54ad7d10e701200341c5016a200341b8036a41086a290300370000200341cd016a200341b8036a41106a290300370000200341d5016a200341b8036a41186a290300370000200341dd016a200329039003370000200341e5016a20034190036a41086a290300370000200341ed016a20034190036a41106a290300370000200341f5016a200429030037000041002104200341003a00bc01200341063a00b801200320032903b8033700bd01200341b8016a108b010c0f0b41df88c0004133103a000b413441011020000b410021040c0d0b2005101d0b20020d004101210241d7c0c1002104411521090c010b200341b8036a41026a200341e0026a41026a2d00003a0000200341b8016a41086a200341e8026a41086a290300370300200341b8016a410d6a200341e8026a410d6a290000370000200320032f01e0023b01b803200320032903e8023703b801410021020b200341ac016a41026a220e200341b8036a41026a2d00003a000020034190016a41086a2205200341b8016a41086a29030037030020034190016a41106a200341b8016a41106a290300370300200320032f01b8033b01ac01200320032903b8013703900120020d03200341bb026a2005290300370000200341c0026a2003419d016a290000370000200320032f01ac013b01a802200320093600af02200320043600ab0220032003290390013700b3022003200e2d00003a00aa02200341e8026a41086a22024200370300200342003703e80241dfd9c0004115200341e8026a100120052002290300370300200320032903e802370390014100211d0240024002400240024002400240024020034190016a411041f8b3c200410041001002417f460d00200342103702bc03200320034190016a3602b803200341b8016a200341b8036a10a40120032802b801220e450d0620032802bc01211d41282109200341c0016a280200221141286c22050d010c020b4108210e4100211141282109410041286c2205450d010b410021040340200341b8016a41206a200e20046a220241206a290300370300200341b8016a41186a200241186a290300370300200341b8016a41106a200241106a290300370300200341b8016a41086a200241086a290300370300200320022903003703b801200341b8016a200341a8026a412010d0030d022005200420096a2204470d000b0b4108212041002121201d450d01200e101d410021220c0b0b200341b8036a41206a2209200341b8016a41206a290300370300200341b8036a41186a2205200341b8016a41186a290300370300200341b8036a41106a2210200341b8016a41106a290300370300200341b8036a41086a2224200341b8016a41086a290300370300200320032903b8013703b80320034190036a41206a2225200929030037030020034190036a41186a2209200529030037030020034190036a41106a2205201029030037030020034190036a41086a22102024290300370300200320032903b80337039003200341e8026a41206a22242025290300370300200341e8026a41186a22252009290300370300200341e8026a41106a22092005290300370300200341e8026a41086a2205201029030037030020032003290390033703e8024128101f2220450d03202020032903e802370300202041206a2024290300370300202041186a2025290300370300202041106a2009290300370300202041086a2005290300370300201141286c41586a2004460d01200241286a212641282125200e201141286c6a222741586a212841012129412021054118212441102110410821114228212a4220212b4100212c4101212141012122410021020c040b410021220c090b41012121410121220c070b41df88c0004133103a000b412841081020000b02400340024002400240024002400240024002400240024002400240024002400240024002400240024020020e03000102020b2026210202400340200341b8016a20056a2204200220056a290300370300200341b8016a20246a2209200220246a290300370300200341b8016a20106a2214200220106a290300370300200341b8016a20116a222d200220116a290300370300200320022903003703b801200341b8016a200341a8026a200510d0030d012027200220256a2202470d000c1a0b0b200341b8036a20056a22262004290300370300200341b8036a20246a222e2009290300370300200341b8036a20106a222f2014290300370300200341b8036a20116a2230202d290300370300200320032903b8013703b80320034190036a20056a2231202629030037030020034190036a20246a2226202e29030037030020034190036a20106a222e202f29030037030020034190036a20116a222f2030290300370300200320032903b8033703900320042031290300370300200920262903003703002014202e290300370300202d202f29030037030020032003290390033703b801024020222021470d00202120296a22222021490d1520212029742226202220222026491b2222ad202a7e2212202b88a70d152012a72226202c480d1502402021450d002020202120256c2026101e22200d010c040b2026101f2220450d030b200220256a21262020202120256c6a222e20032903b801370300202e20056a2004290300370300202e20246a2009290300370300202e20106a2014290300370300202e20116a202d290300370300202120296a212120282002470d070c180b2018203c2202203b6a223c490d0202402018203c6b2209203f490d0020162002203d6c6a22022903002016203c203d6c6a2204290300221f5a200220406a22142903002213200420406a222d29030022125a20132012511b0d0020042002290300370300202d201429030037030020042903102113200420416a200220416a290300370300200341b8016a20436a222f200420426a2214290300370300200341b8016a20416a2230200420446a222d290300370300200341b8016a20406a2231200420436a222e290300370300202e200220436a290300370300202d200220446a2903003703002014200220426a290300370300200320133703b80141012114024020092045490d002004290360201f5a200420466a290300221320125a20132012511b0d0041032114203e212d02400340202d220220476a2002290300370300200220486a200220426a290300370300200220496a200220446a2903003703002002204a6a200220436a2903003703002002204b6a200220416a2903003703002002204c6a200220406a2903003703002014222e20094f0d01202e203a6a21142002203d6a222d290300201f5a2002204d6a290300221320125a20132012511b450d000b0b202e203b6a21140b2002201f3703002002201237030820042014203d6c6a220220426a202f290300370300200220446a2030290300370300200220436a2031290300370300200220032903b8013703100b203e20476a213e203c0d070c140b206b216c4100216b4101216d206c20566a222f450d0702400240024002400240024002402016202f200d6c6a22022903002016206c200d6c222d6a2204205f6a2903002213542002200b6a290300221f2004205e6a290300221254201f2012511b450d002053202d6a21020340202f2039460d0220132002290300223254210420122002200b6a290300221f5121092012201f5421142002200c6a2102202f20566a212f20322113201f21122004201420091b0d000c030b0b206c205b6a212e2053202d6a21024100216b410021040340202e2004460d052013200229030022325a210920122002200b6a290300221f5121142012201f5a212d2002200c6a2102200420396a210420322113201f21122009202d20141b0d000b200420396a216d206c20046b20566a222f0d030c020b4100212f0b206c202f490d06206c20184b0d080240206c202f6b226d2039762209450d002051202d6a21022016202f200d6c6a21040340200341b8016a200a6a22142004200a6a222d290300370300200341b8016a20076a222e200420076a2230290300370300200341b8016a20066a2231200420066a2235290300370300200341b8016a20086a2236200420086a226e290300370300200341b8016a200b6a226f2004200b6a2270290300370300200320042903003703b8012002200b6a22712903002112200220086a22722903002113200220066a2273290300211f200220076a2274290300213220022903002133202d2002200a6a2275290300370300203020323703002035201f370300206e20133703002070201237030020042033370300207520142903003703002074202e29030037030020732031290300370300207220362903003703002071206f290300370300200220032903b8013703002004200d6a21042002200c6a2102200920566a22090d000b0b202f0d010b202f216b2069206a460d0f0c100b206d20604b0d01206c20184b0d052052202f200d6c6a2176410021770c100b206c216d2069206a460d090c0a0b202f216b2069206a470d0b0c0a0b202641081020000b203c2018102a000b202f206c102a000b206c202f417f6a226b490d0d0b206c2018102b000b410021020c0a0b410121020c090b410021020c070b410121020c060b410221020c050b410121020c040b410221020c030b410121020c020b410221020c010b410321020b034002400240024002400240024002400240024002400240024002400240024002400240024002400240024020020e0400010204040b2069206a470d10410121020c140b206920396a22022069490d1620692039742204200220022004491b2202ad2023862212200f88a70d162012a722042054480d16024002402069450d00206820692057742004101e22680d010c030b2004101f2268450d020b20022169410221020c130b2068206a2057746a2202206d3602042002206b360200206a20396a2278216a20782058490d02410121770c110b200441041020000b0240024020770e020001010b206c202f20566a226b490d130240206c206b6b226d2058490d002016202f200d6c6a22022903002016206b200d6c6a2204290300221f5a2002200b6a220929030022132004200b6a221429030022125a20132012511b0d00200420022903003703002014200929030037030020042903102113200420086a200220086a290300370300200341b8016a20066a222e2004200a6a2209290300370300200341b8016a20086a2230200420076a2214290300370300200341b8016a200b6a2231200420066a222d290300370300202d200220066a2903003703002014200220076a29030037030020092002200a6a290300370300200320133703b801410121090240206d2057490d002004290360201f5a200420616a290300221320125a20132012511b0d0041032109207621140240034020142202200c6a2002290300370300200220626a2002200a6a290300370300200220636a200220076a290300370300200220646a200220066a290300370300200220656a200220086a2903003703002002205a6a2002200b6a2903003703002009222d206d4f0d01202d20396a21092002200d6a2214290300201f5a200220666a290300221320125a20132012511b450d000b0b202d20566a21090b2002201f3703002002201237030820042009200d6c6a2202200a6a202e290300370300200220076a2030290300370300200220066a2031290300370300200220032903b8013703100b206b450d0c2076200c6a2176206b212f206d2067490d0a410021020c110b024002400240024020682078223120566a22782057746a2202280200450d00206820312057746a222d205c6a2802002214200228020422044d0d004102216a203141024d0d042068203120596a22022057746a2802042209200420146a4d0d014103216a203141034d0d04202d205d6a280200200920146a4d0d010c050b20312057490d01200228020421042068203120596a22022057746a28020421090b20092004490d010b2031205b6a21020b2031200220396a22704d0d03203120024d0d04206820022057746a2236280204227120362802006a2202206820702057746a226e280200226f490d05200220184b0d06203620556a21722016206f200d6c6a2230206e2802042235200d6c22046a216a2002200d6c2109024002400240024002402002206f6b222d20356b220220354f0d00204f206a2002200d6c220410ce031a205020046a211420352039480d0120022039480d01205120096a2109206a2102034020092002200c6a226a2014200c6a222d202d290300206a290300542014205a6a29030022122002205a6a29030022135420122013511b222e1b22042903003703002009200a6a2004200a6a290300370300200920076a200420076a290300370300200920066a200420066a290300370300200920086a200420086a2903003703002009200b6a2004200b6a2903003703002014202d202e1b21142030206a2002202e1b22024f0d042009200c6a21092050210420502014490d000c050b0b204f2030200410ce031a205020046a211420352039480d01202d20354c0d01201620096a212e205021042030210203402002206a2004206a290300200429030054206a200b6a29030022122004200b6a29030022135420122013511b222d1b22092903003703002002200a6a2009200a6a290300370300200220076a200920076a290300370300200220066a200920066a290300370300200220086a200920086a2903003703002002200b6a2009200b6a29030037030020042004200d6a202d1b21042002200d6a2102206a200d6a206a202d1b226a202e4f0d04201420044b0d000c040b0b206a21020c010b203021020b205021040b20022004201420046b22092009200d706b10ce031a2072207120356a3602002036206f360200206e206e200b6a207020567320316a20577410cf031a2078216a207820394b0d0a0b206b0d060c010b2031216a206b0d060b02402069450d002068101d0b204e450d11204f101d0c110b4188bfc30020702031104b000b4188bfc30020022031104b000b206f2002102a000b20022018102b000b410221020c090b410221020c080b410021770c030b410121770c030b410021020c040b410221020c030b410321020c020b410321020c010b410321020c000b0b0b206b206c102a000b1021000b200320183602c001200320173602bc01200320163602b801200341e8026a41086a22024200370300200342003703e80241c2fdc0004113200341e8026a100120034190016a41086a2002290300370300200320032903e80237039001200341103602ec02200320034190016a3602e802200341b8016a200341e8026a10850202402017450d002016101d0b0240201a450d00201c101d0b02402015450d002019101d0b410021040240201ea7450d00201b101d0b0b410121054101210b0b200128020022024102460d050c060b201d450d00200e101d0b200320213602c001200320223602bc01200320203602b801200341e8026a41086a22024200370300200342003703e80241dfd9c0004115200341e8026a100120034190016a41086a2002290300370300200320032903e80237039001200341103602bc03200320034190016a3602b803200341b8016a200341b8036a1087022022450d002020101d0b410021040b410121050b4101210b200128020022024102470d010b2005450d01200141086a280200450d012001280204101d0c010b20024101470d00200b450d00200141086a280200450d002001280204101d0b2000200936020420002004360200200341e0036a24000bdf1505067f017e047f017e047f230041d0006b22042400200441c0006a41086a220542003703002004420037034041d5fdc0004112200441c0006a1001200441306a41086a200529030037030020042004290340370330410021060240024002400240024002400240200441306a411041f8b3c200410041001002417f460d00200442103702442004200441306a360240200441106a200441c0006a105e20042802102207450d02200441186a2802002106200428021421080c010b41012107410021080b200441c0006a41086a220542003703002004420037034041c6fcc0004114200441c0006a1001200441106a41086a2005290300370300200420042903403703100240200441106a411041f8b3c200410041001002417f460d00419d87c1002105412e21062008450d040c030b200542003703002004420037034041fdfdc0004111200441c0006a1001200441306a41086a200529030037030020042004290340370330024002400240200441306a411041f8b3c200410041001002417f460d0020044100360210200441306a4110200441106a41044100100241016a41044d0d0220042802102003470d010c040b41002003460d030b41cb87c10021054114210620080d030c040b41df88c0004133103a000b41df88c0004133103a000b024002402006450d002006200241086a28020022094f0d0141a088c100210541c500210620080d020c030b41df87c100210541c100210620080d010c020b02400240024002400240024002400240024002400240024002404114101f2205450d00200541106a41002800b58041360000200541086a41002900ad8041370000200541002900a58041370000200541144134101e2205450d01200520012900003700142005412c6a200141186a290000370000200541246a200141106a2900003700002005411c6a200141086a2900003700004200210a200441c0006a41086a220642003703002004420037034020054134200441c0006a1001200441106a41086a200629030037030020042004290340370310200441106a411041f8b3c20041004100100221062005101d2006417f470d05200441c0006a41086a2205420037030020044200370340418582c1004112200441c0006a1001200441306a41086a20052903003703002004200429034037033002400240200441306a411041f8b3c200410041001002417f460d002004420037031820044200370310200441306a4110200441106a4110410010022205417f460d042005410f4d0d04200441186a290300210f2004290310210a0c010b4200210f0b200441086a2001200a200f10cc01024020042802082205450d00200428020c210620080d0e0c0f0b200441c0006a41086a2205420037030020044200370340418afdc000410e200441c0006a1001200441306a41086a20052903003703002004200429034037033041002105024002400240200441306a411041f8b3c200410041001002417f460d00200442103702442004200441306a360240200441106a200441c0006a105e20042802102210450d06200441106a41086a2206280200210e20042802142105200441106a41186a200141186a290000370300200441106a41106a200141106a2900003703002006200141086a29000037030020042001290000370310200441106a210620052111200e2005460d010c020b200441106a41186a200141186a290000370300200441106a41106a200141106a290000370300200441106a41086a200141086a2900003703002004200129000037031041012110200441106a21060b200541016a220e2005490d092005410174220d200e200e200d491b2211ad420586220a422088a70d09200aa7220d4100480d0902402005450d002005210e20102005410574200d101e22100d010c060b2005210e200d101f2210450d050b2010200e410574220d6a22052006290000370000200541186a200641186a290000370000200541106a200641106a290000370000200541086a200641086a290000370000200441c0006a41086a2205420037030020044200370340418afdc000410e200441c0006a1001200441306a41086a20052903003703002004200429034037033020044100360218200442013703102004200e41016a2205360240200441c0006a200441106a10620240024002402005450d00200d41206a210b4100200441106a41086a28020022066b210d200428021021122004280214210c2010210503400240200c200d6a411f4b0d00200641206a220e2006490d0d200c4101742213200e200e2013491b220e4100480d0d02400240200c450d002012200c200e101e22120d010c060b200e101f2212450d050b200e210c0b201220066a220e2005290000370000200e41186a200541186a290000370000200e41106a200541106a290000370000200e41086a200541086a290000370000200d41606a210d200641206a2106200541206a2105200b41606a220b0d000b200441186a20063602002004200c360214200420123602100c010b200441106a41086a28020021062004280214210c200428021021120b200441306a41102012200610030240200c450d002012101d0b2011450d062010101d411421064114101f22050d070c080b200e41011020000b411441011020000b413441011020000b41df88c0004133103a000b41df88c0004133103a000b200d41011020000b411421064114101f2205450d010b200541106a41002800b58041360000200541086a41002900ad8041370000200541002900a58041370000200520064134101e2205450d03200520012900003700142005412c6a200141186a290000370000200541246a200141106a2900003700002005411c6a200141086a290000370000200441c0006a41086a220642003703002004420037034020054134200441c0006a1001200441306a41086a20062903003703002004200429034037033020042003360210200441306a4110200441106a410410032005101d2002280204210b2002280200210c4113101f2202450d042002410f6a41002800998741360000200241086a410029009287413700002002410029008a8741370000200241134133101e220d450d05200d2001290000370013200d412b6a200141186a290000370000200d41236a200141106a290000370000200d411b6a200141086a290000370000200441c0006a41086a2202420037030020044200370340200d4133200441c0006a1001200441306a41086a200229030037030020042004290340370330200441003602182004420137031020042009360240200441c0006a200441106a1062024002402009450d00200441186a220e280200210220042802142105200c21060340024002400240024020022005470d00200541016a22012005490d0820054101742203200120012003491b22034100480d082005450d01200428021020052003101e22010d020c090b200428021021010c020b2003101f2201450d070b2004200336021420042001360210200321050b200e200241016a2203360200200120026a20062d00003a000020032102200641016a21062009417f6a22090d000c020b0b200441186a280200210320042802142105200428021021010b200441306a411020012003100302402005450d002001101d0b200d101d0240200b450d00200c101d0b4100210502402008450d002007101d0b0c080b200641011020000b1021000b200341011020000b413441011020000b411341011020000b413341011020000b2007101d0b200241046a280200450d002002280200101d0b2000200636020420002005360200200441d0006a24000bef0703057f037e037f230041306b22032400024002400240024002402002280208220420014d0d0020022802002105200241086a2004417f6a2206360200200520064105746a22072900002108200729000821092007290010210a200520014105746a220141186a200741186a2900003700002001200a37001020012009370008200120083700002002280204210b200341106a41086a2202420037030020034200370310418afdc000410e200341106a1001200341206a41086a20022903003703002003200329031037032020034100360218200342013703102003200636020c2003410c6a200341106a106202400240024002402006450d00200441057441606a2104200228020021062003280210210c200328021421012005210203400240024002400240200120066b41204f0d00200641206a22072006490d072001410174220d20072007200d491b220d4100480d072001450d01200c2001200d101e220c0d020c080b200641206a21070c020b200d101f220c450d060b200d21010b200c20066a22062002290000370000200641186a200241186a290000370000200641106a200241106a290000370000200641086a200241086a29000037000020072106200241206a2102200441606a22040d000b200341186a2007360200200320013602142003200c3602100c010b20022802002107200328021421012003280210210c0b200341206a4110200c2007100302402001450d00200c101d0b0240200b450d002005101d0b4113101f2202450d032002410f6a41002800998741360000200241086a410029009287413700002002410029008a8741370000200241134133101e2202450d04200220002900003700132002412b6a200041186a290000370000200241236a200041106a2900003700002002411b6a200041086a290000370000200341106a41086a220642003703002003420037031020024133200341106a1001200341206a41086a200629030037030020032003290310370320200341206a411010092002101d4114101f2202450d05200241106a41002800b58041360000200241086a41002900ad8041370000200241002900a58041370000200241144134101e2202450d06200220002900003700142002412c6a200041186a290000370000200241246a200041106a2900003700002002411c6a200041086a290000370000200341106a41086a220642003703002003420037031020024134200341106a1001200341206a41086a200629030037030020032003290310370320200341206a411010092002101d200341306a24000f0b1021000b200d41011020000b4198a9c30020012004104b000b411341011020000b413341011020000b411441011020000b413441011020000bcc0201027f230041306b220224000240024002404113101f2203450d002003410f6a41002800998741360000200341086a410029009287413700002003410029008a8741370000200341134133101e2203450d01200320012900003700132003412b6a200141186a290000370000200341236a200141106a2900003700002003411b6a200141086a290000370000200241206a41086a220142003703002002420037032020034133200241206a1001200241086a200129030037030020022002290320370300024002402002411041f8b3c200410041001002417f460d002002421037021420022002360210200241206a200241106a10920220022802202201450d0420002002290224370204200020013602000c010b20004100360208200042013702000b2003101d200241306a24000f0b411341011020000b413341011020000b41df88c0004133103a000bf602010a7f230041106b220224002002200110d501024002400240024002400240024002402002280200450d0020022802042203417f4c0d062003450d012003101f2204450d07200141046a2105200141086a21064100210741002108200321090340200241003a000f200128020020052802002002410f6a410120062802001002210a20062006280200200a41016a41014b220a6a360200200a450d04200841016a210a20022d000f210b024020082009470d002007200a200a2007491b22094100480d0602402008450d00200420082009101e22040d010c080b2009101f2204450d070b200420086a200b3a0000200741026a2107200a2108200a2003490d000c030b0b20004100360200200241106a24000f0b410121044100210a410021090b2000200936020420002004360200200041086a200a360200200241106a24000f0b2000410036020002402009450d002004101d0b200241106a24000f0b1021000b200941011020000b102e000b200341011020000bcc0403037f017e047f23004180026b220424000240024020012d000d450d0041b489c1002102413121050c010b2001280200200141046a2205280200200141086a220628020010940220054200370200200141f0c0c100360200200420022900002207370310024002400240024041e401101f2208450d00200841003b010620084100360200200841086a200441206a41dc0110ce031a200541003602002001200836020020082f01062209410374210a417f210541002102024002400240024002400340200a2002460d01200441106a200820026a41086a410810d003220b450d03200241086a2102200541016a2105200b41004e0d000c020b0b200921050b20042007370234200420063602302004200536022c2004200136022820042008360224200441003602202004410036021820044201370310200328020021082004200328020422023602002004200441106a106202402004280214220b200428021822056b20024f0d00200520026a220a2005490d05200b4101742203200a200a2003491b220a4100480d05200b450d022004280210200b200a101e220b450d030c060b2004280210210b0c060b418789c1002102412d21050c060b200a101f220b0d030b200a41011020000b41e40141041020000b1021000b2004200a3602142004200b3602100b200441106a41086a220a200520026a360200200b20056a2008200210ce031a200441086a200a28020036020020042004290310370300200441206a200410950220014180023b010c410021020b200020053602042000200236020020044180026a24000be20303027f017e027f02402001450d00034020002802e40121002001417f6a22010d000b0b02402002450d004100210341002101034002400240200120002f01064f0d0020002001410c6c6a220441e4006a2902002105200141016a2101200441e0006a2802002204450d030c010b0240024020002802002201450d0020003301044220862003ad842105410121060c010b2003ad210541002106410021010b2000101d2005a72103024002402005422088a7220720012f01064f0d00200121040c010b03400240024020012802002204450d00200641016a210620013301044220862003ad8421050c010b2003ad2105410021040b2001101d2005a72103200421012005422088a7220720042f01064f0d000b0b200420074102746a41e8016a280200210020042007410c6c6a220141e4006a2902002105200141e0006a2802002104024020064101460d00410120066b2101034020002802e4012100200141016a22010d000b0b410021012004450d020b2002417f6a210202402005a7450d002004101d0b20020d000b0b0240200041f0c0c100460d00200028020021012000101d2001450d00200128020021042001101d2004450d00024020042802002201450d0003402004101d2001210420012802002200210120000d000b0b2004101d0b0bea1105027f017e067f037e0b7f230041e0026b2202240020002802102203200328020041016a36020020002902142104200028020c2103200028020821052000280200210620002802042100200241306a41086a2207200141086a28020036020020022001290200370330024020002f01062201410b4f0d00200020034103746a220841106a200841086a2208200120036b41037410cf031a2008200437000020002003410c6c6a220141ec006a200141e0006a2209200041066a22082f010020036b410c6c10cf031a200141e8006a200728020036020020092002290330370200200820082f010041016a3b01002002200036001720022006360013200241e0026a24000f0b02400240024041e401101f220a450d00200a41003b0106200a4100360200200a41086a200241d0006a41dc0110ce032107200241d0006a41086a2208200041b0016a280200360200200220002902a8013703502000413c6a330000210b2000413e6a310000210c20002d003f21092000350038210d2007200041c0006a200041066a220e2f010041796a220141037410ce032107200a41e0006a200041b4016a2001410c6c10ce03210f200e41063b0100200a20013b0106200241c0006a41086a200828020036020020022002290350370340200d200b200c4210868442208684210b02400240200341064b0d00200041086a20034103746a220741086a2007200041066a22012f010020036b41037410cf031a20072004370000200041e0006a2003410c6c6a2207410c6a200720012f010020036b410c6c10cf031a200741086a200241306a41086a280200360200200720022903303702000c010b200720034103746a41506a2007200341796a22084103746a2207200141ffff037120086b41037410cf031a20072004370000200f2003410c6c6a220341b87f6a200341ac7f6a2207200a41066a22012f010020086b410c6c10cf031a200341b47f6a200241306a41086a280200360200200720022903303702000b200120012f010041016a3b0100200241206a41086a2210200241c0006a41086a2211280200360200200220093a0017200220022903403703202002200b3e02102002200b4230883c00162002200b4220883d0114200241086a22122010280200360200200220022903203703002002290310210402400240024020002802002209450d0020002f0104211303402002200641016a220636021020022009360214200241306a41086a2214201228020036020020022002290300370330201341ffff0371210820092f01062200410a4d0d02419402101f2207450d03200741003b010620074100360200200741086a200241d0006a418c0210ce032103200941386a290000210b200241d0006a41086a220f200941b0016a2802003602002002200941a8016a2902003703502003200941c0006a200941066a22152f0100220141796a220041037410ce032116200741e0006a200941b4016a2000410c6c10ce032117200741e4016a20094180026a2001417a6a220e41027410ce032118201541063b0100200720003b01060240200e450d00410021002018210303402003280200220120003b010420012007360200200341046a2103200e200041016a2200470d000b0b2011200f28020036020020022002290350370340200f20112802003602002002200229034037035002400240201341ffff0371220341064b0d00200941086a2200200841016a220e4103746a200020084103746a220020152f0100220120086b221341037410cf031a20002004370000200941e0006a2008410c6c6a2200410c6a20002013410c6c10cf031a200041086a2014280200360200200020022903303702002015200141016a22003b0100200941e4016a2201200841027422156a41086a2001200e4102746a2213200041ffff03712201200e6b41027410cf031a2013200a360200200320014f0d01200920156a41e8016a2100034020002802002203200841016a22083b010420032009360200200041046a210020012008470d000c020b0b20162008417a6a22034103746a2016200841796a22004103746a220e200741066a22012f010020006b41037410cf031a200e200437000020172008410c6c6a220e41b87f6a200e41ac7f6a221320012f0100221520006b410c6c10cf031a200e41b47f6a2014280200360200201320022903303702002001201541016a220e3b01002018200841027422136a416c6a201820034102746a2201200e41ffff0371220820036b41027410cf031a2001200a360200200320084b0d00200720136a41cc016a2103034020032802002201200041016a22003b010420012007360200200341046a210320082000470d000b0b2010200f280200360200200220022903503703202012201028020036020020022002290320370300024020092802002200450d0020092f0104211320002109200b21042007210a0c010b0b2007210a200b21040b419402101f2200450d03200041003b010620004100360200200041086a200241d0006a418c0210ce0321012000200528020022033602e401200520003602002005200528020441016a360204200341003b010420032000360200200120002f010622034103746a200437000020002003410c6c6a220141e8006a200241086a280200360200200141e0006a2002290300370200200041e4016a200341016a22034102746a200a360200200020033b0106200a20033b0104200a20003602000c040b200941086a2201200841016a22034103746a200120084103746a2201200020086b220741037410cf031a2001200437000020092008410c6c6a220141ec006a200141e0006a220e2007410c6c10cf031a200141e8006a200241306a41086a280200360200200e2002290330370200200941066a200041016a22003b0100200941e4016a220120084102746a41086a200120034102746a2201200041ffff0371220720036b41027410cf031a2001200a360200201341ffff037120074f0d0320092003417f6a22004102746a41e8016a2103034020032802002201200041016a22003b010420012009360200200341046a210320072000470d000c040b0b41940241041020000b41e40141041020000b41940241041020000b200241e0026a24000bae0901097f230041106b2202240020024100360208200242013703002002410436020c2002410c6a200210620240024002400240024002400240024020022802042203200228020822046b41044f0d00200441046a22052004490d0520034101742206200520052006491b22064100480d052003450d01200228020020032006101e2203450d020c030b200441046a2105200228020021030c030b2006101f22030d010b200641011020000b20022006360204200220033602000b200241086a22062005360200200320046a41eede91ab063600002002410e36020c2002410c6a200210620240024002400240024020022802042203200628020022066b410e4f0d002006410e6a22052006490d0520034101742204200520052004491b22074100480d052003450d01200228020020032007101e2204450d020c030b2006410e6a2105200228020021040c030b2007101f22040d010b200741011020000b2002200736020420022004360200200721030b200241086a22072005360200200420066a220641066a41002900848c42370000200641002900fe8b423700000240200320056b41034b0d00200541046a22062005490d0120034101742208200620062008491b22064100480d010240024002402003450d00200420032006101e2204450d010c020b2006101f22040d010b200641011020000b20022006360204200220043602000b2007200541046a360200200420056a410a360000024020022802042203200728020022056b41034b0d00200541046a22062005490d0120034101742207200620062007491b22064100480d010240024002402003450d00200420032006101e2204450d010c020b2006101f22040d010b200641011020000b20022006360204200220043602000b200241086a2203200541046a360200200420056a41393600000240024002400240024020022802042205200328020022046b41044f0d00200441046a22032004490d0520054101742206200320032006491b22034100480d052005450d01200228020020052003101e2205450d020c030b200228020021050c030b2003101f22050d010b200341011020000b20022003360204200220053602000b200241086a2208200441046a360200200520046a41393600002002410836020c2002410c6a2002106220082802002106418c8cc20021072002280204210503400240024002400240200520066b41084f0d00200641086a22042006490d0520054101742203200420042003491b22094100480d052005450d01200228020020052009101e22030d020c060b200641086a2104200228020021030c020b2009101f2203450d040b2002200936020420022003360200200921050b20082004360200200320066a2007290000370000200741086a28020021090240200520046b41034b0d00200441046a22062004490d022005410174220a20062006200a491b22064100480d02024002402005450d00200320052006101e22030d010c060b2006101f2203450d050b2002200636020420022003360200200621050b2008200441046a2206360200200320046a20093600002007410c6a220741ec8cc200470d000b200241106a24002006ad4220862003ad840f0b1021000b200941011020000b200641011020000bff1b05027f017e087f017e027f23004180096b22022400024002402001450d00200220003602180c010b200241f8b3c2003602180b2002200136021c20024198076a200241186a109802024002400240024002400240024020022802a007450d00200241206a20024198076a41880110ce031a200241a8016a200241206a41880110ce031a20022903a801200241bc016a2201200241fc016a220310d201200241086a419090c1004115108f01024020022802084101470d002002290310210420024198076a41086a22004200370300200242003703980741a590c100411720024198076a1001200241a8036a41086a2205200029030037030020022002290398073703a803200241a8036a411041f8b3c200410041001002417f470d0020004200370300200242003703980741a590c100411720024198076a10012005200029030037030020022002290398073703a8032002200437039807200241a8036a411020024198076a410810030b024002400240024020022903a8012204500d0020024198076a2004427f7c10af0120024198076a2001412010d0030d004100210620022802a0022100024002400240200241a8026a280200220141e8016c41e801490d002001410c6c2205101f2207450d0b2001210820010d010c020b41042107410021082001450d010b200141e8016c2105200141037441786a2109200721010340200220003602a80320024198076a200241a8036a109902200141086a20024198076a41086a28020036020020012002290398073702002001410c6a2101200041e8016a2100200541987e6a22050d000b200941037641016a21060b4104210a410021054100210b02402006410c6c2201410c490d002001410c6e220b41037422004100480d0a2000101f220a450d0b0b0240200720016a220c2007460d0041002105200a210120072100034020002802002109200141046a200041086a28020036020020012009360200200141086a2101200541016a21052000410c6a2200200c470d000b0b20024198076a200a2005109a020240200b450d00200a101d0b02402006450d002006410c6c21002007210103400240200141046a280200450d002001280200101d0b2001410c6a2101200041746a22000d000b0b02402008450d002007101d0b0240200320024198076a412010d003450d004189aec200410e100a20034120101220024198076a412010120b200320024198076a412010d0030d05200241a4026a2802002106200241a8016a41f8006a2802002107200241a8026a2802002105200241b0026a200241a8016a41f80010ce031a2007200541e8016c6a210020022903b002210d20072101024002400240024002402005450d00200241a8036a41f8006a210920024198076a41086a210c200721010340200241a8066a200141f00010ce031a200141f0006a2903002104200241b8056a200141f8006a41f00010ce031a20044203510d02200241a8036a200241a8066a41f00010ce031a200241a8036a41f0006a20043703002009200241b8056a41f00010ce031a2002200241a8036a3602900520024198076a20024190056a109902200c28020021050240200228029c07450d00200228029807101d0b20024198076a200241a8036a41e80110ce031a200241003602a00520024190056a20024198076a2005200241a0056a1086012002280290054101460d0502402002280294052205450d00200520024190056a41086a280200100a0b200141e8016a22012000470d000b200021010b20012000470d010c020b200141e8016a22012000460d010b200241a0086a210520024198076a41f8006a2109034020024198076a200141f00010ce031a200141f0006a2903002104200241a8036a200141f8006a41f00010ce031a20044203510d01200241a8066a20024198076a41f00010ce031a200241b8056a200241a8036a41f00010ce031a20024198076a200241a8066a41f00010ce031a20024198076a41f0006a20043703002009200241b8056a41f00010ce031a2005103c200141e8016a22012000470d000b0b02402006450d002007101d0b10da01200d108d0120024198076a10dd012002200241b0026a41106a280200220a3602b00520022802b802210b200220024198076a41106a28020022013602b405200a2001470d0720022802a007210302400240200a450d0041002106034002400240200b200641286c22006a22012d00002205200320006a22002d0000470d0002400240024020054101460d0020054102470d0120012802082209200041086a280200470d03200141186a210c2009450d02200c290300200041186a290300520d032001290320200041206a290300520d03200141146a280200220e200041146a280200470d032001410c6a28020022092000410c6a280200220c460d04417f21070340200741016a2207200e4f0d052009200c412010d0030d04200c41206a2108200941206a210f200941286a2109200c41286a210c200f2903002008290300510d000c040b0b2001410c6a28020022082000410c6a280200470d022008450d03200141046a2802002209200041046a280200220c460d034100210703402009200c412010d0030d03200941206a2109200c41206a210c200741016a22072008490d000c040b0b20002001460d02200141016a200041016a412010d0030d010c020b200c290300200041186a290300520d00200141146a280200220e200041146a280200470d002001410c6a28020022092000410c6a280200220c460d01417f21070340200741016a2207200e4f0d022009200c412010d0030d01200c41206a2108200941206a210f200941286a2109200c41286a210c200f2903002008290300510d000b0b41c38dc2004114100a200241a8036a200110d40120022802a8032209200241a8036a41086a22052802001012024020022802ac03450d002009101d0b200241a8036a200010d40120022802a803220920052802001012024020022802ac03450d002009101d0b20012d000020002d00002205470d030b024002400240024020054101460d0020054102470d0120012802082205200041086a280200470d06200141186a21092005450d022009290300200041186a290300520d062001290320200041206a290300520d06200141146a2802002207200041146a280200470d062001410c6a28020022012000410c6a2802002200460d03417f21050340200541016a220520074f0d0420012000412010d0030d07200041206a2109200141206a210c200141286a2101200041286a2100200c2903002009290300510d000c070b0b2001410c6a28020022092000410c6a280200470d052009450d02200141046a2802002201200041046a2802002200460d0241002105034020012000412010d0030d06200141206a2101200041206a2100200541016a22052009490d000c030b0b20002001460d01200141016a200041016a412010d003450d010c040b2009290300200041186a290300520d03200141146a2802002207200041146a280200470d032001410c6a28020022012000410c6a2802002200460d00417f21050340200541016a220520074f0d0120012000412010d0030d04200041206a2109200141206a210c200141286a2101200041286a2100200c2903002009290300510d000c040b0b200641016a2206200a490d000b0b200241a8036a41186a22014200370300200241a8036a41106a22004200370300200241a8036a41086a22054200370300200242003703a803200241a8036a100d200241a8066a41186a2001290300370300200241a8066a41106a2000290300370300200241a8066a41086a2005290300370300200220022903a8033703a8060240200241e4026a2201200241a8066a412010d003450d004189aec200410e100a200141201012200241a8066a412010120b2001200241a8066a412010d0030d090240200a450d00200a41286c2100200321010340024020012d00002205450d00024020054101470d00200141086a280200450d01200141046a280200101d200141286a2101200041586a22000d020c030b200141106a280200450d002001410c6a280200101d0b200141286a2101200041586a22000d000b0b0240200241a4076a280200450d002003101d0b0240200241b0026a41106a2802002200450d00200241b0026a41086a2802002101200041286c21000340024020012d00002205450d00024020054101470d00200141086a280200450d01200141046a280200101d200141286a2101200041586a22000d020c030b200141106a280200450d002001410c6a280200101d0b200141286a2101200041586a22000d000b0b0240200241bc026a280200450d00200241b8026a280200101d0b20024180096a240042010f0b41e8d7c200102c000b2002280294052202450d0120024103460d0220024104460d0341b8d7c200102c000b41c0d6c200102c000b4188d7c200102c000b41f0d6c200102c000b41a0d7c200102c000b200241bc036a4101360200200241183602ac01200241d0a9c3003602a801200242013702ac03200241d8a9c3003602a8032002200241a8016a3602b803200241a8036a41e0a9c30010cf01000b41d8d6c200102c000b2002200241b0056a3602a0052002200241b4056a36029005200241a8036a41146a4100360200200241a8066a41146a411c360200200241b4066a4120360200200241b8056a41146a4103360200200241f8b3c2003602b803200242013702ac03200241d0d7c2003602a803200241203602ac06200242033702bc05200241e0b0c4003602b8052002200241a8036a3602b806200220024190056a3602b0062002200241a0056a3602a8062002200241a8066a3602c805200241b8056a41d8d7c20010cf01000b4180d8c200102c000b200541041020000b1021000b200041041020000bfb0609047f017e017f017e037f017e047f017e017f230041a0066b22022400200241d8026a20011059200241e8026a280200210320022802e402210420022802e002210520022903d8022106200241b0056a200241ec026a41e40010ce031a024002400240024002400240024002400240024002402005450d00200241106a200241b0056a41e40010ce031a200241086a200110b5012002280208450d08200228020c2207ad42e8017e2208422088a70d032008a72209417f4c0d032009450d012009101f220a450d042007450d020c050b20004100360208200241a0066a24000f0b4108210a20070d030b4100210f4200210c200a450d050c030b102e000b200941081020000b200241d8026a41f8006a210b4200210c4100210d410021094100210e2007210f0340200241d8026a200110b401200241b0056a200241d8026a41f00010ce031a200241d8026a41f0006a2903002108200241c0046a200b41f00010ce031a20084203510d02200e41016a2110200241e8016a200241b0056a41f00010ce031a200241f8006a200241c0046a41f00010ce031a0240200e200f470d00200d20102010200d491b220fad42e8017e2211422088a70d052011a722124100480d050240200e450d00200a20092012101e220a0d010c070b2012101f220a450d060b200a20096a200241e8016a41f00010ce03220e41f0006a2008370300200e41f8006a200241f8006a41f00010ce031a200c4280808080107c210c200d41026a210d200941e8016a21092010210e20102007490d000b200a450d020b200241d8026a200241106a41e40010ce031a200041106a20033602002000200436020c2000200536020820002006370300200041146a200241d8026a41e40010ce031a200041fc006a200c200fad84370200200041f8006a200a360200200241a0066a24000f0b0240200e450d00200a4188016a211003402010103c201041e8016a2110200941987e6a22090d000b0b200f450d00200a101d0b2000410036020802402003450d00200341286c2110200521090340024020092d0000220e450d000240200e4101470d00200941086a280200450d01200941046a280200101d200941286a2109201041586a22100d020c030b200941106a280200450d002009410c6a280200101d0b200941286a2109201041586a22100d000b0b02402004450d002005101d0b200241a0066a24000f0b1021000b201241081020000b8a1203047f027e097f230041206b22022400024002400240024002400240024002400240024002400240024041ea01101f2203450d00200242ea0137020420022003360200200341003b00002002410236020802400240024002400240200128020022032903704202520d0020022802044102470d01200228020041024104101e2201450d062002410436020420022001360200200241086a28020021040c020b20022802044102470d02200228020041024104101e2201450d062002410436020420022001360200200241086a28020021040c030b41022104200228020021010b200120046a41013a0000200241086a2201200128020041016a3602000c070b41022104200228020021010b200120046a4181013a0000200241086a2201200128020041016a360200200341086a200210bc0202400240024020022802042204200128020022016b41c0004f0d00200141c0006a22052001490d0920044101742201200520052001491b22014100480d092004450d01200228020020042001101e2204450d020c060b200228020021040c060b2001101f22040d040b200141011020000b41ea0141011020000b410441011020000b410441011020000b2002200136020420022004360200200241086a28020021010b200241086a2205200141c0006a360200200420016a220141086a200341346a290000370000200141106a2003413c6a290000370000200141186a200341c4006a290000370000200141206a200341cc006a290000370000200141286a200341d4006a290000370000200141306a200341dc006a290000370000200141386a200341e4006a2900003700002001200329002c3700002003200210b10102400240024002400240024002400240024002400240200341f0006a2903004201520d0020032903782206420c882207420120074201561b22074200510d0620034180016a290300200780210720022802042204200241086a28020022016b41024f0d01200141026a22052001490d0c20044101742201200520052001491b22014100480d0c2004450d04200228020020042001101e2204450d050c090b0240200228020420052802002201470d00200141016a22042001490d0c20014101742205200420042005491b22054100480d0c2001450d02200228020020012005101e2204450d030c070b200228020021040c070b200228020021040c080b2005101f22040d040b200541011020000b2001101f22040d040b200141011020000b41a88ec300102c000b2002200536020420022004360200200241086a28020021010b200241086a200141016a360200200420016a41003a00000c020b2002200136020420022004360200200241086a28020021010b200241086a200141026a360200200420016a2007a741047420067aa7417f6a22014101200141014b1b2201410f2001410f491b723b00000b20034188016a200210b201200241086a22032802002101200241003602182002420137031020022001417e6a36021c2002411c6a200241106a1062024002400240024002402003280200220141014d0d002002280218210520022802102108200228021421092003410036020020022802002103024002400240024002400240024002402001417e6a220a450d004102210b2005450d12200320082d00003a00004101210c200241086a2204200428020041016a36020020054101460d12200820056a210d200320082d00013a00012004200428020041016a3602004102210b200841026a21044100210e2005417e6a2203450d052002280204220b20016b20034f0d01200120036a220c2001490d0d200b4101742201200c200c2001491b220c4100480d0d200b450d022002280200200b200c101e22010d030c0a0b0240024002402002280204220120054f0d0020014101742204200520052004491b22044100480d0f2001450d01200320012004101e2203450d020c110b4100210b2005450d120c110b2004101f22030d0f0b200441011020000b200228020021010c020b200c101f2201450d070b2002200c360204200220013602000b200120056a200141026a200a10cf031a02402005200241086a220b280200220c460d002002280200200c6a210120052103034020034102460d03200120042d00003a0000200b200b28020041016a360200200141016a2101200441016a2104200c2003417f6a2203470d000b200d20046b2203450d030b20034100480d082003101f220c450d042005210b2003210e0b200d2004460d060c050b2005210b200a0d0b0c0c0b4101210c2005210b200d2004470d030c040b41b0aec400102c000b200341011020000b200c41011020000b200c20042d00003a00004101210f0240200441016a2203200d460d00200c41016a2101200520046b21040340200120032d00003a0000200141016a2101200d200341016a2203470d000b200820046a220f450d010b200c200f6a210d024002400240024020022802042203200b200a6a22016b200f4f0d002001200f6a22042001490d0520034101742201200420042001491b22014100480d052003450d01200228020020032001101e22030d020c060b200228020021030c020b2001101f2203450d040b20022001360204200220033602000b2003200f200b6a22106a2003200b6a200a10cf031a02402010200241086a22042802002203460d00200228020020036a2101200f200b6a20036b2105200c21030340200d2003460d01200120032d00003a00002004200428020041016a360200200341016a2103200141016a21012005417f6a22050d000b0b2010210b0b0240200e450d00200c101d0b200a450d060c050b1021000b200141011020000b2002200436020420022003360200200241086a280200210b0b2003200b6a220120082d00003a0000024020054101470d00200b41016a210b0c010b2005417f6a2104200841016a2103200141016a21010340200120032d00003a0000200141016a2101200341016a21032004417f6a22040d000b200b20056a210b0b200241086a200b3602004102210b200a450d010b0240200b200241086a22012802002203460d002002280200220420036a2004200b6a200a10cf031a0b20012003200a6a3602000b02402009450d002008101d0b20002002290300370200200041086a200241086a280200360200200241206a24000bcb03010b7f230041206b22032400024002402002450d0020024102742204101f22050d01200441041020000b410421050b0240024002400240200120024103746a22062001460d0020024103742107200141046a210420052108034020082004280200360200200441086a2104200841046a2108200741786a22070d000b200641786a20016b41037641016a21094101210a4100210b4100210403402001280200210c0240024002400240200b20046b200141046a28020022084f0d00200420086a22072004490d07200b410174220d20072007200d491b220d4100480d07200b450d01200a200b200d101e220a0d020c080b200820046a21070c020b200d101f220a450d060b200d210b0b200a20046a200c200810ce031a20072104200141086a22012006470d000c020b0b4101210a410021094100210b0b200341186a22044200370300200341106a22014200370300200341086a2208420037030020034200370300200a2005200920031017200041186a2004290300370000200041106a2001290300370000200041086a2008290300370000200020032903003700000240200b450d00200a101d0b02402002450d002005101d0b200341206a24000f0b1021000b200d41011020000b6501027f230041206b220224002001411c6a280200210320012802182101200241086a41106a200041106a290200370300200241086a41086a200041086a2902003703002002200029020037030820012003200241086a10c1032100200241206a240020000bc80201037f23004180016b22022400200028020021000240024002400240200128020022034110710d002000280200210420034120710d012004ad41012001108b02210020024180016a240020000f0b20002802002104410021000340200220006a41ff006a2004410f712203413072200341d7006a2003410a491b3a00002000417f6a2100200441047622040d000b20004180016a22044181014f0d012001410141d6b6c2004102200220006a4180016a410020006b108c02210020024180016a240020000f0b410021000340200220006a41ff006a2004410f712203413072200341376a2003410a491b3a00002000417f6a2100200441047622040d000b20004180016a22044181014f0d012001410141d6b6c2004102200220006a4180016a410020006b108c02210020024180016a240020000f0b2004418001102a000b2004418001102a000bb50403017f017e017f230041a0026b22022400024002402001450d00200220003602180c010b200241f8b3c2003602180b2002200136021c20024198016a200241186a1059024020022802a001450d00200241206a20024198016a41f80010ce031a2002290320200241346a200241f4006a10d201200241086a419090c1004115108f01024020022802084101470d002002290310210320024198016a41086a22014200370300200242003703980141a590c100411720024198016a100120024190026a41086a2200200129030037030020022002290398013703900220024190026a411041f8b3c200410041001002417f470d0020014200370300200242003703980141a590c100411720024198016a100120002001290300370300200220022903980137039002200220033703980120024190026a411020024198016a410810030b0240200241206a41106a2802002200450d0020022802282101200041286c21000340024020012d00002204450d00024020044101470d00200141086a280200450d01200141046a280200101d200141286a2101200041586a22000d020c030b200141106a280200450d002001410c6a280200101d0b200141286a2101200041586a22000d000b0b02402002412c6a280200450d00200241286a280200101d0b200241a0026a240042010f0b200241346a41013602002002411836029402200241f0a9c3003602900220024201370224200241d8a9c300360220200220024190026a360230200241206a41e0a9c30010cf01000b0600109f02000b0a00418ca4c400102c000bdc0d01087f230041206b220224002002410036021820024201370310024002400240024002400240024002404104101f2203450d0020024104360214200241186a22042004280200220541046a36020020022003360210200320056a41edcad18b06360000024002400240200228021420042802002203470d00200341016a22042003490d0620034101742205200420042005491b22044100480d062003450d01200228021020032004101e2205450d020c040b200228021021050c040b2004101f22050d020b200441011020000b410441011020000b2002200436021420022005360210200241186a28020021030b200241186a2204200341016a360200200520036a41033a00004111200241106a10a10241002103024003402003418c83c4006a2802002003419083c4006a280200200241106a10a202024002400240024002400240024002400240024002400240024002400240024002402003419483c4006a2802004101470d002003419883c4006a2802002003419c83c4006a280200200241106a10a202200341a083c4006a22062802004102460d010c020b20022003419883c4006a28020011040020022802002002280204200241106a10a202200341a083c4006a22062802004102470d010b02400240024002400240200228021420042802002205470d00200541016a22062005490d1620054101742207200620062007491b22074100480d162005450d01200228021020052007101e22060d020c040b200228021021060c020b2007101f2206450d020b2002200736021420022006360210200428020021050b2004200541016a360200200620056a41003a0000200341b083c4006a22062802004102470d020c030b200741011020000b0240024002400240200228021420042802002205470d00200541016a22072005490d1420054101742208200720072008491b22084100480d142005450d01200228021020052008101e22070d020c0d0b200228021021070c020b2008101f2207450d0b0b2002200836021420022007360210200428020021050b2004200541016a360200200720056a41013a00002006200241106a10a302200341b083c4006a22062802004102460d010b0240200228021420042802002205470d00200541016a22072005490d1020054101742208200720072008491b22084100480d102005450d02200228021020052008101e22070d030c0a0b200228021021070c030b0240200228021420042802002205470d00200541016a22062005490d0f20054101742207200620062007491b22074100480d0f2005450d04200228021020052007101e22060d050c0a0b200228021021060c050b2008101f2207450d070b2002200836021420022007360210200428020021050b2004200541016a360200200720056a41013a00002006200241106a10a402200341c083c4006a22062802004102460d030c080b2007101f2206450d050b2002200736021420022006360210200428020021050b2004200541016a360200200620056a41003a0000200341c083c4006a22062802004102470d050b0240024002400240200228021420042802002205470d00200541016a22062005490d0b20054101742207200620062007491b22074100480d0b2005450d01200228021020052007101e22060d020c070b200228021021060c020b2007101f2206450d050b2002200736021420022006360210200428020021050b2004200541016a360200200620056a41003a0000200341c8006a220341c809470d050c060b200841011020000b200841011020000b200741011020000b200741011020000b0240024002400240200228021420042802002205470d00200541016a22072005490d0620054101742208200720072008491b22084100480d062005450d01200228021020052008101e22070d020c070b200228021021070c020b2008101f2207450d050b2002200836021420022007360210200428020021050b2004200541016a360200200720056a41013a00002006200241106a10a502200341c8006a220341c809470d000b0b200241186a2802002103200228021421072002280210210620024100360218200242013703102002200336020c2002410c6a200241106a106202400240024020022802142205200228021822046b20034f0d00200420036a22082004490d0320054101742209200820082009491b22084100480d032005450d01200228021020052008101e2205450d020c050b2002280210220520046a2006200310ce031a200420036a21032007450d060c050b2008101f22050d030b200841011020000b1021000b200841011020000b2002200836021420022005360210200520046a2006200310ce031a200420036a21032007450d010b2006101d0b200241206a24002003ad4220862005ad840b910701037f02400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402000413f4b0d00200141046a280200200141086a2802002202470d01200241016a22032002490d1120024101742204200320032004491b22044100480d112002450d05200128020020022004101e2203450d060c170b2000418080014f0d01200141046a2802002203200141086a28020022026b41024f0d02200241026a22042002490d1020034101742202200420042002491b22024100480d102003450d08200128020020032002101e2203450d090c140b200128020021030c160b20004180808080044f0d01200141046a2802002203200141086a28020022026b41044f0d04200241046a22042002490d0e20034101742202200420042002491b22024100480d0e2003450d08200128020020032002101e22030d090c0f0b200128020021030c120b200141046a280200200141086a2802002202470d03200241016a22032002490d0c20024101742204200320032004491b22044100480d0c2002450d09200128020020022004101e22030d0a0c0e0b2004101f22030d110b200441011020000b200128020021030c050b200128020021030c070b2002101f22030d0b0b200241011020000b2002101f2203450d060b20012003360200200141046a2002360200200141086a28020021020b200141086a200241046a360200200320026a20004102744102723600000f0b2004101f2203450d040b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41033a00000240024002400240200141046a2802002203200428020022026b41044f0d00200241046a22042002490d0420034101742202200420042002491b22024100480d042003450d01200128020020032002101e22030d020c070b200128020021030c020b2002101f2203450d050b20012003360200200141046a2002360200200141086a28020021020b200141086a200241046a360200200320026a20003600000f0b1021000b200241011020000b200441011020000b200241011020000b20012003360200200141046a2002360200200141086a28020021020b200141086a200241026a360200200320026a20004102744101723b00000f0b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a20004102743a00000bc60801037f02400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001413f4b0d00200241046a280200200241086a2802002203470d01200341016a22042003490d1920034101742205200420042005491b22054100480d192003450d05200228020020032005101e2204450d060c160b2001418080014f0d01200241046a2802002204200241086a28020022036b41024f0d02200341026a22052003490d1820044101742203200520052003491b22034100480d182004450d08200228020020042003101e2204450d090c130b200228020021040c150b20014180808080044f0d01200241046a2802002204200241086a28020022036b41044f0d04200341046a22052003490d1620044101742203200520052003491b22034100480d162004450d08200228020020042003101e22040d090c0e0b200228020021040c110b200241046a280200200241086a2802002203470d03200341016a22042003490d1420034101742205200420042005491b22054100480d142003450d09200228020020032005101e22040d0a0c0d0b2005101f22040d100b200541011020000b200228020021040c050b200228020021040c070b2003101f22040d0a0b200341011020000b2003101f2204450d050b20022004360200200241046a2003360200200241086a28020021030b200241086a200341046a360200200420036a20014102744102723600000c0a0b2005101f2204450d030b20022004360200200241046a2005360200200241086a28020021030b200241086a2205200341016a360200200420036a41033a00000240024002400240200241046a2802002204200528020022036b41044f0d00200341046a22052003490d0c20044101742203200520052003491b22034100480d0c2004450d01200228020020042003101e22040d020c060b200228020021040c020b2003101f2204450d040b20022004360200200241046a2003360200200241086a28020021030b200241086a200341046a360200200420036a20013600000c070b200341011020000b200541011020000b200341011020000b20022004360200200241046a2003360200200241086a28020021030b200241086a200341026a360200200420036a20014102744101723b00000c020b20022004360200200241046a2005360200200241086a28020021030b200241086a200341016a360200200420036a20014102743a00000b024002400240200241046a2802002204200241086a28020022036b20014f0d00200320016a22052003490d0320044101742203200520052003491b22034100480d032004450d01200228020020042003101e2204450d020c040b200228020021040c040b2003101f22040d020b200341011020000b1021000b20022004360200200241046a2003360200200241086a28020021030b200241086a200320016a360200200420036a2000200110ce031a0bff0901097f230041206b22022400024002400240024002400240024020002802004101470d00200041046a28020021032000410c6a2802002200200110a1022000450d01200041e4006c2104410021050340200320056a220041046a280200200041086a280200200110a202200141046a22062802002107200141086a220828020021090240024002400240024002400240024002400240200041e0006a2d00004101470d0020072009470d01200941016a22072009490d0d2009410174220a20072007200a491b220a4100480d0d2009450d0320012802002009200a101e22070d040c0e0b20072009470d01200941016a22072009490d0c2009410174220a20072007200a491b220a4100480d0c2009450d0520012802002009200a101e22070d060c0e0b200128020021070c030b200128020021070c050b200a101f2207450d0a0b200120073602002006200a360200200828020021090b2008200941016a360200200720096a41013a00000c030b200a101f2207450d080b200120073602002006200a360200200828020021090b2008200941016a360200200720096a41003a00000b2000410c6a200110ba0302400240200041c0006a2802004101470d00200041c4006a280200200041cc006a280200200110a2020c010b200241106a200041c4006a280200200041c8006a28020028020c11030020022802102209200241106a41086a280200200110a2022002280214450d002009101d0b200041d4006a28020021090240200041d0006a2802004101470d002009200041dc006a280200200110b8032004200541e4006a2205470d010c030b2009200041d8006a280200200110b8032004200541e4006a2205470d000c020b0b200241086a200041046a28020011040020022802082103200228020c2200200110a1022000450d00200041e4006c2104410021050340200320056a220041046a280200200041086a280200200110a202200141046a22062802002107200141086a220828020021090240024002400240024002400240024002400240200041e0006a2d00004101470d0020072009470d01200941016a22072009490d0c2009410174220a20072007200a491b220a4100480d0c2009450d0320012802002009200a101e22070d040c0f0b20072009470d01200941016a22072009490d0b2009410174220a20072007200a491b220a4100480d0b2009450d0520012802002009200a101e22070d060c0f0b200128020021070c030b200128020021070c050b200a101f2207450d0b0b200120073602002006200a360200200828020021090b2008200941016a360200200720096a41013a00000c030b200a101f2207450d090b200120073602002006200a360200200828020021090b2008200941016a360200200720096a41003a00000b2000410c6a200110ba0302400240200041c0006a2802004101470d00200041c4006a280200200041cc006a280200200110a2020c010b200241106a200041c4006a280200200041c8006a28020028020c11030020022802102209200241106a41086a280200200110a2022002280214450d002009101d0b200041d4006a28020021090240200041d0006a2802004101470d002009200041dc006a280200200110b8032004200541e4006a2205470d010c020b2009200041d8006a280200200110b8032004200541e4006a2205470d000b0b200241206a24000f0b1021000b200a41011020000b200a41011020000b200a41011020000b200a41011020000bf40201057f230041106b220224000240024020002802004101470d00200041046a28020021032000410c6a2802002200200110a1022000450d012000412c6c2104410021050340200320056a220041046a280200200041086a280200200110a2022000410c6a200110b903200041206a280200210602402000411c6a2802004101470d002006200041286a280200200110b80320042005412c6a2205470d010c030b2006200041246a280200200110b80320042005412c6a2205470d000c020b0b200241086a200041046a28020011040020022802082103200228020c2200200110a1022000450d002000412c6c2104410021050340200320056a220041046a280200200041086a280200200110a2022000410c6a200110b903200041206a280200210602402000411c6a2802004101470d002006200041286a280200200110b80320042005412c6a2205470d010c020b2006200041246a280200200110b80320042005412c6a2205470d000b0b200241106a24000bda0301057f230041106b220224000240024020002802004101470d00200041046a28020021032000410c6a2802002200200110a1022000450d012000412c6c2104410021050340200320056a220041046a280200200041086a280200200110a202200041106a2802002106024002402000410c6a2802004101470d002006200041186a280200200110b8030c010b2006200041146a280200200110b8030b200041206a280200210602402000411c6a2802004101470d002006200041286a280200200110b80320042005412c6a2205470d010c030b2006200041246a280200200110b80320042005412c6a2205470d000c020b0b200241086a200041046a28020011040020022802082103200228020c2200200110a1022000450d002000412c6c2104410021050340200320056a220041046a280200200041086a280200200110a202200041106a2802002106024002402000410c6a2802004101470d002006200041186a280200200110b8030c010b2006200041146a280200200110b8030b200041206a280200210602402000411c6a2802004101470d002006200041286a280200200110b80320042005412c6a2205470d010c020b2006200041246a280200200110b80320042005412c6a2205470d000b0b200241106a24000be10301017f230041f0056b22022400024002402001450d00200220003602000c010b200241f8b3c2003602000b20022001360204200241f8036a200210b40102400240024002400240024020022903e8044203510d00200241086a200241f8036a41e80110ce031a200241f0016a200241086a41e80110ce031a2002200241f0016a3602f803200241d8036a200241f8036a10990220022802e0032101200241f8036a200241f0016a41e80110ce031a200241e8056a20022802e003360200200220022903d8033703e005200241e8036a200241f8036a2001200241e0056a1086010240024020022802e8034101470d004280828898f01f20022802ec03410374ad88a721004101101f210141010d010c050b20022802ec0341004721004101101f21014100450d040b2001450d01200141013a0000200141014102101e2201450d020c040b20024184026a41013602002002411836020c200241f8a9c300360208200242013702f401200241d8a9c3003602f0012002200241086a36028002200241f0016a41e0a9c30010cf01000b410141011020000b410241011020000b2001450d01200141003a0000200141014102101e22010d00410241011020000b200120003a0001200241f0056a24002001ad428080808020840f0b410141011020000bb91203027f017e0b7f230041c0016b2202240010da01200241086a41086a2203420037030020024200370308418cb9c000410d200241086a100120024180016a41086a20032903003703002002200229030837038001420021040240024002400240024002400240024020024180016a411041f8b3c200410041001002417f460d002002420037030820024180016a4110200241086a41084100100241016a41084d0d01200229030821040b2004108d01200241b0016a41086a22034200370300200242003703b001419db4c0004115200241b0016a1001200241a0016a41086a2003290300370300200220022903b0013703a001200241a0016a411041f8b3c200410041001002417f460d01410021052002410036020841042106410121070240200241a0016a4110200241086a41044100100241016a41044d0d0020022802082208450d032008ad420c7e2204422088a70d042004a722034100480d0402402003101f2206450d00200621094100210a034002400240024002400240024002404114101f2203450d00200341106a41002800b4b640360000200341086a41002900acb640370000200341002900a4b640370000200341144128101e220b450d01200b200a360014200241b0016a41086a22034200370300200242003703b001200b4118200241b0016a1001200241086a41086a2003290300370300200220022903b001370308200241086a411041f8b3c200410041001002417f460d0520024210370284012002200241086a36028001200220024180016a10d50102402002280200450d0020022802042203417f4c0d03024002402003450d0020031079220c450d0620024180016a41086a22052005280200220520034100200228028001200228028401200c20032005100222052005417f461b2205200520034b1b22056a36020020052003470d010c070b4101210c2002280280012002280284014101410020024180016a41086a28020010021a41002003460d060b2003450d00200c101d0b41df88c0004133103a000b411441011020000b412841011020000b102e000b200341011020000b200241086a41101009200c0d010b4101210c410021030b200b101d200941086a2003360200200941046a20033602002009200c3602002009410c6a21092008200a41016a220a470d000b41002107200821050c040b200341041020000b41df88c0004133103a000b41df88c0004133103a000b4100210541012107410421060b410421084100210b4100210d02400240024002402005410c6c2203410c490d002003410c6e220d41037422094100480d042009101f2208450d010b0240200620036a220a2006460d004100210b200821032006210903402009280200210c200341046a200941086a2802003602002003200c360200200341086a2103200b41016a210b2009410c6a2209200a470d000b0b20024180016a2008200b109a020240200d450d002008101d0b02402005450d002005410c6c21092006210303400240200341046a280200450d002003280200101d0b2003410c6a2103200941746a22090d000b0b024020070d002006101d0b200241086a41186a20024180016a41186a290300370300200241086a41106a20024180016a41106a290300370300200241086a41086a20024180016a41086a2903003703002002200229038001370308200241b0016a41086a220b4200370300200242003703b0014199b9c0004115200241b0016a1001200241a0016a41086a200b290300370300200220022903b0013703a001200241a0016a4110200241086a41201003200241086a10dd01200241003602b801200242013703b00102404120101f2203450d00200242a080808080043702b401200220033602b0012003200229021c370000200341086a200241246a290200370000200341106a2002412c6a290200370000200341186a200241346a290200370000200241086a200241b0016a10b10102400240024020022802b4012209200b280200220c6b41204f0d00200c41206a2203200c490d072009410174220b20032003200b491b220a4100480d072009450d0120022802b0012009200a101e220b450d020c050b200c41206a210320022802b001210b0c050b200a101f220b0d030b200a41011020000b412041011020000b200941041020000b2002200a3602b4012002200b3602b001200a21090b200241b0016a41086a220a2003360200200b200c6a220c41086a200241c4006a290200370000200c41106a200241cc006a290200370000200c41186a200241d4006a290200370000200c200229023c3700000240200920036b411f4b0d00200341206a220c2003490d0120094101742208200c200c2008491b220c4100480d010240024002402009450d00200b2009200c101e220b450d010c020b200c101f220b0d010b200c41011020000b2002200c3602b4012002200b3602b0010b200a200341206a360200200b20036a220341186a200241f4006a290200370000200341106a200241ec006a290200370000200341086a200241e4006a2902003700002003200229025c3700002002280210210e2002200241086a41106a280200220f3602800120024180016a200241b0016a10620240200f450d00200f41286c2106200241b0016a41086a2207280200210320022802b401210a200e210b034020024180016a200b10d40120022802800121080240024002400240200a20036b20024180016a41086a280200220c4f0d002003200c6a22092003490d06200a4101742205200920092005491b220d4100480d06200a450d0120022802b001200a200d101e22050d020c070b2003200c6a210920022802b00121050c020b200d101f2205450d050b2002200d3602b401200220053602b001200d210a0b20072009360200200520036a2008200c10ce031a0240200228028401450d002008101d0b200b41286a210b20092103200641586a22060d000b0240200f450d00200f41286c210b200e21030340024020032d0000220c450d000240200c4101470d00200341086a280200450d01200341046a280200101d200341286a2103200b41586a220b0d020c030b200341106a280200450d002003410c6a280200101d0b200341286a2103200b41586a220b0d000b0b200241146a280200450d040c030b200241b8016a280200210920022802b0012105200241146a2802000d020c030b1021000b200d41011020000b200e101d0b200241c0016a24002009ad4220862005ad840b9f0f03017f037e117f23004180026b22022400024002402001450d00200220003602080c010b200241f8b3c2003602080b2002200136020c200241306a200241086a10a9020240024002402002280230450d00200241106a41086a2201200241306a41086a220028020036020020022002290330370310200241206a41086a20012802003602002002200229031037032020024190016a200241206a10aa022002280290014101460d0120024190016a41086a22012903002103200142003703002002420037039001418390c100410d20024190016a100120002001290300370300200220022903900137033042002104024002400240200241306a411041f8b3c200410041001002417f460d002002420037039001200241306a411020024190016a41084100100241016a41084d0d0120022903900121040b20024190016a41086a22014200370300200242003703900141a590c100411720024190016a1001200241306a41086a2001290300370300200220022903900137033002400240200241306a411041f8b3c200410041001002417f460d002002420037039001200241306a411020024190016a41084100100241016a41084d0d03200229039001210541e801210141e801101f2206450d010c060b4203210541e801210141e801101f22060d050b200141081020000b41df88c0004133103a000b41df88c0004133103a000b200241a4016a4101360200200241183602840120024180aac300360280012002420137029401200241d8a9c30036029001200220024180016a3602a00120024190016a41e0a9c30010cf01000b41af92c100412820022802940120024190016a41086a280200108802000b200620024190016a41f00010ce03220742023703702007410036028801200720022903800137037820074180016a20024180016a41086a29030037030020072003200520047c220420042003541b3703900120074198016a200241306a41d00010ce031a2002280220220821092002280224220a210b41002101037e02400240024020010e020001010b200941086a210020092f0106220d4103742101417f210c02400240024003402001450d0141bd8ec0002000410810d003220e450d03200141786a2101200c41016a210c200041086a2100200e417f4a0d000b200b0d010c020b200d210c200b450d010b200b417f6a210b2009200c4102746a41e4016a2802002109410021010c030b4108210f41032110417f21114102211241e401211341d2d6c000211441782115410121160c010b2008200f6a210020082f0106220d20107421014100210c02400240024002400240024003402001450d0120142000200f10d003220e450d02200120156a2101200c20166a210c2000200f6a2100200e20114a0d000b200c20116a210d0b200a450d01200a20116a210a2008200d2012746a20136a2802002108410121010c060b200841e0006a200c410c6c6a2200450d002000280208210120002802002100200242003703900120024190016a20002001410820014108491b10ce031a200141074d0d01200229039001210320024190016a41086a22014200370300200242003703900141978bc000411520024190016a1001200241306a41086a200129030037030020022002290390013703304100210102400240200241306a411041f8b3c200410041001002417f460d0020024210370284012002200241306a3602800120024190016a20024180016a10a701200228029001220f450d0420024198016a2802002101200228029401210c0c010b4108210f4100210c0b4100210002402001417f6a220e20014b0d00200e20014f0d00200f200e4103746a2201450d00200129030020035221000b0240200c450d00200f101d0b024002402000450d00200741e80141d003101e2206450d05200641e8016a20024190016a41f00010ce031a200642023703d802200620033703f8022006410a3602f00220062002290380013703e002200641e8026a20024188016a29030037030020064180036a200241306a41d00010ce031a410221090c010b410121090b20022802202002280224200228022810940220024100360238200242013703302002200936029001200941e8016c211520024190016a200241306a10622002280234210e2002280238210120024190016a41086a21084100210f02400240034020022006200f6a3602800120024190016a20024180016a10990220022802900121110240024002400240200e20016b2008280200220c4f0d002001200c6a22002001490d05200e4101742214200020002014491b22164100480d05200e450d012002280230200e2016101e22140d020c060b2001200c6a2100200228023021140c020b2016101f2214450d040b20022016360234200220143602302016210e0b200241306a41086a2000360200201420016a2011200c10ce031a0240200228029401450d002011101d0b200021012015200f41e8016a220f470d000b200941e8016c210f410021010340200620016a4188016a103c200f200141e8016a2201470d000b2006101d20024180026a24002000ad4220862014ad840f0b1021000b201641011020000b41f48ec000412b41dad6c0004128108802000b41f48ec000412b41f4abc2004129108802000b41df88c0004133103a000b41d00341081020000b410121010c000b0b890a06027f017e097f017e077f017e23004190026b22022400200241086a200110b501024002402002280208450d000240024002400240024002400240024002400240024002400240024002400240200228020c2203ad2204421d88a70d002004420386a72205417f4c0d00024002402005450d002005101f2206450d032003450d010c040b4101210620030d030b410021054100210b2006450d100c030b102e000b200541011020000b200141046a210741002108410021094100210a2003210b034020024200370330200241306a2001280200220c20072802002205410820054108491b220d10ce031a20072005200d6b3602002001200c200d6a360200200541074d0d02200a41016a2105200229033021040240200a200b470d002008200520052008491b220bad420386220e422088a70d09200ea7220d4100480d090240200a450d0020062009200d101e22060d010c0b0b200d101f2206450d0a0b200620096a2004370000200841026a2108200941086a21092005210a20052003490d000b2006450d0d0b2005ad422086200bad84210e200241306a200110ab022002280230220f450d0120022802342110200241306a41086a2802002205200e422088a7470d0220024200370214200241f0c0c100360210200f2005410c6c6a210320054103742205450d03200620056a2111200241106a41086a2112200241c4006a2113200241c0006a2114200f21012006210b0340200122052003460d062005410c6a210120052802002215450d05200529020421042002200b2900002216370320024002402002280210220841f0c0c100460d00200228021421070c010b41e401101f2208450d0a41002107200841003b010620084100360200200841086a200241306a41dc0110ce031a20024100360214200220083602100b200b41086a210b02400340200841086a210a20082f0106220c410374210541002109024003402005450d01200241206a200a410810d003220d450d03200541786a2105200941016a2109200a41086a210a200d417f4a0d000b2009417f6a210c0b02402007450d002007417f6a21072008200c4102746a41e4016a28020021080c010b0b2013201637020020142012360200200241306a410c6a200c360200200241306a41086a200241106a36020020022008360234200241003602302002200437022420022015360220200241306a200241206a109502200b2011470d010c060b20082009410c6c6a220541e4006a220a2802002109200a2004370200200541e0006a220a2802002105200a201536020002402005450d002009450d002005101d0b200b2011470d000c050b0b200b450d0b0c0a0b200ea70d090c0a0b2000410036020002402005450d002005410c6c210a200f210503400240200541046a280200450d002005280200101d0b2005410c6a2105200a41746a220a0d000b0b02402010450d00200f101d0b200ea7450d0a2006101d20024190026a24000f0b200f21010b200ea7450d050c040b20032101200ea70d030c040b1021000b200d41011020000b41e40141041020000b2006101d0b024020012003460d00034020012802002205450d010240200141046a280200450d002005101d0b2001410c6a22012003470d000b0b02402010450d00200f101d0b200241306a41086a2205200241106a41086a28020036020020022002290310370330200041086a20052802003602002000200229033037020020024190026a24000f0b2006101d0b200041003602000b20024190026a24000bae0201077f230041106b2202240020012802042103024002400240024003402001280200220541086a210620052f010622044103742101410021070240024003402001450d0141d7acc2002006410810d0032208450d02200141786a2101200741016a2107200641086a21062008417f4a0d000b2007417f6a21040b2003450d022003417f6a2103200520044102746a41e4016a21010c010b0b200541e0006a2007410c6c6a2206450d00200628020821012006280200210620024200370308200241086a20062001410820014108491b10ce031a200141074d0d01200041086a2002290308370300410021010c030b20004188adc200360204200041086a41283602000c010b200041dfacc200360204200041086a41293602000b410121010b20002001360200200241106a24000bdb0403027f017e0a7f230041106b22022400200241086a200110b5010240024002400240024002400240024002402002280208450d00200228020c2203ad420c7e2204422088a70d082004a72205417f4c0d082005450d012005101f2206450d032003450d020c040b20004100360200200241106a24000f0b4104210620030d020b4100210d4100210a0c020b200541041020000b4100210741002108410021092003210a03402002200110b50102400240024002402002280200450d0020022802042205417f4c0d08024002402005450d0020051079220b450d03200b2001280200200141046a220c280200220d2005200d2005491b220d10ce031a200c280200220e200d490d04200c200e200d6b36020020012001280200200d6a360200200d2005470d010c050b4101210b41002005460d040b2005450d00200b101d0b2000410036020002402009450d002006210503400240200541046a280200450d002005280200101d0b2005410c6a2105200841746a22080d000b0b0240200a450d002006101d0b200241106a24000f0b200541011020000b200d200e102a000b200941016a210d02402009200a470d002007200d200d2007491b220aad420c7e2204422088a70d032004a7220c4100480d0302402009450d0020062008200c101e22060d010c050b200c101f2206450d040b200620086a2209200b360200200941046a2005ad2204422086200484370200200741026a21072008410c6a2108200d2109200d2003490d000b0b2000200a36020420002006360200200041086a200d360200200241106a24000f0b1021000b200c41041020000b102e000be8391b0c7f017e067f017e0b7f017e027f027e017f017e027f037e027f017e017f027e067f017e017f017e027f037e1a7f027e0d7f027e057f230041d0026b22022400024002402001450d00200220003602100c010b200241f8b3c2003602100b20022001360214200241f0006a200241106a1098020240024002400240024020022802782203450d00200241f0016a2802002104200241ec016a280200210520024180016a2802002106200241fc006a280200210720022802e8012108200241186a200241106a10a9022002280218450d01200241306a41086a2201200241186a41086a220928020036020020022002290318370330200241c0006a41086a200128020036020020022002290330370340200241013b015c20024200370254200241f0c0c100360250200241d0006a41086a210a2004450d0241e801210b2008200441e8016c6a210c41f000210d4202210e4117210f41a590c10021104100211141f8b3c200211241102113417f2114427f2115410321164102211741e401211841ecabc2002119410c211a41e000211b4107211c418801211d419001211e410d211f200241d0006a410d6a212042f4d2b59bc7ae98b830212141dc01212220024184016a21234201212442818080801021254109212642898080809001212741782128418390c1002129423c212a428080808070212b4225212c2008212d4100212e0c030b2002412c6a41013602002002411836025420024188aac3003602502002420137021c200241d8a9c3003602182002200241d0006a360228200241186a41e0a9c30010cf01000b20024184016a41013602002002411836025420024188aac30036025020024201370274200241d8a9c3003602702002200241d0006a36028001200241f0006a41e0a9c30010cf01000b410021010c010b410221010b037e024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020010e03000102020b200241f0006a41086a200a290300370300200220022903503703700c200b412f411e204e204f410c6c6a41a07f4622501b214341c58ec00041b9acc20020501b21500c010b02400240202e0e06000103040506060b202d200d6a290300200e520d11202d2802880122010d4a202d29039001212f200241f0006a41086a22304200370300200242003703702010200f200241f0006a1001200920302903003703002002200229037037031802400240200241186a201320122011201110022014460d0020024200370370200241186a2013200241f0006a41082011100241016a41084d0d08200229037021310c010b420321310b2015203120317c223220322031541b2231500d09200241c0006a2133200228024421340c1c0b2044280200224e20466a2100204e2f0106223820477421014100214f024003402001450d01204b2000204610d0032237450d132001204c6a2101204f204d6a214f200020466a2100203720484a0d000b204f20486a21380b02402045450d00204520486a2145204e20382049746a204a6a21444101212e0c130b412f214341c58ec00021500b2002204336026420022050360260200242efcc99e3a6ae99b830370318200241086a200241d0006a200241186a200241e0006a109302200228020822430d08200241f0006a41086a200241d0006a41086a290300370300200220022903503703700c1d0b2052205a205820596a220120012058491b6a22012052490d4320522059742200200120012000491b2253ad205b862231205c88a70d432031a72201205d480d4302402052450d0020542052205e742001101e22540d0b0c050b2001101f2254450d044103212e0c130b20542052205e746a2057360200205220596a21522058450d1c0240205620432f01064f0d0020432056205f746a20606a2157205620596a21562058205a6a215820532052460d080c090b41012101024020432f01042200204328020022432f0106490d00410121010340200120596a210120432f01042200204328020022432f01064f0d000b0b20432000205f746a20606a215720432000205e746a20616a28020021434100215620012059460d1a205920016b2101034020432802e4012143200120596a22010d000c1b0b0b20622069206720686a220120012067491b6a22012062490d4120622068742200200120012000491b2263ad206a862231206b88a70d412031a72201206c480d4102402062450d0020642062206d742001101e22640d0c0c040b2001101f2264450d034105212e0c150b20642062206d746a2066360200206220686a216202402067450d000240206520502f01064f0d0020502065206e6c6a206f6a2166206520686a2165206720696a216720632062460d0a0c0b0b41012101024020502f01042200205028020022502f0106490d00410121010340200120686a210120502f01042200205028020022502f01064f0d000b0b20502000206e6c6a206f6a216620502000206d746a20706a28020021504100216520012068460d18206820016b2101034020502802e4012150200120686a22010d000c190b0b206421372052413f4b0d2c0c1d0b41df88c0004133103a000b200141041020000b200141041020000b4190d1c200102c000b41e588c10041222043200228020c108802000b4102212e0c080b4103212e0c080b4103212e0c090b4104212e0c090b4105212e0c090b4105212e0c0a0b410021010c410b410121010c400b410221010c3f0b410221010c3e0b410221010c3d0b410221010c3c0b410221010c3b0b410221010c3a0b410221010c390b410221010c380b410221010c370b41002101034002400240024002400240024002400240024002400240024002400240024002400240024002400240024020010e020001010b2033280200223641086a210020362f010622352016742101410021370240024003402001450d0120192000410810d0032238450d02200120286a2101203741016a2137200041086a2100203820144a0d000b203720146a21350b2034450d03203420146a2134203620352017746a20186a2133410021010c150b2036201b6a2037201a6c6a2200450d02200028020821012000280200210020024200370370200241f0006a20002001410820014108491b10ce031a2001201c4d0d03202f20318020022903702239520d05202d201d6a223a28020022010d42202d201e6a2903002132200241f0006a200241c0006a10aa020240024020022802704101470d002030350200213b2002280274213c4101213d20202d0000450d010c100b2030290300213e4200213b20304200370300200242003703702029201f200241f0006a100120092030290300370300200220022903703703180240200241186a201320122011201110022014460d0020024200370370200241186a2013200241f0006a41082011100241016a41084d0d0e2002290370213b0b20304200370300200242003703702010200f200241f0006a10012009203029030037030020022002290370370318024002400240200241186a201320122011201110022014460d0020024200370370200241186a2013200241f0006a41082011100241016a41084d0d112002290370213f2032203e202a7c580d020c010b4203213f2032203e202a7c580d010b2040202b83202c84213b4101213d418a92c100213c20202d0000450d010c100b4100213d2032203f203b7c223b5a0d0220202d00000d0f0b02400240203d450d0020022802502002280254200a28020010940220024200370254200241f0c0c100360250200220213703180c010b2002280250214120022021370318204141f0c0c100460d00200228025421420c140b2018101f2241450d0941002142204141003b010620414100360200204141086a200241f0006a202210ce031a20024100360254200220413602500c120b204141086a210020412f01062236201674210141002137024003402001450d01200241186a2000410810d0032238450d09200120286a2101203741016a2137200041086a2100203820144a0d000b203720146a21360b02402042450d00204220146a2142204120362017746a20186a2802002141410121010c140b20232021370200200241f0006a20136a200a360200200241f0006a201a6a20363602002030200241d0006a360200200220413602742002201136027020092011360200200220243703184101101f2101024002400240024002400240203d450d002001450d0f200141013a00002002202537021c200220013602182002203ba72201360260200241e0006a200241186a1062200228021c2237200928020022006b20014f0d01200020016a22382000490d4320374101742236203820382036491b22382011480d432037450d02200228021820372038101e22370d030c100b2001450d13200120113a00002002202537021c20022001360218200141012026101e2201450d142001203b3700012002202737021c200220013602180c040b200228021821370c020b2038101f2237450d0d0b2002203836021c200220373602180b2009200020016a360200203720006a203c200110ce031a0b200241e0006a41086a200928020036020020022002290318370360200241f0006a200241e0006a1095022020203d3a0000200241d0006a201a6a20113a0000203b2140203d0d060b203a2802004101460d410c420b203942808080807083421c842131419dacc20021430c010b203942808080807083422984213141f4abc20021430b2031a721500c010b41312150418c8ec00021430b2002205036026420022043360260200242e1eac98bb68edbb7f4003703182002200241d0006a200241186a200241e0006a109302200228020022430d0a200241f0006a41086a200241d0006a41086a290300370300200220022903503703700c100b200241f0006a41086a200241d0006a41086a290300370300200220022903503703700c0f0b41e588c1004122418789c100412d108802000b41e40141041020000b410141011020000b203841011020000b41df88c0004133103a000b41df88c0004133103a000b41e588c100412241b489c1004131108802000b410141011020000b410941011020000b41e588c100412220432002280204108802000b410121010c010b410121010c000b0b206720696a216702400240024020632062470d004104212e0c010b4105212e0c010b410221010c360b410221010c350b2058205a6a215802400240024020532052470d004102212e0c010b4103212e0c010b410221010c350b410221010c340b20022802402002280244200228024810940202402006450d00200641286c2150200321430340024020432d00002201450d00024020014101470d00204341086a280200450d01204341046a280200101d204341286a2143205041586a22500d020c030b204341106a280200450d002043410c6a280200101d0b204341286a2143205041586a22500d000b0b02402007450d002003101d0b02402004450d00200441e8016c215020084188016a214303402043103c204341e8016a2143205041987e6a22500d000b0b02402005450d002008101d0b4101101f2243450d05204320022d007c3a0000204341014102101e2251450d06205120022d007d3a0001200228027022502143024020022802742200450d002050214320002101034020432802e40121432001417f6a22010d000b2000210103402001417f6a22010d000b0b02400240024020022802782252450d002052417f6a213720432f0106450d01204341086a2138410121000c020b4100215341042154410421554100215220000d030c040b0240024020432f01042200204328020022432f01064f0d00410121010c010b410121010340200141016a210120432f01042200204328020022432f01064f0d000b0b204320004103746a41086a2138204320004102746a41e8016a28020021434100210020014101460d00410120016b2101034020432802e4012143200141016a22010d000b0b417f203741016a220120012037491b2253ad2231421e88a70d042031420286a72201417f4c0d04024002400240024002402001450d002001101f2254450d0d205420383602002037450d020c010b41042154410420383602002037450d010b200020432f01064f0d01200041016a2156204320004103746a41086a21570c020b410121520c020b0240024020432f01042200204328020022432f01064f0d00410121010c010b410121010340200141016a210120432f01042200204328020022432f01064f0d000b0b204320004103746a41086a2157204320004102746a41e8016a28020021434100215620014101460d00410120016b2101034020432802e4012143200141016a22010d000b0b2052417e6a215841012159417f215a4202215b4220215c4100215d4102215e4103215f4108216041e80121614101215220534101470d0b0c0a0b205421552002280270215020022802742200450d010b20002101034020502802e40121502001417f6a22010d000b03402000417f6a22000d000b0b024002400240200241f8006a2802002238450d002038417f6a213720502f0106450d01205041e0006a2162410121000c020b410021634104216441042137410021622052413f4d0d020c110b0240024020502f01042200205028020022502f01064f0d00410121010c010b410121010340200141016a210120502f01042200205028020022502f01064f0d000b0b20502000410c6c6a41e0006a2162205020004102746a41e8016a28020021504100210020014101460d00410120016b2101034020502802e4012150200141016a22010d000b0b417f203741016a220120012037491b2263ad2231421e88a70d012031420286a72201417f4c0d01024002400240024002402001450d002001101f2264450d0b206420623602002037450d020c010b41042164410420623602002037450d010b200020502f01064f0d01200041016a216520502000410c6c6a41e0006a21660c020b41012162206421372052413f4b0d110c020b0240024020502f01042200205028020022502f01064f0d00410121010c010b410121010340200141016a210120502f01042200205028020022502f01064f0d000b0b20502000410c6c6a41e0006a2166205020004102746a41e8016a28020021504100216520014101460d00410120016b2101034020502802e4012150200141016a22010d000b0b2038417e6a216741012168417f21694202216a4220216b4100216c4102216d410c216e41e000216f41e80121704101216220634101470d0a0c090b410121284101101f224f450d03204f20524102743a000020524102742250450d140c0f0b102e000b410141011020000b410241011020000b410141011020000b200141041020000b200141041020000b4102212e0c030b4103212e0c030b4104212e0c030b4105212e0c030b410221010c240b410221010c230b410221010c220b410221010c210b02402052418080014f0d00410221284102101f224f450d02204f20524102744101723b0000205241027422500d010c060b024020524180808080044f0d00410421284104101f224f450d03204f2052410274410272360000205241027422500d010c060b4101101f2243450d03204341033a000041052128204341014105101e224f450d04204f205236000120524102742250450d050b410020286b21432028211402400340205528020021010240202820436a41074b0d00201441086a22002014490d1520284101742252200020002052491b22004100480d15024002402028450d00204f20282000101e224f0d010c040b2000101f224f450d030b200021280b205541046a2155204f20146a2001290000370000204341786a2143201441086a21142050417c6a22500d000b2062413f4b0d070c060b200041011020000b410241011020000b410441011020000b410141011020000b410541011020000b202821142062413f4b0d010b410121504101101f2255450d08205520624102743a00004101210120620d010c020b02402062418080014f0d00410221504102101f2255450d07205520624102744101723b00000c010b024020624180808080044f0d00410421504104101f2255450d06205520624102744102723600000c010b4101101f2243450d04204341033a000041052150204341014105101e2255450d03205520623600010b20624102742152205021010340203728020022432802002138024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020432802082243413f4b0d0020502001470d01205041016a22012050490d2120504101742200200120012000491b22004100480d212050450d05205520502000101e22550d060c0f0b2043418080014f0d01205020016b41014b0d02200141026a22002001490d2020504101742262200020002062491b22004100480d202050450d0b205520502000101e22550d0c0c0f0b205021000c050b20434180808080044f0d01205020016b41034b0d05200141046a22002001490d1e20504101742262200020002062491b22004100480d1e024020500d002000101f2255450d100c070b205520502000101e22550d060c0f0b205021000c090b20502001470d05205041016a22012050490d1c20504101742200200120012000491b22004100480d1c0240024020500d002000101f2255450d100c010b205520502000101e2255450d0f0b205021010c060b2000101f2255450d090b205021010b205520016a20434102743a00002000200141016a22016b20434f0d060c0c0b205021000b205520016a20434102744102723600002000200141046a22016b2043490d0a0c040b205021000b205520016a41033a000002402000200141016a22506b41034b0d00205041046a22622050490d1620004101742204206220622004491b22624100480d16024002402000450d00205520002062101e22550d010c080b2062101f2255450d070b206221000b205520506a20433600002000200141056a22016b2043490d080c020b2000101f2255450d030b205520016a20434102744101723b00002000200141026a22016b2043490d060b200021500c060b200041011020000b200041011020000b206241011020000b200041011020000b200041011020000b200120436a22502001490d0c20004101742262205020502062491b22504100480d0c02402000450d00205520002050101e22550d010c040b2050101f2255450d030b203741046a2137205520016a2038204310ce031a200120436a21012052417c6a22520d000b0b024002400240202820146b20014f0d00201420016a22432014490d0c20284101742200204320432000491b22004100480d0c2028450d01204f20282000101e224f450d020c090b201420016a2143204f20146a2055200110ce031a2050450d0a0c090b2000101f224f0d070b200041011020000b205041011020000b410541011020000b410141011020000b410441011020000b410241011020000b410141011020000b20002128204f20146a2055200110ce031a2050450d010b2055101d0b02402063450d002064101d0b02402053450d002054101d0b02402043450d00204341026a22502043490d0120504104205041044b1b22014100480d01205141022001101e2251450d02205141026a204f204310ce031a2028450d040c030b204341026a2150205141026a204f204310ce031a20280d020c030b1021000b200141011020000b204f101d0b20022802702002280274200241f8006a280200109402200241d0026a24002050ad4220862051ad840f0b20014101470d010b202d280290012017460d010b202d200b6a222d200c470d010c030b200241c0006a2144200228024421454108214641032147417f21484102214941e401214a41bd8ec000214b4178214c4101214d0c010b4100212e0c020b4101212e0c020b410021010c020b410221010c010b410221010c000b0b960301037f230041d0006b22022400200241306a41086a220342003703002002420037033041fbb8c0004111200241306a1001200241206a41086a2003290300370300200220022903303703200240024002400240200241206a411041f8b3c200410041001002417f460d00200241c8006a4200370300200241306a41106a42003703002003420037030020024200370330200241206a4110200241306a4120410010022203417f460d022003411f4d0d02200241186a200241306a41186a290300370300200241106a200241306a41106a290300370300200241086a200241306a41086a29030037030020022002290330370300412021044120101f2203450d010c030b200241186a4200370300200241106a4200370300200241086a420037030020024200370300412021044120101f22030d020b200441011020000b41df88c0004133103a000b20032002290300370000200341186a200241186a290300370000200341106a200241106a290300370000200341086a200241086a290300370000200241d0006a24002003ad42808080808004840bfa1405037f017e017f017e087f230041f0076b22022400024002402001450d00200220003602080c010b200241f8b3c2003602080b2002200136020c20024188066a200241086a10b40102400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020022903f8064203510d00200241106a20024188066a41e80110ce031a200241f8016a200241106a41e80110ce031a2002200241f8016a3602f00420024188066a200241f0046a10990220022802900621030240200228028c06450d00200228028806101d0b20024188066a200241f8016a41e80110ce031a200241f0046a20024188066a10870102400240024002400240024020022802f0044101470d0020022802f404210120022802f8042200411a460d0120004115470d024102210441f6012100200141d7c0c100460d0d200141d7c0c100411510d0030d020c0d0b200241e0036a200241f0046a41086a41900110ce031a02400240200241e0036a41086a410020022903e0034201511b2201450d002001450d004100210441032100200120031089010d012001108801210541012100200141206a410020011b220629030022072005540d014102210041022104200720054280027c560d01200520075a0d0541002108410021094100210a4100210b4104210c03404120101f2200450d0920002001290000370000200041186a200141186a290000370000200041106a200141106a290000370000200041086a200141086a2900003700002000412041c000101e2200450d0a200020053700200240200a200b470d00200a41016a220d200a490d232008200d200d2008491b220bad420c7e2207422088a70d232007a7220d4100480d230240200a450d00200c2009200d101e220c0d010c0d0b200d101f220c450d0c0b200c20096a220d2000360200200d41046a42c08080808005370200200841026a21082009410c6a2109200a41016a210a200542017c220520062903002207540d000c070b0b4176416c20011b2100410021040b20024190046a108c010c0c0b41002100200141d998c000460d0141002104200141d998c000411a10d003450d0b0b4100210441810121000c0a0b410021040c090b4104210c4100210a4100210b0b410c101f220f450d044120101f2200450d0520002001290000370000200041186a200141186a290000370000200041106a200141106a290000370000200041086a200141086a2900003700002000412041c000101e2201450d062003ad210520012007370020200f42c08080808005370204200f200136020020024190046a108c012002410036029006200242013703880641012104410121014101101f22000d080c130b2002418c026a41013602002002411836021420024190aac300360210200242013702fc01200241d8a9c3003602f8012002200241106a36028802200241f8016a41e0a9c30010cf01000b412041011020000b41c00041011020000b200d41041020000b410c41041020000b412041011020000b41c00041011020000b20024100360290062002420137038806024020044101460d0020044102470d024101101f2201450d0d2002410136028c0620024190066a22032003280200220941016a3602002002200136028806200120096a41023a0000200228028c0620032802002201470d04200141016a22032001490d1320014101742209200320032009491b22094100480d132001450d0820022802880620012009101e2203450d090c160b410121014101101f2200450d0b0b20024188066a41086a22032003280200220920016a3602002002200136028c062002200036028806200020096a20013a0000200228028c062200200328020022016b41084f0d01200141086a22032001490d1120004101742201200320032001491b22014100480d112000450d0420022802880620002001101e2200450d050c0f0b4101101f2201450d0b2002410136028c0620024190066a22032003280200220941016a3602002002200136028806200120096a41003a0000200228028c0620032802002201470d02200141016a22032001490d1020014101742209200320032009491b22094100480d102001450d0720022802880620012009101e2203450d080c0c0b20022802880621000c0e0b20022802880621030c120b20022802880621030c0a0b2001101f22000d0a0b200141011020000b2009101f22030d0d0b200941011020000b2009101f22030d040b200941011020000b200120011020000b410141011020000b410141011020000b2002200936028c06200220033602880620024190066a28020021010b20024190066a200141016a360200200320016a20003a00000c070b2002200136028c06200220003602880620024190066a28020021010b20024188066a41086a2209200141086a360200200020016a20053700002002200a3602f801200241f8016a20024188066a10620240024002400240200a450d00200c200a410c6c6a210e200c210303402003280200210d2002200341086a28020022013602f801200241f8016a20024188066a10620240024002400240200228028c062208200928020022006b20014f0d00200020016a22062000490d0920084101742200200620062000491b22004100480d092008450d0120022802880620082000101e22080d020c060b20022802880621080c020b2000101f2208450d040b2002200036028c062002200836028806200928020021000b2009200020016a360200200820006a200d200110ce031a2003410c6a2203200e470d000b0b200241013602f801200241f8016a20024188066a1062200f28020021082002200f28020822013602f801200241f8016a20024188066a1062024002400240200228028c062203200928020022006b20014f0d00200020016a22092000490d0620034101742200200920092000491b22004100480d062003450d0120022802880620032000101e2203450d020c040b20022802880621030c040b2000101f22030d020b200041011020000b200041011020000b2002200036028c06200220033602880620024190066a28020021000b20024188066a41086a2209200020016a360200200320006a2008200110ce031a024002400240200228028c062200200928020022016b41084f0d00200141086a22032001490d0320004101742201200320032001491b22014100480d032000450d0120022802880620002001101e2200450d020c040b20022802880621000c040b2001101f22000d020b200141011020000b1021000b2002200136028c06200220003602880620024190066a28020021010b20024188066a41086a2203200141086a360200200020016a427f37000020032802002103200228028806210920044101470d030240200a450d00200a410c6c2100200c210103400240200141046a280200450d002001280200101d0b2001410c6a2101200041746a22000d000b0b0240200b450d00200c101d0b0240200f41046a280200450d00200f280200101d0b200f101d0c030b2002200936028c06200220033602880620024190066a28020021010b20024190066a200141016a360200200320016a20003a00000b20024190066a280200210320022802880621090b200241f0076a24002003ad4220862009ad840b6201017f230041206b220224000240200141074d0d00200241206a240042010f0b200241146a41013602002002411836021c20024198aac30036021820024201370204200241d8a9c3003602002002200241186a360210200241e0a9c30010cf01000b8a0c07027f017e057f017e027f037e037f230041306b22022400024002402001450d00200220003602080c010b200241f8b3c2003602080b2002200136020c200241106a200241086a105b0240024002400240024002400240024020022802102203450d00200320022902142204422088a7220541286c6a21062004a72107200322012100024002400240024002400240034002400240024002400240200620006b419f014d0d00024020012d00004102470d00200141286a2100200141086a22082802004101460d050c070b200141286a2d00004102460d02200141d0006a2d00004102460d03200141f8006a2109200141a0016a2200210120092d00004102470d050c010b034020062001460d0720012d00002109200141286a2200210120094102470d000b0b200041606a22082802004101460d020c040b200141d0006a2100200141306a22082802004101460d010c030b200141f8006a2100200141d8006a22082802004101470d020b200021010c000b0b200828020421012008290310210a4108210b410021094100210c0240200828020c220641286c22004128490d0020004100480d032006ad42287e422088a74100470d032000101f220b450d092006210c0b2001200120006a460d01200641286c210641002109200b21000340200141086a2903002104200141106a290300210d200141186a290300210e2001290300210f200041206a200141206a290300370300200041186a200e370300200041106a200d370300200041086a20043703002000200f370300200041286a2100200941016a2109200141286a2101200641586a22060d000c020b0b4100210b0b20024100360218200242013703104101101f21060240024002400240200b450d002006450d08200242818080801037021420022006360210200641013a000020022009360228200241286a200241106a1062200241106a41086a221028020021002002280214210602402009450d00200b200941286c6a2111200b210103400240024002400240200620006b41204f0d00200041206a22092000490d0a20064101742208200920092008491b22124100480d0a2006450d01200228021020062012101e22080d020c0b0b200041206a2109200228021021080c020b2012101f2208450d090b2002201236021420022008360210201221060b20102009360200200820006a220041186a200141186a290000370000200041106a200141106a290000370000200041086a200141086a29000037000020002001290000370000200141206a29030021040240024002400240200620096b41084f0d00200941086a22002009490d0a20064101742212200020002012491b22124100480d0a2006450d01200820062012101e22080d020c0c0b200941086a21000c020b2012101f2208450d0a0b2002201236021420022008360210201221060b20102000360200200820096a20043700002011200141286a2201470d000b0b200620006b41084f0d01200041086a22012000490d0420064101742209200120012009491b22014100480d042006450d02200228021020062001101e2206450d030c0b0b2006450d08200242818080801037021420022006360210200641003a0000428080808010210420050d0c0c0d0b200228021021060c0a0b2001101f22060d080b200141011020000b1021000b201241011020000b201241011020000b200241246a41013602002002411836022c200241a0aac30036022820024201370214200241d8a9c3003602102002200241286a360220200241106a41e0a9c30010cf01000b410141011020000b410141011020000b200041081020000b20022001360214200220063602100b200241106a41086a200041086a2201360200200620006a200a3700002001ad42208621040240200b450d00200c450d00200b101d0b2005450d010b200541286c2100200321010340024020012d00002209450d00024020094101470d00200141086a280200450d01200141046a280200101d200141286a2101200041586a22000d020c030b200141106a280200450d002001410c6a280200101d0b200141286a2101200041586a22000d000b0b02402007450d002003101d0b200241306a240020042006ad840b9f0c07027f017e047f027e027f037e047f230041306b22022400024002402001450d00200220003602080c010b200241f8b3c2003602080b2002200136020c200241106a200241086a105b02400240024002400240024002400240024020022802102203450d00200320022902142204422088a7220541286c6a21062004a72107200322012100024002400240024002400240034002400240024002400240200620006b419f014d0d00024020012d00004102470d00200141286a2100200141086a22082802004101470d050c070b200141286a2d00004102460d02200141d0006a2d00004102460d03200141f8006a2108200141a0016a2200210120082d00004102470d050c010b034020062001460d0720012d00002108200141286a2200210120084102470d000b0b200041606a22082802004101470d020c040b200141d0006a2100200141306a22082802004101470d010c030b200141f8006a2100200141d8006a22082802004101460d020b200021010c000b0b20082802042101200829031821092008290310210a4108210b410021064100210c0240200828020c220841286c22004128490d0020004100480d032008ad42287e422088a74100470d032000101f220b450d0a2008210c0b2001200120006a460d01200841286c210841002106200b21000340200141086a2903002104200141106a290300210d200141186a290300210e2001290300210f200041206a200141206a290300370300200041186a200e370300200041106a200d370300200041086a20043703002000200f370300200041286a2100200641016a2106200141286a2101200841586a22080d000c020b0b4100210b0b20024100360218200242013703104101101f21100240024002400240200b450d002010450d08200242818080801037021420022010360210201041013a0000201041014109101e2201450d09200242898080809001370214200220013602102001200a37000120022006360228200241286a200241106a1062200241106a41086a221028020021112002280214210802402006450d00200b200641286c6a2112200b210103400240024002400240200820116b41204f0d00201141206a22002011490d0a20084101742206200020002006491b22134100480d0a2008450d01200228021020082013101e22060d020c0b0b201141206a2100200228021021060c020b2013101f2206450d090b2002201336021420022006360210201321080b20102000360200200620116a221141186a200141186a290000370000201141106a200141106a290000370000201141086a200141086a29000037000020112001290000370000200141206a29030021040240200820006b41074b0d00200041086a22112000490d0720084101742213201120112013491b22114100480d07024002402008450d00200620082011101e22060d010c0b0b2011101f2206450d0a0b2002201136021420022006360210201121080b2010200041086a2211360200200620006a20043700002012200141286a2201470d000b0b200820116b41084f0d01201141086a22012011490d0420084101742200200120012000491b22014100480d042008450d02200228021020082001101e2210450d030c0c0b2010450d09410121062002410136021420022010360210201041003a000020050d0d0c0e0b200228021021100c0b0b2001101f22100d090b200141011020000b1021000b201341011020000b201141011020000b200241246a41013602002002411836022c200241a8aac30036022820024201370214200241d8a9c3003602102002200241286a360220200241106a41e0a9c30010cf01000b410141011020000b410941011020000b410141011020000b200041081020000b20022001360214200220103602100b201020116a2009370000201141086a21060240200c450d00200b101d0b2005450d010b200541286c2100200321010340024020012d00002208450d00024020084101470d00200141086a280200450d01200141046a280200101d200141286a2101200041586a22000d020c030b200141106a280200450d002001410c6a280200101d0b200141286a2101200041586a22000d000b0b02402007450d002003101d0b200241306a24002006ad4220862010ad840ba305020a7f017e230041206b220224002002410e360204200241988ec100360200200241106a41a68ec1002002108101410021030240024002400240200228021022042002280218220541f8b3c200410041001002417f460d002002410036020020042005200241044100100241016a41044d0d01200228020021030b02402002280214450d002004101d0b2002200310b30220024100360218200242013703102002280200210620022002280208220336020c2002410c6a200241106a106202400240024002402003450d002006200341286c6a2107200241106a41086a22082802002104200228021421092006210303400240024002400240200920046b41204f0d00200441206a22052004490d062009410174220a20052005200a491b220b4100480d062009450d0120022802102009200b101e220a0d020c070b200441206a21052002280210210a0c020b200b101f220a450d050b2002200b3602142002200a360210200b21090b20082005360200200a20046a220441186a200341186a290000370000200441106a200341106a290000370000200441086a200341086a29000037000020042003290000370000200341206a290300210c0240024002400240200920056b41084f0d00200541086a22042005490d062009410174220b20042004200b491b220b4100480d062009450d01200a2009200b101e220a0d020c080b200541086a21040c020b200b101f220a450d060b2002200b3602142002200a360210200b21090b20082004360200200a20056a200c3700002007200341286a2203470d000b2002280204450d060c050b200241186a28020021042002280210210a20022802040d040c050b1021000b200b41011020000b200b41011020000b41df88c0004133103a000b2006101d0b200241206a24002004ad422086200aad840bd60403017f017e0c7f230041d0006b22022400024002400240024002402001450d002001ad42287e2203422088a70d032003a722044100480d032004101f2205450d04200241086a2106200241306a41186a2107200241306a41106a2108200521044100210903402002410e360234200241988ec10036023020022009200241306a107e0240024002402002280200220a2006280200220b41f8b3c200410041001002417f470d00420021032007420037030020084200370300200241306a41086a420037030020024200370330200941016a210920022802040d010c020b2007420037030020084200370300200241306a41086a220c420037030020024200370330200a200b200241306a412041001002220d417f460d05200d4120490d05200241106a41186a220d2007290300370300200241106a41106a220e2008290300370300200241106a41086a220f200c2903003703002002200229033037031020024200370330200a200b200241306a41084120100241016a41084d0d05200229033021032007200d2903003703002008200e290300370300200c200f29030037030020022002290310370330200941016a21092002280204450d010b200a101d0b20042002290330370300200441186a2007290300370300200441106a2008290300370300200441086a200241306a41086a290300370300200441206a2003370300200441286a210420012009470d000b200121040c010b41002104410821050b200020043602082000200136020420002005360200200241d0006a24000f0b41df88c0004133103a000b1021000b200441081020000be90104027f017e017f017e230041206b22022400200241106a41086a220342003703002002420037031041a590c1004117200241106a1001200241086a20032903003703002002200229031037030002400240024002402002411041f8b3c200410041001002417f460d002002420037031020024110200241106a41084100100241016a41084d0d0220022903102104410821054108101f2203450d010c030b42032104410821054108101f22030d020b200541011020000b41df88c0004133103a000b2003427f200420047c220620062004541b370000200241206a24002003ad42808080808001840b8b0301097f230041206b22022400200210800120024100360218200242013703102002280200210320022002280208220436021c2002411c6a200241106a1062024002400240024002402004450d0020044105742105200241106a41086a280200210620022802102107200228021421082003210403400240024002400240200820066b41204f0d00200641206a22092006490d062008410174220a20092009200a491b220a4100480d062008450d0120072008200a101e22070d020c070b200641206a21090c020b200a101f2207450d050b200a21080b200720066a22062004290000370000200641186a200441186a290000370000200641106a200441106a290000370000200641086a200441086a29000037000020092106200441206a2104200541606a22050d000b200241186a200936020020022008360214200220073602102002280204450d040c030b200241186a28020021092002280210210720022802040d020c030b1021000b200a41011020000b2003101d0b200241206a24002009ad4220862007ad840baf0601097f230041106b2202240020024100360208200242013703002000280200210302400240024002404104101f2204450d0020024284808080c000370204200220043602002004200336000020002802042103200441044108101e2204450d012002428880808080013702042004200336000420022004360200200041086a28020021042002200041106a280200220336020c2002410c6a2002106202400240024002402003450d0020034105742105200241086a220628020021032002280204210703400240024002400240200720036b41204f0d00200341206a22082003490d0620074101742209200820082009491b220a4100480d062007450d0120022802002007200a101e22090d020c070b200341206a2108200228020021090c020b200a101f2209450d050b2002200a36020420022009360200200a21070b20062008360200200920036a220341086a200441086a290000370000200341106a200441106a290000370000200341186a200441186a2900003700002003200429000037000020082103200441206a2104200541606a22050d000b0b200041146a280200210420022000411c6a280200220336020c2002410c6a2002106202402003450d00200341057421054100200241086a220628020022036b21082002280204210703400240024002400240200720086a41204f0d00200341206a22092003490d062007410174220a20092009200a491b220a4100480d062007450d0120022802002007200a101e22090d020c080b200228020021090c020b200a101f2209450d060b2002200a36020420022009360200200a21070b2006200341206a220a360200200920036a220341086a200441086a290000370000200341106a200441106a290000370000200341186a200441186a29000037000020032004290000370000200841606a2108200a2103200441206a2104200541606a22050d000b200128020020012802042009200a10032007450d070c060b200228020421042001280200200128020420022802002209200241086a280200100320040d050c060b1021000b200a41011020000b200a41011020000b410441011020000b410841011020000b2009101d0b200241106a24000bb00b03057f047e017f230041c0006b22022400024002400240024002400240024002400240024002400240024002400240024020012d00002203450d0020034101470d02200041003a000020002001290001370001200041096a200141096a290000370000200041116a200141116a290000370000200041196a200141196a29000037000020030d014101450d0f0c0e0b2002412b6a2001410c6a280000360000200041013a00002002200141046a29000037002320002002290020370001200041086a200241276a2900003700002003450d020b20034101460d0d20030d05200141086a280200450d0d200141046a280200101d200241c0006a24000f0b20034104470d0720022001410c6a28020022043602142002200141046a2802002205360210200241003a0020200241206a20052004410047220610ce031a20042006490d052002200420066b22033602142002200520066a22063602102004450d0720022d002022044102460d0220044101460d0120040d07200241003a0020200241206a20062003410047220410ce031a20032004490d082002200320046b22053602142002200620046a22063602102003450d0620022d00200d0641002103200241206a2005412020054120491b22046a41004100412020046b2004411f4b1b10cd031a200241206a2006200410ce031a2002200520046b3602142002200620046a3602102005411f4d0d062002411c6a41026a2206200241206a41026a22052d00003a0000200220022f00203b011c20022800232104200229002f210720022900372108200231003f21092002290027210a200520062d000022063a00002002410c6a41026a20063a0000200220022f011c22063b010c200220063b0120200a422088a72106200aa721050c030b41000d0a0c0b0b200241003a0020200241206a20062003410047220410ce031a20032004490d072002200320046b3602142002200620046a3602102003450d0520022d00200d05200241206a200241106a10b90220022802202204450d05200229022421072002410c6a41026a200241206a41026a2d00003a0000200220022f00203b010c2007422088a721062007a72105410121030c010b200241003a0020200241206a20062003410047220510ce031a20032005490d072002200320056b22043602142002200620056a22063602102003450d040240024020022d002022034101460d0020030d0620024200370320200241206a20062004410820044108491b220310ce031a2002200420036b3602142002200620036a360210200441074d0d0620022903202108200241206a200241106a10b80220022802202206450d0620022902242107410021050c010b20024200370320200241206a20062004410820044108491b220510ce031a2002200420056b22033602142002200620056a2206360210200441074d0d052002290320210820024200370320200241206a20062003410820034108491b220410ce031a2002200320046b3602142002200620046a360210200341074d0d0520022903202109200241206a200241106a10b80220022802202206450d0520022902242107410121050b410221032002410c6a41026a200241206a41026a2d00003a0000200220022f00203b010c0b200241206a41026a220b2002410c6a41026a2d00003a0000200220022f010c3b0120200020033a0000200041206a2009370000200041186a2008370000200041106a2007370000200041086a2006ad4220862005ad84370000200041046a2004360000200020022f01203b0001200041036a200b2d00003a00000b200141086a280200450d07200141046a280200101d0c070b20062004102a000b200241206a41026a2002411c6a41026a2d00003a0000200220022f001c3b01200b41cb8fc200411e103a000b20042003102a000b20042003102a000b20052003102a000b200141086a280200450d00200141046a280200101d200241c0006a24000f0b200241c0006a24000bd10504027f017e0f7f017e230041d0006b22022400200241086a200110b5010240024002400240024002400240024002402002280208450d00200228020c2203ad42287e2204422088a70d032004a72205417f4c0d032005450d012005101f2206450d042003450d020c050b20004100360200200241d0006a24000f0b4108210620030d030b410021114100210e0c030b102e000b200541081020000b200241306a41186a2107200241306a41106a2108200241306a41086a2109200141046a210a4100210b4100210c4100210d2003210e0240034020074200370300200842003703002009420037030020024200370330200241306a2001280200220f200a28020022054120200541204922101b221110ce031a200a200520116b22053602002001200f20116a221136020020100d01200241106a41186a22102007290300370300200241106a41106a22122008290300370300200241106a41086a221320092903003703002002200229033037031020024200370330200241306a20112005410820054108491b220f10ce031a200a2005200f6b36020020012011200f6a360200200541074d0d01200d41016a211120022903302104200720102903003703002008201229030037030020092013290300370300200220022903103703300240200d200e470d00200b20112011200b491b220ead42287e2214422088a70d042014a722054100480d040240200d450d002006200c2005101e22060d010c060b2005101f2206450d050b2006200c6a22052002290330370300200541186a2007290300370300200541106a2008290300370300200541086a2009290300370300200541206a2004370300200b41026a210b200c41286a210c2011210d20112003490d000c020b0b200041003602000240200e450d002006101d0b200241d0006a24000f0b2000200e36020420002006360200200041086a2011360200200241d0006a24000f0b1021000b200541081020000bd80403027f017e0e7f230041d0006b22022400200241086a200110b50102400240024002400240024002400240024002402002280208450d00200228020c2203ad2204421b88a70d032004420586a72205417f4c0d032005450d012005101f2206450d042003450d020c050b20004100360200200241d0006a24000f0b4101210620030d030b410021054100210e0c030b102e000b200541011020000b200241306a41186a2107200241306a41106a2108200241306a41086a2109200141046a210a4100210b4100210c4100210d2003210e034020074200370300200842003703002009420037030020024200370330200241306a2001280200220f200a2802002205412020054120491b221010ce031a200a200520106b3602002001200f20106a3602002005411f4d0d02200d41016a2105200241106a41186a22102007290300370300200241106a41106a220f2008290300370300200241106a41086a22112009290300370300200220022903303703100240200d200e470d00200b20052005200b491b220ead4205862204422088a70d042004a722124100480d040240200d450d002006200c2012101e22060d010c060b2012101f2206450d050b2006200c6a220d2002290310370000200d41186a2010290300370000200d41106a200f290300370000200d41086a2011290300370000200b41026a210b200c41206a210c2005210d20052003490d000b0b2000200e36020420002006360200200041086a2005360200200241d0006a24000f0b200041003602000240200e450d002006101d0b200241d0006a24000f0b1021000b201241011020000b8303010a7f230041106b220224002002200110b5010240024002400240024002400240024002402002280200450d0020022802042203417f4c0d072003450d012003101f2204450d08200141046a2105410021064100210720032108034020052802002109200241003a000f2002410f6a2001280200220a2009410047220b10ce031a2009200b490d0520052009200b6b3602002001200a200b6a3602002009450d04200741016a210920022d000f210b024020072008470d002006200920092006491b22084100480d0702402007450d00200420072008101e22040d010c090b2008101f2204450d080b200420076a200b3a0000200641026a21062009210720092003490d000c030b0b20004100360200200241106a24000f0b4101210441002109410021080b2000200836020420002004360200200041086a2009360200200241106a24000f0b2000410036020002402008450d002004101d0b200241106a24000f0b200b2009102a000b1021000b200841011020000b102e000b200341011020000bdd0801067f230041f0006b22022400200241003a005020012802002001280204200241d0006a410120012802081002210320012001280208200341016a41014b22036a220436020802400240024002402003450d0020022d0050220341ef014b0d010c020b200041023a0000200241f0006a24000f0b024002400240024002400240200341847e6a220341034b0d0002400240024020030e0400040102000b200141046a2802002103200241003b0150200141086a2205410020012802002003200241d0006a41022004100222012001417f461b2201410220014102491b20052802006a360200200141014d0d0620022f0150220341ef014b0d08200041023a0000200241f0006a24000f0b200141046a280200210320024100360250200141086a2205410020012802002003200241d0006a41042004100222012001417f461b2201410420014104491b20052802006a360200200041023a0000200241f0006a24000f0b200241d0006a41186a4200370300200241d0006a41106a4200370300200241d0006a41086a42003703002002420037035041002105200141086a220341002001280200200141046a280200200241d0006a41202004100222012001417f461b2201412020014120491b20032802006a3602002001411f4d0d022002412e6a20022d00523a0000200241106a41086a200241df006a290000370300200241106a41106a200241e7006a290000370300200241106a41186a200241d0006a411f6a2d00003a0000200220022f01503b012c2002200229005737031020022800532103410121050c030b200041023a0000200241f0006a24000f0b200141046a280200210320024100360250200141086a2205410020012802002003200241d0006a41042004100222012001417f461b2201410420014104491b20052802006a360200200141034d0d03410121012002280250220341ffff034b0d05200041023a0000200241f0006a24000f0b0b200241cc006a41026a22012002412c6a41026a2d00003a0000200241306a41086a2204200241106a41086a290300370300200241306a41106a2206200241106a41106a290300370300200241306a41186a2207200241106a41186a2d00003a0000200220022f012c3b014c2002200229031037033002402005450d002002410c6a41026a20012d00003a0000200241d0006a41086a2004290300370300200241d0006a41106a2006290300370300200241d0006a41186a20072d00003a0000200220022f014c3b010c20022002290330370350410021010c040b200041023a0000200241f0006a24000f0b200041023a0000200241f0006a24000f0b200041023a0000200241f0006a24000f0b410121010b200020022f010c3b0001200020013a0000200041046a2003360200200041086a2002290350370200200041036a2002410e6a2d00003a0000200041106a200241d0006a41086a290300370200200041186a200241d0006a41106a290300370200200041206a200241d0006a41186a280200360200200241f0006a24000b8e0a01037f02400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020002d00004101470d00200041046a280200220241ffff034d0d01200141046a280200200141086a2802002200470d03200041016a22032000490d1820004101742204200320032004491b22044100480d182000450d09200128020020002004101e2203450d0a0c160b200141046a280200200141086a2802002202470d01200241016a22032002490d1720024101742204200320032004491b22044100480d172002450d04200128020020022004101e2203450d050c130b200241ef014b0d02200141046a280200200141086a2802002200470d05200041016a22032000490d1620004101742204200320032004491b22044100480d162000450d09200128020020002004101e22030d0a0c0f0b200128020021030c120b200128020021030c130b200141046a280200200141086a2802002200470d03200041016a22032000490d1320004101742204200320032004491b22044100480d132000450d09200128020020002004101e22030d0a0c0d0b2004101f22030d0e0b200441011020000b200128020021030c050b200128020021030c070b2004101f22030d0c0b200441011020000b2004101f2203450d050b20012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a20023a00000f0b2004101f2203450d030b20012003360200200141046a2004360200200141086a28020021000b200141086a2204200041016a360200200320006a41fc013a00000240024002400240200141046a2802002203200428020022006b41024f0d00200041026a22042000490d0b20034101742200200420042000491b22004100480d0b2003450d01200128020020032000101e22030d020c060b200128020021030c020b2000101f2203450d040b20012003360200200141046a2000360200200141086a28020021000b200141086a200041026a360200200320006a20023b00000f0b200441011020000b200441011020000b200041011020000b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41ff013a000002400240024002400240200141046a2802002203200428020022026b41204f0d00200241206a22042002490d0720034101742202200420042002491b22024100480d072003450d01200128020020032002101e2203450d020c030b200128020021030c030b2002101f22030d010b200241011020000b20012003360200200141046a2002360200200141086a28020021020b200141086a200241206a360200200320026a220141186a200041196a290000370000200141106a200041116a290000370000200141086a200041096a290000370000200120002900013700000f0b20012003360200200141046a2004360200200141086a28020021000b200141086a2204200041016a360200200320006a41fd013a0000024002400240200141046a2802002203200428020022006b41044f0d00200041046a22042000490d0320034101742200200420042000491b22004100480d032003450d01200128020020032000101e2203450d020c040b200128020021030c040b2000101f22030d020b200041011020000b1021000b20012003360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200320006a20023600000b130020004105360204200041acaec3003602000b13002000410d3602042000418494c1003602000b13002000410836020420004180b1c3003602000b3201017f02404108101f2202450d0020004288808080800137020420002002360200200242033700000f0b410841011020000b130020004101360204200041e8b7c3003602000b13002000410f360204200041a297c1003602000b130020004102360204200041b4b8c3003602000b130020004101360204200041fcb9c3003602000b130020004109360204200041cd9ac1003602000b13002000410436020420004180bbc3003602000ba01e03077f017e017f230041d0026b22032400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200128020022044101460d0020044102470d16200341246a41026a200141076a2d00003a0000200341086a41086a200141186a290200370300200341086a410d6a2001411d6a290000370000200320012f00053b01242003200141106a290200370308200141086a28020021052001410c6a280200210620012d0004210720022d0001210820022d00002101200341b0016a41186a22042002411a6a290100370300200341b0016a41106a200241126a290100370300200341b0016a41086a2002410a6a2901003703002003200241026a2901003703b0012001450d01410121040c020b2001280204210420022d0001210520022d00002101200341c8016a22082002411a6a290100370300200341c0016a200241126a290100370300200341b0016a41086a2002410a6a2901003703002003200241026a2901003703b0012001450d03410121080c040b200341cc026a41026a220920032d00b2013a0000200341a0026a41086a200341c3016a290000370300200341a0026a410d6a2004290000370000200320032f01b0013b01cc02200320032900bb013703a00241012104200841ff01714101470d0020032800b301210220032800b7012101200341c8006a41026a20092d00003a0000200341b0016a41086a200341a0026a41086a290300370300200341b0016a410d6a200341a0026a410d6a290000370000200320032f01cc023b0148200320032903a0023703b001410021040c010b41f1b4c0002102412a21010b20034190016a41026a2208200341c8006a41026a2d00003a0000200341286a41086a2209200341b0016a41086a290300370300200341286a41106a200341b0016a41106a290300370300200320032f01483b019001200320032903b00137032820040d11200341fb006a2009290300370000200341e8006a41186a200341356a290000370000200320032f0190013b01682003200136006f2003200236006b20032003290328370073200320082d00003a006a200341c8006a41086a220242003703002003420037034841df9fc1004108200341c8006a1001200341b8026a41086a2002290300370300200320032903483703b802200341b8026a411041f8b3c200410041001002417f460d03200341b0016a41186a4200370300200341b0016a41106a4200370300200341b8016a4200370300200342003703b001200341b8026a4110200341b0016a4120410010022202417f460d132002411f4d0d13200341ce026a220220032d00b2013a0000200341a0026a41086a2201200341c3016a2204290000370300200341a0026a410d6a2208200341c8016a2209290000370000200320032f01b0013b01cc02200320032900bb013703a00220032900b301210a200341286a41086a220b2001290300370300200341286a410d6a22012008290000370000200320022d00003a00b201200320032f01cc023b01b001200320032903a0023703282004200b290300370000200920012900003700002003200a3700b301200320032903283700bb010c040b200341cc026a41026a20032d00b2013a0000200341a0026a41086a200341c3016a290000370300200341a0026a410d6a22092008290000370000200320032f01b0013b01cc02200320032900bb013703a00241012108200541ff01714101470d0020032800b301210220032800b7012101200341e8006a41026a200341cc026a41026a2d00003a0000200341b0016a41086a200341a0026a41086a290300370300200341b0016a410d6a2009290000370000200320032f01cc023b0168200320032903a0023703b001410021080c010b41f1b4c0002102412a21010b200341e4006a41026a2209200341e8006a41026a2d00003a0000200341c8006a41086a2205200341b0016a41086a290300370300200341c8006a41106a200341b0016a41106a290300370300200320032f01683b0164200320032903b00137034820080d042003413b6a2005290300370000200341286a41186a200341d5006a290000370000200320032f01643b01282003200136002f2003200236002b20032003290348370033200320092d00003a002a200542003703002003420037034841df9fc1004108200341c8006a1001200341b8026a41086a2005290300370300200320032903483703b802200341b8026a411041f8b3c200410041001002417f460d02200341b0016a41186a4200370300200341b0016a41106a4200370300200341b8016a4200370300200342003703b001200341b8026a4110200341b0016a4120410010022202417f460d112002411f4d0d11200341ce026a220220032d00b2013a0000200341a0026a41086a2201200341c3016a2205290000370300200341a0026a410d6a2208200341c8016a2209290000370000200320032f01b0013b01cc02200320032900bb013703a00220032900b301210a200341e8006a41086a22062001290300370300200341e8006a410d6a22012008290000370000200320022d00003a00b201200320032f01cc023b01b001200320032903a00237036820052006290300370000200920012900003700002003200a3700b301200320032903683700bb010c030b200341b0016a41186a4200370300200341c0016a4200370300200341b8016a4200370300200342003703b0010b0240200341e8006a200341b0016a412010d003450d0041e79fc1002102413121010c0d0b200341b8026a41026a2202200341246a41026a2d00003a0000200341b0016a41086a2201200341086a41086a290300370300200341b0016a410d6a2204200341086a410d6a290000370000200320032f01243b01b802200320032903083703b001200741ff01714101470d04200341a0026a200541067610b00120032802a002210120032802a8022005413f7122024d0d05200341cc026a41026a200120024105746a220241026a2d00003a0000200341306a200241136a290000370300200341356a200241186a290000370000200320022f00003b01cc022003200229000b37032820022800072106200228000321054101210220032802a4020d060c070b200341b0016a41186a4200370300200341c0016a4200370300200341b8016a4200370300200342003703b0010b200341286a200341b0016a412010d003450d0141bd9fc1002102412221010b2004103c2004101d0c090b200341b0016a200441e00010ce031a41002102200341003b01682003200341b0016a200341e8006a108a0120032003280200453a00b2012003410c3b01b001200341b0016a108b012004101d0c070b200341cc026a41026a20022d00003a0000200341286a41086a2001290300370300200341286a410d6a2004290000370000200320032f01b8023b01cc02200320032903b0013703280c030b4100210220032802a402450d010b2001101d0b2002450d010b200341a0026a41026a200341cc026a41026a2d00003a0000200341b0016a41086a200341286a41086a290300370300200341b0016a410d6a200341286a410d6a290000370000200320032f01cc023b01a002200320032903283703b001410021010c010b4101210141d7c0c1002105411521060b200341e4006a41026a2204200341a0026a41026a2d00003a0000200341c8006a41086a2202200341b0016a41086a290300370300200341c8006a41106a200341b0016a41106a290300370300200320032f01a0023b0164200320032903b00137034802402001450d0020062101200521020c020b200341ac016a41026a20042d00003a000020034190016a41086a200229030037030020034190016a410d6a200341c8006a410d6a290000370000200320032f01643b01ac012003200329034837039001200242003703002003420037034841df9fc1004108200341c8006a1001200341b8026a41086a2002290300370300200320032903483703b8024100210202400240200341b8026a411041f8b3c200410041001002417f460d00200341c8016a4200370300200341b0016a41106a4200370300200341b8016a4200370300200342003703b001200341b8026a4110200341b0016a4120410010022202417f460d072002411f4d0d07200341cc026a41026a220120032d00b2013a0000200341a0026a41086a2204200341c3016a290000370300200341a0026a410d6a2209200341c8016a290000370000200320032f01b0013b01cc02200320032900bb013703a00220032800b301210220032800b7012108200341c8006a41026a20012d00003a0000200341b0016a41086a2004290300370300200341b0016a410d6a2009290000370000200320032f01cc023b0148200320032903a0023703b0010c010b200341ca006a41003a0000200341b0016a410d6a4200370000200341b8016a4200370300200341003b0148200342003703b001410021080b200341a0026a41026a2209200341c8006a41026a2d00003a0000200341286a41086a2207200341b0016a41086a2204290300370300200341286a410d6a220b200341b0016a410d6a2201290000370000200320032f01483b01a002200320032903b001370328200341b9016a200836000020012003290328370000200341c5016a2007290300370000200341ca016a200b2900003700002003418c023b01b001200320023600b501200320032f01a0023b01b201200320092d00003a00b401200341b0016a108b01200341286a41026a2208200341ac016a41026a2d00003a0000200420034190016a41086a290300370300200120034190016a410d6a290000370000200320032f01ac013b012820032003290390013703b001200341c8006a41086a220242003703002003420037034841df9fc1004108200341c8006a1001200341b8026a41086a2002290300370300200320032903483703b8024120101f2202450d06200220032f01283b00002002200636000720022005360003200220032903b00137000b200241026a20082d00003a0000200241136a2004290300370000200241186a2001290000370000200341b8026a41102002412010032002101d410021020b0b2000200136020420002002360200200341d0026a24000f0b200341c4016a41013602002003411836026c200341c0adc400360268200342013702b401200341c8adc4003602b0012003200341e8006a3602c001200341b0016a4198bfc30010cf01000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b412041011020000b9f3707027f027e017f027e257f0a7e027f230041d0046b2203240041f7b5c0002104024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200141ff01710d00200241ff01714102470d00200341b0046a41086a22044200370300200342003703b00441838cc1004113200341b0046a1001200341a8016a41086a2004290300370300200320032903b0043703a80102400240200341a8016a411041f8b3c200410041001002417f470d0020044200370300200342003703b004418390c100410d200341b0046a1001200341b0036a41086a2004290300370300200320032903b0043703b003200341b0036a411041f8b3c200410041001002417f460d01200342003703d801024002400240200341b0036a4110200341d8016a41084100100241016a41084d0d0020032903d801500d04200341b0046a41086a22044200370300200342003703b004418390c100410d200341b0046a1001200341b0036a41086a22012004290300370300200320032903b0043703b003420021050240200341b0036a411041f8b3c200410041001002417f460d00200342003703d801200341b0036a4110200341d8016a41084100100241016a41084d0d0220032903d80121050b20044200370300200342003703b00441a590c1004117200341b0046a100120012004290300370300200320032903b0043703b00302400240200341b0036a411041f8b3c200410041001002417f460d00200342003703d801200341b0036a4110200341d8016a41084100100241016a41084d0d0420032903d80120057c2000560d010c060b420320057c2000580d050b41ecacc300102c000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41d4acc300102c000b200341b0046a41086a22044200370300200342003703b004418390c100410d200341b0046a1001200341b0036a41086a22012004290300370300200320032903b0043703b003200320003703d801200341b0036a4110200341d8016a41081003200341013a00d80120044200370300200342003703b00441838cc1004113200341b0046a100120012004290300370300200320032903b0043703b003200341b0036a4110200341d8016a4101100320044200370300200342003703b00441a590c1004117200341b0046a1001200341a8016a41086a2004290300370300200320032903b0043703a80102400240200341a8016a411041f8b3c200410041001002417f460d00200342003703b003200341a8016a4110200341b0036a41084100100241016a41084d0d0b20032903b00321050c010b420321050b200341b0046a41086a22014200370300200342003703b00441e58ac0004112200341b0046a1001200341b0036a41086a22022001290300370300200320032903b0043703b0034100210402400240200341b0036a411041f8b3c200410041001002417f460d00200342003703d801200341b0036a4110200341d8016a41084100100241016a41084d0d0c20032903d8012106410021070c010b410121070b20014200370300200342003703b00441e58ac0004112200341b0046a100120022001290300370300200320032903b0043703b003200320003703d801200341b0036a4110200341d8016a410810032006500d0020070d00427f200520057c220820082005541b22054200510d192000200580220020062005802205580d1a2000200542017c2206510d0042002109200341b0046a41086a22044200370300200342003703b00441aaa8c1004112200341b0046a1001200341b0036a41086a2004290300370300200320032903b0043703b00302400240200341b0036a411041f8b3c200410041001002417f460d00200342103702ac022003200341b0036a3602a802200341d8016a200341a8026a105e20032802d801220a450d1f20032902dc0121090c010b4101210a0b024020002005427f857ca7220b450d002009422088a7220c200b4d0d002006a7210d200341d9036a210e200341b0036a41096a210f200341a8026a4104722110200341d8016a41286a2111200341d8016a41206a2112200341d8016a41246a2113200341e8036a2114200341b0036a412c6a2115410021160340200341b8016a41186a200a2016200d6a200c704105746a220441186a290000370300200341b8016a41106a200441106a290000370300200341b8016a41086a200441086a290000370300200320042900003703b801200341d8016a200341b8016a10c90202402012280200223a450d00200341a8026a41086a201141086a290300370300200341a8026a41106a201141106a290300370300200341a8026a41186a201141186a290300370300200341a8026a41206a201141206a280200360200200320112903003703a80220132802002139200341d0026a41186a2217201041186a290000370300200341d0026a41106a2218201041106a290000370300200341d0026a41086a2219201041086a290000370300200320102900003703d002200341b0046a41086a221a4200370300200342003703b00441e2d6c1004115200341b0046a1001200341a8016a41086a221b201a290300370300200320032903b0043703a8010240024002400240200341a8016a411041f8b3c200410041001002417f470d0041014100200341d0026a10630d020c010b200342103702b4042003200341a8016a3602b004200341b0036a200341b0046a105e20032802b0032204450d1620032802b40321012004200341b0036a41086a280200200341d0026a1063210202402001450d002004101d0b20020d010b4112101f2204450d16200441106a41002f0087d74122013b0000200441086a41002900ffd6412200370000200441002900f7d6412205370000200441124132101e2204450d17200420032903d0023700122004412a6a2017290300370000200441226a20182903003700002004411a6a2019290300370000201a4200370300200342003703b00420044132200341b0046a1001201b201a290300370300200320032903b0043703a80102400240200341a8016a411041f8b3c200410041001002417f460d00200341003602b003200341a8016a4110200341b0036a41044100100241016a41044d0d1220032802b003211c2004101d4112101f22040d010c1a0b4100211c2004101d4112101f2204450d190b200441106a20013b0000200441086a200037000020042005370000200441124132101e2204450d19200420032903d0023700122004412a6a2017290300370000200441226a20182903003700002004411a6a2019290300370000201a4200370300200342003703b00420044132200341b0046a1001201b201a290300370300200320032903b0043703a8012003201c41016a221d3602b003200341a8016a4110200341b0036a410410032004101d201a4200370300200342003703b0044189d7c1004119200341b0046a1001201b201a290300370300200320032903b0043703a80102400240200341a8016a411041f8b3c200410041001002417f460d00200341003602b003200341a8016a4110200341b0036a41044100100241016a41044d0d1320032802b003211e0c010b4100211e0b200341f0026a41186a22042017290300370300200341f0026a41106a22012018290300370300200341f0026a41086a22022019290300370300200320032903d0023703f00242002108201a4200370300200342003703b004418cb9c000410d200341b0046a1001201b201a290300370300200320032903b0043703a8010240200341a8016a411041f8b3c200410041001002417f460d00200342003703b003200341a8016a4110200341b0036a41084100100241016a41084d0d0e20032903b00321080b20034190036a41186a221f200429030037030020034190036a41106a2220200129030037030020034190036a41086a22212002290300370300200320032903f00237039003201a4200370300200342003703b00441a2d7c1004117200341b0046a1001201b201a290300370300200320032903b0043703a80102400240024002400240024002400240200341a8016a411041f8b3c200410041001002417f460d00200342103702a4042003200341a8016a3602a004200341a0016a200341a0046a10d50120032802a001450d1020032802a4012222ad42307e2200422088a70d1b2000a72204417f4c0d1b2004450d012004101f2223450d282022450d030c020b200341b0046a41186a2204201f290300370300200341b0046a41106a2201202029030037030041082123200341b0046a41086a220220034190036a41086a29030037030020032003290390033703b004200341b0036a41186a2004290300370300200341b0036a41106a2001290300370300200341b0036a41086a2002290300370300200320032903b0043703b0034100212b420021060c040b410821232022450d010b200341a0046a41086a222428020021254100212620032802a404212720032802a004212841002129410021042022212a0340200341b0036a41186a22024200370300200341b0036a41106a22074200370300200341b0036a41086a222b4200370300200342003703b0032024410020282027200341b0036a41202025100222012001417f461b220141202001412049222c1b20256a2201360200202c0d0d200341b0046a41186a222d2002290300370300200341b0046a41106a222e2007290300370300201a202b290300370300200320032903b0033703b004200342003703b0032024410020282027200341b0036a41082001100222252025417f461b2225410820254108491b20016a2201360200202541074d0d0d20032903b0032100200341003602b0032024410020282027200341b0036a41042001100222252025417f461b222c4104202c4104491b20016a2225360200202c41034d0d0d200441016a210120032802b003212c2002202d2903003703002007202e290300370300202b201a290300370300200320032903b0043703b00302402004202a470d002026200120012026491b222aad42307e2205422088a70d0d2005a7222d4100480d0d02402004450d0020232029202d101e22230d010c140b202d101f2223450d130b202320296a22042000370300200441206a2002290300370300200441186a2007290300370300200441106a202b290300370300200441086a20032903b003370300200441286a202c360200202641026a2126202941306a21292001210420012022490d000b20230d010c0d0b410021014100212a2023450d0c0b200341b0046a41186a2229201f290300370300200341b0046a41106a22242020290300370300201a202129030037030020032003290390033703b00402402001ad422086202aad842206422088a7222b4120490d0041302104202b41306c21072023ad42208621054201210020232102034002402002290300202320046a2201290300580d002001ad4220862000842105200121020b200042017c21002007200441306a2204470d000b2002450d20200542ffffffff0f580d20200341b0036a41186a22012029290300370300200341b0036a41106a22022024290300370300200341b0036a41086a2207201a290300370300200320032903b0043703b003202b2005a722044d0d252023200441306c6a22042008370300200441206a2001290300370300200441186a2002290300370300200441106a2007290300370300200420032903b003370308200441013602280c030b200341b0036a41186a2029290300370300200341b0036a41106a2024290300370300200341b0036a41086a201a290300370300200320032903b0043703b0032006a7202b470d010b202b4101742204202b41016a220120012004491bad220042307e2205422088a70d082005a722044100480d0802400240202b450d002023202b41306c2004101e22230d010c210b2004101f2223450d200b2006422088a7212b200021060b2023202b41306c6a22042008370300200441206a200341b0036a41186a290300370300200441186a200341b0036a41106a290300370300200441106a200341b0036a41086a290300370300200420032903b00337030820044101360228200642ffffffff0f83202b41016aad4220868421060b201a4200370300200342003703b00441a2d7c1004117200341b0046a1001201b201a290300370300200320032903b0043703a801200341b0036a41086a22244100360200200342013703b00320032006422088a722043602b004200341b0046a200341b0036a1062024002402004450d00200441306c21254158202428020022046b212b2004412c6a210420032802b403210220232101034002400240024002402002202b6a41286a41204f0d00200441546a222941206a22072029490d0d20024101742229200720072029491b22294100480d0d2002450d0120032802b00320022029101e22070d020c100b20032802b00321070c020b2029101f2207450d0e0b200320293602b403200320073602b003202921020b2024200441746a2226360200200720046a2229416c6a200141206a290000370000202941646a200141186a2900003700002029415c6a200141106a290000370000202941546a200141086a2900003700002001290300210002400240024002402002202b6a222941086a20294f0d00202641086a22292026490d0d20024101742226202920292026491b22294100480d0d2002450d01200720022029101e22070d020c110b200221290c020b2029101f2207450d0f0b200320293602b403200320073602b0030b20242004417c6a2202360200200720046a41746a2000370000200141286a280200212602400240024002402029202b6a41034b0d00200241046a22272002490d0d20294101742202202720272002491b22024100480d0d2029450d01200720292002101e22070d020c120b202921020c020b2002101f2207450d100b200320023602b403200320073602b0030b200141306a210120242004360200200720046a417c6a2026360000202b41546a212b2004412c6a2104202541506a22250d000c020b0b20032802b403210220032802b00321070b200341a8016a411020072024280200100302402002450d002007101d0b02402006a7450d002023101d0b4112101f2204450d1a200441106a41002f00ddc5413b0000200441086a41002900d5c541370000200441002900cdc541370000200441124132101e2204450d1b200420032903d0023700122004412a6a2017290300370000200441226a20182903003700002004411a6a2019290300370000201a4200370300200342003703b00420044132200341b0046a1001201b201a290300370300200320032903b0043703a8010240024002400240024002400240200341a8016a411041f8b3c200410041001002417f460d00200342103702b4032003200341a8016a3602b00320034198016a200341b0036a10d501200328029801450d1b200328029c01210120034180016a200341b0036a10ca02200328028001450d1b2004101d410a2104200141094d0d01201d410a201e6a4d0d030c020b2004101d410321010b201d20012204201e6a4d0d010b200341b0036a200341d0026a10cb022024290300210020032903b00321050240200341b0036a41246a2207280200450d00200341b0036a41206a280200101d0b201a4200370300200342003703b00441ccd7c1004114200341b0046a1001201b201a290300370300200320032903b0043703a801200341a8016a411041f8b3c200410041001002417f460d01200341003602b003200341a8016a4110200341b0036a41044100100241016a41044d0d1620033502b00321060c020b200341b0046a41186a2017290300370300200341b0046a41106a2018290300370300201a2019290300370300200320032903d0023703b004410121040c020b42c0843d21060b200341c0006a200542002006420010d203200341d0006a4289f48bdcc4002003290340428094ebdc038020032903484200521b4200200410d303200341d0006a41086a290300210620032903502108200341b0036a200341d0026a10cb02200341e0006a200341d0026a20032903b003222f20052008200441ff004b2005200854200020065420002006511b7222041b2230202f203054202429030022312000200620041b22325420312032511b22041b2208200341b0036a41106a29030022332033200856200341b0036a41186a29030022342031203220041b22065620342006511b22041b22352006203420041b223610ef01200341e0006a41086a29030021002003290360210502402003290370223720357d223820087c2208200341e0006a41186a29030020367d2037203554ad7d20067c2008203854ad7c223584500d00202f20337d2236203120347d202f203354ad7d223184500d00200341b0036a41286a2802002201450d00200341b0036a41206a2802002204200141306c6a21020340200341106a2004290300200441086a2903002008203510d20320032003290310200341106a41086a2903002036203110d103200341206a200441106a2003290300200341086a29030010ef01427f2000200341206a41086a2903007c200520032903207c22062005542201ad7c22052001200520005420052000511b22011b2100427f200620011b2105200441306a22042002470d000b0b2005200010f30102402007280200450d00200341b0036a41206a280200101d0b200341d0026a10e401201a4200370300200342003703b00441e0d7c1004115200341b0046a1001201b201a290300370300200320032903b0043703a801200341a8016a411041f8b3c20041001003200341003a00b003201a4200370300200342003703b00441e9a4c1004119200341b0046a1001201b201a290300370300200320032903b0043703a801200341a8016a4110200341b0036a41011003200341b0046a41186a2017290300370300200341b0046a41106a2018290300370300201a2019290300370300200320032903d0023703b004410221040b20142032370300200341b0036a41306a2030370300202420043a0000200f20032903b004370000200e20032f0090033b00002015201c360200200f41086a201a290300370000200f41106a200341b0046a41106a290300370000200f41186a200341b0046a41186a290300370000200e41026a20034190036a41026a2d00003a0000200341043a00b003200341b0036a108b0120390d010c020b2039450d010b203a101d0b201641016a2216200b470d000b0b410021042009a7450d00200a101d0b200341d0046a240020040f0b1021000b202a450d002023101d0b41df88c0004133103a000b202941011020000b202941011020000b200241011020000b202d41081020000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b102e000b41df88c0004133103a000b41df88c0004133103a000b411241011020000b413241011020000b411241011020000b413241011020000b411241011020000b413241011020000b41b9d7c1004113103a000b200441081020000b41a8d1c200102c000b41c0d1c200102c000b200441081020000b4188eac3002004202b104b000b41df88c0004133103a000bc80401077f230041a0016b22022400024002400240410e101f2203450d00200341066a41002900e5c541370000200341002900dfc5413700002003410e412e101e2203450d012003200129000037000e200341266a200141186a2900003700002003411e6a200141106a290000370000200341166a200141086a290000370000200241d0006a41086a22014200370300200242003703502003412e200241d0006a1001200241306a41086a20012903003703002002200229035037033002400240200241306a411041f8b3c200410041001002417f460d00200242103702442002200241306a360240200241d0006a200241c0006a10fc0220022802702201450d0420002002290350370300200041186a200241d0006a41186a290300370300200041106a200241d0006a41106a290300370300200041086a200241d0006a41086a290300370300200241086a2204200241d0006a412c6a290200370300200241106a2205200241d0006a41346a290200370300200241186a2206200241d0006a413c6a290200370300200241206a2207200241d0006a41c4006a290200370300200241286a2208200241d0006a41cc006a2802003602002002200229027437030020002001360220200020022903003702242000412c6a2004290300370200200041346a20052903003702002000413c6a2006290300370200200041c4006a2007290300370200200041cc006a20082802003602000c010b200041003602200b2003101d200241a0016a24000f0b410e41011020000b412e41011020000b41df88c0004133103a000bcc0603047f037e037f230041206b22022400200241003a001020012802002001280204200241106a410120012802081002210320012001280208200341016a41014b22036a22043602080240024002402003450d000240024002400240024020022d0010220541037122034102460d0020034101460d0120030d022005410276ad21060c030b20024100360210200220053a0010200141086a220341002001280200200141046a280200200241106a41017241032004100222012001417f461b22014103200141034922011b20032802006a36020020010d042002280210410276ad21060c020b200241003b0110200220053a00102001280200200141046a280200200241106a4101724101200410022103200141086a22012001280200200341016a220141014b6a36020020014102490d0320022f0110410276ad21060c010b0240024020054102762203410c460d0020034104460d0120030d03200141046a280200210320024100360210200141086a2205410020012802002003200241106a41042004100222012001417f461b22014104200141044922011b20052802006a36020020010d04200235021021060c020b420021072002420037031820024200370310200141086a220341002001280200200141046a280200200241106a41102004100222012001417f461b22014110200141104922011b20032802006a36020020010d04200241106a41086a290300210820022903102106420121070c050b4200210720024200370310200141086a220341002001280200200141046a280200200241106a41082004100222012001417f461b22014108200141084922011b20032802006a36020020010d03200229031021060b42002108420121070c030b200341046a220941104b0d00200141046a210a200141086a21054200210642002108410021030340200241003a00102001280200200a280200200241106a410120041002210420052005280200200441016a41014b220b6a2204360200200b450d01200220023100104200200341037441f8007110d303200241086a29030020088421082002290300200684210642012107200341016a220341ff01712009490d000c030b0b420021070b0b2000200637030820002007370300200041106a2008370300200241206a24000be60806037f047e017f017e0a7f037e230041b0016b220224000240024002400240024002400240024002400240410f101f2203450d00200341076a41002900e9d841370000200341002900e2d8413700002003410f412f101e2204450d012004200129000037000f200441276a200141186a2900003700002004411f6a200141106a290000370000200441176a200141086a29000037000020024190016a41086a2201420037030020024200370390012004412f20024190016a1001200241d0006a41086a200129030037030020022002290390013703500240024002400240200241d0006a411041f8b3c200410041001002417f460d00200242103702642002200241d0006a360260200241386a200241e0006a10ca022002290338a7450d0b200241386a41106a290300210520022903402106200241206a200241e0006a10ca022002290320a7450d0b200241306a290300210720022903282108200241186a200241e0006a10d5012002280218450d0b200228021c2209ad42307e220a422088a70d03200aa72201417f4c0d032001450d012001101f220b450d062009450d020c070b2000420037030020004208370320200041186a4200370300200041106a4200370300200041086a4200370300200041286a41003602000c080b4108210b20090d050b4100210f4200210a200b450d080c050b102e000b410f41011020000b412f41011020000b200141081020000b20024190016a41186a210320024190016a41106a210c4200210a4100210d4100210e410021012009210f034020034200370300200c420037030020024190016a41086a221042003703002002420037039001200241e0006a41086a22112011280200221141002002280260200228026420024190016a41202011100222112011417f461b2211412020114120491b6a3602002011411f4d0d03200241f0006a41186a22122003290300370300200241f0006a41106a2213200c290300370300200241f0006a41086a2214201029030037030020022002290390013703702002200241e0006a10ca022002290300a7450d03200141016a2111200241106a29030021152002290308211620032012290300370300200c201329030037030020102014290300370300200220022903703703900102402001200f470d00200d20112011200d491b220fad42307e2217422088a70d062017a722124100480d0602402001450d00200b200e2012101e220b0d010c080b2012101f220b450d070b200b200e6a2201201537030820012016370300200141286a2003290300370300200141206a200c290300370300200141186a2010290300370300200141106a200229039001370300200a4280808080107c210a200d41026a210d200e41306a210e2011210120112009490d000b200b450d030b200020083703102000200537030820002006370300200041246a200a200fad843702002000200b360220200041186a20073703000b2004101d200241b0016a24000f0b200f450d00200b101d0b41df88c0004133103a000b1021000b201241081020000bdc81010d097f017e077f037e017f017e017f017e357f017e237f017e047f230041f0026b220324000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d00002204417f6a220541044b0d00024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020050e050005020301000b200141046a2802002106200241096a2800002105200241056a280000210720022d0001210820022d00002109200341306a41086a220a200241156a290000370300200341306a410d6a220b2002411a6a2900003700002003200241046a2d00003a00d2012003200241026a2f01003b01d00120032002410d6a2900003703302009450d09410121090c0a0b20022d000120022d0000720d02200141086a290300210c20034180026a41086a22024200370300200342003703800241bca0c100411a20034180026a1001200341b0016a41086a200229030037030020032003290380023703b0012003200c370330200341b0016a4110200341306a410810030c4f0b200341206a200141196a290000370300200341186a200141116a290000370300200341086a41086a200141096a29000037030020032001290001370308200241096a2800002105200241056a280000210720022d0001210d20022d0000210e200341306a41086a220f200241156a290000370300200341306a410d6a22102002411a6a2900003700002003200241046a2d00003a00d2012003200241026a2f01003b01d00120032002410d6a290000370330200e450d03410121020c040b20022d000120022d000072450d050b41c9b4c00021074128210520044101470d4e200141046a2802002202103c2002101d0c4e0b200141216a2d00002111200341f0016a200141196a290000370300200341e8016a200141116a290000370300200341d8016a41086a200141096a290000370300200320012900013703d801200241096a2800002105200241056a280000210720022d0001210d20022d0000210e200341306a41086a220f200241156a290000370300200341306a410d6a22122002411a6a2900003700002003200241046a2d00003a00d2012003200241026a2f01003b01d00120032002410d6a290000370330200e450d07410121020c080b200341cc016a41026a20032d00d2013a0000200341b0016a41086a200f290300370300200341b0016a410d6a2010290000370000200320032f01d0013b01cc01200320032903303703b00141012102200d41ff01714101470d00200341a8026a41026a200341cc016a41026a2d00003a0000200341306a41086a200341b0016a41086a290300370300200341306a410d6a200341b0016a410d6a290000370000200320032f01cc013b01a802200320032903b001370330410021020c010b412a210541f1b4c00021070b2003412c6a41026a220e200341a8026a41026a2d00003a000020034180026a41086a220d200341306a41086a29030037030020034180026a41106a200341306a41106a290300370300200320032f01a8023b012c200320032903303703800220020d1c200341a3016a200d290300370000200341a8016a2003418d026a290000370000200320032f012c3b01900120032005360097012003200736009301200320032903800237009b012003200e2d00003a00920120034190016a10cd02450d07411c101f2202450d25200241186a41002800a0a141360000200241106a4100290098a141370000200241086a4100290090a14137000020024100290088a1413700002002411c413c101e2202450d262002200329030837001c200241346a200341086a41186a2903003700002002412c6a200341086a41106a290300370000200241246a200341086a41086a29030037000020034180026a41086a2205420037030020034200370380022002413c20034180026a1001200341a8026a41086a200529030037030020032003290380023703a802200341a8026a411041f8b3c20041004100100221052002101d2005417f460d0b200341306a200341086a10ce0220032802382213450d1041002102200329023c2214422088a72205450d11024020054101460d004100210203402005410176220720026a220e20022013200e4105746a20034190016a412010d0034101481b2102200520076b220541014b0d000b0b201320024105746a20034190016a412010d0032205450d162005411f7620026a21020c110b200141086a290300210c20034180026a41086a22024200370300200342003703800241c7a2c100411b20034180026a1001200341b0016a41086a200229030037030020032003290380023703b0012003200c370330200341b0016a4110200341306a410810030c470b200341cc016a41026a20032d00d2013a0000200341b0016a41086a200a290300370300200341b0016a410d6a200b290000370000200320032f01d0013b01cc01200320032903303703b00141012109200841ff01714101470d00200341a8026a41026a200341cc016a41026a2d00003a0000200341306a41086a200341b0016a41086a290300370300200341306a410d6a200341b0016a410d6a290000370000200320032f01cc013b01a802200320032903b001370330410021090c010b41f1b4c0002107412a21050b2003412c6a41026a2208200341a8026a41026a2d00003a000020034180026a41086a2202200341306a41086a29030037030020034180026a41106a200341306a41106a290300370300200320032f01a8023b012c200320032903303703800220090d43200341e3026a2002290300370000200341e8026a20034180026a410d6a290000370000200320032f012c3b01d002200320053600d702200320073600d30220032003290380023700db02200320082d00003a00d202200242003703002003420037038002418cb9c000410d20034180026a1001200341b0016a41086a200229030037030020032003290380023703b001420021150240200341b0016a411041f8b3c200410041001002417f460d0020034200370330200341b0016a4110200341306a41084100100241016a41084d0d1d200329033021150b20034180026a41086a22024200370300200342003703800241bca0c100411a20034180026a1001200341b0016a41086a200229030037030020032003290380023703b001200341b0016a411041f8b3c200410041001002417f460d0520034200370330200341b0016a4110200341306a41084100100241016a41084d0d1d200329033021160c060b200341cc016a41026a20032d00d2013a0000200341b0016a41086a200f290300370300200341b0016a410d6a2012290000370000200320032f01d0013b01cc01200320032903303703b00141012102200d41ff01714101470d00200341d0026a41026a200341cc016a41026a2d00003a0000200341306a41086a200341b0016a41086a290300370300200341306a410d6a200341b0016a410d6a290000370000200320032f01cc013b01d002200320032903b001370330410021020c010b41f1b4c0002107412a21050b2003412c6a41026a220e200341d0026a41026a2d00003a000020034180026a41086a220d200341306a41086a29030037030020034180026a41106a200341306a41106a290300370300200320032f01d0023b012c200320032903303703800220020d15200341bb026a200d290300370000200341a8026a41186a22022003418d026a290000370000200320032f012c3b01a802200320053600af02200320073600ab0220032003290380023700b3022003200e2d00003a00aa02200341a8026a10cd02450d01200341306a41186a200341d8016a41186a290300370300200341306a41106a200341d8016a41106a290300370300200341306a41086a200341d8016a41086a290300370300200341d8006a200341a8026a41086a290300370300200341e0006a200341a8026a41106a290300370300200341e8006a2002290300370300200320032903d801370330200320032903a802370350411b101f2202450d20200241176a41002800d39041360000200241106a41002900cc9041370000200241086a41002900c49041370000200241002900bc90413700002002411b413b101e2202450d212002200329033037001b200241336a200341306a41186a2903003700002002412b6a200341306a41106a290300370000200241236a200341306a41086a2903003700002002413b41f600101e2202450d222002200341d0006a220529000037003b200241d3006a200541186a290000370000200241cb006a200541106a290000370000200241c3006a200541086a29000037000020034180026a41086a220542003703002003420037038002200241db0020034180026a1001200341b0016a41086a200529030037030020032003290380023703b001410221050240200341b0016a411041f8b3c200410041001002417f460d00200341003a008002200341b0016a411020034180026a41014100100241016a41014d0d2920032d00800221050b2002101d200541ff01714102470d14200341306a41186a200341d8016a41186a290300370300200341306a41106a200341d8016a41106a290300370300200341306a41086a200341d8016a41086a290300370300200320032903d801370330411c101f2202450d2a200241186a41002800a0a141360000200241106a4100290098a141370000200241086a4100290090a14137000020024100290088a1413700002002411c413c101e2202450d2b2002200329033037001c200241346a200341c8006a2903003700002002412c6a200341306a41106a290300370000200241246a200341306a41086a29030037000020034180026a41086a2205420037030020034200370380022002413c20034180026a1001200341b0016a41086a200529030037030020032003290380023703b001200341b0016a411041f8b3c200410041001002417f460d0b200342103702d4022003200341b0016a3602d00220034180026a200341d0026a105e2003280280022217450d2e20034188026a280200210720032802840221050c0c0b41fca1c1002107412b210520044101460d410c420b41a4a1c1002107412e210520044101460d400c410b420321160b410821094200211820034180026a41086a22024200370300200342003703800241dfd9c000411520034180026a1001200341b0016a41086a200229030037030020032003290380023703b0010240200341b0016a411041f8b3c200410041001002417f460d00200342103702ac022003200341b0016a3602a802200341306a200341a8026a10a40120032802302209450d1a200329023421180b201620157c211520092018422088a7220841286c6a2107200921020340200720026b419f014d0d022002200341d0026a460d032002200341d0026a412010d003450d03200241286a2205200341d0026a460d042005200341d0026a412010d003450d04200241d0006a2205200341d0026a460d042005200341d0026a412010d003450d04200241f8006a2205200341d0026a460d04200241a0016a21022005200341d0026a412010d0030d000c040b0b41a7a2c10021074120210520044101460d3d0c3e0b4102210520072002460d022009200841286c6a21070340200341d0026a2002460d012002200341d0026a412010d003450d012007200241286a2202470d000c030b0b200221050b200541206a29030020155621050b2005410247200571210202402018a7450d002009101d0b024002402002450d0020034100360238200342013703302006200341306a10b201200328023421082003280238210a20032802302109200341306a41186a22024200370300200341306a41106a22054200370300200341306a41086a22074200370300200342003703302009200a200341306a1000200341d8016a41186a220a2002290300370300200341d8016a41106a220b2005290300370300200341d8016a41086a22192007290300370300200320032903303703d80102402008450d002009101d0b2002200a2903003703002005200b29030037030020072019290300370300200320032903d8013703304118101f2202450d1c200241106a41002900ec9e41370000200241086a41002900e49e41370000200241002900dc9e41370000200241184138101e2202450d1d20022003290330370018200241306a200341306a41186a290300370000200241286a200341306a41106a290300370000200241206a200341306a41086a29030037000020034180026a41086a2205420037030020034200370380022002413820034180026a1001200341a8026a41086a200529030037030020032003290380023703a802200341a8026a411041f8b3c20041004100100221052002101d2005417f460d0141949bc2002107411f21050c390b41d6a0c1002107412021050c380b200341306a200341d8016a10ce02024020032802382202450d00200328023c2105200329033021164200211820034180026a41086a220742003703002003420037038002418cb9c000410d20034180026a1001200341b0016a41086a200729030037030020032003290380023703b0010240200341b0016a411041f8b3c200410041001002417f460d00200342003703a802200341b0016a4110200341a8026a41084100100241016a41084d0d1520032903a80221180b02402005450d002002101d0b201820165a0d0041f6a0c1002107411221050c380b4108210820034180026a41086a22024200370300200342003703800241c59ec100411720034180026a1001200341b0016a41086a200229030037030020032003290380023703b00141002109200341b0016a411041f8b3c200410041001002417f460d07200342103702ac022003200341b0016a3602a802200341306a200341a8026a10a10120032802302208450d272003200329023422183702940120032008360290012018422088a721092018a721020c080b4100210241012113420021140b200341306a41186a20034190016a41186a290300370300200341306a41106a20034190016a41106a290300370300200341306a41086a20034190016a41086a290300370300200320032903900137033020022014422088a722054b0d1e20052014a7470d28200541016a22072005490d2b2005410174220e20072007200e491bad2214420586221a422088a70d2b201aa722074100480d2b2005450d02201320054105742007101e2213450d030c280b4100210541012117410021070b2002101d20034180026a41186a220e200341a8026a41186a29030037030020034180026a41106a220d200341a8026a41106a29030037030020034180026a41086a220f200341a8026a41086a290300370300200320032903a80237038002024020052007470d00200541016a22022005490d2a20054101742212200220022012491b2220ad420586220c422088a70d2a200ca722024100480d2a2005450d06201720054105742002101e22170d070c230b200521200c060b2007101f22130d250b200741011020000b41d2a1c1002107412a21052014a7450d052013101d20044101460d320c330b20034100360298012003420837039001410021020b20034180026a41186a2205200341d8016a41186a29030037030020034180026a41106a2207200341d8016a41106a29030037030020034180026a41086a220a200341d8016a41086a290300370300200320032903d8013703800220022009470d20200941016a22022009490d242009410174220b20022002200b491b2202ad42287e2218422088a70d242018a7220b4100480d242009450d042008200941286c200b101e2208450d050c1f0b2002101f2217450d1c0b201720074105746a2202200329038002370000200241186a200e290300370000200241106a200d290300370000200241086a200f290300370000411c101f2202450d18200241186a41002800a0a141360000200241106a4100290098a141370000200241086a4100290090a14137000020024100290088a1413700002002411c413c101e2247450d192047200329033037001c204741346a200341306a41186a2903003700002047412c6a200341306a41106a290300370000204741246a200341306a41086a29030037000020034180026a41086a2202420037030020034200370380022047413c20034180026a1001200341b0016a41086a200229030037030020032003290380023703b001200341003602880220034201370380022003200741016a22023602d002200341d0026a20034180026a1062024002402002450d00200741057441206a210f410020034180026a41086a28020022056b210e2003280280022112200328028402210d2017210203400240200d200e6a411f4b0d00200541206a22072005490d26200d4101742210200720072010491b22074100480d2602400240200d450d002012200d2007101e22120d010c0d0b2007101f2212450d0c0b2007210d0b201220056a22072002290000370000200741186a200241186a290000370000200741106a200241106a290000370000200741086a200241086a290000370000200e41606a210e200541206a2105200241206a2102200f41606a220f0d000b20034188026a20053602002003200d3602840220032012360280020c010b20034188026a2802002105200328028402210d20032802800221120b200341b0016a41102012200510030240200d450d002012101d0b2047101d2020450d002017101d0b200341306a41186a200341d8016a41186a290300370300200341306a41106a200341d8016a41106a290300370300200341306a41086a200341d8016a41086a290300370300200341d8006a200341a8026a41086a290300370300200341e0006a200341a8026a41106a290300370300200341e8006a200341a8026a41186a290300370300200320032903d801370330200320032903a802370350200320113a00d002411b101f2202450d10200241176a41002800d39041360000200241106a41002900cc9041370000200241086a41002900c49041370000200241002900bc90413700002002411b413b101e2202450d112002200329033037001b200241336a200341306a41186a2903003700002002412b6a200341306a41106a290300370000200241236a200341306a41086a2903003700002002413b41f600101e2202450d122002200341d0006a220529000037003b200241d3006a200541186a290000370000200241cb006a200541106a290000370000200241c3006a200541086a29000037000020034180026a41086a220542003703002003420037038002200241db0020034180026a1001200341b0016a41086a200529030037030020032003290380023703b001200341b0016a4110200341d0026a410110032002101d410021070b20044101470d2d0c2c0b200b101f22080d1a0b200b41081020000b200341c4006a4101360200200341183602ac02200341c0adc4003602a80220034201370234200341c8adc4003602302003200341a8026a360240200341306a41a8bfc30010cf01000b41df88c0004133103a000b41df88c0004133103a000b200741011020000b41df88c0004133103a000b41df88c0004133103a000b411c41011020000b413c41011020000b411b41011020000b413b41011020000b41f60041011020000b411841011020000b413841011020000b411b41011020000b413b41011020000b41f60041011020000b41df88c0004133103a000b41c8aec400102c000b411c41011020000b413c41011020000b411c41011020000b413c41011020000b41df88c0004133103a000b200241011020000b41df88c0004133103a000b200320023602940120032008360290010b2008200941286c6a220220153703002002200329038002370308200241206a2005290300370300200241186a2007290300370300200241106a200a29030037030020034190016a41086a200941016a220a3602000240200a41144b0d0041022129200941016a4102490d034128212a2008200941286c6a41d0006a212b417f212c410a212d410b212e410f212f412021302003413d6a2131411b2132410821334113213441182135411021364103213741502138417821394148213a4170213b4140213c4168213d41b87f213e4160213f41b07f21404158214141012142410121020c020b02400240200a4101762244ad42287e220c422088a70d00200ca72202417f4c0d0041082112024002402002450d002002101f2245450d03204521460c010b41082145410821460b41582148200841586a2149200841d0006a214a200841887f6a214b4104214c4100214d417f214e4101214f420321504220210c4103215141022152417d215341282154412021474118212041102117417e2155417421564164215741b07f215841092159410a215a410b215b410f215c2003413d6a215d411b215e4113215f41502160417821614148216241702163414021644168216541b87f21664160216741002168410021694104216a200a216b410221020c030b102e000b200241081020000b201320024105746a220741206a2007200520026b41057410cf031a200741186a200341306a41186a290300370000200741106a200341306a41106a290300370000200741086a200341306a41086a2903003700002007200329033037000020034180026a41086a220242003703002003420037038002418cb9c000410d20034180026a1001200341b0016a41086a2207200229030037030020032003290380023703b0014200211a0240024002400240200341b0016a411041f8b3c200410041001002417f460d0020034200370330200341b0016a4110200341306a41084100100241016a41084d0d012003290330211a0b20024200370300200342003703800241c7a2c100411b20034180026a10012007200229030037030020032003290380023703b00102400240200341b0016a411041f8b3c200410041001002417f460d0020034200370330200341b0016a4110200341306a41084100100241016a41084d0d032003290330211841012107411c210e411c101f2202450d010c040b42e807211841012107411c210e411c101f22020d030b200e20071020000b41df88c0004133103a000b41df88c0004133103a000b200241186a410028008c9f41360000200241106a41002900849f41370000200241086a41002900fc9e41370000200241002900f49e4137000002400240024002402002200e413c101e221b450d00201b200329030837001c201b41346a200341086a41186a290300370000201b412c6a200341086a41106a290300370000201b41246a200341086a41086a29030037000020034180026a41086a220242003703002003420037038002201b413c20034180026a1001200341b0016a41086a200229030037030020032003290380023703b00120034100360238200342013703304108101f2202450d0120022018201a7c370000200342888080808001370234200320023602302003200520076a22023602a802200341a8026a200341306a10620240024002402002450d00200541057441206a210f4100200341306a41086a28020022056b210e200328023021102003280234210d2013210203400240200d200e6a411f4b0d00200541206a22072005490d0b200d4101742211200720072011491b22074100480d0b02400240200d450d002010200d2007101e22100d010c060b2007101f2210450d050b2007210d0b201020056a22072002290000370000200741186a200241186a290000370000200741106a200241106a290000370000200741086a200241086a290000370000200e41606a210e200541206a2105200241206a2102200f41606a220f0d000b200341386a20053602002003200d360234200320103602300c010b200341386a28020021052003280234210d200328023021100b2014a72102200341b0016a41102010200510030240200d450d002010101d0b201b101d02402002450d002013101d0b4108211c20034180026a41086a22024200370300200342003703800241c59ec100411720034180026a1001200341b0016a41086a200229030037030020032003290380023703b0014100211d0240024002400240200341b0016a411041f8b3c200410041001002417f460d00200342103702ac022003200341b0016a3602a802200341306a200341a8026a10a1012003280230221c450d072003280234211d4128210e200341386a280200220f41286c220d0d010c020b4100210f4128210e410041286c220d450d010b200341306a41086a2102410021070340200341306a41206a201c20076a220541206a290300370300200341306a41186a200541186a290300370300200341306a41106a200541106a2903003703002002200541086a29030037030020032005290300370330200341d0026a41186a200241186a290000370300200341d0026a41106a200241106a290000370300200341d0026a41086a200241086a290000370300200320022900003703d002200341d0026a200341086a412010d0030d02200d2007200e6a2207470d000b0b4100211e20034100360238200342083703304108211f201d450d11201c101d0c110b200341a8026a41206a2202200341306a41206a290300370300200341a8026a41186a220e200341306a41186a290300370300200341a8026a41106a220d200341306a41106a290300370300200341a8026a41086a2210200341306a41086a290300370300200320032903303703a80220034180026a41206a2211200229030037030020034180026a41186a2202200e29030037030020034180026a41106a220e200d29030037030020034180026a41086a220d2010290300370300200320032903a80237038002200341d8016a41206a22102011290300370300200341d8016a41186a22112002290300370300200341d8016a41106a2202200e290300370300200341d8016a41086a220e200d29030037030020032003290380023703d8014128101f221f450d04201f20032903d801370300201f41206a2010290300370300201f41186a2011290300370300201f41106a2002290300370300201f41086a200e2903003703000240200f41286c41586a2007460d00200541286a212141282113201c200f41286c6a221b41586a212241082111200341306a41086a210e41012123412021104118210f4110210d4228211a4220211441002124410121254101211e410021020c060b410121254101211e0c0f0b200741011020000b413c41011020000b410841011020000b41df88c0004133103a000b412841081020000b0240034002400240024002400240024002400240024002400240024002400240024002400240024020020e03000102020b2021210202400340200341306a20106a2205200220106a290300370300200341306a200f6a22072002200f6a290300370300200341306a200d6a220b2002200d6a290300370300200e200220116a29030037030020032002290300370330200341d8016a200f6a200e200f6a290000370300200341d8016a200d6a200e200d6a290000370300200341d8016a20116a200e20116a2900003703002003200e2900003703d801200341d8016a200341086a201010d0030d01201b200220136a2202470d000c1e0b0b200341a8026a20106a22212005290300370300200341a8026a200f6a22192007290300370300200341a8026a200d6a2226200b290300370300200341a8026a20116a2227200e290300370300200320032903303703a80220034180026a20106a2228202129030037030020034180026a200f6a2221201929030037030020034180026a200d6a2219202629030037030020034180026a20116a22262027290300370300200320032903a802370380022005202829030037030020072021290300370300200b2019290300370300200e202629030037030020032003290380023703300240201e2025470d00202520236a221e2025490d1520252023742221201e201e2021491b221ead201a7e2218201488a70d152018a722212024480d1502402025450d00201f202520136c2021101e221f0d010c080b2021101f221f450d070b200220136a2121201f202520136c6a22192003290330370300201920106a20052903003703002019200f6a20072903003703002019200d6a200b290300370300201920116a200e290300370300202520236a212520222002470d070c1c0b200a20092202202c6a2209490d010240200a20096b220b2029490d0020082002202a6c6a220729030020082009202a6c6a220529030022155a0d00200320052f01083b01d00120032005202d6a2d00003a00d2012005202e6a28000021272005202f6a28000021282031200520306a2202290000370000200341306a20336a2243200520326a290000370300200520346a29000021182002200720306a290300370300200520356a200720356a290300370300200520366a200720366a2903003703002003201837033020052007290300370300200520336a200720336a290300370300410121020240200b2037490d00200529035020155a0d0041032119202b210202400340200220386a200220396a2903003703002002203a6a2002203b6a2903003703002002203c6a2002203d6a2903003703002002203e6a2002203f6a290300370300200220406a200220416a220729030037030020192226200b4f0d01202620426a2119200229030021182002202a6a210220182015540d000b0b2026202c6a21020b2007201537030020052002202a6c6a220220032f01d0013b010820032d00d20121052002202f6a20283600002002202e6a20273600002002202d6a20053a0000200220306a2031290000370000200220326a2043290300370000200220346a20032903303700000b202b20416a212b20090d070c120b206b216c4100216b4101216d206c204e6a2227450d0702400240024002400240024002402008202720546c6a2903002008206c20546c22196a20586a29030022185a0d00204b20196a210203402027204f460d022027204e6a2127201820022903002215542105200220486a21022015211820050d000c030b0b206c20556a210b204b20196a21054100216b410021020340200b2002460d052002204f6a21022018200529030022155a2107200520486a21052015211820070d000b206c20026b204e6a21272002204f6a226d20594d0d030c020b410021270b206c2027490d05206c200a4b0d070240206c20276b226d204f762207450d002008202720546c6a2102204920196a21050340200341306a20476a220b200220476a2219290300370300200341306a20206a2226200220206a2228290300370300200341306a20176a2243200220176a226e290300370300200341306a20126a226f200220126a227029030037030020032002290300370330200520126a22712903002118200520176a22722903002115200520206a22732903002116200529030021742019200520476a227529030037030020282016370300206e201537030020702018370300200220743703002075200b29030037030020732026290300370300207220432903003703002071206f29030037030020052003290330370300200220546a2102200520486a21052007204e6a22070d000b0b206d20594d0d010b2027216b20692068460d0e0c0f0b2027450d01206c200a4b0d04204a202720546c6a2176410021770c0f0b206c216d20692068460d090c0a0b2027216b20692068460d0a410221020c0e0b2009200a102a000b2027206c102a000b206c2027417f6a226b490d0d0b206c200a102b000b202141081020000b410021020c090b410121020c080b410021020c060b410121020c050b410221020c040b410121020c030b410121020c020b410221020c010b410321020b03400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020020e0400010204040b20692068470d10410121020c160b2068204f6a22022068490d192068204f742205200220022005491b2269ad2050862218200c88a70d192018a72202204d480d1902402068450d00206a20682051742002101e226a0d110c020b2002101f226a0d110c010b206a20682051746a2202206d3602042002206b3602002068204f6a2278216820782052490d02410121770c130b200241041020000b0240024020770e020001010b206c2027204e6a226b490d150240206c206b6b226d2052490d002008202720546c6a22072903002008206b20546c6a220529030022155a0d00200320052f01083b01d00120032005205a6a2d00003a00d2012005205b6a28000021262005205c6a2800002128205d200520476a2202290000370000200341306a20126a22432005205e6a2900003703002005205f6a29000021182002200720476a290300370300200520206a200720206a290300370300200520176a200720176a2903003703002003201837033020052007290300370300200520126a200720126a290300370300410121020240206d2051490d00200529035020155a0d004103210b2076210202400340200220606a200220616a290300370300200220626a200220636a290300370300200220646a200220656a290300370300200220666a200220676a290300370300200220586a200220486a2207290300370300200b2219206d4f0d012019204f6a210b20022903002118200220546a210220182015540d000b0b2019204e6a21020b200720153703002005200220546c6a220220032f01d0013b010820032d00d20121052002205c6a20283600002002205b6a20263600002002205a6a20053a0000200220476a205d2900003700002002205e6a20432903003700002002205f6a20032903303700000b206b450d0c207620486a2176206b2127206d205a490d0a410021020c130b0240024002400240206a20782243204e6a22782051746a2202280200450d00206a20432051746a221920566a280200220b200228020422054d0d0041022168204341024d0d04206a204320536a22022051746a28020422072005200b6a4d0d0141032168204341034d0d04201920576a2802002007200b6a4d0d010c050b20432051490d0120022802042105206a204320536a22022051746a28020421070b20072005490d010b204320556a21020b20432002204f6a22724d0d03204320024d0d04206a20022051746a226f2802042273206f2802006a2202206a20722051746a22702802002271490d052002200a4b0d06206f204c6a21752008207120546c6a22282070280204226e20546c22056a2168200220546c210702400240024002400240200220716b2219206e6b2202206e4f0d0020452068200220546c220510ce031a204620056a210b206e204f480d012002204f480d01204920076a21072068210203402007200220486a2268200b20486a2219201929030020682903005422261b2205290300370300200720476a200520476a290300370300200720206a200520206a290300370300200720176a200520176a290300370300200720126a200520126a290300370300200b201920261b210b20282068200220261b22024f0d04200720486a2107204621052046200b490d000c050b0b20452028200510ce031a204620056a210b206e204f480d012019206e4c0d01200820076a212620462105202821020340200220682005206829030020052903005422191b2207290300370300200220476a200720476a290300370300200220206a200720206a290300370300200220176a200720176a290300370300200220126a200720126a2903003703002005200520546a20191b2105200220546a2102206820546a206820191b226820264f0d04200b20054b0d000c040b0b206821020c010b202821020b204621050b20022005200b20056b220720072054706b10ce031a20752073206e6a360200206f20713602002070207020126a2072204e7320436a20517410cf031a207821682078204f4b0d0a0b206b0d060c010b20432168206b0d060b02402069450d00206a101d0b2044450d122045101d0c120b4188bfc30020722043104b000b4188bfc30020022043104b000b20712002102a000b2002200a102b000b410221020c0b0b410221020c0a0b410021770c050b410121770c050b410021020c060b410221020c050b410221020c040b410221020c030b410321020c020b410321020c010b410321020c000b0b0b206b206c102a000b20034180026a41086a22024200370300200342003703800241c59ec100411720034180026a1001200341b0016a41086a200229030037030020032003290380023703b0012003200341b0016a3602302003411036023420034190016a200341306a10a201200341a8026a41186a200341d8016a41186a290300370300200341a8026a41106a200341d8016a41106a290300370300200341a8026a41086a200341d8016a41086a290300370300200320032903d8013703a802200341306a200641e00010ce031a4118101f2202450d01200241106a41002900ec9e41370000200241086a41002900e49e41370000200241002900dc9e41370000200241184138101e2202450d02200220032903a802370018200241306a200341a8026a41186a290300370000200241286a200341a8026a41106a290300370000200241206a200341a8026a41086a29030037000020034180026a41086a2201420037030020034200370380022002413820034180026a1001200341b0016a41086a200129030037030020032003290380023703b00120034100360288022003420137038002200341306a20034180026a10b2012003280284022101200341b0016a41102003280280022205200328028802100302402001450d002005101d0b2002101d200341306a103c200341306a41186a200341d8016a41186a290300370300200341306a41106a200341d8016a41106a290300370300200341306a41086a200341d8016a41086a290300370300200320032903d8013703304120101f2202450d03200220032903d002370000200241186a200341d0026a41186a290300370000200241106a200341d0026a41106a290300370000200241086a200341d0026a41086a290300370000411c101f2201450d04200141186a41002800a0a141360000200141106a4100290098a141370000200141086a4100290090a14137000020014100290088a1413700002001411c413c101e2201450d052001200329033037001c200141346a200341c8006a2903003700002001412c6a200341c0006a290300370000200141246a200341306a41086a29030037000020034180026a41086a2205420037030020034200370380022001413c20034180026a1001200341b0016a41086a200529030037030020032003290380023703b001200341003602b002200342013703a802200341013602800220034180026a200341a8026a106202400240024020032802ac02220d20032802b00222076b41204f0d00200741206a22052007490d03200d410174220e20052005200e491b220e4100480d03200d450d0120032802a802200d200e101e2205450d020c090b20032802a80221050c090b200e101f22050d070b200e41011020000b1021000b411841011020000b413841011020000b412041011020000b411c41011020000b413c41011020000b2003200e3602ac02200320053602a802200e210d0b200520076a220e2002290000370000200e41186a200241186a290000370000200e41106a200241106a290000370000200e41086a200241086a290000370000200341b0016a41102005200741206a10030240200d450d002005101d0b2001101d2002101d200341306a41186a200341d8016a41186a290300370300200341306a41106a200341d8016a41106a290300370300200341306a41086a200341d8016a41086a290300370300200341d8006a200341d0026a41086a290300370300200341e0006a200341d0026a41106a290300370300200341e8006a200341d0026a41186a290300370300200320032903d801370330200320032903d002370350200341013a00a802024002400240411b101f2202450d00200241176a41002800d39041360000200241106a41002900cc9041370000200241086a41002900c49041370000200241002900bc90413700002002411b413b101e2202450d012002200329033037001b200241336a200341306a41186a2903003700002002412b6a200341306a41106a290300370000200241236a200341306a41086a2903003700002002413b41f600101e2202450d022002200341306a41206a220129000037003b200241d3006a200141186a290000370000200241cb006a200141106a290000370000200241c3006a200141086a29000037000020034180026a41086a220142003703002003420037038002200241db0020034180026a1001200341b0016a41086a200129030037030020032003290380023703b001200341b0016a4110200341a8026a410110032002101d0240200328029401450d00200328029001101d0b2006101d410021070c080b411b41011020000b413b41011020000b41f60041011020000b0240201d450d00201c101d0b200320253602382003201e3602342003201f3602300b20034180026a41086a22024200370300200342003703800241c59ec100411720034180026a1001200341b0016a41086a200229030037030020032003290380023703b001200341103602ac022003200341b0016a3602a802200341306a200341a8026a10a2010240201e450d00201f101d0b200341306a41186a200341086a41186a290300370300200341306a41106a200341086a41106a290300370300200341306a41086a200341086a41086a2903003703002003200329030837033002400240024002400240411c101f2202450d00200241186a41002800a0a141360000200241106a4100290098a141370000200241086a4100290090a14137000020024100290088a1413700002002411c413c101e2202450d012002200329033037001c200241346a200341306a41186a22052903003700002002412c6a200341306a41106a2207290300370000200241246a200341306a41086a220e29030037000020034180026a41086a220d420037030020034200370380022002413c20034180026a1001200341a8026a41086a200d29030037030020032003290380023703a802200341a8026a411010092002101d2005200341086a41186a2903003703002007200341086a41106a290300370300200e200341086a41086a290300370300200320032903083703304118101f2202450d02200241106a41002900ec9e41370000200241086a41002900e49e41370000200241002900dc9e41370000200241184138101e2202450d0320022003290330370018200241306a200341c8006a290300370000200241286a200341306a41106a290300370000200241206a200341306a41086a2903003700004200210c20034180026a41086a2205420037030020034200370380022002413820034180026a1001200341a8026a41086a200529030037030020032003290380023703a802200341a8026a411010092002101d20054200370300200342003703800241dfd9c000411520034180026a1001200341b0016a41086a200529030037030020032003290380023703b001024002400240024002400240200341b0016a411041f8b3c200410041001002417f460d00200342103702ac022003200341b0016a3602a802200341306a200341a8026a10a40120032802302217450d0a2003290234220c422088a722020d010c020b410821174200422088a72202450d010b200241286c210e200341d0006a210720172105034020072005290000370000200341306a41186a220d200341086a41186a290300370300200341306a41106a220f200341086a41106a290300370300200341306a41086a2212200341086a41086a290300370300200741086a2210200541086a290000370000200741106a2211200541106a290000370000200741186a2247200541186a29000037000020032003290308370330411b101f2202450d02200241176a41002800d39041360000200241106a41002900cc9041370000200241086a41002900c49041370000200241002900bc90413700002002411b413b101e2202450d032002200329033037001b200241336a200d2903003700002002412b6a200f290300370000200241236a20122903003700002002413b41f600101e2202450d04200541286a21052002200729000037003b200241d3006a2047290000370000200241cb006a2011290000370000200241c3006a201029000037000020034180026a41086a220d42003703002003420037038002200241db0020034180026a1001200341a8026a41086a200d29030037030020032003290380023703a802200341a8026a411010092002101d200e41586a220e0d000b0b200ca7450d092017101d0c090b411b41011020000b413b41011020000b41f60041011020000b411c41011020000b413c41011020000b411841011020000b413841011020000b41df88c0004133103a000b2006103c2006101d0c020b4100210720044101470d010b200141046a2802002202103c2002101d0b2000200536020420002007360200200341f0026a24000b8b0303027f017e057f230041306b220124004108210242002103200141206a41086a220442003703002001420037032041dfd9c0004115200141206a1001200141086a200429030037030020012001290320370300024002402001411041f8b3c200410041001002417f460d002001421037021420012001360210200141206a200141106a10a40120012802202202450d01200129022421030b20022003422088a7220541286c6a210620022104024002400340200620046b419f014d0d014101210720042000460d0220042000412010d003450d02200441286a22082000460d0220082000412010d003450d02200441d0006a22082000460d0220082000412010d003450d02200441f8006a22082000460d02200441a0016a210420082000412010d0030d000c020b0b024020062004460d002002200541286c6a210803404101210720002004460d0220042000412010d003450d022008200441286a2204470d000b0b410021070b02402003a7450d002002101d0b200141306a240020070f0b41df88c0004133103a000b990302027f017e230041306b2202240002400240411c101f2203450d00200341186a410028008c9f41360000200341106a41002900849f41370000200341086a41002900fc9e41370000200341002900f49e413700002003411c413c101e2203450d012003200129000037001c200341346a200141186a2900003700002003412c6a200141106a290000370000200341246a200141086a290000370000200241206a41086a22014200370300200242003703202003413c200241206a1001200241086a2001290300370300200220022903203703000240024002402002411041f8b3c200410041001002417f460d002002200236021020024110360214200242003703202002410020024110200241206a41084100100222012001417f461b2201410820014108491b360218200141074d0d0220022903202104200241206a200241106a105e20022802202201450d022000200229022437020c20002001360208200020043703000c010b200041003602080b2003101d200241306a24000f0b41df88c0004133103a000b411c41011020000b413c41011020000b130020004102360204200041b8bfc3003602000b130020004104360204200041c1a4c1003602000b130020004101360204200041d8c0c3003602000b970101057f230041206b22022400200241186a22034200370300200241106a22044200370300200241086a220542003703002002420037030002404120101f2206450d0020062002290300370000200042a0808080800437020420002006360200200641186a2003290300370000200641106a2004290300370000200641086a2005290300370000200241206a24000f0b412041011020000b3802017f017e230041106b220324002003200210eb01200329030021042000200341086a29030037030820002004370300200341106a24000b870101027f230041106b22062400024002402003450d0020032802082107200328020021032006410036020c20032007200420052006410c6a10132104200628020c2203417f460d012000200336020420002004360200200041086a2003360200200641106a24000f0b20004100360200200641106a24000f0b20004100360200200641106a24000b962707057f017e0b7f037e087f017e0a7f23004180036b22022400200241286a4200370300200242003703202002420037031820012802082103200128020021040240024020012802042205450d002005210620042101034020012802800921012006417f6a22060d000b0340200420042f01064102746a4180096a28020021042005417f6a22050d000c020b0b200421010b200241306a411c6a20042f0106360200200241306a41186a4100360200200241306a41146a2004360200200220033602502002410036024020024200370338200220013602342002410036023020024198016a200241306a10d60202400240024002400240024002400240024002400240024002400240024020022903b80122074202520d00200241306a103b0c010b200241e0026a4101722108200241dd016a2109200241c8016a210a20024198016a41286a210b200241d0016a210c20024198016a41c0006a210d200241dc016a210e20024198016a41206a210f20024198016a411c6a211020024198016a41146a2111200241e0026a410c6a21120340200241f8006a41186a220420024198016a41186a2220290300370300200241f8006a41106a220520024198016a41106a221c290300370300200241f8006a41086a220620024198016a41086a221b290300370300200241d8006a41086a2203200941086a290000370300200241d8006a41106a221d200941106a290000370300200241d8006a41186a2221200941186a290000370300200220022903980137037820022009290000370358200a2903002113200b2903002114200c290300211e200d2802002122200e2d0000210120024180026a41186a2216200429030037030020024180026a41106a2217200529030037030020024180026a41086a221820062903003703002002200229037837038002200241a0026a41186a22232021290300370300200241a0026a41106a2221201d290300370300200241a0026a41086a221d2003290300370300200220022903583703a002024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020074201520d0020024198016a20024180026a2014201310ec0120202d0000210420022002290318200241186a41086a2205290300200241186a41106a2206290300200229039801201b290300201c29030010de012006200241106a29030037030020052002290308370300200220022903003703182004450d00201ea72104201e422088a72201450d01410020016b220521062004210103402001280290022101200641016a22060d000b0340200420042f01064102746a4190026a2802002104200541016a22050d000c030b0b024002400240024020220d00200141ff01714102470d00201ea72104201e422088a72201450d01410020016b220521062004210103402001280290022101200641016a22060d000b0340200420042f01064102746a4190026a2802002104200541016a22050d000c030b0b4116101f2204450d0b2004410e6a41002900aaf3412213370000200441086a41002900a4f34122143700002004410029009cf3412215370000200441164136101e2204450d0c20042002290380023700162004412e6a2016290300370000200441266a20172903003700002004411e6a2018290300370000200241d0026a41086a22194200370300200242003703d00220044136200241d0026a1001200241c0026a41086a221a2019290300370300200220022903d0023703c002200241c0026a411041f8b3c20041004100100221052004101d2005417f460d0220024198016a20024180026a1033201b2802002205450d0d201c280200210620024198016a410c6a280200211f2002290398012107200141ff01714102470d090c190b200421010b200f4100360200201020042f01063602002020410036020020112004360200201c4100360200201b42003703002002200136029c01200241003602980120024198016a10320c1b0b4200210720194200370300200242003703d00241c9f2c1004117200241d0026a1001201a2019290300370300200220022903d0023703c0020240200241c0026a411041f8b3c200410041001002417f460d002002420037039801200241c0026a411020024198016a41084100100241016a41084d0d0820022903980121070b20194200370300200242003703d00241c9f2c1004117200241d0026a1001201a2019290300370300200220022903d0023703c0022002200737039801200241c0026a411020024198016a410810034120101f2204450d0b2004200229038002370000200441186a2016290300370000200441106a2017290300370000200441086a20182903003700002004412041c000101e2204450d0c2004200742017c37002020204200370300201c4200370300201b420037030020024200370398012004412820024198016a1000200241e0026a41186a22062020290300370300200241e0026a41106a2203201c290300370300200241e0026a41086a2224201b29030037030020022002290398013703e0024120101f2205450d0d200520022903e002370000200541186a22252006290300370000200541106a22262003290300370000200541086a222720242903003700002004101d4116101f2204450d0e2004410e6a2013370000200441086a201437000020042015370000200441164136101e2204450d0f20042002290380023700162004412e6a2016290300370000200441266a20172903003700002004411e6a201829030037000020194200370300200242003703d00220044136200241d0026a1001201a2019290300370300200220022903d0023703c002201b41003602002002420137039801200241203602e002200241e0026a20024198016a1062200228029c012206201b28020022246b41204f0d02202441206a22032024490d232006410174221f20032003201f491b221f4100480d232006450d032002280298012006201f101e22030d040c100b200421010b200f2022360200201020042f01063602002020410036020020112004360200201c4100360200201b42003703002002200136029c01200241003602980120024198016a10320c180b20022802980121030c020b201f101f2203450d0c0b2002201f36029c012002200336029801201f21060b201b202441206a221f360200200320246a222841086a2027290000370000202841106a2026290000370000202841186a20252900003700002028200529000037000002400240024002402006201f6b41084f0d00201f41086a2224201f490d2120064101742228202420242028491b22284100480d212006450d01200320062028101e22030d020c0f0b202441286a21240c020b2028101f2203450d0d0b2002202836029c012002200336029801202821060b2003201f6a4200370000200241c0026a411020032024100302402006450d002003101d0b2004101d4120211f4200210741202106200141ff01714102460d100b200241e0026a41186a22042023290300370300200241e0026a41106a22032021290300370300200241e0026a41086a2221201d290300370300200220022903a0023703e002024020014101710d004113101f2204450d0c2004410f6a41002800d5f341360000200441086a41002900cef341370000200441002900c6f341370000200441134133101e2204450d0d20042002290380023700132004412b6a2016290300370000200441236a20172903003700002004411b6a201829030037000020194200370300200242003703d00220044133200241d0026a1001201a2019290300370300200220022903d0023703c002200241c0026a411010092004101d201ea72104201e422088a722010d110c120b20202004290300370300201c2003290300370300201b2021290300370300200220022903e002370398014113101f2204450d0d2004410f6a41002800d5f341360000200441086a41002900cef341370000200441002900c6f341370000200441134133101e2204450d0e20042002290380023700132004412b6a2016290300370000200441236a20172903003700002004411b6a201829030037000020194200370300200242003703d00220044133200241d0026a1001201a2019290300370300200220022903d0023703c002200241c0026a411020024198016a412010032004101d201ea72104201e422088a722010d100c110b41df88c0004133103a000b411641011020000b413641011020000b4190b3c400102c000b412041011020000b41c00041011020000b412041011020000b411641011020000b413641011020000b201f41011020000b202841011020000b411341011020000b413341011020000b411341011020000b413341011020000b201ea72104201e422088a72201450d010b410020016b2203211d2004210103402001280290022101201d41016a221d0d000b0340200420042f01064102746a4190026a2802002104200341016a22030d000c020b0b200421010b20042f01062103200f2022360200201020033602002020410036020020112004360200201c4100360200201b42003703002002200136029c012002410036029801200241e0026a20024198016a10d7022007211e024020022802e0022204450d000340200241e0026a41146a2802002120200241e0026a41106a28020021212012280200211d20022802e402212202400240024002400240200520062004200241e0026a41086a280200220141f8b3c200410041001014417f460d00200241003a00e0022005200620042001200241e0026a41014100101441016a222441014b221c450d0e02400240024020022d00e002222341037122034102470d00200241003602e002200220233a00e002200520062004200120084103201c101441016a4104490d1141044103202441014b1b211c20022802e00241027622030d010c020b024020034101470d00200241003b01e002200220233a00e002200520062004200120084101201c101441016a22034102490d11201c200341014b6a211c20022f01e0024102762203450d020c010b02402003450d00202341034b0d11200241003602e0022005200620042001200241e0026a4104201c101441016a41044d0d1120022802e0022203417f4c0d1241054104202441014b1b211c20030d010c020b20234102762203450d010b200310792223450d0d20034100200520062004200120232003201c1014221c201c417f461b221c201c20034b1b2003470d0e2023101d201e2003ad7d211e201d0d030c020b200520062004200141014100201c10141a0b201d0d010b2005200620042001101520220d010c020b2005200120042001201d20201016201e2020ad7c211e02402021450d00201d101d0b2022450d010b2004101d0b200241e0026a20024198016a10d70220022802e00222040d000b0b20024198016a103202400240201e2007510d004116101f2204450d0c2004410e6a2013370000200441086a201437000020042015370000200441164136101e2204450d0d20042002290380023700162004412e6a2016290300370000200441266a20172903003700002004411e6a201829030037000020194200370300200242003703d00220044136200241d0026a1001201a2019290300370300200220022903d0023703c002201b41003602002002420137039801200220063602e002200241e0026a20024198016a10620240024002400240200228029c012203201b280200221c6b20064f0d00201c20066a2201201c490d0f2003410174221d20012001201d491b221d4100480d0f2003450d012002280298012003201d101e22010d020c120b20022802980121010c020b201d101f2201450d100b2002201d36029c012002200136029801201d21030b201b201c20066a221d3602002001201c6a2005200610ce031a02400240024002402003201d6b41074b0d00201d41086a2206201d490d0f2003410174221c20062006201c491b22064100480d0f2003450d01200120032006101e22010d020c130b200321060c020b2006101f2201450d110b2002200636029c0120022001360298010b2001201d6a201e370000200241c0026a41102001201d41086a100302402006450d002001101d0b2004101d201f0d010c020b201f450d010b2005101d0b20024198016a200241306a10d602200f29030022074202520d000b4200211e20022903182107200241306a103b024020074200510d00200241d0026a41086a22044200370300200242003703d00241aeb9c0004116200241d0026a1001200241c0026a41086a22012004290300370300200220022903d0023703c002200241c0026a411041f8b3c200410041001002417f460d02200242003703a0012002420037039801200241c0026a411020024198016a4110410010022205417f460d0d2005410f4d0d0d200241a0016a2903002107200229039801211e0c030b200241206a290300200241286a2903008450450d0d0b200241206a10f50120024180036a24000f0b420021070b200241186a41086a2903002113200241186a41106a290300211420044200370300200242003703d00241aeb9c0004116200241d0026a100120012004290300370300200220022903d0023703c00220024200200720147d201e201354ad7d2214201e20137d2213201e56201420075620142007511b22041b3703a00120024200201320041b37039801200241c0026a411020024198016a4110100320024180036a24000f0b200341011020000b2023101d0b41df88c0004133103a000b102e000b1021000b411641011020000b413641011020000b201d41011020000b200641011020000b41df88c0004133103a000b41ecc4c300102c000b950603087f017e017f230041d0016b220224000240024020012802202203450d00200141206a2003417f6a36020020012802082104200128020c2203200128020422052f01064f0d01200241186a2206200520034105746a220741206a290000370300200241106a2208200741186a290000370300200241086a2209200741106a2900003703002002200741086a290000370300200241206a2005200341c8006c6a41e8026a41c80010ce031a2001410c6a200341016a360200200141086a2004360200200141046a2005360200200241e8006a41186a2006290300370300200241e8006a41106a2008290300370300200241e8006a41086a200929030037030020022002290300370368200241e8006a41206a200241206a41c80010ce031a2000200241e8006a41e80010ce031a200241d0016a24000f0b20004202370320200241d0016a24000f0b200128020021070240024020052802002203450d00200741016a210720053301044220862004ad84210a0c010b2004ad210a0b2005101d200aa7210402400240200a422088a7220620032f01064f0d00200321050c010b03400240024020032802002205450d00200741016a210720033301044220862004ad84210a0c010b2004ad210a0b2003101d200aa7210420052103200a422088a7220620052f01064f0d000b0b200241186a2208200520064105746a220341206a290000370300200241106a2209200341186a290000370300200241086a220b200341106a2900003703002002200341086a290000370300200241206a2005200641c8006c6a41e8026a41c80010ce031a200520064102746a4184096a2802002103024020074101460d00410120076b210503402003280280092103200541016a22050d000b0b200141003602002001410c6a4100360200200141086a2004360200200141046a2003360200200241e8006a41186a2008290300370300200241e8006a41106a2009290300370300200241e8006a41086a200b29030037030020022002290300370368200241e8006a41206a200241206a41c80010ce031a2000200241e8006a41e80010ce031a200241d0016a24000beb0503077f017e017f230041c0006b220224000240024020012802202203450d00200141206a2003417f6a36020020012802082104200128020c2203200128020422052f01064f0d01200241086a41086a220620052003410c6c6a220741106a2802003602002002200741086a290200370308200241186a41086a220820074194016a2802003602002007418c016a29020021092001410c6a200341016a360200200141086a2004360200200141046a200536020020022009370318200241286a41086a220320062802003602002002413c6a200828020036020020002002290308220937020020022002290318370234200041086a2003290300370200200041106a200241286a41106a29030037020020022009370328200241c0006a24000f0b20004100360200200241c0006a24000f0b200128020021070240024020052802002203450d00200741016a210720053301044220862004ad8421090c010b2004ad2109410021030b2005101d2009a72104024002402009422088a7220620032f01064f0d00200321050c010b03400240024020032802002205450d00200741016a210720033301044220862004ad8421090c010b2004ad2109410021050b2003101d2009a72104200521032009422088a7220620052f01064f0d000b0b200241086a41086a220820052006410c6c6a220341106a2802003602002002200341086a290200370308200241186a41086a220a20034194016a28020036020020022003418c016a290200370318200520064102746a4194026a2802002103024020074101460d00410120076b210503402003280290022103200541016a22050d000b0b200141003602002001410c6a4100360200200141086a2004360200200141046a2003360200200241286a41086a220320082802003602002002413c6a200a28020036020020002002290308220937020020022002290318370234200041086a2003290300370200200041106a200241286a41106a29030037020020022009370328200241c0006a24000be30301047f230041d0006b22032400024002404113101f2204450d002004410f6a41002800d5f341360000200441086a41002900cef341370000200441002900c6f341370000200441134133101e2204450d01200420022900003700132004412b6a200241186a290000370000200441236a200241106a2900003700002004411b6a200241086a290000370000200341306a41086a220242003703002003420037033020044133200341306a1001200341206a41086a200229030037030020032003290330370320024002400240200341206a411041f8b3c200410041001002417f460d00200341306a41186a4200370300200341306a41106a4200370300200341386a420037030020034200370330200341206a4110200341306a4120410010022202417f460d022002411f4d0d02200341186a2202200341306a41186a290300370300200341106a2205200341306a41106a290300370300200341086a2206200341306a41086a29030037030020032003290330370300200041013a000020002003290300370001200041096a2006290300370000200041116a2005290300370000200041196a20022903003700000c010b200041003a00000b2004101d200341d0006a24000f0b41df88c0004133103a000b411341011020000b413341011020000bc80202097f027e230041106b220324000240200128020022044100480d00200441ffffffff07460d002001200441016a2205360200200141046a2104200141086a28020021060240024003402004280200220841086a210920082f0106220741057421044100210a0240024003402004450d0120022009412010d003220b450d02200441606a2104200a41016a210a200941206a2109200b417f4a0d000b200a417f6a21070b2006450d022006417f6a2106200820074102746a4180096a21040c010b0b200841e8026a200a41c8006c6a2204450d002004280200450d00200441106a290300210c200441086a290300210d0c010b200320012802102002200141146a280200280214110100200341086a290300210c200128020021052003290300210d0b20012005417f6a3602002000200c3703082000200d370300200341106a24000f0b103f000b13002000410336020420004184c5c3003602000b130020004107360204200041e1acc1003602000b130020004108360204200041c0c6c3003602000b130020004105360204200041d8cdc3003602000b130020004108360204200041d3b5c1003602000b130020004108360204200041b4d1c3003602000b3201017f02404108101f2202450d0020004288808080800137020420002002360200200242013700000f0b410841011020000bd60904067f027e027f027e230041a0016b2202240020024180016a41186a2203420037030020024180016a41106a2204420037030020024180016a41086a220542003703002002420037038001200141002001280200200128020420024180016a41202001280208100222062006417f461b2206412020064120491b20012802086a220736020802400240024002402006411f4d0d00200241e0006a41186a22062003290300370300200241e0006a41106a22032004290300370300200241e0006a41086a220420052903003703002002200229038001370360200241c0006a41186a22052006290300370300200241c0006a41106a22062003290300370300200241c0006a41086a2203200429030037030020022002290360370340200241186a2005290300370300200241106a2006290300370300200241086a20032903003703002002200229034037030020024200370388012002420037038001200141086a220341002001280200200141046a220428020020024180016a41102007100222062006417f461b2206411020064110491b20032802006a22033602002006410f4d0d0120024180016a41086a22072903002108200229038001210920024180016a41186a220a420037030020024180016a41106a220b4200370300200742003703002002420037038001200141086a220541002001280200200428020020024180016a41202003100222062006417f461b2206412020064120491b20052802006a22033602002006411f4d0d02200241e0006a41186a2206200a290300370300200241e0006a41106a2204200b290300370300200241e0006a41086a220a20072903003703002002200229038001370360200241c0006a41186a22072006290300370300200241c0006a41106a22062004290300370300200241c0006a41086a2204200a29030037030020022002290360370340200241206a41186a2007290300370300200241206a41106a2006290300370300200241206a41086a20042903003703002002200229034037032020024200370388012002420037038001200541002001280200200141046a28020020024180016a41102003100222012001417f461b2201411020014110491b20052802006a3602002001410f4d0d0320024180016a41086a2201290300210c200229038001210d20024180016a41186a2206200241186a29030037030020024180016a41106a2203200241106a2903003703002001200241086a290300370300200241e0006a41086a2204200241206a41086a290300370300200241e0006a41106a2205200241206a41106a290300370300200241e0006a41186a2207200241206a41186a290300370300200220022903003703800120022002290320370360200041206a200c370300200041186a200d370300200041106a200837030020002009370308200041286a200229038001370300200041306a2001290300370300200041386a2003290300370300200041c0006a2006290300370300200041c8006a2002290360370300200041d0006a2004290300370300200041d8006a2005290300370300200041e0006a200729030037030020004201370300200241a0016a24000f0b20004200370300200241a0016a24000f0b20004200370300200241a0016a24000f0b20004200370300200241a0016a24000f0b20004200370300200241a0016a24000b822404027f027e087f037e230041b0056b2203240002400240024002400240024002400240024002400240024002400240024002400240024002402001280200417f6a220441044b0d00024002400240024002400240024002400240024002400240024002400240024020040e050004020301000b200141306a2903002105200141286a2903002106200341346a41026a200141076a2d00003a000020034190026a41086a200141186a29020037030020034190026a410d6a2001411d6a290000370000200320012f00053b01342003200141106a29020037039002200141086a28020021072001410c6a280200210820012d00042109200241096a2800002104200241056a280000210a20022d0001210b20022d00002101200341f0026a41026a220c200241046a2d00003a0000200341c0006a41086a220d200241156a290000370300200341c0006a410d6a220e2002411a6a2900003700002003200241026a2f01003b01f00220032002410d6a2900003703402001450d05410121010c060b41c190c200210a41c000210420022d0000450d20200241046a2802004104490d20200128020421044112101f2201450d10200141106a41002f00eaa8413b0000200141086a41002900e2a841370000200141002900daa841370000200141124124101e2201450d1120012004360012200341a0056a41086a22024200370300200342003703a00520014116200341a0056a1001200341c0006a41086a2002290300370300200320032903a005370340200341c0006a411041f8b3c20041004100100221022001101d2002417f460d0a200341a0056a41086a22014200370300200342003703a00541bcbcc1004112200341a0056a1001200341b0046a41086a2001290300370300200320032903a0053703b00441002101200341b0046a411041f8b3c200410041001002417f460d0c200342103702b4012003200341b0046a3602b001200341c0006a200341b0016a10aa0120032802402202450d17200320032902442206370244200320023602402006a72006422088a72201460d0d0c190b20022d000120022d0000720d02200141186a2903002106200141106a2903002105200141086a2802002104200141206a290300210f20012802042102200341a0056a41086a22014200370300200342003703a0054191bdc1004115200341a0056a1001200341b0046a41086a2001290300370300200320032903a0053703b0044104101f2201450d1320012002360000200341b0046a41102001410410032001101d200341a0056a41086a22014200370300200342003703a00541f5bcc100411c200341a0056a1001200341b0046a41086a22022001290300370300200320032903a0053703b0042003200637034820032005370340200341b0046a4110200341c0006a4110100320014200370300200342003703a00541a8bcc1004114200341a0056a100120022001290300370300200320032903a0053703b0042003200f370340200341b0046a4110200341c0006a4108100320014200370300200342003703a00541cebcc100410d200341a0056a100120022001290300370300200320032903a0053703b0044104101f2201450d1420012004360000200341b0046a41102001410410032001101d0c190b41c190c200210a41c000210420022d0000450d1e200241046a2802004102490d1e200128020421024112101f2201450d10200141106a41002f00eaa8413b0000200141086a41002900e2a841370000200141002900daa841370000200141124124101e2201450d1120012002360012200341a0056a41086a22024200370300200342003703a00520014116200341a0056a1001200341b0046a41086a2002290300370300200320032903a0053703b004200341b0046a411041f8b3c200410041001002417f460d07200342103702a4052003200341b0046a3602a005200341c0006a200341a0056a10e10220032903404201520d1420032802482102200341c0046a200341cc006a41dc0010ce031a200341b0046a41101009200341d0036a200341c0046a41dc0010ce031a200341f0026a200341d0036a41dc0010ce031a2001101d20034190026a200341f0026a41dc0010ce031a200320023602b001200341b0016a41047220034190026a41dc0010ce031a200341206a200341d0016a20032903c001200341c8016a29030010f2012003290320200341286a29030010f3010c180b20022d000120022d000072450d040b41c9b4c000210a412821040c1c0b200341a0056a41026a200c2d00003a0000200341d0036a41086a200d290300370300200341d0036a410d6a200e290000370000200320032f01f0023b01a005200320032903403703d00341012101200b41ff01714101470d00200341f0026a41026a200341a0056a41026a2d00003a0000200341c0006a41086a200341d0036a41086a290300370300200341c0006a410d6a200341d0036a410d6a290000370000200320032f01a0053b01f002200320032903d003370340410021010c010b41f1b4c000210a412a21040b200341b0046a41026a2202200341f0026a41026a2d00003a0000200341c0046a41086a220b200341c0006a41086a220c290300370300200341c0046a41106a200341c0006a41106a290300370300200320032f01f0023b01b004200320032903403703c00420010d19200341c3016a200b290300370000200341c8016a200341c0046a410d6a290000370000200320032f01b0043b01b001200320043600b7012003200a3600b301200320032903c0043700bb01200320022d00003a00b2012002200341346a41026a2d00003a0000200c20034190026a41086a290300370300200341c0006a410d6a220120034190026a410d6a290000370000200320032f01343b01b0042003200329039002370340200941ff01714101470d01200341a0056a200741067610b00120032802a005210220032802a8052007413f7122014d0d042003419c056a41026a200220014105746a220141026a2d00003a0000200341d8036a200141136a290000370300200341dd036a200141186a290000370000200320012f00003b019c052003200129000b3703d00320012800072108200128000321074101210120032802a405450d150c140b200141086a2903002106200141106a2903002105200341a0056a41086a22014200370300200342003703a00541cea8c100410c200341a0056a1001200341b0046a41086a2001290300370300200320032903a0053703b0042003200537034820032006370340200341b0046a4110200341c0006a411010030c120b2003419c056a41026a200341b0046a41026a2d00003a0000200341d0036a41086a200341c0006a41086a290300370300200341d0036a410d6a2001290000370000200320032f01b0043b019c05200320032903403703d0030c140b200341d0036a200341c0046a41dc0010ce031a2001101d0b41bcbdc100210a411921040c150b4100210120032802a4050d0f0c100b2003410036024820034204370340410421020b200141016a220a2001490d0120014101742207200a200a2007491b220aad4202862206422088a70d012006a722074100480d01024002402001450d00200220014102742007101e2202450d010c0c0b2007101f22020d0b0b200741041020000b200341d4006a4101360200200341183602b401200341c0adc4003602b00120034201370244200341c8adc4003602402003200341b0016a360250200341c0006a4194d9c30010cf01000b1021000b411241011020000b412441011020000b411241011020000b412441011020000b410441011020000b410441011020000b41df88c0004133103a000b41df88c0004133103a000b2003200a36024420032002360240200341c8006a28020021010b200341c8006a200141016a360200200220014102746a2004360200200341c0006a10ab012003280244450d002002101d0b4100210a0c040b2002101d0b20010d004101210141d7c0c1002107411521080c010b200341a0056a41026a2003419c056a41026a2d00003a0000200341c0006a41086a200341d0036a41086a290300370300200341c0006a410d6a200341d0036a410d6a290000370000200320032f019c053b01a005200320032903d003370340410021010b2003413c6a41026a2202200341a0056a41026a2d00003a0000200341c0046a41086a2204200341c0006a41086a290300370300200341c0046a41106a200341c0006a41106a290300370300200320032f01a0053b013c200320032903403703c00402402001450d00200821042007210a0c020b200341386a41026a20022d00003a0000200341f0026a41086a2004290300370300200341f0026a410d6a200341c0046a410d6a290000370000200320032f013c3b0138200320032903c0043703f002200341a0056a41086a22014200370300200342003703a00541f5bcc100411c200341a0056a1001200341b0046a41086a2001290300370300200320032903a0053703b004024002400240024002400240024002400240200341b0046a411041f8b3c200410041001002417f460d002003420037034820034200370340200341b0046a4110200341c0006a4110410010022201417f460d022001410f4d0d02200341c8006a290300210f200329034021100c010b420021104200210f0b200341a0056a41086a22014200370300200342003703a0054191bdc1004115200341a0056a1001200341b0046a41086a2001290300370300200320032903a0053703b004024002400240200341b0046a411041f8b3c200410041001002417f460d0020034100360240200341b0046a4110200341c0006a41044100100241016a41044d0d02200335024021110c010b420021110b200341086a200642002011420010d203200341186a200341b0016a201042edeb82bdef9804200329030842c0843d8020032903104200521b22112011201054200f420052200f501b22011b2210200f420020011b220f10cc0102402003280218450d0041dbbcc100210a411a21040c0a0b200341a0056a41086a22014200370300200342003703a00541a6bdc1004116200341a0056a1001200341b0046a41086a2001290300370300200320032903a0053703b004410021020240200341b0046a411041f8b3c200410041001002417f460d0020034100360240200341b0046a4110200341c0006a41044100100241016a41044d0d03200328024021020b200341a0056a41086a22014200370300200342003703a00541a6bdc1004116200341a0056a1001200341b0046a41086a2001290300370300200320032903a0053703b0042003200241016a360240200341b0046a4110200341c0006a41041003200341c0006a41186a200341b0016a41186a290300370300200341c0006a41106a200341b0016a41106a290300370300200341c0006a41086a200341b0016a41086a290300370300200341c0046a41086a200341f0026a41086a290300370300200341c0046a410d6a200341f0026a410d6a290000370000200320032903b001370340200320032f01383b01d00320032003413a6a2d00003a00d203200320032903f0023703c0044112101f2201450d03200141106a41002f00eaa8413b0000200141086a41002900e2a841370000200141002900daa841370000200141124124101e2204450d0420042002360012200341a0056a41086a22014200370300200342003703a00520044116200341a0056a1001200341b0046a41086a2001290300370300200320032903a0053703b0044120101f2201450d0520012003290340370000200141186a200341c0006a41186a290300370000200141106a200341c0006a41106a290300370000200141086a200341c0006a41086a2903003700002001412041c000101e2201450d0620012006370020200141286a2005370000200141c000418001101e2201450d0720012010370050200120032f01d0033b00302001200836003720012007360033200120032903c00437003b200141d8006a200f370000200141326a20032d00d2033a0000200141c3006a200341c0046a41086a290300370000200141c8006a200341cd046a290000370000200341b0046a4110200141e00010032001101d2004101d200341cc006a20023602004100210a200341c0006a41086a41003a00002003410a3a0040200341c0006a108b010c080b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b411241011020000b412441011020000b412041011020000b41c00041011020000b41800141011020000b0b200020043602042000200a360200200341b0056a24000bcf0202027f017e23004180016b22022400200028020021000240024002400240200128020022034110710d002000290300210420034120710d01200441012001108b02210020024180016a240020000f0b200029030021044180012100024003402000450d01200220006a417f6a2004a7410f712203413072200341d7006a2003410a491b3a00002000417f6a2100200442048822044200520d000b0b20004181014f0d012001410141d6b6c2004102200220006a41800120006b108c02210020024180016a240020000f0b4180012100024003402000450d01200220006a417f6a2004a7410f712203413072200341376a2003410a491b3a00002000417f6a2100200442048822044200520d000b0b20004181014f0d012001410141d6b6c2004102200220006a41800120006b108c02210020024180016a240020000f0b2000418001102a000b2000418001102a000b130020004100360204200041f8b3c2003602000b130020004107360204200041ebc1c1003602000b130020004102360204200041f0dac3003602000b7301017f02400240410f101f2202450d00200241076a41002900b4bf41370000200241002900adbf413700002002410f411e101e2202450d012002200036000f20024113200110e8022002101d0240200141046a280200450d002001280200101d0b0f0b410f41011020000b411e41011020000bb30301057f230041306b22032400200341206a41086a220442003703002003420037032020002001200341206a1001200341086a41086a20042903003703002003200329032037030820034100360228200342013703202002280200210020032002280208220236021c2003411c6a200341206a106202400240024002402002450d002002410574210520042802002102200328022021062003280224210103400240024002400240200120026b41204f0d00200241206a22042002490d0720014101742207200420042007491b22074100480d072001450d01200620012007101e22060d020c080b200241206a21040c020b2007101f2206450d060b200721010b200620026a22022000290000370000200241186a200041186a290000370000200241106a200041106a290000370000200241086a200041086a29000037000020042102200041206a2100200541606a22050d000b200341286a200436020020032001360224200320063602200c010b2004280200210420032802242101200328022021060b200341086a411020062004100302402001450d002006101d0b200341306a24000f0b1021000b200741011020000bc20602027f047e230041e0006b22032400200341386a41086a220442003703002003420037033841f1f2c1004116200341386a1001200341d0006a41086a20042903003703002003200329033837035002400240024002400240200341d0006a411041f8b3c200410041001002417f460d0020034200370338200341d0006a4110200341386a41084100100241016a41084d0d02200329033821050c010b42c0843d21050b42002106200341386a41086a220442003703002003420037033841e0f2c1004111200341386a1001200341d0006a41086a2004290300370300200320032903383703500240200341d0006a411041f8b3c200410041001002417f460d0020034200370338200341d0006a4110200341386a41084100100241016a41084d0d02200329033821060b0240200520067d20025a0d00200041ebbec10036020420004101360200200041086a411b360200200341e0006a24000f0b42002105200341386a41086a220442003703002003420037033841d9f3c1004111200341386a1001200341d0006a41086a20042903003703002003200329033837035002400240200341d0006a411041f8b3c200410041001002417f460d002003420037034020034200370338200341d0006a4110200341386a4110410010022204417f460d042004410f4d0d04200341c0006a2903002105200329033821060c010b420121060b200341186a200542002002420010d203200341286a200242002006420010d203200341086a420042002006420010d20302402003290310200329032084420052200341286a41086a2903002207200329030820032903187c7c220820075472450d0020004186bfc10036020420004101360200200041086a4127360200200341e0006a24000f0b200341386a200120032903282008410810f001024020032802384101470d002000200329023c37020420004101360200200341e0006a24000f0b20032903402107200041306a200341386a41106a290300370300200041286a2007370300200041206a2005370300200041186a2006370300200041106a2002370300200041086a200237030020004100360200200341e0006a24000f0b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000bff0603037f047e037f23002202210320024180026b416071220224002001411c6a22042902002105200420022903b801370200200141146a22042902002106200420022903b0013702002001410c6a22042902002107200420022903a801370200200241003a00a00120012902042108200120022903a00137020420022005370338200220063703302002200737032820022008370320200141246a2d00002109200241a0016a41176a22042002290038370000200241a0016a41106a220a2002290031370300200241a0016a41086a220b2002290029370300200220022900213703a001024002400240024002402008a741ff01714101470d00200241176a2004290000370000200241106a200a290300370300200241086a200b290300370300200220022903a0013703004112101f2204450d01200441106a41002f00ddc5413b0000200441086a41002900d5c541370000200441002900cdc541370000200441124132101e2204450d0220042002290300370012200420093a0031200441296a200241176a290000370000200441226a200241106a2903003700002004411a6a200241086a290300370000200241a0016a41086a220a4200370300200242003703a00120044132200241a0016a100120024180016a41086a200a290300370300200220022903a0013703800120024180016a411041f8b3c200410041001002417f460d032002421037029401200220024180016a36029001200241a0016a20024190016a10eb0220022d00b8014102460d04200241a0016a41086a290300210820022802b001210a20022903a0012105200241206a200241b9016a41c70010ce031a200241a0016a200241206a41c10010ce031a200241206a200241a0016a41c10010ce031a200141246a200241e0006a2d00003a00002001411c6a200241206a41386a290000370000200141146a200241206a41306a2900003700002001410c6a200241206a41286a2900003700002001200229004037000420002002290300370008200041106a200241086a290300370000200041186a200241106a2903003700002000411f6a200241176a290000370000200041306a2008370300200041286a2005370300200041386a200a360200200020093a0027200042013703002004101d200324000f0b20004200370300200324000f0b411241011020000b413241011020000b41a49ac20041d700103a000b41df88c0004133103a000bf10a03027f027e077f230041e0016b22022400200241186a200110d501024002402002280218450d00200228021c21032002200110ca022002290300a7450d00200241106a29030021042002290308210541002106200241003a00c00120012802002001280204200241c0016a410120012802081002210720012001280208200741016a41014b22076a22083602082007450d01024020022d00c0012207450d0020074101470d02200241c0016a41186a22094200370300200241c0016a41106a220a4200370300200241c0016a41086a220b4200370300200242003703c001200141086a220641002001280200200141046a280200200241c0016a41202008100222072007417f461b2207412020074120491b20062802006a22083602002007411f4d0d02200241a0016a41186a22072009290300370300200241a0016a41106a2206200a290300370300200241a0016a41086a2209200b290300370300200220022903c0013703a00120024180016a41186a220a200729030037030020024180016a41106a2207200629030037030020024180016a41086a22062009290300370300200220022903a00137038001200241e0006a41186a200a290300370300200241e0006a41106a2007290300370300200241e0006a41086a20062903003703002002200229038001370360410121060b200241c0006a41186a200241e0006a41186a290300370300200241c0006a41106a200241e0006a41106a290300370300200241c0006a41086a200241e0006a41086a2903003703002002200229036037034041002109200241003a00c0012001280200200141046a280200200241c0016a4101200810022107200141086a22082008280200200741016a41014b22076a22083602002007450d01024020022d00c0012207450d0020074101470d02200241c0016a41186a22094200370300200241c0016a41106a220a4200370300200241c0016a41086a220b4200370300200242003703c001200141086a220741002001280200200141046a280200200241c0016a41202008100222012001417f461b2201412020014120491b20072802006a3602002001411f4d0d02200241a0016a41186a22012009290300370300200241a0016a41106a2207200a290300370300200241a0016a41086a2208200b290300370300200220022903c0013703a00120024180016a41186a2209200129030037030020024180016a41106a2201200729030037030020024180016a41086a22072008290300370300200220022903a00137038001200241e0006a41186a2009290300370300200241e0006a41106a2001290300370300200241e0006a41086a20072903003703002002200229038001370360410121090b200241c0016a41186a2201200241e0006a41186a290300370300200241c0016a41106a2207200241e0006a41106a290300370300200241c0016a41086a2208200241e0006a41086a290300370300200220022903603703c001200241206a41186a220a200241c0006a41186a290300370300200241206a41106a220b200241c0006a41106a290300370300200241206a41086a220c200241c0006a41086a290300370300200220022903403703202000200437030820002005370300200020063a001820002003360210200041396a20093a000020002002290320370019200041216a200c290300370000200041296a200b290300370000200041316a200a2903003700002000413a6a20022903c001370100200041c2006a2008290300370100200041ca006a2007290300370100200041d2006a2001290300370100200041de006a200241a4016a2f01003b0100200041da006a20022801a001360100200241e0016a24000f0b200041023a0018200241e0016a24000f0b200041023a0018200241e0016a24000b960201017f024002400240024002400240024020004180104f0d00200041037641f8ffffff01714190b4c4006a21010c010b02402000418080044f0d00200041067641606a220141e0074f0d02200141a8b6c4006a2d0000220141c9004b0d0320014103744190c2c2006a21010c010b2000410c7641706a22014180024f0d0320014188bec4006a2d00004106742000410676413f7172220141ff034b0d04200141e0c6c2006a2d0000220141364b0d05200141037441e0cac2006a21010b200129030042012000413f71ad86834200520f0b4188c0c400200141e007104b000b4198c0c400200141ca00104b000b41a8c0c4002001418002104b000b41b8c0c4002001418004104b000b41c8c0c40020014137104b000b2701017f2000280200220128020020012802042000280204280200200028020828020010ee02000bd60801067f230041f0006b220424002004200336020c20042002360208410121052001210602402001418102490d00410020016b21074180022108024003400240200820014f0d00200020086a2c000041bf7f4a0d020b2008417f6a21064100210520084101460d02200720086a21092006210820094101470d000c020b0b41002105200821060b200420063602142004200036021020044100410520051b36021c200441f8b3c20041d8b6c20020051b360218024002400240200220014b22080d00200320014b0d00200220034b0d01024002402002450d0020012002460d00200120024d0d01200020026a2c00004140480d010b200321020b20042002360220024002402002450d0020022001460d00200141016a210903400240200220014f0d00200020026a2c000041404e0d020b2002417f6a210820024101460d0220092002462106200821022006450d000c020b0b200221080b20082001460d02410121064100210502400240200020086a22092c000022024100480d002004200241ff0171360224200441286a21020c010b200020016a220621010240200941016a2006460d00200941026a2101200941016a2d0000413f7121050b2002411f712109024002400240200241ff017141e001490d004100210020062107024020012006460d00200141016a210720012d0000413f7121000b20002005410674722101200241ff017141f001490d0141002102024020072006460d0020072d0000413f7121020b20014106742009411274418080f00071722002722201418080c400460d060c020b200520094106747221010c010b20012009410c747221010b2004200136022441012106200441286a21022001418001490d00410221062001418010490d0041034104200141808004491b21060b200420083602282004200620086a36022c200441ec006a4118360200200441e4006a4118360200200441c8006a41146a4121360200200441d4006a4122360200200441306a41146a4105360200200420023602582004410236024c20044205370234200441a8b3c4003602302004200441186a3602682004200441106a3602602004200441246a3602502004200441206a3602482004200441c8006a360240200441306a41d0b3c40010cf01000b20042002200320081b360228200441c8006a41146a4118360200200441d4006a4118360200200441306a41146a41033602002004410236024c20044203370234200441b8b2c4003602302004200441186a3602582004200441106a3602502004200441286a3602482004200441c8006a360240200441306a41d0b2c40010cf01000b200441e4006a4118360200200441c8006a41146a4118360200200441d4006a4102360200200441306a41146a41043602002004410236024c20044204370234200441e0b2c4003602302004200441186a3602602004200441106a36025820042004410c6a3602502004200441086a3602482004200441c8006a360240200441306a4180b3c40010cf01000b4190b3c400102c000b8008010b7f200028021021030240024002400240024002400240024002400240200028020822044101470d0020030d010c020b2003450d070b02402002450d00200120026a2105200041146a280200417f732106410021072001210320012108024002400340200341016a21090240024020032c0000220a4100480d00200a41ff0171210a20092103200641016a22060d010c030b02400240024020092005460d0020092d0000413f71210b200341026a22032109200a411f71210c200a41ff0171220a41e001490d010c020b4100210b20052103200a411f71210c200a41ff0171220a41e0014f0d010b200b200c41067472210a20092103200641016a22060d010c030b02400240024020032005460d00200341016a2209210d20032d0000413f71200b41067472210b200a41f001490d010c020b2005210d4100200b41067472210b200a41f0014f0d010b200b200c410c7472210a20092103200641016a22060d010c030b02400240200d2005460d00200d41016a2103200d2d0000413f71210a0c010b4100210a200921030b200b410674200c411274418080f0007172200a72220a418080c400460d03200641016a2206450d020b200720086b20036a21072003210820052003470d000c020b0b200a418080c400460d00024002402007450d0020072002460d0041002103200720024f0d01200120076a2c00004140480d010b200121030b2007200220031b21022003200120031b21010b2004450d020c010b410021022004450d010b4100210902402002450d002002210a200121030340200920032d000041c00171418001466a2109200341016a2103200a417f6a220a0d000b0b200220096b2000410c6a28020022064f0d014100210902402002450d00410021092002210a200121030340200920032d000041c00171418001466a2109200341016a2103200a417f6a220a0d000b0b200920026b20066a2109410020002d0030220320034103461b2203410371450d0220034102460d03410021080c040b2000280218200120022000411c6a28020028020c1100000f0b2000280218200120022000411c6a28020028020c1100000f0b20092108410021090c010b200941016a4101762108200941017621090b417f2103200041046a210a200041186a21062000411c6a210702400340200341016a220320094f0d012006280200200a2802002007280200280210110600450d000b41010f0b200041046a280200210941012103200041186a220a280200200120022000411c6a220628020028020c1100000d01200a280200210a417f2103200628020041106a210602400340200341016a220320084f0d01200a20092006280200110600450d000b41010f0b41000f0b2000280218200120022000411c6a28020028020c11000021030b20030b4e01017f230041206b22002400200041146a41013602002000411836021c200041c0adc40036021820004201370204200041c8adc4003602002000200041186a360210200041b0dac30010cf01000bb70503047f027e037f230041106b22022400200241003a000820012802002001280204200241086a410120012802081002210320012001280208200341016a41014b22046a22033602080240024002402004450d0002400240024020022d0008220541037122044102460d0020044101460d0120040d022005410276ad2106420121070c050b20024100360208200220053a0008200141086a220441002001280200200141046a280200200241086a41017241032003100222012001417f461b22014103200141034922011b20042802006a36020020010d022002280208410276ad2106420121070c040b200241003b0108200220053a00082001280200200141046a280200200241086a4101724101200310022103200141086a22012001280200200341016a220141014b6a36020020014102490d0120022f0108410276ad2106420121070c030b02400240200541027622044104460d0020040d01200141046a280200210420024100360208200141086a2205410020012802002004200241086a41042003100222012001417f461b22014104200141044922011b20052802006a36020020010d0220023502082106420121070c040b4200210720024200370308200141086a220441002001280200200141046a280200200241086a41082003100222012001417f461b22014108200141084922011b20042802006a36020020010d0220022903082106420121070c030b200441046a220841084b0d0042002106200141046a2109200141086a2105410021040340200241003a000820012802002009280200200241086a410120031002210320052005280200200341016a41014b220a6a2203360200200a450d0120023100082004410374413871ad86200684210642012107200441016a220441ff01712008490d000c030b0b420021070b0b2000200637030820002007370300200241106a24000bd00605057f017e017f027e037f230041306b22022400200241003a0020200241206a2001280200220320012802042204410047220510ce031a0240024002400240024020042005490d00200141046a200420056b22063602002001200320056a2205360200024002402004450d000240024020022d0020220341037122044102460d00024020044101460d0020040d022003410276ad21070c080b200241003a0020200241206a20052006410047220410ce031a20062004490d06200141046a200620046b3602002001200520046a3602002006450d0220022d002041087420037241fcff0371410276ad21070c070b200241003a001e200241003b011c2002411c6a200520064103200641034922081b220410ce031a200141046a200620046b3602002001200520046a36020020080d0120022f011c20022d001e41107472410874200372410276ad21070c060b0240024020034102762204410c460d00024020044104460d0020040d0220024100360220200241206a200520064104200641044922031b220410ce031a200141046a200620046b3602002001200520046a36020020030d03200235022021070c080b4200210a20024200370320200241206a200520064108200641084922031b220410ce031a200141046a200620046b3602002001200520046a36020020030d03200229032021070c070b4200210a2002420037032820024200370320200241206a200520064110200641104922031b220410ce031a200141046a200620046b3602002001200520046a36020020030d02200241286a2903002109200229032021074201210a0c070b200441046a220b41104b0d00200141046a210c200241106a210d4200210742002109410021030340200241003a0020200241206a20052006410047220410ce031a20062004490d04200c200620046b22083602002001200520046a22053602002006450d01200241086a20023100204200200341037441f8007110d303200d2903002009842109200229030820078421074201210a20082106200341016a22042103200441ff0171200b490d000c070b0b4200210a0b0c040b20052004102a000b20042006102a000b20042006102a000b420021094201210a0b200020073703082000200a370300200041106a2009370300200241306a24000b970a03017f027e057f230041e0006b22022400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200028020022002903002203423f56200041086a290300220442005220045022051b0d00200141046a280200200141086a2802002200470d01200041016a22052000490d1120004101742206200520052006491b22064100480d112000450d05200128020020002006101e2205450d060c190b20034280800154410020051b450d01200141046a2802002205200141086a28020022006b41024f0d02200041026a22062000490d1020054101742200200620062000491b22004100480d102005450d08200128020020052000101e2205450d090c160b200128020021050c180b200342808080800454410020051b450d01200141046a2802002205200141086a28020022006b41044f0d04200041046a22062000490d0e20054101742200200620062000491b22004100480d0e2005450d08200128020020052000101e22050d090c120b200128020021050c140b411020047920037942c0007c20044200521ba74103766b22074104490d0e200141046a280200200141086a2802002206470d03200641016a22052006490d0c20064101742208200520052008491b22054100480d0c2006450d09200128020020062005101e22080d0a0c110b2006101f22050d130b200641011020000b200128020021050c050b200128020021080c070b2000101f22050d0d0b200041011020000b2000101f2205450d090b20012005360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200520006a2003a7410274410272360000200241e0006a24000f0b2005101f2208450d070b20012008360200200141046a2005360200200141086a28020021060b200141086a2205200641016a360200200820066a200741027441736a3a0000200029030021032002200041086a290300220437030820022003370300200141046a210803400240024002400240200828020020052802002200470d00200041016a22062000490d0520004101742209200620062009491b22094100480d052000450d01200128020020002009101e22060d020c060b200128020021060c020b2009101f2206450d040b2001200636020020082009360200200528020021000b2005200041016a360200200620006a2003a73a000020034208882004423886842103200442088821042007417f6a22070d000b2002200337030020022004370308200320048450450d03200241e0006a24000f0b1021000b200941011020000b41e8dcc300102c000b20022002360240200241e0c2c100360244200241c8006a41146a4100360200200241286a41146a411c360200200241346a4123360200200241106a41146a4103360200200241f8b3c2003602582002420137024c200241d8dac3003602482002412336022c20024203370214200241e0b0c4003602102002200241c8006a3602382002200241c4006a3602302002200241c0006a3602282002200241286a360220200241106a4180ddc30010cf01000b200041011020000b200541011020000b20012005360200200141046a2000360200200141086a28020021000b200141086a200041026a360200200520006a2003a74102744101723b0000200241e0006a24000f0b20012005360200200141046a2006360200200141086a28020021000b200141086a200041016a360200200520006a2003a74102743a0000200241e0006a24000b8c0605027f027e017f027e027f230041a0016b22022400200028020021000240024002400240024002400240024002400240200128020022034110710d00200041086a29030021042000290300210520034120710d0120054290ce005441002004501b0d0241272100200241186a21060340200241106a200520044290ce00420010d1032002200229031022072006290300220842f0b17f427f10d203200241206a20006a2203417c6a200520022903007ca7220941e4006e220a41017441aab4c2006a2f00003b00002003417e6a200a419c7f6c20096a41017441aab4c2006a2f00003b0000200542ffc1d72f56210320044200522109200450210a2000417c6a2100200721052008210420032009200a1b0d000b2007a7220341e3004a0d030c060b200041086a2903002105200029030021044180012100024003402000450d01200241206a20006a417f6a2004a7410f712203413072200341d7006a2003410a491b3a00002000417f6a210020044204882005423c8684220420054204882205844200520d000b0b20004181014f0d032001410141d6b6c2004102200241206a20006a41800120006b108c022100200241a0016a240020000f0b4180012100024003402000450d01200241206a20006a417f6a2005a7410f712203413072200341376a2003410a491b3a00002000417f6a210020054204882004423c8684220520044204882204844200520d000b0b20004181014f0d032001410141d6b6c2004102200241206a20006a41800120006b108c022100200241a0016a240020000f0b412721002005a7220341e3004c0d030b200241206a2000417e6a22006a2003200341ffff037141e4006e2209419c7f6c6a41ffff037141017441aab4c2006a2f00003b0000200941094a0d030c040b2000418001102a000b2000418001102a000b2003220941094c0d010b200241206a2000417e6a22006a200941017441aab4c2006a2f00003b00000c010b200241206a2000417f6a22006a200941306a3a00000b2001410141f8b3c2004100200241206a20006a412720006b108c022100200241a0016a240020000bf40a040c7f027e027f077e23004190036b22022400200241086a2001280200200128020428020c1103000240024020022903084201520d00200241e4016a41046a2103200241a0026a41106a2104200241a0016a4101722105200241086a41086a2106200241a0026a41206a2107200241c4026a21082002419c026a21090340200241f8016a41186a220a200641186a290000370300200241f8016a41106a220b200641106a290000370300200241f8016a41086a220c200641086a290000370300200220062900003703f801200241a0016a200241f8016a10f60202400240024020022d00a0014101470d00200241f0026a41186a200541186a290000370300200241f0026a41106a200541106a290000370300200241f0026a41086a200541086a290000370300200220052900003703f002200241a0026a200241f0026a10c9022007280200220d450d01200241a0026a41086a290300210e20022903a002210f2008280200450d02200d101d0c020b200741003602000b4200210f4200210e0b20034200370200200341086a4200370200200241f0026a41186a220d200a290300370300200241f0026a41106a220a200b290300370300200241f0026a41086a2210200c290300370300200220022903f8013703f002200241a0026a41086a22114200370300200b200241e4016a41106a280200360200200c200241e4016a41086a290200370300200420022903f002370300200441086a2010290300370300200441106a200a290300370300200441186a200d290300370300200242003703a002200220022902e4013703f801427f2112024002400240200e42ffffffff0f560d00200f422088200e422086842212500d010b200241d0016a41106a200b280200360200200241d0016a41086a200c290300370300200241a0016a41086a2011290300370300200241a0016a41106a2004290300370300200241a0016a41186a200241a0026a41186a290300370300200241a0016a41206a2007290300370300200241a0016a41286a200241a0026a41286a290300370300200220022903f8013703d001200220022903a0023703a0012002200928000036009b01200220022800990236029801420021134100210b200f2114200e21150c010b4102210b2016210f2017210e201821120b20024180016a41106a200241d0016a41106a28020036020020024180016a41086a200241d0016a41086a290300370300200241d0006a41086a200241a0016a41086a290300370300200241d0006a41106a200241a0016a41106a290300370300200241d0006a41186a200241a0016a41186a290300370300200241d0006a41206a200241a0016a41206a290300370300200241d0006a41286a200241a0016a41286a290300370300200220022903d00137038001200220022903a0013703502002200228009b0136004b2002200228029801360248200b4102470d02200241086a2001280200200141046a28020028020c110300200f2116200e21172012211820022903084201510d000b0b200041023a00800120024190036a24000f0b200020143703102000200f370300200020123703402000410036022820004208370320200020022903800137022c20002002290350370350200041186a20153703002000200e370308200041c8006a2013370300200041346a20024180016a41086a2903003702002000413c6a20024180016a41106a280200360200200041d8006a200241d0006a41086a290300370300200041e0006a200241d0006a41106a290300370300200041e8006a200241d0006a41186a290300370300200041f0006a200241f0006a290300370300200041f8006a200241f8006a2903003703002000200b3a008001200020022802483600810120004184016a200228004b36000020024190036a24000bd10301047f230041d0006b2202240002400240410e101f2203450d00200341066a41002900b3c541370000200341002900adc5413700002003410e412e101e2203450d012003200129000037000e200341266a200141186a2900003700002003411e6a200141106a290000370000200341166a200141086a290000370000200241306a41086a22014200370300200242003703302003412e200241306a1001200241206a41086a200129030037030020022002290330370320024002400240200241206a411041f8b3c200410041001002417f460d00200241306a41186a4200370300200241306a41106a42003703002001420037030020024200370330200241206a4110200241306a4120410010022201417f460d022001411f4d0d02200241186a2201200241306a41186a290300370300200241106a2204200241306a41106a290300370300200241086a2205200241306a41086a29030037030020022002290330370300200041013a000020002002290300370001200041096a2005290300370000200041116a2004290300370000200041196a20012903003700000c010b200041003a00000b2003101d200241d0006a24000f0b41df88c0004133103a000b410e41011020000b412e41011020000b860100024002400240024002400240200041ff017122004101460d0020004102470d014101101f2200450d03200041023a00000c020b4101101f2200450d03200041013a00000c010b4101101f2200450d03200041003a00000b200128020020012802042000410110032000101d0f0b410141011020000b410141011020000b410141011020000bb20201027f230041106b22022400200241003602082002420137030002404120101f2203450d002003200029002c370000200341086a200041346a290000370000200341106a2000413c6a290000370000200341186a200041c4006a290000370000200242a08080808004370204200220033602002002200036020c2002410c6a200210f3022002200041106a36020c2002410c6a200210f302200028022021032002200041286a280200220036020c2002410c6a2002106202402000450d002003200041186c6a210003402002200336020c2002410c6a200210f302200341106a200210b1012000200341186a2203470d000b0b200228020421032001280200200128020420022802002200200241086a280200100302402003450d002000101d0b200241106a24000f0b412041011020000bfa0801067f230041106b220224002002410036020820024201370300200041106a200210622002200036020c2002410c6a200210f30220022802042103200228020821040240024002400240024002400240024002400240024002400240024002400240024020002d00184101470d0020032004470d01200441016a22032004490d0c20044101742205200320032005491b22034100480d0c2004450d03200228020020042003101e2205450d040c090b20032004470d01200441016a22032004490d0b20044101742205200320032005491b22034100480d0b2004450d04200228020020042003101e2205450d050c060b200228020021050c080b200228020021050c050b2003101f22050d050b200341011020000b2003101f22050d010b200341011020000b20022003360204200220053602000b200241086a200441016a2206360200200520046a41003a00000c020b20022003360204200220053602000b200241086a2206200441016a360200200520046a41013a00000240024002400240024020022802042203200628020022046b41204f0d00200441206a22062004490d0620034101742207200620062007491b22074100480d062003450d01200520032007101e2205450d020c030b200441206a21060c030b2007101f22050d010b200741011020000b2002200736020420022005360200200721030b200241086a2006360200200520046a220441086a200041216a290000370000200441106a200041296a290000370000200441186a200041316a2900003700002004200041196a2900003700000b024002400240024002400240024002400240200041396a2d00004101470d0020032006470d08200341016a22042003490d0920034101742207200420042007491b22044100480d092003450d01200520032004101e2205450d020c070b20032006470d05200341016a22002003490d0820034101742204200020002004491b22004100480d082003450d02200520032000101e2205450d030c040b2004101f22050d050b200441011020000b2000101f22050d010b200041011020000b20022000360204200220053602000b200241086a2200200641016a360200200520066a41003a0000200228020421042001280200200128020420022802002203200028020010032004450d060c050b20022004360204200220053602000b200241086a2203200641016a360200200520066a41013a000002400240024020022802042205200328020022046b41204f0d00200441206a22032004490d0320054101742206200320032006491b22064100480d032005450d01200228020020052006101e2203450d020c040b200228020021030c040b2006101f22030d020b200641011020000b1021000b2002200636020420022003360200200621050b200241086a200441206a2206360200200320046a220441086a200041c2006a290000370000200441106a200041ca006a290000370000200441186a200041d2006a29000037000020042000413a6a290000370000200128020020012802042003200610032005450d010b2003101d0b200241106a24000b13002000410f360204200041dcdec3003602000b130020004107360204200041dbd6c1003602000bb50707057f047e017f017e037f047e017f230041a0016b2202240020024180016a41186a2203420037030020024180016a41106a2204420037030020024180016a41086a220542003703002002420037038001200141002001280200200128020420024180016a41202001280208100222062006417f461b2206412020064120491b20012802086a3602080240024002400240024002400240024002400240024002402006411f4d0d00200241e0006a41186a2003290300370300200241e0006a41106a2004290300370300200241e0006a41086a20052903003703002002200229038001370360200241c8006a200110ca022002290348a7450d01200241c8006a41106a290300210720022903502108200241306a200110ca022002290330a7450d02200241c0006a29030021092002290338210a200241286a200110d5012002280228450d09200228022c220bad42187e220c422088a70d05200ca72206417f4c0d052006450d032006101f220d450d06200b450d040c070b20004100360220200241a0016a24000f0b20004100360220200241a0016a24000f0b20004100360220200241a0016a24000f0b4108210d200b0d030b4100210f4200210c0c030b102e000b200641081020000b4200210c200241106a41106a210e410021054100210441002103200b210f02400340200241106a200110ca022002290310a7450d01200e2903002110200229031821112002200110f1022002290300a7450d01200341016a21062002290308211202402003200f470d002005200620062005491b220fad42187e2213422088a70d052013a722144100480d0502402003450d00200d20042014101e220d0d010c070b2014101f220d450d060b200d20046a2203201037030820032011370300200341106a2012370300200c4280808080107c210c200541026a2105200441186a2104200621032006200b490d000c020b0b200f450d01200d101d0c010b200d450d0020024180016a41186a2201200241e0006a41186a29030037030020024180016a41106a2206200241e0006a41106a29030037030020024180016a41086a2203200241e0006a41086a2903003703002002200229036037038001200041186a20093703002000200a37031020002007370308200020083703002000200c200fad843702242000200d3602202000412c6a200229038001370200200041346a20032903003702002000413c6a2006290300370200200041c4006a2001290300370200200241a0016a24000f0b20004100360220200241a0016a24000f0b1021000b201441081020000b13002000411836020420004198eac3003602000bf30301087f230041c0006b22022400200241186a4200370300200241106a22034200370300200241086a4200370300200241286a22044100360200200242003703002002420837032020024100360238200242013703302002200236023c2002413c6a200241306a10f3022002200336023c2002413c6a200241306a10f3022002280220210320022004280200220436023c2002413c6a200241306a10620240024002402004450d00200441306c2105200241306a41086a21060340024002400240024020022802342207200628020022046b41204f0d00200441206a22082004490d0620074101742209200820082009491b22094100480d062007450d01200228023020072009101e22070d020c070b200441206a2108200228023021070c020b2009101f2207450d050b20022009360234200220073602300b20062008360200200720046a220441086a200341186a290000370000200441106a200341206a290000370000200441186a200341286a2900003700002004200341106a2900003700002002200336023c2002413c6a200241306a10f302200341306a2103200541506a22050d000b0b20002002290330370200200041086a200241306a41086a2802003602000240200241246a280200450d00200241206a280200101d0b200241c0006a24000f0b1021000b200941011020000b7101017f230041306b220224002002420037031020024200370308200241033602182002410036022820024201370320200241186a200241206a10622002200241086a36022c2002412c6a200241206a10f302200041086a200228022836020020002002290320370200200241306a24000b3301017f02404108101f2202450d0020004288808080800137020420002002360200200242e8073700000f0b410841011020000b3401017f02404104101f2202450d0020004284808080c00037020420002002360200200241c0843d3600000f0b410441011020000b3201017f02404104101f2202450d0020004284808080c000370204200020023602002002413c3600000f0b410441011020000b3201017f02404104101f2202450d0020004284808080c00037020420002002360200200241043600000f0b410441011020000beb0504017f037e057f017e230041b0016b22032400200241106a290300210420024188016a290300210520022903082106200228020021072003200241186a41f00010ce0321022001280200210820024190016a41186a2209200241e8006a29030037030020024190016a41106a220a200241e0006a29030037030020024190016a41086a220b200241d8006a290300370300200220022903503703900102400240024041d000101f2201450d00200142003703002001410036022420012007360220200141003a0048200141186a4200370300200141106a4200370300200141086a42003703002001200241d0006a2203290300370328200141306a200341086a290300370300200141386a200341106a290300370300200141c0006a200341186a290300370300200241f0006a41086a200b290300370300200241f0006a41106a200a290300370300200241f0006a41186a200929030037030020022002290390013703700240024002400240200841046a28020020082802082203470d00200341016a22072003490d0320034101742209200720072009491b2209ad42d0007e220c422088a70d03200ca7220a4100480d032003450d012008280200200341d0006c200a101e2207450d020c050b200828020021070c050b200a101f22070d030b200a41081020000b1021000b41d00041081020000b20082007360200200841046a2009360200200841086a28020021030b2007200341d0006c6a220342003703102003420037030820032006422088200442208684427f2004428080808010541b370300200320013602202003200229037037022c200341186a4200370300200341246a428180808010370200200341c4006a200241f0006a41186a2903003702002003413c6a200241f0006a41106a290300370200200341346a200241f0006a41086a290300370200200841086a2201200128020041016a3602002000200437030820002006370300200041106a200241f00010ce031a2000200537038001200241b0016a24000b0900200042003702000bc50603037f047e037f23002202210320024180026b416071220224002001411c6a22042902002105200420022903b801370200200141146a22042902002106200420022903b0013702002001410c6a22042902002107200420022903a801370200200241003a00a00120012902042108200120022903a00137020420022005370358200220063703502002200737034820022008370340200141246a2d00002109200241a0016a41176a22042002290058370000200241a0016a41106a220a2002290051370300200241a0016a41086a220b2002290049370300200220022900413703a00102400240024002402008a741ff01714101470d00200241106a41176a2004290000370000200241106a41106a200a290300370300200241106a41086a200b290300370300200220022903a0013703104112101f2204450d01200441106a41002f00cbc5413b0000200441086a41002900c3c541370000200441002900bbc541370000200441124132101e2204450d0220042002290310370012200420093a0031200441296a200241106a41176a220a290000370000200441226a200241106a41106a2903003700002004411a6a200241106a41086a290300370000200241a0016a41086a220b4200370300200242003703a00120044132200241a0016a1001200241c0006a41086a200b290300370300200220022903a001370340200241a0016a200241c0006a105d20022d00ac014102460d03200241c0006a200241a0016a41d00010ce031a200241306a41086a220b200241c0006a41086a28020036020020022002290340370330200241a0016a200241cc006a41c20010ce031a200141046a220141206a200241e1016a2d00003a0000200141186a200241d9016a290000370000200141106a200241d1016a290000370000200141086a200241a0016a41296a290000370000200120022900c10137000020002002290310370000200041086a200241106a41086a290300370000200041106a200241106a41106a290300370000200041176a200a290000370000200020093a001f200041286a200b280200360200200020022903303702202004101d200324000f0b20004100360220200324000f0b411241011020000b413241011020000b41a49ac20041d700103a000be10c04037f017e1b7f027e230041f0026b2204240002400240410d101f2205450d00200541056a41002900e1ee41370000200541002900dcee413700002005410d412d101e2205450d012005200129000037000d200541256a200141186a2900003700002005411d6a200141106a290000370000200541156a200141086a290000370000200441a0026a41086a22064200370300200442003703a0022005412d200441a0026a1001200441e0016a41086a2006290300370300200420042903a0023703e001024002400240024002400240200441e0016a411041f8b3c200410041001002417f460d00200441003a00a002200441e0016a4110200441a0026a41014100100241016a41014d0d0520042d00a002220641034f0d052005101d20064101460d0320064102470d01200441a0026a200110f60220042d00a0024101470d02200441f8016a200441b9026a290000370300200441e0016a41106a200441b1026a290000370300200441e0016a41086a200441a9026a290000370300200420042900a1023703e001200441386a200441e0016a2002200310ee0120043502384201852102200441386a41106a2903002103200441386a41086a29030021070c040b2005101d0b200441f8006a200110f60220042d00784101470d00200441a0016a41186a20044191016a2205290000370300200441a0016a41106a20044189016a2206290000370300200441a0016a41086a20044181016a2208290000370300200420042900793703a001200441a0026a200441a0016a10c902200441c0016a41186a22092005290000370300200441c0016a41106a220a2006290000370300200441c0016a41086a220b2008290000370300200420042900793703c00120042802c002220c450d00200441e0016a41186a220d2009290300370300200441e0016a41106a220e200a290300370300200441e0016a41086a220f200b290300370300200441e0016a41286a2205200441a0026a41086a2206290300370300200441e0016a41306a2208200441a0026a41106a2209290300370300200441e0016a41386a2210200441a0026a41186a2211290300370300200441086a41086a2212200441cc026a2213290200370300200441086a41106a2214200441d4026a2215290200370300200441086a41186a2216200441dc026a2217290200370300200441086a41206a2218200441e4026a2219290200370300200441086a41286a221a200441ec026a221b280200360200200420042903c0013703e001200420042903a00237038002200420042902c402370308200441386a41386a221c2010290300370300200441386a41306a221d2008290300370300200441386a41286a221e2005290300370300200441386a41206a221f200429038002370300200441386a41186a2220200d290300370300200441386a41106a2221200e290300370300200441386a41086a2222200f290300370300200420042903e0013703382010201c2903003703002008201d2903003703002005201e290300370300200441e0016a41206a221c201f290300370300200d2020290300370300200e2021290300370300200f2022290300370300200420042903383703e001200441f8006a41186a2020290300370300200441f8006a41106a2021290300370300200441f8006a41086a202229030037030020042004290338370378201120102903003703002009200829030037030020062005290300370300200441c4026a2205200429030837020020132012290300370200201520142903003702002017201629030037020020192018290300370200201b201a2802003602002004200c3602c0022004201c2903003703a00220092009290300220720027c22233703002011201129030020037c2023200754ad7c37030020062903002107200420042903a002222320027c22243703a0022006200720037c2024202354ad7c370300200441c0016a20012002200310ee0120043502c0012102200a2903002103200b2903002107200441f8006a200441a0026a10880302402005280200450d00200441a0026a41206a280200101d0b200242018521020c020b420021020c010b200441a0026a20012002200310ee0120043502a0024201852102200441b0026a2903002103200441a8026a29030021070b2000200737030820002002370300200041106a2003370300200441f0026a24000f0b41df88c0004133103a000b410d41011020000b412d41011020000b9b0201027f230041306b22022400200242f3e885db96cddbb320370308200241086a2001412c6a2001290300200141086a290300427f410f10d00102400240410e101f2203450d00200341066a41002900e5c541370000200341002900dfc5413700002003410e412e101e2203450d012003200029000037000e200341266a200041186a2900003700002003411e6a200041106a290000370000200341166a200041086a290000370000200241206a41086a22004200370300200242003703202003412e200241206a1001200241106a41086a200029030037030020022002290320370310200241103602242002200241106a3602202001200241206a10f8022003101d200241306a24000f0b410e41011020000b412e41011020000b02000bec0301087f23004180016b22032400200341c0006a200110ea020240024020032903404201520d002002417f732104200341c0006a41086a21020340200341086a41306a2205200241306a290300370300200341086a41286a2206200241286a290300370300200341086a41206a2207200241206a290300370300200341086a41186a2208200241186a290300370300200341086a41106a2209200241106a290300370300200341086a41086a220a200241086a29030037030020032002290300370308200341c0006a41306a2005290300370300200341c0006a41286a2006290300370300200341c0006a41206a2007290300370300200341c0006a41186a2008290300370300200341c0006a41106a20092903003703002002200a29030037030020032003290308370340200441016a2204450d02200341c0006a200110ea0220032903404201510d000b0b2000420037030020034180016a24000f0b2000200329034037030820004201370300200041386a200341c0006a41306a290300370300200041306a200341c0006a41286a290300370300200041286a200341c0006a41206a290300370300200041206a200341c0006a41186a290300370300200041186a200341c0006a41106a290300370300200041106a200341c8006a29030037030020034180016a24000b92db0109037f027e067f047e027f027e037f017e127f230041f0046b2203240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d00002204417f6a2205410e4b0d0002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020050e0f00090607030a0c080f050d02040b01000b200141306a2903002106200141286a290300210720012d00012108200341d0026a41026a200141076a2d00003a0000200341c0046a41086a200141186a290200370300200341c0046a410d6a2001411d6a2900003700002003200141056a2f00003b01d0022003200141106a2902003703c004200141046a2d00002109200141086a280200210a2001410c6a280200210b20022d0001210c20022d00002105200341e0036a41186a22042002411a6a290100370300200341e0036a41106a200241126a290100370300200341e0036a41086a2002410a6a2901003703002003200241026a2901003703e0032005450d1c410121040c1d0b200141086a2802002109200141046a280200210820022d000120022d000072450d0e4100210a2009450d0c2008101d20012d000021040c0c0b4101210a20022d000120022d0000720d0b200141046a2802002102200341e0046a41086a22054200370300200342003703e00441faedc1004116200341e0046a1001200341d0036a41086a2005290300370300200320032903e0043703d003200320023602e003200341d0036a4110200341e0036a410410030c8a010b200141106a2903002106200141086a2903002107200141186a280200210d20022d0001210a20022d00002105200341e0036a41186a22042002411a6a290100370300200341e0036a41106a200241126a290100370300200341e0036a41086a2002410a6a2901003703002003200241026a2901003703e0032005450d0d410121040c0e0b4101210a20022d000120022d0000720d0920012d00012104200341e0046a41086a22054200370300200342003703e00441e0d7c1004115200341e0046a1001200341d0036a41086a220a2005290300370300200320032903e0043703d00341002102200341d0036a411041f8b3c20041001003200320043a00e00320054200370300200342003703e00441e9a4c1004119200341e0046a1001200a2005290300370300200320032903e0043703d0034101210a200341d0036a4110200341e0036a410110034101210c20012d00002204410f4d0da3010ca4010b4101210a20022d000120022d0000720d08200141086a2903002106200341e0046a41086a22024200370300200342003703e00441e0edc100411a200341e0046a1001200341d0036a41086a2002290300370300200320032903e0043703d003200320063703e003200341d0036a4110200341e0036a410810030c87010b200141106a2903002106200141086a290300210e20022d0001210a20022d00002105200341f8036a22042002411a6a290100370300200341e0036a41106a200241126a290100370300200341e0036a41086a2002410a6a2901003703002003200241026a2901003703e0032005450d0d410121040c0e0b20022d0001210a20022d00002105200341f8036a22042002411a6a290100370300200341f0036a200241126a290100370300200341e0036a41086a2002410a6a2901003703002003200241026a2901003703e0032005450d0f410121040c100b20012d0001210d20022d0001210a20022d00002105200341f8036a22042002411a6a290100370300200341f0036a200241126a290100370300200341e0036a41086a2002410a6a2901003703002003200241026a2901003703e0032005450d11410121040c120b200141106a2903002106200141086a290300210720022d0001210a20022d00002105200341f8036a22042002411a6a290100370300200341e0036a41106a200241126a290100370300200341e0036a41086a2002410a6a2901003703002003200241026a2901003703e0032005450d16410121040c170b2001410c6a280200210a200141086a280200210b200141046a280200210d20022d0001210c20022d00002105200341f8036a22042002411a6a290100370300200341f0036a200241126a290100370300200341e0036a41086a2002410a6a2901003703002003200241026a2901003703e0032005450d18410121040c190b4101210a20022d000120022d0000720d02200141046a2802002102200341e0046a41086a22054200370300200342003703e0044189d7c1004119200341e0046a1001200341d0036a41086a2005290300370300200320032903e0043703d003200320023602e003200341d0036a4110200341e0036a410410030c81010b20022d0001210a20022d00002105200341f8036a22042002411a6a290100370300200341f0036a200241126a290100370300200341e0036a41086a2002410a6a2901003703002003200241026a2901003703e0032005450d19410121040c1a0b4101210a20022d000120022d000072450d1b0b41c9b4c000210241282105200441ff01712204410f4b0d23410120047441beff01710d9b0120044106460d242004410f470d23200a450d9b01200141086a280200450d9b01200141046a280200101d0c9b010b20034190016a41026a200141076a2d00003a0000200341206a41086a200141186a290200370300200341206a410d6a2001411d6a2900003700002003200141056a2f00003b0190012003200141106a290200370320200141046a2d00002109200141086a280200210d2001410c6a280200210b20022d0001210a20022d00002105200341e0036a41186a22042002411a6a290100370300200341e0036a41106a200241126a290100370300200341e0036a41086a2002410a6a2901003703002003200241026a2901003703e0032005450d1a410121040c1b0b2001410c6a2802002102200341e0046a41086a22054200370300200342003703e00441e2d6c1004115200341e0046a1001200341d0036a41086a2005290300370300200320032903e0043703d003200341003602e803200342013703e003200320023602e001200341e0016a200341e0036a10622002450d262002410574210c200341e0036a41086a280200210520032802e003210d20032802e403210a2008210203400240024002400240200a20056b41204f0d00200541206a22042005490d9401200a410174220b20042004200b491b220b4100480d9401200a450d01200d200a200b101e220d0d020c490b200541206a21040c020b200b101f220d450d470b200b210a0b200d20056a22052002290000370000200541186a200241186a290000370000200541106a200241106a290000370000200541086a200241086a29000037000020042105200241206a2102200c41606a220c0d000b200341e8036a20043602002003200a3602e4032003200d3602e0030c270b200341e0046a41026a20032d00e2033a0000200341f0026a41086a200341f3036a290000370300200341f0026a410d6a220c2004290000370000200320032f01e0033b01e004200320032900eb033703f00241012104200a41ff01714101470d0020032800e303210220032800e7032105200341e0016a41026a200341e0046a41026a2d00003a0000200341e0036a41086a200341f0026a41086a290300370300200341e0036a410d6a200c290000370000200320032f01e0043b01e001200320032903f0023703e003410021040c010b412a210541f1b4c00021020b20034194016a41026a220a200341e0016a41026a2d00003a0000200341b0036a41086a220c200341e0036a41086a290300370300200341b0036a41106a200341e0036a41106a290300370300200320032f01e0013b019401200320032903e0033703b00320040d8401200341d3046a200c290300370000200341c0046a41186a200341bd036a290000370000200320032f0194013b01c004200320053600c704200320023600c304200320032903b0033700cb042003200a2d00003a00c204200341e0036a200341c0046a10c9022003280280042202450d1b200341b0036a41086a220a200341e0036a41346a290200370300200341b0036a41106a2204200341e0036a413c6a290200370300200341b0036a41186a220c200341e0036a41c4006a2902003703002003200341e0036a412c6a2902003703b003200341ac046a280200210b200341e0036a41286a2802002109200341e0036a410c6a350200210f200341e0036a41186a290300210e20032802e003210820032902e403211020032903f00321112003280284042105200341c0006a41186a2212200c290300370300200341c0006a41106a220c2004290300370300200341c0006a41086a2213200a290300370300200320032903b003370340200341e0016a41186a200e370300200341e0016a410c6a200f3e0200200341e0016a41286a200936020020034184026a2005360200200341e0016a41346a2013290300370200200341e0016a413c6a200c290300370200200341e0016a41c4006a2012290300370200200320113703f001200320103702e4012003200236028002200320083602e0012003200b3602ac022003200329034037028c02200d410a4d0d2202402005450d002002101d0b41f8f0c1002102411b21050c84010b200341e0046a41026a20032d00e2033a0000200341f0026a41086a200341f3036a290000370300200341f0026a410d6a220c2004290000370000200320032f01e0033b01e004200320032900eb033703f00241012104200a41ff01714101470d0020032800e303210220032800e7032105200341e0016a41026a200341e0046a41026a2d00003a0000200341e0036a41086a200341f0026a41086a290300370300200341e0036a410d6a200c290000370000200320032f01e0043b01e001200320032903f0023703e003410021040c010b41f1b4c0002102412a21050b20034194016a41026a220a200341e0016a41026a2d00003a0000200341b0036a41086a220c200341e0036a41086a290300370300200341b0036a41106a200341e0036a41106a290300370300200320032f01e0013b019401200320032903e0033703b00320040d8101200341ab016a200c29030037000020034198016a41186a200341bd036a290000370000200320032f0194013b0198012003200536009f012003200236009b01200320032903b0033700a3012003200a2d00003a009a01200341e0036a20034198016a10c9022003280280042205450d18200341b0036a41086a2204200341e0036a41346a290200370300200341b0036a41106a220a200341e0036a413c6a290200370300200341b0036a41186a220c200341e0036a41c4006a29020037030020032003418c046a2902003703b003200341ac046a280200210d200341e0036a41286a280200210b200341e0036a410c6a3502002110200341e0036a41186a290300210720032802e003210920032902e403211120032903f003210f2003280284042102200341c0006a41186a2208200c290300370300200341c0006a41106a220c200a290300370300200341c0006a41086a220a2004290300370300200320032903b003370340200341e0016a41186a2007370300200341e0016a410c6a20103e0200200341e0016a41286a200b36020020034184026a2002360200200341e0016a41346a200a290300370200200341e0016a413c6a200c290300370200200341e0016a41c4006a20082903003702002003200f3703f001200320113702e4012003200536028002200320093602e0012003200d3602ac022003200329034037028c02200f200e200f200e54200720065420072006511b22051b220e2007200620051b220684500d6b200341e0016a41106a200f200e7d370300200341f8016a200720067d200f200e54ad7d370300200341e0046a41086a22024200370300200342003703e00441c4b9c000411b200341e0046a1001200341d0036a41086a2002290300370300200320032903e0043703d0030240200341d0036a411041f8b3c200410041001002417f460d00200342003703e803200342003703e003200341d0036a4110200341e0036a4110410010022202417f460d472002410f4d0d47200341f0016a2202290300220f20032903e0035a200341f8016a22052903002207200341e8036a29030022105a20072010511b0d002005420037030020024200370300200720067c200f200e7c220e200f54ad7c21060b200341e0046a41086a22024200370300200342003703e00441ceedc1004112200341e0046a1001200341d0036a41086a22052002290300370300200320032903e0043703d003420021070240200341d0036a411041f8b3c200410041001002417f460d00200342003703e003200341d0036a4110200341e0036a41084100100241016a41084d0d4120032903e00321070b20024200370300200342003703e00441e1f0c1004117200341e0046a100120052002290300370300200320032903e0043703d003200341d0036a411041f8b3c200410041001002417f460d29200342003703e003200341d0036a4110200341e0036a41084100100241016a41084d0d4120032903e003210f0c2a0b200341e0046a41026a20032d00e2033a0000200341f0026a41086a200341f3036a290000370300200341f0026a410d6a220c2004290000370000200320032f01e0033b01e004200320032900eb033703f00241012104200a41ff01714101470d0020032800e303210220032800e7032105200341c0006a41026a200341e0046a41026a2d00003a0000200341e0036a41086a200341f0026a41086a290300370300200341e0036a410d6a200c290000370000200320032f01e0043b0140200320032903f0023703e003410021040c010b41f1b4c0002102412a21050b20034194016a41026a220a200341c0006a41026a2d00003a0000200341b0036a41086a220c200341e0036a41086a290300370300200341b0036a41106a200341e0036a41106a290300370300200320032f01403b019401200320032903e0033703b00320040d7e200341f3016a200c290300370000200341e0016a41186a200341bd036a290000370000200320032f0194013b01e001200320053600e701200320023600e301200320032903b0033700eb012003200a2d00003a00e201200341e0036a200341e0016a10c902200328028004220c450d15200341b0036a41086a220220034194046a290200370300200341b0036a41106a22052003419c046a290200370300200341b0036a41186a2204200341a4046a29020037030020032003418c046a2902003703b003200341e0036a41186a290300211420034188046a280200210d200341ec036a350200210620032903f0032115200328028404210920033502e003210f20032902e403210720034190036a41186a200429030037030020034190036a41106a200529030037030020034190036a41086a2002290300370300200320032903b0033703900342002110200341e0046a41086a22024200370300200342003703e00441ceedc1004112200341e0046a1001200341d0036a41086a2002290300370300200320032903e0043703d0030240200341d0036a411041f8b3c200410041001002417f460d00200342003703e003200341d0036a4110200341e0036a41084100100241016a41084d0d3d20032903e00321100b200642208620074220888421062007422086200f8421070240200d41186c2202450d00200c20026a210a200241686a2105200c21020340200241086a290300210e2002290300210f2010200241106a2903002211540d2342002006200e7d2007200f54ad7d220e2007200f7d220f200756200e200656200e2006511b22041b21064200200f20041b2107200541686a2105200241186a2202200a470d000b0b410821044100210d2009450d23200c101d4100210b0c2d0b200341e0046a41026a20032d00e2033a0000200341f0026a41086a200341f3036a290000370300200341f0026a410d6a220c2004290000370000200320032f01e0033b01e004200320032900eb033703f00241012104200a41ff01714101470d0020032800e303210220032800e7032105200341e0016a41026a200341e0046a41026a2d00003a0000200341e0036a41086a200341f0026a41086a290300370300200341e0036a410d6a200c290000370000200320032f01e0043b01e001200320032903f0023703e003410021040c010b412a210541f1b4c00021020b20034194016a41026a220a200341e0016a41026a2d00003a0000200341b0036a41086a220c200341e0036a41086a290300370300200341b0036a41106a200341e0036a41106a290300370300200320032f01e0013b019401200320032903e0033703b00320040d7b200341d3006a200c290300370000200341c0006a41186a200341b0036a410d6a290000370000200320032f0194013b01402003200536004720032002360043200320032903b00337004b2003200a2d00003a0042200341e0036a200341c0006a10c9022003280280042205450d12200341b0036a41086a220220034194046a290200370300200341b0036a41106a22042003419c046a290200370300200341b0036a41186a220a200341a4046a29020037030020032003418c046a2902003703b003200328028404210c200341e0016a41186a200a290300370300200341e0016a41106a2004290300370300200341e0016a41086a2002290300370300200320032903b0033703e001410d101f2202450d3e200241056a41002900e1ee41370000200241002900dcee413700002002410d412d101e2202450d3f200220032903e00137000d200241256a200341f8016a2903003700002002411d6a200341e0016a41106a290300370000200241156a200341e0016a41086a290300370000200341e0046a41086a22044200370300200342003703e0042002412d200341e0046a1001200341d0036a41086a2004290300370300200320032903e0043703d003200341103602e4032003200341d0036a3602e003200d200341e0036a10f7022002101d200c450d702005101d0c700b200341e0046a41026a20032d00e2033a0000200341f0026a41086a200341f3036a290000370300200341f0026a410d6a2004290000370000200320032f01e0033b01e004200320032900eb033703f00241012104200c41ff01714101470d0020032800e303210220032800e7032105200341e0016a41026a200341e0046a41026a2d00003a0000200341e0036a41086a200341f0026a41086a290300370300200341e0036a410d6a200341f0026a410d6a290000370000200320032f01e0043b01e001200320032903f0023703e003410021040c010b41f1b4c0002102412a21050b200341d0036a41026a220c200341e0016a41026a2d00003a000020034190036a41086a220d200341e0036a41086a29030037030020034190036a41106a200341e0036a41106a290300370300200320032f01e0013b01d003200320032903e0033703900320040d78200341d3006a200d290300370000200341d8006a2003419d036a290000370000200320032f01d0033b01402003200536004720032002360043200320032903900337004b2003200c2d00003a0042410e101f2202450d39200241066a41002900b3c541370000200241002900adc5413700002002410e412e101e2202450d3a2002200329034037000e200241266a200341d8006a2903003700002002411e6a200341c0006a41106a290300370000200241166a200341c0006a41086a290300370000200341e0046a41086a22054200370300200342003703e0042002412e200341e0046a1001200341e0036a41086a2005290300370300200320032903e0043703e003200341e0036a411041f8b3c20041004100100221052002101d2005417f460d1541b2f0c1002102411421050c780b200341e0046a41026a20032d00e2033a0000200341f0026a41086a200341f3036a290000370300200341f0026a410d6a220c2004290000370000200320032f01e0033b01e004200320032900eb033703f00241012104200a41ff01714101470d0020032800e303210220032800e7032105200341c0006a41026a200341e0046a41026a2d00003a0000200341e0036a41086a200341f0026a41086a290300370300200341e0036a410d6a200c290000370000200320032f01e0043b0140200320032903f0023703e003410021040c010b41f1b4c0002102412a21050b20034198016a41026a220a200341c0006a41026a2d00003a0000200341e0016a41086a220c200341e0036a41086a290300370300200341e0016a41106a200341e0036a41106a290300370300200320032f01403b019801200320032903e0033703e00120040d75200341d3046a200c290300370000200341d8046a200341e0016a410d6a290000370000200320032f0198013b01c004200320053600c704200320023600c304200320032903e0013700cb042003200a2d00003a00c204200341e0036a200341c0046a10f6024101210420032d00e0034101470d0a20034196016a20032d00e3033a0000200341b0036a41086a200341f4036a290200370300200341b0036a410d6a200341f9036a290000370000200320032f00e1033b0194012003200341ec036a2902003703b003200341e0036a41086a28020021054100210420032802e40321020c0b0b200341e0046a41026a20032d00e2033a0000200341f0026a41086a200341f3036a290000370300200341f0026a410d6a22092004290000370000200320032f01e0033b01e004200320032900eb033703f00241012104200c41ff01714101470d0020032800e303210220032800e7032105200341e0016a41026a200341e0046a41026a2d00003a0000200341e0036a41086a200341f0026a41086a290300370300200341e0036a410d6a2009290000370000200320032f01e0043b01e001200320032903f0023703e003410021040c010b412a210541f1b4c00021020b20034194016a41026a220c200341e0016a41026a2d00003a0000200341b0036a41086a2209200341e0036a41086a290300370300200341b0036a41106a200341e0036a41106a290300370300200320032f01e0013b019401200320032903e0033703b00320040d7f200341d3046a2009290300370000200341c0046a41186a200341bd036a290000370000200320032f0194013b01c004200320053600c704200320023600c304200320032903b0033700cb042003200c2d00003a00c204200341e0036a200341c0046a10c9022003280280042208450d0e200341b0036a41086a2202200341e0036a41346a290200370300200341b0036a41106a2205200341e0036a413c6a290200370300200341b0036a41186a2204200341e0036a41c4006a2902003703002003200341e0036a412c6a2902003703b003200341ac046a280200210c200341e0036a41286a2802002109200341e0036a410c6a3502002106200341e0036a41186a290300210720032802e003211320032902e403210f20032903f003210e2003280284042112200341e0016a41186a22162004290300370300200341e0016a41106a22042005290300370300200341e0016a41086a22052002290300370300200320032903b0033703e001200341c0006a41186a2007370300200341c0006a410c6a20063e0200200341c0006a41286a2009360200200341c0006a41246a2012360200200341c0006a41346a2005290300370200200341c0006a413c6a2004290300370200200341c0006a41c4006a20162903003702002003200e3703502003200f37024420032008360260200320133602402003200c36028c01200320032903e00137026c200a450d14200d200a41246c22026a21172002450d18200341f0026a41026a2202200d41036a2d00003a0000200341e0036a41086a220c200d41146a290000370300200341e0036a410d6a2209200d41196a2900003700002003200d2f00013b01f0022003200d29000c3703e003200d41246a2104200d2d000022134102460d19200d2800082118200d2800042105200341e0046a41026a20022d00003a000020034198016a41086a200c29030037030020034198016a410d6a2009290000370000200320032f01f0023b01e004200320032903e0033703980120134101470d24200341b0036a200541067610b00120032802b003210c20032802b8032005413f7122024d0d26200341d0036a41026a200c20024105746a220241026a2d00003a0000200228000321052002280007211820022f000021092003419d036a200241186a29000037000020034198036a200241136a290000370300200320093b01d0032003200229000b370390034101210220032802b403450d740c730b200341e0046a41026a20032d00e2033a0000200341f0026a41086a200341f3036a290000370300200341f0026a410d6a220c2004290000370000200320032f01e0033b01e004200320032900eb033703f00241012104200a41ff01714101470d0020032800e303210220032800e7032105200341e0016a41026a200341e0046a41026a2d00003a0000200341e0036a41086a200341f0026a41086a290300370300200341e0036a410d6a200c290000370000200320032f01e0043b01e001200320032903f0023703e003410021040c010b412a210541f1b4c00021020b20034194016a41026a220a200341e0016a41026a2d00003a0000200341b0036a41086a220c200341e0036a41086a290300370300200341b0036a41106a200341e0036a41106a290300370300200320032f01e0013b019401200320032903e0033703b00320040d6f200341ab016a200c29030037000020034198016a41186a200341bd036a290000370000200320032f0194013b0198012003200536009f012003200236009b01200320032903b0033700a3012003200a2d00003a009a01200341e0036a20034198016a10c9022003280280042202450d06200341b0036a41086a2204200341e0036a41346a290200370300200341b0036a41106a220a200341e0036a413c6a290200370300200341b0036a41186a220c200341e0036a41c4006a2902003703002003200341e0036a412c6a2902003703b003200341ac046a280200210d200341e0036a41286a280200210b200341e0036a410c6a3502002106200341e0036a41186a290300210720032802e003210920032902e403210f20032903f003210e2003280284042105200341c0006a41186a2208200c290300370300200341c0006a41106a220c200a290300370300200341c0006a41086a220a2004290300370300200320032903b003370340200341e0016a41186a2007370300200341e0016a410c6a20063e0200200341e0016a41286a200b36020020034184026a2005360200200341e0016a41346a200a290300370200200341e0016a413c6a200c290300370200200341e0016a41c4006a20082903003702002003200e3703f0012003200f3702e4012003200236028002200320093602e0012003200d3602ac022003200329034037028c02200341e0016a412c6a220410e401200410e5012005450d642002101d0c640b200141086a2903002106200341e0046a41086a22024200370300200342003703e00441e1f0c1004117200341e0046a1001200341d0036a41086a2002290300370300200320032903e0043703d003200320063703e003200341d0036a4110200341e0036a410810030c630b200341e0046a41026a20032d00e2033a0000200341f0026a41086a200341f3036a290000370300200341f0026a410d6a2004290000370000200320032f01e0033b01e004200320032900eb033703f00241012104200a41ff01714101470d0020032800e303210220032800e7032105200341c0006a41026a200341e0046a41026a2d00003a0000200341e0036a41086a200341f0026a41086a290300370300200341e0036a410d6a200341f0026a410d6a290000370000200320032f01e0043b0140200320032903f0023703e003410021040c010b412a210541f1b4c00021020b20034198016a41026a220a200341c0006a41026a2d00003a0000200341e0016a41086a220c200341e0036a41086a290300370300200341e0016a41106a200341e0036a41106a290300370300200320032f01403b019801200320032903e0033703e00120040d6b200341c3026a200c290300370000200341c8026a200341e0016a410d6a290000370000200320032f0198013b01b002200320053600b702200320023600b302200320032903e0013700bb022003200a2d00003a00b202200341e0036a200341b0026a10f6024101210420032d00e0034101470d03200341d2036a20032d00e3033a000020034190036a41086a200341f4036a29020037030020034190036a410d6a200341f9036a290000370000200320032f00e1033b01d0032003200341ec036a29020037039003200341e0036a41086a28020021054100210420032802e40321020c040b410b210541c6f0c10021020b200341d0036a41026a220a20034194016a41026a2d00003a000020034190036a41086a220c200341b0036a41086a29030037030020034190036a41106a200341b0036a41106a290300370300200320032f0194013b01d003200320032903b0033703900320040d69200341ab016a200c29030037000020034198016a41186a2003419d036a290000370000200320032f01d0033b0198012003200536009f012003200236009b0120032003290390033700a3012003200a2d00003a009a01200341e0036a20034198016a10c9022003280280042205450d00200341b0036a41086a2204200341e0036a41346a290200370300200341b0036a41106a220a200341e0036a413c6a290200370300200341b0036a41186a220c200341e0036a41c4006a29020037030020032003418c046a2902003703b003200341ac046a280200210d200341e0036a41286a280200210b200341e0036a410c6a350200210f200341e0036a41186a290300211020032802e003210920032902e403210e20032903f00321112003280284042102200341c0006a41186a2208200c290300370300200341c0006a41106a220c200a290300370300200341c0006a41086a220a2004290300370300200320032903b003370340200341e0016a41186a2010370300200341e0016a410c6a200f3e0200200341e0016a41286a200b36020020034184026a22042002360200200341e0016a41346a200a290300370200200341e0016a413c6a200c290300370200200341e0016a41c4006a2008290300370200200320113703f0012003200e3702e4012003200536028002200320093602e0012003200d3602ac022003200329034037028c02200341106a200341c0046a10eb0102402003290310220f20032903e00122147d2215200f56200341106a41086a290300220e200341e0016a41086a29030022197d200f201454ad7d220f200e56200f200e511b0d00200341e0016a41106a200720152015200756200f200656200f2006511b22021b220720117c220e370300200341f8016a2006200f20021b220620107c200e200754ad7c3703002003200720147c220f3703e0012003200620197c200f200754ad7c3703e80120034198016a200341e0016a108803200428020021020b2002450d5e20034180026a280200101d0c5e0b41d1f0c1002102411021050c680b410b210541c6f0c10021020b20034198016a41026a220a200341d0036a41026a2d00003a0000200341e0016a41086a220c20034190036a41086a290300370300200341e0016a41106a20034190036a41106a290300370300200320032f01d0033b01980120032003290390033703e00120040d66200341e3026a200c290300370000200341e8026a200341e0016a410d6a290000370000200320032f0198013b01d002200320053600d702200320023600d302200320032903e0013700db022003200a2d00003a00d202200341e0046a41026a20034190016a41026a2d00003a000020034198016a41086a200341206a41086a29030037030020034198016a410d6a2202200341206a410d6a290000370000200320032f0190013b01e0042003200329032037039801200941ff01714101470d07200341e0036a200d41067610b00120032802e003210520032802e803200d413f7122024d0d10200341d0036a41026a200520024105746a220241026a2d00003a00002002280003210d2002280007210b20022f000021042003419d036a200241186a29000037000020034198036a200241136a290000370300200320043b01d0032003200229000b370390034101210220032802e403450d560c550b200141086a280200450d77200141046a280200101d0c770b200141086a280200450d76200141046a280200101d0c760b4110210541d1f0c10021024100210c4101210a200b0d710c720b200341e0046a41026a2202200341d0026a41026a2d00003a000020034198016a41086a200341c0046a41086a29030037030020034198016a410d6a2205200341c0046a410d6a290000370000200320032f01d0023b01e004200320032903c00437039801200941ff01714101470d06200341e0036a200a41067610b00120032802e003210520032802e803200a413f7122024d0d0e200341d0036a41026a200520024105746a220241026a2d00003a00002002280003210a2002280007210b20022f000021042003419d036a200241186a29000037000020034198036a200241136a290000370300200320043b01d0032003200229000b370390034101210220032802e403450d4e0c4d0b200341e0016a412c6a220510e501200320063703b803200320073703b0032003200d3602c0034112101f2202450d27200241106a41002f00ddc5413b0000200241086a41002900d5c541370000200241002900cdc541370000200241124132101e2202450d28200220052900003700122002412a6a200541186a290000370000200241226a200541106a2900003700002002411a6a200541086a290000370000200341e0046a41086a220a4200370300200342003703e00420024132200341e0046a1001200341d0036a41086a200a290300370300200320032903e0043703d003200341d0036a411041f8b3c200410041001002417f460d0c200342103702442003200341d0036a360240200341e0036a200341c0006a10eb0220032d00f803220a4102460d2b200341a8036a20034191046a290000370300200341a0036a20034189046a29000037030020034190036a41086a20034181046a2900003703002003413c6a41026a2003419c046a2d00003a0000200341b0026a41086a200341ad046a290000370300200341bd026a200341b2046a290000370000200320032900f9033703900320032003419a046a2f01003b013c2003200341a5046a2900003703b00220034199046a2d0000210d2003419d046a280000210b200341a1046a28000021090c420b200341e8036a280200210420032802e403210a20032802e003210d0b200341d0036a4110200d200410030240200a450d00200d101d0b4101210c02402009450d002008101d0b4100210a0c660b200341d0036a41026a200341e0046a41026a2d00003a000020034190036a41086a20034198016a41086a29030037030020034190036a410d6a2002290000370000200320032f01e0043b01d0032003200329039801370390030c4f0b41b2f2c100210241172105410121042012450d690c680b4118101f2204450d252004200f370300200420113703102004200e3703082005450d09200241186a2105200c200d41186c6a41686a21124101210d4101210b03402005210202400340200241086a290300210e2002290300210f2010200241106a2903002211540d0142002006200e7d2007200f54ad7d220e2007200f7d220f200756200e200656200e2006511b22051b21064200200f20051b2107200241186a2202200a470d000c0d0b0b0240200b200d470d00200d41016a2205200d490d66200d410174220b20052005200b491b220bad42187e2219422088a70d662019a722054100480d660240200d450d002004200d41186c2005101e22040d010c270b2005101f2204450d260b200241186a21052004200d41186c6a2208200e3703082008200f37030020082011370310200d41016a210d20122002470d000c0b0b0b200341d0036a41026a20022d00003a000020034190036a41086a20034198016a41086a29030037030020034190036a410d6a2005290000370000200320032f01e0043b01d0032003200329039801370390030c480b4100210b0c090b201721040b4100210c4101210241002113410021054100450d5c0c5d0b42e807210f0b024020034188026a280200220220034184026a280200470d00200241016a22052002490d5f20024101742204200520052004491b2204ad42187e2210422088a70d5f2010a7220a4100480d5f2002450d0720034180026a280200200241186c200a101e2205450d080c3f0b20034180026a28020021050c3f0b4100210220032802e4030d440c450b200341e0046a41086a220a4200370300200342003703e00441c8d8c100411a200341e0046a1001200341d0036a41086a220c200a290300370300200320032903e0043703d003200341d0036a411041f8b3c200410041001002417f460d07200341f8036a4200370300200341e0036a41106a4200370300200341e0036a41086a4200370300200342003703e003200341d0036a4110200341e0036a412041001002220a417f460d1f200a411f4d0d1f200341e0046a41026a220d20032d00e2033a0000200341f0026a41086a220a200341f3036a290000370300200341f0026a410d6a220c200341f8036a290000370000200320032f01e0033b01e004200320032900eb033703f00220032800e303210b20032800e703210920034190016a41026a2208200d2d00003a0000200341d0026a41086a220d200a290300370300200341d0026a410d6a2212200c290000370000200320032f01e0043b019001200320032903f0023703d00220034194016a41026a20082d00003a0000200a200d290300370300200c2012290000370000200320032f0190013b019401200320032903d0023703f0024112101f220a450d20200a41106a41002f00ddc5413b0000200a41086a41002900d5c541370000200a41002900cdc541370000200a41124132101e220a450d21200a20032f0194013b0012200a2009360019200a200b360015200a20032903f00237001d200a41146a20034194016a41026a2d00003a0000200a41256a200341f0026a41086a290300370000200a412a6a200341fd026a290000370000200341e0046a41086a220c4200370300200342003703e004200a4132200341e0046a1001200341d0036a41086a200c290300370300200320032903e0043703d003200341d0036a411041f8b3c200410041001002417f460d222003421037029c012003200341d0036a36029801200341e0036a20034198016a10eb0220032d00f803220c4102460d23200341e0036a41086a290300210620032802f003210d20032903e0032107200341c0006a200341f9036a41c70010ce031a20034198016a200341c0006a41c10010ce031a2003200c3a00e003200341e0036a41017220034198016a41c10010ce031a200341dc006a20034182046a410020032d0081044101461b3602002003200637034820032007370340200320053602582003200d360250200341e0046a41086a220c4200370300200342003703e004200a4132200341e0046a1001200341d0036a41086a200c290300370300200320032903e0043703d003200341003602a0012003420137039801200341d0006a20034198016a10622003200341c0006a360220200341206a20034198016a10f302200328029c01210c20032802a001210d20032802582213450d09200c200d470d0a200d41016a220c200d490d5c200d4101742208200c200c2008491b220c4100480d5c200d450d0c200328029801200d200c101e2208450d0d0c270b4100210220032802e4030d3e0c3f0b4101210d4101210b0b2009450d00200c101d0b200341e0036a41186a201437030020034188046a200d36020020034184046a2202200b360200200341a4046a20034190036a41186a2903003702002003419c046a200341a0036a29030037020020034194046a20034198036a290300370200200320153703f003200320073703e003200320032903900337028c042003200436028004200320063703e803200341e0016a200341e0036a1088032002280200450d4520034180046a280200101d0c450b200a101f22050d370b200a41081020000b200341d0036a41026a200341e0046a41026a2d00003a000020034190036a41086a20034198016a41086a29030037030020034190036a410d6a20034198016a410d6a290000370000200320032f01e0043b01d0032003200329039801370390030c500b200a4200370300200342003703e00441c8d8c100411a200341e0046a1001200c200a290300370300200320032903e0043703d0034120101f220a450d1c200a2005290000370000200a41186a200541186a290000370000200a41106a200541106a290000370000200a41086a200541086a290000370000200341d0036a4110200a41201003200a101d4100210d0c2c0b4100210220032802b4030d4c0c4d0b200c200d470d01200d41016a220c200d490d52200d4101742208200c200c2008491b220c4100480d52200d450d04200328029801200d200c101e2208450d050c1b0b20032802980121080c1d0b20032802980121080c1a0b200c101f22080d1a0b200c41011020000b200c101f22080d160b200c41011020000b200341f4036a4101360200200341183602e401200341c0adc4003602e001200342013702e403200341c8adc4003602e0032003200341e0016a3602f003200341e0036a41f882c40010cf01000b200b41011020000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b410e41011020000b412e41011020000b410d41011020000b412d41011020000b41df88c0004133103a000b411241011020000b413241011020000b200541081020000b411841081020000b41df88c0004133103a000b41df88c0004133103a000b411241011020000b413241011020000b4193f1c100419f01103a000b41df88c0004133103a000b412041011020000b2003200c36029c0120032008360298010b200341a0016a200d41016a22123602002008200d6a41003a0000200341dc006a280200220d0d020c030b2003200c36029c0120032008360298010b20034198016a41086a2216200d41016a3602002008200d6a41013a000002400240024002400240200328029c0122122016280200220d6b411f4b0d00200d41206a220c200d490d3820124101742218200c200c2018491b220c4100480d382012450d0120082012200c101e2208450d020c030b2012210c0c030b200c101f22080d010b200c41011020000b2003200c36029c0120032008360298010b2016200d41206a22123602002008200d6a220d41086a201341086a290000370000200d41106a201341106a290000370000200d41186a201341186a290000370000200d2013290000370000200341dc006a280200220d450d010b200c2012470d08200c41016a2213200c490d32200c4101742216201320132016491b22134100480d32200c450d012008200c2013101e2208450d020c070b200c2012470d05200c41016a220d200c490d31200c4101742213200d200d2013491b220d4100480d31200c450d022008200c200d101e2208450d030c040b2013101f22080d050b201341011020000b200d101f22080d010b200d41011020000b2003200d36029c0120032008360298010b200341a0016a220c201241016a360200200820126a41003a0000200c2802002113200328029c012108200328029801210c0c020b2003201336029c0120032008360298010b200341a0016a220c201241016a360200200820126a41013a000002400240024002400240200328029c012208200c28020022126b41204f0d00201241206a220c2012490d2e20084101742213200c200c2013491b22134100480d2e2008450d0120032802980120082013101e220c450d020c030b200328029801210c0c030b2013101f220c0d010b201341011020000b2003201336029c012003200c36029801201321080b20034198016a41086a201241206a2213360200200c20126a221241086a200d41086a290000370000201241106a200d41106a290000370000201241186a200d41186a2900003700002012200d2900003700000b200341d0036a4110200c2013100302402008450d00200c101d0b200a101d200341e0046a41086a220a4200370300200342003703e00441c8d8c100411a200341e0046a1001200341d0036a41086a200a290300370300200320032903e0043703d0034120101f220a450d02200a2005290000370000200a41186a200541186a290000370000200a41106a200541106a290000370000200a41086a200541086a290000370000200341d0036a4110200a41201003200a101d2003413c6a41026a20034194016a41026a2d00003a0000200341b0026a41086a200341f0026a41086a290300370300200341b0026a410d6a200341f0026a410d6a290000370000200320032f0194013b013c200320032903f0023703b0024101210d0b4100210a0b200341e0036a41186a20034190036a41186a290300370300200341e0036a41106a20034190036a41106a290300370300200341e0036a41086a20034190036a41086a290300370300200341d0026a41026a2003413c6a41026a2d00003a0000200341c0006a41086a200341b0026a41086a290300370300200341c0006a410d6a200341b0026a410d6a29000037000020032003290390033703e003200320032f013c3b01d002200320032903b002370340200341e0046a41086a22054200370300200342003703e00420024132200341e0046a1001200341d0036a41086a2005290300370300200320032903e0043703d003200341003602a0012003420137039801200420034198016a10622003200341b0036a3602f002200341f0026a20034198016a10f302200328029c01210520032802a00121040240024002400240024002400240200a4101470d0020052004470d01200441016a22052004490d2d2004410174220a20052005200a491b22054100480d2d2004450d0320032802980120042005101e220a450d040c0a0b20052004470d01200441016a22052004490d2c2004410174220a20052005200a491b22054100480d2c2004450d0420032802980120042005101e220a450d050c070b200328029801210a0c090b200328029801210a0c060b2005101f220a0d060b200541011020000b2005101f220a0d020b200541011020000b412041011020000b2003200536029c012003200a360298010b200341a0016a200441016a220c360200200a20046a41003a00000c020b2003200536029c012003200a360298010b20034198016a41086a2208200441016a360200200a20046a41013a000002400240024002400240200328029c01220c200828020022046b411f4b0d00200441206a22052004490d26200c4101742212200520052012491b22054100480d26200c450d01200a200c2005101e220a450d020c030b200c21050c030b2005101f220a0d010b200541011020000b2003200536029c012003200a360298010b2008200441206a220c360200200a20046a220441086a200341e0036a41086a290300370000200441106a200341e0036a41106a290300370000200441186a200341e0036a41186a290300370000200420032903e0033700000b0240024002400240024002400240024002400240200d41ff01714101470d002005200c470d08200541016a22042005490d2a2005410174220d20042004200d491b22044100480d2a2005450d01200a20052004101e220a450d020c070b2005200c470d05200541016a22042005490d292005410174220d20042004200d491b22044100480d292005450d02200a20052004101e220a450d030c040b2004101f220a0d050b200441011020000b2004101f220a0d010b200441011020000b2003200436029c012003200a360298010b200341a0016a2205200c41016a360200200a200c6a41003a00002005280200210c200328029c01210a20032802980121040c020b2003200436029c012003200a360298010b200341a0016a2205200c41016a360200200a200c6a41013a000002400240024002400240200328029c01220a200528020022056b41204f0d00200541206a22042005490d26200a410174220c20042004200c491b220c4100480d26200a450d01200328029801200a200c101e2204450d020c030b20032802980121040c030b200c101f22040d010b200c41011020000b2003200c36029c012003200436029801200c210a0b20034198016a41086a200541206a220c360200200341d0026a41026a2d0000210d20032f01d0022108200420056a220520093600072005200b360003200541026a200d3a0000200520083b0000200541186a200341cd006a290000370000200541136a200341c0006a41086a2903003700002005200329034037000b0b200341d0036a41102004200c10030240200a450d002004101d0b2002101d20034184026a280200450d0d20034180026a280200101d0c0d0b20034184026a200436020020034180026a200536020020034188026a28020021020b2005200241186c6a220220063703082002200e3703002002200f20077c37031020034188026a2202200228020041016a36020020034198016a200341e0016a10880320034184026a28020021020b2002450d0a20034180026a280200101d0c0a0b2005101d0b20020d004101210241d7c0c100210a4115210b0c010b20034198016a41026a200341d0036a41026a2d00003a0000200341e0036a41086a20034190036a41086a290300370300200341e0036a410d6a20034190036a410d6a290000370000200320032f01d0033b01980120032003290390033703e003410021020b20034194016a41026a220520034198016a41026a2d00003a0000200341b0036a41086a2204200341e0036a41086a290300370300200341b0036a41106a200341e0036a41106a290300370300200320032f0198013b019401200320032903e0033703b00302402002450d00200b2105200a21020c120b200341f3016a2004290300370000200341f8016a200341bd036a290000370000200320032f0194013b01e0012003200b3600e7012003200a3600e301200320032903b0033700eb01200320052d00003a00e2010240024002400240024002400240410e101f2202450d00200241066a41002900e5c541370000200241002900dfc5413700002002410e412e101e2202450d01200220032903e00137000e200241266a200341e0016a41186a22042903003700002002411e6a200341e0016a41106a220a290300370000200241166a200341e0016a41086a220c290300370000200341e0046a41086a22054200370300200342003703e0042002412e200341e0046a1001200341e0036a41086a220d2005290300370300200320032903e0043703e003200341e0036a411041f8b3c20041004100100221052002101d2005417f470d0b200341e0036a41186a2004290300370300200341e0036a41106a200a290300370300200d200c290300370300200320032903e0013703e003410e101f2202450d02200241066a41002900b3c541370000200241002900adc5413700002002410e412e101e2202450d032002200329034037000e200241266a200341c0006a41186a2903003700002002411e6a200341c0006a41106a290300370000200241166a200341c0006a41086a290300370000200341e0046a41086a22054200370300200342003703e0042002412e200341e0046a1001200341d0036a41086a2005290300370300200320032903e0043703d0034120101f2205450d04200520032903e003370000200541186a200341e0036a41186a290300370000200541106a200341e0036a41106a290300370000200541086a200341e0036a41086a290300370000200341d0036a41102005412010032005101d2002101d410d101f2202450d05200241056a41002900e1ee41370000200241002900dcee413700002002410d412d101e2202450d062002200329034037000d200241256a200341c0006a41186a22052903003700002002411d6a200341c0006a41106a2204290300370000200241156a200341c0006a41086a220a290300370000200341e0046a41086a220c4200370300200342003703e0042002412d200341e0046a1001200341d0036a41086a200c290300370300200320032903e0043703d003200341103602e4032003200341d0036a3602e0032008200341e0036a10f7022002101d2003200341c0006a10eb01200341086a290300210f2003290300210e20034188046a4100360200200341e0036a41186a200f2006200e200754200f200654200f2006511b22021b2206370300200341a4046a20052903003702002003419c046a200429030037020020034194046a200a29030037020020034208370380042003200e200720021b22073703f003200320063703e803200320073703e0032003200329034037028c04200341e0016a200341e0036a10880320034184046a280200450d0d20034180046a280200101d0c0d0b410e41011020000b412e41011020000b410e41011020000b412e41011020000b412041011020000b410d41011020000b412d41011020000b2005101d0b20020d004101210241d7c0c100210d4115210b0c010b200341e0016a41026a200341d0036a41026a2d00003a0000200341e0036a41086a20034190036a41086a290300370300200341e0036a410d6a20034190036a410d6a290000370000200320032f01d0033b01e00120032003290390033703e003410021020b20034194016a41026a2205200341e0016a41026a2d00003a0000200341b0036a41086a2204200341e0036a41086a290300370300200341b0036a41106a200341e0036a41106a290300370300200320032f01e0013b019401200320032903e0033703b00302402002450d004101210a4101210c200b2105200d210220012d00002204410f4d0d1e0c1f0b20034183036a200429030037000020034188036a200341bd036a290000370000200320032f0194013b01f0022003200b3600f7022003200d3600f302200320032903b0033700fb02200320052d00003a00f202410e101f2202450d03200241066a41002900e5c541370000200241002900dfc5413700002002410e412e101e2202450d04200220032903f00237000e200241266a20034188036a2903003700002002411e6a200341f0026a41106a290300370000200241166a200341f0026a41086a290300370000200341e0046a41086a22054200370300200342003703e0042002412e200341e0046a1001200341e0036a41086a2005290300370300200320032903e0043703e003200341e0036a411041f8b3c20041004100100221052002101d2005417f470d00200341f0026a200341d0026a412010d003450d02410e101f2202450d05200241066a41002900b3c541370000200241002900adc5413700002002410e412e101e2202450d06200220032903b00237000e200241266a200341b0026a41186a2903003700002002411e6a200341b0026a41106a290300370000200241166a200341b0026a41086a290300370000200341e0046a41086a22054200370300200342003703e0042002412e200341e0046a1001200341d0036a41086a2005290300370300200320032903e0043703d0034120101f2205450d07200520032903f002370000200541186a200341f0026a41186a290300370000200541106a200341f0026a41106a290300370000200541086a200341f0026a41086a290300370000200341d0036a41102005412010032005101d2002101d410e101f2202450d0841002105200241066a41002900e5c541370000200241002900dfc5413700002002410e412e101e2202450d09200220032903d00237000e200241266a200341d0026a41186a2903003700002002411e6a200341d0026a41106a290300370000200241166a200341d0026a41086a290300370000200341e0046a41086a22044200370300200342003703e0042002412e200341e0046a1001200341d0036a41086a2004290300370300200320032903e0043703d0030240200341d0036a411041f8b3c200410041001002417f460d00200342103702e4042003200341d0036a3602e004200341e0036a200341e0046a10fc022003280280042205450d0b200341c0046a41186a200341e0036a41186a290300370300200341c0046a41106a200341e0036a41106a290300370300200341c0046a41086a200341e0036a41086a290300370300200341e0016a41086a2003418c046a290200370300200341e0016a41106a20034194046a290200370300200341e0016a41186a2003419c046a29020037030020034180026a200341a4046a29020037030020034188026a200341ac046a280200360200200320032903e0033703c00420032003290284043703e001200341d0036a411010090b200341b0036a41186a200341c0046a41186a290300370300200341b0036a41106a200341c0046a41106a290300370300200341b0036a41086a200341c0046a41086a290300370300200341c0006a41086a200341e0016a41086a290300370300200341c0006a41106a200341e0016a41106a290300370300200341c0006a41186a200341e0016a41186a290300370300200341c0006a41206a2204200341e0016a41206a290300370300200341c0006a41286a220a200341e0016a41286a280200360200200320032903c0043703b003200320032903e0013703402005450d0120034190036a41186a220c200341b0036a41186a29030037030020034190036a41106a220d200341b0036a41106a29030037030020034190036a41086a220b200341b0036a41086a29030037030020034198016a41086a2209200341c0006a41086a29030037030020034198016a41106a2208200341c0006a41106a29030037030020034198016a41186a2212200341c0006a41186a29030037030020034198016a41206a2213200429030037030020034198016a41286a2204200a280200360200200320032903b0033703900320032003290340370398012002101d200341e0036a41186a200c290300370300200341e0036a41106a200d290300370300200341e0036a41086a200b29030037030020034184046a2003290398013702002003418c046a200929030037020020034194046a20082903003702002003419c046a2012290300370200200341a4046a2013290300370200200341ac046a2004280200360200200320053602800420032003290390033703e003410e101f2202450d0b200241066a41002900e5c541370000200241002900dfc5413700002002410e412e101e2202450d0c200220032903f00237000e200241266a20034188036a2903003700002002411e6a200341f0026a41106a290300370000200241166a200341f0026a41086a290300370000200341e0046a41086a22054200370300200342003703e0042002412e200341e0046a1001200341d0036a41086a2005290300370300200320032903e0043703d003200341103602e4012003200341d0036a3602e001200341e0036a200341e0016a10f8022002101d20034184046a280200450d0220034180046a280200101d0c020b4199f0c1002102411921050c0c0b2002101d0b410021024101210a4101210c0c190b410e41011020000b412e41011020000b410e41011020000b412e41011020000b412041011020000b410e41011020000b412e41011020000b41df88c0004133103a000b410e41011020000b412e41011020000b4101210a4101210c20012d00002204410f4d0d0f0c100b200c101d0b20020d0041d7c0c100210c41012102410021134100210541d7c0c1000d020c010b200341d0026a41026a220c200341d0036a41026a2d00003a0000200341e0016a41086a220920034190036a41086a290300370300200341e0016a410d6a221320034190036a410d6a290000370000200320032f01d0033b01d00220032003290390033703e00102400240024002404120101f2202450d00200220032f01d0023b00002002201836000720022005360003200220032903e00137000b200241026a200c2d00003a0000200241136a2009290300370000200241186a20132900003700000240024020172004460d00200341f0026a41026a2205200d41276a2d00003a0000200341e0036a41086a220c200d41386a290000370300200341e0036a410d6a2209200d413d6a2900003700002003200d2f00253b01f0022003200d2900303703e003200d41c8006a2104200d41246a2d000022134102470d014100210c410121134101210541000d070c060b201721044100210c410121134101210541000d060c050b200d28002c211b200d2800282116200341e0046a41026a20052d00003a000020034198016a41086a200c29030037030020034198016a410d6a2009290000370000200320032f01f0023b01e004200320032903e003370398010240024020134101470d00200341b0036a201641067610b00120032802b003210c20032802b8032016413f7122054d0d01200341d0036a41026a200c20054105746a220541026a2d00003a0000200528000321162005280007211b20052f000021092003419d036a200541186a29000037000020034198036a200541136a290000370300200320093b01d0032003200529000b370390034101210520032802b403450d040c030b200341d0036a41026a200341e0046a41026a2d00003a000020034190036a41086a20034198016a41086a29030037030020034190036a410d6a20034198016a410d6a290000370000200320032f01e0043b01d0032003200329039801370390030c040b410021052018211b20032802b4030d010c020b412041011020000b200c101d0b20050d0041d7c0c100210c410121134101210541d7c0c1000d020c010b200341d0026a41026a221c200341d0036a41026a221d2d00003a0000200341e0016a41086a221e20034190036a41086a221f290300370300200341e0016a410d6a222020034190036a410d6a2221290000370000200320032f01d0033b01d00220032003290390033703e001200a41246c41b87f6a2122200341eb036a211a200341e7036a2123200341e3036a21244102212541202118410221134100210941012105024002400240024003402023201b36000020242016360000201a20032903e001370000200341e0036a41026a201c2d00003a0000201a41086a201e290300370000201a410d6a2020290000370000200320032f01d0023b01e00302402013417f6a2005470d002025201320132025491b2205ad4205862206422088a70d0a2006a7220c4100480d0a20022018200c101e2202450d050b200220186a220c20032901e003370000200c41186a200341e0036a41186a290100370000200c41106a200341e0036a41106a290100370000200c41086a200341e0036a41086a2226290100370000200941f803460d02024020222009460d00200341f0026a41026a2227200d20096a220c41cb006a2d00003a00002026200c41dc006a290000370300200341e0036a410d6a2228200c41e1006a2900003700002003200c41c9006a2f00003b01f0022003200c41d4006a2900003703e003200c41c8006a2d000022294102460d02200c41d0006a280000212a200c41cc006a2800002116200341e0046a41026a222b20272d00003a000020034198016a41086a2227202629030037030020034198016a410d6a22262028290000370000200320032f01f0023b01e004200320032903e003370398010240024020294101470d00200341b0036a201641067610b0012016413f7121264100212720032802b00321280240200341b0036a41086a28020020264d0d00201d202820264105746a222641026a2d00003a0000202628000321162026280007211b20262f000021272021202641186a290000370000201f202641136a290000370300200320273b01d0032003202629000b37039003410121270b024020032802b403450d002028101d0b20270d010c060b201d202b2d00003a0000201f202729030037030020212026290000370000200320032f01e0043b01d003200320032903980137039003202a211b0b200441246a2104201c201d2d00003a0000201e201f29030037030020202021290000370000200320032f01d0033b01d00220032003290390033703e001202541026a2125201841206a2118201341016a2113200941246a21090c010b0b201721044100210c41000d050c040b200c41ec006a21040b4100210c41000d030c020b200c41ec006a210441d7c0c100210c41d7c0c1000d020c010b200c41011020000b410021160c010b4101211602402005450d002002101d0b200c2102411521050b200341c0006a412c6a2109200d200a41246c6a210c02400340200c2004460d0120042d0000210a200441246a2104200a4102470d000b0b0240200b450d00200d101d0b02402016450d004100210420120d050c060b200910e40120032013360228200320053602242003200236022002400240024002400240024002400240024002404112101f2202450d00200241106a41002f00cbc5413b0000200241086a41002900c3c541370000200241002900bbc541370000200241124132101e2208450d01200820092900003700122008412a6a200941186a290000370000200841226a200941106a2900003700002008411a6a200941086a290000370000200341e0046a41086a22024200370300200342003703e00420084132200341e0046a1001200341d0036a41086a2002290300370300200320032903e0043703d003200341e0016a200341d0036a105d0240024002400240024020032d00ec0122024102470d00200341e0046a41086a22024200370300200342003703e00441adeec100411a200341e0046a1001200341d0036a41086a22052002290300370300200320032903e0043703d003200341d0036a411041f8b3c200410041001002417f460d01200341f8036a4200370300200341e0036a41106a4200370300200341e0036a41086a4200370300200342003703e003200341d0036a4110200341e0036a4120410010022202417f460d072002411f4d0d07200341e0046a41026a220220032d00e2033a0000200341f0026a41086a2205200341f3036a290000370300200341f0026a410d6a2204200341f8036a290000370000200320032f01e0033b01e004200320032900eb033703f00220032800e303211320032800e703211620034190016a41026a220a20022d00003a0000200341d0026a41086a22022005290300370300200341d0026a410d6a22052004290000370000200320032f01e0043b019001200320032903f0023703d00220034194016a41026a200a2d00003a0000200341b0036a41086a2002290300370300200341b0036a410d6a2005290000370000200320032f0190013b019401200320032903d0023703b0034112101f2202450d08200241106a41002f00cbc5413b0000200241086a41002900c3c541370000200241002900bbc541370000200241124132101e2212450d09201220032f0194013b00122012201636001920122013360015201220032903b00337001d201241146a20034194016a41026a2d00003a0000201241256a200341b0036a41086a2903003700002012412a6a200341bd036a290000370000200341e0046a41086a22024200370300200342003703e00420124132200341e0046a1001200341d0036a41086a22052002290300370300200320032903e0043703d003200341e0036a200341d0036a105d20032d00ec034102460d0a20032802e403211720032802e003211820032802e803210420034198016a200341ec036a41c20010ce031a200341e0036a20034198016a41c20010ce031a20032d008104211a20024200370300200342003703e00420124132200341e0046a100120052002290300370300200320032903e0043703d0032003420137039801200341003602a001200320043602f002200341f0026a20034198016a106220032802a00121052004450d022004410574210b410020056b2104200328029c01210a2018210203400240024002400240200a20046a41204f0d00200541206a220c2005490d15200a410174220d200c200c200d491b220d4100480d15200a450d01200328029801200a200d101e220c0d020c090b200328029801210c0c020b200d101f220c450d070b2003200d36029c012003200c36029801200d210a0b20034198016a41086a200541206a220d360200200c20056a220541086a200241086a290000370000200541106a200241106a290000370000200541186a200241186a29000037000020052002290000370000200441606a2104200d2105200241206a2102200b41606a220b0d000c040b0b20034190036a41086a200341f5016a290000370300200341a0036a200341fd016a29000037030020034190036a41186a20034185026a2900003703002003413c6a41026a20034190026a2d00003a00002003200341e0016a410d6a2900003703900320032003418e026a2f01003b013c2003418d026a2d0000210520034191026a280000211320034195026a280000211620032802e401210420032802e001210a200341b0026a410d6a200341a6026a290000370000200341b0026a41086a200341a1026a290000370300200320034199026a2900003703b0022004450d0d200a101d0c0d0b20024200370300200342003703e00441adeec100411a200341e0046a100120052002290300370300200320032903e0043703d0034120101f2202450d0920022009290000370000200241186a200941186a290000370000200241106a200941106a290000370000200241086a200941086a290000370000200341d0036a41102002412010032002101d41002105410021020c0c0b2005210d0b024002400240200328029c01200d470d00200d41016a2202200d490d0f200d4101742205200220022005491b22054100480d0f200d450d01200328029801200d2005101e2202450d020c0b0b20032802980121020c0b0b2005101f22020d090b200541011020000b200d41011020000b411241011020000b413241011020000b41df88c0004133103a000b411241011020000b413241011020000b4193f1c100419f01103a000b412041011020000b2003200536029c0120032002360298010b20034198016a41086a220a200d41016a3602002002200d6a41013a000002400240024002400240200328029c01220c200a28020022046b411f4b0d00200441206a22052004490d07200c410174220d20052005200d491b22054100480d07200c450d012002200c2005101e2202450d020c030b200c21050c030b2005101f22020d010b200541011020000b2003200536029c0120032002360298010b200a200441206a220d360200200220046a220a41086a200941086a290000370000200a41106a200941106a290000370000200a41186a200941186a290000370000200a200929000037000002400240024002400240024002400240024002400240024020034182046a4100201a4101461b220a450d002005200d470d01200541016a220c2005490d0e2005410174220b200c200c200b491b220c4100480d0e2005450d0320022005200c101e2202450d040c090b2005200d470d01200541016a220a2005490d0d2005410174220c200a200a200c491b220b4100480d0d2005450d0420022005200b101e2202450d050c060b2005210c0c080b2005210b0c050b200c101f22020d050b200c41011020000b200b101f22020d010b200b41011020000b2003200b36029c0120032002360298010b200341a0016a200441216a22043602002002200d6a41003a00000c020b2003200c36029c0120032002360298010b20034198016a41086a221a200441216a22053602002002200d6a41013a000002400240024002400240200c20056b411f4b0d00200541206a220d2005490d08200c410174220b200d200d200b491b220b4100480d08200c450d012002200c200b101e2202450d020c030b200c210b0c030b200b101f22020d010b200b41011020000b2003200b36029c0120032002360298010b201a200441c1006a2204360200200220056a220541086a200a41086a290000370000200541106a200a41106a290000370000200541186a200a41186a2900003700002005200a2900003700000b200341d0036a41102002200410030240200b450d002002101d0b02402017450d002018101d0b2012101d200341e0046a41086a22024200370300200342003703e00441adeec100411a200341e0046a1001200341d0036a41086a2002290300370300200320032903e0043703d0034120101f2202450d0420022009290000370000200241186a200941186a290000370000200241106a200941106a290000370000200241086a200941086a290000370000200341d0036a41102002412010032002101d2003413c6a41026a20034194016a41026a2d00003a0000200341b0026a41086a200341b0036a41086a290300370300200341b0026a410d6a200341b0036a410d6a290000370000200320032f0194013b013c200320032903b0033703b00241012105410021020b20034185046a20053a00002003418d046a201636000020034189046a2013360000200341e0036a410d6a20034190036a41086a290300370000200341f5036a20034190036a41106a290300370000200341fd036a20034190036a41186a29030037000020034186046a20032f013c3b010020034188046a2003413e6a2d00003a000020034191046a20032903b00237000020034199046a200341b0026a41086a2903003700002003419e046a200341b0026a410d6a290000370000200320023a00e40320032003290390033700e5032003200341206a3602e003200341e0046a41086a22024200370300200342003703e00420084132200341e0046a1001200341d0036a41086a2002290300370300200320032903e0043703d003200341003602e801200342013703e001200328022021022003200341206a41086a28020022053602980120034198016a200341e0016a106202402005450d002005410574210d4100200341e0016a41086a28020022056b210a20032802e001210b20032802e401210c03400240200c200a6a411f4b0d00200541206a22042005490d04200c4101742209200420042009491b22044100480d0402400240200c450d00200b200c2004101e220b0d010c070b2004101f220b450d060b2004210c0b200b20056a22042002290000370000200441186a200241186a290000370000200441106a200241106a290000370000200441086a200241086a290000370000200a41606a210a200541206a2105200241206a2102200d41606a220d0d000b200341e8016a20053602002003200c3602e4012003200b3602e0010b200341e0036a410472200341e0016a10ca0120032802e4012102200341d0036a411020032802e0012205200341e0016a41086a280200100302402002450d002005101d0b2008101d02402003280224450d002003280220101d0b0240200341e4006a280200450d00200341e0006a280200101d0b4100210c4101210a0b4100210220012d00002204410f4d0d080c090b1021000b200441011020000b412041011020000b2008101d0b20040d004100210c4101210a20012d00002204410f4d0d030c040b4100210c4101210a200b450d010b200d101d20012d00002204410f4d0d010c020b20012d00002204410f4b0d010b410120047441beff01710d01024020044106460d002004410f470d01200a450d02200141086a280200450d02200141046a280200101d0c020b200c450d01200141086a280200450d01200141046a280200101d0c010b200141086a280200450d00200141046a280200101d0b2000200536020420002002360200200341f0046a24000b130020004102360204200041c8afc4003602000b130020004100360204200041f8b3c2003602000b130020004101360204200041a4d9c3003602000b13002000410336020420004188f4c2003602000b130020004101360204200041d4c1c3003602000b13002000410336020420004190ddc3003602000b13002000410936020420004194d9c2003602000b130020004104360204200041b08cc3003602000b130020004102360204200041e8aac3003602000b130020004105360204200041cca4c4003602000b13002000410136020420004180acc3003602000b13002000410536020420004198c2c3003602000b130020004108360204200041e8f5c1003602000b130020004111360204200041c894c4003602000b130020004104360204200041e08fc4003602000b130020004106360204200041d08cc4003602000b130020004102360204200041b4adc3003602000b3201017f02404108101f2202450d0020004288808080800137020420002002360200200242003700000f0b410841011020000bd40101017f024002400240024002404104101f2202450d002002410036000020024104410c101e2202450d01200242013700042002410c4118101e2202450d022002420137000c200241184130101e2202450d03200242013700242002420137001c200242013700142002413041e000101e2202450d042002428080848080023700442002420137003c200242013700342002420137002c200042e0808080c009370204200020023602000f0b410441011020000b410c41011020000b411841011020000b413041011020000b41e00041011020000b3401017f02404108101f2202450d0020004288808080800137020420002002360200200242c0843d3700000f0b410841011020000b3301017f02404104101f2202450d0020004284808080c00037020420002002360200200241e4003600000f0b410441011020000b3301017f02404108101f2202450d0020004288808080800137020420002002360200200242af013700000f0b410841011020000b3301017f02404108101f2202450d002000428880808080013702042000200236020020024287013700000f0b410841011020000b3901017f02404110101f2202450d002002420037000820024215370000200042908080808002370204200020023602000f0b411041011020000bb50806047f017e017f017e017f077e230041106b22022400200241003602082001410020012802002001280204200241086a41042001280208100222032003417f461b2203410420034104491b20012802086a220436020802400240200341034d0d00200228020821054200210620024200370308200141086a220741002001280200200141046a280200200241086a41082004100222032003417f461b2203410820034108491b20072802006a2204360200200341074d0d01200229030821084200210620024200370308200741002001280200200141046a2209280200200241086a41082004100222032003417f461b2203410820034108491b20072802006a2204360200200341074d0d012002290308210a4200210620024200370308200141086a2207410020012802002009280200200241086a41082004100222032003417f461b2203410820034108491b20072802006a2204360200200341074d0d012002290308210b4200210620024200370308200741002001280200200141046a2209280200200241086a41082004100222032003417f461b2203410820034108491b20072802006a2204360200200341074d0d012002290308210c4200210620024200370308200141086a2207410020012802002009280200200241086a41082004100222032003417f461b2203410820034108491b20072802006a2204360200200341074d0d012002290308210d4200210620024200370308200741002001280200200141046a2209280200200241086a41082004100222032003417f461b2203410820034108491b20072802006a2204360200200341074d0d012002290308210e4200210620024200370308200141086a2207410020012802002009280200200241086a41082004100222032003417f461b2203410820034108491b20072802006a2204360200200341074d0d012002290308210f4200210620024200370308200741002001280200200141046a2209280200200241086a41082004100222032003417f461b2203410820034108491b20072802006a2204360200200341074d0d01200229030821102009280200210320024100360208200141086a2207410020012802002003200241086a41042004100222032003417f461b2203410420034104491b20072802006a2204360200200341034d0d0120022802082109200141046a2802002103200241003602082007410020012802002003200241086a41042004100222012001417f461b2201410420014104491b20072802006a360200200141034d0d01200041d0006a2002280208360200200041cc006a2009360200200041c8006a2005360200200041c0006a2010370300200041386a200f370300200041306a200e370300200041286a200d370300200041206a200c370300200041186a200b370300200041106a200a37030020002008370308420121060c010b420021060b20002006370300200241106a24000be80102037f017e230041206b22012400200141106a41086a220242003703002001420037031041e0f2c1004111200141106a1001200141086a220320022903003703002001200129031037030042002104024002402001411041f8b3c200410041001002417f460d002001420037031020014110200141106a41084100100241016a41084d0d01200129031021040b200242003703002001420037031041e0f2c1004111200141106a100120032002290300370300200120012903103703002001200420007c37031020014110200141106a41081003200141206a24000f0b41df88c0004133103a000be94902107f037e23004190046b2203240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d000022044101460d0020044102470d11200141216a2d00002105200141246a2802002106200341306a200141196a290000370300200341286a200141116a290000370300200341186a41086a200141096a29000037030020032001290001370318200241096a2800002107200241056a280000210820022d0001210920022d0000210a20034180046a41026a200241046a2d00003a0000200341b0026a41086a220b200241156a290000370300200341b0026a410d6a220c2002411a6a2900003700002003200241026a2f01003b01800420032002410d6a2900003703b002200a450d01410121020c020b200141086a2802002104200141046a2802002106200241096a2800002107200241056a280000210820022d0001210a20022d0000210120034180046a41026a2209200241046a2d00003a0000200341b0026a41086a220b200241156a290000370300200341b0026a410d6a220c2002411a6a2900003700002003200241026a2f01003b01800420032002410d6a2900003703b0022001450d03410121020c040b200341c0006a41026a220a20034180046a41026a2d00003a0000200341d0016a41086a200b290300370300200341d0016a410d6a200c290000370000200320032f0180043b0140200320032903b0023703d00141012102200941ff01714101470d00200341f0006a41026a200a2d00003a0000200341b0026a41086a200341d0016a41086a290300370300200341b0026a410d6a200341d0016a410d6a290000370000200320032f01403b0170200320032903d0013703b002410021020c010b41f1b4c0002108412a21070b2003413c6a41026a220a200341f0006a41026a2d00003a0000200341a0036a41086a2209200341b0026a41086a290300370300200341a0036a41106a200341b0026a41106a290300370300200320032f01703b013c200320032903b0023703a00320020d23200341e3006a2009290300370000200341e8006a200341ad036a290000370000200320032f013c3b01502003200736005720032008360053200320032903a00337005b2003200a2d00003a0052200341d0006a10cd02450d034115101f2202450d0e2002410d6a410029008b9c42370000200241086a41002900869c42370000200241002900fe9b42370000200241154135101e2202450d0f200220032903183700152002412d6a200341306a290300370000200241256a200341186a41106a2903003700002002411d6a200341186a41086a29030037000020034180046a41086a2207420037030020034200370380042002413520034180046a1001200341c0006a41086a20072903003703002003200329038004370340200341c0006a411041f8b3c200410041001002417f460d062003200341c0006a3602d001200341103602d401200341003602b00220034100200341c0006a4110200341b0026a41044100100222072007417f461b22074104200741044922081b22073602d80120080d1320032802b002210d200341003602b002200341d8016a4100200341c0006a4110200341b0026a41042007100222082008417f461b2208410420084104491b20076a360200200841034d0d1320032802b002210e200341a0036a200341d0016a105e20032802a003220f450d13200341a0036a41086a280200210920032802a4032110200341b0026a200341d0016a105e20032802b0022211450d12200341b0026a41086a280200210b20032802b40221122002101d2006200d470d08200f20094105746a210a200f2102410021080340200a20026b41ff004d0d0b200341d0006a2002460d0c20082002200341d0006a412010d00322074100476a21082007450d0c200241206a2207200341d0006a460d0c20082007200341d0006a412010d00322074100476a21082007450d0c200241c0006a2207200341d0006a460d0c20082007200341d0006a412010d00322074100476a21082007450d0c200241e0006a2207200341d0006a460d0c20024180016a210220082007200341d0006a412010d00322074100476a210820070d000c0c0b0b200341c0006a41026a20092d00003a0000200341d0016a41086a200b290300370300200341d0016a410d6a200c290000370000200320032f0180043b0140200320032903b0023703d00141012102200a41ff01714101470d00200341d0006a41026a200341c0006a41026a2d00003a0000200341b0026a41086a200341d0016a41086a290300370300200341b0026a410d6a200341d0016a410d6a290000370000200320032f01403b0150200320032903d0013703b002410021020c010b41f1b4c0002108412a21070b2003413c6a41026a2201200341d0006a41026a2d00003a0000200341a0036a41086a220a200341b0026a41086a290300370300200341a0036a41106a200341b0026a41106a290300370300200320032f01503b013c200320032903b0023703a00320020d0220034183016a200a290300370000200341f0006a41186a200341ad036a290000370000200320032f013c3b01702003200736007720032008360073200320032903a00337007b200320012d00003a0072200341f0006a10cd02450d01200341003602b802200342013703b0022004200341b0026a10b20120032802b402210820032802b802210a20032802b0022107200341b0026a41186a22094200370300200341b0026a41106a22024200370300200341b0026a41086a22014200370300200342003703b0022007200a200341b0026a1000200341d0016a41186a2009290300370300200341d0016a41106a220a2002290300370300200341d0016a41086a22092001290300370300200320032903b0023703d00102402008450d002007101d0b200341b0026a41186a200341d0016a41186a2903003703002002200a29030037030020012009290300370300200320032903d0013703b0024119101f2202450d0d200241186a41002d00939b423a0000200241106a410029008b9b42370000200241086a41002900839b42370000200241002900fb9a42370000200241194139101e2202450d0e200220032903b002370019200241316a200341c8026a290300370000200241296a200341b0026a41106a290300370000200241216a200341b0026a41086a29030037000020034180046a41086a2201420037030020034200370380042002413920034180046a1001200341a0036a41086a200129030037030020032003290380043703a003200341a0036a411041f8b3c20041004100100221012002101d2001417f460d0441949bc2002108411f21070c020b41939cc20021084114210720044101460d200c210b41b39bc2002108411721070b2004103c2004101d0c1f0b2002101d41a79cc20021084113210720044101460d1d0c1e0b200641014b0d01200341b0026a200441e00010ce031a200341013a00a003200341013602a403200341086a200341b0026a200341a0036a108a01200341d5026a2003280208453a0000200341c5026a200341e0016a290300370000200341cd026a200341e8016a290300370000200341083a00b002200341bd026a200341d0016a41086a290300370000200341043a00b402200320032903d0013700b502200341b0026a108b010c110b41ba9cc2002108411021072010450d190c180b20034180046a41086a22024200370300200342003703800441ca9bc200411c20034180046a1001200341c0006a41086a200229030037030020032003290380043703404100210f0240200341c0006a411041f8b3c200410041001002417f460d00200341003602b002200341c0006a4110200341b0026a41044100100241016a41044d0d0b20032802b002210f0b20034180046a41086a22024200370300200342003703800441ca9bc200411c20034180046a1001200341c0006a41086a2002290300370300200320032903800437034002400240200341c0006a411041f8b3c200410041001002417f460d00200341003602b002200341c0006a4110200341b0026a41044100100241016a41044d0d0d20032802b00241016a21010c010b410121010b20034180046a41086a22024200370300200342003703800441ca9bc200411c20034180046a1001200341c0006a41086a220720022903003703002003200329038004370340200320013602b002200341c0006a4110200341b0026a4104100320024200370300200342003703800441e69bc200411820034180046a10012007200229030037030020032003290380043703404100210202400240200341c0006a411041f8b3c200410041001002417f460d00200342103702a4032003200341c0006a3602a003200341b0026a200341a0036a105e20032802b0022205450d0e200341b0026a41086a2201280200210720032802b4022102200341b0026a41186a200341d0016a41186a290300370300200341b0026a41106a200341d0016a41106a2903003703002001200341d0016a41086a290300370300200320032903d0013703b002200341b0026a21012002211120072002460d010c100b200341b0026a41186a200341d0016a41186a290300370300200341b0026a41106a200341d0016a41106a290300370300200341b0026a41086a200341d0016a41086a290300370300200320032903d0013703b00241012105200341b0026a21010b200241016a22072002490d1020024101742208200720072008491b2211ad4205862213422088a70d102013a722084100480d10024002402002450d0020022107200520024105742008101e2205450d010c100b200221072008101f22050d0f0b200841011020000b2002200a460d01200f20094105746a210a0340200341d0006a2002460d0120082002200341d0006a412010d00322074100476a21082007450d0141002106200a200241206a2202470d000c0d0b0b410121060c0b0b410021060c0a0b200341c4026a4101360200200341183602a403200341c0adc4003602a003200342013702b402200341c8adc4003602b0022003200341a0036a3602c002200341b0026a41d0adc40010cf01000b411541011020000b413541011020000b411941011020000b413941011020000b2010450d00200f101d0b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b2011200b4105746a210c2011210241002107024002400240024002400240024002400240024002400240024002400240024002400340200c20026b41ff004d0d01200341d0006a2002460d0220072002200341d0006a412010d003220a4100476a2107200a450d02200241206a220a200341d0006a460d022007200a200341d0006a412010d003220a4100476a2107200a450d02200241c0006a220a200341d0006a460d022007200a200341d0006a412010d003220a4100476a2107200a450d02200241e0006a220a200341d0006a460d0220024180016a21022007200a200341d0006a412010d003220a4100476a2107200a0d000c020b0b2002200c460d022011200b4105746a210c0340200341d0006a2002460d0120072002200341d0006a412010d003220a4100476a2107200a450d014100210a200c200241206a2202470d000c020b0b4101210a0b200541ff0171450d010c020b4100210a200541ff01710d010b200a0d01200341b0026a41186a2207200341d0006a41186a290300370300200341b0026a41106a220a200341d0006a41106a290300370300200341b0026a41086a220c200341d0006a41086a290300370300200320032903503703b00202402012200b470d00200b41016a2202200b490d0f200b4101742212200220022012491b2212ad4205862213422088a70d0f2013a722024100480d0f02400240200b450d002011200b4105742002101e2211450d010c020b2002101f22110d010b200241011020000b2011200b4105746a220220032903b002370000200241186a2007290300370000200241106a200a290300370000200241086a200c290300370000200b41016a210b2006450d030240200920084d0d00200f2009417f6a22094105746a220229000021132002290008211420022900102115200f20084105746a220741186a200241186a2900003700002007201537001020072014370008200720133700000c040b4198adc40020082009104b000b20060d00200341b0026a41186a2208200341d0006a41186a290300370300200341b0026a41106a220c200341d0006a41106a290300370300200341b0026a41086a2206200341d0006a41086a290300370300200320032903503703b00220102009470d01200941016a22022009490d0d20094101742210200220022010491b2210ad4205862213422088a70d0d2013a722024100480d0d024002402009450d00200f20094105742002101e220f450d010c030b2002101f220f0d020b200241011020000b41ca9cc20021084116210720100d130c140b200f20094105746a220220032903b002370000200241186a2008290300370000200241106a200c290300370000200241086a2006290300370000200941016a2109200a450d00200b20074d0d012011200b417f6a220b4105746a220229000021132002290008211420022900102115201120074105746a220741186a200241186a2900003700002007201537001020072014370008200720133700000b200341d5026a2003290318370000200341b0026a41156a200341d0006a41106a290300370000200341cd026a200341d0006a41186a290300370000200341e5026a200341186a41106a290300370000200341ed026a200341186a41186a290300370000200341083a00b002200341bd026a200341d0006a41086a290300370000200341dd026a200341186a41086a290300370000200341013a00b402200320032903503700b502200341fc026a200b360200200341f8026a2009360200200341f5026a20053a0000200341b0026a108b0120034180046a41086a22024200370300200342003703800441dfd9c000411520034180046a1001200341b0026a41086a200229030037030020032003290380043703b002410021020240024002400240200341b0026a411041f8b3c200410041001002417f460d00200342103702d4012003200341b0026a3602d001200341a0036a200341d0016a10a40120032802a0032207450d0120032902a4032213422088a721022013a7450d002007101d0b02402009200e4f22080d0041002002200b6b2207200720024b1b200e490d00200341cc026a200b360200200341c8026a2012360200200341c0026a2009360200200341bc026a2010360200200320113602c4022003200f3602b8022003200e3602b4022003200d3602b0024115101f2202450d022002410d6a410029008b9c42370000200241086a41002900869c42370000200241002900fe9b42370000200241154135101e2202450d03200220032903183700152002412d6a200341306a290300370000200241256a200341186a41106a2903003700002002411d6a200341186a41086a29030037000020034180046a41086a2207420037030020034200370380042002413520034180046a1001200341c0006a41086a20072903003703002003200329038004370340200341103602a4032003200341c0006a3602a003200341b0026a200341a0036a10b6022002101d2010450d0b0c0a0b024002402008450d00200341c5026a200341186a41106a290300370000200341cd026a200341186a41186a290300370000200341083a00b002200341bd026a200341186a41086a290300370000200341023a00b402200320032903183700b502200341b0026a108b014119101f2202450d06200241186a41002d00939b423a0000200241106a410029008b9b42370000200241086a41002900839b42370000200241002900fb9a42370000200241194139101e2202450d0720022003290318370019200241316a200341306a290300370000200241296a200341186a41106a290300370000200241216a200341186a41086a29030037000020034180046a41086a2207420037030020034200370380042002413920034180046a1001200341c0006a41086a20072903003703002003200329038004370340410f21070240200341c0006a411041f8b3c200410041001002417f460d0020034210370284042003200341c0006a36028004200341b0026a20034180046a10a30120032802b0022207410f460d09200341a0036a200341b0026a41047241dc0010ce031a200341c0006a411010090b200341d0016a200341a0036a41dc0010ce031a2007410f470d012002101d411521074115101f22020d090c0a0b200341c5026a200341286a290300370000200341cd026a200341306a290300370000200341083a00b002200341bd026a200341186a41086a290300370000200341033a00b402200320032903183700b502200341b0026a108b01411521074115101f2202450d090c080b200341f0006a200341d0016a41dc0010ce031a2002101d200320073602b002200341b0026a410472200341f0006a41dc0010ce031a200341013a00a0032003200e3602a403200341106a200341b0026a200341a0036a108a01200341d5026a2003280210453a0000200341c5026a200341286a290300370000200341cd026a200341306a290300370000200341083a00b002200341bd026a200341186a41086a290300370000200341043a00b402200320032903183700b502200341b0026a108b01411521074115101f22020d070c080b41df88c0004133103a000b411541011020000b413541011020000b4198adc4002007200b104b000b411941011020000b413941011020000b41df88c0004133103a000b2002410d6a410029008b9c42370000200241086a41002900869c42370000200241002900fe9b4237000002400240200220074135101e2202450d00200220032903183700152002412d6a200341186a41186a290300370000200241256a200341186a41106a2903003700002002411d6a200341186a41086a2903003700004200211320034180046a41086a2207420037030020034200370380042002413520034180046a1001200341a0036a41086a200729030037030020032003290380043703a003200341a0036a411010092002101d20074200370300200342003703800441e69bc200411820034180046a1001200341c0006a41086a2007290300370300200320032903800437034002400240200341c0006a411041f8b3c200410041001002417f460d00200342103702a4032003200341c0006a3602a003200341b0026a200341a0036a105e20032802b0022205450d0320032902b40221130c010b410121050b4100210c02400240024002402013422088a7220a450d00410021094100210c410021070240034002400240200c450d00200520074105746a21022005200720096a4105746a210803402007200a4f0d06200341186a2002460d022002200341186a412010d003450d02200920076a220b200a4f0d0720082002290000370000200841186a200241186a290000370000200841106a200241106a290000370000200841086a200241086a290000370000200241206a2102200841206a2108200a200741016a2207470d000c050b0b200520074105746a210203402007200a4f0d05200341186a2002460d012002200341186a412010d003450d01200241206a2102200a200741016a2207470d000c030b0b2009417f6a2109200c41016a210c200741016a2207200a470d000c020b0b4100210c0b20034180046a41086a22024200370300200342003703800441e69bc200411820034180046a1001200341c0006a41086a20022903003703002003200329038004370340200341003602b802200342013703b0022003200a200c6b22023602a003200341a0036a200341b0026a1062024002402002450d00200a410574200c4105746b210b4100200341b0026a41086a28020022076b210a20032802b002210c20032802b402210920052102034002402009200a6a411f4b0d00200741206a22082007490d0e20094101742206200820082006491b22084100480d0e024002402009450d00200c20092008101e220c0d010c080b2008101f220c450d070b200821090b200c20076a22082002290000370000200841186a200241186a290000370000200841106a200241106a290000370000200841086a200241086a290000370000200a41606a210a200741206a2107200241206a2102200b41606a220b0d000b200341b8026a2007360200200320093602b4022003200c3602b0020c010b200341b0026a41086a280200210720032802b402210920032802b002210c0b200341c0006a4110200c2007100302402009450d00200c101d0b02402013a7450d002005101d0b20100d060c070b41c8aac3002007200a104b000b41d8aac300200b200a104b000b200841011020000b413541011020000b41df88c0004133103a000b200741011020000b200f101d0b02402012450d002011101d0b4100210820044101470d0d0c0c0b2005200741057422086a22022001290000370000200241186a200141186a290000370000200241106a200141106a290000370000200241086a200141086a29000037000020034180046a41086a22024200370300200342003703800441e69bc200411820034180046a1001200341c0006a41086a20022903003703002003200329038004370340200341003602b802200342013703b0022003200741016a22023602a003200341a0036a200341b0026a1062024002402002450d00200841206a21094100200341b0026a41086a28020022016b210820032802b002210b20032802b402210a2005210203400240200a20086a411f4b0d00200141206a22072001490d05200a410174220c20072007200c491b22074100480d0502400240200a450d00200b200a2007101e220b0d010c080b2007101f220b450d070b2007210a0b200b20016a22072002290000370000200741186a200241186a290000370000200741106a200241106a290000370000200741086a200241086a290000370000200841606a2108200141206a2101200241206a2102200941606a22090d000b200341b8026a20013602002003200a3602b4022003200b3602b0020c010b200341b0026a41086a280200210120032802b402210a20032802b002210b0b200341c0006a4110200b200110030240200a450d00200b101d0b02402011450d002005101d0b200341a0036a41186a200341d0016a41186a290300370300200341a0036a41106a200341d0016a41106a290300370300200341a0036a41086a200341d0016a41086a290300370300200320032903d0013703a003200341b0026a200441e00010ce031a4119101f2202450d03200241186a41002d00939b423a0000200241106a410029008b9b42370000200241086a41002900839b42370000200241002900fb9a42370000200241194139101e2202450d04200220032903a003370019200241316a200341a0036a41186a2201290300370000200241296a200341a0036a41106a2207290300370000200241216a200341a0036a41086a220829030037000020034180046a41086a220a420037030020034200370380042002413920034180046a1001200341c0006a41086a200a29030037030020032003290380043703402003410036025820034201370350200341b0026a200341d0006a10b2012003280254210a200341c0006a411020032802502209200328025810030240200a450d002009101d0b2002101d200341b0026a103c2001200341d0016a41186a2903003703002007200341d0016a41106a2903003703002008200341d0016a41086a290300370300200320032903d0013703a0034120101f2202450d0520022003290370370000200341cc026a4100360200200341bc026a428180808010370200200241186a200341f0006a41186a290300370000200241106a200341f0006a41106a290300370000200241086a200341f0006a41086a290300370000200342013702c402200320023602b802200320063602b4022003200f3602b0024115101f2201450d062001410d6a410029008b9c42370000200141086a41002900869c42370000200141002900fe9b42370000200141154135101e2201450d07200120032903a0033700152001412d6a200341a0036a41186a290300370000200141256a200341a0036a41106a2903003700002001411d6a200341a0036a41086a29030037000020034180046a41086a2207420037030020034200370380042001413520034180046a1001200341c0006a41086a20072903003703002003200329038004370340200341103602542003200341c0006a360250200341b0026a200341d0006a10b6022001101d2002101d200341b0026a410d6a200341f0006a41086a290300370000200341c5026a200341f0006a41106a290300370000200341b0026a411d6a200341f0006a41186a290300370000200341b0026a41256a20032903d001370000200341b0026a412d6a200341d0016a41086a290300370000200341b0026a41356a200341d0016a41106a290300370000200341ed026a200341d0016a41186a290300370000200341003a00b402200341083a00b002200320032903703700b502200341fc026a2006360200200341f8026a200f360200200341b0026a108b010b2004101d410021080c0b0b1021000b200741011020000b411941011020000b413941011020000b412041011020000b411541011020000b413541011020000b200f101d0b2012450d002011101d20044101470d020c010b20044101470d010b200141086a2802002202103c2002101d0b200020073602042000200836020020034190046a24000bdc0d08047f077e017f017e037f057e017f057e23004180016b22012400200141286a41086a220242003703002001420037032841878ec2004118200141286a1001200141086a41086a2002290300370300200120012903283703084100210341102104024002400240200141086a411041f8b3c200410041001002417f460d002001421037021c2001200141086a360218200141286a200141186a10a40320012903284201520d02200141386a2903002105200141c0006a2903002106200141c8006a2903002107200141d0006a2903002108200141d8006a2903002109200141e0006a290300210a200141e8006a290300210b200141f0006a2802002103200141f4006a280200210c200141f8006a28020021042001290330210d2001200141fc006a280200220e360274200120043602702001200c36026c200120033602682001200b3703602001200a37035820012009370350200120083703482001200737034020012006370338200120053703302001200d3703280c010b4201210b41808004210c4201210a42012109420121084201210742012106420121054201210d0b200141286a41086a220242003703002001420037032841c4b9c000411b200141286a1001200141086a41086a220f200229030037030020012001290328370308024002400240024002400240200141086a411041f8b3c200410041001002417f460d002001420037033020014200370328200141086a4110200141286a4110410010022210417f460d022010410f4d0d02200141306a2903002111200129032821120c010b42002112420021110b200242003703002001420037032841d48ec2004111200141286a1001200f200229030037030020012001290328370308024002400240200141086a411041f8b3c200410041001002417f460d0020014100360228200141086a4110200141286a41044100100241016a41044d0d022001280228210f0c010b41e400210f0b42002113200141286a41086a220242003703002001420037032841e58ec2004114200141286a1001200141086a41086a20022903003703002001200129032837030802400240200141086a411041f8b3c200410041001002417f460d002001420037033020014200370328200141086a4110200141286a4110410010022202417f460d042002410f4d0d04200141306a2903002113200129032821140c010b421521140b42002115200141286a41086a220242003703002001420037032841f98ec2004114200141286a1001200141086a41086a221020022903003703002001200129032837030802400240200141086a411041f8b3c200410041001002417f460d002001420037033020014200370328200141086a4110200141286a4110410010022216417f460d052016410f4d0d05200141306a2903002117200129032821180c010b42002118420021170b2002420037030020014200370328418d8fc2004114200141286a1001201020022903003703002001200129032837030802400240200141086a411041f8b3c200410041001002417f460d002001420037033020014200370328200141086a4110200141286a4110410010022202417f460d062002410f4d0d06200141306a2903002119200129032821150c010b420021190b200141286a41086a220242003703002001420037032841a18fc2004114200141286a1001200141086a41086a2002290300370300200120012903283703080240024002400240200141086a411041f8b3c200410041001002417f460d0020014200370328200141086a4110200141286a41084100100241016a41084d0d022001290328211a0c010b428701211a0b200141286a41086a220242003703002001420037032841b58fc2004116200141286a1001200141086a41086a20022903003703002001200129032837030802400240200141086a411041f8b3c200410041001002417f460d0020014200370328200141086a4110200141286a41084100100241016a41084d0d032001290328211b0c010b42af01211b0b20002012370350200020153703800120002018370370200020143703602000200f3602a0012000200e36024c200020043602482000200c360244200020033602402000200b3703382000200a37033020002009370328200020083703202000200737031820002006370310200020053703082000200d3703002000201b370398012000201a37039001200041d8006a201137030020004188016a2019370300200041f8006a2017370300200041e8006a201337030020014180016a24000f0b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b41df88c0004133103a000b130020004102360204200041e8a7c4003602000b13002000410e360204200041a797c2003602000b130020004104360204200041b8a9c4003602000b02000b3101017f02404101101f2202450d00200042818080801037020420002002360200200241003a00000f0b410141011020000bd839030e7f017e017f230041c0006b220324002002280208220441586a2105200241106a2802002206412c6c210702400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024003402007450d01200741546a2107200541286a21082005412c6a2209210520082d00004104470d000b2006412c6c2107200441586a210503402007450d02200741546a2107200541286a21082005412c6a220a210520082d0000410b470d000b2006412c6c2107200441586a210503402007450d03200741546a2107200541286a21082005412c6a2204210520082d00004102470d000b200341106a20091044200328021420014d0d03200328021020014102746a2207450d03200341086a20041044200328020c200728020022074d0d04200328020820074104746a2207450d04200a41086a28020020014d0d05200a2802002109200341186a41086a420037030020034280808080c00037031820072d000d2108200341306a41026a220a2003412d6a41026a2d00003a0000200320032f002d3b01304110101f2207450d3f200341206a220b4101360200200341186a410c6a220528020021062003200736021c200720064104746a220741003a000c2007410036020820072008410447220c3602042007200c360200200720032f01303b000d2007410f6a200a2d00003a00002005200528020041016a3602004100210802402009200141186c6a22072802142205450d002007410c6a2106200741146a210a200341306a410472210d4100210841002107034002402003280218220920084d0d00200341306a200341186a410010b50320032802304101460d0920082003280218220920032802342d000c1b2108200a28020021050b200720054f0d3e02400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402006280200220120074104746a2d0000220541ab014b0d00024020050eac01141e0707071e13120c181915110e0d0b17160f1004040404040404040404040404040505050505050505050a1a06060606080000000000000000000008000000000000000000000000000000000000000000000303030101010101010101010101010101010303030101010101010101010101010101010303030303030301010101010101030303030303030101010101010102020202020202020202020202020202020202020202020202140b200341306a200341186a410210b60320032802300d2a2003280218220541016a22092005490d2b20032009360218200741016a2207200a2802002205490d1f0c200b200341306a200341186a410210b60320032802300d272003280218220541016a22092005490d2820032009360218200741016a2207200a2802002205490d1e0c1f0b200341306a200341186a410110b60320032802300d2a2003280218220541016a22092005490d2b20032009360218200741016a2207200a2802002205490d1d0c1e0b200341306a200341186a410110b60320032802300d2b2003280218220541016a22092005490d2c20032009360218200741016a2207200a2802002205490d1c0c1d0b200341306a200341186a410110b60320032802300d2c2003280218220541016a22092005490d2d20032009360218200741016a2207200a2802002205490d1b0c1c0b200341306a200341186a410210b6032003280230450d180c2f0b200941016a22052009490d2f20032005360218200741016a2207200a2802002205490d190c1a0b200120074104746a2d0001210e200341306a41026a2003412d6a41026a2d00003a0000200320032f002d3b0130200341246a2802002201200341206a280200470d01200141016a220f2001490d5b20014101742210200f200f2010491b2210ad4204862211422088a70d5b2011a722124100480d5b2001450d13200328021c20014104742012101e220f0d140c5c0b200341306a200341186a410110b60320032802300d2e2003280218220541016a22092005490d3020032009360218200741016a2207200a2802002205490d170c180b200328021c210f0c130b200941016a22052009490d3d20032005360218200741016a2207200a2802002205490d150c160b200941016a22052009490d3720032005360218200741016a2207200a2802002205490d140c150b200341306a200341186a200120074104746a41046a28020010b50320032802304101460d2f200341306a200341186a2003280234280204220510b60320032802300d41200341306a200341186a410110b60320032802300d4a2003280218220920056a22052009490d4b20032005360218200741016a2207200a2802002205490d130c140b200341306a200341186a410210b60320032802300d34200341306a200341186a410110b60320032802300d3e2003280218220541016a22092005490d4820032009360218200741016a2207200a2802002205490d120c130b200341306a200341186a410110b6032003280230450d0f0c300b200941016a22052009490d3720032005360218200741016a2207200a2802002205490d100c110b200341306a200341186a410110b6032003280230450d0d0c2f0b2003200410442003280204200120074104746a41046a28020022054d0d2b2003280200220920054104746a2201450d2b200341306a200341186a200920054104746a28020810b60320032802300d3b2003280218220520012d000d4104476a22092005490d4320032009360218200741016a2207200a2802002205490d0e0c0f0b200341306a200341186a200120074104746a41046a28020010b50320032802304101460d32200341306a200341186a200328023428020410b60320032802300d38200341246a2802002205417f6a220920054f0d41200920054b0d41200328021c20094104746a41013a000c200741016a2207200a2802002205490d0d0c0e0b200341246a22052802002209450d2420052009417f6a2209360200200328021c20094104746a22052d000c4102460d2420052802002109200320052802082205360218200520096a22092005490d3f20032009360218200741016a2207200a2802002205490d0c0c0d0b200341246a2802002205417f6a220920054f0d31200920054b0d31200328021c20094104746a41013a000c200741016a2207200a2802002205490d0b0c0c0b200341306a200120074104746a41046a280200200210b00320032802304101460d25200341306a200341186a2003280234220528020810b60320032802300d392003280218220920052d000d4104476a22052009490d3c20032005360218200741016a2207200a2802002205490d0a0c0b0b200341306a200341186a410110b60320032802300d2d2003280218220541016a22092005490d3920032009360218200741016a2207200a2802002205490d090c0a0b200341306a200341186a410110b6032003280230450d060c290b200341306a200341186a200120074104746a2209410c6a28020010b50320032802304101460d2120032802342802042101200941086a2802004102742105200941046a280200210903402005450d07200341306a200341186a200928020010b50320032802304101460d1b2005417c6a2105200941046a210920032802342802042001460d000c1c0b0b200341306a200341186a200c10b60320032802300d24200341246a2802002205417f6a220920054f0d30200920054b0d30200328021c20094104746a41013a000c200741016a2207200a2802002205490d060c070b200341306a200341186a410110b60320032802300d2e2003280218220541016a22092005490d3620032009360218200741016a2207200a2802002205490d050c060b2012101f220f450d480b200341206a20103602002003200f36021c200341246a28020021010b200f20014104746a220141003a000c2001200936020820012005410347200e41044722057136020420012005360200200120032f01303b000d2001410f6a200341326a2d00003a0000200341246a2205200528020041016a3602000b200741016a2207200a2802002205490d010c020b200341306a200341186a200110b60320032802300d39200341246a2802002205417f6a220920054f0d3a200920054b0d3a200328021c20094104746a41013a000c200741016a2207200a2802002205490d000b0b2000410036020020002008360204200b280200450d5c200328021c101d200341c0006a24000f0b4113101f2207450d382007410f6a41002800f4a642360000200741086a41002900eda642370000200741002900e5a642370000200041086a4293808080b0023702002000200736020420004101360200200341c0006a24000f0b410f101f2207450d38200741076a41002900ffa642370000200741002900f8a642370000200041086a428f808080f0013702002000200736020420004101360200200341c0006a24000f0b410f101f2207450d38200741076a410029008ea74237000020074100290087a742370000200041086a428f808080f0013702002000200736020420004101360200200341c0006a24000f0b4125101f2207450d392007411d6a41002900b3a742370000200741186a41002900aea742370000200741106a41002900a6a742370000200741086a410029009ea74237000020074100290096a742370000200041086a42a5808080d0043702002000200736020420004101360200200341c0006a24000f0b4125101f2207450d392007411d6a41002900b3a742370000200741186a41002900aea742370000200741106a41002900a6a742370000200741086a410029009ea74237000020074100290096a742370000200041086a42a5808080d0043702002000200736020420004101360200200341c0006a24000f0b4127101f2207450d3a2007411f6a41002900daa742370000200741186a41002900d3a742370000200741106a41002900cba742370000200741086a41002900c3a742370000200741002900bba742370000200041086a42a7808080f0043702002000200736020420004101360200200341c0006a24000f0b200041013602002000200d2902003702042000410c6a200d41086a280200360200200341206a280200450d550c540b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d530c540b410e101f2207450d3a200741066a41002900ffa742370000200741002900f9a742370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d520c530b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d510c520b410e101f2207450d39200741066a41002900ffa742370000200741002900f9a742370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d500c510b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d4f0c500b410e101f2207450d38200741066a41002900ffa742370000200741002900f9a742370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d4e0c4f0b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d4d0c4e0b410e101f2207450d37200741066a41002900ffa742370000200741002900f9a742370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d4c0c4d0b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d4b0c4c0b410e101f2207450d36200741066a41002900ffa742370000200741002900f9a742370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d4a0c4b0b200041013602002000200d2902003702042000410c6a200d41086a280200360200200341206a2802000d490c4a0b4127101f2207450d352007411f6a41002900a6a842370000200741186a410029009fa842370000200741106a4100290097a842370000200741086a410029008fa84237000020074100290087a842370000200041086a42a7808080f0043702002000200736020420004101360200200341206a2802000d480c490b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d470c480b410e101f2207450d34200741066a41002900ffa742370000200741002900f9a742370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d460c470b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d450c460b4117101f2207450d332007410f6a41002900f1a742370000200741086a41002900eaa742370000200741002900e2a742370000200041086a4297808080f0023702002000200736020420004101360200200341206a2802000d440c450b410e101f2207450d33200741066a41002900ffa742370000200741002900f9a742370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d430c440b200041013602002000200d2902003702042000410c6a200d41086a280200360200200341206a2802000d420c430b200041013602002000200d2902003702042000410c6a200d41086a280200360200200341206a2802000d410c420b200041013602002000200d2902003702042000410c6a200d41086a280200360200200341206a2802000d400c410b410e101f2207450d30200741066a41002900b4a842370000200741002900aea842370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d3f0c400b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d3e0c3f0b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d3d0c3e0b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d3c0c3d0b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d3b0c3c0b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d3a0c3b0b410e101f2207450d2b200741066a41002900ffa742370000200741002900f9a742370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d390c3a0b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d380c390b200041013602002000200d2902003702042000410c6a200d41086a280200360200200341206a2802000d370c380b4117101f2207450d292007410f6a41002900f1a742370000200741086a41002900eaa742370000200741002900e2a742370000200041086a4297808080f0023702002000200736020420004101360200200341206a2802000d360c370b410e101f2207450d29200741066a41002900ffa742370000200741002900f9a742370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d350c360b410e101f2207450d29200741066a41002900ffa742370000200741002900f9a742370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d340c350b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d330c340b4117101f2207450d282007410f6a41002900f1a742370000200741086a41002900eaa742370000200741002900e2a742370000200041086a4297808080f0023702002000200736020420004101360200200341206a2802000d320c330b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d310c320b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d300c310b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d2f0c300b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d2e0c2f0b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d2d0c2e0b410e101f2207450d23200741066a41002900ffa742370000200741002900f9a742370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d2c0c2d0b410e101f2207450d23200741066a41002900ffa742370000200741002900f9a742370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d2b0c2c0b410e101f2207450d23200741066a41002900ffa742370000200741002900f9a742370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d2a0c2b0b410e101f2207450d23200741066a41002900ffa742370000200741002900f9a742370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d290c2a0b4117101f2207450d232007410f6a41002900f1a742370000200741086a41002900eaa742370000200741002900e2a742370000200041086a4297808080f0023702002000200736020420004101360200200341206a2802000d280c290b410e101f2207450d23200741066a41002900ffa742370000200741002900f9a742370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d270c280b410e101f2207450d23200741066a41002900ffa742370000200741002900f9a742370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d260c270b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d250c260b410e101f2207450d22200741066a41002900ffa742370000200741002900f9a742370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d240c250b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d230c240b4117101f2207450d212007410f6a41002900f1a742370000200741086a41002900eaa742370000200741002900e2a742370000200041086a4297808080f0023702002000200736020420004101360200200341206a2802000d220c230b411341011020000b410f41011020000b410f41011020000b41f0aec40020072005104b000b412541011020000b412541011020000b411041041020000b412741011020000b1021000b201241041020000b410e41011020000b410e41011020000b410e41011020000b410e41011020000b410e41011020000b412741011020000b410e41011020000b411741011020000b410e41011020000b410e41011020000b410e41011020000b411741011020000b410e41011020000b410e41011020000b411741011020000b410e41011020000b410e41011020000b410e41011020000b410e41011020000b411741011020000b410e41011020000b410e41011020000b410e41011020000b411741011020000b200328021c101d0b200341c0006a24000b19002000200141186a280200360204200020012802103602000b1100200028020035020041012001108b020bba0a020b7f017e230041e0006b22032400200320013602202002280208220441586a2105200241106a2802002206412c6c21020240024003402002450d01200241546a2102200541286a21072005412c6a2208210520072d00004102470d000b200341186a2008104420032802182107200328021c21020c010b410021070b2002410020071b21092006412c6c2102200441586a2105200741f8b3c20020071b210a0240024003402002450d01200241546a2102200541286a21072005412c6a2208210520072d00004104470d000b200341106a200810442003280210210b2003280214210c0c010b4100210b0b2006412c6c2102200441586a2105200b41f8b3c200200b1b210d024002400240024002400240024002400240024002400240024003402002450d01200241546a2102200541286a21072005412c6a2208210520072d00004103470d000b200841086a2802002202450d00200241286c2107200828020041186a2102410021050340200520022d0000456a2105200241286a2102200741586a22070d000b200520014d0d012006412c6c2102200441586a210503402002450d09200241546a2102200541286a21072005412c6a2208210520072d00004103470d000b200341086a2008104420032802082207200328020c41286c6a210803402008200722026b419f014d0d0320022d0018450d04200241c0006a2d0000450d05200241e8006a2d0000450d06200241a0016a210720024190016a2d00000d000b20024194016a210520010d060c090b410021050b0240200c4100200b1b200120056b22024d0d00200d20024102746a22050d080b200341cc006a41013602002003410236022c2003420237023c200341f8adc4003602382003200341206a3602282003200341286a360248200341d0006a200341386a10282003290254210e200328025021020c0a0b20022008460d042002411c6a21050240034020022d0018450d01200541286a2105200241286a22022008470d000c060b0b2005410c6a210720010d030c060b2002411c6a2105200241286a210720010d020c050b200241c4006a2105200241d0006a210720010d010c040b200241ec006a2105200241f8006a21072001450d030b02400240024003402001417f6a2101024002400240024003402008200722026b419f014d0d0120022d0018450d02200241c0006a2d0000450d03200241e8006a2d0000450d04200241a0016a210720024190016a2d00000d000b20010d040c070b20022008460d072002411c6a21050240034020022d0018450d01200541286a2105200241286a22022008470d000c090b0b2005410c6a210720010d030c090b200241286a210720010d020c030b200241d0006a210720010d010c030b200241f8006a210720010d000b2003200241ec006a2802002202360224200920024b0d060c070b20032002411c6a2802002202360224200920024b0d050c060b2003200241c4006a2802002202360224200920024b0d040c050b200320024194016a2802002202360224200920024b0d030c040b41b4a2c20041dd00103a000b41f2a1c20041c200103a000b200320052802002202360224200920024d0d010b200a20024104746a2202450d002000410036020020002002360204200341e0006a24000f0b200341dc006a4102360200200341cc006a4102360200200341023602542003420337023c20034188aec4003602382003200341206a3602582003200341246a3602502003200341d0006a360248200341286a200341386a1028200329022c210e200328022821020b2000200236020420004101360200200041086a200e370200200341e0006a24000b0e00200035020041012001108b020bf50303047f017e017f02402001450d00034020002802940321002001417f6a22010d000b0b02402002450d004100210341002101034002400240200120002f01064f0d00200020014105746a220441386a2802002105200441346a2802002106200141016a2101200441c4006a2802004102460d030c010b0240024020002802002201450d0020003301044220862003ad842107410121040c010b2003ad210741002104410021010b2000101d2007a72103024002402007422088a7220620012f01064f0d00200121050c010b03400240024020012802002205450d00200441016a210420013301044220862003ad8421070c010b2003ad2107410021050b2001101d2007a72103200521012007422088a7220620052f01064f0d000b0b200520064102746a4198036a2802002100200520064105746a220141c4006a2802002108200141386a2802002105200141346a2802002106024020044101460d00410120046b210103402000280294032100200141016a22010d000b0b4100210120084102460d020b2002417f6a210202402005450d002006101d0b20020d000b0b0240200041f0c0c100460d00200028020021012000101d2001450d00200128020021052001101d2005450d00024020052802002201450d0003402005101d2001210520012802002200210120000d000b0b2005101d0b0bcb0a03037f017e027f024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d00002202417e6a2203412e4b0d0020030e2f061e220000141f18001d0a00000d0c1c26190b151b232111102728041a09080f24162503130520070201172a29120e060b200020023a00000f0b200020012d00013a00012000412b3a00000f0b200041046a200141046a2902003702002000412a3a00000f0b200041046a200141046a290200370200200041253a00000f0b200041046a200141046a2902003702002000411d3a00000f0b200041046a200141046a290200370200200041273a00000f0b200020012d00013a0001200041023a00000f0b200041046a200141046a290200370200200041293a00000f0b200041046a200141046a290200370200200041203a00000f0b200041046a200141046a2902003702002000411f3a00000f0b200020012d00013a0001200041046a200141046a2802003602002000410c3a00000f0b200041046a200141046a290200370200200041143a00000f0b200041046a200141046a280200360200200041103a00000f0b200041046a200141046a2802003602002000410f3a00000f0b200041086a200141086a290300370300200041303a00000f0b200041046a200141046a290200370200200041213a00000f0b200041046a200141046a2902003702002000411a3a00000f0b200041046a200141046a290200370200200041193a00000f0b200041046a200141046a2802003602002000412f3a00000f0b200041046a200141046a290200370200200041263a00000f0b200041046a200141046a280200360200200041073a00000f0b200041046a200141046a290200370200200041153a00000f0b200041046a200141046a290200370200200041233a00000f0b200020012d00013a00012000412c3a00000f0b200141086a2802002204ad2205421e88a70d142005420286a72203417f4c0d14200141046a28020021022003450d122003101f22060d13200341041020000b200041046a200141046a280200360200200041133a00000f0b200041046a200141046a2902003702002000411e3a00000f0b200041046a200141046a290200370200200041163a00000f0b200041046a200141046a280200360200200041113a00000f0b200041046a200141046a2802003602002000410b3a00000f0b200020012d00013a0001200041033a00000f0b200041046a200141046a280200360200200041083a00000f0b200041046a200141046a290200370200200041283a00000f0b200041046a200141046a290200370200200041183a00000f0b200020012d00013a0001200041043a00000f0b200041046a200141046a290200370200200041173a00000f0b200041046a200141046a290200370200200041223a00000f0b200041046a200141046a290200370200200041243a00000f0b200041046a200141046a280200360200200041123a00000f0b200041046a200141046a2902003702002000411b3a00000f0b200041046a200141046a2902003702002000411c3a00000f0b200041086a200141086a2903003703002000412e3a00000f0b200041046a200141046a2802003602002000412d3a00000f0b410421060b02402004450d002004410274210720062103034020032002280200360200200341046a2103200241046a21022007417c6a22070d000b0b200041086a2004360200200041046a20063602002000410c6a2001410c6a280200360200200041093a00000f0b102e000b9e0302067f017e230041106b2202240002400240024002400240024002400240200041046a2802002203200028020822046b20012802042205200128020022066b41047622074f0d00200420076a22062004490d0320034101742204200620062004491b2206ad4204862208422088a70d032008a722044100480d032003450d01200028020020034104742004101e2207450d020c040b2000280200210720062005460d040c050b2004101f22070d020b200441081020000b1021000b20002007360200200041046a2006360200200041086a280200210420012802002206200141046a280200470d010b200241ac013a00000c010b2001200641106a3602002002200610b30320022d000041ac01460d00200441016a2103200720044104746a2106024003402003210420062002290300370300200641086a200241086a29030037030020012802002203200141046a280200460d012001200341106a3602002002200310b303200441016a2103200641106a210620022d000041ac01470d000c020b0b200241ac013a00000b200041086a2004360200200241106a24000ba00201027f02400240024002402001410c6a2802002203417f6a220420034d0d004116101f2201450d01200020013602042001410e6a41002900eba942370000200141086a41002900e5a942370000200141002900dda942370000200041086a4296808080e002370200200041013602000f0b0240200420026b220220044d0d00411b101f2201450d0220002001360204200141176a410028008aaa42360000200141106a4100290083aa42370000200141086a41002900fba942370000200141002900f3a942370000200041086a429b808080b003370200200041013602000f0b200320024d0d022000200141046a28020020024104746a360204200041003602000f0b411641011020000b411b41011020000b4180afc40020022003104b000bf60201037f230041106b22032400024002402002450d0020032001410010b50320032802004101470d01200020034104722202290200370200200041086a200241086a280200360200200341106a24000f0b20004100360200200341106a24000f0b02400240024002402001280200220420032802042205280208470d0020052d000c450d0120004100360200200341106a24000f0b0240200420026b220220044d0d00410f101f2202450d022000428f808080f00137020420002002360200200241076a41002900d5a942370000200241002900cea942370000200341106a24000f0b2000410036020020012002360200200341106a24000f0b4125101f2202450d01200042a5808080d004370204200020023602002002411d6a41002900c6a942370000200241186a41002900c1a942370000200241106a41002900b9a942370000200241086a41002900b1a942370000200241002900a9a942370000200341106a24000f0b410f41011020000b412541011020000b931001157f024020002802082201450d00200028020022022001412c6c6a2103034020022204412c6a21020240024002400240024002400240024002400240024002400240024002400240024002400240024020042d00002200410d4b0d00024020000e0e000203040506070809140a0b0c0d000b200441086a280200450d13200441046a280200101d20022003470d140c150b0240200441086a280200450d00200441046a280200101d0b0240200441146a2802002200450d00200441186a280200450d002000101d0b200441246a280200450d12200441206a280200101d20022003470d130c140b0240200441086a280200450d00200441046a280200101d0b200441146a280200450d11200441106a280200101d20022003470d120c130b200441046a210502402004410c6a2802002201450d00200528020021002001410474210103400240200041046a280200450d002000280200101d0b200041106a2100200141706a22010d000b0b200441086a280200450d102005280200101d20022003470d110c120b200441046a210502402004410c6a2802002201450d0020052802002100200141286c210103400240200041046a280200450d002000280200101d0b0240200041106a280200450d002000410c6a280200101d0b200041286a2100200141586a22010d000b0b200441086a280200450d0f2005280200101d20022003470d100c110b200441086a280200450d0e200441046a280200101d20022003470d0f0c100b200441086a280200450d0d200441046a280200101d20022003470d0e0c0f0b200441086a280200450d0c200441046a280200101d20022003470d0d0c0e0b200441046a21062004410c6a2802002200450d0a2006280200220720004104746a2108410021000c050b200441046a210502402004410c6a2802002201450d0020052802002100200141146c210103400240200041046a280200450d002000280200101d0b200041146a21002001416c6a22010d000b0b200441086a280200450d0a2005280200101d20022003470d0b0c0c0b200441046a21092004410c6a2802002200450d072009280200220a2000411c6c6a210b410121000c030b200441046a210c2004410c6a2802002200450d05200c280200220d200041186c6a210e410221000c020b200441046a210f2004410c6a2802002200450d03200f28020022102000411c6c6a2111410321000c010b024002400240200441046a2d000022004102460d0020004101460d0120000d022004410c6a280200450d09200441086a280200101d20022003470d0a0c0b0b2004410c6a2112200441146a2802002200450d032012280200221320004104746a2114410421000c020b2004410c6a21150240200441146a2802002201450d00201528020021002001410c6c21010340024020002802002205450d00200041046a280200450d002005101d0b2000410c6a2100200141746a22010d000b0b200441106a280200450d072015280200101d20022003470d080c090b2004410c6a280200450d06200441086a280200101d0c060b0340024002400240024002400240024002400240024020000e050001020304040b024020072802082201450d0020072802002100200141047421010340024020002d00004109470d00200041086a28020041ffffffff0371450d00200041046a280200101d0b200041106a2100200141706a22010d000b0b200741106a21000240200741046a280200450d002007280200101d0b2000210720002008470d040c0e0b0240200a410c6a2802002201450d00200a2802042100200141047421010340024020002d00004109470d00200041086a28020041ffffffff0371450d00200041046a280200101d0b200041106a2100200141706a22010d000b0b0240200a41086a280200450d00200a41046a280200101d0b200a411c6a21000240200a41146a280200450d00200a280210101d0b2000210a2000200b470d040c0c0b0240200d41046a280200450d00200d280200101d0b0240200d41146a2802002201450d00200d28020c2100200141047421010340024020002d00004109470d00200041086a28020041ffffffff0371450d00200041046a280200101d0b200041106a2100200141706a22010d000b0b200d41186a21000240200d41106a280200450d00200d410c6a280200101d0b2000210d2000200e470d040c0a0b02402010410c6a2802002201450d0020102802042100200141047421010340024020002d00004109470d00200041086a28020041ffffffff0371450d00200041046a280200101d0b200041106a2100200141706a22010d000b0b0240201041086a280200450d00201041046a280200101d0b2010411c6a21000240201041146a280200450d002010280210101d0b2000211020002011470d040c080b2013221541106a2113024020152802042200450d0002402015410c6a2802002201450d002001410c6c21010340024020002802002205450d00200041046a280200450d002005101d0b2000410c6a2100200141746a22010d000b0b201541086a280200450d00201541046a280200101d0b20132014470d040c060b410021000c040b410121000c030b410221000c020b410321000c010b410421000c000b0b200441106a280200450d042012280200101d20022003470d050c060b200441086a280200450d03200f280200101d20022003470d040c050b200441086a280200450d02200c280200101d20022003470d030c040b200441086a280200450d012009280200101d20022003470d020c030b200441086a280200450d002006280200101d20022003470d010c020b20022003470d000b0b0be80701037f0240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001413f4b0d00200241046a280200200241086a2802002203470d01200341016a22042003490d1120034101742205200420042005491b22054100480d112003450d05200228020020032005101e2204450d060c170b2001418080014f0d01200241046a2802002204200241086a28020022036b41024f0d02200341026a22052003490d1020044101742203200520052003491b22034100480d102004450d08200228020020042003101e2204450d090c140b200228020021040c160b20014180808080044f0d01200241046a2802002204200241086a28020022036b41044f0d04200341046a22052003490d0e20044101742203200520052003491b22034100480d0e2004450d08200228020020042003101e22040d090c0f0b200228020021040c120b200241046a280200200241086a2802002203470d03200341016a22042003490d0c20034101742205200420042005491b22054100480d0c2003450d09200228020020032005101e22040d0a0c0e0b2005101f22040d110b200541011020000b200228020021040c050b200228020021040c070b2003101f22040d0b0b200341011020000b2003101f2204450d060b20022004360200200241046a2003360200200241086a28020021030b200241086a200341046a360200200420036a2001410274410272360000200141037422010d0b0c0c0b2005101f2204450d040b20022004360200200241046a2005360200200241086a28020021030b200241086a2205200341016a360200200420036a41033a00000240024002400240200241046a2802002204200528020022036b41044f0d00200341046a22052003490d0420044101742203200520052003491b22034100480d042004450d01200228020020042003101e22040d020c070b200228020021040c020b2003101f2204450d050b20022004360200200241046a2003360200200241086a28020021030b200241086a200341046a360200200420036a200136000020014103742201450d090c080b1021000b200341011020000b200541011020000b200341011020000b20022004360200200241046a2003360200200241086a28020021030b200241086a200341026a360200200420036a20014102744101723b0000200141037422010d020c030b20022004360200200241046a2005360200200241086a28020021030b200241086a200341016a360200200420036a20014102743a000020014103742201450d010b200020016a210103402000280200200041046a280200200210a202200041086a22002001470d000b0b0bd50101027f200028020421020240024020002802004101470d002000410c6a2802002200200110a1022000450d01200041186c2103200241146a21000340200041706a280200200041746a280200200110a2022000417c6a2802002000280200200110a202200041186a2100200341686a22030d000c020b0b200041086a2802002200200110a1022000450d00200041186c2103200241146a21000340200041706a280200200041746a280200200110a2022000417c6a2802002000280200200110a202200041186a2100200341686a22030d000b0b0bd90601037f0240024002400240024002400240024002400240024002400240024002400240024002400240024020002d000022024101460d0020024102470d01200141046a280200200141086a2802002202470d03200241016a22032002490d0f20024101742204200320032004491b22044100480d0f2002450d07200128020020022004101e2203450d080c120b200141046a280200200141086a2802002202470d01200241016a22032002490d0e20024101742204200320032004491b22044100480d0e2002450d04200128020020022004101e2203450d050c0c0b200141046a280200200141086a2802002202470d02200241016a22032002490d0d20024101742204200320032004491b22044100480d0d2002450d07200128020020022004101e2203450d080c090b200128020021030c0b0b200128020021030c0f0b200128020021030c070b2004101f22030d070b200441011020000b2004101f22030d0a0b200441011020000b2004101f22030d010b200441011020000b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41003a0000200041086a2802002000410c6a280200200110a2020f0b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41013a0000200041086a2802002000410c6a280200200110a202200041146a280200200041186a280200200110a202024002400240200141046a28020020042802002202470d00200241016a22032002490d0320024101742204200320032004491b22044100480d032002450d01200128020020022004101e2203450d020c040b200128020021030c040b2004101f22030d020b200441011020000b1021000b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a200041016a2d00003a00000f0b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41023a0000200041086a2802002000410c6a280200200110a202200041146a280200200041186a280200200110a202200041206a280200200041246a280200200110a2022000412c6a280200200041306a280200200110a2020b2700200028020c200041106a280200100a200041146a3502001018200041186a350200101800000b080020002001100a0b0600200010190b06002000101a0b2801017f0240200210192203450d002003200020022001200120024b1b10ce031a2000101a0b20030b1c01017f0240200010192201450d0020014100200010cd031a0b20010b9a09010a7f230041c0006b22032400200341246a2001360200200341346a200241146a2802002204360200200341033a00382003412c6a2002280210220520044103746a360200200342808080808004370308200320003602204100210620034100360218200341003602102003200536023020032005360228024002400240024020022802082207450d0020022802002108200228020422092002410c6a2802002205200520094b1b220a450d01200020082802002008280204200128020c1100000d02200841086a2105200341386a2101200341346a210b200341306a210c41012106024003402001200741206a2d00003a00002003200741086a28020036020c20032007410c6a2802003602084100210202400240024002400240200741186a28020022004101460d00024020004102460d0020004103460d052007411c6a28020021040c020b200341086a41206a22042802002200200341086a41246a280200460d022004200041086a36020020002802044124470d04200028020028020021040c010b2007411c6a2802002200200b28020022044f0d02200c28020020004103746a22002802044124470d03200028020028020021040b410121020c020b0c010b41f0b3c40020002004104b000b200341086a410c6a2004360200200341086a41086a20023602004100210202400240024002400240200741106a28020022004101460d00024020004102460d0020004103460d05200741146a28020021040c020b200341086a41206a22042802002200200341086a41246a280200460d022004200041086a36020020002802044124470d04200028020028020021040c010b200741146a2802002200200b28020022044f0d02200c28020020004103746a22002802044124470d03200028020028020021040b410121020c020b0c010b41f0b3c40020002004104b000b200341086a41146a2004360200200341086a41106a200236020002400240024020072802004101470d00200741046a2802002202200b28020022044f0d02200c28020020024103746a21020c010b200341086a41206a22042802002202200341086a41246a280200460d032004200241086a3602000b2002280200200341086a200241046a2802001106000d052006200a4f0d04200541046a210220052802002104200541086a2105200741246a2107200641016a2106200341086a41186a28020020042002280200200341086a411c6a28020028020c110000450d010c050b0b4180b4c40020022004104b000b4190b3c400102c000b20022802002108200228020422092004200420094b1b220a450d00200020082802002008280204200128020c1100000d01200841086a2107200341206a2100200341246a21014101210603402005280200200341086a200541046a2802001106000d022006200a4f0d01200741046a210220072802002104200541086a2105200741086a2107200641016a2106200028020020042002280200200128020028020c110000450d000c020b0b200920064d0d01200341206a280200200820064103746a22072802002007280204200341246a28020028020c110000450d010b200341c0006a240041010f0b200341c0006a240041000b7701017f230041c0006b220024002000413336020c200041e3b0c200360208200041346a4125360200200041246a41023602002000411836022c20004202370214200041b8b1c4003602102000200041386a3602302000200041086a3602282000200041286a360220200041106a41c8b1c40010cf01000b1c00200128021841accfc20041052001411c6a28020028020c1100000b02000bba0101037f024002400240024002400240200028020022002802042203200028020822046b20024f0d00200420026a22052004490d0320034101742204200520052004491b22044100480d032003450d01200028020020032004101e2203450d020c040b200028020021030c040b2004101f22030d020b200441011020000b1021000b20002003360200200041046a2004360200200041086a28020021040b200041086a200420026a360200200320046a2001200210ce031a41000bba0401047f230041106b22022400200028020021000240024002400240024002400240024002400240024020014180014f0d00200028020822032000280204470d09200341016a22042003490d0520034101742205200420042005491b22044100480d052003450d01200028020020032004101e2203450d020c080b2002410036020c0240024020014180104f0d0020022001413f71418001723a000d20022001410676411f7141c001723a000c410221010c010b0240200141ffff034b0d0020022001413f71418001723a000e20022001410676413f71418001723a000d20022001410c76410f7141e001723a000c410321010c010b20022001413f71418001723a000f2002200141127641f001723a000c20022001410676413f71418001723a000e20022001410c76413f71418001723a000d410421010b024020002802042204200028020822036b20014f0d00200320016a22052003490d0520044101742203200520052003491b22034100480d052004450d03200028020020042003101e2204450d040c060b200028020021040c060b2004101f22030d060b200441011020000b2003101f22040d020b200341011020000b1021000b20002004360200200041046a2003360200200041086a28020021030b200041086a200320016a360200200420036a2002410c6a200110ce031a0c020b20002003360200200041046a2004360200200041086a28020021030b200028020020036a20013a0000200041086a2200200028020041016a3602000b200241106a240041000b6401017f230041206b2202240020022000280200360204200241086a41106a200141106a290200370300200241086a41086a200141086a29020037030020022001290200370308200241046a41a0b1c400200241086a10c1032101200241206a240020010b0d0042ef81ecf9c6fdac889c7f0b5501017f0240024002402001418080c400460d0041012104200028021820012000411c6a2802002802101106000d010b2002450d012000280218200220032000411c6a28020028020c11000021040b20040f0b41000b7c01017f230041306b22022400200241146a411b3602002002411b36020c200220003602082002200041046a3602102001411c6a2802002100200128021821012002412c6a41023602002002420237021c200241e0b3c4003602182002200241086a36022820012000200241186a10c1032101200241306a240020010b820c03037f017e167f410121020240200128021841272001411c6a2802002802101106000d00410221020240024002400240024002400240024002402000280200220341776a2200411e4b0d0041f4002104024020000e1f09000202030202020202020202020202020202020202020202070202020207090b41ee0021040c030b200341dc00460d050b200310ec02450d02200341017267410276410773ad4280808080d0008421050c030b41f20021040b0c040b024002400240200341ffff034b0d0020034180fe0371410876210641d8b7c2002107410021084102210941b002210a41a8b8c200210b41a8b8c200210c417f210d4101210e200341ff0171210f410021020c010b0240200341ffff074b0d0020034180fe037141087621134193bdc20021144100211541022116419f01211741d5bdc200211841d5bdc2002119417f211a4101211b200341ff01712112410121020c010b200341ef83384b0d01200341e28b746a41e28d2c490d012003419fa8746a419f18490d01200341dee2746a410e490d01200341feffff0071419ef00a460d01200341a9b2756a4129490d01200341cb91756a410a4d0d01410121020c030b034002400240024002400240024002400240024002400240024020020e020001010b200720096a2110200820072d000122026a211102400240024020072d000022002006470d0020112008490d042011200a4f0d052008200b6a210003402002450d022002200d6a210220002d000021042000200e6a21002004200f470d000c100b0b200020064b0d0120112108201021072010200c470d090c010b20112108201021072010200c470d090b200341ffff0371210041d7bac20021024101210f02400340200241016a210e0240024020022d0000220d4118744118752212417f4c0d00200e21022000200d6b220041004e0d010c030b200e4193bdc200460d08200241016a210e200241026a21022000201241ff0071410874200e2d0000726b22004100480d020b200f410173210f20024193bdc200470d000b0b41012102200f4101710d0e0c0c0b201420166a2110201520142d000122026a211102400240024020142d000022002013470d0020112015490d05201120174f0d06201520186a210003402002450d022002201a6a210220002d000021042000201b6a210020042012470d000c0f0b0b200020134b0d01201121152010211420102019470d0a0c010b201121152010211420102019470d0a0b200341ffff0371210041f3bec20021024101210f02400340200241016a210e0240024020022d0000220d4118744118752212417f4c0d00200e21022000200d6b220041004e0d010c030b200e41f0c1c200460d08200241016a210e200241026a21022000201241ff0071410874200e2d0000726b22004100480d020b200f410173210f200241f0c1c200470d000b0b41012102200f4101710d0d0c0b0b20082011102a000b201141af02102b000b20152011102a000b2011419e01102b000b4190b3c400102c000b4190b3c400102c000b410021020c030b410021020c020b410121020c010b410121020c000b0b200341017267410276410773ad4280808080d0008421050b410321020c010b0b200321040b200141186a210f2001411c6a210e02400340024002400240024002400240024020024101460d0041dc002100024020024102460d0020024103470d092005422088a741ff0171417f6a220241044b0d09024020020e050006040503000b200542ffffffff8f6083210541fd0021000c060b410121020c060b41002102200421000c050b200542ffffffff8f60834280808080c0008421050c030b200542ffffffff8f608342808080802084210541fb0021000c020b200542ffffffff8f608342808080803084210541f50021000c010b20042005a7220d410274411c7176410f712202413072200241d7006a2002410a491b21000240200d450d002005427f7c42ffffffff0f832005428080808070838421050c010b200542ffffffff8f60834280808080108421050b410321020b200f2802002000200e280200280210110600450d000b41010f0b200141186a28020041272001411c6a28020028021011060021020b20020b0e00200035020041012001108b020b2c01017f02402002450d00200021030340200320013a0000200341016a21032002417f6a22020d000b0b20000b3601017f02402002450d00200021030340200320012d00003a0000200341016a2103200141016a21012002417f6a22020d000b0b20000b7101017f02400240200120004f0d002002450d012001417f6a21012000417f6a21030340200320026a200120026a2d00003a00002002417f6a22020d000c020b0b2002450d00200021030340200320012d00003a0000200141016a2101200341016a21032002417f6a22020d000b0b20000b4401037f024002402002450d00410021030340200020036a2d00002204200120036a2d00002205470d02200341016a22032002490d000b41000f0b41000f0b200420056b0b3e01017f230041106b2205240020052001200220032004410010d503200529030021012000200541086a29030037030820002001370300200541106a24000b7501027e200020034220882205200142208822067e200320027e7c200420017e7c200342ffffffff0f832203200142ffffffff0f8322017e2204422088200320067e7c22034220887c200342ffffffff0f83200520017e7c22034220887c37030820002003422086200442ffffffff0f83843703000b5701017e02400240200341c000710d002003450d012001410020036b413f71ad8820022003413f71ad220486842102200120048621010c010b20012003413f71ad862102420021010b20002001370300200020023703080b5701017e02400240200341c000710d002003450d0120012003413f71ad2204882002410020036b413f71ad86842101200220048821020c010b20022003413f71ad882101420021020b20002001370300200020023703080bb70502037f057e230041306b2206240002400240024002400240024002400240024002400240024002400240024020024200510d002003500d012004500d03200479a7200279a76b2207413f4b0d0241ff0020076b2108200741016a21070c0c0b200450450d012005450d0520034200510d0d20054200370308200520012003823703000c060b2004500d0c20014200510d032004427f7c2209200483500d07200479a7200279a76b2207413e4d0d090b2005450d012005200137030020052002370308420021010c070b2003427f7c2209200383500d044100200379a741c1006a200279a76b22076b21080c080b420021010c050b02402005450d0020054200370300200520022004823703080b200220048021010c040b20034200510d070b200120038021010c020b02402005450d0020054200370308200520092001833703000b20034201510d04200641206a2001200220037aa710d403200641286a2903002102200629032021010c040b02402005450d0020052001370300200520092002833703080b200220047a423f838821010b420021020c020b41ff0020076b2108200741016a21070b200620012002200841ff007110d303200641106a20012002200741ff007110d403200641086a2903002102200641106a41086a290300210a20062903002101200629031021094200210b0340200a4201862009423f8884220c200c427f8520047c20094201862002423f88842209427f85220c20037c200c54ad7c423f87220c2004837d2009200c200383220d54ad7d210a2009200d7d2109420020024201862001423f8884842102200b2001420186842101200c420183220c210b2007417f6a22070d000b02402005450d00200520093703002005200a3703080b20024201862001423f88842102200c20014201868421010b2000200137030020002002370308200641306a24000f0b00000b0bfec0040200418080c0000bb1cf02746f6f206d616e7920696e737472756374696f6e73547269656420746f20736872696e6b20746f2061206c617267657220636170616369747974686520766563746f7220697320616c7761797320636c65617265643b2069742773207772697474656e206f6e6c79206f6e63652f55736572732f612f7372632f737562737472617465322f73726d6c2f636f6e74726163742f7372632f657865632e727372656163686564206d6178696d756d2064657074682c2063616e6e6f74206372656174656e6f7420656e6f7567682067617320746f20706179206261736520696e7374616e746961746520666565636f6e747261637420616c7265616479206578697374736e6f7420656e6f7567682067617320746f20706179207472616e736665722066656572656163686564206d6178696d756d2064657074682c2063616e6e6f74206d616b6520612063616c6c6e6f7420656e6f7567682067617320746f2070617920626173652063616c6c2066656563616e2774206465636f6465207761736d20636f6465657870656374656420612066756e6374696f6e656e74727920706f696e7420706f696e747320746f20616e20696d706f727465642066756e6374696f6e656e74727920706f696e74206861732077726f6e67207369676e61747572656d6f64756c65206465636c6172657320696e7465726e616c206d656d6f72794f6e20656e74727920746f207468652066756e6374696f6e20606d6f64756c65602063616e277420626520604e6f6e65603b207165646d6f64756c652068617320696d706f7274732066726f6d2061206e6f6e2d27656e7627206e616d6573706163656d6f64756c6520696d706f7274732061206e6f6e2d6578697374656e742066756e6374696f6e76616c69646174696f6e3a20696d706f727420656e74727920706f696e747320746f2061206e6f6e2d6578697374656e74207479706552657175657374656420696e697469616c206e756d626572206f662070616765732073686f756c64206e6f74206578636565642074686520726571756573746564206d6178696d756d4d6178696d756d206e756d626572206f662070616765732073686f756c64206e6f74206578636565642074686520636f6e66696775726564206d6178696d756d2e4d6178696d756d206e756d626572206f662070616765732073686f756c6420626520616c77617973206465636c617265642e67617320696e737472756d656e746174696f6e206661696c6564737461636b2068656967687420696e737472756d656e746174696f6e206661696c65646572726f722073657269616c697a696e6720696e737472756d656e746564206d6f64756c6563616c6c2066756e6374696f6e2069736e2774206578706f727465646465706c6f792066756e6374696f6e2069736e2774206578706f727465646578706f72742072656665727320746f206e6f6e2d6578697374656e742066756e6374696f6e66756e6374696f6e206861732061206e6f6e2d6578697374656e74207479706573746f72616765206973206e6f74206e756c6c2c207468657265666f7265206d75737420626520612076616c696420747970656465706c6f796d656d6f727976616c69646174696f6e206572726f72657865632e7072656661625f6d6f64756c652e696e697469616c2063616e27742062652067726561746572207468616e20657865632e7072656661625f6d6f64756c652e6d6178696d756d3b0a09090909090974687573204d656d6f72793a3a6e6577206d757374206e6f74206661696c3b0a0909090909097165642f55736572732f612f7372632f737562737472617465322f73726d6c2f636f6e74726163742f7372632f7761736d2f6d6f642e72733a617574683a41757261204c61737454696d657374616d7054696d657374616d70204d656469616e54696d657374616d702055706461746554696d657374616d7020526563656e7448696e747346696e616c2068696e74206d7573742062652075706461746564206f6e6c79206f6e636520696e2074686520626c6f636b2f55736572732f612f7372632f737562737472617465322f73726d6c2f66696e616c6974792d747261636b65722f7372632f6c69622e727346696e616c697a6564206865696768742061626f766520626c6f636b206e756d6265722f55736572732f612f7372632f737562737472617465322f73726d6c2f636f6e73656e7375732f7372632f6c69622e7273000000000000002f72757374632f653334323864623763326231656562333530393665306266333736373233393739373766663033302f7372632f6c6962636f72652f736c6963652f6d6f642e72730000000000000000617474656d707420746f20646976696465206279207a65726f000000000000002f55736572732f612f7372632f737562737472617465322f73726d6c2f617572612f7372632f6c69622e727374696d657374616d702073657420696e20626c6f636b20646f65736e2774206d6174636820736c6f7420696e207365616c6f66666c726570304e6f20606f66666c696e655f7265706f72746020666f756e6420696e2074686520696e686572656e742064617461214765747320616e64206465636f6465732066696e616c206e756d62657220696e686572656e7420646174614175726120736c6f74206475726174696f6e2063616e6e6f74206265207a65726f2e2f55736572732f612f7372632f737562737472617465322f73726d6c2f617572612f7372632f6c69622e72734f6e6c79206f6e6520626c6f636b206d617920626520617574686f7265642070657220736c6f742e436f6e73656e737573204f726967696e616c417574686f7269746965736e6f74655f6f66666c696e6572656d61726b7365745f686561705f70616765737365745f636f64657365745f73746f726167656b696c6c5f73746f72616765204b696c6c20736f6d65206974656d732066726f6d2073746f726167652e6b6579735665633c4b65793e2053657420736f6d65206974656d73206f662073746f726167652e6974656d735665633c4b657956616c75653e2053657420746865206e657720636f64652e2053657420746865206e756d626572206f6620706167657320696e2074686520576562417373656d626c7920656e7669726f6e6d656e74277320686561702e7061676573204d616b6520736f6d65206f6e2d636861696e2072656d61726b2e5f72656d61726b204e6f74652074686174207468652070726576696f757320626c6f636b27732076616c696461746f72206d697373656420697473206f70706f7274756e69747920746f2070726f706f7365206120626c6f636b2e6f66666c696e653c543a3a496e686572656e744f66666c696e655265706f727420617320496e686572656e744f66666c696e655265706f72743e3a3a496e686572656e74436f6e73656e7375734f726967696e616c417574686f7269746965735665633c543a3a53657373696f6e4b65793e53746f7261676520726f6f74206d757374206d6174636820746861742063616c63756c617465642e2f55736572732f612f7372632f737562737472617465322f73726d6c2f6578656375746976652f7372632f6c69622e7273446967657374206974656d206d757374206d6174636820746861742063616c63756c617465642e4e756d626572206f6620646967657374206974656d73206d757374206d6174636820746861742063616c63756c617465642e54696d657374616d7020496e697469616c697a656454696d657374616d70204f72646572656448696e747354696d657374616d702057696e646f7753697a65616c77617973206174206c65617374206f6e6520726563656e742073616d706c653b20716564726563656e7420616e64206f72646572656420636f6e7461696e207468652073616d65206974656d733b2071656454696d657374616d70205265706f72744c6174656e63797072756e696e672064696374617465642062792077696e646f775f73697a6520776869636820697320616c776179732073617475726174656420617420313b20716564416c6c2065787472696e736963732073686f756c6420686176652074686520636f7272656374206e6f6e636545787472696e736963732073686f756c64206e6f742065786365656420626c6f636b206c696d6974416c6c2065787472696e736963732073686f756c642062652070726f7065726c79207369676e6564416c6c2065787472696e736963732073686f756c6420686176652073656e6465722061626c6520746f207061792074686569722066656573626164207369676e617475726520696e2065787472696e7369635472616e73616374696f6e207472696520726f6f74206d7573742062652076616c69642e506172656e7420686173682073686f756c642062652076616c69642e66696e616c5f68696e742048696e7420746861742074686520617574686f72206f66207468697320626c6f636b207468696e6b732074686520626573742066696e616c697a656420626c6f636b2069732074686520676976656e206e756d6265722e68696e743a6865617070616765733a636f64655461626c6564537461727465645061737365644e6f7450617373656443616e63656c6c656444656c656761746564556e64656c6567617465645265666572656e64756d496e646578566f74655468726573686f6c6450726f70496e64657844656d6f637261637920566f74696e67506572696f6444656d6f637261637920566f74654f6644656d6f63726163792050726f787944656d6f63726163792044656c65676174696f6e7344656d6f6372616379205265666572656e64756d496e666f4f6644656d6f6372616379204465706f7369744f6644656d6f6372616379204c61756e6368506572696f6444656d6f6372616379205075626c696350726f707344656d6f6372616379205075626c696344656c617944656d6f6372616379204e65787454616c6c7944656d6f6372616379205265666572656e64756d436f756e7444656d6f6372616379204469737061746368517565756544656d6f637261637920566f74657273466f7268656164206f662044656d6f63726163792044656c65676174696f6e7343616e6e6f7420696e6a6563742061207265666572656e64756d207468617420656e6473206561726c696572207468616e2070726563656564696e67207265666572656e64756d0000000000000000002f72757374632f653334323864623763326231656562333530393665306266333736373233393739373766663033302f7372632f6c6962636f72652f736c6963652f6d6f642e72730000000000000000617474656d707420746f2063616c63756c617465207468652072656d61696e646572207769746820612064697669736f72206f66207a65726f000000000000002f72757374632f653334323864623763326231656562333530393665306266333736373233393739373766663033302f7372632f6c6962636f72652f6f70732f61726974682e72737365636f6e6470726f78795f766f746573746172745f7265666572656e64756d63616e63656c5f7265666572656e64756d63616e63656c5f7175657565647365745f70726f787972657369676e5f70726f787972656d6f76655f70726f787964656c6567617465756e64656c656761746520556e64656c656761746520766f74652e2044656c656761746520766f74652e746f6c6f636b5f706572696f64734c6f636b506572696f647320436c656172207468652070726f78792e2043616c6c6564206279207468652073746173682e20436c656172207468652070726f78792e2043616c6c6564206279207468652070726f78792e205370656369667920612070726f78792e2043616c6c6564206279207468652073746173682e70726f78792043616e63656c20612070726f706f73616c2071756575656420666f7220656e6163746d656e742e7768656e77686963682052656d6f76652061207265666572656e64756d2e7265665f696e646578436f6d706163743c5265666572656e64756d496e6465783e2053746172742061207265666572656e64756d2e64656c617920566f746520696e2061207265666572656e64756d206f6e20626568616c66206f6620612073746173682e2049662060766f74652e69735f6179652829602c2074686520766f746520697320746f20656e616374207468652070726f706f73616c3b206f7468657277697365206974206973206120766f746520746f206b65657020746865207374617475732071756f2e20566f746520696e2061207265666572656e64756d2e2049662060766f74652e69735f6179652829602c2074686520766f746520697320746f20656e616374207468652070726f706f73616c3b566f7465436f6d706163743c50726f70496e6465783e2050726f706f736520612073656e73697469766520616374696f6e20746f2062652074616b656e2e44656d6f63726163795075626c696350726f70436f756e745075626c696350726f70735665633c2850726f70496e6465782c20543a3a50726f706f73616c2c20543a3a4163636f756e744964293e4465706f7369744f662842616c616e63654f663c543e2c205665633c543a3a4163636f756e7449643e294c61756e6368506572696f644d696e696d756d4465706f7369745075626c696344656c61794d61784c6f636b506572696f64735265666572656e64756d436f756e744e65787454616c6c795265666572656e64756d496e666f4f66285265666572656e64756d496e666f3c543a3a426c6f636b4e756d6265722c20543a3a50726f706f73616c3e29446973706174636851756575655665633c4f7074696f6e3c28543a3a50726f706f73616c2c205265666572656e64756d496e646578293e3e566f74657273466f72566f74654f66285265666572656e64756d496e6465782c20543a3a4163636f756e7449642950726f787944656c65676174696f6e7328543a3a4163636f756e7449642c204c6f636b506572696f6473292047657420746865206163636f756e742028616e64206c6f636b20706572696f64732920746f20776869636820616e6f74686572206163636f756e742069732064656c65676174696e6720766f74652e2057686f2069732061626c6520746f20766f746520666f722077686f6d2e2056616c7565206973207468652066756e642d686f6c64696e67206163636f756e742c206b65792069732074686520766f74652d7472616e73616374696f6e2d73656e64696e67206163636f756e742e204765742074686520766f746520696e206120676976656e207265666572656e64756d206f66206120706172746963756c617220766f7465722e2054686520726573756c74206973206d65616e696e6766756c206f6e6c792069662060766f746572735f666f726020696e636c756465732074686520766f746572207768656e2063616c6c6564207769746820746865207265666572656e64756d2028796f75276c6c20676574207468652064656661756c742060566f7465602076616c7565206f7468657277697365292e20496620796f7520646f6e27742077616e7420746f20636865636b2060766f746572735f666f72602c207468656e20796f752063616e20616c736f20636865636b20666f722073696d706c65206578697374656e636520776974682060566f74654f663a3a657869737473602066697273742e204765742074686520766f7465727320666f72207468652063757272656e742070726f706f73616c2e205175657565206f66207375636365737366756c207265666572656e646120746f20626520646973706174636865642e20496e666f726d6174696f6e20636f6e6365726e696e6720616e7920676976656e207265666572656e64756d2e20546865206e657874207265666572656e64756d20696e64657820746861742073686f756c642062652074616c6c6965642e20546865206e6578742066726565207265666572656e64756d20696e6465782c20616b6120746865206e756d626572206f66207265666572656e64756d73207374617274656420736f206661722e20546865206d6178696d756d206e756d626572206f66206164646974696f6e616c206c6f636b20706572696f6473206120766f746572206d6179206f6666657220746f20737472656e677468656e20746865697220766f74652e204d756c7469706c6573206f6620605075626c696344656c6179602e205468652064656c6179206265666f726520656e6163746d656e7420666f7220616c6c207075626c6963207265666572656e64612e20546865206d696e696d756d20616d6f756e7420746f20626520757365642061732061206465706f73697420666f722061207075626c6963207265666572656e64756d2070726f706f73616c2e20486f77206f6674656e2028696e20626c6f636b7329206e6577207075626c6963207265666572656e646120617265206c61756e636865642e2054686f73652077686f2068617665206c6f636b65642061206465706f7369742e20546865207075626c69632070726f706f73616c732e20556e736f727465642e20546865206e756d626572206f6620287075626c6963292070726f706f73616c7320746861742068617665206265656e206d61646520736f206661722e2f55736572732f612f7372632f737562737472617465322f73726d6c2f64656d6f63726163792f7372632f6c69622e727344656d6f6372616379204d696e696d756d4465706f73697476616c756520746f6f206c6f7770726f706f73657227732062616c616e636520746f6f206c6f7744656d6f6372616379205075626c696350726f70436f756e7463616e206f6e6c79207365636f6e6420616e206578697374696e672070726f706f73616c7365636f6e64657227732062616c616e636520746f6f206c6f77616c726561647920612070726f787977726f6e672070726f78796e6f742064656c65676174656444656d6f6372616379204d61784c6f636b506572696f6473766f74652068617320746f6f206772656174206120737472656e677468766f746520676976656e20666f7220696e76616c6964207265666572656e64756d2e53797374656d2045787472696e736963436f756e7453797374656d20416c6c45787472696e736963734c656e626164206f726967696e3a20657870656374656420746f206265206120726f6f74206f726967696e626164206f726967696e3a20657870656374656420746f2062652061207369676e6564206f726967696e3a65787472696e7369635f696e646578426c6f636b206e756d626572206d6179206e65766572206265207a65726f2f55736572732f612f7372632f737562737472617465322f73726d6c2f73797374656d2f7372632f6c69622e7273626164206f726967696e3a20657870656374656420746f20626520616e20696e686572656e74206f726967696e53797374656d2045787472696e736963446174614e65774163636f756e745265617065644163636f756e74205472616e7366657220737563636565646564202866726f6d2c20746f2c2076616c75652c2066656573292e20416e206163636f756e7420776173207265617065642e2041206e6577206163636f756e742077617320637265617465642e76657374696e672062616c616e636520746f6f206869676820746f2073656e642076616c75656163636f756e74206c6971756964697479207265737472696374696f6e732070726576656e74207769746864726177616c62656e6566696369617279206163636f756e74206d757374207072652d6578697374746f6f2066657720667265652066756e647320696e206163636f756e747061796d656e7420776f756c64206b696c6c206163636f756e7453797374656d2044696765737453797374656d20506172656e744861736853797374656d2052616e646f6d5365656453797374656d204e756d62657253797374656d2045787472696e73696373526f6f7442616c616e63657320546f74616c49737375616e636542616c616e636573204578697374656e7469616c4465706f73697442616c616e636573205472616e73616374696f6e4261736546656542616c616e636573205472616e73616374696f6e4279746546656553797374656d20426c6f636b4861736853797374656d204576656e747353797374656d204163636f756e744e6f6e636542616c616e636573204672656542616c616e636542616c616e63657320526573657276656442616c616e636542616c616e636573204c6f636b7373657269616c697a656420617267732073686f756c642062652070726f7669646564206279207468652072756e74696d653b0a090909636f72726563746c792073657269616c697a656420646174612073686f756c6420626520646573657269616c697a61626c653b0a09090971656453797374656d4163636f756e744e6f6e6365543a3a496e64657845787472696e736963436f756e74416c6c45787472696e736963734c656e426c6f636b4861736845787472696e7369634461746152616e646f6d536565644e756d626572506172656e744861736845787472696e73696373526f6f74446967657374543a3a4469676573744576656e74735665633c4576656e745265636f72643c543a3a4576656e743e3e204576656e7473206465706f736974656420666f72207468652063757272656e7420626c6f636b2e20446967657374206f66207468652063757272656e7420626c6f636b2c20616c736f2070617274206f662074686520626c6f636b206865616465722e2045787472696e7369637320726f6f74206f66207468652063757272656e7420626c6f636b2c20616c736f2070617274206f662074686520626c6f636b206865616465722e2048617368206f66207468652070726576696f757320626c6f636b2e205468652063757272656e7420626c6f636b206e756d626572206265696e672070726f6365737365642e205365742062792060657865637574655f626c6f636b602e2052616e646f6d2073656564206f66207468652063757272656e7420626c6f636b2e2045787472696e73696373206461746120666f72207468652063757272656e7420626c6f636b20286d6170732065787472696e736963277320696e64657820746f206974732064617461292e204d6170206f6620626c6f636b206e756d6265727320746f20626c6f636b206861736865732e20546f74616c206c656e67746820696e20627974657320666f7220616c6c2065787472696e736963732070757420746f6765746865722c20666f72207468652063757272656e7420626c6f636b2e20546f74616c2065787472696e7369637320636f756e7420666f72207468652063757272656e7420626c6f636b2e2045787472696e73696373206e6f6e636520666f72206163636f756e74732e7472616e736665727365745f62616c616e636520536574207468652062616c616e636573206f66206120676976656e206163636f756e742e20546869732077696c6c20616c74657220604672656542616c616e63656020616e642060526573657276656442616c616e63656020696e2073746f726167652e20496620746865206e65772066726565206f722072657365727665642062616c616e63652069732062656c6f7720746865206578697374656e7469616c206465706f7369742c2069742077696c6c20616c736f2064656372656173652074686520746f74616c2069737375616e6365206f66207468652073797374656d202860546f74616c49737375616e6365602920616e6420726573657420746865206163636f756e74206e6f6e636520286073797374656d3a3a4163636f756e744e6f6e636560292e20546865206469737061746368206f726967696e20666f7220746869732063616c6c2069732060726f6f74602e66726565436f6d706163743c543a3a42616c616e63653e7265736572766564205472616e7366657220736f6d65206c697175696420667265652062616c616e636520746f20616e6f74686572206163636f756e742e20607472616e73666572602077696c6c207365742074686520604672656542616c616e636560206f66207468652073656e64657220616e642072656365697665722e2049742077696c6c2064656372656173652074686520746f74616c2069737375616e6365206f66207468652073797374656d2062792074686520605472616e73666572466565602e204966207468652073656e6465722773206163636f756e742069732062656c6f7720746865206578697374656e7469616c206465706f736974206173206120726573756c74206f6620746865207472616e736665722c20746865206163636f756e742077696c6c206265207265617065642e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d75737420626520605369676e65646020627920746865207472616e736163746f722e42616c616e6365732056657374696e6742616c616e636573546f74616c49737375616e6365543a3a42616c616e63654578697374656e7469616c4465706f73697456657374696e6756657374696e675363686564756c653c543a3a42616c616e63653e4672656542616c616e6365526573657276656442616c616e63654c6f636b735665633c42616c616e63654c6f636b3c543a3a42616c616e63652c20543a3a426c6f636b4e756d6265723e3e20416e79206c6971756964697479206c6f636b73206f6e20736f6d65206163636f756e742062616c616e6365732e2054686520616d6f756e74206f66207468652062616c616e6365206f66206120676976656e206163636f756e7420746861742069732065787465726e616c6c792072657365727665643b20746869732063616e207374696c6c2067657420736c61736865642c20627574206765747320736c6173686564206c617374206f6620616c6c2e20546869732062616c616e63652069732061202772657365727665272062616c616e63652074686174206f746865722073756273797374656d732075736520696e206f7264657220746f2073657420617369646520746f6b656e73207468617420617265207374696c6c20276f776e65642720627920746865206163636f756e7420686f6c6465722c20627574207768696368206172652073757370656e6461626c652e205768656e20746869732062616c616e63652066616c6c732062656c6f77207468652076616c7565206f6620604578697374656e7469616c4465706f736974602c207468656e2074686973202772657365727665206163636f756e74272069732064656c657465643a207370656369666963616c6c792c2060526573657276656442616c616e6365602e206073797374656d3a3a4163636f756e744e6f6e63656020697320616c736f2064656c6574656420696620604672656542616c616e63656020697320616c736f207a65726f2028697420616c736f206765747320636f6c6c617073656420746f207a65726f2069662069742065766572206265636f6d6573206c657373207468616e20604578697374656e7469616c4465706f736974602e2920546865202766726565272062616c616e6365206f66206120676976656e206163636f756e742e205468697320697320746865206f6e6c792062616c616e63652074686174206d61747465727320696e207465726d73206f66206d6f7374206f7065726174696f6e73206f6e20746f6b656e732e20497420616c6f6e65206973207573656420746f2064657465726d696e65207468652062616c616e6365207768656e20696e2074686520636f6e747261637420657865637574696f6e20656e7669726f6e6d656e742e205768656e20746869732062616c616e63652066616c6c732062656c6f77207468652076616c7565206f6620604578697374656e7469616c4465706f736974602c207468656e20746865202763757272656e74206163636f756e74272069732064656c657465643a207370656369666963616c6c7920604672656542616c616e6365602e20467572746865722c2074686520604f6e4672656542616c616e63655a65726f602063616c6c6261636b20697320696e766f6b65642c20676976696e672061206368616e636520746f2065787465726e616c206d6f64756c657320746f20636c65616e2075702064617461206173736f6369617465642077697468207468652064656c65746564206163636f756e742e206073797374656d3a3a4163636f756e744e6f6e63656020697320616c736f2064656c657465642069662060526573657276656442616c616e63656020697320616c736f207a65726f2028697420616c736f206765747320636f6c6c617073656420746f207a65726f2069662069742065766572206265636f6d6573206c657373207468616e20604578697374656e7469616c4465706f736974602e20496e666f726d6174696f6e20726567617264696e67207468652076657374696e67206f66206120676976656e206163636f756e742e20546865206d696e696d756d20616d6f756e7420726571756972656420746f206b65657020616e206163636f756e74206f70656e2e2054686520746f74616c20756e6974732069737375656420696e207468652073797374656d2e636f6465206973206e6f7420666f756e647072697374696e6520636f6465206973206e6f7420666f756e647468657265206973206e6f7420656e6f7567682067617320666f722073746f72696e672074686520636f64656e6f7420656e6f75676820667265652066756e64732f55736572732f612f7372632f737562737472617465322f73726d6c2f62616c616e6365732f7372632f6c69622e727342616c616e636573204372656174696f6e46656542616c616e636573205472616e7366657246656564657374696e6174696f6e2062616c616e636520746f6f206869676820746f20726563656976652076616c756576616c756520746f6f206c6f7720746f20637265617465206163636f756e7462616c616e636520746f6f206c6f7720746f2073656e642076616c7565676f74206f766572666c6f7720616674657220616464696e6720612066656520746f2076616c756566696e616c6e756d46696e616c697a6564206e756d62657220696e686572656e742064617461206e6f7420666f756e64566f746572526561706564426164526561706572536c617368656454616c6c795374617274656454616c6c7946696e616c697a656420412074616c6c792028666f7220617070726f76616c20766f746573206f6620636f756e63696c2073656174287329292068617320656e646564202877697468206f6e65206f72206d6f7265206e6577206d656d62657273292e5665633c4163636f756e7449643e20412074616c6c792028666f7220617070726f76616c20766f746573206f6620636f756e63696c2073656174287329292068617320737461727465642e20736c6173686564207265617065722072656170656420766f7465722c20726561706572647572696e6720657865637574696f6e2f55736572732f612f7372632f737562737472617465322f73726d6c2f636f6e74726163742f7372632f7761736d2f72756e74696d652e7273436f756e63696c205265676973746572496e666f4f66436f756e63696c20416374697665436f756e63696c000000000000000000000000617474656d707420746f20646976696465206279207a65726f000000000000002f72757374632f653334323864623763326231656562333530393665306266333736373233393739373766663033302f7372632f6c6962636f72652f6f70732f61726974682e7273707265636f6e646974696f6e3a20616c6c20696d706f7274732073686f756c6420626520636865636b656420616761696e737420746865207369676e617475726573206f6620636f72726573706f6e64696e670a09090909090966756e6374696f6e7320646566696e65642062792060646566696e655f656e762160206d6163726f206279207468652075736572206f6620746865206d6163726f3b0a0909090909097369676e617475726573206f662074686573652066756e6374696f6e7320646566696e6564206279206024706172616d73603b0a09090909090963616c6c7320616c77617973206d616465207769746820617267756d656e7473207479706573206f662077686963682061726520646566696e65642062792074686520636f72726573706f6e64696e6720696d706f7274733b0a09090909090974687573207479706573206f6620617267756d656e74732073686f756c6420626520657175616c20746f2074797065206c69737420696e206024706172616d736020616e640a0909090909096c656e677468206f6620617267756d656e74206c69737420616e642024706172616d732073686f756c6420626520657175616c3b0a0909090909097468757320746869732063616e206e6576657220626520604e6f6e65603b0a0909090909097165643b0a09090909090960656d7074795f6f75747075745f627566602069732074616b656e206f6e6c7920686572653b0a09090909606578745f72657475726e602074726170733b0a090909096052756e74696d65602063616e206f6e6c792062652075736564206f6e6c7920666f72206f6e6520657865637574696f6e3b0a090909097165647365745f617070726f76616c7370726f78795f7365745f617070726f76616c73726561705f696e6163746976655f766f746572726574726163745f766f7465727375626d69745f63616e64696461637970726573656e745f77696e6e65727365745f646573697265645f736561747372656d6f76655f6d656d6265727365745f70726573656e746174696f6e5f6475726174696f6e7365745f7465726d5f6475726174696f6e20536574207468652070726573656e746174696f6e206475726174696f6e2e2049662074686572652069732063757272656e74206120766f7465206265696e672070726573656e74656420666f722c2077696c6c20696e766f6b65206066696e616c697a655f766f7465602e20536574207468652070726573656e746174696f6e206475726174696f6e2e2049662074686572652069732063757272656e746c79206120766f7465206265696e672070726573656e74656420666f722c2077696c6c636f756e742052656d6f7665206120706172746963756c6172206d656d6265722e20412074616c6c792077696c6c2068617070656e20696e7374616e746c7920286966206e6f7420616c726561647920696e20612070726573656e746174696f6e20706572696f642920746f2066696c6c2074686520736561742069662072656d6f76616c206d65616e732074686174207468652064657369726564206d656d6265727320617265206e6f74206d65742e20546869732069732065666665637469766520696d6d6564696174656c792e77686f20536574207468652064657369726564206d656d62657220636f756e743b206966206c6f776572207468616e207468652063757272656e7420636f756e742c207468656e2073656174732077696c6c206e6f7420626520757020656c656374696f6e207768656e2074686579206578706972652e204966206d6f72652c207468656e2061206e657720766f74652077696c6c2062652073746172746564206966206f6e65206973206e6f7420616c726561647920696e2070726f67726573732e20436c61696d207468617420607369676e656460206973206f6e65206f662074686520746f702053656c663a3a63617272795f636f756e742829202b2063757272656e745f766f746528292e312063616e646964617465732e204f6e6c7920776f726b73206966207468652060626c6f636b5f6e756d626572203e3d2063757272656e745f766f746528292e306020616e6420603c2063757272656e745f766f746528292e30202b2070726573656e746174696f6e5f6475726174696f6e2829606020607369676e6564602073686f756c642068617665206174206c6561737463616e646964617465746f74616c436f6d706163743c566f7465496e6465783e205375626d6974206f6e6573656c6620666f722063616e6469646163792e204163636f756e74206d757374206861766520656e6f756768207472616e736665727261626c652066756e647320696e20697420746f207061792074686520626f6e642e736c6f742052656d6f7665206120766f7465722e20416c6c20766f746573206172652063616e63656c6c656420616e642074686520766f746572206465706f7369742069732072657475726e65642e2052656d6f7665206120766f7465722e20466f72206974206e6f7420746f206265206120626f6e642d636f6e73756d696e67206e6f2d6f702c20616c6c20617070726f7665642063616e64696461746520696e6469636573206d757374206e6f772062652065697468657220756e72656769737465726564206f72207265676973746572656420746f20612063616e646964617465207468617420726567697374657265642074686520736c6f742061667465722074686520766f7465722067617665207468656972206c61737420617070726f76616c207365742e204d61792062652063616c6c656420627920616e796f6e652e2052657475726e732074686520766f746572206465706f73697420746f20607369676e6564602e7265706f727465725f696e64657877686f5f696e646578617373756d65645f766f74655f696e646578205365742063616e64696461746520617070726f76616c732066726f6d20612070726f78792e20417070726f76616c20736c6f747320737461792076616c6964206173206c6f6e672061732063616e6469646174657320696e2074686f736520736c6f74732061726520726567697374657265642e205365742063616e64696461746520617070726f76616c732e20417070726f76616c20736c6f747320737461792076616c6964206173206c6f6e672061732063616e6469646174657320696e2074686f736520736c6f7473766f7465735665633c626f6f6c3e436f756e63696c43616e646964616379426f6e64566f74696e67426f6e6450726573656e74536c617368506572566f7465724361727279436f756e7450726573656e746174696f6e4475726174696f6e496e6163746976654772616365506572696f64566f7465496e6465785465726d4475726174696f6e446573697265645365617473416374697665436f756e63696c5665633c28543a3a4163636f756e7449642c20543a3a426c6f636b4e756d626572293e566f7465436f756e74417070726f76616c734f665265676973746572496e666f4f6628566f7465496e6465782c20753332294c6173744163746976654f66566f7465727343616e6469646174657343616e646964617465436f756e744e65787446696e616c697a6528543a3a426c6f636b4e756d6265722c207533322c205665633c543a3a4163636f756e7449643e29536e617073686f7465645374616b65735665633c42616c616e63654f663c543e3e4c6561646572626f6172645665633c2842616c616e63654f663c543e2c20543a3a4163636f756e744964293e2047657420746865206c6561646572626f61726420696620776527726520696e207468652070726573656e746174696f6e2070686173652e20546865207374616b6573206173207468657920776572652061742074686520706f696e7420746861742074686520766f746520656e6465642e20546865206163636f756e747320686f6c64696e672074686520736561747320746861742077696c6c206265636f6d652066726565206f6e20746865206e6578742074616c6c792e205468652070726573656e742063616e646964617465206c6973742e205468652070726573656e7420766f746572206c6973742e20546865206c61737420636c656172656420766f746520696e6465782074686174207468697320766f74657220776173206c617374206163746976652061742e2054686520766f746520696e64657820616e64206c69737420736c6f742074686174207468652063616e646964617465206077686f60207761732072656769737465726564206f7220604e6f6e6560206966207468657920617265206e6f742063757272656e746c7920726567697374657265642e2041206c697374206f6620766f74657320666f72206561636820766f7465722c2072657370656374696e6720746865206c61737420636c656172656420766f746520696e6465782074686174207468697320766f74657220776173206c617374206163746976652061742e2054686520746f74616c206e756d626572206f6620766f746573207468617420686176652068617070656e6564206f722061726520696e2070726f67726573732e205468652063757272656e7420636f756e63696c2e205768656e2074686572652773206120766f746520676f696e67206f6e2c20746869732073686f756c64207374696c6c206265207573656420666f7220657865637574697665206d6174746572732e2054686520626c6f636b206e756d62657220287365636f6e6420656c656d656e7420696e20746865207475706c65292069732074686520626c6f636b207468617420746865697220706f736974696f6e2069732061637469766520756e74696c202863616c63756c61746564206279207468652073756d206f662074686520626c6f636b206e756d626572207768656e2074686520636f756e63696c206d656d6265722077617320656c656374656420616e64207468656972207465726d206475726174696f6e292e204e756d626572206f66206163636f756e747320746861742073686f756c642062652073697474696e67206f6e2074686520636f756e63696c2e20486f77206c6f6e67206561636820706f736974696f6e2069732061637469766520666f722e20486f77206f6674656e2028696e20626c6f636b732920746f20636865636b20666f72206e657720766f7465732e20486f77206d616e7920766f746520696e6465786573206e65656420746f20676f20627920616674657220612074617267657420766f7465722773206c61737420766f7465206265666f726520746865792063616e2062652072656170656420696620746865697220617070726f76616c7320617265206d6f6f742e20486f77206c6f6e6720746f2067697665206561636820746f702063616e64696461746520746f2070726573656e74207468656d73656c7665732061667465722074686520766f746520656e64732e20486f77206d616e792072756e6e6572732d75702073686f756c64206861766520746865697220617070726f76616c73207065727369737420756e74696c20746865206e65787420766f74652e205468652070756e6973686d656e742c2070657220766f7465722c20696620796f752070726f7669646520616e20696e76616c69642070726573656e746174696f6e2e20486f77206d7563682073686f756c64206265206c6f636b656420757020696e206f7264657220746f2062652061626c6520746f207375626d697420766f7465732e20486f77206d7563682073686f756c64206265206c6f636b656420757020696e206f7264657220746f207375626d6974206f6e6527732063616e6469646163792e436f756e63696c20566f74696e67506572696f64436f756e63696c20446573697265645365617473436f756e63696c204e65787446696e616c697a65436f756e63696c205465726d4475726174696f6e436f756e63696c2050726573656e746174696f6e4475726174696f6e436f756e63696c20566f74657273436f756e63696c20536e617073686f7465645374616b6573436f756e63696c204361727279436f756e74436f756e63696c204c6561646572626f617264436f756e63696c2043616e64696461746573436f756e63696c2043616e646964617465436f756e74436f756e63696c20566f7465436f756e74436f756e63696c2043616e646964616379426f6e6466696e616c697a652063616e206f6e6c792062652063616c6c656420616674657220612074616c6c7920697320737461727465642e00000000000000002f72757374632f653334323864623763326231656562333530393665306266333736373233393739373766663033302f7372632f6c6962636f72652f736c6963652f6d6f642e72730000000000000000617474656d707420746f2063616c63756c617465207468652072656d61696e646572207769746820612064697669736f72206f66207a65726f2f55736572732f612f7372632f737562737472617465322f73726d6c2f636f756e63696c2f7372632f73656174732e72736e6f7420612070726f7879436f756e63696c204c6173744163746976654f6663616e6e6f74207265617020647572696e672070726573656e746174696f6e20706572696f647265706f72746572206d757374206265206120766f746572766f746520696e646578206e6f742063757272656e7463616e6e6f74207265617020647572696e6720677261636520706572696f6474617267657420666f7220696e616374697669747920636c65616e7570206d75737420626520616374697665626164207265706f7274657220696e646578436f756e63696c20496e6163746976654772616365506572696f64436f756e63696c20566f74696e67426f6e646261642074617267657420696e64657863616e6e6f742072657472616374207768656e2070726573656e74696e6763616e6e6f742072657472616374206e6f6e2d766f74657272657472616374696f6e20696e64657820696e76616c696472657472616374696f6e20696e646578206d69736d617463686475706c69636174652063616e646964617465207375626d697373696f6e696e76616c69642063616e64696461746520736c6f7463616e64696461746520686173206e6f7420656e6f7567682066756e64737374616b65206465706f736974656420746f2070726573656e742077696e6e657220616e6420626520616464656420746f206c6561646572626f6172642073686f756c64206265206e6f6e2d7a65726f63616e6e6f742070726573656e74206f757473696465206f662070726573656e746174696f6e20706572696f64696e646578206e6f742063757272656e746c6561646572626f617264206d757374206578697374207768696c652070726573656e742070686173652061637469766570726573656e746572206d75737420686176652073756666696369656e7420736c61736861626c652066756e647363616e646964617465206e6f7420776f72746879206f66206c6561646572626f61726463616e646964617465206d757374206e6f7420666f726d2061206475706c696361746564206d656d62657220696620656c656374656470726573656e7465642063616e646964617465206d7573742062652063757272656e74436f756e63696c2050726573656e74536c617368506572566f7465726475706c69636174652070726573656e746174696f6e696e636f727265637420746f74616c436f756e63696c20417070726f76616c734f666e6f20617070726f76616c206368616e67657320647572696e672070726573656e746174696f6e20706572696f64696e636f727265637420766f746520696e646578616d6f756e74206f662063616e6469646174657320746f207265636569766520617070726f76616c20766f7465732073686f756c64206265206e6f6e2d7a65726f616d6f756e74206f662063616e64696461746520617070726f76616c20766f7465732063616e6e6f742065786365656420616d6f756e74206f662063616e646964617465735468657265206973206f6e6c79206f6e6520666174616c206572726f723b20716564496e686572656e7420776974682073616d65206964656e74696669657220616c726561647920657869737473214e6f206f74686572206572726f72732061726520616363657074656420616674657220616e2068617264206572726f722142616420696e70757420646174612070726f766964656420746f20657865637574655f626c6f636b696e697469616c697a655f626c6f636b6170706c795f65787472696e736963696e686572656e745f65787472696e73696373636865636b5f696e686572656e747376616c69646174655f7472616e73616374696f6e6f6666636861696e5f776f726b65726772616e6470615f70656e64696e675f6368616e67656772616e6470615f666f726365645f6368616e6765617373657274696f6e206661696c65643a20696e646578203c206c656e000000000000002f72757374632f653334323864623763326231656562333530393665306266333736373233393739373766663033302f7372632f6c6962616c6c6f632f7665632e727354696d657374616d702044696455706461746554616c6c7943616e63656c6174696f6e54616c6c795265666572656e64756d204120766f74696e672074616c6c79206861732068617070656e656420666f722061207265666572656e64756d20766f74652e204c61737420746872656520617265207965732c206e6f2c206162737461696e20636f756e74732e204120766f74696e672074616c6c79206861732068617070656e656420666f722061207265666572656e64756d2063616e63656c6c6174696f6e20766f74652e4e6577417574686f726974696573204e657720617574686f726974792073657420686173206265656e206170706c6965642e5665633c2853657373696f6e4b65792c20753634293e3a6772616e6470613a617574683a6c656e54696d657374616d70206d7573742062652075706461746564206f6e636520696e2074686520626c6f636b2f55736572732f612f7372632f737562737472617465322f73726d6c2f74696d657374616d702f7372632f6c69622e727354696d657374616d70206d7573742062652075706461746564206f6e6c79206f6e636520696e2074686520626c6f636b54696d657374616d70206d75737420696e6372656d656e74206279206174206c65617374203c4d696e696d756d506572696f643e206265747765656e2073657175656e7469616c20626c6f636b7354696d657374616d70204e6f7754696d657374616d7020426c6f636b506572696f6454696d657374616d70204d696e696d756d506572696f64436f756e63696c566f74696e6720436f756e63696c566f74654f662f55736572732f612f7372632f737562737472617465322f73726d6c2f7375646f2f7372632f6c69622e7273000000000000000000000000002f72757374632f653334323864623763326231656562333530393665306266333736373233393739373766663033302f7372632f6c6962636f72652f736c6963652f6d6f642e72732f55736572732f612f7372632f737562737472617465322f73726d6c2f636f756e63696c2f7372632f766f74696e672e727354696d657374616d7020746f6f2066617220696e2066757475726520746f206163636570744765747320616e64206465636f6465732074696d657374616d7020696e686572656e74206461746153756469644b65794368616e67656420546865207375646f6572206a757374207377697463686564206964656e746974793b20746865206f6c64206b657920697320737570706c6965642e2041207375646f206a75737420746f6f6b20706c6163652e7665746f7365745f636f6f6c6f66665f706572696f647365745f766f74696e675f706572696f64626c6f636b7370726f706f73616c5f68617368426f783c543a3a50726f706f73616c3e436f756e63696c566f74696e67436f6f6c6f6666506572696f64566f74696e67506572696f64456e61637444656c6179506572696f645665633c28543a3a426c6f636b4e756d6265722c20543a3a48617368293e543a3a50726f706f73616c50726f706f73616c566f74657273436f756e63696c566f74654f6628543a3a486173682c20543a3a4163636f756e744964295665746f656450726f706f73616c28543a3a426c6f636b4e756d6265722c205665633c543a3a4163636f756e7449643e29204e756d626572206f6620626c6f636b7320627920776869636820746f2064656c617920656e6163746d656e74206f66207375636365737366756c2c206e6f6e2d756e616e696d6f75732d636f756e63696c2d696e7374696761746564207265666572656e64756d2070726f706f73616c732e7265706f72745f6d69736265686176696f72205265706f727420736f6d65206d69736265686176696f722e5f7265706f72744772616e64706146696e616c6974792050656e64696e674368616e67654772616e64706146696e616c697479204e657874466f726365644772616e64706146696e616c69747950656e64696e674368616e676553746f72656450656e64696e674368616e67653c543a3a426c6f636b4e756d6265722c20543a3a53657373696f6e4b65793e4e657874466f7263656473657420536574207468652063757272656e742074696d652e20546869732063616c6c2073686f756c6420626520696e766f6b65642065786163746c79206f6e63652070657220626c6f636b2e2049742077696c6c2070616e6963206174207468652066696e616c697a6174696f6e2070686173652c20696620746869732063616c6c206861736e2774206265656e20696e766f6b656420627920746861742074696d652e205468652074696d657374616d702073686f756c642062652067726561746572207468616e207468652070726576696f7573206f6e652062792074686520616d6f756e742073706563696669656420627920606d696e696d756d5f706572696f64602e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d7573742062652060496e686572656e74602e6e6f77436f6d706163743c543a3a4d6f6d656e743e54696d657374616d704e6f77426c6f636b506572696f644d696e696d756d506572696f6444696455706461746520446964207468652074696d657374616d7020676574207570646174656420696e207468697320626c6f636b3f20546865206d696e696d756d20706572696f64206265747765656e20626c6f636b732e204265776172652074686174207468697320697320646966666572656e7420746f20746865202a65787065637465642a20706572696f6420746861742074686520626c6f636b2070726f64756374696f6e206170706172617475732070726f76696465732e20596f75722063686f73656e20636f6e73656e7375732073797374656d2077696c6c2067656e6572616c6c7920776f726b2077697468207468697320746f2064657465726d696e6520612073656e7369626c6520626c6f636b2074696d652e20652e672e20466f7220417572612c2069742077696c6c20626520646f75626c65207468697320706572696f64206f6e2064656661756c742073657474696e67732e204f6c642073746f72616765206974656d2070726f766964656420666f7220636f6d7061746962696c6974792e2052656d6f766520616674657220616c6c206e6574776f726b732075706772616465642e2043757272656e742074696d6520666f72207468652063757272656e7420626c6f636b2e436f756e63696c566f74696e672050726f706f73616c73436f756e63696c566f74696e672050726f706f73616c4f66436f756e63696c566f74696e67205665746f656450726f706f73616c436f756e63696c566f74696e6720456e61637444656c6179506572696f6447757275206d656469746174696f6e6f6e6c79207468652063757272656e74207375646f206b65792063616e207375646f5375646f204b65796f6e6c79207468652063757272656e74207375646f206b65792063616e206368616e676520746865207375646f206b657952657475726e207479706573206c656e6774682073686f756c642062652030206f722031436f756e63696c566f74696e6720566f74696e67506572696f6470726f706f73657220776f756c64206e6f74206265206f6e20636f756e63696c70726f706f73616c206973207665746f6564436f756e63696c566f74696e672050726f706f73616c566f746572736f6e6c7920636f756e63696c6c6f7273206d617920766f7465206f6e20636f756e63696c2070726f706f73616c736120636f756e63696c6c6f72206d6179206e6f74207665746f20612070726f706f73616c2074776963656f6e6c7920636f756e63696c6c6f7273206d6179207665746f20636f756e63696c2070726f706f73616c7370726f706f73616c206d75737420657869737420746f206265207665746f6564436f756e63696c566f74696e6720436f6f6c6f6666506572696f642041757468656e74696361746573207468652063757272656e74207375646f206b657920616e6420736574732074686520676976656e204163636f756e7449642028606e6577602920617320746865206e6577207375646f206b65792e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e2041757468656e7469636174657320746865207375646f206b657920616e64206469737061746368657320612066756e6374696f6e2063616c6c20776974682060526f6f7460206f726967696e2e5375646f4b65792054686520604163636f756e74496460206f6620746865207375646f206b65792e53657373696f6e20466f7263696e674e657753657373696f6e4e657753657373696f6e204e65772073657373696f6e206861732068617070656e65642e204e6f746520746861742074686520617267756d656e74206973207468652073657373696f6e20696e6465782c206e6f742074686520626c6f636b206e756d626572206173207468652074797065206d6967687420737567676573742e426c6f636b4e756d6265725370656e64696e67417761726465644275726e74526f6c6c6f766572205370656e64696e67206861732066696e69736865643b20746869732069732074686520616d6f756e74207468617420726f6c6c73206f76657220756e74696c206e657874207370656e642e20536f6d65206f66206f75722066756e64732068617665206265656e206275726e742e20536f6d652066756e64732068617665206265656e20616c6c6f63617465642e205765206861766520656e6465642061207370656e6420706572696f6420616e642077696c6c206e6f7720616c6c6f636174652066756e64732e204e65772070726f706f73616c2e53657373696f6e2043757272656e74496e64657853657373696f6e2053657373696f6e4c656e67746853657373696f6e2056616c696461746f727353657373696f6e204e6578744b6579466f72547265617375727920506f7454726561737572792050726f706f73616c73616c726561647920626f72726f776564616c7265616479206d757461626c7920626f72726f7765642f55736572732f612f7372632f737562737472617465322f73726d6c2f73657373696f6e2f7372632f6c69622e72732f55736572732f612f7372632f737562737472617465322f73726d6c2f74726561737572792f7372632f6c69622e7273636f6e74726163742073756273797374656d20726573756c74696e6720696e20706f73697469766520696d62616c616e6365212f55736572732f612f7372632f737562737472617465322f73726d6c2f636f6e74726163742f7372632f6163636f756e745f64622e72737365745f6b65797365745f6c656e677468666f7263655f6e65775f73657373696f6e20466f726365732061206e65772073657373696f6e2e205365742061206e65772073657373696f6e206c656e6774682e20576f6e2774206b69636b20696e20756e74696c20746865206e6578742073657373696f6e206368616e6765202861742063757272656e74206c656e677468292e2053657473207468652073657373696f6e206b6579206f6620605f76616c696461746f726020746f20605f6b6579602e205468697320646f65736e27742074616b652065666665637420756e74696c20746865206e6578742073657373696f6e2e6b6579543a3a53657373696f6e4b657953657373696f6e53657373696f6e4c656e67746843757272656e74496e64657843757272656e745374617274543a3a4d6f6d656e74466f7263696e674e657753657373696f6e4c6173744c656e6774684368616e67654e6578744b6579466f724e65787453657373696f6e4c656e67746820546865206e6578742073657373696f6e206c656e6774682e20546865206e657874206b657920666f72206120676976656e2076616c696461746f722e20426c6f636b206174207768696368207468652073657373696f6e206c656e677468206c617374206368616e6765642e204e65772073657373696f6e206973206265696e6720666f72636564206966207468697320656e747279206578697374733b20696e20776869636820636173652c2074686520626f6f6c65616e2076616c7565206973207768657468657220746865206e65772073657373696f6e2073686f756c6420626520636f6e736964657265642061206e6f726d616c20726f746174696f6e202872657761726461626c6529206f7220657863657074696f6e616c2028736c61736861626c65292e2054696d657374616d70207768656e2063757272656e742073657373696f6e20737461727465642e2043757272656e7420696e646578206f66207468652073657373696f6e2e2043757272656e74206c656e677468206f66207468652073657373696f6e2e205468652063757272656e7420736574206f662076616c696461746f72732e70726f706f73655f7370656e647365745f706f74636f6e66696775726572656a6563745f70726f706f73616c617070726f76655f70726f706f73616c20417070726f766520612070726f706f73616c2e2041742061206c617465722074696d652c207468652070726f706f73616c2077696c6c20626520616c6c6f636174656420746f207468652062656e656669636961727920616e6420746865206f726967696e616c206465706f7369742077696c6c2062652072657475726e65642e2052656a65637420612070726f706f736564207370656e642e20546865206f726967696e616c206465706f7369742077696c6c20626520736c61736865642e70726f706f73616c5f6964202852652d29636f6e6669677572652074686973206d6f64756c652e70726f706f73616c5f626f6e64436f6d706163743c5065726d696c6c3e70726f706f73616c5f626f6e645f6d696e696d756d7370656e645f706572696f646275726e20536574207468652062616c616e6365206f662066756e647320617661696c61626c6520746f207370656e642e6e65775f706f742050757420666f727761726420612073756767657374696f6e20666f72207370656e64696e672e2041206465706f7369742070726f706f7274696f6e616c20746f207468652076616c756520697320726573657276656420616e6420736c6173686564206966207468652070726f706f73616c2069732072656a65637465642e2049742069732072657475726e6564206f6e6365207468652070726f706f73616c20697320617761726465642e62656e6566696369617279547265617375727950726f706f73616c426f6e645065726d696c6c50726f706f73616c426f6e644d696e696d756d5370656e64506572696f644275726e506f7450726f706f73616c3c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e417070726f76616c735665633c50726f706f73616c496e6465783e2050726f706f73616c20696e646963657320746861742068617665206265656e20617070726f76656420627574206e6f742079657420617761726465642e2050726f706f73616c7320746861742068617665206265656e206d6164652e204e756d626572206f662070726f706f73616c7320746861742068617665206265656e206d6164652e20546f74616c2066756e647320617661696c61626c6520746f2074686973206d6f64756c6520666f72207370656e64696e672e2050657263656e74616765206f662073706172652066756e64732028696620616e7929207468617420617265206275726e7420706572207370656e6420706572696f642e20506572696f64206265747765656e2073756363657373697665207370656e64732e204d696e696d756d20616d6f756e74206f662066756e647320746861742073686f756c6420626520706c6163656420696e2061206465706f73697420666f72206d616b696e6720612070726f706f73616c2e2050726f706f7274696f6e206f662066756e647320746861742073686f756c6420626520626f6e64656420696e206f7264657220746f20706c61636520612070726f706f73616c2e20416e2061636365707465642070726f706f73616c2067657473207468657365206261636b2e20412072656a65637465642070726f706f73616c20646f65736e27742e53657373696f6e204c6173744c656e6774684368616e676553657373696f6e2043757272656e74537461727453657373696f6e204e65787453657373696f6e4c656e67746800000000000000000000000000617474656d707420746f2063616c63756c617465207468652072656d61696e646572207769746820612064697669736f72206f66207a65726f000000000000002f72757374632f653334323864623763326231656562333530393665306266333736373233393739373766663033302f7372632f6c6962636f72652f6f70732f61726974682e72735472656173757279205370656e64506572696f64547265617375727920417070726f76616c735472656173757279204275726e50726f706f73657227732062616c616e636520746f6f206c6f7754726561737572792050726f706f73616c426f6e644d696e696d756d54726561737572792050726f706f73616c426f6e6454726561737572792050726f706f73616c436f756e744e6f2070726f706f73616c206174207468617420696e6465784e65774163636f756e74496e6465782041206e6577206163636f756e7420696e646578207761732061737369676e65642e2054686973206576656e74206973206e6f7420747269676765726564207768656e20616e206578697374696e6720696e64657820697320726561737369676e656420746f20616e6f7468657220604163636f756e744964602e4163636f756e74496e646578626c6f636b2073697a65206c696d697420697320726561636865646f766572666c6f77206d756c7469706c79696e6720676173206c696d6974206279207072696365496e646963657320456e756d53657400000000617474656d707420746f20646976696465206279207a65726f000000000000002f72757374632f653334323864623763326231656562333530393665306266333736373233393739373766663033302f7372632f6c6962636f72652f6f70732f61726974682e72732f55736572732f612f7372632f737562737472617465322f73726d6c2f696e64696365732f7372632f6c69622e7273696e76616c6964206163636f756e7420696e646578000000000000000000000000736869667465642073756666696369656e74206269747320726967687420746f206c656164206f6e6c79206c656164696e67207a65726f733b2071656450726576696f7573206d617463682061726d206d61746368657320616e7974696e67206c657373207468616e20325e33303b20716564496e64696365734e657874456e756d536574543a3a4163636f756e74496e646578456e756d5365742054686520656e756d65726174696f6e20736574732e20546865206e657874206672656520656e756d65726174696f6e207365742e496e6469636573204e657874456e756d5365740000000000000000000000000000000000000000005265776172644f66666c696e655761726e696e674f66666c696e65536c617368204f6e652076616c696461746f722028616e64207468656972206e6f6d696e61746f72732920686173206265656e20736c61736865642062792074686520676976656e20616d6f756e742e204f6e652076616c696461746f722028616e64207468656972206e6f6d696e61746f72732920686173206265656e20676976656e2061206f66666c696e652d7761726e696e67202874686579277265207374696c6c2077697468696e207468656972206772616365292e205468652061636372756564206e756d626572206f6620736c6173686573206973207265636f726465642c20746f6f2e20416c6c2076616c696461746f72732068617665206265656e2072657761726465642062792074686520676976656e2062616c616e63652e5374616b696e6720426f6e6465645374616b696e67204e6f6d696e61746f72735374616b696e672056616c696461746f72735374616b696e67204c6564676572626f6e64626f6e645f6578747261756e626f6e6477697468647261775f756e626f6e64656476616c69646174656e6f6d696e6174656368696c6c7365745f70617965657365745f636f6e74726f6c6c65727365745f73657373696f6e735f7065725f6572617365745f626f6e64696e675f6475726174696f6e7365745f76616c696461746f725f636f756e74666f7263655f6e65775f6572617365745f6f66666c696e655f736c6173685f67726163657365745f696e76756c6e657261626c657320536574207468652076616c696461746f72732077686f2063616e6e6f7420626520736c61736865642028696620616e79292e76616c696461746f72735665633c543a3a4163636f756e7449643e2053657420746865206f66666c696e6520736c61736820677261636520706572696f642e20466f72636520746865726520746f2062652061206e6577206572612e205468697320616c736f20666f726365732061206e65772073657373696f6e20696d6d6564696174656c792061667465722e20606170706c795f72657761726473602073686f756c64206265207472756520666f722076616c696461746f727320746f20676574207468652073657373696f6e207265776172642e6170706c795f726577617264732054686520696465616c206e756d626572206f662076616c696461746f72732e6e657720546865206c656e677468206f662074686520626f6e64696e67206475726174696f6e20696e20657261732e2053657420746865206e756d626572206f662073657373696f6e7320696e20616e206572612e436f6d706163743c543a3a426c6f636b4e756d6265723e202852652d2973657420746865207061796d656e742074617267657420666f72206120636f6e74726f6c6c65722e20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f206279207468652073746173682c206e6f742074686520636f6e74726f6c6c65722e636f6e74726f6c6c657220546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e706179656552657761726444657374696e6174696f6e204465636c617265206e6f2064657369726520746f206569746865722076616c6964617465206f72206e6f6d696e6174652e204465636c617265207468652064657369726520746f206e6f6d696e6174652060746172676574736020666f7220746865206f726967696e20636f6e74726f6c6c65722e746172676574735665633c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263653e204465636c617265207468652064657369726520746f2076616c696461746520666f7220746865206f726967696e20636f6e74726f6c6c65722e707265667356616c696461746f7250726566733c42616c616e63654f663c543e3e2052656d6f766520616e7920756e6c6f636b6564206368756e6b732066726f6d207468652060756e6c6f636b696e67602071756575652066726f6d206f7572206d616e6167656d656e742e205468697320657373656e7469616c6c7920667265657320757020746861742062616c616e636520746f206265207573656420627920746865207374617368206163636f756e7420746f20646f2077686174657665722069742077616e74732e2053656520616c736f205b6043616c6c3a3a756e626f6e64605d2e205363686564756c65206120706f7274696f6e206f662074686520737461736820746f20626520756e6c6f636b656420726561647920666f72207472616e73666572206f75742061667465722074686520626f6e6420706572696f6420656e64732e2049662074686973206c656176657320616e20616d6f756e74206163746976656c7920626f6e646564206c657373207468616e20543a3a43757272656e63793a3a6578697374656e7469616c5f6465706f73697428292c207468656e20697420697320696e6372656173656420746f207468652066756c6c20616d6f756e742e204f6e63652074686520756e6c6f636b20706572696f6420697320646f6e652c20796f752063616e2063616c6c206077697468647261775f756e626f6e6465646020746f2061637475616c6c79206d6f7665207468652066756e6473206f7574206f66206d616e6167656d656e7420726561647920666f72207472616e736665722e2053656520616c736f205b6043616c6c3a3a77697468647261775f756e626f6e646564605d2e2041646420736f6d6520657874726120616d6f756e742074686174206861766520617070656172656420696e207468652073746173682060667265655f62616c616e63656020696e746f207468652062616c616e636520757020666f72207374616b696e672e20557365207468697320696620746865726520617265206164646974696f6e616c2066756e647320696e20796f7572207374617368206163636f756e74207468617420796f75207769736820746f20626f6e642e6d61785f6164646974696f6e616c2054616b6520746865206f726967696e206163636f756e74206173206120737461736820616e64206c6f636b207570206076616c756560206f66206974732062616c616e63652e2060636f6e74726f6c6c6572602077696c6c20626520746865206163636f756e74207468617420636f6e74726f6c732069742e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20627920746865207374617368206163636f756e742e5374616b696e675374616b696e6720496e76756c6e657261626c65735374616b696e6720536c617368436f756e745374616b696e67204f66666c696e65536c61736847726163655374616b696e6720526563656e746c794f66666c696e6576206973206e6f6e2d656d7074793b207165645374616b696e67204f66666c696e65536c6173685374616b696e6720466f7263696e674e65774572614c696e6b616765206973207570646174656420696e206361736520656e7472792069732072656d6f7665643b20697420616c7761797320706f696e747320746f206578697374696e67206b6579733b2071656468656164206f66205374616b696e672056616c696461746f72735374616b696e67205374616b6572730000000000000000000000000000002f72757374632f653334323864623763326231656562333530393665306266333736373233393739373766663033302f7372632f6c6962636f72652f736c6963652f6d6f642e727356616c696461746f72436f756e744d696e696d756d56616c696461746f72436f756e7453657373696f6e73506572457261543a3a426c6f636b4e756d62657253657373696f6e52657761726450657262696c6c4f66666c696e65536c6173684772616365426f6e64696e674475726174696f6e496e76756c6e657261626c6573426f6e6465644c65646765725374616b696e674c65646765723c543a3a4163636f756e7449642c2042616c616e63654f663c543e2c20543a3a426c6f636b4e756d6265723e506179656556616c696461746f72734e6f6d696e61746f72735374616b6572734578706f737572653c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e43757272656e74456c656374656443757272656e7445726143757272656e7453657373696f6e52657761726443757272656e744572615265776172644e65787453657373696f6e735065724572614c6173744572614c656e6774684368616e6765536c6f745374616b65536c617368436f756e74466f7263696e674e65774572612829526563656e746c794f66666c696e655665633c28543a3a4163636f756e7449642c20543a3a426c6f636b4e756d6265722c20753332293e204d6f737420726563656e742060524543454e545f4f46464c494e455f434f554e546020696e7374616e6365732e202877686f206974207761732c207768656e20697420776173207265706f727465642c20686f77206d616e7920696e7374616e63657320746865792077657265206f66666c696e6520666f72292e2057652061726520666f7263696e672061206e6577206572612e20546865206e756d626572206f662074696d6573206120676976656e2076616c696461746f7220686173206265656e207265706f72746564206f66666c696e652e205468697320676574732064656372656d656e746564206279206f6e652065616368206572612074686174207061737365732e2054686520616d6f756e74206f662062616c616e6365206163746976656c79206174207374616b6520666f7220656163682076616c696461746f7220736c6f742c2063757272656e746c792e2054686973206973207573656420746f20646572697665207265776172647320616e642070756e6973686d656e74732e205468652073657373696f6e20696e6465782061742077686963682074686520657261206c656e677468206c617374206368616e6765642e20546865206e6578742076616c7565206f662073657373696f6e7320706572206572612e2054686520616363756d756c617465642072657761726420666f72207468652063757272656e74206572612e20526573657420746f207a65726f2061742074686520626567696e6e696e67206f66207468652065726120616e6420696e6372656173656420666f72206576657279207375636365737366756c6c792066696e69736865642073657373696f6e2e205468652063757272656e742065726120696e6465782e205468652063757272656e746c7920656c65637465642076616c696461746f7220736574206b65796564206279207374617368206163636f756e742049442e204e6f6d696e61746f727320666f72206120706172746963756c6172206163636f756e74207468617420697320696e20616374696f6e207269676874206e6f772e20596f752063616e27742069746572617465207468726f7567682076616c696461746f727320686572652c2062757420796f752063616e2066696e64207468656d20696e20746865206073657373696f6e7360206d6f64756c652e2054686973206973206b6579656420627920746865207374617368206163636f756e742e20546865206d61702066726f6d206e6f6d696e61746f72207374617368206b657920746f2074686520736574206f66207374617368206b657973206f6620616c6c2076616c696461746f727320746f206e6f6d696e6174652e20546865206d61702066726f6d202877616e6e616265292076616c696461746f72207374617368206b657920746f2074686520707265666572656e636573206f6620746861742076616c696461746f722e2057686572652074686520726577617264207061796d656e742073686f756c64206265206d6164652e204b657965642062792073746173682e204d61702066726f6d20616c6c2028756e6c6f636b6564292022636f6e74726f6c6c657222206163636f756e747320746f2074686520696e666f20726567617264696e6720746865207374616b696e672e204d61702066726f6d20616c6c206c6f636b65642022737461736822206163636f756e747320746f2074686520636f6e74726f6c6c6572206163636f756e742e20416e792076616c696461746f72732074686174206d6179206e6576657220626520736c6173686564206f7220666f726369626c79206b69636b65642e20497427732061205665632073696e63652074686579277265206561737920746f20696e697469616c697a6520616e642074686520706572666f726d616e636520686974206973206d696e696d616c2028776520657870656374206e6f206d6f7265207468616e20666f757220696e76756c6e657261626c65732920616e64207265737472696374656420746f20746573746e6574732e20546865206c656e677468206f662074686520626f6e64696e67206475726174696f6e20696e20626c6f636b732e204e756d626572206f6620696e7374616e636573206f66206f66666c696e65207265706f727473206265666f726520736c617368696e6720626567696e7320666f722076616c696461746f72732e20536c6173682c207065722076616c696461746f7220746861742069732074616b656e20666f72207468652066697273742074696d6520746865792061726520666f756e6420746f206265206f66666c696e652e204d6178696d756d207265776172642c207065722076616c696461746f722c20746861742069732070726f7669646564207065722061636365707461626c652073657373696f6e2e20546865206c656e677468206f662061207374616b696e672065726120696e2073657373696f6e732e204d696e696d756d206e756d626572206f66207374616b696e67207061727469636970616e7473206265666f726520656d657267656e637920636f6e646974696f6e732061726520696d706f7365642e2054686520696465616c206e756d626572206f66207374616b696e67207061727469636970616e74732e2f55736572732f612f7372632f737562737472617465322f73726d6c2f7374616b696e672f7372632f6c69622e72735374616b696e672043757272656e7453657373696f6e5265776172645374616b696e672043757272656e744572615265776172645374616b696e67204c6173744572614c656e6774684368616e67655374616b696e672053657373696f6e735065724572615374616b696e672043757272656e74456c65637465645374616b696e6720536c6f745374616b655374616b696e672043757272656e744572615374616b696e67204e65787453657373696f6e735065724572615374616b696e672056616c696461746f72436f756e745374616b696e67204d696e696d756d56616c696461746f72436f756e7468656164206f66205374616b696e67204e6f6d696e61746f72735374616b696e672053657373696f6e5265776172645374616b696e6720506179656500000000000000617474656d707420746f2063616c63756c617465207468652072656d61696e646572207769746820612064697669736f72206f66207a65726f000000000000002f72757374632f653334323864623763326231656562333530393665306266333736373233393739373766663033302f7372632f6c6962636f72652f6f70732f61726974682e72730000000000000000617474656d707420746f20646976696465206279207a65726f636f6e74726f6c6c657220616c726561647920706169726564737461736820616c726561647920626f6e6465646e6f7420612073746173686e6f74206120636f6e74726f6c6c65725374616b696e6720426f6e64696e674475726174696f6e756e7374616b65207468726573686f6c6420746f6f206c617267650a09090909090909096865616420697320736574207768656e20666972737420656c656d656e7420697320696e73657274656420616e6420756e736574207768656e206c61737420656c656d656e742069732072656d6f7665643b0a09090909090909096966206865616420697320536f6d65207468656e20697420706f696e747320746f206578697374696e67206b65793b207165640a09090909090909746172676574732063616e6e6f7420626520656d707479436f6e7472616374204163636f756e74436f756e746572436f6e7472616374204761735370656e74436f6e747261637420426c6f636b4761734c696d6974436f6e7472616374205072697374696e65436f6465436f6e7472616374204163636f756e74496e666f4f66436f6e747261637420436f646553746f72616765436f6e747261637420436f6465486173684f66436f6e7472616374204761735072696365436f6e7472616374205472616e73616374696f6e42617365466565436f6e7472616374205472616e73616374696f6e4279746546656573797374656d6175726174696d657374616d70636f6e73656e737573696e646963657362616c616e63657373657373696f6e7374616b696e6764656d6f6372616379636f756e63696c636f756e63696c5f766f74696e67636f756e63696c5f6d6f74696f6e7366696e616c6974795f747261636b65726772616e6470617472656173757279636f6e74726163747375646f5472616e73666572496e7374616e746961746564436f646553746f7265645363686564756c655570646174656444697370617463686564436f6e747261637420416e206576656e742066726f6d20636f6e7472616374206f66206163636f756e742e5665633c75383e20412063616c6c2077617320646973706174636865642066726f6d2074686520676976656e206163636f756e742e2054686520626f6f6c207369676e616c73207768657468657220697420776173207375636365737366756c20657865637574696f6e206f72206e6f742e20547269676765726564207768656e207468652063757272656e74207363686564756c6520697320757064617465642e20436f646520776974682074686520737065636966696564206861736820686173206265656e2073746f7265642e20436f6e7472616374206465706c6f7965642062792061646472657373206174207468652073706563696669656420616464726573732e205472616e736665722068617070656e6564206066726f6d6020746f2060746f60207769746820676976656e206076616c7565602061732070617274206f662061206063616c6c60206f722060637265617465602e42616c616e63657570646174655f7363686564756c657075745f636f646563616c6c63726561746520437265617465732061206e657720636f6e74726163742066726f6d207468652060636f646568617368602067656e65726174656420627920607075745f636f6465602c206f7074696f6e616c6c79207472616e7366657272696e6720736f6d652062616c616e63652e204372656174696f6e20697320657865637574656420617320666f6c6c6f77733a202d207468652064657374696e6174696f6e206164647265737320697320636f6d7075746564206261736564206f6e207468652073656e64657220616e642068617368206f662074686520636f64652e202d2074686520736d6172742d636f6e7472616374206163636f756e7420697320637265617465642061742074686520636f6d707574656420616464726573732e202d20746865206063746f725f636f64656020697320657865637574656420696e2074686520636f6e74657874206f6620746865206e65776c792063726561746564206163636f756e742e204275666665722072657475726e656420202061667465722074686520657865637574696f6e206973207361766564206173207468652060636f646560206f6620746865206163636f756e742e205468617420636f64652077696c6c20626520696e766f6b656420202075706f6e20616e792063616c6c2072656365697665642062792074686973206163636f756e742e202d2054686520636f6e747261637420697320696e697469616c697a65642e656e646f776d656e74436f6d706163743c42616c616e63654f663c543e3e6761735f6c696d6974436f6d706163743c543a3a4761733e636f64655f68617368436f6465486173683c543e64617461204d616b657320612063616c6c20746f20616e206163636f756e742c206f7074696f6e616c6c79207472616e7366657272696e6720736f6d652062616c616e63652e202a20496620746865206163636f756e74206973206120736d6172742d636f6e7472616374206163636f756e742c20746865206173736f63696174656420636f64652077696c6c20626520657865637574656420616e6420616e792076616c75652077696c6c206265207472616e736665727265642e202a20496620746865206163636f756e74206973206120726567756c6172206163636f756e742c20616e792076616c75652077696c6c206265207472616e736665727265642e202a204966206e6f206163636f756e742065786973747320616e64207468652063616c6c2076616c7565206973206e6f74206c657373207468616e20606578697374656e7469616c5f6465706f736974602c206120726567756c6172206163636f756e742077696c6c206265206372656174656420616e6420616e792076616c75652077696c6c206265207472616e736665727265642e646573743c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f7572636576616c75652053746f7265732074686520676976656e2062696e617279205761736d20636f646520696e746f2074686520636861696e732073746f7261676520616e642072657475726e73206974732060636f646568617368602e20596f752063616e20696e7374616e746961746520636f6e747261637473206f6e6c7920776974682073746f72656420636f64652e636f6465205570646174657320746865207363686564756c6520666f72206d65746572696e6720636f6e7472616374732e20546865207363686564756c65206d7573742068617665206120677265617465722076657273696f6e207468616e207468652073746f726564207363686564756c652e7363686564756c655363686564756c653c543a3a4761733e5472616e7366657246656542616c616e63654f663c543e4372656174696f6e4665655472616e73616374696f6e426173654665655472616e73616374696f6e42797465466565436f6e747261637446656543616c6c42617365466565543a3a4761734372656174654261736546656547617350726963654d61784465707468426c6f636b4761734c696d69744761735370656e7443757272656e745363686564756c65436f6465486173684f66543a3a4163636f756e7449645072697374696e65436f6465436f646553746f726167657761736d3a3a5072656661625761736d4d6f64756c654163636f756e74436f756e7465727536344163636f756e74496e666f4f664163636f756e74496e666f20546865207375627472696520636f756e7465722041206d617070696e67206265747765656e20616e206f726967696e616c20636f6465206861736820616e6420696e737472756d656e746564207761736d20636f64652c20726561647920666f722074686520657865637574696f6e2e2041206d617070696e672066726f6d20616e206f726967696e616c20636f6465206861736820746f20746865206f726967696e616c20636f64652c20756e746f756368656420627920696e737472756d656e746174696f6e2e2054686520636f6465206173736f6369617465642077697468206120676976656e206163636f756e742e2043757272656e7420636f7374207363686564756c6520666f7220636f6e7472616374732e20476173207370656e7420736f2066617220696e207468697320626c6f636b2e20546865206d6178696d756d20616d6f756e74206f6620676173207468617420636f756c6420626520657870656e6465642070657220626c6f636b2e20546865206d6178696d756d206e657374696e67206c6576656c206f6620612063616c6c2f63726561746520737461636b2e20546865207072696365206f66206f6e6520756e6974206f66206761732e20546865206261736520666565206368617267656420666f72206372656174696e67206120636f6e74726163742e20546865206261736520666565206368617267656420666f722063616c6c696e6720696e746f206120636f6e74726163742e205468652066656520726571756972656420746f20637265617465206120636f6e747261637420696e7374616e63652e205468652066656520746f206265207061696420666f72206d616b696e672061207472616e73616374696f6e3b20746865207065722d6279746520706f7274696f6e2e205468652066656520746f206265207061696420666f72206d616b696e672061207472616e73616374696f6e3b2074686520626173652e205468652066656520726571756972656420746f2063726561746520616e206163636f756e742e205468652066656520726571756972656420746f206d616b652061207472616e736665722e7375627374726174652d6e6f6465df6acb689907609b0200000037e397fc7c91f5e40100000040fe3ad401f8959a03000000d2bc9897eed08f1501000000f78b278be53f454c01000000ed99c5acb25eedf502000000dd718d5cc53262d4010000007801759919ee83e501000000446570726563617465642c20706c65617365207573652060417574686f726974696573417069602e2f55736572732f612f7372632f737562737472617465322f6e6f64652f72756e74696d652f7372632f6c69622e72734469676573744974656d206e6f7420657175616c2f55736572732f612f7372632f737562737472617465322f73726d6c2f636f6e74726163742f7372632f6c69622e7273436f6e74726163742043757272656e745363686564756c656e6577207363686564756c65206d7573742068617665206120677265617465722076657273696f6e207468616e2063757272656e74436f6e7472616374204d61784465707468436f6e747261637420436f6e7472616374466565436f6e7472616374204372656174696f6e466565436f6e7472616374205472616e73666572466565436f6e74726163742043616c6c42617365466565436f6e747261637420437265617465426173654665656e6f7420616c6c6f77656420746f206661696c20696e2072756e74696d652f55736572732f612f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f7061726974792d636f6465632d332e322e302f7372632f636f6465632e7273626164206f726967696e3a20657870656374656420746f2062652061207468726573686f6c64206e756d626572206f6620636f756e63696c206d656d6265727350726f706f736564566f746564417070726f766564446973617070726f76656445786563757465642041206d6f74696f6e207761732065786563757465643b2060626f6f6c6020697320747275652069662072657475726e656420776974686f7574206572726f722e48617368626f6f6c2041206d6f74696f6e20776173206e6f7420617070726f76656420627920746865207265717569726564207468726573686f6c642e2041206d6f74696f6e2077617320617070726f76656420627920746865207265717569726564207468726573686f6c642e2041206d6f74696f6e2028676976656e20686173682920686173206265656e20766f746564206f6e20627920676976656e206163636f756e742c206c656176696e6720612074616c6c79202879657320766f74657320616e64206e6f20766f74657320676976656e206173207533327320726573706563746976656c79292e4163636f756e7449647533322041206d6f74696f6e2028676976656e20686173682920686173206265656e2070726f706f7365642028627920676976656e206163636f756e742920776974682061207468726573686f6c642028676976656e20753332292e50726f706f73616c496e64657800000000000000617474656d707420746f20646976696465206279207a65726f000000000000002f72757374632f653334323864623763326231656562333530393665306266333736373233393739373766663033302f7372632f6c6962636f72652f6f70732f61726974682e727300000000000000002f72757374632f653334323864623763326231656562333530393665306266333736373233393739373766663033302f7372632f6c6962636f72652f736c6963652f6d6f642e72732f55736572732f612f7372632f737562737472617465322f73726d6c2f636f756e63696c2f7372632f6d6f74696f6e732e727370726f706f7365766f746570726f706f73616c543a3a48617368696e646578436f6d706163743c50726f706f73616c496e6465783e617070726f76657468726573686f6c64436f6d706163743c7533323e426f783c3c542061732054726169743e3a3a50726f706f73616c3e436f756e63696c4d6f74696f6e7350726f706f73616c735665633c543a3a486173683e50726f706f73616c4f663c542061732054726169743e3a3a50726f706f73616c566f74696e672850726f706f73616c496e6465782c207533322c205665633c543a3a4163636f756e7449643e2c205665633c543a3a4163636f756e7449643e2950726f706f73616c436f756e742050726f706f73616c7320736f206661722e20566f74657320666f72206120676976656e2070726f706f73616c3a202872657175697265645f7965735f766f7465732c207965735f766f746572732c206e6f5f766f74657273292e2041637475616c2070726f706f73616c20666f72206120676976656e20686173682c20696620697427732063757272656e742e205468652028686173686573206f662920746865206163746976652070726f706f73616c732e00000000002f55736572732f612f7372632f737562737472617465322f73726d6c2f7374616b696e672f7372632f70687261676d656e2e727370726576696f75732f6e657874206f6e6c7920636f6e7461696e206578697374696e6720656e74697265733b20776520656e756d6572617465207573696e67206e6578743b20656e747279206578697374733b20716564436f756e63696c4d6f74696f6e732050726f706f73616c4f666475706c69636174652070726f706f73616c73206e6f7420616c6c6f77656470726f706f736572206e6f74206f6e20636f756e63696c436f756e63696c4d6f74696f6e732050726f706f73616c436f756e74436f756e63696c4d6f74696f6e732050726f706f73616c73436f756e63696c4d6f74696f6e7320566f74696e67766f746572206e6f74206f6e20636f756e63696c70726f706f73616c206d7573742065786973746d69736d61746368656420696e6465786475706c696361746520766f74652069676e6f726564696e7465726e616c206572726f723a20656e746572656420756e726561636861626c6520636f64653a205f5f5068616e746f6d4974656d2073686f756c64206e6576657220626520757365642e6578745f7365745f73746f726167656578745f6765745f73746f726167656578745f63616c6c6578745f6372656174656578745f72657475726e6578745f63616c6c65726578745f616464726573736578745f6761735f70726963656578745f6761735f6c6566746578745f62616c616e63656578745f76616c75655f7472616e736665727265646578745f72616e646f6d5f736565646578745f6e6f776578745f64697370617463685f63616c6c6578745f696e7075745f73697a656578745f696e7075745f636f70796578745f736372617463685f73697a656578745f736372617463685f636f70796578745f6465706f7369745f6576656e7466756e635f737461636b5f636f7374732069736e27742079657420636f6d70757465643b0a0909090944696420796f752063616c6c2060636f6d707574655f737461636b5f636f737473603f546869732073686f756c64206265206120696e646578206f66206120646566696e65642066756e6374696f6e44756520746f2076616c69646174696f6e20636f64652073656374696f6e2073686f756c642065786973747346756e6374696f6e20626f6479206973206f7574206f6620626f756e647343616c6c20746f2066756e6374696f6e2074686174206f75742d6f662d626f756e64733a202f55736572732f612f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f707761736d2d7574696c732d302e362e322f7372632f737461636b5f6865696768742f6d6f642e727366756e6374696f6e20696d706f727420636f756e74206973206e6f74207a65726f3b20696d706f72742073656374696f6e206d757374206578697374733b2071656466756e635f696478206973206c657373207468616e2066756e6374696f6e20696d706f72747320636f756e743b0a090909096e74682066756e6374696f6e20696d706f7274206d7573742062652060536f6d65603b0a090909097165645369676e61747572652020287370656369666965642062792066756e6320292069736e277420646566696e656446756e6374696f6e20617420696e64657820206973206e6f7420646566696e6564656e7667617300000000000000000000002f55736572732f612f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f707761736d2d7574696c732d302e362e322f7372632f6761732e72737372632f6c6962616c6c6f632f7665632e7273617373657274696f6e206661696c65643a20656e64203c3d206c656e617373657274696f6e206661696c65643a20696e646578203c3d206c656e6066756e635f696478602073686f756c6420636f6d652066726f6d20606e6565645f7468756e6b73603b0a09090909606e6565645f7468756e6b736020697320706f70756c617465642077697468207468652073616d65206974656d73207468617420696e20607265706c6163656d656e745f6d6170603b0a090909097165644174207468697320706f696e7420616e20696e646578206d7573742062652061737369676e656420746f2065616368207468756e6b66756e6374696f6e207769746820696478202069736e277420666f756e644e6f2066756e6374696f6e2073656374696f6e4e6f20636f64652073656374696f6e4e6f20747970652073656374696f6e46756e6374696f6e206973206e6f7420666f756e6420696e2066756e632073656374696f6e46756e6374696f6e20626f647920666f722074686520696e6465782069736e277420666f756e64737461636b206d757374206265206e6f6e2d656d707479737461636b206f766572666c6f774172697479206f6620616c6c206a756d702d74617267657473206d75737420626520657175616c54797065206e6f7420666f756e64000000002f55736572732f612f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f707761736d2d7574696c732d302e362e322f7372632f737461636b5f6865696768742f6d61785f6865696768742e7273747279696e6720746f20706f70206d6f72652076616c756573207468616e20707573686564737461636b20756e646572666c6f77636f6e74726f6c20737461636b20697320656d707479636f6e74726f6c20737461636b206f75742d6f662d626f756e647300002f72757374632f653334323864623763326231656562333530393665306266333736373233393739373766663033302f7372632f6c6962636f72652f736c6963652f6d6f642e7273547261696c696e6744617461556e6578706563746564456f66496e76616c696444617461492f4f204572726f723a20696e7465726e616c206572726f723a20656e746572656420756e726561636861626c6520636f64652f55736572732f612f7372632f737562737472617465322f636f72652f73722d73616e64626f782f7372632f2e2e2f776974686f75745f7374642e727361757261736c6f74436f756c64206e6f74206465636f64652072657175657374656420696e686572656e742074797065214175726120696e686572656e742064617461206e6f7420666f756e644578706c69636974207265706f7274696e67206e6f7420616c6c6f77656474696d7374617030496e76616c69642074696d657374616d7020696e686572656e74206461746120656e636f64696e672e54696d657374616d7020696e686572656e742064617461206973206e6f742070726f76696465642e45787472696e7369635375636365737345787472696e7369634661696c656420416e2065787472696e736963206661696c65642e20416e2065787472696e73696320636f6d706c65746564207375636365737366756c6c792e48617368206e6f7420657175616c000000000000000000617474656d707420746f20646976696465206279207a65726f000000000000002f55736572732f612f7372632f737562737472617465322f636f72652f73722d7072696d6974697665732f7372632f6c69622e72730000000000000000000000617474656d707420746f20646976696465206279207a65726f000000000000002f55736572732f612f7372632f737562737472617465322f636f72652f73722d7072696d6974697665732f7372632f67656e657269632f6572612e727352756e74696d65206d656d6f7279206578686175737465642e2041626f7274696e67617373657274696f6e206661696c65643a2060286c656674203d3d20726967687429600a20206c6566743a2060602c0a2072696768743a2060603a206361706163697479206f766572666c6f777372632f6c6962616c6c6f632f7261775f7665632e72736120666f726d617474696e6720747261697420696d706c656d656e746174696f6e2072657475726e656420616e206572726f727372632f6c6962636f72652f726573756c742e727300000000002f72757374632f653334323864623763326231656562333530393665306266333736373233393739373766663033302f7372632f6c6962636f72652f666d742f6d6f642e7273010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002020202020202020202020202020202020202020202020202020202020203030303030303030303030303030303040404040400000000000000000000000000696e646578206f7574206f6620626f756e64733a20746865206c656e20697320206275742074686520696e6465782069732030303031303230333034303530363037303830393130313131323133313431353136313731383139323032313232323332343235323632373238323933303331333233333334333533363337333833393430343134323433343434353436343734383439353035313532353335343535353635373538353936303631363236333634363536363637363836393730373137323733373437353736373737383739383038313832383338343835383638373838383939303931393239333934393539363937393839397372632f6c6962636f72652f736c6963652f6d6f642e7273696e64657820206f7574206f662072616e676520666f7220736c696365206f66206c656e67746820736c69636520696e64657820737461727473206174202062757420656e6473206174206030785b2e2e2e5d7372632f6c6962636f72652f7374722f6d6f642e72736279746520696e64657820206973206e6f742061206368617220626f756e646172793b20697420697320696e7369646520202862797465732029206f66206000000000000000000000000000007372632f6c6962636f72652f666d742f6d6f642e72732e2e00010305050606030706080809110a1c0b190c140d120e160f0410031212130916011705180219031a071c021d011f1620032b062c022d0b2e01300331023202a902aa04ab08fa02fb05fd04fe03ff09ad78798b8da23057588b8c901c1ddd0e0f4b4cfbfc2e2f3f5c5d5fb5e2848d8e9192a9b1babbc5c6c9cadee4e5ff00041112293134373a3b3d494a5d848e92a9b1b4babbc6cacecfe4e500040d0e11122931343a3b4546494a5e646584919b9dc9cecf0d112945495764658d91a9b4babbc5c9dfe4e5f0040d1145496465808184b2bcbebfd5d7f0f1838586898b8c98a0a4a6a8a9acbabebfc5c7cecfdadb4898bdcdc6cecf494e4f57595e5f898e8fb1b6b7bfc1c6c7d71116175b5cf6f7feff800d6d71dedf0e0f1f6e6f1c1d5f7d7eaeafbbbcfa16171e1f46474e4f585a5c5e7e7fb5c5d4d5dcf0f1f572738f74759697c9ff2f5f262e2fa7afb7bfc7cfd7df9a409798308f1fffceff4e4f5a5b07080f10272feeef6e6f373d3f42459091feff536775c8c9d0d1d8d9e7feff00205f2282df048244081b04061181ac0e80ab351e1580e003190801042f043404070301070607110a500f1207550802041c0a090308030703020303030c0405030b06010e15053a0311070605100856070207150d500443032d03010411060f0c3a041d250d064c206d046a2580c80582b0031a0682fd035907150b1709140c140c6a060a061a0659072b05460a2c040c040103310b2c041a060b0380ac060a061f414c042d0374083c030f033c0738082a0682ff1118082f112d032010210f808c048297190b158894052f053b07020e180980af31740c80d61a0c0580ff0580b605240c9bc60ad23010848d033709815c1480b80880ba3d35040a06380846080c06740b1e035a0459098083181c0a1609460a808a06aba40c170431a10481da26070c050580a511816d1078282a064c04808d0480be031b030f0d0006010103010402080809020a050b0210011104120513111402150217021a021c051d0824016a036b02bc02d102d40cd509d602d702da01e005e802ee20f004f9040c273b3e4e4f8f9e9e9f060709363d3e56f3d0d104141836375657bd35cecfe01287898e9e040d0e11122931343a4546494a4e4f64655a5cb6b71b1c848509379091a8070a3b3e66698f926f5feeef5a629a9b2728559da0a1a3a4a7a8adbabcc4060b0c151d3a3f4551a6a7cccda007191a2225c5c604202325262833383a484a4c50535556585a5c5e606365666b73787d7f8aa4aaafb0c0d03f71727b5e227b0503042d036504012f2e80821d03310f1c0424091e052b0544040e2a80aa06240424042808340b018090813709160a088098390363080930160521031b05014038044b052f040a070907402027040c0936033a051a07040c07504937330d33072e080a81261f808128082a80a64e041e0f430e19070a0647092709750b3f412a063b050a0651060105100305808b5f2148080a80a65e22450b0a060d1338080a362c041080c03c64530c0181004808531d398107460a1d03474937030e080a0639070a8136198107839a66750b80c48abc842f8fd18247a1b98239072a040260260a460a28051382b05b65450b2f101140021e97f20e82f3a50d811f51818c89046b050d03090710936080f60a73086e1746809a140c570919808781470385420f1585502b87d580d7294b050a0402831144814b3c06010455051b3402810e2c04640c560a0d035c043d391d0d2c040907020e06809a83d50b0d030a06740c59270c0438080a0628081e520c046703290d0a06030d30600e85927372632f6c6962636f72652f756e69636f64652f626f6f6c5f747269652e72730000c0fbef3e00000000000e0000000000000000000000000000f8fffbffffff0700000000000014fe21fe000c00000002000000000000501e2080000c00004006000000000000108639020000002300be2100000c0000fc02000000000000d01e20c0000c0000000400000000000040012080000000000011000000000000c0c13d60000c0000000200000000000090443060000c00000003000000000000581e2080000c00000000845c8000000000000000000000f207807f000000000000000000000000f21b003f000000000000000000030000a002000000000000fe7fdfe0fffeffffff1f40000000000000000000000000e0fd66000000c301001e006420002000000000000000e00000000000001c0000001c0000000c0000000c00000000000000b03f40fe0f200000000000380000000000006000000000020000000000008701040e00008009000000000000407fe51ff89f000000000000ff7f0f0000000000d0170400000000f80f00030000003c3b00000000000040a303000000000000f0cf000000f7fffd211003fffffffffffffffb00100000000000000000ffffffff01000000000000800300000000000000008000000000ffffffff0000000000fc00000000000600000000000000000080f73f000000c0000000000000000000000300440800006000000030000000ffff038000000000c03f000080ff030000000000070000000000c813000000002000000000000000007e660008100000000000100000000000009dc1020000000030400000000000202100000000004000000000ffff0000ffff00000000000000000001000000020003000000000000000000000000000000000000000000000000000004000005000000000000000006000000000000000007000008090a000b0c0d0e0f000010111200001314151600001718191a1b001c0000001d000000000000001e1f20000000000021002200232425000000002600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000027280000000000000000000000000000000000290000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000002b2c00002d0000000000000000000000000000000000000000000000000000000000002e2f300000000000000000000000000000000000000000003100000000000000000000000000000000000000000000000000000000000000000000320033000000000000000000000000000000000000000000000000000034350000353535360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000001000000000000000000c0076ef0000000000087000000006000000000000000f0000000c0ff01000000000002000000000000ff7f0000000000008003000000000078060700000080ef1f000000000000000800030000000000c07f001e000000000000000000000080d34000000080f8070000030000000000005801008000c01f1f0000000000000000ff5c00004000000000000000000000f9a50d000000000000000000000000803cb00100003000000000000000000000f8a70100000000000000000000000028bf00000000e0bc0f0000000000000080ff06fe0700000000f87980007e0e0000000000fc7f03000000000000000000007fbf0000fcfffffc6d000000000000007eb4bf000000000000000000a3000000000000000000000018000000000000001f000000000000007f000080070000000000000000600000000000000000a0c307f8e70f0000003c00001c00000000000000ffffffffffff7ff8ffffffffff1f2000100000f8feff00007ffffff9db07000000007f0000000000f00700000000000000000000ffffffffffffffffffffffffffffffffffff000063616c6c656420604f7074696f6e3a3a756e77726170282960206f6e206120604e6f6e65602076616c75657372632f6c6962636f72652f6f7074696f6e2e7273626567696e203c3d20656e642028203c3d2029207768656e20736c6963696e672060206973206f7574206f6620626f756e6473206f662060426f72726f774572726f72426f72726f774d75744572726f723a20204572726f720041b8cfc2000bb8f10115001000240000004c98100017000000400200000900000039001000340000006d0010003100000097000000030000002600000000000000010000002700000028000000290000002a0000002b00000018000000040000002c0000002d0000002e0000002f000000ae0410007c0000002a051000350000007a00000006000000ac05100031000000dd0510003800000079000000040000001506100023000000dd051000380000007a00000004000000879510002800000038061000310000001a010000010000007006100048000000eb0900000a000000c006100019000000e00610002c000000ed0000001e0000009f07100022000000c10710002c000000b300000003000000ed07100028000000c10710002c000000b90000000300000000000000394b1000120000000000000014dc10000100000000000000000000002cdc1000010000000000000000000000320810000c000000000000000caa100001000000000000000000000024aa10000100000000000000000000003e08100006000000000000002caa100001000000000000000000000044aa1000010000000000000000000000440810000e000000000000004caa100001000000000000000000000064aa10000100000000000000000000005208100008000000000000006caa100001000000000000000000000084aa10000100000000000000000000005a0810000b000000000000008caa1000010000000000000000000000a4aa1000010000000000000000000000650810000c00000000000000acaa1000010000000000000000000000c4aa10000100000000000000000000009409100007000000000000009b0910003d000000400910005400000000000000390910000700000000000000137b1000070000001e0910001b00000000000000190910000500000000000000c882100003000000da0810003f00000000000000e56410000300000000000000137b100007000000c80810001200000000000000b60810000500000000000000bb0810000d0000009b0810001b000000000000008f08100004000000000000009308100008000000710810001e00000000000000e1091000130000000000000000000000f40910001200000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100030ab10000000000000000000f899100000000000000000000000000026000000000000000100000030000000970c10001c0000002e0a1000310000006900000003000000730c1000240000002e0a1000310000007100000003000000210c1000380000002e0a100031000000ae0000002a000000f90b1000280000002e0a100031000000af00000032000000d10b1000280000002e0a100031000000b10000002c000000a50b10002c0000002e0a100031000000b00000004c000000860a1000320000002e0a100031000000e5000000030000005f0a1000270000002e0a100031000000ed00000004000000060a1000280000002e0a100031000000f300000003000000620b100043000000dd05100038000000b20000000400000000000000b30c10000a000000000000005cac100001000000000000000000000074ac1000020000000000000000000000150d100004000000000000003a65100017000000bd0c10003d000000fa0c10001b00000038061000310000001a010000010000000000000081881000080000000000000020ae1000020000000000000000000000f8991000000000000000000000000000280d1000060000000000000030ae1000030000000000000000000000f89910000000000000000000000000002e0d1000070000000000000048ae1000020000000000000000000000f8991000000000000000000000000000350d1000060000000000000058ae1000010000000000000000000000f89910000000000000000000000000003b0d1000090000000000000058ae1000010000000000000000000000f8991000000000000000000000000000440d1000090000000000000058ae1000010000000000000000000000f8991000000000000000000000000000a1881000080000000000000060ae1000020000000000000000000000f89910000000000000000000000000004d0d1000090000000000000078071100020000000000000000000000f8991000000000000000000000000000560d10000b000000000000001cd71000010000000000000000000000f899100000000000000000007d0d1000090000006f7c1000070000007d0d1000090000006f7c100007000000112c10000e000000610d10000f000000700d10000d000000610d10000f000000610d10000f000000ee88100004000000500f100039000000900f100048000000100200002d000000000f100048000000f10900000e000000000000003b8b10000700000000000000a8b01000020000000000000000000000d8b01000010000000000000000000000d80f10000600000000000000e0b01000010000000000000000000000d8b01000010000000000000000000000428b10000400000000000000f8b0100002000000000000000000000028b11000020000000000000000000000de0f10000a00000000000000f8b0100002000000000000000000000038b11000020000000000000000000000e80f1000100000000000000048b1100003000000000000000000000090b11000010000000000000000000000f80f1000110000000000000098b11000010000000000000000000000b0b11000010000000000000000000000091010000d00000000000000b8b11000020000000000000000000000e8b11000010000000000000000000000161010000900000000000000f0b1100001000000000000000000000008b210000100000000000000000000001f1010000c00000000000000f899100000000000000000000000000010b210000100000000000000000000002b1010000c00000000000000f0b1100001000000000000000000000018b2100001000000000000000000000037101000080000000000000020b2100002000000000000000000000050b210000100000000000000000000003f1010000a00000000000000f899100000000000000000000000000058b21000010000000000000000000000468b10000800000000000000f44910001000000000000000b88010000500000000000000b77e1000150000006d1210002800000000000000468b100008000000000000005b12100012000000000000003f1110000900000000000000481110001800000000000000428b1000040000000000000057121000040000000a1210004d000000db1110002f0000007911100062000000db1110002f00000000000000468b10000800000000000000f44910001000000000000000778b10000900000000000000700d10000d00000000000000741110000500000000000000f96c10000e0000006011100014000000000000003f111000090000000000000048111000180000002a11100015000000000000002111100004000000000000003a6510001700000000000000251110000500000000000000808b10000c000000f91010002800000000000000f41010000500000000000000818210000c000000ce10100026000000a810100026000000821010002600000000000000691010000200000000000000818210000c000000000000006b1010000c00000000000000771010000b0000005a1010000f0000004910100011000000000000009e1210000f00000000000000000000007d0d10000900000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100020b910000000000000000000a0b8100001000000000000000100000000000000ad1210000b0000000000000000000000b81210002b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100058b910000000000000000000a8b8100001000000000000000100000000000000e31210000900000001000000000000007d0d10000900000000000000ec1210002100000000000000000000000000000000000000000000000000000000000000f8991000b0b810000000000000000000c0b81000010000000000000000000000000000000d1310000c0000000000000000000000f96c10000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100008b910000000000000000000c8b8100001000000000000000100000000000000191310000e0000000000000000000000df8110000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000d0b810000000000000000000e0b8100001000000000000000100000000000000271310000b0000000000000000000000f96c10000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000e8b810000000000000000000f8b8100001000000000000000100000000000000321310000e0000000000000000000000771010000b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100070b91000000000000000000000b91000010000000000000001000000000000001e4a10000c0000000000000000000000f96c10000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100008b91000000000000000000080d3100001000000000000000100000000000000401310000f0000000000000000000000610d10000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100020b91000000000000000000018b91000010000000000000001000000000000004f131000090000000000000000000000610d10000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100020b91000000000000000000030b910000100000000000000010000000000000058131000100000000100000000000000610d10000f00000000000000681310002d00000000000000000000000000000000000000000000000000000000000000f899100098b91000000000000000000038b9100001000000000000000000000000000000951310000d0000000100000000000000f96c10000e00000000000000a21310002b00000000000000000000000000000000000000000000000000000000000000f899100040b91000000000000000000050b9100001000000000000000100000000000000cd131000090000000100000000000000610d10000f00000000000000eb6310001100000000000000000000000000000000000000000000000000000000000000f899100058b91000000000000000000068b9100001000000000000000100000000000000d6131000060000000100000000000000dc1310001f00000000000000571210000400000000000000000000000000000000000000000000000000000000000000f899100070b91000000000000000000080b9100003000000000000000100000000000000fb131000050000000100000000000000818210000c00000000000000818210000c00000000000000000000000000000000000000000000000000000000000000f899100098b910000000000000000000a8b9100001000000000000000000000000000000001410000b0000000101000000000000818210000c000000000000000b1410001b00000000000000000000000000000000000000000000000000000000000000f8991000b0b910000000000000000000c0b910000100000000000000010000009b1810003d0000007b18100020000000260000000000000001000000310000005a18100021000000211810003900000026000000000000000100000032000000d41710004d000000260000000000000001000000330000009f17100035000000291710007600000026000000000000000100000034000000db1610004e00000026000000000000000100000035000000a9161000320000007c1610002d000000260000000000000001000000360000004c1610003000000026000000000000000100000036000000231610002900000026000000000000000100000030000000e4141000750000005915100072000000cb1510005800000026000000000000000100000030000000761410006e0000002600000000000000010000003700000026141000500000008795100028000000d8181000310000005300000001000000d8181000310000005300000001000000ab1a10001e000000c91a10002e000000ad0100000300000000000000381b10000a0000000000000044ef10000200000000000000000000008cba1000010000000000000000000000421b10000d000000000000001cd7100001000000000000000000000094ba1000010000000000000000000000b17a100008000000000000009cba1000040000000000000000000000bcba10000100000000000000921b10001b0000007b1b100017000000d789100009000000d7891000090000006f7c1000070000006f7c1000070000004f1b10002c0000008795100028000000af9510003d000000370100000900000000000000f51d10000c0000000100000000000000818210000c00000000000000011e10000800000000000000000000000000000000000000000000000000000000000000f899100068bf1000000000000000000028bf100001000000000000000100000000000000091e10000e0000000000000000000000e08910000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100018c51000000000000000000030bf100001000000000000000000000000000000171e1000100000000000000000000000e08910000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100018c51000000000000000000038bf100001000000000000000000000000000000271e1000090000000100000000000000f96c10000e000000000000004e8b10000700000000000000000000000000000000000000000000000000000000000000f899100088bf1000000000000000000040bf100001000000000000000100000000000000301e10000d0000000100000000000000e08910000300000000000000137b10000700000000000000000000000000000000000000000000000000000000000000f899100048bf1000000000000000000058bf1000010000000000000001000000000000003d1e10000a00000000000000000000004e8b10000700000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100088bf1000000000000000000060bf100001000000000000000100000000000000471e1000060000000000000000000000f96c10000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100068bf1000000000000000000078bf1000010000000000000001000000000000004d1e10000a00000000000000000000004e8b10000700000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100088bf1000000000000000000080bf100001000000000000000100000000000000571e10000e00000000000000000000004e8b10000700000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100088bf1000000000000000000098bf100001000000000000000100000000000000651e10000600000000000000000000006b1e10000900000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000a0bf10000000000000000000b0bf100001000000000000000100000000000000741e10000600000000000000000000007a1e10001a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000b8bf10000000000000000000c8bf1000010000000000000001000000ab2010001f0000007d2010002e0000002f2010004e000000092010002600000026000000000000000100000036000000bd1f10004c0000009b1f10002200000026000000000000000100000033000000591f1000420000003d1f10001c00000026000000000000000100000038000000f81e10004500000026000000000000000100000036000000bc1e10003c00000026000000000000000100000036000000941e10002800000000000000ca201000080000000000000028c0100002000000000000000000000058c01000080000000000000000000000d22010000b0000000000000098c01000030000000000000000000000e0c01000080000000000000000000000918010000400000000000000958010002300000000000000b8801000050000000000000038221000130000005322100036000000f8991000000000008922100042000000cb221000480000001323100045000000582310002d000000f8991000000000008523100046000000000000001132100003000000000000009580100023000000000000003422100004000000000000003822100013000000000000004b22100008000000000000003822100013000000dd20100025000000f899100000000000022110004000000042211000460000008821100049000000d121100036000000f899100000000000072210002d00000000000000e32310000d0000000000000000000000f02310000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100088c51000000000000000000008c5100001000000000000000100000000000000fa231000120000000000000000000000f02310000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100088c51000000000000000000010c5100001000000000000000100000000000000d48110000b0000000000000000000000f02310000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100088c510000000000000000000ec10110001000000000000000100000000000000eb8110000b0000000000000000000000f02310000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100088c510000000000000000000f410110001000000000000000100000000000000f6811000120000000000000000000000f02310000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100088c510000000000000000000fc1011000100000000000000010000000000000008821000120000000000000000000000f02310000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100088c51000000000000000000014111100010000000000000001000000000000000c241000070000000100000000000000818210000c00000000000000132410001b00000000000000000000000000000000000000000000000000000000000000f899100018c51000000000000000000028c51000010000000000000000000000000000002e2410000b0000000100000000000000818210000c00000000000000f02310000a00000000000000000000000000000000000000000000000000000000000000f899100088c51000000000000000000030c510000b000000000000000100000000000000392410000f0000000100000000000000818210000c00000000000000f02310000a00000000000000000000000000000000000000000000000000000000000000f899100088c51000000000000000000098c510000b00000000000000010000000000000048241000050000000100000000000000818210000c000000000000004d2410002c00000000000000000000000000000000000000000000000000000000000000f8991000f0c51000000000000000000000c61000010000000000000001000000d729100026000000a229100035000000260000000000000001000000300000006c29100036000000f226100027000000f8991000000000001927100050000000692710005d000000c6271000550000001b2810004f0000006a28100051000000bb28100015000000f899100000000000d028100057000000272910004500000026000000000000000100000032000000a72410005d0000000425100027000000f8991000000000002b2510005b0000008625100049000000f899100000000000cf2510005d0000002c2610002d000000f8991000000000005926100053000000ac2610004600000026000000000000000100000036000000792410002e0000008795100028000000692a1000300000006901000001000000692a100030000000690100000100000000000000822b10000b0000000000000078071100020000000000000000000000e0c610000100000000000000000000008d2b100010000000000000001cd71000010000000000000000000000e8c610000100000000000000000000009d2b10000c0000000000000098071100010000000000000000000000f0c61000010000000000000000000000a92b10000e00000000000000f8c6100002000000000000000000000008c7100001000000000000006b2c1000150000005c2c10000f0000001f2c10003d000000112c10000e000000112c10000e000000b72b10005a0000008795100028000000902c1000390000005c00000008000000002d100019000000202d100048000000bb0100002d00000000000000d92f10000d00000000000000f8c8100002000000000000000000000028c91000020000000000000000000000e62f10001300000000000000f8c8100002000000000000000000000038c91000020000000000000000000000f92f1000130000000000000048c91000040000000000000000000000a8c910000500000000000000000000000c3010000d00000000000000d0c91000010000000000000000000000e8c91000010000000000000000000000193010001000000000000000f0c9100001000000000000000000000008ca1000030000000000000000000000293010000e0000000000000020ca100003000000000000000000000068ca100003000000000000000000000037301000110000000000000080ca100001000000000000000000000098ca1000030000000000000000000000483010000d00000000000000b0ca1000010000000000000000000000c8ca1000030000000000000000000000553010001900000000000000e0ca1000010000000000000000000000f8ca10000200000000000000000000006e3010001100000000000000e0ca100001000000000000000000000008cb10000200000000000000000000009736100005000000000000009c3610000900000000000000558b10000500000000000000c2331000120000003f361000580000002f36100010000000ca351000650000002f3610001000000000000000a13510000e00000000000000808b10000c00000000000000113210000300000000000000958010002300000000000000af3510000900000000000000808b10000c00000000000000b83510001200000000000000c2331000120000008534100058000000dd3410005c0000003935100028000000f899100000000000613510004000000000000000558b10000500000000000000808b10000c0000003a3410004b00000000000000363410000400000000000000808b10000c000000d43310001e000000f899100000000000f23310004400000000000000b43310000900000000000000958010002300000000000000bd3310000500000000000000b77e10001500000000000000558b10000500000000000000c233100012000000d4321000590000002d33100069000000963310001e00000000000000413110000500000000000000808b10000c00000014321000590000006d3210005a000000c73210000d000000000000001132100003000000000000009580100023000000463110005c000000a231100050000000f23110001f000000000000004131100005000000000000003a65100017000000eb30100056000000d3301000180000007f30100054000000d33010001800000000000000ac3610000d0000000000000000000000df8110000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000e8d210000000000000000000f8d2100001000000000000000100000000000000b93610000a0000000000000000000000df8110000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100000d31000000000000000000010d3100001000000000000000100000000000000c3361000140000000000000000000000df8110000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100018d31000000000000000000028d3100001000000000000000100000000000000d73610000a0000000000000000000000e08910000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100030d31000000000000000000040d3100001000000000000000100000000000000e1361000140000000000000000000000f96c10000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100070d31000000000000000000048d3100001000000000000000100000000000000f5361000130000000000000000000000083710000900000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100050d31000000000000000000060d31000020000000000000001000000000000001e4a10000c0000000000000000000000f96c10000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100070d31000000000000000000080d3100001000000000000000100000000000000113710000c0000000000000000000000f96c10000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100088d31000000000000000000098d31000010000000000000001000000000000001d3710000c0000000000000000000000e08910000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100018d410000000000000000000a0d3100001000000000000000100000000000000293710000d0000000000000000000000363710002300000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100040d410000000000000000000a8d310000400000000000000010000000000000059371000090000000000000000000000083710000900000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100018d410000000000000000000c8d3100001000000000000000100000000000000623710000b0000000100000000000000818210000c000000000000009c3610000900000000000000000000000000000000000000000000000000000000000000f899100040d410000000000000000000d0d31000020000000000000001000000000000006d3710000e0000000100000000000000818210000c000000000000007b3710001000000000000000000000000000000000000000000000000000000000000000f8991000f0d310000000000000000000e0d31000020000000000000000000000000000008b3710000c0000000100000000000000818210000c00000000000000083710000900000000000000000000000000000000000000000000000000000000000000f8991000f0d31000000000000000000000d410000100000000000000000000000000000097371000060000000000000000000000eb6310001100000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100040d41000000000000000000008d41000010000000000000001000000000000009d3710000a0000000000000000000000eb6310001100000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100040d41000000000000000000010d4100001000000000000000100000000000000a73710000e0000000000000000000000e08910000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100018d410000000000000000000f899100000000000000000000100000000000000b53710000c0000000000000000000000c13710002800000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100028d41000000000000000000038d4100001000000000000000000000000000000e9371000100000000000000000000000f93710001100000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100040d41000000000000000000050d41000010000000000000001000000000000000a3810000b0000000000000000000000153810002100000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100058d41000000000000000000068d4100001000000000000000000000026000000000000000100000039000000dd3d100041000000260000000000000001000000320000009b3d1000420000002600000000000000010000003a000000583d1000430000002600000000000000010000003b0000000b3d10004d000000bc3c10004f0000002600000000000000010000003c000000403c100068000000a83c10001400000026000000000000000100000034000000123c10002e0000002600000000000000010000003d000000ec3b100026000000b23b10003a000000853a10005b000000e03a10005c0000003c3b10005c000000983b10001a000000443a100041000000d93910005b000000343a100010000000643910005f000000c3391000160000002600000000000000010000003000000024391000400000000c39100018000000f03810001c0000002600000000000000010000003500000026000000000000000100000031000000a838100048000000260000000000000001000000360000006e3810003a000000260000000000000001000000310000003638100038000000b03f100039000000202d100048000000100200002d000000603f100048000000eb0900000a000000603f100048000000f10900000e0000008795100028000000e93f100031000000ab00000001000000e93f100031000000ab00000001000000004510000d000000e54410001b000000948610002f000000f1000000010000000d451000100000001d4510000f0000002c451000130000003f4510000f0000004e45100014000000624510000f000000714510001600000087451000150000009c4510001d00000045921000130000009603000009000000c045100043000000860a000025000000c0451000430000008c0a00002c00000000000000164610001000000000000000c0d51000040000000000000000000000e0d51000020000000000000000000000264610000f00000000000000c0d51000040000000000000000000000f0d510000200000000000000ea88100004000000e089100003000000e089100003000000e089100003000000904610004000000068461000280000003546100033000000684610002800000000000000d04610000e000000000000002cd6100001000000000000000000000034d6100001000000000000000247100016000000de46100024000000294710002b0000005447100031000000f10000000400000085471000300000005447100031000000db00000004000000b54710004e0000005447100031000000dc000000040000008795100028000000574810002c0000008c000000010000008795100028000000d8481000320000003a00000001000000000000005749100005000000000000000cd7100001000000000000000000000014d710000100000000000000000000005c4910000a000000000000001cd7100001000000000000000000000024d710000100000000000000ee88100004000000a249100018000000d789100009000000664910003c000000000000003b8b1000070000000000000008d81000010000000000000000000000f8991000000000000000000000000000428b1000040000000000000020d81000020000000000000000000000f8991000000000000000000000000000ba491000040000000000000050d81000010000000000000000000000f8991000000000000000000000000000be491000120000000000000068d81000010000000000000000000000f8991000000000000000000000000000d0491000110000000000000068d81000010000000000000000000000f8991000000000000000000000000000468b10000800000000000000f44910001000000000000000468b100008000000000000004e8b10000700000000000000708b10000700000000000000ee8810000400000000000000e74910000d000000000000004e8b10000700000000000000e149100006000000000000003a6510001700000000000000114a10000d0000000000000000000000f96c10000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000a0db10000000000000000000f8991000000000000000000001000000000000001e4a10000c0000000000000000000000f96c10000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100040df10000000000000000000f8991000000000000000000001000000000000002a4a1000100000000000000000000000f96c10000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000b0db10000000000000000000c0db100001000000000000000100000000000000b58b10000900000000000000000000003a4a10001e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000c8db10000000000000000000f899100000000000000000000100000000000000ca8b10000a00000001000000000000004e8b10000700000000000000584a10000b00000000000000000000000000000000000000000000000000000000000000f899100028df10000000000000000000f899100000000000000000000000000000000000634a10000e00000001000000000000004e8b10000700000000000000eb6310001100000000000000000000000000000000000000000000000000000000000000f8991000c8db10000000000000000000f899100000000000000000000100000000000000714a10000d00000001000000000000007e4a10001700000000000000ee8810000400000000000000000000000000000000000000000000000000000000000000f899100028df10000000000000000000f899100000000000000000000000000000000000954a10000e00000001000000000000004e8b10000700000000000000a34a10002300000000000000000000000000000000000000000000000000000000000000f8991000d8db10000000000000000000f89910000000000000000000000000002600000000000000010000003400000026000000000000000100000033000000c64a100073000000260000000000000001000000360000002600000000000000010000003100000000000000394b1000120000000000000014dc10000100000000000000000000002cdc1000010000000000000000000000644b10000700000000000000137b1000070000004b4b10001900000000000000b14b10000d0000000000000000000000be4b10003200000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100028df10000000000000000000f899100000000000000000000000000000000000f04b10000a0000000000000000000000f96c10000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100028df10000000000000000000f899100000000000000000000000000000000000fa4b1000030000000000000028dd100001000000000000000000000040dd1000080000000000000000000000384d100003000000000000003b4d100012000000fd4b100016000000f899100000000000134c10005d000000704c10002f000000f8991000000000009f4c100063000000aba7100001000000024d10003600000000000000564d10000300000000000000000000008d5610000900000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100010df1000000000000000000020df100001000000000000000100000000000000594d10000b00000000000000000000008d5610000900000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100028df1000000000000000000038df100001000000000000000000000000000000644d10000d00000000000000000000008d5610000900000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100040df1000000000000000000050df100004000000000000000100000000000000714d1000090000000000000000000000ee8810000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100070df1000000000000000000080df100001000000000000000100000026000000000000000100000033000000214f10002400000026000000000000000100000030000000d04e1000510000002600000000000000010000003e000000a74d10005a000000014e10005a0000005b4e100059000000b44e10001c000000260000000000000001000000300000007a4d10002d0000009048100048000000eb0900000a000000574810002c0000008c00000001000000d8481000320000003a0000000100000000000000ad7a1000040000000000000008d8100001000000000000000000000010e010000300000000000000000000005d551000070000000000000028e0100001000000000000000000000040e010000300000000000000f35110004e000000f899100000000000bf5110003400000000000000e564100003000000000000009580100023000000625110005d000000f899100000000000bf511000340000000000000045521000030000000000000000000000818210000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000bce010000000000000000000cce010000100000000000000010000002600000000000000010000003f000000485210002100000000000000825210000a0000000000000000e1100001000000000000000000000008e110000200000000000000035310000b0000008c52100055000000e15210002200000000000000818810000800000000000000f4e11000010000000000000000000000fce110000100000000000000000000000e531000080000000000000014ef100001000000000000000000000004e210000100000000000000000000001653100007000000000000000ce2100003000000000000000000000024e210000100000000000000000000001d531000050000000000000014ef10000100000000000000000000002ce2100001000000000000000000000022531000080000000000000014ef100001000000000000000000000034e2100001000000000000003c8a10000d000000f35310000e000000b95310003a0000003c8a10000d0000006f7c100007000000d789100009000000995310002000000076531000230000002a5310004c0000008795100028000000945410002f0000003b000000010000008795100028000000c3541000300000003800000001000000f35410003300000026551000370000008300000005000000000000005d551000070000000000000008e3100001000000000000000000000020e31000020000000000000000000000645510000a0000000000000070f4100001000000000000000000000030e310000100000000000000000000006e5510001100000000000000b8f4100001000000000000000000000038e31000010000000000000000000000515610000300000000000000545610000d000000f0551000580000004856100009000000955510005b0000007f5510001600000000000000926d10000a0000000000000000000000eb6310001100000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100054ec1000000000000000000060e6100001000000000000000100000000000000685610000d0000000000000000000000f96c10000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100068e61000000000000000000078e6100001000000000000000100000000000000755610000c0000000000000000000000f96c10000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100088e61000000000000000000080e6100001000000000000000100000000000000815610000c00000000000000000000008d5610000900000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100088e61000000000000000000098e610000100000000000000010000000000000096561000110000000000000000000000ee8810000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000c0e610000000000000000000a0e6100002000000000000000000000000000000a7561000100000000000000000000000f96c10000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000c0e610000000000000000000b0e6100001000000000000000000000000000000b75610000a0000000100000000000000818210000c00000000000000545610000d00000000000000000000000000000000000000000000000000000000000000f8991000c0e610000000000000000000b8e6100001000000000000000000000000000000c1561000110000000000000000000000f96c10000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000c0e610000000000000000000d0e61000010000000000000000000000625810001f00000026000000000000000100000034000000435810001f000000255810001e00000026000000000000000100000033000000fd571000280000003f5710005e0000009d571000600000000f57100030000000eb5610002400000026000000000000000100000030000000d25610001900000000000000815810000d00000000000000b4e71000020000000000000000000000e4e710000300000000000000000000008e5810000700000000000000fce7100001000000000000000000000014e810000100000000000000000000009558100009000000000000001ce810000400000000000000000000007ce810000100000000000000000000009e5810000f0000000000000084e810000100000000000000000000009ce81000010000000000000000000000ad581000100000000000000084e81000010000000000000000000000a4e81000020000000000000000000000b88010000500000000000000b77e10001500000000000000c85a10000b0000000000000095801000230000001b5a10004b000000665a10004d000000b35a10001500000000000000145a10000700000000000000b77e100015000000e75910002d00000000000000a55910000d00000000000000b25910001000000000000000c25910001500000000000000b77e10001500000000000000d75910000c000000000000003a6510001700000000000000e35910000400000000000000b259100010000000895910001c000000000000007e5910000b000000000000005a8b1000160000003f5910003f000000bd58100057000000145910002b00000000000000db5a10000c0000000000000000000000e75a10000700000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100024ec10000000000000000000d4eb100002000000000000000100000000000000ee5a1000130000000000000000000000df8110000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f89910000cec10000000000000000000e4eb100001000000000000000100000000000000015b10000b0000000000000000000000f96c10000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000eceb10000000000000000000fceb1000010000000000000001000000000000000c5b1000040000000000000000000000e75a10000700000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100024ec1000000000000000000004ec100001000000000000000100000000000000105b1000030000000000000000000000df8110000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f89910000cec100000000000000000001cec1000010000000000000001000000000000002a8c10000d00000000000000000000003c8a10000d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100024ec1000000000000000000034ec100001000000000000000100000000000000b58b10000900000001000000000000003c8a10000d00000000000000135b10002400000000000000000000000000000000000000000000000000000000000000f89910003cec100000000000000000004cec100001000000000000000000000000000000375b1000090000000000000000000000405b10001200000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100054ec1000000000000000000064ec1000010000000000000001000000c35c100054000000175d100037000000715c100052000000260000000000000001000000400000004f5c1000220000000b5c10004400000026000000000000000100000032000000d85b10003300000026000000000000000100000035000000af5b10002900000026000000000000000100000030000000905b10001f00000026000000000000000100000036000000525b10003e000000a05d100039000000e05d100048000000100200002d000000945410002f0000003b00000001000000c354100030000000380000000100000000000000d55e10000f00000000000000d0ec1000020000000000000000000000e0ec10000400000000000000d7891000090000005f5f10000c000000e45e100022000000f899100000000000065f100041000000475f100018000000c05f100019000000e05f100048000000bb0100002d0000008795100028000000286010002f0000004800000001000000286010002f0000004800000001000000b560100036000000e9871000580000008d01000005000000786010003d000000e987100058000000940100000500000000000000f26010000b0000000000000000000000fd6010000f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100038ee1000000000000000000048ee1000010000000000000001000000000000000c611000070000000100000000000000fd6010000f00000000000000eb6310001100000000000000000000000000000000000000000000000000000000000000f899100050ee1000000000000000000060ee100001000000000000000100000026000000000000000100000035000000296110001f000000260000000000000001000000360000001361100016000000b560100036000000e987100058000000b401000005000000e987100058000000bb010000050000000000000070611000060000000000000014ef10000100000000000000000000001cef1000010000000000000000000000766110000e0000000000000024ef100002000000000000000000000034ef1000020000000000000000000000846110000c0000000000000044ef100002000000000000000000000054ef100001000000000000006f7c1000070000007562100038000000d789100009000000e089100003000000db611000550000003062100045000000d7891000090000006f7c100007000000906110004b00000000000000ed6210000400000000000000f0f1100003000000000000000000000038f21000040000000000000000000000f16210000a0000000000000058f2100001000000000000000000000070f21000060000000000000000000000fb6210000600000000000000a0f21000010000000000000000000000b8f210000a0000000000000000000000016310001100000000000000f899100000000000000000000000000008f3100008000000000000000000000012631000080000000000000048f3100001000000000000000000000060f310000500000000000000000000001a631000080000000000000088f31000010000000000000000000000a0f31000050000000000000000000000226310000500000000000000f8991000000000000000000000000000c8f31000050000000000000000000000276310000900000000000000f0f3100001000000000000000000000008f41000050000000000000000000000306310000e0000000000000030f4100001000000000000000000000048f410000500000000000000000000003e631000140000000000000070f4100001000000000000000000000088f4100001000000000000000000000052631000140000000000000070f4100001000000000000000000000090f4100001000000000000000000000066631000130000000000000098f41000010000000000000000000000b0f41000010000000000000000000000796310000d00000000000000b8f41000010000000000000000000000d0f4100002000000000000000000000086631000170000000000000098f41000010000000000000000000000e0f410000100000000000000000000009d6310001100000000000000e8f4100001000000000000000000000000f510000100000000000000000000000b6610000a00000000000000958010002300000000000000b88010000500000000000000b77e100015000000000000006a66100005000000000000006f66100011000000986a100060000000f86a10001a000000f899100000000000126b100049000000000000008a6a10000e00000000000000b77e100015000000d06910005d0000002d6a100009000000f899100000000000366a100054000000f899100000000000b66510005500000000000000b88010000500000000000000b77e10001500000046681000550000009b68100040000000db6810004d000000f89910000000000028691000520000007a69100030000000f8991000000000001566100055000000f899100000000000aa69100026000000806710004b000000f899100000000000cb6710004d0000001868100013000000f8991000000000001566100055000000f8991000000000002b6810001b000000000000005f6710000500000000000000646710001c000000256710003a000000f8991000000000007f65100037000000f899100000000000156610005500000000000000f66610000700000000000000fd66100028000000b266100044000000f8991000000000007f65100037000000f89910000000000015661000550000008066100032000000f8991000000000007f65100037000000f8991000000000001566100055000000000000006a66100005000000000000006f66100011000000516510002e000000f8991000000000007f65100037000000f8991000000000001566100055000000000000000b6610000a000000000000009580100023000000516510002e000000f8991000000000007f65100037000000f899100000000000b66510005500000000000000e564100003000000000000003a651000170000001465100026000000e86410002c00000000000000e56410000300000000000000808b10000c000000c56410002000000000000000b86410000d00000000000000ee88100004000000206410004f0000006f64100049000000fc6310002400000000000000e16310000a00000000000000eb63100011000000ae63100033000000806c100048000000f10900000e00000000000000c86c10000e0000000000000000000000e08910000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000e0ff1000000000000000000078fe100001000000000000000100000000000000d66c1000150000000000000000000000e08910000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100080fe1000000000000000000090fe100001000000000000000100000000000000eb6c10000e0000000000000000000000f96c10000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000d8fe1000000000000000000098fe100001000000000000000100000000000000076d10000d0000000000000000000000146d10000700000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000a0fe10000000000000000000b0fe100001000000000000000100000000000000846110000c0000000000000000000000146d10000700000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000b8fe10000000000000000000c8fe1000010000000000000001000000000000001b6d1000110000000000000000000000e08910000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000e0ff10000000000000000000d0fe1000010000000000000001000000000000002c6d10000f0000000000000000000000f96c10000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000d8fe10000000000000000000e8fe1000010000000000000001000000000000003b6d10000d0000000000000000000000eb6310001100000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000100011000000000000000000f0fe100002000000000000000100000000000000486d1000060000000100000000000000818210000c00000000000000818210000c00000000000000000000000000000000000000000000000000000000000000f8991000f8ff1000000000000000000000ff1000010000000000000000000000000000004e6d1000060000000100000000000000818210000c00000000000000546d10003900000000000000000000000000000000000000000000000000000000000000f8991000f8ff1000000000000000000008ff1000010000000000000000000000000000008d6d1000050000000100000000000000818210000c000000000000006f6610001100000000000000000000000000000000000000000000000000000000000000f899100010ff1000000000000000000020ff100001000000000000000100000000000000926d10000a0000000101000000000000818210000c00000000000000646710001c00000000000000000000000000000000000000000000000000000000000000f899100028ff1000000000000000000038ff1000010000000000000001000000000000009c6d10000a0000000101000000000000818210000c00000000000000eb6310001100000000000000000000000000000000000000000000000000000000000000f899100010001100000000000000000040ff100001000000000000000100000000000000a66d1000070000000100000000000000818210000c00000000000000ad6d10002400000000000000000000000000000000000000000000000000000000000000f899100048ff1000000000000000000058ff100004000000000000000100000000000000d16d10000e0000000000000000000000eb6310001100000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100010001100000000000000000078ff100001000000000000000100000000000000df6d10000a0000000000000000000000f96c10000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000a0ff1000000000000000000080ff100001000000000000000100000000000000e96d1000140000000000000000000000df8110000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000b8ff10000000000000000000b0fe100001000000000000000100000000000000fd6d1000100000000000000000000000df8110000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000b8ff1000000000000000000088ff1000020000000000000001000000000000000d6e1000120000000000000000000000f96c10000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000f8ff1000000000000000000098ff1000010000000000000000000000000000001f6e1000130000000000000000000000f96c10000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000a0ff10000000000000000000b0ff100001000000000000000100000000000000326e1000090000000000000000000000df8110000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000b8ff10000000000000000000c8ff1000030000000000000001000000000000003b6e10000a0000000100000000000000818210000c00000000000000e08910000300000000000000000000000000000000000000000000000000000000000000f8991000e0ff10000000000000000000f0ff100001000000000000000100000000000000456e10000d0000000000000000000000526e10000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000f8ff100000000000000000000800110001000000000000000000000000000000546e10000f0000000000000000000000636e10002800000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100010001100000000000000000020001100010000000000000001000000e97510002a000000260000000000000001000000410000009975100050000000707510002900000026000000000000000100000042000000287510004800000026000000000000000100000043000000d474100054000000867410004e00000026000000000000000100000034000000587410002e0000008473100069000000ed7310006b0000004473100040000000f37210005100000026000000000000000100000030000000ba72100039000000260000000000000001000000440000006972100051000000107210005900000026000000000000000100000045000000507110006c000000bc71100030000000f899100000000000ec71100024000000117110003f000000fa701000170000006d7010005a000000c770100033000000497010002400000026000000000000000100000033000000117010003800000026000000000000000100000032000000956f10004c000000f899100000000000e16f10003000000026000000000000000100000035000000216f10007400000026000000000000000100000030000000076f10001a000000260000000000000001000000360000008b6e10007c0000008795100028000000137610002f0000002c020000010000000078100019000000b077100048000000bb0100002d0000007077100039000000b077100048000000100200002d0000004600000028000000040000004700000048000000000000000000000049000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000806c100048000000eb0900000a000000137610002f0000002c0200000100000000000000207a100006000000000000004a00000000000000000000004b000000000000000000000002000000000000000000000000000000000000004c000000000000000000000000000000267a100004000000000000004d00000000000000020000000000000000000000000000000200000000000000000000000000000002000000000000000000000000000000000000002a7a100009000000000000004e00000000000000000000004f0000000000000000000000000000005000000000000000000000000200000000000000000000000000000000000000337a100009000000000000005100000000000000000000005200000000000000000000000000000053000000000000000000000002000000000000000000000000000000000000003c7a10000700000000000000540000000000000000000000550000000000000000000000000000005600000000000000000000000000000057000000000000000000000000000000437a10000800000000000000580000000000000000000000590000000000000000000000000000005a0000000000000000000000000000005b0000000000000000000000000000004b7a100007000000000000005c00000000000000000000005d0000000000000000000000000000005e0000000000000000000000000000005f000000000000000000000000000000527a10000700000000000000600000000000000000000000610000000000000000000000000000006200000000000000000000000000000063000000000000000000000000000000597a10000900000000000000640000000000000000000000650000000000000000000000000000006600000000000000000000000000000067000000000000000000000000000000627a10000700000000000000680000000000000000000000690000000000000000000000000000006a0000000000000000000000000000006b000000000000000000000000000000697a10000e000000000000006c00000000000000000000006d0000000000000000000000000000006e0000000000000000000000000000006f000000000000000000000000000000777a10000f00000000000000700000000000000000000000710000000000000000000000000000007200000000000000000000000000000073000000000000000000000000000000867a100010000000000000004d0000000000000002000000000000000000000000000000000000007400000000000000000000000200000000000000000000000000000000000000967a100007000000000000007500000000000000000000007600000000000000000000000000000077000000000000000000000000000000780000000000000000000000000000009d7a100008000000000000007900000000000000000000007a0000000000000000000000000000007b0000000000000000000000000000007c000000000000000000000000000000a57a100008000000000000007d00000000000000000000007e0000000000000000000000000000007f00000000000000000000000000000080000000000000000000000000000000ad7a10000400000000000000810000000000000000000000820000000000000000000000000000008300000000000000000000000000000084000000000000000000000000000000b17a100008000000000000005807110003000000000000000000000070071100010000000000000000000000b97a10000c000000000000007807110002000000000000000000000088071100010000000000000000000000c57a10000a000000000000008813110001000000000000000000000090071100010000000000000000000000cf7a10000f0000000000000098071100010000000000000000000000a0071100010000000000000000000000de7a10000a00000000000000a8071100020000000000000000000000b8071100020000000000000000000000e87a10000800000000000000c8071100020000000000000000000000d80711000100000000000000d789100009000000d7891000090000006f7c1000070000001a7c100055000000d789100009000000d789100009000000e37b100037000000b57b10002e000000e089100003000000857b100030000000d789100009000000ee881000040000001a7b10004e000000687b10001d000000d789100009000000137b100007000000f07a10002300000000000000767c10000f0000000000000090081100010000000000000000000000a8081100030000000000000000000000857c10000800000000000000c0081100020000000000000000000000f00811000200000000000000000000008d7c100004000000000000000009110004000000000000000000000060091100070000000000000000000000917c1000060000000000000098091100040000000000000000000000f80911000a0000000000000000000000bc8110000800000000000000c4811000100000004c8110002d000000f899100000000000798110004300000000000000cc7e10000900000000000000d57e10000f00000000000000488110000400000000000000137b100007000000bd80100056000000138110003500000000000000918010000400000000000000958010002300000000000000b88010000500000000000000b77e10001500000000000000cc7e10000900000000000000d57e10000f00000000000000f87e10000400000000000000137b100007000000fc7e100042000000f8991000000000003e7f10004a000000887f10002c000000b47f100046000000fa7f1000520000004c8010004500000000000000ae7e10000900000000000000b77e10001500000000000000cc7e10000900000000000000d57e10000f00000000000000e47e10000900000000000000ed7e10000b00000000000000f87e10000400000000000000137b100007000000977c10006a000000f899100000000000017d100021000000f899100000000000227d100050000000727d100041000000b37d10005b0000000e7e100057000000657e10002a0000008f7e10001f00000000000000d48110000b0000000000000000000000df8110000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000041111000000000000000000ec10110001000000000000000100000000000000eb8110000b0000000000000000000000df8110000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000041111000000000000000000f410110001000000000000000100000000000000f6811000120000000000000000000000df8110000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000041111000000000000000000fc1011000100000000000000010000000000000008821000120000000000000000000000df8110000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100004111100000000000000000014111100010000000000000001000000000000001a8210000b0000000000000000000000df8110000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f89910001c11110000000000000000002c11110001000000000000000100000000000000258210000b0000000000000000000000308210000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000f89910003411110000000000000000004411110001000000000000000100000000000000368210000d0000000000000000000000308210000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000f89910004c11110000000000000000005c1111000100000000000000010000000000000043821000080000000000000000000000df8110000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f899100064111100000000000000000074111100010000000000000001000000000000004b821000080000000000000000000000e08910000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000f89910007c11110000000000000000008c11110001000000000000000100000000000000538210000d0000000000000000000000308210000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000941111000000000000000000a41111000100000000000000010000000000000060821000080000000000000000000000308210000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000e41111000000000000000000ac11110001000000000000000100000000000000688210000f0000000000000000000000c48110001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000b41111000000000000000000c411110001000000000000000100000000000000778210000a0000000100000000000000818210000c00000000000000ed7e10000b00000000000000000000000000000000000000000000000000000000000000f8991000fc1111000000000000000000cc111100010000000000000000000000000000008d8210000c0000000100000000000000ed7e10000b00000000000000137b10000700000000000000000000000000000000000000000000000000000000000000f8991000fc1111000000000000000000d411110001000000000000000000000000000000998210000b0000000100000000000000ed7e10000b00000000000000a48210001600000000000000000000000000000000000000000000000000000000000000f8991000fc1111000000000000000000dc11110001000000000000000000000000000000ba8210000e0000000000000000000000c88210000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8991000e41111000000000000000000f411110001000000000000000100000000000000cb8210000d0000000100000000000000818210000c00000000000000d88210000b00000000000000000000000000000000000000000000000000000000000000f8991000fc1111000000000000000000cc111100010000000000000000000000d985100025000000b2851000270000007b8510003700000026000000000000000100000032000000388510004300000026000000000000000100000085000000088510003000000026000000000000000100000086000000d68410003200000026000000000000000100000087000000a88410002e0000002600000000000000010000003a0000008a8410001e000000260000000000000001000000880000005884100032000000260000000000000001000000890000001c8410003c000000fc831000200000002600000000000000010000008a000000d783100025000000ad8310002a0000005483100059000000f78210005d00000026000000000000000100000033000000e382100014000000260000000000000001000000300000006c86100028000000948610002f00000000010000040000008795100028000000d786100030000000e800000001000000d786100030000000e80000000100000000000000818810000800000000000000281311000400000000000000000000004813110001000000000000000000000089881000050000000000000050131100050000000000000000000000781311000200000000000000000000008e88100008000000000000008813110001000000000000000000000090131100010000000000000000000000968810000b000000000000008813110001000000000000000000000098131100010000000000000000000000a18810000800000000000000a0131100020000000000000000000000b01311000100000000000000d7891000090000003c8a10000d000000ea88100004000000e089100003000000e389100059000000d789100009000000ea88100004000000ee88100004000000e089100003000000e08910000300000058891000420000009a8910003d000000ea881000040000002789100031000000f288100035000000ea88100004000000ee88100004000000a988100041000000508a100019000000708a100048000000bb0100002d0000008795100028000000088b1000330000004200000001000000000000003b8b1000070000000000000040141100020000000000000000000000f8991000000000000000000000000000428b1000040000000000000070141100030000000000000000000000f8991000000000000000000000000000778b10000900000000000000808b10000c00000000000000468b100008000000000000008c8b10001b00000000000000468b100008000000000000004e8b10000700000000000000558b100005000000000000005a8b10001600000000000000708b10000700000000000000ee8810000400000000000000b58b1000090000000000000000000000be8b10000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000f89910004816110000000000000000005816110001000000000000000100000000000000ca8b10000a00000001000000000000004e8b10000700000000000000d48b10001600000000000000000000000000000000000000000000000000000000000000f89910006816110000000000000000006016110001000000000000000000000000000000ea8b10000600000001000000000000004e8b10000700000000000000f08b10003a00000000000000000000000000000000000000000000000000000000000000f899100068161100000000000000000078161100010000000000000000000000000000002a8c10000d0000000000000000000000e08910000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000f89910008016110000000000000000009016110001000000000000000100000026000000000000000100000036000000c58c100026000000928c10003300000026000000000000000100000030000000498c10004900000026000000000000000100000035000000378c100012000000c08a100048000000f10900000e000000508a100019000000f08c100034000000df000000180000008a8e100023000000608e10002a000000088b1000330000004200000001000000909010006200000023010000170000006b90100025000000be91100012000000d09110000f000000919110000a0000009b91100014000000af9110000f000000f0911000550000008800000016000000589210001c00000045921000130000007704000009000000749210001e00000045921000130000006e030000090000004793100012000000599310000c0000004094100069000000c8000000110000001095100048000000eb0900000a0000007c9510000b0000008795100028000000af9510003d00000087000000090000008795100028000000af9510003d000000900000000900000000000000b09610001000000000000000f899100000000000000000000000000020181100010000000000000000000000c09610000f00000000000000f8991000000000000000000000000000281811000100000000000000e496100025000000cf9610001500000020971000190000004097100035000000140100002a0000008097100019000000a09710003d0000005500000022000000ff9710002d0000002c9810000c00000038981000030000003b981000110000004c98100017000000ea02000005000000b09810004600000063010000130000008b00000004000000040000008c0000008d0000008e000000f899100000000000a9a71000020000009698100015000000e503000005000000f899100020000000189a1000120000002600000000000000010000008f0000000a9b100006000000109b100022000000f29a1000180000006d09000005000000329b100016000000489b10000d000000f29a1000180000007309000005000000739b10000b0000007aa7100016000000559b1000010000005d9b100016000000da0700000900000058a710000e00000066a71000040000006aa7100010000000559b1000010000005d9b100016000000de0700000500000018a710002b00000043a71000150000005901000015000000739b10000b0000007e9b100026000000a49b100008000000ac9b100006000000559b1000010000005d9b100016000000eb07000005000000f899100000000000d69b100002000000c09b1000160000005404000011000000c09b1000160000004804000028000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000f8030000000000000000000000000000000000000000000000000000000000000000feffffffffbfb6000000000000000000ff070000000000f8ffff0000010000000000000000000000c09f9f3d0000000002000000ffffff0700000000000000000000c0ff01000000000000f80f2010a110004a00000060a310000002000060a510003700000000010203040506070809080a0b0c0d0e0f10111213140215161718191a1b1c1d1e1f2002020202020202020202210202020202020202020202020202222324252602270228020202292a2b022c2d2e2f300202310202023202020202020202023302023402020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202023502360237020202020202020238023902020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202023a3b3c020202023d02023e3f4041424344454602020247020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202024802020202020202020202024902020202023b0200010202020203020202020402050602020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202070202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202f0a01000200000002700000019000000f0a01000200000002800000020000000f0a01000200000002a00000019000000f0a01000200000002b00000018000000f0a01000200000002c00000020000000f89910000000000043a71000150000000a0400000500000000f2b202046e616d6501e9b202d603000e6578745f626c616b65325f323536010c6578745f74776f785f31323802146578745f6765745f73746f726167655f696e746f030f6578745f7365745f73746f7261676504166578745f73616e64626f785f6d656d6f72795f6e6577051b6578745f73616e64626f785f6d656d6f72795f74656172646f776e06176578745f73616e64626f785f696e7374616e746961746507126578745f73616e64626f785f696e766f6b65081d6578745f73616e64626f785f696e7374616e63655f74656172646f776e09116578745f636c6561725f73746f726167650a0e6578745f7072696e745f757466380b126578745f737232353531395f7665726966790c126578745f656432353531395f7665726966790d106578745f73746f726167655f726f6f740e186578745f73746f726167655f6368616e6765735f726f6f740f166578745f6b696c6c5f6368696c645f73746f7261676510166578745f73616e64626f785f6d656d6f72795f67657411166578745f73616e64626f785f6d656d6f72795f736574120d6578745f7072696e745f686578131f6578745f6765745f616c6c6f63617465645f6368696c645f73746f72616765141a6578745f6765745f6368696c645f73746f726167655f696e746f15176578745f636c6561725f6368696c645f73746f7261676516156578745f7365745f6368696c645f73746f7261676517236578745f626c616b65325f3235365f656e756d6572617465645f747269655f726f6f74180d6578745f7072696e745f6e756d190a6578745f6d616c6c6f631a086578745f667265651b683c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e697445787072206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a68303231373834323236636231343233301c6b3c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e737472756374696f6e206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a68343166626563396365303634353835631d0e5f5f727573745f6465616c6c6f631e0e5f5f727573745f7265616c6c6f631f0c5f5f727573745f616c6c6f632008727573745f6f6f6d2134616c6c6f633a3a7261775f7665633a3a63617061636974795f6f766572666c6f773a3a6833616366383265303938633739353262227d3c7061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a436f756e7465644c6973745772697465723c492c543e206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a6861633164616637393865303539383533236f3c7061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a566172496e743332206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a6830643239336438356235303038613237246f3c7061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a566172496e743634206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a6831626464663939613338333164383761256c3c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e697445787072206173207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a653e3a3a646573657269616c697a653a3a6865623862313862343464343532613865266f3c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e737472756374696f6e206173207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a653e3a3a646573657269616c697a653a3a683334343231663138386263626664353927443c7061726974795f7761736d3a3a696f3a3a4572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68306232653038356334663161353834382825616c6c6f633a3a666d743a3a666f726d61743a3a686438386563373064393335303566663229793c7061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a436f756e7465644c6973743c543e206173207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a653e3a3a646573657269616c697a653a3a68376330653864363138356161333232352a36636f72653a3a736c6963653a3a736c6963655f696e6465785f6f726465725f6661696c3a3a68313561663464353835383639653332612b34636f72653a3a736c6963653a3a736c6963655f696e6465785f6c656e5f6661696c3a3a68613764306666373035313035366330352c29636f72653a3a70616e69636b696e673a3a70616e69633a3a68303466613939633333333766636237312d6b3c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e737472756374696f6e206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a68343635313466306166363631316662342e48616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a616c6c6f636174655f696e3a3a7b7b636c6f737572657d7d3a3a68303034633365323561373234353331352f4c73726d6c5f636f6e74726163743a3a657865633a3a457865637574696f6e436f6e746578743c542c562c4c3e3a3a696e7374616e74696174653a3a686536383336653639623663653239663930783c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e2061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f636f64653a3a6831333638393631653833383439653730314b616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a566163616e74456e7472793c4b2c563e3a3a696e736572743a3a683634316366316432373163336162653932613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a496e746f497465723c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a683261656666643363326438316430613633453c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a6765743a3a6839656665633039353866393832396633343073726d6c5f636f6e74726163743a3a657865633a3a7472616e736665723a3a6866613034653962353765383630643161353873726d6c5f636f6e74726163743a3a7761736d3a3a636f64655f63616368653a3a6c6f61643a3a6832613330343133343863346537653133365a3c73726d6c5f636f6e74726163743a3a7761736d3a3a5761736d566d3c543e2061732073726d6c5f636f6e74726163743a3a657865633a3a566d3c543e3e3a3a657865637574653a3a683762343235343761613964653264316237763c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e2061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a636f6d6d69743a3a683735663961393663666637386464613538693c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a53706563457874656e643c542c616c6c6f633a3a7665633a3a496e746f497465723c543e3e3e3a3a737065635f657874656e643a3a683139323030383132333337376235383439693c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a53706563457874656e643c542c616c6c6f633a3a7665633a3a496e746f497465723c543e3e3e3a3a737065635f657874656e643a3a68316132666430623935303138333234663a2e636f72653a3a6f7074696f6e3a3a6578706563745f6661696c65643a3a68376364373965633566376334346134373b613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a496e746f497465723c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a68306664666266303865383932306134393c34636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a68313539393136656134343138633031342e3131363d8c013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a656e737572655f63616e5f77697468647261773a3a68363665386361666564623633633262353e4e73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e3a3a7365745f62616c616e63653a3a68663033353032333132633234666362383f2e636f72653a3a726573756c743a3a756e777261705f6661696c65643a3a68323061643266343235653637636431374030636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a6831326261623832623132626539306631414573726d6c5f636f6e74726163743a3a657865633a3a457865637574696f6e436f6e746578743c542c562c4c3e3a3a63616c6c3a3a6834336462313937663038333961303033424173726d6c5f636f6e74726163743a3a7761736d3a3a707265706172653a3a707265706172655f636f6e74726163743a3a6866356665373862633062626466666533436f3c7061726974795f7761736d3a3a656c656d656e74733a3a73656374696f6e3a3a53656374696f6e206173207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a653e3a3a646573657269616c697a653a3a683561613030656163346162616231326244467061726974795f7761736d3a3a656c656d656e74733a3a73656374696f6e3a3a436f646553656374696f6e3a3a626f646965733a3a68636638373932656364313466663432614530636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a68353265653430393034646230386438644648616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e3a3a696e736572743a3a6864343535313934306562383633336666473c7061726974795f7761736d3a3a6275696c6465723a3a6d6f64756c653a3a66726f6d5f6d6f64756c653a3a683162363330653433323531623464623248537061726974795f7761736d3a3a6275696c6465723a3a6d6f64756c653a3a4d6f64756c654275696c6465723c463e3a3a7265736f6c76655f747970655f7265663a3a683663373630643862353731303265323549a9017061726974795f7761736d3a3a6275696c6465723a3a6d6f64756c653a3a3c696d706c20636f72653a3a636f6e766572743a3a46726f6d3c7061726974795f7761736d3a3a6275696c6465723a3a6d6f64756c653a3a4d6f64756c6553636166666f6c643e20666f72207061726974795f7761736d3a3a656c656d656e74733a3a6d6f64756c653a3a4d6f64756c653e3a3a66726f6d3a3a68633735613661336666633237616362644a3a707761736d5f7574696c733a3a72756c65733a3a496e737472756374696f6e547970653a3a6f703a3a68663136663266393332383066626139384b36636f72653a3a70616e69636b696e673a3a70616e69635f626f756e64735f636865636b3a3a68336234346536633365626435366533364c2d616c6c6f633a3a7665633a3a5665633c543e3a3a696e736572743a3a68353166653837313062383433326430624d613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a68613935353838376436386665376461364e507061726974795f7761736d3a3a6275696c6465723a3a6d6f64756c653a3a4d6f64756c654275696c6465723c463e3a3a707573685f66756e6374696f6e3a3a68643736613865343261376432383739664f3c707761736d5f7574696c733a3a737461636b5f6865696768743a3a696e6a6563745f6c696d697465723a3a6862376530623961323733643230613231506b3c7061726974795f7761736d3a3a656c656d656e74733a3a73656374696f6e3a3a53656374696f6e206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a686231653864393062663939376531303551783c7061726974795f7761736d3a3a656c656d656e74733a3a696d706f72745f656e7472793a3a526573697a61626c654c696d697473206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a683761613761336466393062613931363452713c7061726974795f7761736d3a3a656c656d656e74733a3a696e6465785f6d61703a3a496e6465784d61703c543e206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a683935383464346538303965303133353653713c7061726974795f7761736d3a3a656c656d656e74733a3a73656374696f6e3a3a437573746f6d53656374696f6e206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a68353866396237383561353130386435305482017061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a3c696d706c207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a6520666f7220616c6c6f633a3a737472696e673a3a537472696e673e3a3a73657269616c697a653a3a683332346565373038633731373864316455457061726974795f7761736d3a3a656c656d656e74733a3a73656374696f6e3a3a53656374696f6e5265616465723a3a6e65773a3a6833626138623634666430346661633238567c3c7061726974795f7761736d3a3a656c656d656e74733a3a696d706f72745f656e7472793a3a526573697a61626c654c696d697473206173207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a653e3a3a646573657269616c697a653a3a68343036393565396138663232386130635727636f72653a3a7374723a3a66726f6d5f757466383a3a68633135336561323266613035343736375886017061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a3c696d706c207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a6520666f7220616c6c6f633a3a737472696e673a3a537472696e673e3a3a646573657269616c697a653a3a6863376138363163383064363831386166597a3c73725f7072696d6974697665733a3a67656e657269633a3a6865616465723a3a4865616465723c4e756d6265722c486173682c4469676573744974656d3e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68313665353862613466623335646662655a5d3c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c7536343e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68666264316237663330356533613936645b4e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68343632373061313937333434386363315c3773726d6c5f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a68336330333938393036636238646566325d3773726d6c5f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a68376333623861346263396639633061385e4e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68613966616165303836353533646562375fb20173726d6c5f7374616b696e673a3a5f494d504c5f4445434f44455f464f525f5f5f4c696e6b616765466f724e6f6d696e61746f7273446f4e6f745573653a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f722073726d6c5f7374616b696e673a3a5f5f4c696e6b616765466f724e6f6d696e61746f7273446f4e6f745573653c4b65793e3e3a3a6465636f64653a3a6839653136326139626137393730653738603773726d6c5f737570706f72743a3a73746f726167653a3a756e6861736865643a3a6765743a3a6838396430666234653566663237653566613773726d6c5f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a683633366365376237336339393065306262633c7061726974795f636f6465633a3a636f6465633a3a436f6d706163745265663c7533323e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a68653732393132396534313839623734386334636f72653a3a736c6963653a3a3c696d706c205b545d3e3a3a636f6e7461696e733a3a6838383665336534653433393436623365647b3c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6761733a3a68303431656636383133636430303034616587013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f7365745f73746f726167653a3a68306235333765396639386333316531336687013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6765745f73746f726167653a3a68386239323665333438353962616663316780013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f63616c6c3a3a68363531613536633566336263323062656882013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6372656174653a3a68373231306535373336373666333462626982013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f72657475726e3a3a68333461666537333031656533653432646a82013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f63616c6c65723a3a68633336343732643432366266663236306b83013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f616464726573733a3a68653466323934633563386438356161636c85013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6761735f70726963653a3a68323666613333323832626438353463376d84013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6761735f6c6566743a3a68623430636566343933313837363236376e83013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f62616c616e63653a3a68353561306463633631663665636634396f8d013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f76616c75655f7472616e736665727265643a3a68383039646565346235396330356435627087013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f72616e646f6d5f736565643a3a6839623662636134626164306130353232717f3c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6e6f773a3a68666465636466313134383634313237357289013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f64697370617463685f63616c6c3a3a68316636626437656533393566663734627386013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f696e7075745f73697a653a3a68386166633762633336346332386338327486013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f696e7075745f636f70793a3a68393166656638336438323739656632337588013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f736372617463685f73697a653a3a68636136323365373962623234313634617688013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f736372617463685f636f70793a3a68313734643139616263626231313638327789013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6465706f7369745f6576656e743a3a6832363638633038663464383266373736783273725f73616e64626f783a3a696d703a3a64697370617463685f7468756e6b3a3a686162626266653666646163613461323579135f5f727573745f616c6c6f635f7a65726f65647aa7017375627374726174655f7072696d6974697665733a3a73616e64626f783a3a5f494d504c5f4445434f44455f464f525f547970656456616c75653a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f72207375627374726174655f7072696d6974697665733a3a73616e64626f783a3a547970656456616c75653e3a3a6465636f64653a3a68326231646366636438333337383566667b4473726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a746f5f657865637574696f6e5f726573756c743a3a68373130613438356236313539636432647c673c73726d6c5f636f6e74726163743a3a7761736d3a3a5761736d566d3c543e2061732073726d6c5f636f6e74726163743a3a657865633a3a566d3c543e3e3a3a657865637574653a3a7b7b636c6f737572657d7d3a3a68393361373337353638393938323431347d4473726d6c5f737570706f72743a3a73746f726167653a3a756e6861736865643a3a53746f726167655665633a3a6974656d3a3a68666266656138653439303335316265317e463c753332206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a7573696e675f656e636f6465643a3a68643561393863633337613062326532647f89013c73725f7072696d6974697665733a3a67656e657269633a3a6469676573743a3a4469676573744974656d5265663c486173682c417574686f7269747949642c5365616c5369676e61747572653e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64653a3a683732336430396466653838306534633480013973726d6c5f636f6e73656e7375733a3a4d6f64756c653c543e3a3a617574686f7269746965733a3a686437393937646361363537383134376581014a3c5b75383b205f5d206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a7573696e675f656e636f6465643a3a686633633264303833646330316337633182014773726d6c5f636f6e73656e7375733a3a4d6f64756c653c543e3a3a736176655f6f726967696e616c5f617574686f7269746965733a3a683662666333326432303636646339363583013c73726d6c5f636f6e73656e7375733a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a683633646631336262346437626236336184014173726d6c5f636f6e73656e7375733a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a683838343738633162613537353130633085014673726d6c5f636f6e73656e7375733a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a683838326263393930373164623062353086016f73726d6c5f6578656375746976653a3a4578656375746976653c53797374656d2c426c6f636b2c436f6e746578742c5061796d656e742c416c6c4d6f64756c65733e3a3a6170706c795f65787472696e7369635f776974685f6c656e3a3a68333164363761356437353962353161348701c2013c73725f7072696d6974697665733a3a67656e657269633a3a756e636865636b65645f6d6f7274616c5f636f6d706163745f65787472696e7369633a3a556e636865636b65644d6f7274616c436f6d7061637445787472696e7369633c416464726573732c496e6465782c43616c6c2c5369676e61747572653e2061732073725f7072696d6974697665733a3a7472616974733a3a436865636b61626c653c436f6e746578743e3e3a3a636865636b3a3a683164373634353263656363363934356488013873726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a6163636f756e745f6e6f6e63653a3a6866663338313237373762643066323064890188013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a4d616b655061796d656e743c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6d616b655f7061796d656e743a3a68333735646534383532333766376232628a01593c6e6f64655f72756e74696d653a3a43616c6c2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a68613866303639373235366535363937318b013873726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a6465706f7369745f6576656e743a3a68636332626339313464623430666431378c0130636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a68313539393136656134343138633031348d017f3c284b2c204c2c204d2c204e2c204f2c20502c20512c20522c20532c20542c20552c20562c20572c20582c20592c205a292061732073725f7072696d6974697665733a3a7472616974733a3a4f6e46696e616c697a653c4e756d6265723e3e3a3a6f6e5f66696e616c697a653a3a68303466663435363631663366383463308e013673726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a6465706f7369745f6c6f673a3a68396463396663613336303062646134318f016d3c73726d6c5f737570706f72743a3a73746f726167653a3a52756e74696d6553746f726167652061732073726d6c5f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a53746f726167653e3a3a74616b653a3a68336536616238666365633866393235369001523c28522c2053292061732073726d6c5f73657373696f6e3a3a4f6e53657373696f6e4368616e67653c543e3e3a3a6f6e5f73657373696f6e5f6368616e67653a3a686131616330333134663639646162373091014e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a686164373363336365323935306364363592013873726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a6465706f7369745f6f663a3a683566663633383833336639343132393593013d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a683263656466626165303136363661393894018c013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a52657365727661626c6543757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a756e726573657276653a3a683230366630363932626238346662326195013f73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a696e6a6563745f7265666572656e64756d3a3a683930343563623531383131356661313596013d73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a7265666572656e64756d5f696e666f3a3a683862366662626237663932306366333297014e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a683135353039356233333230333163636698018d013c73726d6c5f636f756e63696c3a3a73656174733a3a4d6f64756c653c543e2061732073725f7072696d6974697665733a3a7472616974733a3a4f6e46696e616c697a653c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a426c6f636b4e756d6265723e3e3a3a6f6e5f66696e616c697a653a3a68343835393438383366616236353630309901a1013c73726d6c5f64656d6f63726163793a3a566f74657273466f723c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a53746f726167654d61703c7533322c616c6c6f633a3a7665633a3a5665633c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3e3a3a6765743a3a68343138643834393936656535303633669a0186013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a746f74616c5f62616c616e63653a3a68633933656433646439396134353430379b013573726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a766f74655f6f663a3a68356265663336396463353466306133669c013d73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a64656c6567617465645f766f7465733a3a68623066623437646262373231636332399d018c013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a4c6f636b61626c6543757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a657874656e645f6c6f636b3a3a68353461333561356664313262643235329e013673726d6c5f74726561737572793a3a4d6f64756c653c543e3a3a70726f706f73616c733a3a68653031343464316136323365633131659f0189013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6465706f7369745f6372656174696e673a3a6830346632363231383863383237353236a0012e636f72653a3a726573756c743a3a756e777261705f6661696c65643a3a6865643061656435396465626437313838a1014e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6866353636343864376339386635383033a2013d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6834336639393636326434353337373130a3014e3c6e6f64655f72756e74696d653a3a43616c6c206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6861663436646433656138356365363139a4014e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6863653735316562366533663239323631a5013e73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a636c6561725f7265666572656e64756d3a3a6836623032613031353963656539613138a6016c3c73726d6c5f737570706f72743a3a73746f726167653a3a52756e74696d6553746f726167652061732073726d6c5f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a53746f726167653e3a3a7075743a3a6862316432613532333136346434336164a7014e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6838373237353637663736333033636134a8013b73726d6c5f6772616e6470613a3a4d6f64756c653c543e3a3a7363686564756c655f6368616e67653a3a6838323732396466633733613435643063a9016b3c73726d6c5f6772616e6470613a3a53746f72656450656e64696e674368616e67653c4e2c53657373696f6e4b65793e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6834663635663364373639613465383366aa014e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6839616631653337643566303862316634ab016c3c73726d6c5f737570706f72743a3a73746f726167653a3a52756e74696d6553746f726167652061732073726d6c5f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a53746f726167653e3a3a7075743a3a6830353831353836343639386363363734ac01573c28292061732073726d6c5f737570706f72743a3a7472616974733a3a4f6e556e62616c616e6365643c496d62616c616e63653e3e3a3a6f6e5f756e62616c616e6365643a3a6837383966356162393763386234613963ad01e7013c73726d6c5f64656d6f63726163793a3a446973706174636851756575653c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a53746f726167654d61703c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a426c6f636b4e756d6265722c616c6c6f633a3a7665633a3a5665633c636f72653a3a6f7074696f6e3a3a4f7074696f6e3c283c542061732073726d6c5f64656d6f63726163793a3a54726169743e3a3a50726f706f73616c2c20753332293e3e3e3e3a3a6765743a3a6863313336373666383234633738373334ae013d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6835346364643137396564626564323365af013573726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a626c6f636b5f686173683a3a6834386266306666663437333035316264b0013473726d6c5f696e64696365733a3a4d6f64756c653c543e3a3a656e756d5f7365743a3a6834326566316661666138613832373631b101633c7061726974795f636f6465633a3a636f6465633a3a436f6d706163745265663c7536343e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6836363439326635333737353530636462b201513c6e6f64655f72756e74696d653a3a43616c6c206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6864373136393462343732353831383831b30130636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a6839613361306339386638353664626363b401b5013c73725f7072696d6974697665733a3a67656e657269633a3a756e636865636b65645f6d6f7274616c5f636f6d706163745f65787472696e7369633a3a556e636865636b65644d6f7274616c436f6d7061637445787472696e7369633c416464726573732c496e6465782c43616c6c2c5369676e61747572653e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6831356261356166383161373335613138b5015d3c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c7533323e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6832346330393739633831373936643133b601723c73726d6c5f696e64696365733a3a616464726573733a3a416464726573733c4163636f756e7449642c4163636f756e74496e6465783e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6836326664616462353332613835353266b7014e3c6e6f64655f72756e74696d653a3a43616c6c206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6831623962313965633766326633353366b8014373726d6c5f66696e616c6974795f747261636b65723a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6837396332633734366561646237383137b901493c73726d6c5f636f6e73656e7375733a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6839373239663931646263376539306139ba01e8013c73726d6c5f64656d6f63726163793a3a5f5f6c696e6b65645f6d61705f64657461696c735f666f725f64656c65676174696f6e735f646f5f6e6f745f7573653a3a456e756d657261746f723c532c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c28283c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c206938292c2054293e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6835376531336239633135623562393336bb013c73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6832306333653233323663643161633565bc014173726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6832636437353937306633303164316433bd014673726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6834636635643537373666666465613862be016e3c73726d6c5f64656d6f63726163793a3a5f5f4765744279746553747275637444656c65676174696f6e733c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6865613334613735353963613363666663bf01703c73726d6c5f64656d6f63726163793a3a5f5f47657442797465537472756374446973706174636851756575653c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6863646265633837323130656666633239c001ad013c73726d6c5f64656d6f63726163793a3a50726f78793c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a53746f726167654d61703c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6765743a3a6865623862633439343032323738613139c101493c73726d6c5f64656d6f63726163793a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6834323462376132666531646334356265c201443c6e6f64655f72756e74696d653a3a43616c6c20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6830336232373937353034346238613035c301483c73726d6c5f636f6e74726163743a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6837393335336438356435613831343934c401463c616c6c6f633a3a626f7865643a3a426f783c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6838386438336430353632353666383436c501443c6e6f64655f72756e74696d653a3a43616c6c20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6830336232373937353034346238613035c6014e3c73726d6c5f636f756e63696c3a3a73656174733a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6836353136333639666366306136323962c701473c73726d6c5f7374616b696e673a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6831636664653264616566373562386434c801473c73726d6c5f696e64696365733a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6862643436313637613065336263623164c9015e3c73726d6c5f64656d6f63726163793a3a43616c6c3c543e2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a6864656662623833316264383363643762ca01b50173726d6c5f7374616b696e673a3a5f494d504c5f454e434f44455f464f525f5f5f4c696e6b616765466f724e6f6d696e61746f7273446f4e6f745573653a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f722073726d6c5f7374616b696e673a3a5f5f4c696e6b616765466f724e6f6d696e61746f7273446f4e6f745573653c4b65793e3e3a3a656e636f64655f746f3a3a6832306562643532626264633964653562cb013573726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a646f5f766f74653a3a6830636365666637356165336332343339cc018a013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a52657365727661626c6543757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a726573657276653a3a6862393465323366323863623831643634cd01483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a696e736572743a3a6834626330623666346562653536343434ce01323c265420617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a6830633366323337373562356337376563cf012d636f72653a3a70616e69636b696e673a3a70616e69635f666d743a3a6864346165346536313239323765393831d00189013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a4c6f636b61626c6543757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a7365745f6c6f636b3a3a6835633734396639373361633237306239d101aa017375627374726174655f7072696d6974697665733a3a73616e64626f783a3a5f494d504c5f454e434f44455f464f525f547970656456616c75653a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f72207375627374726174655f7072696d6974697665733a3a73616e64626f783a3a547970656456616c75653e3a3a656e636f64655f746f3a3a6833326361623031393465353965616537d2013573726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a696e697469616c697a653a3a6861393238386362393330313863646361d3014e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6830653134373961663764326533663264d4014d3c6e6f64655f72756e74696d653a3a4c6f67206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64653a3a6864373331623263363162363730356462d5015d3c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c7533323e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6837346265646330383730393939353666d6017b6e6f64655f72756e74696d653a3a5f494d504c5f4445434f44455f464f525f4576656e743a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f72206e6f64655f72756e74696d653a3a4576656e743e3a3a6465636f64653a3a6839366230653135363863346465303538d70130636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a6864633866646436396335316364636166d8017e6e6f64655f72756e74696d653a3a5f494d504c5f454e434f44455f464f525f4576656e743a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f72206e6f64655f72756e74696d653a3a4576656e743e3a3a656e636f64655f746f3a3a6862333231666338636632643934663734d9013e73726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6864386635613032633438306135336639da014373726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a6e6f74655f66696e69736865645f65787472696e736963733a3a6832383133313961643133326131643632db014373726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6831613230626263376431346535363066dc01693c73726d6c5f73797374656d3a3a5f5f47657442797465537472756374426c6f636b486173683c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6835613661306463333538343231643039dd013373726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a66696e616c697a653a3a6836643033343838623335616336653038de014473726d6c5f737570706f72743a3a7472616974733a3a5369676e6564496d62616c616e63653c422c503e3a3a6d657267653a3a6835386366366636336363373638303538df014173726d6c5f737570706f72743a3a7472616974733a3a496d62616c616e63653a3a6d617962655f73756273756d653a3a6832333462313364663733346165653161e0013d73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a63616c6c5f66756e6374696f6e733a3a6864613531373366386431393136323731e1013e73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a76657374696e675f62616c616e63653a3a6864303136383935623735383133663563e2013f73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a7365745f667265655f62616c616e63653a3a6861656433336466666630386462373963e3016d3c73726d6c5f737570706f72743a3a73746f726167653a3a52756e74696d6553746f726167652061732073726d6c5f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a53746f726167653e3a3a74616b653a3a6866616466333439613930363736356464e401483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a72656d6f76653a3a6830663764333330363531636432613064e501483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a72656d6f76653a3a6830363132383636663366616332393439e6014273726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a73746f72655f6d657461646174615f6e616d653a3a6835386530643637343466616234393961e7014373726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a7365745f72657365727665645f62616c616e63653a3a6863326163376264323035613435613139e8014773726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6863383937653938643438623334393966e9016f3c73726d6c5f62616c616e6365733a3a5f5f476574427974655374727563744372656174696f6e4665653c542c493e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6837353363396261663137353436393830ea013473726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a6c6f636b733a3a6833333233666331626135663333623731eb0185013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a667265655f62616c616e63653a3a6836353334306139363730663735666334ec018d013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6d616b655f667265655f62616c616e63655f62653a3a6836633136336436393538326663356536ed017f3c73726d6c5f696e64696365733a3a4d6f64756c653c543e2061732073726d6c5f73797374656d3a3a4f6e4e65774163636f756e743c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6f6e5f6e65775f6163636f756e743a3a6864393738313639643866343430323533ee018e013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6465706f7369745f696e746f5f6578697374696e673a3a6835623861636564623266613033333965ef017e3c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a736c6173683a3a6863663836373962666133396137366437f00181013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a77697468647261773a3a6837303462323831373834633364363066f101483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a696e736572743a3a6835666639616632646565363364336333f20191013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a52657365727661626c6543757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a736c6173685f72657365727665643a3a6836623863376662303131663863393838f301573c28292061732073726d6c5f737570706f72743a3a7472616974733a3a4f6e556e62616c616e6365643c496d62616c616e63653e3e3a3a6f6e5f756e62616c616e6365643a3a6830623839383963663932366331373130f4015f3c73726d6c5f62616c616e6365733a3a43616c6c3c542c493e2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a6862303835646633613366353764643735f501653c73726d6c5f62616c616e6365733a3a696d62616c616e6365733a3a506f736974697665496d62616c616e63653c542c493e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6864353234613664353030623036653638f601453c636f72653a3a63656c6c3a3a426f72726f774572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6864656235633237313961643566643735f7017b3c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e2061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f73746f726167653a3a6834326439383833333363306334353135f80148616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e3a3a696e736572743a3a6838313735656261373465333866313235f9012e636f72653a3a726573756c743a3a756e777261705f6661696c65643a3a6866373633616431616364626565376131fa014173726d6c5f636f756e63696c3a3a73656174733a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6830666533333634346463313339306561fb014573726d6c5f636f756e63696c3a3a73656174733a3a4d6f64756c653c543e3a3a63616e6469646174655f7265675f696e666f3a3a6830623138666161343364656562356639fc014673726d6c5f636f756e63696c3a3a73656174733a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6832613536343336363966323861623438fd014b73726d6c5f636f756e63696c3a3a73656174733a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6834373130313239616163356537323136fe01733c73726d6c5f636f756e63696c3a3a73656174733a3a5f5f476574427974655374727563744c6561646572626f6172643c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6838353362663566643962306263633931ff01713c73726d6c5f636f756e63696c3a3a73656174733a3a5f5f47657442797465537472756374566f7465436f756e743c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68663732396531666235303232643436648002743c73726d6c5f636f756e63696c3a3a73656174733a3a5f5f476574427974655374727563745465726d4475726174696f6e3c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a686466633039653830643635656536653781027b3c73726d6c5f636f756e63696c3a3a73656174733a3a5f5f47657442797465537472756374496e6163746976654772616365506572696f643c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68383030663437356366653633656432358202723c73726d6c5f636f756e63696c3a3a73656174733a3a5f5f476574427974655374727563744361727279436f756e743c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a683163646664316239323935333033386583027c3c73726d6c5f636f756e63696c3a3a73656174733a3a5f5f4765744279746553747275637450726573656e74536c617368506572566f7465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68353637643139373161643264623262358402753c73726d6c5f636f756e63696c3a3a73656174733a3a5f5f4765744279746553747275637443616e646964616379426f6e643c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a683730313432393037373835323966313985023d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a686562623863343131323964643564313886024e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a686133313037363339333163316237303987023d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a686132366561343533326231373163346288022e636f72653a3a726573756c743a3a756e777261705f6661696c65643a3a68633738393462653033333133663234308902303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68386361323931366261396231353938618a0249636f72653a3a666d743a3a6e756d3a3a3c696d706c20636f72653a3a666d743a3a446562756720666f72207573697a653e3a3a666d743a3a68623865633133616138306266343336628b022f636f72653a3a666d743a3a6e756d3a3a696d703a3a666d745f7536343a3a68633866633061633330666230666261668c0235636f72653a3a666d743a3a466f726d61747465723a3a7061645f696e74656772616c3a3a68343935396261356235646261323136378d02483c636f72653a3a63656c6c3a3a426f72726f774d75744572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68303934323930356435346335326262668e02633c73726d6c5f636f756e63696c3a3a73656174733a3a43616c6c3c543e2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a68396538626530373531353164323264638f024373726d6c5f636f756e63696c3a3a73656174733a3a4d6f64756c653c543e3a3a646f5f7365745f617070726f76616c733a3a686464386531646336343934366462383190023f73726d6c5f636f756e63696c3a3a73656174733a3a4d6f64756c653c543e3a3a72656d6f76655f766f7465723a3a686437643932326139393163313464663291023f73726d6c5f636f756e63696c3a3a73656174733a3a4d6f64756c653c543e3a3a617070726f76616c735f6f663a3a683738386562613133633036613562356292024e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68336664323864366239616262363930339302477375627374726174655f696e686572656e74733a3a436865636b496e686572656e7473526573756c743a3a7075745f6572726f723a3a68353266326233396365623830383966399402613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a683837346631333761373364336161323995024b616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a566163616e74456e7472793c4b2c563e3a3a696e736572743a3a686132336466636237343739383366353696020c436f72655f76657273696f6e970212436f72655f657865637574655f626c6f636b9802af0173725f7072696d6974697665733a3a67656e657269633a3a626c6f636b3a3a5f494d504c5f4445434f44455f464f525f426c6f636b3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f722073725f7072696d6974697665733a3a67656e657269633a3a626c6f636b3a3a426c6f636b3c4865616465722c45787472696e7369633e3e3a3a6465636f64653a3a686436323935373633643839386664353299024173725f7072696d6974697665733a3a67656e657269633a3a656e636f64655f776974685f7665635f7072656669783a3a68636461373638353339316461383237619a026c3c73725f7072696d6974697665733a3a7472616974733a3a426c616b6554776f3235362061732073725f7072696d6974697665733a3a7472616974733a3a486173683e3a3a656e756d6572617465645f747269655f726f6f743a3a68353734643032343837386337373065639b02443c636f72653a3a666d743a3a417267756d656e747320617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a68313537333163316639393731323431379c02303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68376636353732323937396536356166399d0215436f72655f696e697469616c697a655f626c6f636b9e0210436f72655f617574686f7269746965739f02ea033c6e6f64655f72756e74696d653a3a52756e74696d65206173207375627374726174655f636c69656e743a3a72756e74696d655f6170693a3a72756e74696d655f6465636c5f666f725f436f72653a3a436f72653c73725f7072696d6974697665733a3a67656e657269633a3a626c6f636b3a3a426c6f636b3c73725f7072696d6974697665733a3a67656e657269633a3a6865616465723a3a4865616465723c7536342c73725f7072696d6974697665733a3a7472616974733a3a426c616b6554776f3235362c6e6f64655f72756e74696d653a3a4c6f673e2c73725f7072696d6974697665733a3a67656e657269633a3a756e636865636b65645f6d6f7274616c5f636f6d706163745f65787472696e7369633a3a556e636865636b65644d6f7274616c436f6d7061637445787472696e7369633c3c73726d6c5f696e64696365733a3a4d6f64756c653c6e6f64655f72756e74696d653a3a52756e74696d653e2061732073725f7072696d6974697665733a3a7472616974733a3a5374617469634c6f6f6b75703e3a3a536f757263652c7536342c6e6f64655f72756e74696d653a3a43616c6c2c73725f7072696d6974697665733a3a416e795369676e61747572653e3e3e3e3a3a617574686f7269746965733a3a6838303033626131353731623761323739a002114d657461646174615f6d65746164617461a102603c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c7533323e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6864336166356331373438303332613533a202433c5b75385d206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6864616238363466366462306539396431a302623c73726d6c5f6d657461646174613a3a4465636f6465446966666572656e743c422c4f3e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6831306162633066353230373361633965a402623c73726d6c5f6d657461646174613a3a4465636f6465446966666572656e743c422c4f3e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6865633865626432623763623633306263a502623c73726d6c5f6d657461646174613a3a4465636f6465446966666572656e743c422c4f3e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6838336435336365626363626530303232a6021c426c6f636b4275696c6465725f6170706c795f65787472696e736963a7021b426c6f636b4275696c6465725f66696e616c697a655f626c6f636ba80220426c6f636b4275696c6465725f696e686572656e745f65787472696e73696373a9025d3c7375627374726174655f696e686572656e74733a3a496e686572656e7444617461206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6833653539646237303030313332316466aa023873726d6c5f74696d657374616d703a3a657874726163745f696e686572656e745f646174613a3a6831613630653361666261643938633361ab024e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6861376230653362313263303530353035ac021c426c6f636b4275696c6465725f636865636b5f696e686572656e7473ad0218426c6f636b4275696c6465725f72616e646f6d5f73656564ae022b5461676765645472616e73616374696f6e51756575655f76616c69646174655f7472616e73616374696f6eaf02214f6666636861696e576f726b65724170695f6f6666636861696e5f776f726b6572b002214772616e6470614170695f6772616e6470615f70656e64696e675f6368616e6765b102204772616e6470614170695f6772616e6470615f666f726365645f6368616e6765b2021e4772616e6470614170695f6772616e6470615f617574686f726974696573b302513c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a53706563457874656e643c542c493e3e3a3a66726f6d5f697465723a3a6863313734616331643238353830663939b40215417572614170695f736c6f745f6475726174696f6eb5021a417574686f7269746965734170695f617574686f726974696573b6023d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6830653533386166613664313761633336b70283023c6e6f64655f72756e74696d653a3a4c6f6720617320636f72653a3a636f6e766572743a3a46726f6d3c73725f7072696d6974697665733a3a67656e657269633a3a6469676573743a3a4469676573744974656d3c7072696d69746976655f74797065733a3a483235362c3c7375627374726174655f7072696d6974697665733a3a656432353531393a3a5369676e61747572652061732073725f7072696d6974697665733a3a7472616974733a3a5665726966793e3a3a5369676e65722c7375627374726174655f7072696d6974697665733a3a656432353531393a3a5369676e61747572653e3e3e3a3a66726f6d3a3a6862333431313736326533653061653665b8024e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6832363463383630333534353863653832b9024e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6832613762376238656637343363386664ba024e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6864313737323730336136633061373338bb02723c73726d6c5f696e64696365733a3a616464726573733a3a416464726573733c4163636f756e7449642c4163636f756e74496e6465783e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6832363966333130653832663064346434bc02753c73726d6c5f696e64696365733a3a616464726573733a3a416464726573733c4163636f756e7449642c4163636f756e74496e6465783e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6863626661633530356236343334633939bd024273726d6c5f636f756e63696c3a3a766f74696e673a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6861323161396662336337316435623433be024773726d6c5f636f756e63696c3a3a766f74696e673a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6862393063386633303761656464663561bf024c73726d6c5f636f756e63696c3a3a766f74696e673a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6864383231393832653466346134303262c002703c73726d6c5f74696d657374616d703a3a5f5f476574427974655374727563744d696e696d756d506572696f643c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6863376463303831616435396464646439c1023a73726d6c5f6772616e6470613a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6832353337653232383835343539323061c2023f73726d6c5f6772616e6470613a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6830653737376638343866653139373866c3024473726d6c5f6772616e6470613a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6830363530353361306232376333303235c4023c73726d6c5f74696d657374616d703a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6864643064393364303465313734643439c5024173726d6c5f74696d657374616d703a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6838313535663930623261633963363964c6024673726d6c5f74696d657374616d703a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6834623963376263646563663165393465c702593c73726d6c5f7375646f3a3a43616c6c3c543e2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a6839653437646665373165613162656638c8025e3c73726d6c5f74696d657374616d703a3a43616c6c3c543e2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a6834363034653561366430353930626161c902e8023c73726d6c5f7374616b696e673a3a4c65646765723c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a53746f726167654d61703c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c73726d6c5f7374616b696e673a3a5374616b696e674c65646765723c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c3c3c542061732073726d6c5f7374616b696e673a3a54726169743e3a3a43757272656e63792061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a42616c616e63652c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a426c6f636b4e756d6265723e3e3e3a3a6765743a3a6830303636326637346131363731343236ca025e3c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c753132383e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6836363538656434616432373634303632cb023373726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a7374616b6572733a3a6865623334333063393133303166633532cc02643c73726d6c5f636f756e63696c3a3a766f74696e673a3a43616c6c3c543e2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a6836366439636431393835353065386633cd024173726d6c5f636f756e63696c3a3a766f74696e673a3a4d6f64756c653c543e3a3a69735f636f756e63696c6c6f723a3a6835313734356662366630616566653962ce023b73726d6c5f636f756e63696c3a3a766f74696e673a3a4d6f64756c653c543e3a3a7665746f5f6f663a3a6832316561333231356464373031356236cf023773726d6c5f7375646f3a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6836663434313536373062663335613132d0023c73726d6c5f7375646f3a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6832353961613361386537303765396536d1024173726d6c5f7375646f3a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6836383562336265633833366561306636d202613c73726d6c5f7375646f3a3a5f5f476574427974655374727563744b65793c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6835393330643435346362333165653237d302773c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4469726563744163636f756e7444622061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f62616c616e63653a3a6863636264376561326534663962356466d402773c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4469726563744163636f756e7444622061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f73746f726167653a3a6832326333653736326537356336383664d502723c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4469726563744163636f756e7444622061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a636f6d6d69743a3a6831323734306235396161613235656661d602723c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a496e746f497465723c4b2c563e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6861393732356232353734663562303866d702723c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a496e746f497465723c4b2c563e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6865323262646364623065613431316232d802743c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4469726563744163636f756e7444622061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f636f64653a3a6866346232643336386662336565366231d9027b3c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e2061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f62616c616e63653a3a6838653730306565666337316639643737da023a73726d6c5f73657373696f6e3a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6839643634616537323931386535646330db023f73726d6c5f73657373696f6e3a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6835636539303563336139386136656266dc024473726d6c5f73657373696f6e3a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6830386562646632663134373032373839dd023b73726d6c5f74726561737572793a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6835333136383464663961363665303530de024073726d6c5f74726561737572793a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6832653935373463313734653439323732df024573726d6c5f74726561737572793a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6836363638383231653130393432616265e0026d3c73726d6c5f74726561737572793a3a5f5f476574427974655374727563745370656e64506572696f643c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6832633632393837626436333163343935e102960173726d6c5f74726561737572793a3a5f494d504c5f4445434f44455f464f525f50726f706f73616c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f722073726d6c5f74726561737572793a3a50726f706f73616c3c4163636f756e7449642c42616c616e63653e3e3a3a6465636f64653a3a6832336161626137383062313937653134e2025d3c73726d6c5f74726561737572793a3a43616c6c3c543e2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a6834326236623361343737323639666135e302303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6834623666613939336565363363333435e4023a73726d6c5f696e64696365733a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6838383062346539346238633538313662e5023f73726d6c5f696e64696365733a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6830363938636334313162306530613662e6024473726d6c5f696e64696365733a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6830313437356234333262623433333762e702483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a696e736572743a3a6866663562663463616536646239633137e8026c3c73726d6c5f737570706f72743a3a73746f726167653a3a52756e74696d6553746f726167652061732073726d6c5f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a53746f726167653e3a3a7075743a3a6837376464383231383636636139323834e9022e73726d6c5f636f6e74726163743a3a6761733a3a6275795f6761733a3a6830643035343133373931333139353039ea02d0023c73726d6c5f7374616b696e673a3a5f5f6c696e6b65645f6d61705f64657461696c735f666f725f76616c696461746f72735f646f5f6e6f745f7573653a3a456e756d657261746f723c532c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c2873726d6c5f7374616b696e673a3a56616c696461746f7250726566733c3c3c542061732073726d6c5f7374616b696e673a3a54726169743e3a3a43757272656e63792061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a42616c616e63653e2c2054293e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6831313030396136663362653765663734eb026f7061726974795f636f6465633a3a636f6465633a3a696e6e65725f7475706c655f696d706c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f7220284a2c204b293e3a3a6465636f64653a3a6831303733643437343662396136613334ec023d636f72653a3a756e69636f64653a3a626f6f6c5f747269653a3a426f6f6c547269653a3a6c6f6f6b75703a3a6831356633316530323266343132643538ed028001636f72653a3a7374723a3a7472616974733a3a3c696d706c20636f72653a3a736c6963653a3a536c696365496e6465783c7374723e20666f7220636f72653a3a6f70733a3a72616e67653a3a52616e67653c7573697a653e3e3a3a696e6465783a3a7b7b636c6f737572657d7d3a3a6864363134356462303933373037396266ee022e636f72653a3a7374723a3a736c6963655f6572726f725f6661696c3a3a6839393563623332643064353935353865ef022c636f72653a3a666d743a3a466f726d61747465723a3a7061643a3a6863336264343661346238313564373035f0025c3c73726d6c5f696e64696365733a3a43616c6c3c543e2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a6864363138303439303437646438323464f1025d3c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c7536343e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6839303362396232333538393463643063f2025e3c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c753132383e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6832336636623133323165356663393331f302643c7061726974795f636f6465633a3a636f6465633a3a436f6d706163745265663c753132383e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6834323164616166636164636135393865f402303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6830316335396636666535376435303564f502673c636f72653a3a697465723a3a61646170746572733a3a4d61703c492c463e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a7472795f666f6c643a3a6864633463396435346466383730353064f602ac013c73726d6c5f7374616b696e673a3a426f6e6465643c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a67656e657261746f723a3a53746f726167654d61703c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6765743a3a6830626566656239656361663863643061f7023d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6838623164626130663761633733653063f8023d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6863313466613337646132353265303765f9023d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6865373263643766376565633464343365fa023a73726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6835336635396533616532376536623536fb023f73726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6862633165336464316437663565623238fc02aa0173726d6c5f7374616b696e673a3a5f494d504c5f4445434f44455f464f525f5374616b696e674c65646765723a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f722073726d6c5f7374616b696e673a3a5374616b696e674c65646765723c4163636f756e7449642c42616c616e63652c426c6f636b4e756d6265723e3e3a3a6465636f64653a3a6832653232303132393866323262383863fd024473726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6832326536316437643165343431313334fe02683c73726d6c5f7374616b696e673a3a5f5f476574427974655374727563745374616b6572733c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6832323634643935663335636331623838ff026b3c73726d6c5f7374616b696e673a3a5f5f4765744279746553747275637456616c696461746f72733c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68623065633463626465633865613335378003703c73726d6c5f7374616b696e673a3a5f5f47657442797465537472756374426f6e64696e674475726174696f6e3c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a686135633133313731356638663931336181036d3c73726d6c5f7374616b696e673a3a5f5f476574427974655374727563744f66666c696e65536c6173683c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a683832616331383330343165656466346682036e3c73726d6c5f7374616b696e673a3a5f5f4765744279746553747275637453657373696f6e5265776172643c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68356131633238636236353933306366658303763c73726d6c5f7374616b696e673a3a5f5f476574427974655374727563744d696e696d756d56616c696461746f72436f756e743c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a683864316162376237316365656233353784036a636f72653a3a6f70733a3a66756e6374696f6e3a3a696d706c733a3a3c696d706c20636f72653a3a6f70733a3a66756e6374696f6e3a3a466e4f6e63653c413e20666f7220266d757420463e3a3a63616c6c5f6f6e63653a3a6835626665666563306565666632633730850344636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723a3a73697a655f68696e743a3a68306165633039666136363334363663358603f0013c73726d6c5f7374616b696e673a3a5f5f6c696e6b65645f6d61705f64657461696c735f666f725f6e6f6d696e61746f72735f646f5f6e6f745f7573653a3a456e756d657261746f723c532c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c28616c6c6f633a3a7665633a3a5665633c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e2c2054293e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a683062623538633466653033666237646587033773726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a6d616b655f7061796f75743a3a683533336165323238333764666566656688033973726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a7570646174655f6c65646765723a3a6866356633316661666236356633363839890330636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a68303331323363633864323730346161328a033e636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723a3a6e74683a3a68656361343962303764646631303162368b035c3c73726d6c5f7374616b696e673a3a43616c6c3c543e2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a68343431303237666233323462376233648c03406e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f73797374656d3a3a68303034656238323765376535633331388d0339636f72653a3a6f70733a3a66756e6374696f6e3a3a466e4f6e63653a3a63616c6c5f6f6e63653a3a68313831306333396638633363316362388e03416e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f696e64696365733a3a68646434353231356261336437333331648f03426e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f62616c616e6365733a3a68383132346438613237333363343633339003416e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f73657373696f6e3a3a68623234323431623939343635633230349103416e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f7374616b696e673a3a68663434386234353230356662653139669203436e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f64656d6f63726163793a3a68653364373438366635643062633932339303416e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f636f756e63696c3a3a68653232336263353131656564313935649403486e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f636f756e63696c5f766f74696e673a3a68616637633738346333663565613136339503496e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f636f756e63696c5f6d6f74696f6e733a3a68326534383838333862373038623535669603416e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f6772616e6470613a3a68333363393933373338613533626635659703426e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f74726561737572793a3a683562366662326164316231306531663098034073726d6c5f636f6e74726163743a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a683133613230376434353463653230303399034573726d6c5f636f6e74726163743a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a68383261363361343365313331313534619a033b73726d6c5f636f6e74726163743a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a68633936386638646363373839313731639b03426e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f636f6e74726163743a3a68656635393366366432303632363832369c033e6e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f7375646f3a3a68643138323233373363623662373839669d03703c73726d6c5f636f6e74726163743a3a5f5f476574427974655374727563744163636f756e74436f756e7465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68616261623533313033653636373330649e03713c73726d6c5f636f6e74726163743a3a5f5f4765744279746553747275637443757272656e745363686564756c653c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68633832613637366666633739363233339f036f3c73726d6c5f636f6e74726163743a3a5f5f47657442797465537472756374426c6f636b4761734c696d69743c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6866653066343930666435643039386530a0036a3c73726d6c5f636f6e74726163743a3a5f5f476574427974655374727563744d617844657074683c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6832663066376632333230656537306337a1036f3c73726d6c5f636f6e74726163743a3a5f5f47657442797465537472756374437265617465426173654665653c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6866623833306561336332326362353030a2036d3c73726d6c5f636f6e74726163743a3a5f5f4765744279746553747275637443616c6c426173654665653c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6861346461363331313962656539653065a3036d3c73726d6c5f636f6e74726163743a3a5f5f47657442797465537472756374436f6e74726163744665653c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6866643638386264363535663063303931a403880173726d6c5f636f6e74726163743a3a5f494d504c5f4445434f44455f464f525f5363686564756c653a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f722073726d6c5f636f6e74726163743a3a5363686564756c653c4761733e3e3a3a6465636f64653a3a6861386637326234656235633362346361a503483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f7261676556616c75653c543e3e3a3a6d75746174653a3a6837303265386236346165376565646437a603653c73726d6c5f636f756e63696c3a3a6d6f74696f6e733a3a43616c6c3c543e2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a6834636533653761393762323533356333a7033473726d6c5f636f6e74726163743a3a436f6e6669673c543e3a3a7072656c6f61643a3a6836346661656632313835303461376265a8034373726d6c5f636f756e63696c3a3a6d6f74696f6e733a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6834393966366164646133376161663961a9034873726d6c5f636f756e63696c3a3a6d6f74696f6e733a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6863383630376262353834613638313031aa034d73726d6c5f636f756e63696c3a3a6d6f74696f6e733a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6831356132323636666362323737333062ab0330636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a6830313434373961346534633736343566ac03703c73726d6c5f636f756e63696c3a3a6d6f74696f6e733a3a5f5f47657442797465537472756374566f74696e673c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6835666163306434653535366566633636ad0341707761736d5f7574696c733a3a737461636b5f6865696768743a3a6d61785f6865696768743a3a636f6d707574653a3a6839613261366631323833636163366166ae03457061726974795f7761736d3a3a656c656d656e74733a3a7365676d656e743a3a446174615365676d656e743a3a76616c75653a3a6865343938373330343461306462363538af03323c265420617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a6864393661393531333532353061346236b0033f707761736d5f7574696c733a3a737461636b5f6865696768743a3a7265736f6c76655f66756e635f747970653a3a6862663661323466373461373662366561b1034e636f72653a3a666d743a3a6e756d3a3a696d703a3a3c696d706c20636f72653a3a666d743a3a446973706c617920666f72207533323e3a3a666d743a3a6866373334643231306263306535306163b203613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6836383666323163626362616662656331b303593c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e737472756374696f6e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6837316132663536333639646337303835b403533c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a53706563457874656e643c542c493e3e3a3a737065635f657874656e643a3a6839653530393739346266613037323438b50346707761736d5f7574696c733a3a737461636b5f6865696768743a3a6d61785f6865696768743a3a537461636b3a3a6672616d653a3a6836616266373966373361373332656265b6034b707761736d5f7574696c733a3a737461636b5f6865696768743a3a6d61785f6865696768743a3a537461636b3a3a706f705f76616c7565733a3a6865333834663963313732323632366261b703463c616c6c6f633a3a7665633a3a5665633c543e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6832366632653835396333323134373735b803423c5b545d206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6838313365363465636263346263653333b903623c73726d6c5f6d657461646174613a3a4465636f6465446966666572656e743c422c4f3e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6865643465656533366136346462353631ba039c0173726d6c5f6d657461646174613a3a5f494d504c5f454e434f44455f464f525f53746f7261676546756e6374696f6e547970653a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f722073726d6c5f6d657461646174613a3a53746f7261676546756e6374696f6e547970653e3a3a656e636f64655f746f3a3a6837326333323035316235613561393937bb0311727573745f626567696e5f756e77696e64bc034473725f696f3a3a65787465726e5f66756e6374696f6e735f686f73745f696d706c3a3a6578745f7072696e745f757466383a3a6833616463386163666233393635663765bd030a5f5f72675f616c6c6f63be030c5f5f72675f6465616c6c6f63bf030c5f5f72675f7265616c6c6f63c003115f5f72675f616c6c6f635f7a65726f6564c10323636f72653a3a666d743a3a77726974653a3a6835373533323730386538656535653662c2032e636f72653a3a726573756c743a3a756e777261705f6661696c65643a3a6861653035386131346261313135353835c3033e3c636f72653a3a666d743a3a4572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6832633763376435666536393831336636c40330636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a6836643765616566373035313736376237c5033a3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f7374723a3a6862666130393430636234636131663636c6033b3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f636861723a3a6863633966666234663633333765363136c7033a3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f666d743a3a6863383432656231363666313035636634c803313c5420617320636f72653a3a616e793a3a416e793e3a3a747970655f69643a3a6834626338663232373330353834653263c90343636f72653a3a666d743a3a466f726d61747465723a3a7061645f696e74656772616c3a3a77726974655f7072656669783a3a6835653566363261653930643737373762ca034a3c636f72653a3a6f70733a3a72616e67653a3a52616e67653c4964783e20617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6832336564313662613434663138646432cb03323c6368617220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6836333734393939616461643536393839cc0334636f72653a3a666d743a3a417267756d656e7456313a3a73686f775f7573697a653a3a6838343038363330336236363939643335cd03066d656d736574ce03066d656d637079cf03076d656d6d6f7665d003066d656d636d70d103095f5f75646976746933d203085f5f6d756c746933d3033f636f6d70696c65725f6275696c74696e733a3a696e743a3a73686966743a3a727573745f693132385f73686c3a3a6863643939383262636633653062306538d4033f636f6d70696c65725f6275696c74696e733a3a696e743a3a73686966743a3a727573745f753132385f7368723a3a6837653838373665633035356166623362d5030c5f5f756469766d6f6474693400590970726f64756365727302086c616e677561676501045275737404323031380c70726f6365737365642d62790105727573746325312e33352e302d6e696768746c79202865333432386462376320323031392d30332d333129", - "0x53d1471b684c8a776c80353e5981c960": "0x00407a10f35a00000000000000000000", - "0x78f4ad73d6b7279f8d06f359e363c829": "0x0000a49d8fc957363600000000000000", - "0x486c67c9e8930b1573c6958381ae437a": "0x2a32622a5da54a80dc704a05f2d761c96d4748beedd83f61ca20a90f4a257678", - "0xdade128e67a5ed110063f56a01ab6bbf": "0x0000000000000000", - "0xc1fdc3d212357bc2fa98f2a77b941f0c": "0x1060779817899466dbd476a0bc3a38cc64b7774d5fb646c3d291684171e67a0743fe6211db8bd436e0d1cf37398eac655833fb47497e0f72ec00ab160c88966b7e2254035a15597c1c19968be71593d2d0131e18ae90049e49178970f583ac3e1772b52eb36f57b4bae756e4f064cf2e97df80d5f9c2f06ff31206a9be8c7b371c", - "0x3a6772616e6470613a617574683a00000000": "0xe29624233b2cba342750217aa1883f6ec624134dd306efd230a988e5cb37d9ed0100000000000000", - "0xcf9a75deea0508104cd993c82daf57d3": "0x8096980000000000", - "0x34de7fc8c73e4252b9e09a9e3bf602f8": "0x6400000000000000", - "0xfe7030fd433199728c516e4392091aa5": "0x0080c6a47e8d03000000000000000000", - "0x96f2cbaf8156f12db4af0b59d3e56f8f": "0x0010a5d4e80000000000000000000000", - "0x3a6772616e6470613a617574683a01000000": "0xe19b6b89729a41638e57dead9c993425287d386fa4963306b63f0187328434950100000000000000" - } - } -} diff --git a/node/cli/res/flaming-fir.json b/node/cli/res/flaming-fir.json new file mode 100644 index 0000000000000000000000000000000000000000..3ff5495c9bd79faa75f40067d7945a6f5ae1b00d --- /dev/null +++ b/node/cli/res/flaming-fir.json @@ -0,0 +1,129 @@ +{ + "name": "Flaming Fir", + "id": "flaming-fir", + "properties": { + "tokenDecimals": 15, + "tokenSymbol": "FIR" + }, + "bootNodes": [ + "/ip4/35.246.224.91/tcp/30333/p2p/QmSk5HQbn6LhUwDiNMseVUjuRYhEtYj4aUZ6WfWoGURpdV", + "/ip4/35.246.224.91/tcp/30334/ws/p2p/QmSk5HQbn6LhUwDiNMseVUjuRYhEtYj4aUZ6WfWoGURpdV", + "/ip4/35.246.210.11/tcp/30333/p2p/QmWv9Ww7znzgLFyCzf21SR6tUKXrmHCZH9KhebeH4gyE9f", + "/ip4/35.246.210.11/tcp/30334/ws/p2p/QmWv9Ww7znzgLFyCzf21SR6tUKXrmHCZH9KhebeH4gyE9f", + "/ip4/35.198.110.45/tcp/30333/p2p/QmTtcYKJho9vFmqtMA548QBSmLbmwAkBSiEKK3kWKfb6bJ", + "/ip4/35.198.110.45/tcp/30334/ws/p2p/QmTtcYKJho9vFmqtMA548QBSmLbmwAkBSiEKK3kWKfb6bJ", + "/ip4/35.198.114.154/tcp/30333/p2p/QmQJmDorK9c8KjMF5PdWiH2WGUXyzJtgTeJ55S5gggdju6", + "/ip4/35.198.114.154/tcp/30334/ws/p2p/QmQJmDorK9c8KjMF5PdWiH2WGUXyzJtgTeJ55S5gggdju6" + ], + "telemetryEndpoints": [ + ["wss://telemetry.polkadot.io/submit/", 0] + ], + "protocolId": "fir", + "consensusEngine": null, + "genesis": { + "raw": { + "0xf186665804ca50670311307912458ce448d82cb96e7e4fe71df38c283a8720f4": "0x9c7a2ee14e565db0c69f78c7b4cd839fbf52b607d867e9e9c5a79042898a0d120f0000c16ff286230f0000c16ff2862300", + "0x6e4ab2ac5a7cf9b1829eacc84a75bde0804be01fc31c9419ea72407f50a33384": "0xf26cdb14b5aec7b2789fd5ca80f979cef3761897ae1f37ffb3e154cbcc1c2663", + "0x366a192e1ce90bf109f11cf4d4bdab1ce310d835c09411b1be3ad53814e33196": "0x0c000001547ff0ab649283a7ae01dbc2eb73932eba2fb09075e9485ff369082a2ff38d65", + "0xd368b9d9bb1cc910c9a2b8e5d0f5f2fc": "0x0000c16ff28623000000000000000000", + "0xd437fe93b0bd0a5d67d30d85d010edc2": "0x40420f00", + "0x656abc4530eb4c1692051ca24c867220aa8d62e4a9686b432f760de7455e8f95": "0x5633b70b80a6c8bb16270f82cca6d56b27ed7b76c8fd5af2986a25a4788ce4405633b70b80a6c8bb16270f82cca6d56b27ed7b76c8fd5af2986a25a4788ce440", + "0x7c79972b34b7e51bdd5f168ba3accd35fbec396be75dfad19dd1121327f1a1ad": "0x0c000168655684472b743e456907b398d3a44c113f189e56d1bbfd55e889e295dfde7800", + "0xfe7030fd433199728c516e4392091aa5": "0x0080c6a47e8d03000000000000000000", + "0x686f6c72b7b80bad8dba022335cb7c9e4556ac7ea200008da8046e3178eb89c1": "0x0f0000c16ff286230f0000c16ff2862300", + "0x121725e2f949944d00a8c011c0db54ae07b84a6ca772adf3c65417345d91522d": "0x0000c16ff28623000000000000000000", + "0xeecb67c20ca6cc8ba4d4434687f61309": "0x109becad03e6dcac03cee07edebca5475314861492cdfc96a2144a67bbe969933201000000000000007932cff431e748892fa48e10c63c17d30f80ca42e4de3921e641249cd7fa3c2f01000000000000005633b70b80a6c8bb16270f82cca6d56b27ed7b76c8fd5af2986a25a4788ce44001000000000000003919132b851ef0fd2dae42a7e734fe547af5a6b809006100f48944d7fae8e8ef0100000000000000", + "0xa902f1f0ef97177b8df9f9fd413768e7": "0x00000000", + "0x4ac2684a5a20e7a5adf17ed7aa792a3f6334a0505f02b2a44c3934d36cc4ee0a": "0xc8dc79e36b29395413399edaec3e20fcca7205fb19776ed8ddb25d6f427ec40e", + "0x125dc846383907f5846f72ce53ca0e4b": "0x00ca9a3b000000000000000000000000", + "0x763c9e671e9c7ff51644a965ea0f2707": "0x0000000000000000", + "0x75f6361fd25fec35714be80f2d9870af8c92e73cb6d299ba4774f5b0ad842275": "0x00", + "0x0c41b62474c49057a4476d0b96853c6d44e9c86c5fa130b0da3831c5eef546a0": "0x00", + "0xdee5bbb035d9ebc2c9338b5aedf744d7": "0x4038000000000000", + "0x52b963fbdb3d6e1b03808fc20071f07f": "0x0027060000000000", + "0x15b569617561081f097bbc5c5a059d2f7ccf6d23be534cffa33fb544946a6a92": "0x3919132b851ef0fd2dae42a7e734fe547af5a6b809006100f48944d7fae8e8ef3919132b851ef0fd2dae42a7e734fe547af5a6b809006100f48944d7fae8e8ef", + "0xf541ffd8c90d7124a5298d6c1e2c0d40": "0x0300000000000000", + "0x3a636f6465": "0x0061736d01000000019f022760027f7f0060017f0060037f7f7f017f60027f7f017f60037f7f7f0060047f7f7f7f0060057f7f7f7f7f0060057f7f7f7f7f017f60067f7f7f7f7f7f017f60087f7f7f7f7f7f7f7f017f60067f7f7f7f7f7f0060047f7f7f7f017f60017e0060017f017f60000060017e017f60037f7e7e0060057f7e7f7f7e0060027f7e0060047f7f7e7e0060067f7f7e7e7e7f0060037f7f7e0060027e7e017e60087f7f7f7f7f7f7f7f0060047f7f7f7f017e60087f7f7e7e7f7f7f7f0060097f7f7f7e7e7f7f7f7f0060057f7f7f7e7e0060057f7f7e7e7f0060037f7e7f0060037e7f7f017f60037f7e7f017f60017f017e60047f7e7e7e0060027f7f017e60087f7f7f7f7f7e7e7f0060057f7e7e7e7e0060047f7e7e7f0060067f7e7e7e7e7f000286061d03656e760c6578745f74776f785f313238000403656e76146578745f6765745f73746f726167655f696e746f000703656e760e6578745f626c616b65325f323536000403656e76116578745f636c6561725f73746f72616765000003656e760f6578745f7365745f73746f72616765000503656e76166578745f73616e64626f785f6d656d6f72795f6e6577000303656e761b6578745f73616e64626f785f6d656d6f72795f74656172646f776e000103656e76176578745f73616e64626f785f696e7374616e7469617465000803656e76126578745f73616e64626f785f696e766f6b65000903656e761d6578745f73616e64626f785f696e7374616e63655f74656172646f776e000103656e761f6578745f6765745f616c6c6f63617465645f6368696c645f73746f72616765000703656e76156578745f7365745f6368696c645f73746f72616765000a03656e76176578745f636c6561725f6368696c645f73746f72616765000503656e76166578745f6b696c6c5f6368696c645f73746f72616765000003656e76166578745f73616e64626f785f6d656d6f72795f676574000b03656e760e6578745f7072696e745f75746638000003656e76166578745f73616e64626f785f6d656d6f72795f736574000b03656e76126578745f737232353531395f766572696679000b03656e76126578745f656432353531395f766572696679000b03656e76166578745f6368696c645f73746f726167655f726f6f74000203656e76196578745f6765745f616c6c6f63617465645f73746f72616765000203656e76106578745f73746f726167655f726f6f74000103656e76186578745f73746f726167655f6368616e6765735f726f6f74000203656e760d6578745f7072696e745f686578000003656e76106578745f636c6561725f707265666978000003656e76236578745f626c616b65325f3235365f656e756d6572617465645f747269655f726f6f74000503656e760d6578745f7072696e745f6e756d000c03656e760a6578745f6d616c6c6f63000d03656e76086578745f667265650001038104ff030e0e0f0000000101000d020004001004110f0000000600000112000000010101000000000000000000000000000000000000010000000000000e0400000b1300000000030014150000000000010100000000010000000000000004000013011604130001040004000101000006000300000500000e04000101030803020404040404010003000000040000000000000d000400000003020301051705050505050505050505050505050505050505050505051800040e04010406040003040013000110010419040e060e1a0404030400000100010100000000000000000001000110010013131b131c03000c000000010000000000001300000012000404060000000000000000000000000000000003030406041d00000001010100000000000000000000000004050001030503031e0c0415011f04000101002001040003030001010e010000010e010101001e02000c01210101010101010101010101010404000e01010101010101002222010004050c00222200040000002222220022222222220422222222040101010000000300010101000101010000000d01010123010003000503030400000003000d04000404060506040404040405030303040504020303030204030404000004040303030301030300040001000d01020d0e0302030301200b0503030d0303050102010303010203030202020224242525260407017001ab01ab0105030100120619037f01418080c0000b7f0041adb1c5000b7f0041adb1c5000b07a30414066d656d6f72790200195f5f696e6469726563745f66756e6374696f6e5f7461626c6501000b5f5f686561705f6261736503010a5f5f646174615f656e6403020c436f72655f76657273696f6e00880312436f72655f657865637574655f626c6f636b00890315436f72655f696e697469616c697a655f626c6f636b009003114d657461646174615f6d657461646174610091031c426c6f636b4275696c6465725f6170706c795f65787472696e7369630097031b426c6f636b4275696c6465725f66696e616c697a655f626c6f636b00980320426c6f636b4275696c6465725f696e686572656e745f65787472696e736963730099031c426c6f636b4275696c6465725f636865636b5f696e686572656e7473009b0318426c6f636b4275696c6465725f72616e646f6d5f73656564009c032b5461676765645472616e73616374696f6e51756575655f76616c69646174655f7472616e73616374696f6e009d03214f6666636861696e576f726b65724170695f6f6666636861696e5f776f726b6572009e03214772616e6470614170695f6772616e6470615f70656e64696e675f6368616e6765009f03204772616e6470614170695f6772616e6470615f666f726365645f6368616e676500a1031e4772616e6470614170695f6772616e6470615f617574686f72697469657300a20315417572614170695f736c6f745f6475726174696f6e00a30313417572614170695f617574686f72697469657300a40309cb02010041010baa0160bf03db02dc029601cb02a101b801b901ba01bb01bc01bd01be01bf01c001c101c201c301c401c501c601c701c801c901ca01cb01cc01cd01ce01cf01ca02c802ac03c203c303ac02b2019801e103d803d903da03e403df038804fc03840485048004b802f20140b1033e3d7473727170f90180018201788101fa01f801f701f601f501f401f301bf02be02bd02bc02bb02ba02b902e302e202e902df02e102de02f1028003e702e802e602b303b403b203f202fd01ff01fb01f302ba03bb03b903f4026a6f69f5023b3c3af602f001f101ee01f702af03b003ae03f8029501810382038303f902a703a803a603fa02b602b702b502fb02840385038603f0028703a903d601d701da01d901d501db01bd03e501e901eb01ea01e801ec018f04f003e003f103eb03ee03ed03ec03fd03fe03ff0381048c048b048d048e049004910492040acdca39ff030500101e000b0a0041f481c500104f000be11204077f037e037f117e230041c0026b2201240041082102200141b8016a41086a22034200370300200142003703b80141fc88c0004115200141b8016a100020014198016a41086a2003290300370300200120012903b8013703980141002104024002400240024002400240024020014198016a411041a886c500410041001001417f460d002001421037022c200120014198016a360228200141b8016a200141286a102020012802b8012202450d0220012802bc0121054198012103200141c0016a28020022044198016c2206450d010c030b41002105419801210341004198016c22060d020b200141003602302001200236022c200120023602282001200141b8026a36023420040d020c030b41d4aac10041331021000b200220066a2106200141b8016a20022802701022200220036a21030240024020012802c8012207450d00200141186a20012903b801200141b8016a41086a290300200141d0016a3502004200109804200141186a41086a29030021082001290318210920012802cc01450d01200710230c010b42002109420021080b200141013602302001200636022c200120033602282001200141b8026a36023402402002450d002002ad422086210a024020032006460d0020044198016c41e87e6a2106200141c8016a210b200141d0016a210c200141cc016a210d4201210e0340200141b8016a200341f0006a280200102202400240200b2802002207450d00200141086a20012903b801200141b8016a41086a290300200c3502004200109804200141086a41086a290300210f20012903082110200d280200450d01200710230c010b420021104200210f0b024020092010562008200f562008200f511b0d002003ad422086200e84210a20102109200f21080b20034198016a2103200e42017c210e200641e87e6a22060d000b0b200a4280808080105a0d030b2004450d010b20044198016c21062002210303402003102420034198016a2103200641e87e6a22060d000b0b02402005450d00200210230b200141c0026a240041a489c0000f0b024002400240024002402004200aa722034d0d0020022004417f6a22074198016c6a220641e0006a2903002110200641e8006a2903002109200641f0006a290300210a200641f8006a2903002111200641c0006a2903002112200641c8006a2903002113200641d0006a2903002114200641d8006a2903002115200641206a2903002116200641286a2903002117200641306a2903002118200641386a29030021192006290300211a2006290308211b2006290310211c200220034198016c6a220341186a220b290300211d20064190016a290300210f20064188016a290300210820064180016a290300210e200b200641186a2903003703002003290310211e2003201c3703102003290308211c2003201b3703082003290300211b2003201a370300200341386a2206290200211a20062019370200200341306a2206290200211920062018370200200341286a2206290200211820062017370200200341206a2206290200211720062016370200200341d8006a2206290200211620062015370200200341d0006a2206290200211520062014370200200341c8006a2206290200211420062013370200200341c0006a2206290200211320062012370200200341f8006a2011370200200341f0006a2206280200210b2006200a370200200341e8006a2206290200210a20062009370200200341e0006a220629020021092006201037020020034180016a200e37020020034188016a2008370200200141b8016a41086a2206200837030020034190016a200f370200200141b8016a41106a200f3703002001200e3703b801200141286a41e8006a200a370300200141286a41e0006a2009370300200141286a41d8006a2016370300200141286a41d0006a2015370300200141286a41c8006a2014370300200141286a41c0006a2013370300200141286a41386a201a370300200141286a41306a2019370300200141286a41286a2018370300200141286a41206a2017370300200141286a41186a201d3703002001201e3703382001201c3703302001201b370328200120073602b002200120053602ac02200120023602a80220064200370300200142003703b80141fc88c0004115200141b8016a100020014198016a41086a2006290300370300200120012903b80137039801200141103602bc01200120014198016a3602b801200141a8026a200141b8016a102502402007450d0020044198016c41e87e6a21062002210303402003102420034198016a2103200641e87e6a22060d000b0b02402005450d00200210230b411310262203450d01410021072003410f6a41002800ed8640360000200341086a41002900e68640370000200341002900de864037000020034113412610272203450d022003200b360013200141b8016a41186a22064200370300200141b8016a41106a22024200370300200141b8016a41086a220c4200370300200142003703b80120034117200141b8016a100220014198016a41186a200629030037030020014198016a41106a200229030037030020014198016a41086a200c290300370300200120012903b8013703980102400240024020014198016a412041a886c500410041001001417f460d00200120014198016a3602a802200141203602ac02200142003703c001200142003703b8012001410020014198016a4120200141b8016a41104100100122062006417f461b2206411020064110491b3602b0022006410f4d0d02200141c0016a290300210f20012903b8012108200141b8016a200141a8026a102820012802b8012207450d0220012902bc01210e20014198016a41201003200e422088a72102200ea7210c200310232007450d010c060b2003102341000d050b200141286a10240c050b41d4aac10041331021000b419489c000200320041029000b41134101102a000b41264101102a000b024020024105742206450d0020072103034020032008200f102b200341206a2103200641606a22060d000b0b200141e0016a200f370300200141d8016a2008370300200141d0016a2002360200200141cc016a200c360200200141c8016a2007360200200141c4016a200b360200200141c0016a41013a0000200141053a00b80141a886c5004100200141b8016a102c200141b8016a200141286a41f0001094041a20014198016a20004280e20e7c200141b8016a41004280e90f102d2001280298014101470d00200128029c012103200141c0026a240020030f0b200141c0026a240041000bb40803027f017e107f230041b0046b22022400200241086a2001104a02400240024002400240024002400240024002402002280208450d00200228020c2203ad4298017e2204422088a70d032004a72205417f4c0d032005450d01200510262206450d042003450d020c050b20004100360200200241b0046a24000f0b4108210620030d030b4100210f4100210d0c030b101d000b20054108102a000b200241b0026a4104722107200141086a210820024190046a41186a210920024190046a41106a210a4100210b4100210c410021052003210d0340200141046a220e280200210f20082802002110200241003602a003200841002001280200200f200241a0036a410420101001220f200f417f461b220f4104200f410449220f1b20082802006a36020002400240200f0d0020022802a0032111200241a0036a2001102f20022802a003410e460d00200241b0026a200241a0036a41f0001094041a20094200370300200a420037030020024190046a41086a221042003703002002420037039004200841002001280200200e28020020024190046a412020082802001001220f200f417f461b220f4120200f4120491b20082802006a3602000240200f411f4d0d00200241a0016a41186a2009290300370300200241a0016a41106a200a290300370300200241a0016a41086a201029030037030020022002290390043703a00120022802b0022110200241c4016a200741ec001094041a201121120c020b200241b0026a10240b410e21100b200241a0036a200241c4016a41ec001094041a200241b0026a41186a220e200241a0016a41186a290300370300200241b0026a41106a2211200241a0016a41106a290300370300200241b0026a41086a2213200241a0016a41086a290300370300200220022903a0013703b0022010410e460d02200541016a210f200241346a200241a0036a41ec001094041a200241106a41186a2214200e290300370300200241106a41106a220e2011290300370300200241106a41086a22112013290300370300200220022903b00237031002402005200d470d00200b200f200f200b491b220dad4298017e2204422088a70d042004a722134100480d0402402005450d002006200c2013102722060d010c060b201310262206450d050b2006200c6a22052010360200200541046a200241346a41ec001094041a200541f0006a20123602002005418c016a201429030037020020054184016a200e290300370200200541fc006a2011290300370200200541f4006a2002290310370200200b41026a210b200c4198016a210c200f2105200f2003490d000b0b2000200d36020420002006360200200041086a200f360200200241b0046a24000f0b2000410036020002402005450d002006210503402005102420054198016a2105200c41e87e6a220c0d000b0b0240200d450d00200610230b200241b0046a24000f0b101e000b20134108102a000b5e01017f230041306b220224002002200136020c20022000360208200241246a41013602002002410136022c20024201370214200241ccb0c5003602102002200241086a3602282002200241286a360220200241106a41d4b0c5001061000bad0302047f037e230041d0006b2202240002400240411310262203450d002003410f6a41002800ed8640360000200341086a41002900e68640370000200341002900de864037000020034113412610272203450d0120032001360013200241306a41186a22014200370300200241306a41106a22044200370300200241306a41086a220542003703002002420037033020034117200241306a1002200241186a2001290300370300200241106a2004290300370300200241086a2005290300370300200220022903303703000240024002402002412041a886c500410041001001417f460d00200220023602202002412036022420024200370338200242003703302002410020024120200241306a41104100100122012001417f461b2201411020014110491b3602282001410f4d0d02200241386a290300210620022903302107200241306a200241206a102820022802302201450d0220022902342108200020063703082000200737030020002008370214200020013602100c010b200041003602100b20031023200241d0006a24000f0b41d4aac10041331021000b41134101102a000b41264101102a000b0700200010f8030bee0601027f024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020002802002201410c4b0d0020010e0d01151515020304050615071508010b20002802044101470d14200041086a22002802001024200028020010230f0b200041086a280200220141044b0d0c024020010e051400140e0f140b200041106a280200450d132000410c6a28020010230f0b200041086a280200450d12200028020410230f0b200041086a2d00002201410c4b0d1020014106470d11200041106a280200450d112000410c6a28020010230f0b200041086a2d0000417f6a220141074b0d10024020010e080011111107110809000b2000410c6a22002802001024200028020010230f0b200041086a28020022014102460d0320014101470d0f200041106a280200450d0f2000410c6a28020010230f0b20002d000422014102460d0320014101470d0e200041086a22002802001024200028020010230f0b200041086a280200450d0d200028020410230f0b200041086a2d0000220141054b0d08024020010e060d0d000a0b0d0d0b200041106a280200450d0c2000410c6a28020010230f0b200041106a280200450d0b2000410c6a28020010230f0b2000410c6a22002802001024200028020010230f0b2000410c6a22002802001024200028020010230f0b2000410c6a22002802001024200028020010230f0b2000410c6a22002802001024200028020010230f0b0240200041146a2802002202450d002000410c6a28020021012002410c6c210203400240200141046a280200450d00200128020010230b2001410c6a2101200241746a22020d000b0b200041106a280200450d062000410c6a28020010230f0b200041106a280200450d052000410c6a28020010230f0b0240200041146a2802002202450d002000410c6a2802002101200241186c210203400240200141046a280200450d00200128020010230b0240200141106a280200450d002001410c6a28020010230b200141186a2101200241686a22020d000b0b200041106a280200450d042000410c6a28020010230f0b200041d0006a280200450d03200041cc006a28020010230f0b200041346a280200450d02200041306a28020010230f0b200041306a280200450d012000412c6a28020010230f0b200041106a280200450d002000410c6a28020010230f0b0bc80401077f230041106b2202240020024100360208200242013703002000280200210320022000280208220036020c2002410c6a200210410240024002400240024002402000450d0020004198016c2104200241086a22052802002100200228020421060340200341f0006a28020021070240024002400240200620006b41044f0d00200041046a22082000490d0620064101742200200820082000491b22004100480d062006450d01200228020020062000102722060d020c070b200228020021060c020b200010262206450d050b2002200036020420022006360200200528020021000b2005200041046a360200200620006a2007360000200320021039024002400240024020022802042206200528020022076b41204f0d00200741206a22002007490d0620064101742207200020002007491b22004100480d062006450d01200228020020062000102722080d020c080b200228020021080c020b200010262208450d060b200220003602042002200836020020052802002107200021060b2005200741206a2200360200200820076a220741086a200341fc006a290000370000200741106a20034184016a290000370000200741186a2003418c016a2900003700002007200341f4006a29000037000020034198016a2103200441e87e6a22040d000b200128020020012802042008200010042006450d050c040b200228020421032001280200200128020420022802002208200241086a280200100420030d030c040b101e000b20004101102a000b20004101102a000b200810230b200241106a24000b0700200010f7030b0b0020002001200210f9030bdc0403027f017e0d7f230041d0006b22022400200241086a2001104a02400240024002400240024002400240024002402002280208450d00200228020c2203ad2204421b88a70d032004420586a72205417f4c0d032005450d01200510262206450d042003450d020c050b20004100360200200241d0006a24000f0b4101210620030d030b410021054100210d0c030b101d000b20054101102a000b200241306a41186a2107200241306a41106a2108200141046a21094100210a4100210b4100210c2003210d03402007420037030020084200370300200241306a41086a220e420037030020024200370330200141086a2205410020012802002009280200200241306a412020052802001001220f200f417f461b220f4120200f4120491b20052802006a360200200f411f4d0d02200c41016a2105200241106a41186a220f2007290300370300200241106a41106a22102008290300370300200241106a41086a2211200e290300370300200220022903303703100240200c200d470d00200a20052005200a491b220dad4205862204422088a70d042004a7220e4100480d040240200c450d002006200b200e102722060d010c060b200e10262206450d050b2006200b6a220c2002290310370000200c41186a200f290300370000200c41106a2010290300370000200c41086a2011290300370000200a41026a210a200b41206a210b2005210c20052003490d000b0b2000200d36020420002006360200200041086a2005360200200241d0006a24000f0b200041003602000240200d450d00200610230b200241d0006a24000f0b101e000b200e4101102a000b6c01017f230041306b2203240020032002360204200320013602002003412c6a41023602002003411c6a4102360200200341023602242003420237020c2003419886c500360208200320033602282003200341046a3602202003200341206a360218200341086a20001061000b0e0041b080c500412210f60300000bdb0604027f017e037f047e230041c0006b22032400024002400240411810262204450d00200441106a410029008db741370000200441086a4100290085b741370000200441002900fdb64137000020044118413810272204450d0120042000290000370018200441306a200041186a290000370000200441286a200041106a290000370000200441206a200041086a29000037000042002105200341206a41186a22064200370300200341206a41106a22074200370300200341206a41086a220842003703002003420037032020044138200341206a1002200341186a2006290300370300200341106a2007290300370300200341086a2008290300370300200320032903203703000240024002402003412041a886c500410041001001417f460d00200342003703282003420037032020034120200341206a4110410010012206417f460d022006410f4d0d02200341286a2903002109200329032021052004102341142106411410262204450d010c050b4200210920041023411421064114102622040d040b20064101102a000b41d4aac10041331021000b41184101102a000b41384101102a000b200441106a41002800f9b641360000200441086a41002900f1b641370000200441002900e9b641370000024020042006413410272204450d00200420002900003700142004412c6a200041186a290000370000200441246a200041106a2900003700002004411c6a200041086a2900003700004200210a200341206a41186a22064200370300200341206a41106a22074200370300200341206a41086a220842003703002003420037032020044134200341206a1002200341186a2006290300370300200341106a2007290300370300200341086a2008290300370300200320032903203703000240024002402003412041a886c500410041001001417f460d00200342003703282003420037032020034120200341206a4110410010012206417f460d022006410f4d0d02200341286a290300210b2003290320210a0c010b4200210b0b200410232000200a200120052005200156200920025620092002511b22041b22017c220c200b2002200920041b22027c200c200a54ad7c10df012000200520017d200920027d2005200154ad7d10fe01200341c0006a24000f0b41d4aac10041331021000b41344101102a000bd52803087f047e047f230041a0036b22032400410021044101210502400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240418595c300411041a886c500410041001001417f460d002003410036029801418595c300411020034198016a41044100100141016a41044d0d0320032802980121064100210720010d010c020b410121072001450d010b200141057422044100480d13200410262205450d032001410574220841606a410576210941002104034020034198016a41186a200020046a220a41186a290000220b37030020034198016a41106a200a41106a290000220c37030020034198016a41086a200a41086a290000220d3703002003200a290000220e37039801200520046a220a41106a200c370000200a41086a200d370000200a41186a200b370000200a200e3700002008200441206a2204470d000b200941016a21040b20034184016a20063602002003200736028001200341106a200241f0001094041a20034190016a20043602002003418c016a20013602002003200536028801200341b0026a41086a22044200370300200342003703b00241c19dc3004111200341b0026a1000200341e8026a41086a2004290300370300200320032903b0023703e8024100210f0240200341e8026a411041a886c500410041001001417f460d002003410036029801200341e8026a411020034198016a41044100100141016a41044d0d02200328029801210f0b0240200f41016a220a200f4f0d00200341106a10d802200341a0036a24000f0b200341b0026a41086a22044200370300200342003703b00241c19dc3004111200341b0026a1000200341e8026a41086a22052004290300370300200320032903b0023703e8022003200a36029801200341e8026a411020034198016a4104100420034198016a200341106a4188011094041a20044200370300200342003703b00241b49dc300410d200341b0026a100020052004290300370300200320032903b0023703e802200341003602b002200341e8026a4110200341b0026a1014210a0240024002400240024002400240024020032802b0022204417f460d00200a450d00200320043602a802200320043602a4022003200a3602a0022004450d01200320043602b4022003200a3602b002200341086a200341b0026a104502402003280208450d004101210a200328020c220541016a220820054f0d030b410021040c140b200341003602a802200342013703a0020b200341003602b802200342013703b002200341013602e802200341e8026a200341b0026a10410240024002402003280288024101470d0020032802b402200341b8026a2802002204470d01200441016a220a2004490d1b20044101742205200a200a2005491b22054100480d1b2004450d0420032802b002200420051027220a450d050c120b20032802b402200341b8026a2802002204470d01200441016a220a2004490d1a20044101742205200a200a2005491b22054100480d1a2004450d0520032802b002200420051027220a450d060c0f0b20032802b002210a0c110b20032802b002210a0c0e0b0240200541c000490d004102210a200541808001490d00410441052005418080808004491b210a0b410121050240200841c000490d0041022105200841808001490d00410441052008418080808004491b21050b2005200a470d042003200341a0026a3602b0022008200341b0026a200a10d90220034198016a200341a0026a10da02200341a8026a280200210520032802a402210820032802a00222040d130c180b20051026220a0d0d0b20054101102a000b20051026220a0d090b20054101102a000b20042005200a6b6a2204417f4c0d0f024002402004450d002004102622020d0120044101102a000b410121020b200320043602880320032004360284032003200236028003200320034180036a3602b0022008200341b0026a200510d90220042005490d0320032802880322082004490d04200341a8026a2802002208200a490d05200328028003210220032802a00221062003200420056b22043602900320032008200a6b22083602940320042008470d06200220056a2006200a6a20041094041a20034198016a20034180036a10da0220034188036a28020021052003280284032108200328028003210420032802a402450d0d20032802a002102320040d0e0c130b41d4aac10041331021000b41d4aac10041331021000b20044101102a000b200520041048000b20042008108c01000b200a20081048000b200320034190036a36029803200320034194036a36029c03200341b0026a41146a4100360200200341e8026a41146a4103360200200341f4026a4104360200200341d0026a41146a4103360200200341a886c5003602c002200342013702b402200341a881c5003602b002200341043602ec02200342033702d402200341d480c5003602d0022003200341b0026a3602f80220032003419c036a3602f002200320034198036a3602e8022003200341e8026a3602e002200341d0026a41e481c5001061000b200320053602b4022003200a3602b002200341b8026a28020021040b200341b8026a2205200441016a360200200a20046a41003a00002003418c026a28020021080240024002400240024020032802b402220a200528020022046b41044f0d00200441046a22052004490d0e200a4101742204200520052004491b22044100480d0e200a450d0120032802b002200a20041027220a450d020c030b20032802b002210a0c030b20041026220a0d010b20044101102a000b200320043602b4022003200a3602b002200341b8026a28020021040b200341b8026a200441046a360200200a20046a20083600000c020b200320053602b4022003200a3602b002200341b8026a28020021040b200341b8026a200441016a360200200a20046a41013a00000b20034198016a200341b0026a10dd0220032802900221042003200328029802220a3602e802200341e8026a200341b0026a10410240200a450d00200a4105742106200341b0026a41086a2207280200210520032802b402210803400240024002400240200820056b41204f0d00200541206a220a2005490d0c20084101742205200a200a2005491b22054100480d0c2008450d0120032802b00220082005102722020d020c0b0b20032802b00221022005210a0c020b200510262202450d090b200320053602b402200320023602b0022007280200210a200521080b2007200a41206a22053602002002200a6a220a41086a200441086a290000370000200a41106a200441106a290000370000200a41186a200441186a290000370000200a2004290000370000200441206a2104200641606a22060d000b0b200341b8026a280200210520032802b402210820032802b002210420032802a402450d010b20032802a00210230b2004450d050b4200210c200341b0026a41086a220a4200370300200342003703b00241b49dc300410d200341b0026a1000200341e8026a41086a2202200a290300370300200320032903b0023703e802200341e8026a411020042005100402402008450d00200410230b20034198016a10d802200a4200370300200342003703b00241af98c300410d200341b0026a10002002200a290300370300200320032903b0023703e8020240200341e8026a411041a886c500410041001001417f460d002003420037039801200341e8026a411020034198016a41084100100141016a41084d0d02200329039801210c0b02402001450d0020014105742110200341d0026a41086a2111024003402011200f3602002003200c3703d0020240024002400240024002400240024002400240024002400240024002400240411210262204450d00200441106a41002f00e29d433b0000200441086a41002900da9d43370000200441002900d29d4337000020034198016a41186a2208420037030020034198016a41106a2202420037030020034198016a41086a220a420037030020034200370398012004411220034198016a1002200341b0026a41186a22062008290300370300200341b0026a41106a22072002290300370300200341b0026a41086a2201200a29030037030020032003290398013703b002412010262205450d01200520032903b002370000200541186a2006290300370000200541106a2007290300370000200541086a2001290300370000200410232008420037030020024200370300200a420037030020034200370398012000412020034198016a100220062008290300370300200720022903003703002001200a29030037030020032003290398013703b0022005412041c00010272204450d02200420032903b002370020200441386a2006290300370000200441306a2007290300370000200441286a20012903003700002003410036029801200441c00020034198016a101421050240024002400240024002400240024002400240024002400240024002400240024002402003280298012208417f460d00200341a0026a41086a22022008360200200320083602a402200320053602a0022008450d012003200836029c012003200536029801200320034198016a10452003280200450d02410021052003280204220a41016a2207200a490d0641012105410121060240200a41c000490d0041022106200a41808001490d0041044105200a418080808004491b21060b0240200741c000490d0041022105200741808001490d00410441052007418080808004491b21050b20052006470d082003200341a0026a36029801200720034198016a200610d90220032903d002210b20032802a40222052002280200220a6b41084f0d09200a41086a2208200a490d282005410174220a20082008200a491b220a4100480d282005450d0c20032802a0022005200a102722050d0d0c1c0b200341a0026a41086a4100360200200342013703a0020b200a41003602002003420137039801200341013602b002200341b0026a20034198016a104120032903d002210b0240200328029c012208200a28020022026b41084f0d00200241086a22052002490d2720084101742206200520052006491b22064100480d272008450d0220032802980120082006102722050d030c140b20032802980121050c030b4100210520032802a4020d040c1d0b200610262205450d110b2003200636029c012003200536029801200621080b200a200241086a2206360200200520026a200b370000201128020021070240024002400240200820066b41034b0d00200641046a22012006490d2620084101742209200120012009491b22094100480d262008450d01200520082009102722050d020c140b200821090c020b200910262205450d120b2003200936029c0120032005360298010b200a2002410c6a2212360200200520066a20073600000b20032802a402450d190b20032802a00210230c180b2008200520066b6a2208417f4c0d1c2008450d012008102622010d020c0e0b20032802a00221050c040b410121010b20034180036a41086a220a200836020020032008360284032003200136028003200320034180036a36029801200720034198016a200510d90220082005490d0c200a28020022072008490d0d200228020022022006490d0e200328028003210720032802a00221012003200820056b2208360290032003200220066b22023602940320082002470d0f200720056a200120066a20081094041a20032903d002210b02402003280284032208200a28020022056b41084f0d00200541086a22022005490d1d20084101742205200220022005491b22054100480d1d2008450d0420032802800320082005102722080d050c130b20032802800321080c050b200a10262205450d0f0b2003200a3602a402200320053602a0022002280200210a0b2002200a41086a3602002005200a6a200b37000020112802002108024002400240024020032802a40222052002280200220a6b41044f0d00200a41046a2206200a490d1d2005410174220a20062006200a491b220a4100480d1d2005450d0120032802a0022005200a102722050d020c120b20032802a00221050c020b200a10262205450d100b2003200a3602a402200320053602a0022002280200210a0b2002200a41046a3602002005200a6a20083600002002280200211220032802a402210920032802a00222050d120c140b200510262208450d0e0b20032005360284032003200836028003200a28020021050b200a200541086a360200200820056a200b3700002011280200210202400240024002402003280284032208200a28020022056b41044f0d00200541046a22062005490d1a20084101742205200620062005491b22054100480d1a2008450d0120032802800320082005102722080d020c110b20032802800321080c020b200510262208450d0f0b20032005360284032003200836028003200a28020021050b200a200541046a360200200820056a2002360000200a28020021122003280284032109200328028003210520032802a402450d0e20032802a002102320050d0f0c110b41124101102a000b41204101102a000b41c0004101102a000b20064101102a000b20094101102a000b20084101102a000b200520081048000b20082007108c01000b200620021048000b200320034190036a36029803200320034194036a36029c0320034198016a41146a4100360200200341e8026a41146a4103360200200341f4026a4104360200200341b0026a41146a4103360200200341a886c5003602a8012003420137029c01200341a881c50036029801200341043602ec02200342033702b402200341d480c5003602b002200320034198016a3602f80220032003419c036a3602f002200320034198036a3602e8022003200341e8026a3602c002200341b0026a41e481c5001061000b200a4101102a000b200a4101102a000b20054101102a000b20054101102a000b2005450d020b200441c00020052012100402402009450d00200510230b200041206a210020041023201041606a22100d000c020b0b200410230b200341a0036a24000f0b101d000b41d4aac10041331021000b20054101102a000b101e000b20034198016a10d802200341a0036a24000b8d0c03037f017e037f230041b0026b2205240020054188016a41086a22064200370300200542003703880141a387c000411920054188016a1000200541086a20062903003703002005200529038801370300410021060240024002400240024002400240024002400240024002400240024002402005411041a886c500410041001001417f460d0020054100360288012005411020054188016a41044100100141016a41044d0d0120052802880121060b024002402006417f6a220720064d0d002005410e3602080c010b2005200710382005280208410e460d0020054188016a20054188011094041a200529038801210820054188016a41086a102420082001580d00200041b588c00036020420004101360200200041086a41c70036020020021024200541b0026a24000f0b20054188016a41086a22074200370300200542003703880141a387c000411920054188016a1000200541086a200729030037030020052005290388013703002005200641016a360288012005411020054188016a4104100420052001370388012007200241f0001094042109200520033a0088022005200437038002411a10262207450d01200741186a41002f00dc86403b0000200741106a41002900d48640370000200741086a41002900cc8640370000200741002900c486403700002007411a413410272202450d022002200636001a200541186a220a4200370300200541106a220b4200370300200541086a22074200370300200542003703002002411e2005100220054190026a41186a200a29030037030020054190026a41106a200b29030037030020054190026a41086a200729030037030020052005290300370390022005410036020820054201370300200529038801210141081026220a450d032005410836020420072007280200220b41086a3602002005200a360200200a200b6a20013700002009200510390240024002400240024002400240024002400240024020054188026a2d000022074101460d0020074102470d012005280204200541086a2802002207470d03200741016a220a2007490d162007410174220b200a200a200b491b220b4100480d162007450d0720052802002007200b1027220a450d080c130b2005280204200541086a2802002207470d01200741016a220a2007490d152007410174220b200a200a200b491b220b4100480d152007450d0420052802002007200b1027220a450d050c100b2005280204200541086a2802002207470d02200741016a220a2007490d142007410174220b200a200a200b491b220b4100480d142007450d0720052802002007200b1027220a450d080c0d0b2005280200210a0c0f0b2005280200210a0c100b2005280200210a0c0b0b200b1026220a0d0b0b200b4101102a000b200b1026220a0d0b0b200b4101102a000b200b1026220a0d050b200b4101102a000b41d4aac10041331021000b411a4101102a000b41344101102a000b41084101102a000b2005200b3602042005200a360200200541086a28020021070b200541086a200741016a360200200a20076a41003a00000c040b2005200b3602042005200a360200200541086a28020021070b200541086a200741016a360200200a20076a41013a00000c020b2005200b3602042005200a360200200541086a28020021070b200541086a200741016a360200200a20076a41023a00000b20054180026a29030021010240024002402005280204220a200541086a28020022076b41084f0d00200741086a220b2007490d03200a4101742207200b200b2007491b22074100480d03200a450d012005280200200a20071027220a450d020c040b2005280200210a0c040b20071026220a0d020b20074101102a000b101e000b200520073602042005200a360200200541086a28020021070b200541086a220b200741086a360200200a20076a20013700002005280204210720054190026a41202005280200220a200b280200100402402007450d00200a10230b200210232009102420054194016a200636020020054191016a20033a000020054188016a41086a41033a0000200541053a00880141a886c500410020054188016a102c2000410036020020002006360204200541b0026a24000bf10401047f230041c0046b22012400200141d0036a41086a22024200370300200142003703d003418388c0004116200141d0036a1000200141d8016a41086a2002290300370300200120012903d0033703d8010240024002400240200141d8016a411041a886c500410041001001417f460d00200142103702ec012001200141d8016a3602e801200141d0036a200141e8016a102f20012802d003410e460d03200141e0026a200141d0036a41f0001094041a200141003a00f40120012802e80120012802ec01200141f4016a4101200141f0016a22022802001001210320022002280200200341016a41014b22036a3602002003450d0220012d00f401220341034f0d0220012802e0022102200141f4016a200141e0026a41047241ec001094041a2002410e460d03200141d0036a200141f4016a41ec001094041a200141d8016a411010030c010b410e21020b200141ec006a200141d0036a41ec001094041a02402002410e470d00200141c0046a2400419988c0000f0b2001200141ec006a41ec00109404220141013a00e002200141d0036a41086a22044200370300200142003703d00341f186c000411f200141d0036a1000200141d8016a41086a2004290300370300200120012903d0033703d801200141d8016a4110200141e0026a41011004200441023a0000200141053a00d0034100210441a886c5004100200141d0036a102c200120023602d003200141d0036a410472200141ec001094041a200141e0026a20004280e20e7c200141d0036a20034280e90f102d024020012802e0024101470d0020012802e40221040b200141c0046a240020040f0b200141e0026a10240b41d4aac10041331021000b965605047f057e0a7f027e047f230041b0086b22022400200241003a00d00620012802002001280204200241d0066a410120012802081001210320012001280208200341016a41014b22036a22043602080240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402003450d0020022d00d0062203410d4b0d0e024020030e0e00090607030a0c080e050d02040b000b200241003a00bc052001280200200141046a280200200241bc056a4101200410012103200141086a22042004280200200341016a41014b22036a22043602002003450d6120022d00bc05220341044b0d61024020030e050029252624000b20022001104a2002280200450d6120022802042203417f4c0d622003450d4d200310ac012205450d6c200141086a2204200341002001280200200141046a280200200520032004280200100122012001417f461b2201200120034b1b220120042802006a36020020012003470d4e0c760b2000410e360200200241b0086a24000f0b200241003a00bc052001280200200141046a280200200241bc056a4101200410012103200141086a22042004280200200341016a41014b22036a3602002003450d2020022d00bc05220341044b0d20024020030e05001f1d1e1c000b200241b0036a2001104c20022903b003a7450d20200241c0036a290300210620022903b8032107200241d0066a200110c20220022d00d00622034102460d20200241ec066a2902002108200241e4066a290200210920022f00d106210120022d00d306210420022902d406210a2002200241dc066a2902003703e8052002200a3703e005200220093703f00520012004411074722101410121040c1f0b41002103200241003a00bc052001280200200141046a280200200241bc056a4101200410012104200141086a220b200b280200200441016a41014b22046a220b3602002004450d5120022d00bc050d51200241e8066a220c4200370300200241e0066a4200370300200241d0066a41086a220d4200370300200242003703d006200141086a220341002001280200200141046a220e280200200241d0066a4120200b100122042004417f461b2204412020044120491b20032802006a220f3602002004411f4d0d50200241e0056a41086a200d290300370300200220022903d0063703e005200c290300210620022903e0062107200220022f00e1053b01bc0520022d00e005210420022800e305210b20022800e705211020022800eb05211120022d00ef052105200220022f01bc053b01f804200c4200370300200d4200370300200242003703e006200242003703d006200341002001280200200e280200200241d0066a4120200f1001220c200c417f461b220c4120200c4120491b20032802006a360200200c411f4d0d50200241e0056a41086a200241d0066a41086a290300370300200220022903d0063703e005200241e8066a2903002108200241e0066a2903002109200220022f00e10522033b01bc05200241eb056a280000210c200241ef056a2d0000210d20022d00e005210e20022800e305210f20022800e7052112200220033b019805200220033b01de05200220022f01f8043b01b00420024180016a2001104a200228028001450d502002280284012213417f4c0d5f2013450d4e201310ac012203450d6b200141086a2214201341002001280200200141046a280200200320132014280200100122012001417f461b2201200120134b1b220120142802006a36020020012013470d4f0c710b200241c0076a200110c00220022d00c0072101200241d0066a200241c0076a41017241e7001094041a20014107470d0b2000410e360200200241b0086a24000f0b200241003a00d0062001280200200141046a280200200241d0066a4101200410012103200141086a22042004280200200341016a41014b22036a3602002003450d6e20022d00d006450d0c0c6e0b200241003a00d0062001280200200141046a280200200241d0066a4101200410012103200141086a22012001280200200341016a41014b6a3602002000410e360200200241b0086a24000f0b200241003a00bc052001280200200141046a280200200241bc056a4101200410012103200141086a22042004280200200341016a41014b22036a3602002003450d0f20022d00bc0522034101460d0d20030d0f200241c0076a200110c20220022d00c00722034102460d0f20022d00c307211020022f00c1072111200241cc076a2902002106200241dc076a2902002107200241d8076a2802002104200241d4076a280200210b20022902c4072108200241386a2001104c2002280238450d0f20112010411074722101200241386a41106a2903002109410121102002290340210a0c0e0b200241003a00bc052001280200200141046a280200200241bc056a4101200410012103200141086a22042004280200200341016a41014b22036a3602002003450d3320022d00bc05220341094b0d33024020030e0a00272425222a2b262d23000b200241d0066a200110a60220022802d0062203450d3320022902d406210620024188026a2001104a2006a72104200228028802450d32200228028c022110200141046a2802002111200141086a220b2802002105200241003602d006200b410020012802002011200241d0066a41042005100122012001417f461b2201410420014104491b200b2802006a360200200141034d0d3220064220882106200441087621012003410876210c20022802d006210d4101210e0c270b200241003a00d0062001280200200141046a280200200241d0066a4101200410012103200141086a22042004280200200341016a41014b22036a3602002003450d6920022d00d006450d090c690b200241003a00bc054104210b2001280200200141046a280200200241bc056a4101200410012103200141086a22042004280200200341016a41014b22036a22103602002003450d5220022d00bc05220d410c4b0d520240200d0e0d00383a51343c3d3b3e363f3335000b200241d0066a200110c20220022d00d00622044102460d5220022d00d306211020022f00d106210c200241dc066a2902002106200241ec066a2902002107200241e8066a2802002111200241e4066a280200210320022902d406210820024188016a2001104c200229038801a7450d5220024188016a41106a290300210a2002290390012109200241003a00bc052001280200200141046a280200200241bc056a4101200141086a22012802001001210b20012001280200200b41016a41014b220b6a360200200b450d5220022d00bc05220541034f0d52200c201041107472210c4101210b0c500b200241003a00d0062001280200200141046a280200200241d0066a4101200410012103200141086a22042004280200200341016a41014b22036a3602002003450d0d20022d00d00622034101460d0c20030d0d200241c0076a2001102f20022802c0072103200241d0066a200241c0076a41047241ec001094041a2003410e460d0d200241e0056a200241d0066a41ec001094041a41f00010262201450d5d20012003360200200141046a200241e0056a41ec001094041a20024198056a41186a200241bc056a41186a29020037030020024198056a41106a200241bc056a41106a29020037030020024198056a41086a200241bc056a41086a290200370300200220022902bc053703980520014108762104410121030c1c0b200241d0066a20011049200220022f01d2063b01e0052002200241f2066a2f01003b01bc0520022d00d00622014111470d042000410e360200200241b0086a24000f0b200241003a00d0062001280200200141046a280200200241d0066a4101200410012103200141086a22042004280200200341016a41014b22036a3602002003450d6420022d00d006450d060c640b200241003a00bc05410421032001280200200141046a280200200241bc056a4101200410012104200141086a220b200b280200200441016a41014b22046a220b3602002004450d0d20022d00bc0522044102460d0c20044101460d0b20040d0d200241c0076a2001102f4104210320022802c0072101200241d0066a200241c0076a41047241ec001094041a2001410e460d0d200241e0056a200241d0066a41ec001094041a41f00010262204450d5c20042001360200200441046a200241e0056a41ec001094041a200220022f0198053b01de05200220022f01bc053b01ae04410121030c0e0b2000410e360200200241b0086a24000f0b200241e0056a200241d0066a41e7001094041a200041086a20013a00002000410c360200200041096a200241e0056a41e7001094041a200241b0086a24000f0b200241d0066a41196a2900002106200241d0066a41116a2900002107200241d0066a41216a2d00002103200241d0066a41106a2d00002104200241d0066a410c6a280200210b200241d0066a41086a280200211020022802d406211120022d00d1062105200220022f01e0053b01b004200220022f01bc053b019805200241f4066a280200210c200041216a2006370000200041196a2007370000200020053a0009200041086a20013a000020004106360200200020033a0029200041186a20043a0000200041146a200b360200200041106a20103602002000410c6a20113602002000412c6a200c360200200020022f01b0043b000a200020022f0198053b012a200041306a20022903c007370300200041386a200241c0076a41086a290300370300200041c0006a200241c0076a41106a290300370300200041c8006a200241c0076a41186a290300370300200041d0006a200241e0076a290300370300200041d8006a200241e8076a290300370300200041e0006a200241c0076a41306a290300370300200041e8006a200241c0076a41386a290300370300200241b0086a24000f0b20024198036a2001104b200229039803a7450d6120022903a003210620004109360200200041086a2006370300200041106a200241c0076a41e0001094041a200241b0086a24000f0b200241286a2001104b2002290328a7450d5f2002290330210620004101360200200041086a2006370300200041106a200241c0076a41e0001094041a200241b0086a24000f0b200241a8036a2001104a20022802a803450d5d20022802ac032203417f4c0d4e2003450d24200310ac012204450d55200141086a220b200341002001280200200141046a28020020042003200b280200100122012001417f461b2201200120034b1b2201200b2802006a36020020012003470d250c5c0b200241c0076a200110c20220022d00c00722034102460d0120022d00c307211020022f00c1072111200241cc076a2902002106200241dc076a2902002107200241d8076a2802002104200241d4076a280200210b20022902c4072108200241e8006a2001104c2002290368a7450d01200241e8006a41106a29030021092002290370210a200241d0006a2001104c2002290350a7450d0120112010411074722101200241e0006a290300211520022903582116410221100b200020013b000d200041033602002000410f6a20014110763a0000200041c8006a2015370200200041c0006a2016370200200041386a2009370200200041306a200a370200200041186a2006370000200041106a2008370000200041286a2007370000200041246a2004360000200041206a200b3600002000410c6a20033a0000200041086a2010360200200041d0006a20022903d006370300200041d8006a200241d0066a41086a290300370300200041e0006a200241d0066a41106a290300370300200041e8006a200241d0066a41186a290300370300200241b0086a24000f0b2000410e360200200241b0086a24000f0b200241c0076a200110c202200241d0066a41086a220b200241cc076a290200370300200241d0066a41106a2210200241d4076a290200370300200241d0066a41186a2211200241dc076a290200370300200220022902c4073703d0064102210320022d00c00722014102470d0e0b2000410e360200200241b0086a24000f0b20024188036a2001104a200228028803450d01200228028c032104200241c0076a2001102f4104210320022802c0072101200241d0066a200241c0076a41047241ec001094041a2001410e460d01200241e0056a200241d0066a41ec001094041a41f0001026220b450d51200b2001360200200b41046a200241e0056a41ec001094041a200220022f0198053b01de05200220022f01ce053b01ae04410221030c020b200241e8066a22114200370300200241e0066a4200370300200241d0066a41086a4200370300200242003703d00641042103200141086a221041002001280200200141046a280200200241d0066a4120200b100122042004417f461b2204412020044120491b20102802006a3602002004411f4d0d00200220022f00d1063b01bc052011290300210720022903e006210620022d00d006210520022800d306210420022800d706210b20022800db06211020022d00df062111200220022f01bc053b01980520024190036a2001104a200228029003450d00200228029403210c200241003a00c007410421032001280200200141046a280200200241c0076a4101200141086a22012802001001210d20012001280200200d41016a41014b220d6a360200200d450d0020022d00c0072101200220022f01980522033b01f804200220033b01de05410321030c010b0b200220022f01de053b01e005200220022f01ae043b01bc05024020034104470d002000410e360200200241b0086a24000f0b200220022f01e0053b01ac04200220022f01bc053b01aa042000411d6a2007370000200041156a2006370000200020053a0005200020033a000420004108360200200020013a0025200041146a20113a0000200041106a20103602002000410c6a200b360200200041086a2004360200200041286a200c360200200020022f01ac043b0006200020022f01aa043b01262000412c6a200241b0046a41c4001094041a200241b0086a24000f0b200241a0046a2001104a20022802a004450d0420022802a4042203410876210141052104420021080c030b20024190046a2001104a200228029004450d032002280294042103200241f8036a2001104c20022903f803a7450d0320024188046a29030021062002290380042107200241e8036a2001104b20022903e803a7450d0320022903f0032108200241e0036a2001104a20022802e003450d0320022802e4032101200241f0056a2006370300200220073703e805200220013602e00520034108762101410321040c020b20024198046a2001104a200228029804450d02200228029c042203410876210141042104420021080c010b200241c8036a2001104c20022903c803a7450d01200241d8036a2903002106200220022903d0033703e005200220063703e805410221040b200241d0066a41106a200241e0056a41106a2903002209370300200241d0066a41086a200241e0056a41086a290300220a370300200241b0046a41086a220b200a370300200241b0046a41106a22102009370300200220022903e00522093703b004200220093703d006200041386a2006370200200041306a20073702002000410c6a2001410874200341ff017172360200200041086a20043602002000410b360200200041286a2008370200200041106a20022903b004370200200041186a200b290300370200200041206a2010290300370200200041c0006a20022903c007370300200041c8006a200241c0076a41086a290300370300200041d0006a200241c0076a41106a290300370300200041d8006a200241c0076a41186a290300370300200041e0006a200241c0076a41206a290300370300200041e8006a200241c0076a41286a290300370300200241b0086a24000f0b200241d0066a41106a200241e0056a41106a290300370300200241d0066a41086a200241e0056a41086a290300370300200220022903e0053703d0062000410e360200200241b0086a24000f0b200241d0066a200110a80220022802d0062205450d3d20022902d4062106410521010c530b200241086a2001104a2002280208450d3c200228020c2203417f4c0d3d2003450d26200310ac012205450d48200141086a2204200341002001280200200141046a280200200520032004280200100122012001417f461b2201200120034b1b220120042802006a36020020012003470d270c4a0b200241206a2001104a2002280220450d3b20022802242214ad42187e2206422088a70d3c2006a72203417f4c0d3c2003450d292003102622050d2a20034104102a000b20022f00c10720022d00c30741107472210420024198056a41186a201129030037030020024198056a41106a201029030037030020024198056a41086a200b290300370300200220022903d006370398050b200241f8046a41186a220b20024198056a41186a290300370300200241f8046a41106a221020024198056a41106a290300370300200241f8046a41086a221120024198056a41086a29030037030020022002290398053703f804200041086a2004410874200141ff017172360200200020033602042000410d3602002000410c6a20022903f804370200200041146a20112903003702002000411c6a2010290300370200200041246a200b2903003702002000412c6a200241b0046a41c4001094041a200241b0086a24000f0b200242003703d006200141086a220341002001280200200141046a280200200241d0066a41082004100122012001417f461b2201410820014108491b20032802006a360200200141074d0d3820022903d0062106410221010c4e0b200241b8026a2001104a20022802b802450d1120022802bc022203410876210c4105210e0c090b200241f8026a2001104b20022903f802a7450d10200229038003220742208821062007a722044108762101410a210e0c0a0b200241a8026a2001104a20022802a802450d0f20022802ac022103200241d0066a200110c20220022d00d00622044102460d0f20022d00d306211020022f00d1062111200241dc066a2902002109200241ec066a2902002107200241e8066a280200210c200241e4066a280200210b20022902d4062106200241a0026a2001104a20022802a002450d0f20022802a402210520024198026a2001104a200228029802450d0f20112010411074722101200228029c02210d2002200c3602e0052003410876210c2006422088a72110200220073702e4052007422088a7210f2009422088a7211120022903e0052107200dad21082009a7210d420021094103210e0c0b0b200241b0026a2001104a20022802b002450d0e20022802b4022203410876210c4104210e0c060b200241d0066a200110c20220022d00d00622034102460d0d20022902d406220742208821064108210e2007a72204410876210120022f00d10620022d00d30641107472210c200241dc066a2902002208422088a7210d200241e4066a2802002111200241e8066a280200210b200241ec066a29020021072008a721100c020b200241d0066a200110a60220022802d0062203450d0c20022902d406210620024190026a2001104a2006a72104200228029002450d0b2002280294022110200141046a2802002111200141086a220b2802002105200241003602d006200b410020012802002011200241d0066a41042005100122012001417f461b2201410420014104491b200b2802006a360200200141034d0d0b20064220882106200441087621012003410876210c20022802d006210d4102210e0b0b0c060b200241d0066a200110c20220022d00d00622034102460d0920022d00d306210420022f00d1062110200241dc066a290200210a200241ec066a2902002107200241e8066a280200210b200241e4066a280200211120022902d4062116200241c8026a2001104c20022903c802a7450d09200241c8026a41106a290300210920022903d0022108200241c0026a2001104a20022802c002450d092010200441107472210c20022802c402210f201642208821062016a722044108762101200a422088a7210d200aa721104106210e0c050b200241e0026a2001104a20022802e002450d0820022802e4022203410876210c4107210e0b42002106410021010c020b200241e8026a2001104b20022903e802a7450d0620022903f002220742208821062007a7220441087621014109210e0b0b0b20004107360200200041c0006a2009370200200041386a2008370200200041346a2005360200200041306a200f360200200041286a2007370200200041246a200b360200200041206a20113602002000411c6a200d360200200041186a2010360200200041086a200e360200200041c8006a20022903c0073703002000410c6a200c410874200341ff017172360200200041d0006a200241c0076a41086a290300370300200041d8006a200241c0076a41106a290300370300200041e0006a200241c0076a41186a290300370300200041e8006a200241c0076a41206a290300370300200041106a20064220862001ad42ffffff07834208862004ad42ff01838484370200200241b0086a24000f0b410121042001280200200141046a28020041014100200141086a28020010011a41002003460d370b2003450d37200410230c370b2004450d00200310230b2000410e360200200241b0086a24000f0b20024180026a2001104a200228028002450d1f2002280284022104200220022f0198053b01b0042004410876210c410c210b0c030b200241e8016a2001104a20022802e801450d1e20022802ec012103200241d0016a2001104c20022903d001a7450d1e200241e0016a290300210620022903d8012108200220022f01d0063b01b0044105210b4100210c0c040b200241d0066a2001102820022802d0062204450d1d20022902d4062108200220022f0198053b01b0042004410876210c410d210b0c180b200241f8016a2001104a20022802f801450d1c20022802fc012104200220022f01d0063b01b0042004410876210c410a210b0b420021060c090b200241a0016a2001104c20022903a001a7450d1a200241b0016a290300210620022903a8012108200220022f01d0063b01b00420022802e005210320022802e405211120022903e80521074102210b4100210c0b0c160b200241b8016a2001104c20022903b801a7450d18200241c8016a290300210620022903c0012108200220022f01e0053b01b004200241e8066a290300210a20022903e006210920022802d006210320022802d406211120022903d80621074103210b4100210c0c150b200241003a00bc052001280200200141046a280200200241bc056a4101201010012103200141086a22012001280200200341016a41014b22016a3602002001450d1720022d00bc05220541034f0d17200220022f01d0063b01b0044108210b420021064100210c0c150b200241f0016a2001104a20022802f001450d1620022802f4012213ad42247e2206422088a70d1c2006a72203417f4c0d1c2003450d0f2003102622040d1020034104102a000b4107210b0c020b200241d0066a200110c20220022d00d00622044102460d14200241dc066a290200210620022902d4062108200241e4066a2802002103200241e8066a2802002111200241ec066a290200210720022f00d106210120022d00d306210b200220022f01e0053b01b0042001200b41107472210c4109210b0c110b410b210b0b0b0c0d0b410121052001280200200141046a28020041014100200141086a28020010011a41002003460d230b20030d130c140b410121052001280200200141046a28020041014100200141086a28020010011a41002003460d280b20030d110c120b410421050b024002402014450d0042002106200141086a2111200141046a21124100210d4100210341002110201421130340200241186a2001104a2002280218450d11200228021c220b417f4c0d1402400240200b450d00200b10ac01220e450d1b2011200b410020012802002012280200200e200b2011280200100122042004417f461b22042004200b4b1b220420112802006a3602002004200b460d010c120b4101210e2001280200201228020041014100201128020010011a4100200b470d110b200241106a2001104a2002280210450d1020022802142204417f4c0d14024002402004450d00200410ac01220f450d1a20112004410020012802002012280200200f200420112802001001220c200c417f461b220c200c20044b1b220c20112802006a360200200c2004460d010c110b4101210f2001280200201228020041014100201128020010011a41002004470d100b201041016a210c024020102013470d00200d200c200c200d491b2213ad42187e2207422088a70d162007a722174100480d1602402010450d00200520032017102722050d010c180b201710262205450d170b200520036a2210200e360200201041146a2004360200201041106a20043602002010410c6a200f360200201041046a200bad220742208620078437020020064280808080107c2106200d41026a210d200341186a2103200c2110200c2014490d000c020b0b41002113420021060b2005450d1020062013ad842106410421010c260b410121032001280200200141046a28020041014100200141086a28020010011a41002013460d220b2013450d00200310230b410021030b0c200b410421040b024002402013450d0042002106200241d0066a410c6a2114200241d0066a411c6a2117200241d0066a41186a2118200241d0066a41146a2119410021114100211041002103201321120340200241d0066a200110c20220022d00d00622054102460d07200341016a210b20022d00d306210c20022f00d106210d20142902002107201729020021082018280200210e2019280200210f20022902d4062109024020032012470d002011200b200b2011491b2212ad42247e220a422088a70d10200aa7221a4100480d1002402003450d0020042010201a102722040d010c130b201a10262204450d120b200420106a220320053a0000200341036a200d200c4110747222054110763a0000200341016a20053b00002003410c6a2007370000200341046a20093700002003411c6a2008370000200341186a200e360000200341146a200f36000020064280808080107c2106201141026a2111201041246a2110200b2103200b2013490d000c020b0b41002112420021060b2004450d0520062012ad842108200220022f01e0053b01b0042004410876210c4106210b0b0b0b0b200220022f01b00422013b01d006200220013b01f804200041386a200a370000200041306a2009370000200041186a2006370000200041106a2008370000200020053a0009200041086a200b3a000020004105360200200041286a2007370000200041246a2011360000200041206a20033600002000410c6a200c410874200441ff017172360000200020022f01f8043b000a200041c0006a20022903c007370300200041c8006a200241c0076a41086a290300370300200041d0006a200241c0076a41106a290300370300200041d8006a200241c0076a41186a290300370300200041e0006a200241c0076a41206a290300370300200041e8006a200241c0076a41286a290300370300200241b0086a24000f0b2012450d00200410230b200220022f01b0043b01d0062000410e360200200241b0086a24000f0b2004450d00200f10230b200b450d00200e10230b02402010450d002005210103400240200141046a280200450d00200128020010230b0240200141106a280200450d002001410c6a28020010230b200141186a2101200341686a22030d000b0b2013450d010b200510230b2000410e360200200241b0086a24000f0b101d000b101e000b20174104102a000b201a4104102a000b20044101102a000b200b4101102a000b41f0004108102a000b20034101102a000b41f0004108102a000b41f0004108102a000b20034101102a000b20034101102a000b20134101102a000b2003ad22064220862006842106410321010c070b200020043602042000410a360200200041086a2003ad2206422086200684370200200041106a200241c0076a41e0001094041a200241b0086a24000f0b2000410e360200200241b0086a24000f0b2000410e360200200241b0086a24000f0b2000410e360200200241b0086a24000f0b200220022f01b0043b01ae04200220022f01de053b01ac042013ad220a422086200a84210a0b200220022f01ae043b01d006200220022f01ac043b01e00502402003450d00200220022f01d0063b01aa04200220022f01e0053b01a804200041286a2006370000200041206a2007370000200041c8006a2008370000200041c0006a2009370000200041106a20043a0000200041086a200a3702002000200336020420004104360200200041306a200e3a0000200020053a001f2000201136001b200041176a2010360000200041136a200b3600002000200d3a003f2000200c36003b200041376a2012360000200041336a200f360000200020022f01aa043b0011200020022f01a8043b0031200041e8006a200241d8076a290300370300200041e0006a200241c0076a41106a290300370300200041d8006a200241c0076a41086a290300370300200041d0006a20022903c007370300200241b0086a24000f0b2000410e360200200241b0086a24000f0b2003ad22064220862006842106410121010b20004100360200200041106a20063702002000410c6a2005360200200041086a2001360200200041186a200241c0076a41d8001094041a200241b0086a24000bd20201047f230041d0006b22022400024002400240411310262203450d002003410f6a41002800e28740360000200341086a41002900db8740370000200341002900d3874037000020034113412610272203450d0120032001360013200241306a41186a22014200370300200241306a41106a22044200370300200241306a41086a220542003703002002420037033020034117200241306a1002200241186a2001290300370300200241106a2004290300370300200241086a200529030037030020022002290330370300024002402002412041a886c500410041001001417f460d002002422037022420022002360220200241306a200241206a102820022802302201450d0420002002290234370204200020013602000c010b20004100360208200042013702000b20031023200241d0006a24000f0b41134101102a000b41264101102a000b41d4aac10041331021000ba70301047f230041c0006b22022400024002400240411010262203450d00200341086a410029009886403700002003410029009086403700002001280200210420034110412010272203450d01200320043600102003412041c00010272203450d02200320012900043700142003412c6a2001411c6a290000370000200341246a200141146a2900003700002003411c6a2001410c6a290000370000200241206a41186a22014200370300200241206a41106a22044200370300200241206a41086a220542003703002002420037032020034134200241206a1002200241186a2001290300370300200241106a2004290300370300200241086a200529030037030020022002290320370300410021010240024002402002412041a886c500410041001001417f460d00200241003a002020024120200241206a41014100100141016a41014d0d0220022d0020220441ff0071220141064f0d02200441077621040c010b410021040b20031023200020013a0001200020043a0000200241c0006a24000f0b41d4aac10041331021000b41104101102a000b41204101102a000b41c0004101102a000bb81604047f047e107f087e230041b0046b22052400024002400240024002400240024002400240024002402004450d0020054190046a41186a2206420037030020054190046a41106a2207420037030020054190046a41086a22084200370300200542003703900441e687c000411d20054190046a1002200541e8026a41186a2006290300370300200541e8026a41106a2007290300370300200541e8026a41086a200829030037030020052005290390043703e802410021070240200541e8026a412041a886c500410041001001417f460d00200541d0036a41186a4200370300200541d0036a41106a4200370300200541d0036a41086a4200370300200542003703d003200541e8026a4120200541d0036a4120410010012206417f460d0a2006411f4d0d0a200541a0026a41186a200541d0036a41186a290300370300200541a0026a41106a200541d0036a41106a290300370300200541a0026a41086a200541d0036a41086a290300370300200520052903d0033703a002410121070b412810262206450d0a200620073a0004200641a886c500360200200620052903a002370005200620052f00e8023b00252006410d6a200541a8026a290300370000200641156a200541b0026a2903003700002006411d6a200541b8026a290300370000200641276a200541ea026a2d00003a0000200541a0026a20061033420021094200210a4200210b4200210c20052d00e0024106460d022004417f6a210d200541e8026a41206a2108200541e8026a41c0006a220e2002460d01200541e8026a41186a210f200541e8026a41106a2110200541c8036a2111200341ff017121124200210b4200210c420021094200210a0340200f200c3703002010200b370300200520093703e8022005200a3703f0022008200541a0026a41c10010940421040240200e200241201096040d00200541f0036a41186a2213200441186a2214290200370300200541f0036a41106a2215200441106a2216290200370300200541f0036a41086a2217200441086a2218290200370300200520042902003703f003411010262207450d06200741086a4100290098864037000020074100290090864037000020074110412010272207450d09200720013600102007412041c00010272207450d0a200720052903f0033700142007412c6a2013290300370000200741246a20152903003700002007411c6a201729030037000020054190046a41186a2219420037030020054190046a41106a221a420037030020054190046a41086a221b420037030020054200370390042007413420054190046a1002200541d0036a41186a2019290300370300200541d0036a41106a201a290300370300200541d0036a41086a201b29030037030020052005290390043703d003200541d0036a412041a886c500410041001001211c20071023201c417f470d0020112d00002107201320142900003703002015201629000037030020172018290000370300200520042900003703f00302404100417f4101200720124b1b20072012461b41016a41014b0d00200321070b20054190026a200541f0036a103420054190026a41086a290300211d200529039002211e02400240200741ff0171450d00200541d0016a201d42002007ad42ff0183221f4200109804200541e0016a201e4200201f420010980420192013290300370300201a2015290300370300201b2017290300370300200520052903f00337039004200541f0016a200120054190046a2007200d1032200541c0016a42004200201e4200109804427f200541e0016a41086a290300221f20052903d00120052903c0017c7c222020052903d80120052903c801844200522020201f547222041b2120427f20052903e00120041b211f200541f0016a41186a2903002121200541f0016a41086a2903002122200529038002212320052903f00121240c010b20054190016a201e201d420a420010970420192013290300370300201a2015290300370300201b2017290300370300200520052903f00337039004200541a0016a200120054190046a4100200d1032200541a0016a41186a2903002121200541a0016a41086a290300212220052903b001212320052903a0012124200529039001221f211e20054190016a41086a2903002220211d0b201d200c7c201e200b7c220c201e54ad7c20217c200c20237c220b200c54ad7c210c2020200a7c201f20097c220a201f54ad7c20227c200a20247c2209200a54ad7c210a0b200541a0026a20061033200541a0026a41c0006a2d00004106470d000c030b0b4200210b4200210c420021094200210a0c020b200541c8036a211a200341ff017121194200210b4200210c420021094200210a0340200541e8026a41186a200c370300200541e8026a41106a200b370300200520093703e8022005200a3703f0022008200541a0026a41c100109404210f200541f0036a41186a2207200541a0026a41186a290300370300200541f0036a41106a2202200541a0026a41106a290300370300200541f0036a41086a220e200541a0026a41086a290300370300200520052903a0023703f003411010262204450d03200441086a4100290098864037000020044100290090864037000020044110412010272204450d04200420013600102004412041c00010272204450d05200420052903f0033700142004412c6a2007290300370000200441246a20022903003700002004411c6a200e29030037000020054190046a41186a2210420037030020054190046a41106a2213420037030020054190046a41086a2215420037030020054200370390042004413420054190046a1002200541d0036a41186a2010290300370300200541d0036a41106a2013290300370300200541d0036a41086a201529030037030020052005290390043703d003200541d0036a412041a886c50041004100100121172004102302402017417f470d00201a2d000021042007200f41186a2900003703002002200f41106a290000370300200e200f41086a2900003703002005200f2900003703f00302404100417f4101200420194b1b20042019461b41016a41014b0d00200321040b20054180016a200541f0036a103420054180016a41086a290300211d200529038001211e02400240200441ff0171450d00200541c0006a201d42002004ad42ff0183221f4200109804200541d0006a201e4200201f420010980420102007290300370300201320022903003703002015200e290300370300200520052903f00337039004200541e0006a200120054190046a2004200d1032200541306a42004200201e4200109804427f200541d0006a41086a290300221f200529034020052903307c7c222020052903482005290338844200522020201f547222041b2120427f200529035020041b211f200541e0006a41186a2903002121200541e0006a41086a290300212220052903702123200529036021240c010b2005201e201d420a420010970420102007290300370300201320022903003703002015200e290300370300200520052903f00337039004200541106a200120054190046a4100200d1032200541106a41186a2903002121200541106a41086a290300212220052903202123200529031021242005290300221f211e200541086a2903002220211d0b201d200c7c201e200b7c220c201e54ad7c20217c200c20237c220b200c54ad7c210c2020200a7c201f20097c220a201f54ad7c20227c200a20247c2209200a54ad7c210a0b200541a0026a20061033200541a0026a41c0006a2d00004106470d000b0b200610230b2000200b37031020002009370300200041186a200c3703002000200a370308200541b0046a24000f0b41104101102a000b41204101102a000b41c0004101102a000b41204101102a000b41c0004101102a000b41d4aac10041331021000b41284104102a000b8d0903037f047e067f230022022103200241e0026b416071220224002001411c6a22042902002105200420022903f801370200200141146a22042902002106200420022903f0013702002001410c6a22042902002107200420022903e801370200200241003a00e00120012902042108200120022903e00137020420022005370378200220063703702002200737036820022008370360200141246a2d00002109200241e0016a41176a22042002290078370000200241e0016a41106a220a2002290071370300200241e0016a41086a220b2002290069370300200220022900613703e001024002400240024002402008a741ff01714101470d00200241186a41176a2004290000370000200241186a41106a200a290300370300200241186a41086a200b290300370300200220022903e001370318411510262204450d012004410d6a41002900bc8640370000200441086a41002900b78640370000200441002900af864037000020044115413510272204450d0220042002290318370015200420093a00342004412c6a2002412f6a290000370000200441256a200241186a41106a2903003700002004411d6a200241186a41086a290300370000200241e0016a41186a220a4200370300200241e0016a41106a220b4200370300200241e0016a41086a220c4200370300200242003703e00120044135200241e0016a1002200241386a41186a200a290300370300200241386a41106a200b290300370300200241386a41086a200c290300370300200220022903e001370338200241386a412041a886c500410041001001417f460d03200242203702d4012002200241386a3602d001200241e0016a200241d0016a105920022d0081024102460d04200241a8016a41206a220a200241e0016a41206a2d00003a0000200241a8016a41186a220b200241e0016a41186a290300370300200241a8016a41106a220c200241e0016a41106a290300370300200241a8016a41086a220d200241e0016a41086a290300370300200220022903e0013703a801200241e0006a20024182026a41c1001094041a200241386a41206a220e200a2d00003a0000200241386a41186a220a200b290300370300200241386a41106a220b200c290300370300200241386a41086a220c200d290300370300200220022903a801370338200241e0016a200241e0006a41c1001094041a200141246a200241e0016a41c0006a2d00003a00002001411c6a200241e0016a41386a290000370000200141146a200241e0016a41306a2900003700002001410c6a200241e0016a41286a290000370000200120022900800237000420002002290318370000200041086a200241186a41086a290300370000200041106a200241186a41106a290300370000200041176a200241186a41176a290000370000200020093a001f200041c0006a200e2d00003a0000200041386a200a290300370000200041306a200b290300370000200041286a200c2903003700002000200229033837002020041023200324000f0b200041063a0040200324000f0b41154101102a000b41354101102a000b41faccc40041d7001021000b41d4aac10041331021000ba40604027f017e037f037e230041c0006b22022400024002400240411410262203450d00200341106a41002800f9b641360000200341086a41002900f1b641370000200341002900e9b64137000020034114413410272203450d01200320012900003700142003412c6a200141186a290000370000200341246a200141106a2900003700002003411c6a200141086a29000037000042002104200241206a41186a22054200370300200241206a41106a22064200370300200241206a41086a220742003703002002420037032020034134200241206a1002200241186a2005290300370300200241106a2006290300370300200241086a2007290300370300200220022903203703000240024002402002412041a886c500410041001001417f460d00200242003703282002420037032020024120200241206a4110410010012205417f460d022005410f4d0d02200241286a29030021082002290320210420031023411810262203450d010c050b42002108200310234118102622030d040b41184101102a000b41d4aac10041331021000b41144101102a000b41344101102a000b200341106a410029008db741370000200341086a4100290085b741370000200341002900fdb641370000024020034118413810272203450d0020032001290000370018200341306a200141186a290000370000200341286a200141106a290000370000200341206a200141086a29000037000042002109200241206a41186a22014200370300200241206a41106a22054200370300200241206a41086a220642003703002002420037032020034138200241206a1002200241186a2001290300370300200241106a2005290300370300200241086a2006290300370300200220022903203703000240024002402002412041a886c500410041001001417f460d00200242003703282002420037032020024120200241206a4110410010012201417f460d022001410f4d0d02200241286a290300210a200229032021090c010b4200210a0b200310232000200920047c22043703002000200a20087c2004200954ad7c370308200241c0006a24000f0b41d4aac10041331021000b41384101102a000b8507010d7f230041e0006b220124000240024002400240411a10262202450d00200241186a41002f00dc86403b0000200241106a41002900d48640370000200241086a41002900cc8640370000200241002900c486403700002002411a413410272202450d012002200036001a200141c0006a41186a22034200370300200141c0006a41106a22044200370300200141c0006a41086a22054200370300200142003703402002411e200141c0006a1002200141206a41186a2003290300370300200141206a41106a2004290300370300200141206a41086a200529030037030020012001290340370320200141206a4120100320021023411310262202450d022002410f6a41002800e28740360000200241086a41002900db8740370000200241002900d3874037000020024113412610272202450d0320022000360013200141c0006a41186a22044200370300200141c0006a41106a22054200370300200141c0006a41086a220342003703002001420037034020024117200141c0006a1002200141206a41186a22062004290300370300200141206a41106a22072005290300370300200141206a41086a200329030037030020012001290340370320200141206a4120100320021023200141c0006a200010302001280244210820012802402109024002400240024020012802482202450d002002410574210a200921030340200141186a220b200341186a290000370300200141106a220c200341106a290000370300200141086a220d200341086a29000037030020012003290000370300411010262202450d02200241086a4100290098864037000020024100290090864037000020024110412010272202450d03200220003600102002412041c00010272202450d04200341206a2103200220012903003700142002412c6a200b290300370000200241246a200c2903003700002002411c6a200d2903003700002004420037030020054200370300200141c0006a41086a220b42003703002001420037034020024134200141c0006a10022006200429030037030020072005290300370300200141206a41086a200b29030037030020012001290340370320200141206a4120100320021023200a41606a220a0d000b0b02402008450d00200910230b200141e0006a24000f0b41104101102a000b41204101102a000b41c0004101102a000b411a4101102a000b41344101102a000b41134101102a000b41264101102a000bd20201057f230041d0006b22022400024002400240411710262203450d002003410f6a41002900cb8740370000200341086a41002900c48740370000200341002900bc874037000020034117412e10272203450d0120032001370017200241306a41186a22044200370300200241306a41106a22054200370300200241306a41086a22064200370300200242003703302003411f200241306a1002200241186a2004290300370300200241106a2005290300370300200241086a200629030037030020022002290330370300024002402002412041a886c500410041001001417f460d002002422037022420022002360220200241306a200241206a103720022802302204450d0420002002290234370204200020043602000c010b20004100360208200042083702000b20031023200241d0006a24000f0b41174101102a000b412e4101102a000b41d4aac10041331021000beb0603027f017e0b7f230041c0046b22022400200241086a2001104a02400240024002400240024002400240024002400240024002402002280208450d00200228020c2203ad42f8007e2204422088a70d032004a72205417f4c0d032005450d01200510262206450d042003450d020c050b20004100360200200241c0046a24000f0b4108210620030d030b4100210d4100210b0c030b101d000b20054108102a000b200241d8026a4104722107200141086a210541002108410021094100210a2003210b0340200241003a00c8032001280200200141046a220c280200200241c8036a410120052802001001210d20052005280200200d41016a41014b220d6a360200200d450d040240024020022d00c803220d4101460d00200d0d06200241c8036a20024180016a41ec001094041a410e210c0c010b200241c8036a2001102f20022802c803410e460d04200241d8026a200241c8036a41f0001094041a200c280200210d2005280200210c200241003602bc04200541002001280200200d200241bc046a4104200c1001220d200d417f461b220d4104200d4104491b20052802006a360200200d41034d0d0320022802bc04210e20022802d802210c200241ec016a200741ec001094041a200241c8036a200241ec016a41ec001094041a200c410e460d0520024180016a200241c8036a41ec001094041a200241c8036a20024180016a41ec001094041a200c410f460d060b200a41016a210d200241146a200241c8036a41ec001094041a0240200a200b470d002008200d200d2008491b220bad42f8007e2204422088a70d072004a7220f4100480d070240200a450d0020062009200f102722060d010c090b200f10262206450d080b200620096a220a200c360200200a41046a200241146a41ec001094041a200a41f0006a200e360200200841026a2108200941f8006a2109200d210a200d2003490d000b0b2000200b36020420002006360200200041086a200d360200200241c0046a24000f0b200241d8026a10240b200241c8036a200241ec016a41ec001094041a0b200241c8036a20024180016a41ec001094041a0b200041003602000240200a450d0020062105034002402005280200410e460d00200510240b200541f8006a2105200941887f6a22090d000b0b0240200b450d00200610230b200241c0046a24000f0b101e000b200f4108102a000beb0604047f017e027f017e23004180046b220224000240024002400240411a10262203450d00200341186a41002f00dc86403b0000200341106a41002900d48640370000200341086a41002900cc8640370000200341002900c486403700002003411a413410272203450d012003200136001a200241a0026a41186a22014200370300200241a0026a41106a22044200370300200241a0026a41086a22054200370300200242003703a0022003411e200241a0026a1002200241086a41186a2001290300370300200241086a41106a2004290300370300200241086a41086a2005290300370300200220022903a002370308024002400240200241086a412041a886c500410041001001417f460d002002200241086a3602282002412036022c200242003703a00220024100200241086a4120200241a0026a41084100100122012001417f461b2201410820014108491b360230200141074d0d0620022903a0022106200241a0026a200241286a102f20022802a002210120024194036a200241a0026a41047241ec001094041a2001410e460d06200241b4016a20024194036a41ec001094041a20022001360240200241c0006a410472200241b4016a41ec001094042104200241003a00a0022002280228200228022c200241a0026a4101200241306a22012802001001210520012001280200200541016a41014b22056a22073602002005450d0220022d00a002220541034f0d02200242003703a002200241286a41086a220841002002280228200228022c200241a0026a41082007100122012001417f461b2201410820014108491b20082802006a360200200141074d0d0520022903a002210920022802402101200241a0026a200441ec001094041a20022002413c6a2800003600970320022002280039360294032001410e460d06200241c0006a200241a0026a41ec001094041a20022002280097033600b70120022002280294033602b40120002001360208200020063703002000410c6a200241c0006a41ec001094041a20004180016a20053a0000200041f8006a2009370200200020022802b4013600810120004184016a20022800b7013600000c010b2000410e3602080b2003102320024180046a24000f0b200241c0006a102441d4aac10041331021000b411a4101102a000b41344101102a000b200241c0006a10240b41d4aac10041331021000bc6c00102097f027e230041106b22022400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402000280200417f6a2203410c4b0d00024002400240024002400240024002400240024020030e0d0008050602090b070d040c0103000b200141046a280200200141086a2802002203470d14200341016a22042003490d6220034101742205200420042005491b22054100480d622003450d2920012802002003200510272204450d2a0c600b200141046a280200200141086a2802002203470d0c200341016a22042003490d5a20034101742205200420042005491b22054100480d5a2003450d1a20012802002003200510272204450d1b0c4e0b200141046a2206280200200141086a22042802002203470d0c200341016a22052003490d6020034101742207200520052007491b22074100480d602003450d1b20012802002003200710272205450d1c0c4b0b200141046a280200200141086a2802002203470d0c200341016a22042003490d5820034101742205200420042005491b22054100480d582003450d1c20012802002003200510272204450d1d0c480b200141046a280200200141086a2802002203470d0c200341016a22042003490d5720034101742205200420042005491b22054100480d572003450d1d20012802002003200510272204450d1e0c450b200141046a280200200141086a2802002203470d0c200341016a22042003490d5d20034101742205200420042005491b22054100480d5d2003450d1e20012802002003200510272204450d1f0c420b200141046a280200200141086a2802002203470d0c200341016a22042003490d5c20034101742205200420042005491b22054100480d5c2003450d1f20012802002003200510272204450d200c3f0b200141046a280200200141086a2802002203470d0c200341016a22042003490d5420034101742205200420042005491b22054100480d542003450d2020012802002003200510272204450d210c3c0b200141046a280200200141086a2802002200470d0d200041016a22032000490d5a20004101742204200320032004491b22044100480d5a2000450d2320012802002000200410272203450d240c390b200141046a2206280200200141086a22042802002203470d0d200341016a22052003490d5920034101742207200520052007491b22074100480d592003450d2420012802002003200710272205450d250c360b200141046a280200200141086a2802002203470d0d200341016a22042003490d5820034101742205200420042005491b22054100480d582003450d2520012802002003200510272204450d260c330b200141046a280200200141086a2802002203470d0d200341016a22042003490d5720034101742205200420042005491b22054100480d572003450d2620012802002003200510272204450d270c300b200141046a280200200141086a2802002203470d0d200341016a22042003490d4f20034101742205200420042005491b22054100480d4f2003450d2720012802002003200510272204450d280c2d0b200141046a280200200141086a2802002203470d0d200341016a22042003490d4e20034101742205200420042005491b22054100480d4e2003450d2820012802002003200510272204450d290c2a0b200128020021040c420b200128020021050c3f0b200128020021040c3c0b200128020021040c390b200128020021040c360b200128020021040c330b200128020021040c300b200128020021040c4c0b200128020021030c2c0b200128020021050c290b200128020021040c260b200128020021040c230b200128020021040c200b200128020021040c1d0b2005102622040d330b20054101102a000b2007102622050d2f0b20074101102a000b2005102622040d2b0b20054101102a000b2005102622040d270b20054101102a000b2005102622040d230b20054101102a000b2005102622040d1f0b20054101102a000b2005102622040d1b0b20054101102a000b2005102622040d360b20054101102a000b2004102622030d150b20044101102a000b2007102622050d110b20074101102a000b2005102622040d0d0b20054101102a000b2005102622040d090b20054101102a000b2005102622040d050b20054101102a000b2005102622040d010b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41093a000002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d2720034101742205200420042005491b22054100480d272003450d0120012802002003200510272204450d020c030b200128020021040c030b2005102622040d010b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a0000200041086a2001109802200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a410b3a0000200041086a280200417f6a220341044b0d1602400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020030e050004020301000b200141046a280200200141086a2802002203470d07200341016a22042003490d3d20034101742205200420042005491b22054100480d3d2003450d0f20012802002003200510272204450d100c1b0b200141046a280200200141086a2802002203470d03200341016a22042003490d3c20034101742205200420042005491b22054100480d3c2003450d0820012802002003200510272204450d090c180b200141046a280200200141086a2802002203470d03200341016a22042003490d3b20034101742205200420042005491b22054100480d3b2003450d0920012802002003200510272204450d0a0c150b200141046a280200200141086a2802002203470d03200341016a22042003490d3a20034101742205200420042005491b22054100480d3a2003450d0a20012802002003200510272204450d0b0c120b200141046a280200200141086a2802002203470d04200341016a22042003490d3920034101742205200420042005491b22054100480d392003450d0d20012802002003200510272204450d0e0c0f0b200128020021040c150b200128020021040c120b200128020021040c0f0b200128020021040c140b200128020021040c0b0b2005102622040d0f0b20054101102a000b2005102622040d0b0b20054101102a000b2005102622040d070b20054101102a000b2005102622040d0b0b20054101102a000b2005102622040d010b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a00002002200041106a36020c2002410c6a20011066200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41033a00002000410c6a20011041200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41023a00002000410c6a200110412002200041186a36020c2002410c6a20011066200041286a2001109802200041106a20011041200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41043a00002000410c6a20011041200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a00002002200041306a36020c2002410c6a200110662000410c6a200110ec02200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41073a0000200041086a280200417f6a220341094b0d1402400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020030e0a00060304010708050902000b200141046a280200200141086a2802002203470d0e200341016a22042003490d6020034101742205200420042005491b22054100480d602003450d1d20012802002003200510272204450d1e0c390b200141046a280200200141086a2802002203470d08200341016a22042003490d5820034101742205200420042005491b22054100480d582003450d1220012802002003200510272204450d130c360b200141046a280200200141086a2802002203470d08200341016a22042003490d5720034101742205200420042005491b22054100480d572003450d1320012802002003200510272204450d140c330b200141046a280200200141086a2802002203470d08200341016a22042003490d5620034101742205200420042005491b22054100480d562003450d1420012802002003200510272204450d150c300b200141046a280200200141086a2802002203470d08200341016a22042003490d5520034101742205200420042005491b22054100480d552003450d1520012802002003200510272204450d160c2d0b200141046a280200200141086a2802002203470d08200341016a22042003490d5420034101742205200420042005491b22054100480d542003450d1620012802002003200510272204450d170c2a0b200141046a280200200141086a2802002203470d09200341016a22042003490d5320034101742205200420042005491b22054100480d532003450d1920012802002003200510272204450d1a0c270b200141046a280200200141086a2802002203470d09200341016a22042003490d5220034101742205200420042005491b22054100480d522003450d1a20012802002003200510272204450d1b0c240b200141046a280200200141086a2802002203470d09200341016a22042003490d5120034101742205200420042005491b22054100480d512003450d1b20012802002003200510272204450d1c0c210b200141046a280200200141086a2802002203470d09200341016a22042003490d5020034101742205200420042005491b22054100480d502003450d1c20012802002003200510272204450d1d0c1e0b200128020021040c2e0b200128020021040c2b0b200128020021040c280b200128020021040c250b200128020021040c220b200128020021040c2b0b200128020021040c1e0b200128020021040c1b0b200128020021040c180b200128020021040c150b2005102622040d230b20054101102a000b2005102622040d1f0b20054101102a000b2005102622040d1b0b20054101102a000b2005102622040d170b20054101102a000b2005102622040d130b20054101102a000b2005102622040d1b0b20054101102a000b2005102622040d0d0b20054101102a000b2005102622040d090b20054101102a000b2005102622040d050b20054101102a000b2005102622040d010b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41083a0000200041106a2001109802200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41063a00002000410c6a20011041200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41053a00002000410c6a200110ec022002200041386a36020c2002410c6a20011066200041306a20011041200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a00002000410c6a28020021042002200041146a280200220736020c2002410c6a2001104102400240024002402007450d00200141046a210903400240024002400240200928020020052802002203470d00200341016a22062003490d332003410174220a20062006200a491b220a4100480d332003450d0120012802002003200a102722060d020c060b200128020021060c020b200a10262206450d040b200120063602002009200a360200200528020021030b2005200341016a360200200620036a20042d00003a0000200441016a21042007417f6a22070d000b0b200041186a200110412000411c6a2802002104024002400240200141046a2802002203200528020022006b41044f0d00200041046a22052000490d3020034101742200200520052000491b22004100480d302003450d0120012802002003200010272203450d020c040b200128020021030c040b2000102622030d020b20004101102a000b200a4101102a000b20012003360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200320006a2004360000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41073a00002000410c6a200110ec02200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41033a00002000410c6a20011041200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41023a00002000410c6a20011041200041106a200110ec02200041346a20011041200041386a20011041200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41093a0000200041106a2001109802200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41043a00002000410c6a20011041200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a00002000410c6a28020021042002200041146a280200220736020c2002410c6a2001104102400240024002402007450d00200141046a210903400240024002400240200928020020052802002203470d00200341016a22062003490d272003410174220a20062006200a491b220a4100480d272003450d0120012802002003200a102722060d020c060b200128020021060c020b200a10262206450d040b200120063602002009200a360200200528020021030b2005200341016a360200200620036a20042d00003a0000200441016a21042007417f6a22070d000b0b200041186a200110412000411c6a2802002104024002400240200141046a2802002203200528020022006b41044f0d00200041046a22052000490d2420034101742200200520052000491b22004100480d242003450d0120012802002003200010272203450d020c040b200128020021030c040b2000102622030d020b20004101102a000b200a4101102a000b20012003360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200320006a2004360000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a0000200041086a280200417f6a220341044b0d1202400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020030e050004020301000b200141046a280200200141086a2802002203470d07200341016a22042003490d4020034101742205200420042005491b22054100480d402003450d0f20012802002003200510272204450d100c1b0b200141046a280200200141086a2802002203470d03200341016a22042003490d3f20034101742205200420042005491b22054100480d3f2003450d0820012802002003200510272204450d090c180b200141046a280200200141086a2802002203470d03200341016a22042003490d3e20034101742205200420042005491b22054100480d3e2003450d0920012802002003200510272204450d0a0c150b200141046a280200200141086a2802002203470d03200341016a22042003490d3d20034101742205200420042005491b22044100480d3d2003450d0a20012802002003200410272205450d0b0c120b200141046a280200200141086a2802002203470d04200341016a22042003490d3c20034101742205200420042005491b22054100480d3c2003450d0d20012802002003200510272204450d0e0c0f0b200128020021040c150b200128020021040c120b200128020021050c0f0b200128020021040c140b200128020021040c0b0b2005102622040d0f0b20054101102a000b2005102622040d0b0b20054101102a000b2004102622050d070b20044101102a000b2005102622040d0b0b20054101102a000b2005102622040d010b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a0000200041106a290300210b02400240024002400240200141046a2802002203200528020022006b41084f0d00200041086a22042000490d3020034101742200200420042000491b22004100480d302003450d0120012802002003200010272203450d020c030b200128020021030c030b2000102622030d010b20004101102a000b20012003360200200141046a2000360200200141086a28020021000b200141086a200041086a360200200320006a200b370000200241106a24000f0b20012005360200200141046a2004360200200141086a28020021030b200141086a2204200341016a360200200520036a41033a00002000410c6a28020021032002200041146a280200220036020c2002410c6a200110412000450d182003200041186c6a2108200141046a2106024002400340200328020021092002200341086a280200220036020c2002410c6a20011041024002400240024020062802002207200428020022056b20004f0d00200520006a220a2005490d3020074101742205200a200a2005491b22054100480d302007450d01200128020020072005102722070d020c050b200128020021070c020b200510262207450d030b2001200736020020062005360200200428020021050b2004200520006a360200200720056a200920001094041a2003410c6a28020021092002200341146a280200220036020c2002410c6a20011041024002400240024020062802002207200428020022056b20004f0d00200520006a220a2005490d3020074101742205200a200a2005491b22054100480d302007450d01200128020020072005102722070d020c060b200128020021070c020b200510262207450d040b2001200736020020062005360200200428020021050b2004200520006a360200200720056a200920001094041a200341186a22032008470d000c1b0b0b20054101102a000b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a00002000410c6a28020021062002200041146a280200220036020c2002410c6a2001104102400240024002400240200141046a2802002204200528020022036b20004f0d00200320006a22052003490d2c20044101742203200520052003491b22034100480d2c2004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200320006a360200200420036a200620001094041a200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41043a00002000410c6a28020021042002200041146a280200220036020c2002410c6a200110412000450d1420042000410c6c6a2108200141046a210902400340200428020021072002200441086a280200220036020c2002410c6a20011041024002400240024020092802002206200528020022036b20004f0d00200320006a220a2003490d2b20064101742203200a200a2003491b22034100480d2b2006450d01200128020020062003102722060d020c050b200128020021060c020b200310262206450d030b2001200636020020092003360200200528020021030b2005200320006a360200200620036a200720001094041a2004410c6a22042008470d000c160b0b20034101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a00002000410c6a28020021062002200041146a280200220036020c2002410c6a2001104102400240024002400240200141046a2802002204200528020022036b20004f0d00200320006a22052003490d2820044101742203200520052003491b22034100480d282004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200320006a360200200420036a200620001094041a200241106a24000f0b20012005360200200141046a2007360200200141086a28020021030b2004200341016a360200200520036a41063a0000200041086a22032d0000417f6a2205410f4b0d1002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020050e10000a0608030b0d090f050e02040c0107000b200628020020042802002203470d18200341016a22042003490d800120034101742205200420042005491b22054100480d80012003450d3120012802002003200510272204450d320c5d0b200628020020042802002200470d0e200041016a22052000490d7f20004101742207200520052007491b22074100480d7f2000450d1e20012802002000200710272205450d1f0c5a0b200628020020042802002200470d0e200041016a22052000490d7e20004101742207200520052007491b22074100480d7e2000450d1f20012802002000200710272205450d200c570b200628020020042802002203470d0e200341016a22052003490d7d20034101742207200520052007491b22074100480d7d2003450d2020012802002003200710272205450d210c540b200628020020042802002200470d0e200041016a22032000490d7c20004101742205200320032005491b22054100480d7c2000450d2120012802002000200510272203450d220c510b200628020020042802002203470d0e200341016a22042003490d7b20034101742205200420042005491b22054100480d7b2003450d2220012802002003200510272204450d230c4e0b200628020020042802002205470d0e200541016a22062005490d7a20054101742207200620062007491b22074100480d7a2005450d2320012802002005200710272206450d240c4b0b200628020020042802002200470d0e200041016a22032000490d7920004101742205200320032005491b22054100480d792000450d2420012802002000200510272203450d250c480b200628020020042802002205470d0e200541016a22062005490d7820054101742207200620062007491b22074100480d782005450d2520012802002005200710272206450d260c450b200628020020042802002203470d0e200341016a22042003490d7720034101742205200420042005491b22054100480d772003450d2620012802002003200510272204450d270c420b200628020020042802002203470d0f200341016a22042003490d7620034101742205200420042005491b22054100480d762003450d2920012802002003200510272204450d2a0c3f0b200628020020042802002203470d0f200341016a22052003490d7520034101742207200520052007491b22074100480d752003450d2a20012802002003200710272205450d2b0c3c0b200628020020042802002200470d0f200041016a22052000490d7420004101742207200520052007491b22074100480d742000450d2b20012802002000200710272205450d2c0c390b200628020020042802002203470d0f200341016a22042003490d7320034101742205200420042005491b22054100480d732003450d2c20012802002003200510272204450d2d0c360b200628020020042802002203470d0f200341016a22042003490d7220034101742205200420042005491b22054100480d722003450d2d20012802002003200510272204450d2e0c330b200628020020042802002200470d0f200041016a22052000490d7120004101742207200520052007491b22074100480d712000450d2e20012802002000200710272205450d2f0c300b200128020021050c4c0b200128020021050c490b200128020021050c460b200128020021030c430b200128020021040c400b200128020021060c3d0b200128020021030c3a0b200128020021060c370b200128020021040c340b200128020021040c450b200128020021040c300b200128020021050c2d0b200128020021050c2a0b200128020021040c270b200128020021040c240b200128020021050c210b2007102622050d3b0b20074101102a000b2007102622050d370b20074101102a000b2007102622050d330b20074101102a000b2005102622030d2f0b20054101102a000b2005102622040d2b0b20054101102a000b2007102622060d270b20074101102a000b2005102622030d230b20054101102a000b2007102622060d1f0b20074101102a000b2005102622040d1b0b20054101102a000b2005102622040d2b0b20054101102a000b2005102622040d150b20054101102a000b2007102622050d110b20074101102a000b2007102622050d0d0b20074101102a000b2005102622040d090b20054101102a000b2005102622040d050b20054101102a000b2007102622050d010b20074101102a000b20012005360200200141046a2007360200200141086a28020021000b2004200041016a360200200520006a41083a00000240024002400240024020062802002205200428020022006b41204f0d00200041206a22062000490d4420054101742200200620062000491b22004100480d442005450d0120012802002005200010272205450d020c030b200128020021050c030b2000102622050d010b20004101102a000b20012005360200200141046a2000360200200141086a28020021000b2004200041206a360200200520006a220141186a200341196a290000370000200141106a200341116a290000370000200141086a200341096a29000037000020012003290001370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a410a3a0000200041186a20011098022000410c6a20011041200041106a20011041200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41063a00002000410c6a28020020011039200241106a24000f0b20012005360200200141046a2007360200200141086a28020021000b2004200041016a360200200520006a410d3a00000240024002400240024020062802002205200428020022006b41204f0d00200041206a22062000490d3e20054101742200200620062000491b22004100480d3e2005450d0120012802002005200010272205450d020c030b200128020021050c030b2000102622050d010b20004101102a000b20012005360200200141046a2000360200200141086a28020021000b2004200041206a360200200520006a220141186a200341196a290000370000200141106a200341116a290000370000200141086a200341096a29000037000020012003290001370000200241106a24000f0b20012005360200200141046a2007360200200141086a28020021030b2004200341016a360200200520036a41053a00002000410c6a28020021050240024002400240024020062802002203200428020022006b41044f0d00200041046a22062000490d3c20034101742200200620062000491b22004100480d3c2003450d0120012802002003200010272203450d020c030b200128020021030c030b2000102622030d010b20004101102a000b20012003360200200141046a2000360200200141086a28020021000b2004200041046a360200200320006a2005360000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a00002000410c6a20011041200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41073a00002000410c6a28020020011039200241106a24000f0b20012006360200200141046a2007360200200141086a28020021050b200141086a2207200541016a360200200620056a41033a00002000410c6a2001104120032d00012105200341026a2d0000210602400240024002400240200141046a28020020072802002200470d00200041016a22032000490d3620004101742207200320032007491b22074100480d362000450d0120012802002000200710272203450d020c030b200128020021030c030b2007102622030d010b20074101102a000b20012003360200200141046a2007360200200141086a28020021000b2004200041016a360200200320006a20054100474107742006723a0000200241106a24000f0b20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a410f3a0000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021050b200141086a2207200541016a360200200620056a41023a00002000410c6a2001104120032d00012105200341026a2d0000210602400240024002400240200141046a28020020072802002200470d00200041016a22032000490d3220004101742207200320032007491b22074100480d322000450d0120012802002000200710272203450d020c030b200128020021030c030b2007102622030d010b20074101102a000b20012003360200200141046a2007360200200141086a28020021000b2004200041016a360200200320006a20054100474107742006723a0000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41093a00002000410c6a20011041200241106a24000f0b20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a410c3a0000200241106a24000f0b20012005360200200141046a2007360200200141086a28020021030b200141086a200341016a360200200520036a41043a00002000410c6a28020020011039024002400240024002400240024002400240024002400240024002400240024002400240200041096a2d000022034101460d0020034102470d01200628020020042802002203470d03200341016a22052003490d3920034101742207200520052007491b22074100480d392003450d0720012802002003200710272205450d080c0f0b200628020020042802002203470d01200341016a22052003490d3820034101742207200520052007491b22074100480d382003450d0420012802002003200710272205450d050c0c0b200628020020042802002203470d02200341016a22052003490d3720034101742207200520052007491b22074100480d372003450d0720012802002003200710272205450d080c090b200128020021050c0b0b200128020021050c0c0b200128020021050c070b2007102622050d070b20074101102a000b2007102622050d070b20074101102a000b2007102622050d010b20074101102a000b20012005360200200141046a2007360200200141086a28020021030b2004200341016a360200200520036a41003a00000c040b20012005360200200141046a2007360200200141086a28020021030b2004200341016a360200200520036a41013a00000c020b20012005360200200141046a2007360200200141086a28020021030b2004200341016a360200200520036a41023a00000b200041106a290300210b0240024002400240024020062802002205200428020022036b41084f0d00200341086a22072003490d2c20054101742203200720072003491b22034100480d2c2005450d0120012802002005200310272205450d020c030b200128020021050c030b2003102622050d010b20034101102a000b20012005360200200141046a2003360200200141086a28020021030b2004200341086a360200200520036a200b370000200041186a290300210b0240024002400240024020062802002203200428020022006b41084f0d00200041086a22052000490d2c20034101742200200520052000491b22004100480d2c2003450d0120012802002003200010272203450d020c030b200128020021030c030b2000102622030d010b20004101102a000b20012003360200200141046a2000360200200141086a28020021000b2004200041086a360200200320006a200b3700000c160b20012005360200200141046a2007360200200141086a28020021000b2004200041016a360200200520006a410b3a00000240024002400240024020062802002205200428020022006b41204f0d00200041206a22062000490d2a20054101742200200620062000491b22004100480d2a2005450d0120012802002005200010272205450d020c030b200128020021050c030b2000102622050d010b20004101102a000b20012005360200200141046a2000360200200141086a28020021000b2004200041206a360200200520006a220141186a200341196a290000370000200141106a200341116a290000370000200141086a200341096a29000037000020012003290001370000200241106a24000f0b20012005360200200141046a2007360200200141086a28020021000b2004200041016a360200200520006a410e3a00000240024002400240024020062802002205200428020022006b41204f0d00200041206a22042000490d2820054101742200200420042000491b22004100480d282005450d0120012802002005200010272204450d020c030b200128020021040c030b2000102622040d010b20004101102a000b20012004360200200141046a2000360200200141086a28020021000b200141086a200041206a360200200420006a220041186a200341196a290000370000200041106a200341116a290000370000200041086a200341096a29000037000020002003290001370000200341216a2d00002001103f200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a00002000410c6a280200200110392002200041106a36020c2002410c6a20011066200241106a24000f0b20012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a41023a0000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41083a00000240024002400240024002400240024002400240024002400240024002400240200041046a22042d000022034103460d00024020034102460d0020034101470d1d200141046a280200200141086a2802002203470d04200341016a22042003490d2720034101742205200420042005491b22054100480d272003450d0920012802002003200510272204450d0a0c0f0b200141046a280200200141086a2802002203470d01200341016a22042003490d2620034101742205200420042005491b22054100480d262003450d0420012802002003200510272204450d050c0c0b200141046a28020020052802002203470d01200341016a22052003490d2520034101742206200520052006491b22064100480d252003450d0520012802002003200610272205450d060c090b200128020021040c0b0b200128020021050c080b200128020021040c0b0b2005102622040d070b20054101102a000b2006102622050d030b20064101102a000b2005102622040d050b20054101102a000b20012005360200200141046a2006360200200141086a28020021030b200141086a2206200341016a360200200520036a41023a000002400240024002400240200141046a2802002205200628020022036b41204f0d00200341206a22062003490d1f20054101742203200620062003491b22034100480d1f2005450d0120012802002005200310272205450d020c030b200128020021050c030b2003102622050d010b20034101102a000b20012005360200200141046a2003360200200141086a28020021030b200141086a2206200341206a360200200520036a220341186a200441196a290000370000200341106a200441116a290000370000200341086a200441096a29000037000020032004290001370000200041286a2001104102400240024002400240200141046a28020020062802002200470d00200041016a22032000490d1f20004101742205200320032005491b22054100480d1f2000450d0120012802002000200510272203450d020c030b200128020021030c030b2005102622030d010b20054101102a000b20012003360200200141046a2005360200200141086a28020021000b200141086a200041016a360200200320006a200441216a2d00003a0000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a0000200041086a200110412000410c6a28020020011039200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a0000200041086a28020020011039200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41043a000002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d2020034101742205200420042005491b22054100480d202003450d0120012802002003200510272204450d020c030b200128020021040c030b2005102622040d010b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d2020044101742203200520052003491b22034100480d202004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041106a220441186a290000370000200341106a200441106a290000370000200341086a200441086a2900003700002003200429000037000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d2020044101742203200520052003491b22034100480d202004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041306a220441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200041046a280200210620022000410c6a280200220036020c2002410c6a2001104102400240024002400240200141046a2802002204200528020022036b20004f0d00200320006a22052003490d2020044101742203200520052003491b22034100480d202004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200320006a360200200420036a200620001094041a200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41033a000002400240024002400240024002400240024002400240200041086a28020022034102460d0020034101470d13200141046a280200200141086a2802002203470d01200341016a22042003490d2420034101742205200420042005491b22054100480d242003450d0320012802002003200510272204450d040c090b200141046a28020020052802002203470d01200341016a22042003490d2320034101742205200420042005491b22054100480d232003450d0420012802002003200510272204450d050c060b200128020021040c080b200128020021040c050b2005102622040d050b20054101102a000b2005102622040d010b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a00002000410c6a200110ec022002200041306a36020c2002410c6a200110662002200041c0006a36020c2002410c6a20011066200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a00002000410c6a200110ec022002200041306a36020c2002410c6a20011066200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a410a3a000002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d1520034101742205200420042005491b22054100480d152003450d0120012802002003200510272204450d020c030b200128020021040c030b2005102622040d010b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a0000200041046a280200210620022000410c6a280200220036020c2002410c6a2001104102400240024002400240200141046a2802002204200528020022036b20004f0d00200320006a22052003490d1520044101742203200520052003491b22034100480d152004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200320006a360200200420036a200620001094041a200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a410d3a000002400240024002400240024002400240024002400240200028020422034102460d0020034101470d0f200141046a280200200141086a2802002203470d01200341016a22042003490d1920034101742205200420042005491b22054100480d192003450d0320012802002003200510272204450d040c090b200141046a28020020052802002203470d01200341016a22042003490d1820034101742205200420042005491b22054100480d182003450d0420012802002003200510272204450d050c060b200128020021040c080b200128020021040c050b2005102622040d050b20054101102a000b2005102622040d010b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a0000200041086a200110ec02200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a0000200041086a28020020011039200241106a24000f0b20012005360200200141046a2007360200200141086a28020021030b2004200341016a360200200520036a41053a0000200041086a2d0000417f6a2203410c4b0d0202400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020030e0d0008050602090a070c040b0103000b200628020020042802002203470d13200341016a22052003490d6020034101742207200520052007491b22074100480d602003450d2720012802002003200710272205450d280c4b0b200628020020042802002203470d0b200341016a22042003490d5f20034101742205200420042005491b22054100480d5f2003450d1820012802002003200510272204450d190c480b200628020020042802002203470d0b200341016a22042003490d5e20034101742205200420042005491b22054100480d5e2003450d1920012802002003200510272204450d1a0c450b200628020020042802002203470d0b200341016a22052003490d5d20034101742207200520052007491b22074100480d5d2003450d1a20012802002003200710272205450d1b0c420b200628020020042802002203470d0b200341016a22042003490d5c20034101742205200420042005491b22054100480d5c2003450d1b20012802002003200510272204450d1c0c3f0b200628020020042802002203470d0b200341016a22042003490d5b20034101742205200420042005491b22054100480d5b2003450d1c20012802002003200510272204450d1d0c3c0b200628020020042802002200470d0b200041016a22032000490d5a20004101742205200320032005491b22054100480d5a2000450d1d20012802002000200510272203450d1e0c390b200628020020042802002203470d0b200341016a22052003490d5920034101742207200520052007491b22074100480d592003450d1e20012802002003200710272205450d1f0c360b200628020020042802002203470d0c200341016a22042003490d5820034101742205200420042005491b22054100480d582003450d2120012802002003200510272204450d220c330b200628020020042802002203470d0c200341016a22042003490d5720034101742205200420042005491b22054100480d572003450d2220012802002003200510272204450d230c300b200628020020042802002200470d0c200041016a22032000490d5620004101742205200320032005491b22054100480d562000450d2320012802002000200510272203450d240c2d0b200628020020042802002200470d0c200041016a22032000490d5520004101742205200320032005491b22054100480d552000450d2420012802002000200510272203450d250c2a0b200628020020042802002203470d0c200341016a22042003490d5420034101742205200420042005491b22054100480d542003450d2520012802002003200510272204450d260c270b200128020021040c3d0b200128020021040c3a0b200128020021050c370b200128020021040c340b200128020021040c310b200128020021030c2e0b200128020021050c2b0b200128020021050c380b200128020021040c270b200128020021040c240b200128020021030c210b200128020021030c1e0b200128020021040c1b0b2005102622040d2f0b20054101102a000b2005102622040d2b0b20054101102a000b2007102622050d270b20074101102a000b2005102622040d230b20054101102a000b2005102622040d1f0b20054101102a000b2005102622030d1b0b20054101102a000b2007102622050d170b20074101102a000b2007102622050d230b20074101102a000b2005102622040d110b20054101102a000b2005102622040d0d0b20054101102a000b2005102622030d090b20054101102a000b2005102622030d050b20054101102a000b2005102622040d010b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41083a00002000410c6a200110ec02200241106a24000f0b20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a410a3a0000200241106a24000f0b20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41063a0000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41053a00002000410c6a28020021032002200041146a280200220036020c2002410c6a200110412000450d14200041246c210003402003200110ec02200341246a21032000415c6a22000d000c150b0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a00002002200041106a36020c2002410c6a20011066200241106a24000f0b20012005360200200141046a2007360200200141086a28020021030b2004200341016a360200200520036a41073a000002400240024002400240024002400240024002400240024002400240024002400240200041096a2d000022004101460d0020004102470d01200628020020042802002200470d03200041016a22032000490d3220004101742205200320032005491b22054100480d322000450d0720012802002000200510272203450d080c0f0b200628020020042802002200470d01200041016a22032000490d3120004101742205200320032005491b22054100480d312000450d0420012802002000200510272203450d050c0c0b200628020020042802002200470d02200041016a22032000490d3020004101742205200320032005491b22054100480d302000450d0720012802002000200510272203450d080c090b200128020021030c0b0b200128020021030c0c0b200128020021030c070b2005102622030d070b20054101102a000b2005102622030d070b20054101102a000b2005102622030d010b20054101102a000b20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41003a0000200241106a24000f0b20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41013a0000200241106a24000f0b20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41023a0000200241106a24000f0b20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41033a0000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41023a00002002200041106a36020c2002410c6a20011066200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41093a00002000410c6a20011041200241106a24000f0b20012005360200200141046a2007360200200141086a28020021030b200141086a220a200341016a360200200520036a410c3a00002000410c6a28020021032002200041146a280200220036020c2002410c6a200110412000450d0820004105742107200141046a210802400340024002400240024020062802002205200428020022006b41204f0d00200041206a22092000490d1f20054101742200200920092000491b22004100480d1f2005450d01200128020020052000102722050d020c050b200128020021050c020b200010262205450d030b2001200536020020082000360200200a28020021000b2004200041206a360200200520006a220041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a29000037000020002003290000370000200341206a2103200741606a22070d000c0a0b0b20004101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41043a0000200041206a200110412002200041106a36020c2002410c6a20011066200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a410b3a00002000410c6a20011041200241106a24000f0b20012005360200200141046a2007360200200141086a28020021030b200141086a200341016a360200200520036a41003a00002000410c6a200110ec022002200041306a36020c2002410c6a2001106602400240024002400240024002400240024002400240024002400240024002400240200041096a2d000022004101460d0020004102470d01200628020020042802002200470d03200041016a22032000490d2420004101742205200320032005491b22054100480d242000450d0720012802002000200510272203450d080c0f0b200628020020042802002200470d01200041016a22032000490d2320004101742205200320032005491b22054100480d232000450d0420012802002000200510272203450d050c0c0b200628020020042802002200470d02200041016a22032000490d2220004101742205200320032005491b22054100480d222000450d0720012802002000200510272203450d080c090b200128020021030c0b0b200128020021030c0c0b200128020021030c070b2005102622030d070b20054101102a000b2005102622030d070b20054101102a000b2005102622030d010b20054101102a000b20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41003a0000200241106a24000f0b20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41013a0000200241106a24000f0b20012003360200200141046a2005360200200141086a28020021000b2004200041016a360200200320006a41023a0000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a410c3a0000200041086a22032d0000417f6a220441054b0d000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040e06000402030105000b200141046a280200200141086a2802002203470d08200341016a22042003490d2320034101742205200420042005491b22054100480d232003450d1120012802002003200510272204450d120c260b200141046a280200200141086a2802002200470d04200041016a22042000490d2220004101742205200420042005491b22054100480d222000450d0a20012802002000200510272204450d0b0c200b200141046a280200200141086a2802002203470d04200341016a22042003490d2120034101742205200420042005491b22054100480d212003450d0b20012802002003200510272204450d0c0c1d0b200141046a280200200141086a2802002204470d04200441016a22052004490d2020044101742206200520052006491b22064100480d202004450d0c20012802002004200610272205450d0d0c1a0b200141046a280200200141086a2802002203470d05200341016a22042003490d1f20034101742205200420042005491b22054100480d1f2003450d0f20012802002003200510272204450d100c170b200141046a280200200141086a2802002204470d05200441016a22052004490d1e20044101742206200520052006491b22064100480d1e2004450d1020012802002004200610272205450d110c120b200128020021040c1c0b200128020021040c190b200128020021050c160b200128020021040c1e0b200128020021040c120b200128020021050c0d0b2005102622040d150b20054101102a000b2005102622040d110b20054101102a000b2006102622050d0d0b20064101102a000b2005102622040d140b20054101102a000b2005102622040d070b20054101102a000b2006102622050d010b20064101102a000b20012005360200200141046a2006360200200141086a28020021040b200141086a2206200441016a360200200520046a41053a000002400240024002400240200141046a2802002205200628020022046b41204f0d00200441206a22062004490d0f20054101742204200620062004491b22044100480d0f2005450d0120012802002005200410272205450d020c030b200128020021050c030b2004102622050d010b20044101102a000b20012005360200200141046a2004360200200141086a28020021040b200141086a2206200441206a360200200520046a220441186a200341196a290000370000200441106a200341116a290000370000200441086a200341096a2900003700002004200329000137000002400240024002400240200141046a2802002205200628020022046b41204f0d00200441206a22062004490d0f20054101742204200620062004491b22044100480d0f2005450d0120012802002005200410272205450d020c030b200128020021050c030b2004102622050d010b20044101102a000b20012005360200200141046a2004360200200141086a28020021040b200141086a2206200441206a360200200520046a220441186a200341216a220341186a290000370000200441106a200341106a290000370000200441086a200341086a29000037000020042003290000370000200041e0006a290300210b200041d8006a290300210c02400240024002400240200141046a2802002204200628020022036b41104f0d00200341106a22052003490d0f20044101742203200520052003491b22034100480d0f2004450d0120012802002004200310272205450d020c030b200128020021050c030b2003102622050d010b20034101102a000b20012005360200200141046a2003360200200141086a28020021030b200141086a2204200341106a360200200520036a2203200b3700082003200c370000200041cc006a28020021032002200041d4006a280200220036020c2002410c6a200110412000450d0020004105742106200141046a21070340024002400240024020072802002205200428020022006b41204f0d00200041206a22092000490d0f20054101742200200920092000491b22004100480d0f2005450d01200128020020052000102722050d020c060b200128020021050c020b200010262205450d040b2001200536020020072000360200200428020021000b2004200041206a360200200520006a220041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a29000037000020002003290000370000200341206a2103200641606a22060d000b0b200241106a24000f0b20004101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a0000200041186a20011098022000410c6a28020021062002200041146a280200220336020c2002410c6a2001104102400240024002400240200141046a2802002204200528020022006b20034f0d00200020036a22052000490d0b20044101742200200520052000491b22004100480d0b2004450d0120012802002004200010272204450d020c030b200128020021040c030b2000102622040d010b20004101102a000b20012004360200200141046a2000360200200141086a28020021000b200141086a200020036a360200200420006a200620031094041a200241106a24000f0b20012005360200200141046a2006360200200141086a28020021040b200141086a2206200441016a360200200520046a41033a00002002200041386a36020c2002410c6a20011066200041c8006a200110980202400240024002400240200141046a2802002205200628020022046b41204f0d00200441206a22062004490d0920054101742204200620062004491b22044100480d092005450d0120012802002005200410272205450d020c030b200128020021050c030b2004102622050d010b20044101102a000b20012005360200200141046a2004360200200141086a28020021040b200141086a2206200441206a360200200520046a220441186a200341196a290000370000200441106a200341116a290000370000200441086a200341096a290000370000200420032900013700002000412c6a28020021052002200041346a280200220336020c2002410c6a2001104102400240024002400240200141046a2802002204200628020022006b20034f0d00200020036a22062000490d0920044101742200200620062000491b22004100480d092004450d0120012802002004200010272204450d020c030b200128020021040c030b2000102622040d010b20004101102a000b20012004360200200141046a2000360200200141086a28020021000b200141086a200020036a360200200420006a200520031094041a200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a00002000410c6a200110ec022002200041c0006a36020c2002410c6a20011066200041d0006a2001109802200041306a28020021062002200041386a280200220336020c2002410c6a2001104102400240024002400240200141046a2802002204200528020022006b20034f0d00200020036a22052000490d0720044101742200200520052000491b22004100480d072004450d0120012802002004200010272204450d020c030b200128020021040c030b2000102622040d010b20004101102a000b20012004360200200141046a2000360200200141086a28020021000b200141086a200020036a360200200420006a200620031094041a200241106a24000f0b20012004360200200141046a2005360200200141086a28020021000b200141086a2205200041016a360200200420006a41043a000002400240024002400240200141046a2802002204200528020022006b41204f0d00200041206a22052000490d0520044101742200200520052000491b22004100480d052004450d0120012802002004200010272204450d020c030b200128020021040c030b2000102622040d010b20004101102a000b20012004360200200141046a2000360200200141086a28020021000b200141086a2205200041206a360200200420006a220041186a200341196a290000370000200041106a200341116a290000370000200041086a200341096a2900003700002000200329000137000002400240024002400240024002400240024002400240200341216a2d00004101470d00200141046a28020020052802002200470d01200041016a22042000490d0b20004101742205200420042005491b22054100480d0b2000450d0320012802002000200510272204450d040c090b200141046a28020020052802002200470d01200041016a22032000490d0a20004101742204200320032004491b22044100480d0a2000450d0420012802002000200410272203450d050c060b200128020021040c080b200128020021030c050b2005102622040d050b20054101102a000b2004102622030d010b20044101102a000b20012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a41003a0000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021000b200141086a2205200041016a360200200420006a41013a0000024002400240200141046a2802002204200528020022006b41204f0d00200041206a22052000490d0320044101742200200520052000491b22004100480d032004450d0120012802002004200010272204450d020c040b200128020021040c040b2000102622040d020b20004101102a000b101e000b20012004360200200141046a2000360200200141086a28020021000b200141086a200041206a360200200420006a220141186a200341226a220041186a290000370000200141106a200041106a290000370000200141086a200041086a29000037000020012000290000370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a0000200041106a200110b202200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a0000024002400240200141046a28020020052802002203470d00200341016a22042003490d0320034101742205200420042005491b22054100480d032003450d0120012802002003200510272204450d020c040b200128020021040c040b2005102622040d020b20054101102a000b101e000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41003a0000200041086a2001109802200241106a24000b130020004110360204200041888ac0003602000b130020004109360204200041e2a2c0003602000b13002000410f360204200041eca2c0003602000b9e0101047f23004190016b220224002002410e360208200241003602880120024201370380010240410110262203450d002002200336028001200320024180016a41086a220428020022056a41003a0000200241013602840120002002290380013702002004200541016a2203360200200041086a200336020002402002280208410e460d00200241086a10240b20024190016a24000f0b41014101102a000bcb0101057f230041306b22022400200241186a22034200370300200241106a22044200370300200241086a220542003703002002420037030020024100360228200242013703200240412010262206450d0020062002290300370000200641086a2005290300370000200641106a2004290300370000200641186a2003290300370000200242a08080808004370224200220063602204100200241206a103f200041086a200241206a41086a28020036020020002002290320370200200241306a24000f0b41204101102a000ba50801027f02400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200041ff0171417f6a220041044b0d000240024002400240024020000e050004020301000b200141046a280200200141086a2802002200470d08200041016a22022000490d1720004101742203200220022003491b22034100480d172000450d1120012802002000200310272202450d120c220b200141046a280200200141086a2802002200470d04200041016a22022000490d1620004101742203200220022003491b22034100480d162000450d0a20012802002000200310272202450d0b0c1f0b200141046a280200200141086a2802002200470d04200041016a22022000490d1520004101742203200220022003491b22034100480d152000450d0b20012802002000200310272202450d0c0c1c0b200141046a280200200141086a2802002200470d04200041016a22022000490d1420004101742203200220022003491b22034100480d142000450d0c20012802002000200310272202450d0d0c190b200141046a280200200141086a2802002200470d05200041016a22022000490d1320004101742203200220022003491b22034100480d132000450d0f20012802002000200310272202450d100c160b200141046a280200200141086a2802002200470d05200041016a22022000490d1220004101742203200220022003491b22034100480d122000450d1020012802002000200310272202450d110c130b200128020021020c1b0b200128020021020c180b200128020021020c150b200128020021020c1a0b200128020021020c110b200128020021020c0e0b2003102622020d140b20034101102a000b2003102622020d100b20034101102a000b2003102622020d0c0b20034101102a000b2003102622020d100b20034101102a000b2003102622020d060b20034101102a000b2003102622020d020b20034101102a000b101e000b20012002360200200141046a2003360200200141086a28020021000b200141086a200041016a360200200220006a41003a00000f0b20012002360200200141046a2003360200200141086a28020021000b200141086a200041016a360200200220006a41023a00000f0b20012002360200200141046a2003360200200141086a28020021000b200141086a200041016a360200200220006a41043a00000f0b20012002360200200141046a2003360200200141086a28020021000b200141086a200041016a360200200220006a41033a00000f0b20012002360200200141046a2003360200200141086a28020021000b200141086a200041016a360200200220006a41053a00000f0b20012002360200200141046a2003360200200141086a28020021000b200141086a200041016a360200200220006a41013a00000b4901017f230041106b2202240020024100360208200242013703002002410036020c2002410c6a20021041200041086a200228020836020020002002290300370200200241106a24000b9d0701037f024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020002802002202413f4b0d00200141046a280200200141086a2802002200470d01200041016a22032000490d1120004101742204200320032004491b22044100480d112000450d0520012802002000200410272203450d060c170b2002418080014f0d01200141046a2802002203200141086a28020022006b41024f0d02200041026a22042000490d1020034101742200200420042000491b22004100480d102003450d0820012802002003200010272203450d090c140b200128020021030c160b20024180808080044f0d01200141046a2802002203200141086a28020022006b41044f0d04200041046a22042000490d0e20034101742200200420042000491b22004100480d0e2003450d08200128020020032000102722030d090c0f0b200128020021030c120b200141046a280200200141086a2802002202470d03200241016a22032002490d0c20024101742204200320032004491b22044100480d0c2002450d09200128020020022004102722030d0a0c0e0b2004102622030d110b20044101102a000b200128020021030c050b200128020021030c070b2000102622030d0b0b20004101102a000b200010262203450d060b20012003360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200320006a20024102744102723600000f0b200410262203450d040b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41033a0000200028020021030240024002400240200141046a2802002202200428020022006b41044f0d00200041046a22042000490d0420024101742200200420042000491b22004100480d042002450d01200128020020022000102722020d020c070b200128020021020c020b200010262202450d050b20012002360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200220006a20033600000f0b101e000b20004101102a000b20044101102a000b20004101102a000b20012003360200200141046a2000360200200141086a28020021000b200141086a200041026a360200200320006a20024102744101723b00000f0b20012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a20024102743a00000b8b0401047f230041e0006b2202240002400240410f10262203450d00200341076a41002900a78640370000200341002900a086403700002003410f412f10272203450d012003200129000037000f200341276a200141186a2900003700002003411f6a200141106a290000370000200341176a200141086a290000370000200241c0006a41186a22014200370300200241c0006a41106a22044200370300200241c0006a41086a22054200370300200242003703402003412f200241c0006a1002200241206a41186a2001290300370300200241206a41106a2004290300370300200241206a41086a200529030037030020022002290340370320024002400240200241206a412041a886c500410041001001417f460d0020014200370300200442003703002005420037030020024200370340200241206a4120200241c0006a4120410010012201417f460d022001411f4d0d02200241186a2201200241c0006a41186a290300370300200241106a2204200241c0006a41106a290300370300200241086a2205200241c0006a41086a29030037030020022002290340370300200041013a000020002002290300370001200041096a2005290300370000200041116a2004290300370000200041196a20012903003700000c010b200041003a00000b20031023200241e0006a24000f0b41d4aac10041331021000b410f4101102a000b412f4101102a000bed2604077f017e017f017e230041f0036b22022400200241003a00940220024194026a200128020022032001280204220441004722051094041a024002400240024002400240024002400240024020042005490d00200141046a200420056b22063602002001200320056a220536020002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402004450d0020022d0094022204410f4b0d10024020040e10000b0709040c0e0a0f061003050d0208000b20024180036a20011044200228028003210420024194026a20024180036a41047241ec001094041a2004410e470d15200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b20024194026a2006412020064120491b22046a41004100412020046b2004411f4b1b1093041a20024194026a200520041094041a200141046a200620046b22033602002001200520046a22043602002006411f4d0d0f200241a8016a41186a220520024194026a41186a290000370300200241a8016a41106a220620024194026a41106a290000370300200241a8016a41086a220720024194026a41086a29000037030020022002290094023703a80120024180036a41186a2208200529030037030020024180036a41106a2205200629030037030020024180036a41086a22062007290300370300200220022903a8013703800320024188016a41186a200829030037030020024188016a41106a200529030037030020024188016a41086a2006290300370300200220022903800337038801200241003a00940220024194026a2004200341004722051094041a20032005490d29200141046a200320056b3602002001200420056a3602002003450d1d20022d009402220141064f0d1d200241e8006a41186a220420024188016a41186a290300370300200241e8006a41106a220520024188016a41106a290300370300200241e8006a41086a220320024188016a41086a29030037030020022002290388013703682000410f3a0000200041216a20013a000020002002290368370001200041096a2003290300370000200041116a2005290300370000200041196a2004290300370000200041226a2002280160360100200041266a200241e4006a2f01003b0100200241f0036a24000f0b20024194026a2006412020064120491b22046a41004100412020046b2004411f4b1b1093041a20024194026a200520041094041a200141046a200620046b3602002001200520046a3602002006411f4d0d0f200241a8016a41186a220120024194026a41186a290000370300200241a8016a41106a220420024194026a41106a290000370300200241a8016a41086a220520024194026a41086a29000037030020022002290094023703a80120024180036a41186a2203200129030037030020024180036a41106a2201200429030037030020024180036a41086a22042005290300370300200220022903a8013703800320024188016a41186a2205200329030037030020024188016a41106a2203200129030037030020024188016a41086a220120042903003703002002200229038003370388012000410c3a00002000200229038801370001200041096a2001290300370000200041116a2003290300370000200041196a2005290300370000200041216a2002280068360000200041246a200241eb006a280000360000200241f0036a24000f0b20024180036a20011044200228028003210420024194026a20024180036a41047241ec001094041a2004410e470d0f200041113a0000200241f0036a24000f0b2000410d3a0000200241f0036a24000f0b200241386a200110452002280238450d14200228023c2101200020022f0094023b00012000410a3a0000200041046a2001360200200041086a200229038003370300200041036a20024196026a2d00003a0000200041106a20024180036a41086a290300370300200041186a20024180036a41106a290300370300200041206a20024180036a41186a290300370300200241f0036a24000f0b200241286a200110452002280228450d14200228022c2107200141046a22032802002104200241003a00940220024194026a20012802002206200441004722051094041a20042005490d222003200420056b3602002001200620056a36020002402004450d0020022d009402220141ff007122044106490d1c0b200041113a0000200241f0036a24000f0b200041103a0000200241f0036a24000f0b200241306a200110452002280230450d1320022802342107200141046a22032802002104200241003a00940220024194026a20012802002206200441004722051094041a20042005490d212003200420056b3602002001200620056a36020002402004450d0020022d009402220141ff007122044106490d1b0b200041113a0000200241f0036a24000f0b20024180036a20011044200228028003210120024194026a20024180036a41047241ec001094041a2001410e470d0a200041113a0000200241f0036a24000f0b200241206a200110452002280220450d1220022802242101200020022f0094023b0001200041023a0000200041046a2001360200200041086a200229038003370300200041036a20024194026a41026a2d00003a0000200041106a20024180036a41086a290300370300200041186a20024180036a41106a290300370300200041206a20024180036a41186a290300370300200241f0036a24000f0b200241003602940220024194026a20052006410420064104491b22041094041a200141046a200620046b3602002001200520046a360200200641034d0d0a2002280294022101200041063a0000200041046a2001360200200020022f00a8013b0001200041036a200241aa016a2d00003a0000200041086a200229038003370300200041106a20024180036a41086a290300370300200041186a20024180036a41106a290300370300200041206a20024180036a41186a290300370300200241f0036a24000f0b20024194026a2006412020064120491b22046a41004100412020046b2004411f4b1b1093041a20024194026a200520041094041a200141046a200620046b3602002001200520046a3602002006411f4d0d0a200241a8016a41186a220120024194026a41186a290000370300200241a8016a41106a220420024194026a41106a290000370300200241a8016a41086a220520024194026a41086a29000037030020022002290094023703a80120024180036a41186a2203200129030037030020024180036a41106a2201200429030037030020024180036a41086a22042005290300370300200220022903a8013703800320024188016a41186a2205200329030037030020024188016a41106a2203200129030037030020024188016a41086a220120042903003703002002200229038003370388012000410e3a00002000200229038801370001200041096a2001290300370000200041116a2003290300370000200041196a2005290300370000200041216a2002280068360000200041246a200241eb006a280000360000200241f0036a24000f0b20024180036a20011044200228028003210120024194026a20024180036a41047241ec001094041a2001410e470d0a200041113a0000200241f0036a24000f0b4100210320024194026a2006412020064120491b22046a41004100412020046b2004411f4b1b1093041a20024194026a200520041094041a200141046a200620046b3602002001200520046a36020002402006411f4d0d00200241a8016a41186a220120024194026a41186a290000370300200241a8016a41106a220420024194026a41106a290000370300200241a8016a41086a220520024194026a41086a29000037030020022002290094023703a80120024188016a41186a200129030037030020024188016a41106a200429030037030020024188016a41086a2005290300370300200220022903a80137038801410121030b20024180036a41186a220120024188016a41186a29030037030020024180036a41106a220420024188016a41106a29030037030020024180036a41086a220520024188016a41086a2903003703002002200229038801370380032003450d0a200241e8006a41186a22032001290300370300200241e8006a41106a22012004290300370300200241e8006a41086a220420052903003703002002200229038003370368200041093a000020002002290368370001200041096a2004290300370000200041116a2001290300370000200041196a2003290300370000200041216a2002280060360000200041246a200241e3006a280000360000200241f0036a24000f0b200241d0006a200110462002290350a7450d0e20022903582109200241c8006a200110452002280248450d11200228024c2104200241c0006a200110452002280240450d1520022802442101200020022f0094023b00012000410b3a0000200041106a2009370300200041086a2001360200200041046a2004360200200041186a200229038003370300200041036a20024196026a2d00003a0000200041206a20024180036a41086a290300370300200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b200241a8016a20024194026a41ec001094041a41f00010262205450d1820052004360200200541046a200241a8016a41ec001094041a200141046a22072802002104200241003a00940220024194026a20012802002208200441004722031094041a20042003490d192007200420036b22063602002001200820036a22033602002004450d0c20022d009402220841034f0d0c200242003703800320024180036a20032006410820064108491b22041094041a200141046a220a200620046b22073602002001200320046a2204360200200641074d0d122002290380032109200242003703800320024180036a20042007410820074108491b22031094041a200a200720036b3602002001200420036a360200200741074d0d13200041106a200229038003370300200041086a2009370300200041046a2005360200200020083a0001200041053a0000200041186a200229038801370300200041206a20024188016a41086a290300370300200241f0036a24000f0b200241a8016a20024194026a41ec001094041a41f00010262204450d1920042001360200200441046a200241a8016a41ec001094041a200041083a0000200041046a2004360200200020022f00683b0001200041036a200241ea006a2d00003a0000200041086a200229038801370300200041106a20024188016a41086a290300370300200041186a20024188016a41106a290300370300200041206a20024188016a41186a290300370300200241f0036a24000f0b200241a8016a20024194026a41ec001094041a41f00010262205450d1920052004360200200541046a200241a8016a41ec001094041a200241086a200110472002290308a7450d0e200241086a41106a29030021092002290310210b200020022f00683b0001200041013a0000200041086a200b370300200041046a2005360200200041186a200229038801370300200041106a2009370300200041036a200241ea006a2d00003a0000200041206a20024188016a41086a290300370300200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b200241a8016a20024194026a41ec001094041a41f00010262204450d1720042001360200200441046a200241a8016a41ec001094041a200041073a0000200041046a2004360200200020022f00683b0001200041036a200241ea006a2d00003a0000200041086a200229038801370300200041106a20024188016a41086a290300370300200041186a20024188016a41106a290300370300200041206a20024188016a41186a290300370300200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a00000c100b200041113a0000200241f0036a24000f0b200041033a0000200041046a2007360200200041026a20043a0000200020014107763a0001200041086a200229038003370300200041106a20024180036a41086a290300370300200041186a20024180036a41106a290300370300200041206a20024180036a41186a290300370300200241f0036a24000f0b200041043a0000200041046a2007360200200041026a20043a0000200020014107763a0001200041086a200229038003370300200041106a20024180036a41086a290300370300200041186a20024180036a41106a290300370300200041206a20024180036a41186a290300370300200241f0036a24000f0b200041113a00002005102420051023200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a00000c0a0b200041113a00000c090b200520041048000b200520041048000b200520041048000b200520031048000b41f0004108102a000b200320041048000b41f0004108102a000b41f0004108102a000b41f0004108102a000b2005102420051023200241f0036a24000bc35c05067f057e047f027e087f230041d0086b22022400200241003a00f006200241f0066a200128020022032001280204220441004722051094041a0240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020042005490d00200141046a200420056b22063602002001200320056a220536020002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402004450d0020022d00f0062204410d4b0d0e024020040e0e00090607030a0c080e050d02040b000b200241003a00ff05200241ff056a2005200641004722041094041a20062004490d6a200141046a200620046b22033602002001200520046a22043602002006450d6620022d00ff05220541044b0d66024020050e050025232422000b200241086a200110452002280208450d66200228020c2204417f4c0d682004450d4f200410ac012206450d870120062001280200200141046a22032802002205200420052004491b22051094041a200328020022072005490d88012003200720056b3602002001200128020020056a36020020052004470d500c9a010b2000410e360200200241d0086a24000f0b200241003a00ff05200241ff056a2005200641004722041094041a20062004490d69200141046a200620046b3602002001200520046a3602002006450d1e20022d00ff05220441044b0d1e024020040e05001d1b1c1a000b200241d0036a2001104720022903d003a7450d1e200241e0036a290300210820022903d8032109200241f0066a200110950220022d00f00622044102460d1e2002418c076a290200210a20024184076a290200210b20022f00f106210120022d00f306210520022902f406210c2002200241fc066a290200370388062002200c370380062002200b3703900620012005411074722101410121050c1d0b200241003a00ff05200241ff056a2005200641004722041094041a20062004490d69200141046a200620046b22033602002001200520046a22043602002006450d5520022d00ff050d55200241f0066a2003412020034120491b22056a41004100412020056b2005411f4b1b1093041a200241f0066a200420051094041a200141046a2207200320056b22063602002001200420056a22053602002003411f4d0d5520024188076a22032903002109200229038007210a20022903f0062108200220022903f806370388062002200837038006200241f0066a2006412020064120491b22046a41004100412020046b2004411f4b1b1093041a200241f0066a200520041094041a2007200620046b3602002001200520046a3602002006411f4d0d552003290300210820024180076a290300210b200241f0066a41086a290300210c20022802f406210320022802f0062107200241d0046a41086a20024180066a41086a29030037030020022002290380063703d00420024198016a20011045200228029801450d55200228029c012204417f4c0d652004450d53200410ac012206450d880120062001280200200141046a220d2802002205200420052004491b22051094041a200d280200220e2005490d8901200d200e20056b3602002001200128020020056a36020020052004470d540c95010b200241e0076a200110c30220022d00e0072101200241f0066a200241e0076a41017241e7001094041a20014107470d0b2000410e360200200241d0086a24000f0b200241003a00f006200241f0066a2005200641004722041094041a20062004490d68200141046a200620046b3602002001200520046a3602002006450d920120022d00f006450d0c0c92010b200241003a00f006200241f0066a2005200641004722041094041a20062004490d68200141046a200620046b3602002001200520046a3602002000410e360200200241d0086a24000f0b200241003a00ff05200241ff056a2005200641004722041094041a20062004490d68200141046a200620046b3602002001200520046a3602002006450d0f20022d00ff0522044101460d0d20040d0f200241e0076a200110950220022d00e00722044102460d0f20022d00e307210320022f00e1072107200241ec076a2902002108200241fc076a2902002109200241f8076a2802002105200241f4076a280200210620022902e407210a200241d0006a200110472002280250450d0f20072003411074722101200241d0006a41106a290300210b410121032002290358210c0c0e0b200241003a00ff05200241ff056a2005200641004722041094041a20062004490d68200141046a200620046b3602002001200520046a3602002006450d3120022d00ff05220441094b0d31024020040e0a00252223202829242b21000b200241f0066a200110a50220022802f0062204450d3120022902f4062108200241a8026a200110452008a7210520022802a802450d3020022802ac022103200241003602f006200241f0066a2001280200220d200141046a220e2802002206410420064104491b22071094041a200e200620076b3602002001200d20076a360200200641034d0d30200842208821082005410876210e2004410876210f20022802f0062110410121010c250b200241003a00f006200241f0066a2005200641004722041094041a20062004490d68200141046a200620046b3602002001200520046a3602002006450d8d0120022d00f006450d090c8d010b200241003a00ff05200241ff056a2005200641004722041094041a20062004490d6841042103200141046a200620046b220f3602002001200520046a22103602002006450d850120022d00ff05220d410c4b0d85010240200d0e0d0036388901323a3b393c343d3133000b200241f0066a200110950220022d00f00622044102460d850120022d00f306210f20022f00f1062110200241fc066a290200210a2002418c076a290200210920024188076a280200210720024184076a280200210520022902f4062108200241a0016a2001104720022903a001a7450d8501200241a0016a41106a290300210c20022903a801210b200141046a220d2802002106200241003a00ff05200241ff056a2001280200220e200641004722031094041a20062003490d8301200d200620036b3602002001200e20036a3602002006450d850120022d00ff05220641034f0d85012010200f41107472210e410121030c88010b200241003a00f006200241f0066a2005200641004722041094041a20062004490d68200141046a200620046b3602002001200520046a3602002006450d0d20022d00f00622044101460d0c20040d0d200241e0076a2001104420022802e0072104200241f0066a200241e0076a41047241ec001094041a2004410e460d0d20024180066a200241f0066a41ec001094041a41f00010262201450d7520012004360200200141046a20024180066a41ec001094041a200241b8056a41186a200241d8056a41186a290200370300200241b8056a41106a200241d8056a41106a290200370300200241b8056a41086a200241d8056a41086a290200370300200220022902d8053703b80520014108762105410121040c1b0b200241f0066a20011043200220022f01f2063b018006200220024192076a2f01003b01d80520022d00f00622014111470d042000410e360200200241d0086a24000f0b200241003a00f006200241f0066a2005200641004722041094041a20062004490d67200141046a200620046b3602002001200520046a3602002006450d880120022d00f006450d060c88010b200241003a00ff05200241ff056a2005200641004722041094041a20062004490d6741042103200141046a200620046b22073602002001200520046a22053602002006450d4620022d00ff0522044102460d0c20044101460d0b20040d46200241e0076a200110444104210320022802e0072101200241f0066a200241e0076a41047241ec001094041a2001410e460d4620024180066a200241f0066a41ec001094041a41f00010262204450d7520042001360200200441046a20024180066a41ec001094041a200220022f01b8053b019805200220022f01d8053b01ce04410121030c470b2000410e360200200241d0086a24000f0b20024180066a200241f0066a41e7001094041a200041086a20013a00002000410c360200200041096a20024180066a41e7001094041a200241d0086a24000f0b200241f0066a41196a2900002108200241f0066a41116a2900002109200241f0066a41216a2d00002104200241f0066a41106a2d00002105200241f0066a410c6a2802002106200241f0066a41086a280200210320022802f406210720022d00f106210d200220022f0180063b01d004200220022f01d8053b01b80520024194076a280200210e200041216a2008370000200041196a20093700002000200d3a0009200041086a20013a000020004106360200200020043a0029200041186a20053a0000200041146a2006360200200041106a20033602002000410c6a20073602002000412c6a200e360200200020022f01d0043b000a200020022f01b8053b012a200041306a20022903e007370300200041386a200241e0076a41086a290300370300200041c0006a200241e0076a41106a290300370300200041c8006a200241e0076a41186a290300370300200041d0006a20024180086a290300370300200041d8006a20024188086a290300370300200041e0006a200241e0076a41306a290300370300200041e8006a200241e0076a41386a290300370300200241d0086a24000f0b200241b8036a2001104620022903b803a7450d850120022903c003210820004109360200200041086a2008370300200041106a200241e0076a41e0001094041a200241d0086a24000f0b200241c0006a200110462002290340a7450d83012002290348210820004101360200200041086a2008370300200041106a200241e0076a41e0001094041a200241d0086a24000f0b200241c8036a2001104520022802c803450d810120022802cc032204417f4c0d542004450d22200410ac012206450d6d20062001280200200141046a22032802002205200420052004491b22051094041a200328020022072005490d6e2003200720056b3602002001200128020020056a36020020052004470d230c80010b200241e0076a200110950220022d00e00722044102460d0120022d00e307210320022f00e1072107200241ec076a2902002108200241fc076a2902002109200241f8076a2802002105200241f4076a280200210620022902e407210a20024180016a20011047200229038001a7450d0120024180016a41106a290300210b200229038801210c200241e8006a200110472002290368a7450d0120072003411074722101200241f8006a290300211120022903702112410221030b200020013b000d200041033602002000410f6a20014110763a0000200041c8006a2011370200200041c0006a2012370200200041386a200b370200200041306a200c370200200041186a2008370000200041106a200a370000200041286a2009370000200041246a2005360000200041206a20063600002000410c6a20043a0000200041086a2003360200200041d0006a20022903f006370300200041d8006a200241f0066a41086a290300370300200041e0006a200241f0066a41106a290300370300200041e8006a200241f0066a41186a290300370300200241d0086a24000f0b2000410e360200200241d0086a24000f0b200241e0076a2001109502200241f0066a41086a2206200241ec076a290200370300200241f0066a41106a2203200241f4076a290200370300200241f0066a41186a2207200241fc076a290200370300200220022902e4073703f0064102210420022d00e00722014102470d0d0b2000410e360200200241d0086a24000f0b200241a8036a2001104520022802a803450d3a20022802ac032104200241e0076a200110444104210320022802e0072105200241f0066a200241e0076a41047241ec001094041a2005410e460d3a20024180066a200241f0066a41ec001094041a41f00010262201450d6a20012005360200200141046a20024180066a41ec001094041a200220022f01b8053b019805200220022f01ea053b01ce04410221030c3b0b200241f0066a2007412020074120491b22046a41004100412020046b2004411f4b1b1093041a200241f0066a200520041094041a41042103200141046a200720046b3602002001200520046a3602002007411f4d0d3920024188076a2902002109200229028007210820022902f806210a20022802f406210720022802f0062105200241b0036a2001104520022802b003450d3920022802b4032106200141046a220d2802002104200241003a00e007200241e0076a2001280200220e200441004722031094041a20042003490d6a200d200420036b3602002001200e20036a3602002004450d3820022d00e007210e20022005360280062002200736028406200220022f0081063b0198052002200a37038806200a423888a7210d200a421888a7210720022800870621012002280083062104410321030c3a0b200241c0046a2001104520022802c004450d0420022802c40422044108762101410521054200210a0c030b200241b0046a2001104520022802b004450d0320022802b404210420024198046a20011047200229039804a7450d03200241a8046a290300210820022903a004210920024188046a20011046200229038804a7450d03200229039004210a20024180046a20011045200228028004450d03200228028404210120024190066a20083703002002200937038806200220013602800620044108762101410321050c020b200241b8046a2001104520022802b804450d0220022802bc0422044108762101410421054200210a0c010b200241e8036a2001104720022903e803a7450d01200241f8036a2903002108200220022903f003370380062002200837038806410221050b200241f0066a41106a20024180066a41106a290300220b370300200241f0066a41086a20024180066a41086a290300220c370300200241d0046a41086a2206200c370300200241d0046a41106a2203200b3703002002200229038006220b3703d0042002200b3703f006200041386a2008370200200041306a20093702002000410c6a2001410874200441ff017172360200200041086a20053602002000410b360200200041286a200a370200200041106a20022903d004370200200041186a2006290300370200200041206a2003290300370200200041c0006a20022903e007370300200041c8006a200241e0076a41086a290300370300200041d0006a200241e0076a41106a290300370300200041d8006a200241e0076a41186a290300370300200041e0006a200241e0076a41206a290300370300200041e8006a200241e0076a41286a290300370300200241d0086a24000f0b200241f0066a41106a20024180066a41106a290300370300200241f0066a41086a20024180066a41086a29030037030020022002290380063703f0062000410e360200200241d0086a24000f0b200241386a200110452002280238450d44200228023c2213ad420c7e2208422088a70d462008a72204417f4c0d462004450d272004102622060d2820044104102a000b200241106a200110452002280210450d4320022802142204417f4c0d452004450d28200410ac012206450d6620062001280200200141046a22032802002205200420052004491b22051094041a200328020022072005490d672003200720056b3602002001200128020020056a36020020052004470d290c700b200241286a200110452002280228450d42200228022c2214ad42187e2208422088a70d442008a72204417f4c0d442004450d2d2004102622060d2e20044104102a000b200242003703f006200241f0066a20042003410820034108491b22051094041a200141046a200320056b3602002001200420056a360200200341074d0d4120022903f0062108410221010c760b20022f00e10720022d00e307411074722105200241b8056a41186a2007290300370300200241b8056a41106a2003290300370300200241b8056a41086a2006290300370300200220022903f0063703b8050b20024198056a41186a2206200241b8056a41186a29030037030020024198056a41106a2203200241b8056a41106a29030037030020024198056a41086a2207200241b8056a41086a290300370300200220022903b80537039805200041086a2005410874200141ff017172360200200020043602042000410d3602002000410c6a200229039805370200200041146a20072903003702002000411c6a2003290300370200200041246a20062903003702002000412c6a200241d0046a41c4001094041a200241d0086a24000f0b200241d8026a2001104520022802d802450d1120022802dc022204410876210f410521010c090b20024198036a20011046200229039803a7450d1020022903a003220942208821082009a72205410876210e410a21010c0a0b200241c8026a2001104520022802c802450d0f20022802cc022104200241f0066a200110950220022d00f00622054102460d0f20022d00f306210320022f00f1062107200241fc066a290200210b2002418c076a290200210920024188076a280200210f20024184076a280200210620022902f4062108200241c0026a2001104520022802c002450d0f20022802c402210d200241b8026a2001104520022802b802450d0f2007200341107472210e20022802bc0221012002200f360280062004410876210f2008422088a7210320022009370284062009422088a72113200b422088a7210720022903800621092001ad210a200ba721104200210b410321010c0b0b200241d0026a2001104520022802d002450d0e20022802d4022204410876210f410421010c060b200241f0066a200110950220022d00f00622044102460d0d20022902f40622094220882108410821012009a72205410876210e20022f00f10620022d00f30641107472210f200241fc066a290200220a422088a7211020024184076a280200210720024188076a28020021062002418c076a2902002109200aa721030c020b200241f0066a200110a50220022802f0062204450d0c20022902f4062108200241b0026a200110452008a7210520022802b002450d0b20022802b4022103200241003602f006200241f0066a2001280200220d200141046a220e2802002206410420064104491b22071094041a200e200620076b3602002001200d20076a360200200641034d0d0b200842208821082005410876210e2004410876210f20022802f0062110410221010b0b0c060b200241f0066a200110950220022d00f00622044102460d0920022d00f306210520022f00f1062103200241fc066a290200210c2002418c076a290200210920024188076a280200210620024184076a280200210720022902f4062112200241e8026a2001104720022903e802a7450d09200241e8026a41106a290300210b20022903f002210a200241e0026a2001104520022802e002450d092003200541107472210f20022802e4022113201242208821082012a72205410876210e200c422088a72110200ca72103410621010c050b20024180036a20011045200228028003450d082002280284032204410876210f410721010b420021084100210e0c020b20024188036a20011046200229038803a7450d06200229039003220942208821082009a72205410876210e410921010b0b0b20004107360200200041c0006a200b370200200041386a200a370200200041346a200d360200200041306a2013360200200041286a2009370200200041246a2006360200200041206a20073602002000411c6a2010360200200041186a2003360200200041086a2001360200200041c8006a20022903e0073703002000410c6a200f410874200441ff017172360200200041d0006a200241e0076a41086a290300370300200041d8006a200241e0076a41106a290300370300200041e0006a200241e0076a41186a290300370300200041e8006a200241e0076a41206a290300370300200041106a2008422086200ead42ffffff07834208862005ad42ff01838484370200200241d0086a24000f0b4101210641002004460d5d0b2004450d5d200610230c5d0b2005450d00200410230b2000410e360200200241d0086a24000f0b20024198026a20011045200228029802450d54200228029c022104200220022f01b8053b01d0042004410876210e410c21030c030b20024180026a20011045200228028002450d532002280284022105200241e8016a2001104720022903e801a7450d53200241f8016a290300210a20022903f0012108200220022f01f0063b01d004410521034100210e0c040b200241a0026a2001104520022802a002450d5220022802a4022215ad2208421b88a70d2b2008420586a72205417f4c0d2b2005450d1e2005102622040d1f20054101102a000b20024190026a20011045200228029002450d512002280294022104200220022f01f0063b01d0042004410876210e410a21030b4200210a0c090b200241b8016a2001104720022903b801a7450d4f200241c8016a290300210a20022903c0012108200220022f01f0063b01d004200228028006210520022802840621072002290388062109410221034100210e0b0c500b200241d0016a2001104720022903d001a7450d4d200241e0016a290300210a20022903d8012108200220022f01f0063b01d004410321034100210e0c4e0b200241003a00ff05200241ff056a2010200f41004722041094041a200f2004490d43200141046a200f20046b3602002001201020046a360200200f450d4c20022d00ff05220641034f0d4c200220022f01f0063b01d004410821034200210a4100210e0c4f0b20024188026a20011045200228028802450d4b200228028c022214ad42247e2208422088a70d242008a72205417f4c0d242005450d192005102622040d1a20054104102a000b410721030c020b200241f0066a200110950220022d00f00622044102460d49200241fc066a290200210a20022902f406210820024184076a280200210520024188076a28020021072002418c076a290200210920022f00f106210120022d00f3062106200220022f0180063b01d0042001200641107472210e410921030c4b0b410b21030b0b0c470b410421060b2013450d02420021084100210d4100210541002107201321100340200241306a200110452002280230450d1020022802342204417f4c0d1e024002402004450d00200410ac01220e450d2e200e2001280200200141046a220f2802002203200420032004491b22031094041a200f28020022162003490d2f200f201620036b3602002001200128020020036a36020020032004460d010c110b4101210e41002004470d100b200741016a2103024020072010470d00200d20032003200d491b2210ad420c7e2209422088a70d202009a7220f4100480d2002402007450d0020062005200f102722060d010c300b200f10262206450d2f0b200620056a2207200e360200200741046a2004ad220942208620098437020020084280808080107c2108200d41026a210d2005410c6a21052003210720032013490d000c040b0b4101210641002004460d470b20040d180c190b41002110420021080b2006450d1720082010ad842108410521010c4c0b4101210641002004460d4a0b20040d140c150b410421060b024002402014450d00420021084100210e4100210441002107201421130340200241206a200110452002280220450d1420022802242203417f4c0d18024002402003450d00200310ac01220f450d30200f2001280200200141046a220d2802002205200320052003491b22051094041a200d28020022102005490d31200d201020056b3602002001200128020020056a36020020052003460d010c150b4101210f41002003470d140b200241186a200110452002280218450d13200228021c2205417f4c0d18024002402005450d00200510ac012210450d2e20102001280200200141046a2216280200220d2005200d2005491b220d1094041a20162802002217200d490d2f20162017200d6b36020020012001280200200d6a360200200d2005460d010c140b4101211041002005470d130b200741016a210d024020072013470d00200e200d200d200e491b2213ad42187e2209422088a70d1a2009a722164100480d1a02402007450d00200620042016102722060d010c2b0b201610262206450d2a0b200620046a2207200f360200200741146a2005360200200741106a20053602002007410c6a2010360200200741046a2003ad220942208620098437020020084280808080107c2108200e41026a210e200441186a2104200d2107200d2014490d000c020b0b41002113420021080b2006450d1320082013ad842108410421010c480b410421030b0b200220022f0198053b018006200220022f01ce043b01d805024020034104470d002000410e360200200241d0086a24000f0b200220022f0180063b01cc04200220022f01d8053b01ca042000411d6a2009370000200041156a2008370000200020053a0005200020033a0004200041083602002000200e3a0025200041146a200d3a0000200041106a20073602002000410c6a2001360200200041086a2004360200200041286a2006360200200020022f01cc043b0006200020022f01ca043b01262000412c6a200241d0046a41c4001094041a200241d0086a24000f0b4101210641002004460d410b2004450d00200610230b200241f0066a41086a200241d8056a41086a290300370300200220022903d8053703f0060c400b2004450d00200e10230b02402007450d002006210103400240200141046a280200450d00200128020010230b2001410c6a2101200541746a22050d000b0b20100d0a0c0b0b410121040b024002402015450d00200241f0066a41186a210f200241f0066a41106a2110200241f0066a41086a2113200141046a210e420021084100210d4100210741002103201521170340200f42003703002010420037030020134200370300200242003703f006200241f0066a20012802002216200e2802002205412020054120491b22061094041a200e200520066b3602002001201620066a3602002005411f4d0d06200341016a2106200f29030021092010290300210a2013290300210b20022802f406211620022802f0062114024020032017470d00200d20062006200d491b2217ad420586220c422088a70d10200ca722054100480d1002402003450d00200420072005102722040d010c220b200510262204450d210b200420076a22052014360000200541186a2009370000200541106a200a370000200541086a200b370000200541046a201636000020084280808080107c2108200d41026a210d200741206a21072006210320062015490d000c020b0b41002117420021080b2004450d3220082017ad842108200220022f01b8053b01d0042004410876210e410d21030c020b410421040b024002402014450d0042002108200241f0066a410c6a2117200241f0066a411c6a2115200241f0066a41186a2118200241f0066a41146a2119410021074100210341002105201421160340200241f0066a200110950220022d00f006220d4102460d05200541016a210620022d00f306210e20022f00f106210f201729020021092015290200210a201828020021102019280200211320022902f406210b024020052016470d002007200620062007491b2216ad42247e220c422088a70d0e200ca7221a4100480d0e02402005450d0020042003201a102722040d010c210b201a10262204450d200b200420036a2205200d3a0000200541036a200f200e41107472220d4110763a0000200541016a200d3b00002005410c6a2009370000200541046a200b3700002005411c6a200a370000200541186a2010360000200541146a201336000020084280808080107c2108200741026a2107200341246a21032006210520062014490d000c020b0b41002116420021080b2004450d3020082016ad842108200220022f0180063b01d0042004410876210e410621030b0c300b2017450d2e0c2d0b20160d2c0c2d0b2005450d00201010230b2003450d00200f10230b02402007450d002006210103400240200141046a280200450d00200128020010230b0240200141106a280200450d002001410c6a28020010230b200141186a2101200441686a22040d000b0b2013450d010b200610230b2000410e360200200241d0086a24000f0b200520041048000b101d000b101e000b200420061048000b200420061048000b200420061048000b200420061048000b200420061048000b200420061048000b200420061048000b200420061048000b200420061048000b200420061048000b200420061048000b200420061048000b20044101102a000b200320161048000b200f4104102a000b20164104102a000b20054101102a000b201a4104102a000b20054101102a000b200d20171048000b20034101102a000b200520101048000b41f0004108102a000b20044101102a000b200520071048000b41f0004108102a000b41f0004108102a000b200320041048000b2004200f1048000b20044101102a000b200520071048000b20044101102a000b200520071048000b20044101102a000b2005200e1048000b200320061048000b200410230b200220022f01d0043b01f0062000410e360200200241d0086a24000f0b0b0b200220022f01d00422013b01f006200220013b019805200041386a200c370000200041306a200b370000200041186a200a370000200041106a2008370000200020063a0009200041086a20033a000020004105360200200041286a2009370000200041246a2007360000200041206a20053600002000410c6a200e410874200441ff017172360000200020022f0198053b000a200041c0006a20022903e007370300200041c8006a200241e0076a41086a290300370300200041d0006a200241e0076a41106a290300370300200041d8006a200241e0076a41186a290300370300200041e0006a200241e0076a41206a290300370300200041e8006a200241e0076a41286a290300370300200241d0086a24000f0b2004ad22084220862008842108410321010c070b200020063602042000410a360200200041086a2004ad2208422086200884370200200041106a200241e0076a41e0001094041a200241d0086a24000f0b2000410e360200200241d0086a24000f0b2000410e360200200241d0086a24000f0b2000410e360200200241d0086a24000f0b200241d8056a41086a2201200241d0046a41086a290300370300200220022903d0043703d805200241f0066a41086a22052001290300370300200220022903d8053703f0062006450d00200241b8056a41086a22012005290300370300200220022903f0063703b805200041c8006a2008370200200041c0006a200b370200200041286a2009370200200041206a200a370200200041086a2004ad22084220862008843702002000200636020420004104360200200041386a200c370200200041346a2003360200200041306a2007360200200041106a20022903b805370200200041186a2001290300370200200041d0006a20022903e007370300200041d8006a200241e0076a41086a290300370300200041e0006a200241e0076a41106a290300370300200041e8006a200241e0076a41186a290300370300200241d0086a24000f0b2000410e360200200241d0086a24000f0b2004ad22084220862008842108410121010b20004100360200200041106a20083702002000410c6a2006360200200041086a2001360200200041186a200241e0076a41d8001094041a200241d0086a24000bdd0301077f230041106b22022400200241003a0003200241036a200128020022032001280204220441004722051094041a02400240024020042005490d00200141046a200420056b22063602002001200320056a22033602000240024002402004450d000240024020022d0003220741037122044102460d00024020044101460d0020040d0220074102762105410121040c080b200241003a000f2002410f6a2003200641004722041094041a20062004490d06200141046a200620046b3602002001200320046a3602002006450d0420022d000f4108742007724102762105410121040c070b41002105200241003a000a200241003b0108200241086a200320064103200641034922081b22041094041a200141046a200620046b3602002001200320046a3602004100210420080d0620022f010820022d000a411074724108742007724102762105410121040c060b200741034b0d004100210420024100360204200241046a20032006410420064104491b22051094041a200141046a200620056b3602002001200320056a360200200641034d0d0120022802042105410121040c050b410021040b0c030b41002105410021040c020b200520041048000b200420061048000b2000200536020420002004360200200241106a24000bcb0503057f037e047f230041106b22022400200241003a0000200220012802002203200128020422044100472205109404210202400240024020042005490d00200141046a200420056b22063602002001200320056a22053602000240024002402004450d0020022d00002204ad210702400240024002400240200441037122034102460d00024020034101460d0020030d022004410276ad2108420121090c080b200241003a00002002200520064100472204109404210320062004490d0a200141046a200620046b3602002001200520046a3602002006450d0220033100004208862007844202882108420121090c070b200241003a000e200241003b010c2002410c6a200520064103200641034922031b22041094041a200141046a200620046b3602002001200520046a360200420021084200210920030d06200233010c200231000e421086844208862007844202882108420121090c060b200441027622044104460d0120040d0220024100360200200220052006410420064104491b22041094042103200141046a200620046b3602002001200520046a360200200641034d0d0020033502002108420121090c050b42002108420021090c040b4200210920024200370300200220052006410820064108491b22041094042103200141046a200620046b3602002001200520046a360200200641074d0d0220032903002108420121090c030b200441046a220a41084b0d0042002108200141046a210b410021030340200241003a00002002200520064100472204109404210c20062004490d05200b200620046b220d3602002001200520046a22053602002006450d01200c3100002003410374413871ad86200884210842012109200d2106200341016a22042103200441ff0171200a490d000c030b0b420021090b0b2000200837030820002009370300200241106a24000f0b200520041048000b200420061048000b200420061048000be90605057f017e017f027e037f230041306b22022400200241003a0018200241186a200128020022032001280204220441004722051094041a02400240024002400240024020042005490d00200141046a200420056b22063602002001200320056a2205360200024002402004450d0002400240024002400240024020022d0018220341037122044102460d00024020044101460d0020040d022003410276ad21070c0d0b200241003a0018200241186a2005200641004722041094041a20062004490d0a200141046a200620046b3602002001200520046a3602002006450d0220022d001841087420037241fcff0371410276ad21070c0c0b200241003a002e200241003b012c2002412c6a200520064103200641034922081b22041094041a200141046a200620046b3602002001200520046a36020020080d0120022f012c20022d002e41107472410874200372410276ad21070c0b0b20034102762204410c460d0220044104460d0120040d0320024100360218200241186a20052006410420064104491b22041094041a200141046a200620046b3602002001200520046a360200200641034d0d00200235021821070c0a0b420021070c080b4200210720024200370318200241186a20052006410820064108491b22041094041a200141046a200620046b3602002001200520046a360200200641074d0d07200229031821070c080b4200210a2002420037032020024200370318200241186a20052006411020064110491b22041094041a200141046a200620046b3602002001200520046a3602002006410f4d0d02200241206a2903002109200229031821074201210a0c080b200441046a220b41104b0d00200141046a210c200241106a210d4200210742002109410021030340200241003a0018200241186a2005200641004722041094041a20062004490d04200c200620046b22083602002001200520046a22053602002006450d01200241086a20023100184200200341037441f80071109904200d2903002009842109200229030820078421074201210a20082106200341016a22042103200441ff0171200b490d000c080b0b4200210a0b0c050b200520041048000b200420061048000b200420061048000b420021094200210a0c010b420021094201210a0b200020073703082000200a370300200041106a2009370300200241306a24000b6f01017f230041306b2202240020022001360204200220003602002002412c6a41023602002002411c6a4102360200200241023602242002420237020c2002419489c5003602082002200241046a360228200220023602202002200241206a360218200241086a41a489c5001061000b832702087f027e230041f0036b22022400200241003a0090022001280200200128020420024190026a410120012802081001210320012001280208200341016a41014b22036a22043602080240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402003450d0020022d0090022203410f4b0d10024020030e10000b0709040c0e0a0f061003050d0208000b20024180036a2001102f200228028003210320024190026a20024180036a41047241ec001094041a2003410e470d15200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b20024190026a41186a2205420037030020024190026a41106a2206420037030020024190026a41086a220742003703002002420037039002200141086a220341002001280200200141046a220828020020024190026a41202004100122042004417f461b2204412020044120491b20032802006a22093602002004411f4d0d0f200241a0016a41186a22042005290300370300200241a0016a41106a22052006290300370300200241a0016a41086a2206200729030037030020022002290390023703a00120024180036a41186a2207200429030037030020024180036a41106a2204200529030037030020024180036a41086a22052006290300370300200220022903a0013703800320024180016a41186a200729030037030020024180016a41106a200429030037030020024180016a41086a2005290300370300200220022903800337038001200241003a0090022001280200200828020020024190026a410120091001210120032003280200200141016a41014b22016a3602002001450d1820022d009002220141064f0d18200241e0006a41186a220320024180016a41186a290300370300200241e0006a41106a220420024180016a41106a290300370300200241e0006a41086a220520024180016a41086a29030037030020022002290380013703602000410f3a0000200041216a20013a000020002002290360370001200041096a2005290300370000200041116a2004290300370000200041196a2003290300370000200041226a2002280158360100200041266a200241dc006a2f01003b0100200241f0036a24000f0b20024190026a41186a2205420037030020024190026a41106a2206420037030020024190026a41086a220742003703002002420037039002200141086a220341002001280200200141046a28020020024190026a41202004100122012001417f461b2201412020014120491b20032802006a3602002001411f4d0d0f200241a0016a41186a22012005290300370300200241a0016a41106a22032006290300370300200241a0016a41086a2204200729030037030020022002290390023703a00120024180036a41186a2205200129030037030020024180036a41106a2201200329030037030020024180036a41086a22032004290300370300200220022903a0013703800320024180016a41186a2204200529030037030020024180016a41106a2205200129030037030020024180016a41086a220120032903003703002002200229038003370380012000410c3a00002000200229038001370001200041096a2001290300370000200041116a2005290300370000200041196a2004290300370000200041216a2002280060360000200041246a200241e3006a280000360000200241f0036a24000f0b20024180036a2001102f200228028003210320024190026a20024180036a41047241ec001094041a2003410e470d0f200041113a0000200241f0036a24000f0b2000410d3a0000200241f0036a24000f0b200241306a2001104a2002280230450d1520022802342101200020022f0090023b00012000410a3a0000200041046a2001360200200041086a200229038003370300200041036a20024192026a2d00003a0000200041106a20024180036a41086a290300370300200041186a20024180036a41106a290300370300200041206a20024180036a41186a290300370300200241f0036a24000f0b200241206a2001104a2002280220450d1620022802242104200241003a0090022001280200200141046a28020020024190026a4101200141086a22012802001001210320012001280200200341016a41014b22036a36020002402003450d0020022d009002220141ff007122034106490d1d0b200041113a0000200241f0036a24000f0b200041103a0000200241f0036a24000f0b200241286a2001104a2002280228450d15200228022c2104200241003a0090022001280200200141046a28020020024190026a4101200141086a22012802001001210320012001280200200341016a41014b22036a36020002402003450d0020022d009002220141ff007122034106490d1c0b200041113a0000200241f0036a24000f0b20024180036a2001102f200228028003210120024190026a20024180036a41047241ec001094041a2001410e470d0a200041113a0000200241f0036a24000f0b200241186a2001104a2002280218450d14200228021c2101200020022f0090023b0001200041023a0000200041046a2001360200200041086a200229038003370300200041036a20024190026a41026a2d00003a0000200041106a20024180036a41086a290300370300200041186a20024180036a41106a290300370300200041206a20024180036a41186a290300370300200241f0036a24000f0b200141046a28020021032002410036029002200141086a220541002001280200200320024190026a41042004100122012001417f461b2201410420014104491b20052802006a360200200141034d0d0a2002280290022101200041063a0000200041046a2001360200200020022f00a0013b0001200041036a200241a2016a2d00003a0000200041086a200229038003370300200041106a20024180036a41086a290300370300200041186a20024180036a41106a290300370300200041206a20024180036a41186a290300370300200241f0036a24000f0b20024190026a41186a2205420037030020024190026a41106a2206420037030020024190026a41086a220742003703002002420037039002200141086a220341002001280200200141046a28020020024190026a41202004100122012001417f461b2201412020014120491b20032802006a3602002001411f4d0d0a200241a0016a41186a22012005290300370300200241a0016a41106a22032006290300370300200241a0016a41086a2204200729030037030020022002290390023703a00120024180036a41186a2205200129030037030020024180036a41106a2201200329030037030020024180036a41086a22032004290300370300200220022903a0013703800320024180016a41186a2204200529030037030020024180016a41106a2205200129030037030020024180016a41086a220120032903003703002002200229038003370380012000410e3a00002000200229038001370001200041096a2001290300370000200041116a2005290300370000200041196a2004290300370000200041216a2002280060360000200041246a200241e3006a280000360000200241f0036a24000f0b20024180036a2001102f200228028003210120024190026a20024180036a41047241ec001094041a2001410e470d0a200041113a0000200241f0036a24000f0b20024190026a41186a2206420037030020024190026a41106a2207420037030020024190026a41086a22084200370300200242003703900241002103200141086a220541002001280200200141046a28020020024190026a41202004100122012001417f461b2201412020014120491b20052802006a36020002402001411f4d0d00200241a0016a41186a22012006290300370300200241a0016a41106a22032007290300370300200241a0016a41086a2204200829030037030020022002290390023703a00120024180016a41186a200129030037030020024180016a41106a200329030037030020024180016a41086a2004290300370300200220022903a00137038001410121030b20024180036a41186a220120024180016a41186a29030037030020024180036a41106a220420024180016a41106a29030037030020024180036a41086a220520024180016a41086a2903003703002002200229038001370380032003450d0a200241e0006a41186a22032001290300370300200241e0006a41106a22012004290300370300200241e0006a41086a220420052903003703002002200229038003370360200041093a000020002002290360370001200041096a2004290300370000200041116a2001290300370000200041196a2003290300370000200041216a2002280058360000200041246a200241db006a280000360000200241f0036a24000f0b200241c8006a2001104b2002290348a7450d102002290350210a200241c0006a2001104a2002280240450d1120022802442103200241386a2001104a2002280238450d15200228023c2101200020022f0090023b00012000410b3a0000200041106a200a370300200041086a2001360200200041046a2003360200200041186a200229038003370300200041036a20024192026a2d00003a0000200041206a20024180036a41086a290300370300200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b200241a0016a20024190026a41ec001094041a41f00010262204450d1420042003360200200441046a200241a0016a41ec001094041a200241003a0090022001280200200141046a28020020024190026a4101200141086a22032802001001210520032003280200200541016a41014b22056a22063602002005450d0820022d009002220741034f0d082002420037038003200141086a220341002001280200200141046a220828020020024180036a41082006100122052005417f461b2205410820054108491b20032802006a2206360200200541074d0d12200229038003210a2002420037038003200341002001280200200828020020024180036a41082006100122012001417f461b2201410820014108491b20032802006a360200200141074d0d13200041106a200229038003370300200041086a200a370300200041046a2004360200200020073a0001200041053a0000200041186a200229038001370300200041206a20024180016a41086a290300370300200241f0036a24000f0b200241a0016a20024190026a41ec001094041a41f00010262203450d1420032001360200200341046a200241a0016a41ec001094041a200041083a0000200041046a2003360200200020022f00603b0001200041036a200241e2006a2d00003a0000200041086a200229038001370300200041106a20024180016a41086a290300370300200041186a20024180016a41106a290300370300200041206a20024180016a41186a290300370300200241f0036a24000f0b200241a0016a20024190026a41ec001094041a41f00010262204450d1420042003360200200441046a200241a0016a41ec001094041a20022001104c2002290300a7450d0c200241106a290300210a2002290308210b200020022f00603b0001200041013a0000200041086a200b370300200041046a2004360200200041186a200229038001370300200041106a200a370300200041036a200241e2006a2d00003a0000200041206a20024180016a41086a290300370300200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b200241a0016a20024190026a41ec001094041a41f00010262203450d1220032001360200200341046a200241a0016a41ec001094041a200041073a0000200041046a2003360200200020022f00603b0001200041036a200241e2006a2d00003a0000200041086a200229038001370300200041106a20024180016a41086a290300370300200041186a20024180016a41106a290300370300200041206a20024180016a41186a290300370300200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a00000c0f0b200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a00002004102420041023200241f0036a24000f0b200041033a0000200041046a2004360200200041026a20033a0000200020014107763a0001200041086a200229038003370300200041106a20024180036a41086a290300370300200041186a20024180036a41106a290300370300200041206a20024180036a41186a290300370300200241f0036a24000f0b200041043a0000200041046a2004360200200041026a20033a0000200020014107763a0001200041086a200229038003370300200041106a20024180036a41086a290300370300200041186a20024180036a41106a290300370300200041206a20024180036a41186a290300370300200241f0036a24000f0b200041113a0000200241f0036a24000f0b200041113a00000c050b200041113a00000c040b41f0004108102a000b41f0004108102a000b41f0004108102a000b41f0004108102a000b2004102420041023200241f0036a24000bd00301057f230041106b2202240041002103200241003a000f200128020020012802042002410f6a410120012802081001210420012001280208200441016a41014b22046a2205360208024002402004450d00024002400240024020022d000f220641037122044102460d0020044101460d0120040d0320064102762104410121030c050b4100210420024100360208200220063a000841012103200141086a220641002001280200200141046a280200200241086a41017241032005100122012001417f461b2201410320014103491b20062802006a360200200141024d0d01200228020841027621040c040b41002104200241003b010c200220063a000c2001280200200141046a2802002002410c6a4101724101200510012103200141086a22012001280200200341016a41014b22016a3602002001450d0020022f010c4102762104410121030c030b410021030c020b200641034b0d01200141046a28020021044100210320024100360204200141086a2206410020012802002004200241046a41042005100122012001417f461b2201410420014104491b20062802006a360200200141034d0d0020022802042104410121030c010b0b2000200436020420002003360200200241106a24000bc50503047f027e037f230041106b22022400200241003a000820012802002001280204200241086a410120012802081001210320012001280208200341016a41014b22046a22033602080240024002402004450d0002400240024002400240024020022d0008220541037122044102460d0020044101460d0120040d022005410276ad2106420121070c080b20024100360208200220053a0008200141086a220441002001280200200141046a280200200241086a41017241032003100122012001417f461b2201410320014103491b20042802006a360200200141024d0d022002280208410276ad2106420121070c070b200241003b0108200220053a00082001280200200141046a280200200241086a4101724101200310012103200141086a22012001280200200341016a41014b22016a3602002001450d0120022f0108410276ad2106420121070c060b200541027622044104460d0120040d02200141046a280200210420024100360208200141086a2205410020012802002004200241086a41042003100122012001417f461b2201410420014104491b20052802006a360200200141034d0d0020023502082106420121070c050b42002106420021070c040b4200210720024200370308200141086a220441002001280200200141046a280200200241086a41082003100122012001417f461b2201410820014108491b20042802006a360200200141074d0d0220022903082106420121070c030b200441046a220841084b0d0042002106200141046a2109200141086a2105410021040340200241003a000820012802002009280200200241086a410120031001210320052005280200200341016a41014b220a6a2203360200200a450d0120023100082004410374413871ad86200684210642012107200441016a220441ff01712008490d000c030b0b420021070b0b2000200637030820002007370300200241106a24000be40603047f037e037f230041206b22022400200241003a001020012802002001280204200241106a410120012802081001210320012001280208200341016a41014b22036a220436020802400240024002402003450d000240024002400240024002400240024020022d0010220541037122034102460d0020034101460d0120030d022005410276ad21060c060b20024100360210200220053a0010200141086a220341002001280200200141046a280200200241106a41017241032004100122012001417f461b2201410320014103491b20032802006a360200200141024d0d022002280210410276ad21060c050b200241003b0110200220053a00102001280200200141046a280200200241106a4101724101200410012103200141086a22012001280200200341016a41014b22016a3602002001450d0120022f0110410276ad21060c040b20054102762203410c460d0120034104460d0220030d04200141046a280200210320024100360210200141086a2205410020012802002003200241106a41042004100122012001417f461b2201410420014104491b20052802006a360200200141034d0d00200235021021060c030b420021060c060b420021082002420037031820024200370310200141086a220341002001280200200141046a280200200241106a41102004100122012001417f461b2201411020014110491b20032802006a3602002001410f4d0d04200241106a41086a290300210720022903102106420121080c060b4200210620024200370310200141086a220341002001280200200141046a280200200241106a41082004100122012001417f461b2201410820014108491b20032802006a360200200141074d0d04200229031021060b42002107420121080c040b200341046a220941104b0d00200141046a210a200141086a21054200210642002107410021030340200241003a00102001280200200a280200200241106a410120041001210420052005280200200441016a41014b220b6a2204360200200b450d01200220023100104200200341037441f80071109904200241086a29030020078421072002290300200684210642012108200341016a220341ff01712009490d000c040b0b420021080b0c010b42002107420021080b2000200637030820002008370300200041106a2007370300200241206a24000bfb0601017f0240024002400240024020012d0000417f6a2202410f4b0d00024002400240024002400240024002400240024002400240024002400240024020020e10000a0608030b0d090e050f02040c0107000b41f00010262202450d102002200141046a280200104e200041046a2002360200200041013a0000200041106a200141106a290300370300200041086a200141086a2903003703000f0b2000410f3a000020002001290001370001200041096a200141096a290000370000200041116a200141116a290000370000200041196a200141196a290000370000200041216a200141216a2d00003a00000f0b2000410c3a000020002001290001370001200041196a200141196a290000370000200041116a200141116a290000370000200041096a200141096a2900003700000f0b41f00010262202450d0e2002200141046a280200104e200041046a2002360200200041053a0000200041106a200141106a290300370300200041086a200141086a290300370300200020012d00013a00010f0b2000410d3a00000f0b2000410a3a0000200041046a200141046a2802003602000f0b200041033a0000200041046a200141046a280200360200200041026a200141026a2d00003a0000200020012d00014101713a00010f0b200041103a00000f0b200041043a0000200041046a200141046a280200360200200041026a200141026a2d00003a0000200020012d00014101713a00010f0b41f00010262202450d092002200141046a280200104e200041083a0000200041046a20023602000f0b200041023a0000200041046a200141046a2802003602000f0b200041063a0000200041046a200141046a2802003602000f0b2000410e3a000020002001290001370001200041196a200141196a290000370000200041116a200141116a290000370000200041096a200141096a2900003700000f0b41f00010262202450d062002200141046a280200104e200041073a0000200041046a20023602000f0b200041093a000020002001290001370001200041196a200141196a290000370000200041116a200141116a290000370000200041096a200141096a2900003700000f0b2000410b3a0000200041106a200141106a290300370300200041046a200141046a2902003702000f0b4184bfc000104f000b41f0004108102a000b41f0004108102a000b41f0004108102a000b41f0004108102a000bca1904027f027e077f027e230041c0016b2202240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001280200417f6a2203410c4b0d000240024020030e0d002205080c0b06070409030a01000b20004101360200200041086a200141086a290300370300200241c0016a24000f0b200128020422034102460d0b20034101470d2241f00010262203450d272003200141086a2802001050410121010c130b200241d0006a200141086a105120004100360200200041106a200241d0006a41086a290300370300200041086a2002290350370300200241c0016a24000f0b200141086a280200417f6a220341044b0d21024020030e05001b191a18000b200141386a2903002104200141306a2903002105410121032001410c6a2d00004101470d1b200141106a28020021010c1c0b20004109360200200041086a200141086a290300370300200241c0016a24000f0b200141086a28020022034102460d0820034101470d202001410c6a22032d00004101470d10200141106a2802002106410121030c110b200241d0006a200141086a105220004107360200200041c0006a200241d0006a41386a290300370300200041386a200241d0006a41306a290300370300200041306a200241d0006a41286a290300370300200041286a200241d0006a41206a290300370300200041206a200241d0006a41186a290300370300200041186a200241d0006a41106a290300370300200041106a200241d0006a41086a290300370300200041086a2002290350370300200241c0016a24000f0b200241d0006a200141046a105320004108360200200041246a200241f0006a2903003702002000411c6a200241e8006a290300370200200041146a200241e0006a2903003702002000410c6a200241d0006a41086a29030037020020002002290350370204200241c0016a24000f0b200241d0006a41186a200141286a290000370300200241d0006a41106a200141206a290000370300200241d8006a200141186a290000370300200241d0006a41286a200141386a290000370300200241d0006a41306a200141c0006a290000370300200241d0006a41386a200141c8006a2900003703002002200141106a2900003703502002200141306a2900003703702001410c6a2802002203417f4c0d1a2003450d0620012802042106200310262201450d1e2001200620031094041a0c070b2001410c6a2802002203417f4c0d192003450d0720012802042106200310262201450d1e2001200620031094041a0c080b200241d0006a200141086a1054200041086a200241d0006a41e8001094041a2000410c360200200241c0016a24000f0b200241d0006a200141086a104d20004106360200200041286a200241d0006a41206a290300370300200041206a200241d0006a41186a290300370300200041186a200241d0006a41106a290300370300200041106a200241d0006a41086a290300370300200041086a2002290350370300200241c0016a24000f0b200241d0006a200141086a105520004105360200200041386a200241d0006a41306a290300370300200041306a200241d0006a41286a290300370300200041286a200241d0006a41206a290300370300200041206a200241d0006a41186a290300370300200041186a200241d0006a41106a290300370300200041106a200241d0006a41086a290300370300200041086a2002290350370300200241c0016a24000f0b41012103200141086a2d00004101470d052001410c6a28020021060c060b410121032001410c6a22062d00004101470d09200141106a28020021060c0a0b410121010b200241106a41386a2206200241d0006a41386a290300370300200241106a41306a2207200241d0006a41306a290300370300200241106a41286a2208200241d0006a41286a290300370300200241106a41206a2209200241d0006a41206a290300370300200241106a41186a220a200241d0006a41186a290300370300200241106a41106a220b200241d0006a41106a290300370300200241106a41086a220c200241d0006a41086a290300370300200220022903503703102000410c6a2003360200200041086a200336020020002001360204200041106a2002290310370200200041186a200c290300370200200041206a200b290300370200200041286a200a290300370200200041306a2009290300370200200041386a2008290300370200200041c0006a2007290300370200200041c8006a200629030037020020004104360200200241c0016a24000f0b410121010b200020013602042000410a3602002000410c6a2003360200200041086a2003360200200241c0016a24000f0b200241106a41086a200141186a290200370300200241106a41106a200141206a2802003602002002200141106a290200370310200141246a350200200141286a310000422086842104200141096a2f00002001410b6a2d00004110747221072001410c6a2802002106410021030b200241d0006a41106a200241106a41106a280200360200200241d0006a41086a200241106a41086a2903003703002002200229031037035020032007410874722103410221010b200020013602042000410d3602002000410c6a2006360200200041086a2003360200200041106a2002290350370200200041246a2004370200200041186a200241d0006a41086a290300370200200041206a200241d0006a41106a280200360200200241c0016a24000f0b200241be016a200341036a2d00003a0000200241d8006a2001411c6a290200370300200241d0006a41106a200141246a290200370300200241e8006a2001412c6a2d00003a0000200220032f00013b01bc012002200141146a290200370350200141106a2802002106410021030b2002410c6a41026a200241bc016a41026a2d00003a0000200241106a41086a200241d0006a41086a290300370300200241106a41106a200241d0006a41106a290300370300200241106a41186a200241d0006a41186a280200360200200220022f01bc013b010c20022002290350370310200141386a2903002104200141306a2903002105410121070c020b200241be016a200641036a2d00003a0000200241d8006a2001411c6a290200370300200241d0006a41106a200141246a290200370300200241e8006a2001412c6a2d00003a0000200220062f00013b01bc012002200141146a290200370350200141106a2802002106410021030b410221072002410c6a41026a200241bc016a41026a2d00003a0000200241106a41086a200241d0006a41086a290300370300200241106a41106a200241d0006a41106a290300370300200241106a41186a200241d0006a41186a280200360200200220022f01bc013b010c20022002290350370310200141c8006a290300210d200141c0006a290300210e200141386a2903002104200141306a29030021050b200020022f010c3b000d20004103360200200041c8006a200d370300200041c0006a200e370300200041386a2004370300200041306a20053703002000410c6a20033a0000200041086a2007360200200041106a2006360200200041146a20022903103702002000410f6a2002410e6a2d00003a00002000411c6a200241106a41086a290300370200200041246a200241106a41106a2903003702002000412c6a200241286a280200360200200241c0016a24000f0b2001410c6a28020022034108762106410521010c050b200241d0006a41106a200141206a2903003703002002200141186a2903003703582002200141106a2802003602502001410c6a28020022034108762106200141286a290300210e410321010c040b2001410c6a28020022034108762106410421010c030b2002200141186a2903003703582002200141106a29030037035041022101410021030c020b200241186a2001411c6a290200370300200241106a41106a200141246a2802003602002002200141146a290200370310200141286a3502002001412c6a31000042208684210e2001410d6a2f00002001410f6a2d0000411074722106200141106a2802002101410021030b200241dc006a200241186a290300370200200241e4006a200241206a2802003602002002200229031037025420022001360250410121010b2000410b360200200041386a2004370300200041306a2005370300200041086a2001360200200041106a2002290350370300200041286a200e3703002000410c6a2006410874200341ff017172360200200041186a200241d0006a41086a290300370300200041206a200241d0006a41106a290300370300200241c0016a24000f0b1056000b101d000b41c8c8c300104f000b41c8edc300104f000b41c0b8c200104f000b20034101102a000b20034101102a000b41f0004108102a000b6802017f037e230041306b22012400200029020821022000290210210320002902002104200141146a410036020020012004370318200141a886c500360210200142013702042001200141186a36020020012003370328200120023703202001200141206a1061000be21904027f027e077f027e230041c0016b22022400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001280200417f6a2203410c4b0d000240024020030e0d002205080c0b06070409030a01000b20004101360200200041086a200141086a290300370300200241c0016a24000f0b200128020422034102460d0b20034101470d2241f00010262203450d252003200141086a2802001050410121010c130b200241d0006a200141086a105120004100360200200041106a200241d0006a41086a290300370300200041086a2002290350370300200241c0016a24000f0b200141086a280200417f6a220341044b0d21024020030e05001b191a18000b200141386a2903002104200141306a2903002105410121032001410c6a2d00004101470d1b200141106a28020021010c1c0b20004109360200200041086a200141086a290300370300200241c0016a24000f0b200141086a28020022034102460d0820034101470d202001410c6a22032d00004101470d10200141106a2802002106410121030c110b200241d0006a200141086a105220004107360200200041c0006a200241d0006a41386a290300370300200041386a200241d0006a41306a290300370300200041306a200241d0006a41286a290300370300200041286a200241d0006a41206a290300370300200041206a200241d0006a41186a290300370300200041186a200241d0006a41106a290300370300200041106a200241d0006a41086a290300370300200041086a2002290350370300200241c0016a24000f0b200241d0006a200141046a105320004108360200200041246a200241f0006a2903003702002000411c6a200241e8006a290300370200200041146a200241e0006a2903003702002000410c6a200241d0006a41086a29030037020020002002290350370204200241c0016a24000f0b200241d0006a41186a200141286a290000370300200241d0006a41106a200141206a290000370300200241d8006a200141186a290000370300200241d0006a41286a200141386a290000370300200241d0006a41306a200141c0006a290000370300200241d0006a41386a200141c8006a2900003703002002200141106a2900003703502002200141306a2900003703702001410c6a2802002203417f4c0d1a200128020421012003450d062003102622060d0720034101102a000b2001410c6a2802002203417f4c0d19200128020421012003450d072003102622060d0820034101102a000b200241d0006a200141086a1054200041086a200241d0006a41e8001094041a2000410c360200200241c0016a24000f0b200241d0006a200141086a104d20004106360200200041286a200241d0006a41206a290300370300200041206a200241d0006a41186a290300370300200041186a200241d0006a41106a290300370300200041106a200241d0006a41086a290300370300200041086a2002290350370300200241c0016a24000f0b200241d0006a200141086a105520004105360200200041386a200241d0006a41306a290300370300200041306a200241d0006a41286a290300370300200041286a200241d0006a41206a290300370300200041206a200241d0006a41186a290300370300200041186a200241d0006a41106a290300370300200041106a200241d0006a41086a290300370300200041086a2002290350370300200241c0016a24000f0b41012103200141086a2d00004101470d052001410c6a2802002106410021070c060b410121032001410c6a22062d00004101470d09200141106a28020021060c0a0b410121060b2006200120031094042101200241106a41386a2206200241d0006a41386a290300370300200241106a41306a2207200241d0006a41306a290300370300200241106a41286a2208200241d0006a41286a290300370300200241106a41206a2209200241d0006a41206a290300370300200241106a41186a220a200241d0006a41186a290300370300200241106a41106a220b200241d0006a41106a290300370300200241106a41086a220c200241d0006a41086a290300370300200220022903503703102000410c6a2003360200200041086a200336020020002001360204200041106a2002290310370200200041186a200c290300370200200041206a200b290300370200200041286a200a290300370200200041306a2009290300370200200041386a2008290300370200200041c0006a2007290300370200200041c8006a200629030037020020004104360200200241c0016a24000f0b410121060b20062001200310940421012000410c6a2003360200200041086a2003360200200020013602042000410a360200200241c0016a24000f0b200241d0006a41086a200141186a290200370300200241d0006a41106a200141206a290200370300200241d0006a41186a200141286a2d00003a00002002200141106a290200370350200141096a2f00002001410b6a2d00004110747241087421072001410c6a2802002106410021030b200241106a41186a200241d0006a41186a280200360200200241106a41106a200241d0006a41106a290300370300200241106a41086a200241d0006a41086a2903003703002002200229035037031020032007722103410221010b200020013602042000410d3602002000410c6a2006360200200041086a2003360200200041106a2002290310370200200041186a200241106a41086a290300370200200041206a200241106a41106a290300370200200041286a200241106a41186a280200360200200241c0016a24000f0b200241be016a200341036a2d00003a0000200241d8006a2001411c6a290200370300200241d0006a41106a200141246a290200370300200241e8006a2001412c6a2d00003a0000200220032f00013b01bc012002200141146a290200370350200141106a2802002106410021030b2002410c6a41026a200241bc016a41026a2d00003a0000200241106a41086a200241d0006a41086a290300370300200241106a41106a200241d0006a41106a290300370300200241106a41186a200241d0006a41186a280200360200200220022f01bc013b010c20022002290350370310200141386a2903002104200141306a2903002105410121070c020b200241be016a200641036a2d00003a0000200241d8006a2001411c6a290200370300200241d0006a41106a200141246a290200370300200241e8006a2001412c6a2d00003a0000200220062f00013b01bc012002200141146a290200370350200141106a2802002106410021030b410221072002410c6a41026a200241bc016a41026a2d00003a0000200241106a41086a200241d0006a41086a290300370300200241106a41106a200241d0006a41106a290300370300200241106a41186a200241d0006a41186a280200360200200220022f01bc013b010c20022002290350370310200141c8006a290300210d200141c0006a290300210e200141386a2903002104200141306a29030021050b200020022f010c3b000d20004103360200200041c8006a200d370300200041c0006a200e370300200041386a2004370300200041306a20053703002000410c6a20033a0000200041086a2007360200200041106a2006360200200041146a20022903103702002000410f6a2002410e6a2d00003a00002000411c6a200241106a41086a290300370200200041246a200241106a41106a2903003702002000412c6a200241286a280200360200200241c0016a24000f0b2001410c6a28020022034108762106410521010c050b200241d0006a41106a200141206a2903003703002002200141186a2903003703582002200141106a2802003602502001410c6a28020022034108762106200141286a290300210e410321010c040b2001410c6a28020022034108762106410421010c030b2002200141186a2903003703582002200141106a29030037035041002103410221010c020b200241186a2001411c6a290200370300200241106a41106a200141246a2802003602002002200141146a290200370310200141286a3502002001412c6a31000042208684210e2001410d6a2f00002001410f6a2d0000411074722106200141106a2802002101410021030b200241dc006a200241186a290300370200200241e4006a200241206a2802003602002002200229031037025420022001360250410121010b2000410b360200200041386a2004370300200041306a2005370300200041086a2001360200200041106a2002290350370300200041286a200e3703002000410c6a2006410874200341ff017172360200200041186a200241d0006a41086a290300370300200041206a200241d0006a41106a290300370300200241c0016a24000f0b1056000b101d000b41c8c8c300104f000b41c8edc300104f000b41c0b8c200104f000b41f0004108102a000bbe0703037f017e077f024002400240024002400240024002400240024002402001280200417f6a220241044b0d000240024002400240024002400240024002400240024020020e050004020301000b2001410c6a2802002202417f4c0d13200128020421034101210102402002450d00200210262201450d0c0b20012003200210940421012000410c6a2002360200200041086a200236020020002001360204200041013602000f0b2001410c6a2802002204ad420c7e2205422088a70d122005a72202417f4c0d12200128020421032002450d03200210262206450d0b410c21072004450d040c100b2001410c6a2802002202417f4c0d11200128020421012002450d042002102622030d0520024101102a000b2001410c6a2802002206ad42187e2205422088a70d102005a72203417f4c0d10200128020421022003450d0520031026220c450d0a2006450d060c0b0b20004102360200200041086a200141086a2903003703000f0b41042106410c210720040d0c0b410021090c0c0b410121030b20032001200210940421012000410c6a2002360200200041086a200236020020002001360204200041033602000f0b4104210c20060d050b4100210b0c050b41b89ac300104f000b20024101102a000b20024104102a000b20034104102a000b2002200641186c6a21044100210b200c21010340200241086a2802002203417f4c0d050240024002402003450d0020022802002107200310262209450d012009200720031094041a200241146a2802002207417f4c0d080c020b41012109200241146a2802002207417f4a0d010c070b20034101102a000b024002402007450d002002410c6a280200210820071026220a450d04200a200820071094041a0c010b4101210a0b20012009360200200141146a2007360200200141106a20073602002001410c6a200a360200200141086a2003360200200141046a2003360200200141186a2101200b41016a210b200241186a22022004470d000b0b2000200c360204200041043602002000410c6a200b360200200041086a20063602000f0b20074101102a000b2003200420076c6a210841002109200621020340200341086a2802002201417f4c0d022003280200210a024002402001450d0020011026220b0d010c050b4101210b0b200b200a2001109404210a200241086a2001360200200241046a20013602002002200a360200200220076a2102200941016a2109200320076a22032008470d000b0b2000200636020420004105360200200020076a2009360200200041086a20043602000f0b101d000b20014101102a000bae0a01047f230041206b220224000240024002402001280200417f6a220341094b0d0002400240024002400240024002400240024002400240024002400240024002400240024020030e0a00060304010708050902000b2001410c6a2802002203417f4c0d12200128020421044101210502402003450d00200310262205450d140b20052004200310940421052000410c6a2003360200200041086a20033602002000200536020420004101360200200041106a200141106a290200370300200241206a24000f0b2000410536020020002001280204360204200241206a24000f0b2000410a360200200041086a200141086a290300370300200241206a24000f0b2001280204210541012103200141086a22042d00004101470d062001410c6a28020021040c070b2000410436020020002001280204360204200241206a24000f0b4101210320012d00044101470d06200141086a28020021010c070b2001410c6a2802002203417f4c0d0c200128020421052003450d092003102622040d0a20034101102a000b4101210320012d00044101470d06200141086a28020021050c070b2000410736020020002001280204360204200241206a24000f0b20004109360200200041086a200141086a290300370300200241206a24000f0b2002411e6a200441036a2d00003a0000200241086a200141186a290200370300200241106a200141206a290200370300200241186a200141286a2d00003a0000200220042f00013b011c2002200141106a2902003703002001410c6a2802002104410021030b20002005360204200020022f011c3b0009200041086a20033a00002000410c6a2004360200200041106a20022903003702002000410b6a2002411e6a2d00003a0000200041186a200241086a290300370200200041206a200241106a290300370200200041286a200241186a2802003602002000412c6a2001412c6a29020037020020004103360200200241206a24000f0b2002411e6a200141046a220341036a2d00003a0000200241086a200141146a290200370300200241106a2001411c6a290200370300200241186a200141246a2d00003a0000200220032f00013b011c20022001410c6a290200370300200141086a2802002101410021030b200020022f011c3b0005200020033a000420004108360200200041086a20013602002000410c6a2002290300370200200041076a2002411e6a2d00003a0000200041146a200241086a2903003702002000411c6a200241106a290300370200200041246a200241186a280200360200200241206a24000f0b2002411e6a200141046a220341036a2d00003a0000200241086a200141146a290200370300200241106a2001411c6a290200370300200241186a200141246a2d00003a0000200220032f00013b011c20022001410c6a290200370300200141086a2802002105410021030b200020033a0004200020022f011c3b0005200041086a20053602002000410c6a2002290300370200200041386a200141386a290300370300200041306a200141306a290300370300200041076a2002411e6a2d00003a0000200041146a200241086a2903003702002000411c6a200241106a290300370200200041246a200241186a280200360200200141286a280200210120004106360200200041286a2001360200200241206a24000f0b410121040b20042005200310940421052000410c6a2003360200200041086a20033602002000200536020420004102360200200041106a200141106a290200370300200241206a24000f0b41d8b8c200104f000b101d000b20034101102a000b900201027f024002400240024020012d000022024103460d00024020024102460d0020024101470d0241f00010262202450d032002200141046a28020010b703200041013a0000200041046a20023602000f0b200141046a280200210341f00010262202450d032002200141086a28020010b703200041086a2002360200200041046a2003360200200041023a00000f0b200041033a000020002001290001370001200041096a200141096a290000370000200041116a200141116a290000370000200041196a200141196a290000370000200041246a200141246a280200360200200041216a200141216a2d00004100473a00000f0b41f496c400104f000b41f0004108102a000b41f0004108102a000b840f02057f037e230041c0006b220224000240024002400240024020012d0000417f6a220341054b0d000240024002400240024002400240024002400240024002400240024020030e06000402030105000b200041e0006a200141e0006a280200360200200041d8006a200141d8006a290300370300200041d0006a200141d0006a290300370300200041c8006a200141c8006a290300370300200041c0006a200141c0006a290300370300200041386a200141386a290300370300200041306a200141306a290300370300200041286a200141286a290300370300200041206a200141206a290300370300200041186a200141186a290300370300200041106a200141106a290300370300200041086a200141086a290300370300200041e4006a200141e4006a2d00004100473a0000200041013a0000200241c0006a24000f0b200241186a2204200141196a290000370300200241106a2205200141116a290000370300200241086a2206200141096a29000037030020022001290001370300410021030240200141216a2d00004101470d00200241206a41186a2001413a6a290000370300200241206a41106a200141326a290000370300200241206a41086a2001412a6a2900003703002002200141226a290000370320410121030b20002002290300370001200041216a20033a0000200041226a2002290320370000200041196a2004290300370000200041116a2005290300370000200041096a20062903003700002000412a6a200241206a41086a290300370000200041326a200241206a41106a2903003700002000413a6a200241206a41186a290300370000200041053a0000200241c0006a24000f0b41012104200141046a2d00004101470d03200141086a28020021050c040b200141386a2903002107200141306a2903002108200141c0006a2903002109200241386a200141196a290000370300200241306a200141116a290000370300200241286a200141096a290000370300200220012900013703202001412c6a2802002203417f4c0d0b2003450d04200141246a2802002104200310262201450d0c2001200420031094041a0c050b2001410c6a2802002203417f4c0d0a200141106a29030021072003450d05200141046a2802002104200310262201450d0c2001200420031094041a0c060b200241186a200141196a290000370300200241106a200141116a290000370300200241086a200141096a29000037030020022001290001370300200241206a41186a200141396a290000370300200241206a41106a200141316a290000370300200241206a41086a200141296a2900003703002002200141216a290000370320200141cc006a2802002203ad2207421b88a70d092007420586a72204417f4c0d09200141d8006a2903002107200141d0006a2903002108200141c4006a28020021012004450d062004102622050d0720044101102a000b200241026a200141076a2d00003a0000200241206a41086a200141146a290000370300200241306a2001411c6a290000370300200241386a200141246a2d00003a00002002200141056a2f00003b010020022001410c6a290000370320200141086a2800002105410021040b200141306a2802002203417f4c0d07200141c0006a2903002107200141386a2903002108200141c8006a2903002109024002402003450d00200141286a2802002106200310262201450d0c2001200620031094041a0c010b410121010b200041c0006a2007370300200041386a2008370300200041056a20022f01003b0000200041046a20043a0000200041086a20053602002000410c6a2002290320370200200041c8006a2009370300200041306a20033602002000412c6a2003360200200041286a2001360200200041076a200241026a2d00003a0000200041146a200241206a41086a2903003702002000411c6a200241306a290300370200200041246a200241386a280200360200200041033a0000200241c0006a24000f0b410121010b20002002290320370001200041043a0000200041386a2007370300200041306a2008370300200041c0006a20093703002000412c6a2003360200200041286a2003360200200041246a2001360200200041096a200241286a290300370000200041116a200241306a290300370000200041196a200241386a290300370000200241c0006a24000f0b410121010b200041023a00002000410c6a2003360200200041086a2003360200200041046a2001360200200041106a2007370300200241c0006a24000f0b410121050b2005200120034105741094042101200041d8006a2007370300200041d0006a2008370300200041196a200241186a290300370000200041116a200241106a290300370000200041096a200241086a29030037000020002002290300370001200041216a2002290320370000200041296a200241206a41086a290300370000200041316a200241206a41106a290300370000200041396a200241206a41186a290300370000200041cc006a2003360200200041c8006a2003360200200041c4006a2001360200200041063a0000200241c0006a24000f0b41a48fc300104f000b101d000b20034101102a000b20034101102a000b20034101102a000b940d03047f017e057f230041206b220224000240024002400240024002400240024020012d0000417f6a2203410c4b0d0002400240024002400240024002400240024002400240024002400240024002400240024002400240024020030e0d0008050602090a070c040b0103000b41012103200141046a2d00004101470d0c200141086a28020021040c0d0b2000410c3a0000200041046a200141046a280200360200200241206a24000f0b200041053a0000200041106a200141106a290300370300200041086a200141086a290300370300200041186a200141186a280200360200200241206a24000f0b2001410c6a2802002205ad2206421b88a70d122006420586a72203417f4c0d12200141046a28020021072003450d0d200310262208450d132005450d0e0c170b2000410a3a0000200041046a200141046a280200360200200241206a24000f0b200041033a0000200041106a200141106a290300370300200041086a200141086a290300370300200241206a24000f0b200041043a0000200241206a24000f0b200041083a0000200020012d00013a0001200241206a24000f0b200041023a0000200041106a200141106a290300370300200041086a200141086a290300370300200241206a24000f0b2001410c6a280200220aad42247e2206422088a70d0c2006a72204417f4c0d0c200141046a28020021032004450d0920041026220b450d0e200a450d0a0c0f0b200041073a0000200241206a24000f0b2000410b3a0000200241206a24000f0b41012103200141046a2d00004101470d02200141086a28020021010c030b2002411e6a200141076a2d00003a0000200241086a200141146a290000370300200241106a2001411c6a290000370300200241186a200141246a2d00003a00002002200141056a2f00003b011c20022001410c6a290000370300200141086a2800002104410021030b200041046a20033a0000200041056a20022f011c3b0000200041086a20043602002000410c6a2002290300370200200041306a200141306a290300370300200041286a200141286a290300370300200041076a2002411e6a2d00003a0000200041146a200241086a2903003702002000411c6a200241106a290300370200200041246a200241186a280200360200200141016a2d00002101200041013a0000200020013a0001200241206a24000f0b2002411e6a200141076a2d00003a0000200241086a200141146a290000370300200241106a2001411c6a290000370300200241186a200141246a2d00003a00002002200141056a2f00003b011c20022001410c6a290000370300200141086a2800002101410021030b200041093a0000200041056a20022f011c3b0000200041046a20033a0000200041086a20013602002000410c6a2002290300370200200041076a2002411e6a2d00003a0000200041146a200241086a2903003702002000411c6a200241106a290300370200200041246a200241186a280200360200200241206a24000f0b4101210820050d090b41002105410021010c090b4104210b200a0d050b410021040c050b41e89dc100104f000b101d000b20034101102a000b20044104102a000b200a41246c2105410021042002411e6a2109200b210103400240024020032d00004101470d00200341046a2802002107410121080c010b2009200341036a2d00003a0000200341046a2800002107200341016a2f00002108200241186a200341206a2d00003a0000200241106a200341186a290000370300200241086a200341106a290000370300200220083b011c2002200341086a290000370300410021080b200341246a2103200120083a0000200141046a2007360200200141036a20092d00003a0000200141016a20022f011c3b0000200141206a200241186a280200360200200141186a200241106a290300370200200141106a200241086a290300370200200141086a2002290300370200200141246a2101200441016a21042005415c6a22050d000b0b200041063a00002000410c6a2004360200200041086a200a360200200041046a200b360200200241206a24000f0b20054105742104416020076b21092008210120072103034020012003290000370000200141186a200341186a290000370000200141106a200341106a290000370000200141086a200341086a290000370000200141206a2101200341206a2103200441606a22040d000b200720054105746a20096a41057641016a21010b2000410d3a00002000410c6a2001360200200041086a2005360200200041046a2008360200200241206a24000b0a00419896c400104f000bd9b40107027f027e017f017e0f7f017e077f230041b0066b2203240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d0000417f6a2204410f4b0d00024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040e10000a0608030b0d0910050e02040c0107000b200141106a2903002105200141086a2903002106200141046a28020021072002411a6a2901002108200241196a2d00002109200241186a2d0000210a200241166a2f0100210b200241156a2d0000210c200241146a2d0000210d200241126a2f0100210e200241116a2d0000210f200241106a2d000021102002410e6a2f010021112002410d6a2d00002112200241046a2d00002113200241026a2f0100211420022d0000450d1e200320083702f403200320093a00f3032003200a3a00f2032003200b3b01f003410121020c1f0b200141216a2d0000210b200341186a41186a200141196a290000370300200341186a41106a200141116a290000370300200341186a41086a200141096a290000370300200320012900013703182002411a6a2901002108200241196a2d00002115200241186a2d00002109200241166a2f0100210a200241156a2d0000210c200241146a2d0000210d200241126a2f0100210e200241116a2d0000210f200241106a2d000021102002410e6a2f010021112002410d6a2d00002112200241046a2d00002113200241026a2f0100211420022d0000450d0f200320083702f403200320153a00f303200320093a00f2032003200a3b01f003410121020c100b200341d8006a41186a200141196a290000370300200341d8006a41106a200141116a290000370300200341d8006a41086a200141096a29000037030020032001290001370358200241166a2f01002104200241186a2d00002116200241196a2d000021072002411a6a290100210820022d0000450d11200320083702f403200320073a00f303200320163a00f203200320043b01f0030c230b2002410c6a280200210a200241086a280200210b200241046a2802002115200141106a2903002105200141086a2903002108200141046a2802002117200241036a2d0000211620022d0000210420012d0001210920022f00012107200341f0036a41086a2002411c6a2802003602002003200241146a2902003703f0032004450d1141012102201541ff01710d12200b200a4f0d130c120b2002411a6a2901002108200241196a2d00002116200241186a2d00002107200241166a2f0100211720022d0000450d14200320083702f403200320163a00f303200320073a00f203200320173b01f0030c210b20022d000120022d0000720d09200141046a28020010350c98010b2002411a6a2901002108200241196a2d00002104200241186a2d00002116200241166a2f0100211720022d0000450d13200320083702f403200320043a00f303200320163a00f203200320173b01f0030c1f0b2002411a6a2901002108200241196a2d00002115200241186a2d00002109200241166a2f0100210a200241156a2d0000210b200241146a2d0000210c200241126a2f0100210d200241116a2d0000210e200241106a2d0000210f2002410e6a2f010021102002410d6a2d00002111200241046a2d00002112200241026a2f0100211320022d0000450d13200320083702f403200320153a00f303200320093a00f2032003200a3b01f003410121020c140b2002411a6a2901002108200241196a2d00002104200241186a2d00002116200241166a2f0100210720022d0000450d15200320083702f403200320043a00f303200320163a00f203200320073b01f0030c1d0b200141046a280200210741ef94c4002104410e211620022d0000450d9101200241046a2d00000d9101200241086a28020041036c2002410c6a280200410174490d910120034188066a41086a220242003703002003420037038806418388c000411620034188066a1000200341a8056a41086a200229030037030020032003290388063703a805200341a8056a411041a886c500410041001001417f460d37419fc1c0002104411521160c91010b200141046a280200210b2002411a6a2901002108200241196a2d00002115200241186a2d00002109200241166a2f0100210a200241156a2d0000210c200241146a2d0000210d200241126a2f0100210e200241116a2d0000210f200241106a2d000021102002410e6a2f010021112002410d6a2d00002112200241046a2d00002113200241026a2f0100211420022d0000450d17200320083702f403200320153a00f303200320093a00f2032003200a3b01f003410121020c180b41ef94c4002104410e21164101210720022d0000450d8d01200241046a2d00000d8d0141012107200241086a28020041036c2002410c6a280200410174490d8d01200341e8026a200141046a2802002216103820032802f002410e470d3441cac2c0002104410d21160c8d010b200341e8056a41186a200141196a290000370300200341e8056a41106a200141116a290000370300200341e8056a41086a200141096a290000370300200320012900013703e8052002411a6a2901002108200241196a2d00002104200241186a2d00002116200241166a2f0100210720022d0000450d18200320083702f403200320043a00f303200320163a00f203200320073b01f0030c190b200141046a280200210741ef94c4002104410e211620022d0000450d8c01200241086a2802004101742002410c6a280200490d8c01200241046a28020041ff01710d8c0120034188066a41086a220242003703002003420037038806418388c000411620034188066a1000200341a8056a41086a200229030037030020032003290388063703a805200341a8056a411041a886c500410041001001417f460d25419fc1c0002104411521160c8c010b20022d000120022d000072450d180b41b394c3002104412821160c92010b200341e0056a200141196a290000370300200341c8056a41106a200141116a290000370300200341c8056a41086a200141096a290000370300200320012900013703c805024020022d0000450d00200241236a2d00002116200241216a2f000021072002411f6a2d000021172002411d6a2f000021152002410f6a2d000021092002410d6a2f0000210a2002410b6a2d0000210b200241096a2f0000210c200241076a2d0000210d200241056a2f0000210e200241246a3502002106200241206a3100002118200241116a2900002108200241106a2d0000210f2002410c6a2d00002110200241086a2d00002111200241046a2d000021042003200241196a2800003602f803200320083703f0032004450d00200320032902f40322054238883c00ff05200320054230883c00fe05200320054220883d01fc05200320054218883c00fb05200320054210883c00fa05200320053d01f8052003200f3a00f3052003200a2009411074724108742010723600ef052003200c200b411074724108742011723600eb05200320083d01f405200320084218883c00f7052003200e200d4110747222023b01e805200320024110763a00ea0520032008a74110763a00f605200320184218862015201741107472ad42ffffff0783842007201641107472ad42ffffff0783422086842006423886843703800620034188066a41086a220242003703002003420037038806418388c000411620034188066a1000200341a8056a41086a200229030037030020032003290388063703a805200341a8056a411041a886c500410041001001417f460d212003421037028c062003200341a8056a36028806200341e8026a20034188066a102f20032802e802410e460d4c200341d8006a200341e8026a41f0001094041a200341003a00af06200328028806200328028c06200341af066a410120034190066a22022802001001210420022002280200200441016a41014b22046a3602002004450d4b20032d00af0641034f0d4b20032802582102200341e0016a200341d8006a41047241ec001094041a2002410e460d4c200341f0036a200341e0016a41ec001094041a200320023602e802200341e8026a410472200341f0036a41ec001094041a2003410036026020034201370358200341e8026a200341d8006a1039200328025c2104200328026021072003280258210220034188066a41186a221742003703004110211620034188066a41106a2215420037030020034188066a41086a2209420037030020034200370388062002200720034188066a1002200341d8006a41186a2017290300370300200341d8006a41106a2015290300370300200341d8006a41086a2009290300370300200320032903880637035802402004450d00200210230b200341c8056a200341d8006a41201096042102200341e8026a10244181c2c000210420020d8801200341e8026a200341c8056a105820032802f002220b450d364100210220032902f4022208422088a72204450d37024020044101460d004100210203402004410176221620026a22072002200b20074105746a200341e8056a41201096044101481b2102200420166b220441014b0d000b0b200b20024105746a200341e8056a41201096042204450d442004411f7620026a21020c370b41ef94c4002104410e21160c87010b2002410c6a2d000021162002410a6a2f01002107200241096a2d00002117200241086a2d00002119200241066a2f0100211a200241056a2d0000211b20022d00012104200320083703f00341012102200441ff01714101470d00201a410874201b722019411874722104410021020c010b41db94c300210441002107412a2117410021160b200741ffff0371410874201741ff017172201641187472211620020d84012003200837038005200320153a00ff04200320093a00fe042003200a3b01fc042003200c3a00fb042003200d3a00fa042003200e3b01f8042003200f3a00f704200320103a00f604200320113b01f404200320123a00f304200320163600ef04200320043600eb04200320133a00ea04200320143b01e80420034188056a41186a20032903800537030020034188056a41106a20032903f80437030020034188056a41086a200341e8046a41086a290300370300200320032903e80437038805200341e0016a41186a200341186a41186a290300370300200341e0016a41106a200341186a41106a290300370300200341e0016a41086a200341186a41086a2903003703002003200b3a008002200320032903183703e001411510262202450d432002410d6a41002900bc8640370000200241086a41002900b78640370000200241002900af864037000020024115413510272202450d4420022003290388053700152002412d6a20034188056a41186a290300370000200241256a20034188056a41106a2903003700002002411d6a20034188056a41086a29030037000020034188066a41186a2204420037030020034188066a41106a2207420037030020034188066a41086a2217420037030020034200370388062002413520034188066a1002200341f0036a41186a2004290300370300200341f0036a41106a2007290300370300200341f0036a41086a201729030037030020032003290388063703f003200341f0036a412041a886c500410041001001417f460d172003422037028c062003200341f0036a36028806200341e8026a20034188066a105920032d00890322044102460d4a200341386a41186a200341a2036a290100370300200341386a41106a2003419a036a290100370300200341386a41086a20034192036a290100370300200341d8006a41086a200341b3036a290000370300200341d8006a41106a200341bb036a290000370300200341d8006a41186a200341c3036a2900003703002003200329018a033703382003200341ab036a290000370358200341aa036a2d000021070c82010b200241026a2f01002115200241046a2d00002109200241056a2d0000210a200241066a2f0100210b200241086a2d0000210c200241096a2d0000210d2002410a6a2f0100210e2002410c6a2d0000210f2002410d6a2d000021102002410e6a2f01002111200241106a2d00002112200241116a2d00002113200241126a2f01002114200241146a2d00002119200241156a2d0000211a20022d00012102200320083703f003200241ff01714101470d11410f10262202450d4f200241076a41002900a78640370000200241002900a086403700002002410f412f10272202450d502002200329035837000f200241276a200341d8006a41186a221c2903003700002002411f6a200341d8006a41106a221d290300370000200241176a200341d8006a41086a221e29030037000020034188066a41186a2217420037030020034188066a41106a221b420037030020034188066a41086a221f420037030020034200370388062002412f20034188066a1002200341f0036a41186a2017290300370300200341f0036a41106a201b290300370300200341f0036a41086a201f29030037030020032003290388063703f003200341f0036a412041a886c5004100410010012117200210232017417f460d284191c2c0002104410f21160c83010b410021020b200220072016411074727241ff0171450d00201710244128211641b394c30021040c010b4200210620034188066a41086a22024200370300200342003703880641af98c300410d20034188066a1000200341a8056a41086a200229030037030020032003290388063703a8050240200341a8056a411041a886c500410041001001417f460d00200342003703e802200341a8056a4110200341e8026a41084100100141016a41084d0d3f20032903e80221060b200341e8026a201741f0001094041a200341d8006a2006200842c0ca01200842c0ca01561b7c200341e8026a20092005102d4101210720032802584101470d10200328025c2204450d10200341d8006a41086a28020021160b201710234100211541012107410121170c84010b200241156a2d00002115200241146a2d00002109200241126a2f0100210a200241116a2d0000210b200241106a2d0000210c2002410e6a2f0100210d2002410d6a2d0000210e2002410c6a2d0000210f2002410a6a2f01002110200241096a2d00002111200241086a2d00002112200241066a2f01002113200241056a2d00002114200241046a2d00002119200241026a2f0100211a20022d00012102200320083703f003200241ff01714101470d0c410f10262202450d4c41002104200241076a41002900a78640370000200241002900a086403700002002410f412f10272202450d4d20022008370027200220163a0026200220073a0025200220173b0023200220153a0022200220093a00212002200a3b001f2002200b3a001e2002200c3a001d2002200d3b001b2002200e3a001a20022010410874201172200f4118747236001620022013410874201472201241187472360012200220193a00112002201a3b000f20034188066a41186a2216420037030020034188066a41106a2207420037030020034188066a41086a2217420037030020034200370388062002412f20034188066a1002200341f0036a41186a2016290300370300200341f0036a41106a2007290300370300200341f0036a41086a201729030037030020032003290388063703f003200341f0036a41201003200210230c85010b200241156a2d00002115200241146a2d00002109200241126a2f0100210a200241116a2d0000210b200241106a2d0000210c2002410e6a2f0100210d2002410d6a2d0000210e2002410c6a2d0000210f2002410a6a2f01002110200241096a2d00002111200241086a2d00002112200241066a2f01002113200241056a2d00002114200241046a2d00002119200241026a2f0100211a200141026a2d0000211b200141046a280200211f20022d0001210220012d0001211c200320083703f00341012107200241ff01714101470d0b2003200837038003200320043a00ff02200320163a00fe02200320173b01fc02200320153a00fb02200320093a00fa022003200a3b01f8022003200b3a00f7022003200c3a00f6022003200d3b01f4022003200e3a00f302200320193a00ea022003201a3b01e80220032010410874200f411874722011723600ef02200320134108742014722012411874723600eb02200341e8026a201f201c41ff0171410047201b105a2104412221160c7e0b2002410c6a2d000021162002410a6a2f01002107200241096a2d00002117200241086a2d00002114200241066a2f01002119200241056a2d0000211a20022d00012104200320083703f00341012102200441ff01714101470d002019410874201a722014411874722104410021020c010b41db94c300210441002107412a2117410021160b200741ffff0371410874201741ff017172201641187472211620020d7a2003200837038005200320153a00ff04200320093a00fe042003200a3b01fc042003200b3a00fb042003200c3a00fa042003200d3b01f8042003200e3a00f7042003200f3a00f604200320103b01f404200320113a00f304200320163600ef04200320043600eb04200320123a00ea04200320133b01e804411510262202450d3b2002410d6a41002900bc8640370000200241086a41002900b78640370000200241002900af864037000020024115413510272202450d3c200220032903e8043700152002412d6a200341e8046a41186a290300370000200241256a200341e8046a41106a2903003700002002411d6a200341e8046a41086a29030037000020034188066a41186a2204420037030020034188066a41106a2216420037030020034188066a41086a2207420037030020034200370388062002413520034188066a1002200341f0036a41186a2004290300370300200341f0036a41106a2016290300370300200341f0036a41086a200729030037030020032003290388063703f003200341f0036a412041a886c5004100410010012104200210232004417f460d0f411510262202450d412002410d6a41002900bc8640370000200241086a41002900b78640370000200241002900af864037000020024115413510272202450d42200220032903e8043700152002412d6a200341e8046a41186a290300370000200241256a200341e8046a41106a2903003700002002411d6a200341e8046a41086a29030037000020034188066a41186a2204420037030020034188066a41106a2216420037030020034188066a41086a2207420037030020034200370388062002413520034188066a1002200341f0036a41186a2004290300370300200341f0036a41106a2016290300370300200341f0036a41086a200729030037030020032003290388063703f003200341f0036a412041a886c500410041001001417f460d162003422037028c062003200341f0036a36028806200341e8026a20034188066a105920032d00890322164102460d45200341d8006a41086a20034192036a290100370300200341d8006a41106a2003419a036a290100370300200341d8006a41186a200341a2036a290100370300200341e0016a41086a200341b3036a290000370300200341e0016a41106a200341bb036a290000370300200341e0016a41186a200341c3036a2900003703002003200329018a033703582003200341ab036a2900003703e001200341aa036a2d0000211720032d0088032115200341f0036a412010030c170b200141026a2d0000211a200141046a280200211b20012d0001211f200241156a2d00002117200241146a2d00002115200241126a2f01002109200241116a2d0000210a200241106a2d0000210b2002410e6a2f0100210c2002410d6a2d0000210d2002410c6a2d0000210e2002410a6a2f0100210f200241096a2d00002110200241086a2d00002111200241066a2f01002112200241056a2d00002113200241046a2d00002114200241026a2f0100211920022d00012102200320083703f003200241ff01714101470d0720032008370370200320043a006f200320163a006e200320073b016c200320173a006b200320153a006a200320093b01682003200a3a00672003200b3a00662003200c3b01642003200d3a0063200320143a005a200320193b01582003200f410874200e4118747220107236005f2003201241087420137220114118747236005b200341e8026a200341d8006a104220032d00e8024101470d17200341f4026a2d00002102200341f5026a2900002108200341fd026a280000210420032f00e902211620032d00eb02210720032902ec022105200320034181036a29000037038003200320043602fc02200320083702f402200320023a00f302200320053700eb02200320073a00ea02200320163b01e802200341e8026a201b201f41ff0171410047201a105a2104412221160c790b2002410c6a2d000021162002410a6a2f01002117200241096a2d00002115200241086a2d00002119200241066a2f0100211a200241056a2d0000211b20022d00012104200320083703f00341012102200441ff01714101470d00201a410874201b722019411874722104410021020c010b412a21154100211641db94c3002104410021170b201741ffff0371410874201641187472201541ff017172211620020d0820032008370370200320093a006f2003200a3a006e2003200b3b016c2003200c3a006b2003200d3a006a2003200e3b01682003200f3a0067200320103a0066200320113b0164200320123a00632003201636005f2003200436005b200320133a005a200320143b0158200642ffffe883b1de165620054200522005501b0d0741f0bfc0002104410d21160c080b2002410c6a2d000021162002410a6a2f01002107200241096a2d00002117200241086a2d00002119200241066a2f0100211a200241056a2d0000211b20022d00012104200320083703f00341012102200441ff01714101470d00201a410874201b722019411874722104410021020c010b412a21174100211641db94c3002104410021070b200741ffff0371410874201641187472201741ff017172211620020d7320032008370370200320153a006f200320093a006e2003200a3b016c2003200c3a006b2003200d3a006a2003200e3b01682003200f3a0067200320103a0066200320113b0164200320123a00632003201636005f2003200436005b200320133a005a200320143b0158200341e8026a200b102220032802f8022217450d0720034184036a2802002116200341e8026a41186a280200210420032802fc022102200341106a200341d8006a20032902ec02220842208620033502e802842205200341f4026a3502004220862008422088842208105b2003280210450d0d41d4c0c0002104411a21162002450d73201710230c730b200241156a2d00002117200241146a2d00002115200241126a2f01002109200241116a2d0000210a200241106a2d0000210b2002410e6a2f0100210c2002410d6a2d0000210d2002410c6a2d0000210e2002410a6a2f0100210f200241096a2d00002110200241086a2d00002111200241066a2f01002112200241056a2d00002113200241046a2d00002114200241026a2f0100211920022d00012102200320083703f003200241ff01714101470d00200320083703f801200320043a00f701200320163a00f601200320073b01f401200320173a00f301200320153a00f201200320093b01f0012003200a3a00ef012003200b3a00ee012003200c3b01ec012003200d3a00eb01200320143a00e201200320193b01e0012003200f410874201072200e411874723600e701200320124108742013722011411874723600e301200341e8026a200341e8056a104220032d00e8024101470d12200341f4026a2d00002102200341f5026a2900002108200341fd026a280000210420032f00e902211620032d00eb02210720032902ec022105200320034181036a2900003703702003200436026c20032008370264200320023a00632003200537005b200320073a005a200320163b015841a0c2c0002104200341d8006a200341e0016a41201096040d13200341e8026a41186a200341e8056a41186a290300370300200341e8026a41106a200341e8056a41106a290300370300200341e8026a41086a200341e8056a41086a290300370300200320032903e8053703e802410f10262202450d5c41002104200241076a41002900a78640370000200241002900a086403700002002410f412f10272202450d5d200220032903e80237000f200241276a200341e8026a41186a2903003700002002411f6a200341e8026a41106a290300370000200241176a200341e8026a41086a29030037000020034188066a41186a2216420037030020034188066a41106a2207420037030020034188066a41086a2217420037030020034200370388062002412f20034188066a1002200341f0036a41186a2016290300370300200341f0036a41106a2007290300370300200341f0036a41086a201729030037030020032003290388063703f003200341f0036a41201003200210230c790b41db94c3002104412a21160c710b200141086a2802002107200141046a2802002102200341d8006a200141106a29030022081036200328025821162003280260220420024d0d062016200241f8006c6a2217280200410e460d072016200241f8006c6a41f0006a2802002007470d07201710242017410e360200200341e8026a41086a200341d8006a41086a280200360200200320032903583703e802411710262202450d572002410f6a41002900cb8740370000200241086a41002900c48740370000200241002900bc874037000020024117412e10272202450d582002200837001720034188066a41186a2204420037030020034188066a41106a2216420037030020034188066a41086a2207420037030020034200370388062002411f20034188066a1002200341f0036a41186a2004290300370300200341f0036a41106a2016290300370300200341f0036a41086a200729030037030020032003290388063703f003200341203602e4012003200341f0036a3602e001200341e8026a200341e0016a105c2002102320032802e8022116024020032802f0022202450d00200241f8006c210420162102034002402002280200410e460d00200210240b200241f8006a2102200441887f6a22040d000b0b20032802ec02450d76201610230c760b2017102341002115410121170c210b200341086a200341d8006a20062005105b2003280208450d0d41fdbfc0002104411a21160b2007102420071023410021094101210741012117410121150c760b200442003703002007420037030020034188066a41086a22174200370300200342003703880641e687c000411d20034188066a1002200341e8026a41186a2004290300370300200341e8026a41106a2007290300370300200341e8026a41086a201729030037030020032003290388063703e802200341e8026a412041a886c500410041001001417f460d1020034188046a420037030020034180046a4200370300200341f0036a41086a4200370300200342003703f003200341e8026a4120200341f0036a4120410010012204417f460d362004411f4d0d36200341a8056a41186a2204200341f0036a41186a290300370300200341a8056a41106a2207200341f0036a41106a290300370300200341a8056a41086a2217200341f0036a41086a290300370300200320032903f0033703a805200341c8056a41186a2004290300370300200341c8056a41106a2007290300370300200341c8056a41086a2017290300370300200320032903a8053703c805411510262204450d3d2004410d6a41002900bc8640370000200441086a41002900b78640370000200441002900af864037000020044115413510272207450d3e200720032903c8053700152007412d6a200341c8056a41186a290300370000200741256a200341c8056a41106a2903003700002007411d6a200341c8056a41086a29030037000020034188066a41186a2204420037030020034188066a41106a2217420037030020034188066a41086a2215420037030020034200370388062007413520034188066a1002200341f0036a41186a2004290300370300200341f0036a41106a2017290300370300200341f0036a41086a201529030037030020032003290388063703f003200341f0036a412041a886c500410041001001417f460d3f200342203702ec052003200341f0036a3602e805200341e8026a200341e8056a105920032d00890322094102460d4020034188066a41186a2204200341e8026a41186a29030037030020034188066a41106a2215200341e8026a41106a29030037030020034188066a41086a2217200341e8026a41086a290300370300200320032903e8023703880620032d008803210a200341d8006a2003418a036a220c41c1001094041a200341e8056a41186a220b2004290300370300200341e8056a41106a220d2015290300370300200341e8056a41086a220e201729030037030020032003290388063703e805200320093a00e802200341e8026a410172200341d8006a41c1001094041a200341d8006a41186a2209200b290300370300200341d8006a41106a220b200d290300370300200341d8006a41086a220d200e290300370300200320032903e80537035820032d008903210e20044200370300201542003703002017420037030020034200370388062007413520034188066a1002200341f0036a41186a2004290300370300200341f0036a41106a2015290300370300200341f0036a41086a201729030037030020032003290388063703f00320034201370388062003410036029006412010262204450d41200342a0808080800437028c06200320043602880620042003290358370000200441086a200d290300370000200441106a200b290300370000200441186a2009290300370000200a20034188066a103f200341013a00af06200328028c0620172802002217470d13201741016a22042017490d6520174101742215200420042015491b22154100480d652017450d212003280288062017201510272204450d220c630b41b0c0c0002104412421160c6b0b41abc2c0002104410d21160c6a0b2004450d010b200441f8006c210420162102034002402002280200410e460d00200210240b200241f8006a2102200441887f6a22040d000b0b0240200328025c450d00201610230b41b8c2c0002104411221160c670b4114211641edc1c00021040c660b200341386a41186a200341d8006a41186a290300370300200341386a41106a2207200341d8006a41106a290300370300200341386a41086a2215200341d8006a41086a2903003703002003200329035837033820022004470d0b200241016a22092002490d5e2002410174220a20092009200a491b2209ad4205862206422088a70d5e2006a7220a4100480d5e2002450d1820172002410574200a102722170d190c4b0b200341003602f002200342013703e8022007200341e8026a103920032802ec02211620032802f002211720032802e802210420034188066a41186a2215420037030020034188066a41106a220942003703002002420037030020034200370388062004201720034188066a1002200341d8006a41186a22172015290300370300200341d8006a41106a2009290300370300200341d8006a41086a2002290300370300200320032903880637035802402016450d00200410230b200341e8026a41186a2017290300370300200341e8026a41106a200341d8006a41106a290300370300200341e8026a41086a200341d8006a41086a290300370300200320032903583703e802200341e0016a200341e8026a105820032802e8012202450d0620032903e00121054200210820034188066a41086a22044200370300200342003703880641af98c300410d20034188066a1000200341a8056a41086a200429030037030020032003290388063703a8050240200341a8056a411041a886c500410041001001417f460d00200342003703e802200341a8056a4110200341e8026a41084100100141016a41084d0d2a20032903e80221080b0240200341ec016a280200450d00200210230b200820055a0d064185c1c0002104411a21160c660b410221160b200341a8056a41186a200341d8006a41186a290300370300200341a8056a41106a200341d8006a41106a290300370300200341a8056a41086a2207200341d8006a41086a29030037030020034188056a41086a2204200341e0016a41086a29030037030020034188056a41106a200341e0016a41106a29030037030020034188056a41186a200341e0016a41186a290300370300200320032903583703a805200320032903e00137038805200210234100210220164102460d55200341e8056a41186a200341a8056a41186a290300370300200341e8056a41106a200341a8056a41106a290300370300200341e8056a41086a2007290300370300200341c8056a41086a2004290300370300200341c8056a41106a20034188056a41106a290300370300200341c8056a41186a20034188056a41186a290300370300200320032903a8053703e80520032003290388053703c805410021020240201741ff01714101470d00411510262202450d3a2002410d6a41002900bc8640370000200241086a41002900b78640370000200241002900af864037000020024115413510272202450d3b200220032903c8053700152002412d6a200341e0056a290300370000200241256a200341d8056a2903003700002002411d6a200341c8056a41086a2903003700000b20164101470d05411510262204450d3b2004410d6a41002900bc8640370000200441086a41002900b78640370000200441002900af864037000020044115413510272204450d3c200420032903e8053700152004412d6a200341e8056a41186a290300370000200441256a200341e8056a41106a2903003700002004411d6a200341e8056a41086a29030037000020034188066a41186a2209420037030020034188066a41106a220a420037030020034188066a41086a220b420037030020034200370388062004413520034188066a1002200341f0036a41186a2009290300370300200341f0036a41106a200a290300370300200341f0036a41086a200b29030037030020032003290388063703f003200341f0036a412041a886c500410041001001417f460d3d2003422037028c062003200341f0036a36028806200341e8026a20034188066a105920032d00890322094102460d3e200341d8006a41206a200341e8026a41206a2d00003a0000200341d8006a41186a220a200341e8026a41186a290300370300200341d8006a41106a220b200341e8026a41106a290300370300200341d8006a41086a220c200341e8026a41086a220d290300370300200320032903e802370358200341e0016a200341e8026a41226a41c1001094041a200341d8006a41226a20032900e00137010020034182016a200341e0016a41086a2900003701002003418a016a200341e0016a41106a29000037010020034192016a200341e0016a41186a290000370100200320093a00792003419a016a20173a00002003419b016a20032903c805370000200341a3016a200341c8056a41086a290300370000200341ab016a200341c8056a41106a290300370000200341b3016a200341c8056a41186a29030037000020034188066a41186a2217420037030020034188066a41106a2209420037030020034188066a41086a220e420037030020034200370388062004413520034188066a1002200341f0036a41186a2017290300370300200341f0036a41106a2009290300370300200341f0036a41086a200e29030037030020032003290388063703f003200341003602f002200342013703e802412010262217450d3f20172003290358370000201741086a200c290300370000201741106a200b290300370000201741186a200a290300370000200342a080808080043702ec02200320173602e80220032d0078200341e8026a103f200341f9006a200341e8026a105d20032802ec022117200341f0036a412020032802e8022209200d280200100402402017450d00200910230b20041023410121172002450d0d0c520b4194bac2002104410b21160c610b20034188066a41086a2202420037030020034200370388064197c0c000411920034188066a1000200341a8056a41086a200229030037030020032003290388063703a805410021160240200341a8056a411041a886c500410041001001417f460d00200341003602e802200341a8056a4110200341e8026a41044100100141016a41044d0d2a20032802e80221160b20034188066a41086a2204420037030020034200370388064197c0c000411920034188066a1000200341a8056a41086a2217200429030037030020032003290388063703a8052003201641016a3602e802200341a8056a4110200341e8026a41041004412010262202450d3620022003290358370000200341fc026a428180808010370200200241186a200341d8006a41186a290300370000200241106a200341d8006a41106a290300370000200241086a200341d8006a41086a290300370000200320063703e802200320023602f802200320053703f0022016200341e8026a105e20044200370300200342003703880641fc88c000411520034188066a10002017200429030037030020032003290388063703a80541002102200341a8056a411041a886c500410041001001417f460d0c200342103702e4012003200341a8056a3602e001200341e8026a200341e0016a102020032802e8022217450d43200341f0026a280200210220032802ec0221150c0d0b4194bac20021040b410b21160c5e0b200341e8026a200741f0001095041a41002117200341003a00d80320034188066a41086a220242003703002003420037038806418388c000411620034188066a1000200341a8056a41086a200229030037030020032003290388063703a805200341103602e4012003200341a8056a3602e001200341e8026a200341e0016a105f200341e8026a102420071023410121070c0e0b20034188066a41186a2204420037030020034188066a41106a2209420037030020034188066a41086a220a4200370300200342003703880641e687c000411d20034188066a1002200341f0036a41186a2004290300370300200341f0036a41106a2009290300370300200341f0036a41086a200a29030037030020032003290388063703f003201741ff01714101470d06412010262204450d45200420032903c805370000200441186a200341c8056a41186a290300370000200441106a200341c8056a41106a290300370000200441086a200341c8056a41086a290300370000200341f0036a412020044120100420041023410021044100211720020d4c0c070b20034188066a41186a2204420037030020034188066a41106a2207420037030020174200370300200342003703880641e687c000411d20034188066a1002200341f0036a41186a2004290300370300200341f0036a41106a2007290300370300200341f0036a41086a201729030037030020032003290388063703f003412010262204450d3a2004200329038805370000200441186a20034188056a41186a290300370000200441106a20034188056a41106a290300370000200441086a20034188056a41086a290300370000200341f0036a412020044120100420041023410021070c580b200341e8026a41186a201c290300370300200341e8026a41106a201d290300370300200341e8026a41086a201e290300370300200320032903583703e802410f10262202450d3a200241076a41002900a78640370000200241002900a086403700002002410f412f10272217450d3b201720032903e80237000f201741276a200341e8026a41186a2903003700002017411f6a200341e8026a41106a290300370000201741176a200341e8026a41086a29030037000020034188066a41186a2202420037030020034188066a41106a221b420037030020034188066a41086a221f420037030020034200370388062017412f20034188066a1002200341f0036a41186a2002290300370300200341f0036a41106a201b290300370300200341f0036a41086a201f29030037030020032003290388063703f003412010262202450d3c20022008370018200220073a0017200220163a0016200220043b00142002201a3a0013200220193a0012200220143b0010200220133a000f200220123a000e200220113b000c200220103a000b2002200e410874200d72200f411874723600072002200b410874200a72200c41187472360003200220093a0002200220153b0000200341f0036a41202002412010042002102320171023410021040c5a0b200221090c0d0b4101211520032802880621040c500b20032802e8022102200341e0016a200341e8026a4104724184011094041a20032002360258200341d8006a410472200341e0016a4184011094041a200341003602f002200342013703e802200341d8006a41086a2217200341e8026a103920032802ec02210420032802f002211520032802e802210220034188066a41186a2209420037030020034188066a41106a220a420037030020034188066a41086a220b420037030020034200370388062002201520034188066a1002200341e0016a41186a22152009290300370300200341e0016a41106a2209200a290300370300200341e0016a41086a220a200b29030037030020032003290388063703e00102402004450d00200210230b200341e8026a41186a2015290300370300200341e8026a41106a2009290300370300200341e8026a41086a200a290300370300200320032903e0013703e802411710262202450d3b2002410f6a41002900fdc040370000200241086a41002900f6c040370000200241002900eec04037000020024117413710272202450d3c200220032903e8023700172002412f6a200341e8026a41186a220a290300370000200241276a200341e8026a41106a220b2903003700002002411f6a200341e8026a41086a29030037000020034188066a41186a2204420037030020034188066a41106a2215420037030020034188066a41086a2209420037030020034200370388062002413720034188066a1002200341f0036a41186a2004290300370300200341f0036a41106a2015290300370300200341f0036a41086a200929030037030020032003290388063703f003200341f0036a412041a886c5004100410010012104200210232004417f460d0e2017102441d7c2c0002104412521160c580b200341003602f002200342013703e8022007200341e8026a103920032802ec02211620032802f002211720032802e802210420034188066a41186a2215420037030020034188066a41106a220942003703002002420037030020034200370388062004201720034188066a1002200341d8006a41186a22172015290300370300200341d8006a41106a2009290300370300200341d8006a41086a2002290300370300200320032903880637035802402016450d00200410230b200341e8026a41186a2017290300370300200341e8026a41106a200341d8006a41106a290300370300200341e8026a41086a200341d8006a41086a290300370300200320032903583703e802200341e0016a200341e8026a105820032802e8012202450d0620032903e00121054200210820034188066a41086a22044200370300200342003703880641af98c300410d20034188066a1000200341a8056a41086a200429030037030020032003290388063703a8050240200341a8056a411041a886c500410041001001417f460d00200342003703e802200341a8056a4110200341e8026a41084100100141016a41084d0d2720032903e80221080b0240200341ec016a280200450d00200210230b200820055a0d064185c1c0002104411a21160c590b200341f0036a41201003410021044100211720020d450b41002116201720044572450d450c460b41082117410021150b200341e8026a2007104e200341386a41186a2209200341d8006a41186a290300370300200341386a41106a220a200341d8006a41106a290300370300200341386a41086a220b200341d8006a41086a2903003703002003200329035837033820152002470d41200241016a22042002490d4b20024101742215200420042015491b2215ad4298017e2208422088a70d4b2008a722044100480d4b2002450d0a201720024198016c200410272217450d0b0c410b410021024101210b420021080b200341e8026a41186a200341e8056a41186a290300370300200341e8026a41106a200341e8056a41106a290300370300200341e8026a41086a200341e8056a41086a290300370300200320032903e8053703e80220022008422088a722044b0d2e20042008a7470d3e200441016a22162004490d4920044101742207201620162007491bad22084205862205422088a70d492005a722164100480d492004450d0a200b200441057420161027220b450d0b0c3e0b200341e8026a200741f0001095041a200341023a00d80320034188066a41086a220242003703002003420037038806418388c000411620034188066a1000200341a8056a41086a200229030037030020032003290388063703a805200341103602e4012003200341a8056a3602e001200341e8026a200341e0016a105f200341e8026a10242007102341002107410121170b410121150b41012109410021040c560b200a10262217450d320b201720044105746a22022003290338370000200241186a200341386a41186a290300370000200241106a2007290300370000200241086a201529030037000041012107200341e8026a41186a200441016a360200200341fc026a2009360200200320083703f002200320053703e8022003201636028403200320173602f802200b200341e8026a105e410021040c530b2015102622040d410b20154101102a000b200a200341e0016a41186a290300370300200b200341e0016a41106a290300370300200341e8026a41086a200341e0016a41086a290300370300200320032903e0013703e802200341013a00e805411710262202450d34410021042002410f6a41002900fdc040370000200241086a41002900f6c040370000200241002900eec04037000020024117413710272202450d35200220032903e8023700172002412f6a200341e8026a41186a290300370000200241276a200341e8026a41106a2903003700002002411f6a200341e8026a41086a29030037000020034188066a41186a2207420037030020034188066a41106a2215420037030020034188066a41086a2209420037030020034200370388062002413720034188066a1002200341f0036a41186a2007290300370300200341f0036a41106a2015290300370300200341f0036a41086a200929030037030020032003290388063703f00341012107200341f0036a4120200341e8056a410110042002102320161035201710240c500b2004102622170d360b20044108102a000b20161026220b0d330b20164101102a000b41b4c1c0002104412621162008a7450d43200b10230c430b200341fc026a41013602002003410136025c2003418898c400360258200342013702ec02200341d497c4003602e8022003200341d8006a3602f802200341e8026a41e0bfc0001061000b41d4aac10041331021000b41154101102a000b41354101102a000b41154101102a000b41354101102a000b200341d8006a10240b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41154101102a000b41354101102a000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b410f4101102a000b412f4101102a000b410f4101102a000b412f4101102a000b41d4aac10041331021000b41154101102a000b41354101102a000b41da9fc100419f011021000b41d4aac10041331021000b41204101102a000b41204101102a000b41154101102a000b41354101102a000b41154101102a000b41354101102a000b4190a1c10041d3001021000b41d4aac10041331021000b41204101102a000b4180e4c400104f000b41204101102a000b410f4101102a000b412f4101102a000b41204101102a000b41d4aac10041331021000b41174101102a000b41374101102a000b200a4101102a000b41174101102a000b412e4101102a000b41204101102a000b410f4101102a000b412f4101102a000b41174101102a000b41374101102a000b200b20024105746a221641206a2016200420026b4105741095041a201641186a200341e8026a41186a290300370000201641106a200341e8026a41106a290300370000201641086a200341e8026a41086a290300370000201620032903e80237000020034188066a41086a22024200370300200342003703880641af98c300410d20034188066a1000200341a8056a41086a200229030037030020032003290388063703a8050240024002400240200341a8056a411041a886c500410041001001417f460d00200342003703e802200341a8056a4110200341e8026a41084100100141016a41084d0d0220032903e8024280e90f7c21054101211641132107411310262202450d010c030b4280e90f210541012116411321074113102622020d020b20072016102a000b41d4aac10041331021000b2002410f6a41002800e9c140360000200241086a41002900e2c140370000200241002900dac140370000024002402002200741331027220c450d00200c20032903c805370013200c412b6a200341c8056a41186a290300370000200c41236a200341c8056a41106a290300370000200c411b6a200341c8056a41086a29030037000020034188066a41186a2202420037030020034188066a41106a2207420037030020034188066a41086a221742003703002003420037038806200c413320034188066a1002200341f0036a41186a2002290300370300200341f0036a41106a2007290300370300200341f0036a41086a201729030037030020032003290388063703f003200341003602f002200342013703e802410810262202450d01200220053700002003428880808080013702ec02200320023602e8022003200420166a2202360258200341d8006a200341e8026a10410240024002402002450d00200441057441206a21154100200341e8026a41086a28020022046b210720032802e802210920032802ec022117200b210203400240201720076a411f4b0d00200441206a22162004490d112017410174220a20162016200a491b22164100480d11024002402017450d00200920172016102722090d010c060b201610262209450d050b201621170b200920046a22162002290000370000201641186a200241186a290000370000201641106a200241106a290000370000201641086a200241086a290000370000200741606a2107200441206a2104200241206a2102201541606a22150d000b200341f0026a2004360200200320173602ec02200320093602e8020c010b200341f0026a280200210420032802ec02211720032802e80221090b2008a72102200341f0036a412020092004100402402017450d00200910230b200c102302402002450d00200b10230b200341e8026a41086a410a3a0000200341f1026a20032903e80537000020034191036a20032903c805370000200341f9026a200341e8056a41086a29030037000020034181036a200341e8056a41106a29030037000020034189036a200341e8056a41186a29030037000020034199036a200341c8056a41086a290300370000200341a1036a200341c8056a41106a290300370000200341a9036a200341c8056a41186a290300370000200341053a00e802200341b8036a20053703004100210441a886c5004100200341e8026a102c20034188066a41086a220242003703002003420037038806418388c000411620034188066a1000200341a8056a41086a200229030037030020032003290388063703a805200341a8056a411010030c1b0b20164101102a000b41334101102a000b41084101102a000b201720024198016c220c6a200341e8026a41f000109404220420163602702004418c016a200929030037020020044184016a200a290300370200200441fc006a200b290300370200200420032903383702742003200241016a22023602f002200320153602ec02200320173602e80220034188066a41086a22044200370300200342003703880641fc88c000411520034188066a1000200341a8056a41086a200429030037030020032003290388063703a805200341103602e4012003200341a8056a3602e001200341e8026a200341e0016a102502402002450d00200c4198016a21042017210203402002102420024198016a2102200441e87e6a22040d000b0b02402015450d00201710230b20034180036a2005370300200341f8026a2006370300200341f4026a201636020041002109200341f0026a41003a0000200341053a00e80241a886c5004100200341e8026a102c2007102420071023410121074101211741012115410021040c190b20034188066a41186a2209420037030020034188066a41106a220a420037030020034188066a41086a220b420037030020034200370388062002413520034188066a1002200341f0036a41186a2009290300370300200341f0036a41106a200a290300370300200341f0036a41086a200b29030037030020032003290388063703f003200341f0036a412041a886c500410041001001417f460d032003422037028c062003200341f0036a36028806200341e8026a20034188066a105920032d0089034102460d04200341d8006a41206a200341e8026a41206a2d00003a0000200341d8006a41186a2209200341e8026a41186a290300370300200341d8006a41106a220a200341e8026a41106a290300370300200341d8006a41086a220b200341e8026a41086a220c290300370300200320032903e802370358200341e0016a200341e8026a41226a41c1001094041a200341d8006a41226a200341e0016a41c10010940420032903e80537010020034182016a200341e8056a41086a2903003701002003418a016a200341e8056a41106a29030037010020034192016a200341e8056a41186a290300370100200320163a007920034188066a41186a2216420037030020034188066a41106a220d420037030020034188066a41086a220e420037030020034200370388062002413520034188066a1002200341f0036a41186a2016290300370300200341f0036a41106a200d290300370300200341f0036a41086a200e29030037030020032003290388063703f003200341003602f002200342013703e802412010262216450d0520162003290358370000201641086a200b290300370000201641106a200a290300370000201641186a2009290300370000200342a080808080043702ec02200320163602e80220032d0078200341e8026a103f200341f9006a200341e8026a105d20032802ec022116200341f0036a412020032802e8022209200c280200100402402016450d00200910230b20021023410121162017200445720d010b200410230b02402002452016720d00200210230b201521020b4200210820034188066a41086a22044200370300200342003703880641af98c300410d20034188066a10002007200429030037030020032003290388063703a80502400240200341a8056a411041a886c500410041001001417f460d00200342003703e802200341a8056a4110200341e8026a41084100100141016a41084d0d0120032903e80221080b200342e4cab5fbb6ccdcb0e300370338200341386a200341e8046a427f427f200241187441187541027441a8f9c4006a3502004280e90f7e20087c41021062200341e8026a41086a41093a0000200341e8026a41096a20032903e804370000200341f9026a200341e8046a41086a29030037000020034181036a200341e8046a41106a29030037000020034189036a200341e8046a41186a290300370000200341053a00e8024100210441a886c5004100200341e8026a102c0c140b41d4aac10041331021000b4190a1c10041d3001021000b41d4aac10041331021000b41204101102a000b2003201536028c06200320043602880620032d00af0621150b20034188066a41086a2209201741016a360200200420176a20153a000002400240024002400240200328028c06220a200928020022156b411f4b0d00201541206a22172015490d05200a410174220b20172017200b491b22174100480d05200a450d012004200a201710272204450d020c030b200a21170c030b2017102622040d010b20174101102a000b2003201736028c0620032004360288060b2009201541206a220b360200200420156a220941086a20034188056a41086a290300370000200941106a20034188056a41106a290300370000200941186a20034188056a41186a290300370000200920032903880537000002400240024002400240024002400240024002400240200c4100200e4101461b2209450d004101210c200341013a00af062017200b470d01201741016a220a2017490d0b2017410174220c200a200a200c491b220a4100480d0b2017450d0320042017200a10272204450d040c090b41002109200341003a00af062017200b470d01201741016a22092017490d0a2017410174220a20092009200a491b220c4100480d0a2017450d0420042017200c10272204450d050c060b2017210a0c080b2017210c0c050b200a102622040d050b200a4101102a000b200c102622040d010b200c4101102a000b2003200c36028c06200320043602880620032d00af0621090b20034190066a201541216a22153602002004200b6a20093a00000c050b2003200a36028c06200320043602880620032d00af06210c0b20034188066a41086a220d201541216a3602002004200b6a200c3a0000024002400240200a200d28020022176b411f4b0d00201741206a22152017490d03200a410174220b20152015200b491b220c4100480d03200a450d012004200a200c10272204450d020c040b200a210c0c040b200c102622040d020b200c4101102a000b101e000b2003200c36028c0620032004360288060b200d201741206a2215360200200420176a221741086a200941086a290000370000201741106a200941106a290000370000201741186a200941186a290000370000201720092900003700000b200341f0036a41202004201510040240200c450d00200410230b2007102320034188066a41186a2204420037030020034188066a41106a2207420037030020034188066a41086a22174200370300200342003703880641e687c000411d20034188066a1002200341f0036a41186a2004290300370300200341f0036a41106a2007290300370300200341f0036a41086a201729030037030020032003290388063703f003412010262204450d022004200329038805370000200441186a20034188056a41186a290300370000200441106a20034188056a41106a290300370000200441086a20034188056a41086a290300370000200341f0036a412020044120100420041023200341d8006a41186a200341c8056a41186a290300370300200341d8006a41106a200341c8056a41106a290300370300200341d8006a41086a200341c8056a41086a290300370300200320032903c805370358410121070b410021040b2003418d036a20073a00002003418e036a2003290358370100200341f5026a200341386a41086a290300370000200341fd026a200341386a41106a29030037000020034185036a200341386a41186a29030037000020034196036a200341d8006a41086a2903003701002003419e036a200341d8006a41106a290300370100200341a6036a200341d8006a41186a290300370100200320043a00ec02200320032903383700ed022003200341e0016a3602e80220034188066a41186a2204420037030020034188066a41106a2217420037030020034188066a41086a2207420037030020034200370388062002413520034188066a1002200341f0036a41186a2004290300370300200341f0036a41106a2017290300370300200341f0036a41086a200729030037030020032003290388063703f003200341003602900620034201370388060240412010262204450d00200420032903e001370000200441186a200341e0016a41186a290300370000200441106a200341e0016a41106a290300370000200441086a200341e0016a41086a290300370000200342a0808080800437028c062003200436028806200341e0016a41206a2d000020034188066a103f200341e8026a41047220034188066a105d200328028c062104200341f0036a412020032802880622172007280200100402402004450d00201710230b20021023200342e4cab5fbb6ccdcb0e3003703e004200341e0046a200341e8046a427f1063200341e8026a41086a41083a0000200341f1026a20032903e804370000200341f9026a200341e8046a41086a29030037000020034181036a200341e8046a41106a29030037000020034189036a200341e8046a41186a29030037000020034191036a200329031837000020034199036a200341186a41086a290300370000200341a1036a200341186a41106a290300370000200341a9036a200341186a41186a290300370000200341053a00e8024100210441a886c5004100200341e8026a102c0c020b41204101102a000b41204101102a000b410121070b410121170c020b200710242007102341002117410121070c010b200710242007102341012117410021070b410121150b410121090c030b410021040b410121070b4101211741012115410121090b0240024002400240024002400240024020012d0000417f6a2202410e4b0d0020020e0f030000000400010200000008000808030b200241074b0d07024020020e080008080806080507000b200141046a22022802001024200228020010230c070b2017450d06200141046a22022802001024200228020010230c060b2007450d05200141046a22022802001024200228020010230c050b2009450d04200141046a22022802001024200228020010230c040b2015450d03200141046a22022802001024200228020010230c030b200141046a22022802001024200228020010230c020b200141046a22022802001024200228020010230c010b200141046a22022802001024200228020010230b2000201636020420002004360200200341b0066a24000bc40302047f017e230041d0006b2202240002400240411310262203450d002003410f6a41002800e9c140360000200341086a41002900e2c140370000200341002900dac14037000020034113413310272203450d01200320012900003700132003412b6a200141186a290000370000200341236a200141106a2900003700002003411b6a200141086a290000370000200241306a41186a22014200370300200241306a41106a22044200370300200241306a41086a220542003703002002420037033020034133200241306a1002200241186a2001290300370300200241106a2004290300370300200241086a2005290300370300200220022903303703000240024002402002412041a886c500410041001001417f460d002002200236022020024120360224200242003703302002410020024120200241306a41084100100122012001417f461b2201410820014108491b360228200141074d0d0220022903302106200241306a200241206a102820022802302201450d022000200229023437020c20002001360208200020063703000c010b200041003602080b20031023200241d0006a24000f0b41d4aac10041331021000b41134101102a000b41334101102a000b960d01097f23004180026b22022400200241e0016a41186a22034200370300200241e0016a41106a22044200370300200241e0016a41086a22054200370300200242003703e0012001410020012802002001280204200241e0016a41202001280208100122062006417f461b22064120200641204922061b20012802086a22073602080240024020060d00200241c0016a41186a2003290300370300200241c0016a41106a2004290300370300200241c0016a41086a2005290300370300200220022903e0013703c001200241003a00e0012001280200200141046a280200200241e0016a4101200710012106200141086a22032003280200200641016a41014b22066a22033602002006450d0020022d00e001220641064f0d00200241186a200241c0016a41186a290300370300200241106a200241c0016a41106a290300370300200241086a200241c0016a41086a290300370300200220022903c00137030041002105200241003a00e0012001280200200141046a280200200241e0016a4101200310012103200141086a22042004280200200341016a41014b22036a22043602002003450d01024020022d00e0012203450d0020034101470d02200241e0016a41186a22074200370300200241e0016a41106a22084200370300200241e0016a41086a22094200370300200242003703e001200141086a220541002001280200200141046a280200200241e0016a41202004100122032003417f461b2203412020034120491b20052802006a22043602002003411f4d0d02200241c0016a41186a22032007290300370300200241c0016a41106a22052008290300370300200241c0016a41086a22072009290300370300200220022903e0013703c001200241a0016a41186a22082003290300370300200241a0016a41106a22032005290300370300200241a0016a41086a22052007290300370300200220022903c0013703a00120024180016a41186a200829030037030020024180016a41106a200329030037030020024180016a41086a2005290300370300200220022903a00137038001410121050b200241e0006a41186a20024180016a41186a290300370300200241e0006a41106a20024180016a41106a290300370300200241e0006a41086a20024180016a41086a290300370300200220022903800137036041002107200241003a00e0012001280200200141046a280200200241e0016a4101200410012103200141086a22042004280200200341016a41014b22036a22043602002003450d01024020022d00e0012203450d0020034101470d02200241e0016a41186a22074200370300200241e0016a41106a22084200370300200241e0016a41086a22094200370300200242003703e001200141086a220341002001280200200141046a280200200241e0016a41202004100122012001417f461b2201412020014120491b20032802006a3602002001411f4d0d02200241c0016a41186a22012007290300370300200241c0016a41106a22032008290300370300200241c0016a41086a22042009290300370300200220022903e0013703c001200241a0016a41186a22072001290300370300200241a0016a41106a22012003290300370300200241a0016a41086a22032004290300370300200220022903c0013703a00120024180016a41186a200729030037030020024180016a41106a200129030037030020024180016a41086a2003290300370300200220022903a00137038001410121070b200241206a41186a220120024180016a41186a290300370300200241206a41106a220320024180016a41106a290300370300200241206a41086a220420024180016a41086a2903003703002002200229038001370320200241c0006a41186a2208200241e0006a41186a290300370300200241c0006a41106a2209200241e0006a41106a290300370300200241c0006a41086a220a200241e0006a41086a29030037030020022002290360370340200041186a200241186a290300370000200041106a200241106a290300370000200041086a200241086a29030037000020002002290300370000200020053a0021200020063a0020200041c2006a20073a0000200020022903403700222000412a6a200a290300370000200041326a20092903003700002000413a6a2008290300370000200041c3006a2002290320370000200041cb006a2004290300370000200041d3006a2003290300370000200041db006a200129030037000020024180026a24000f0b200041023a002120024180026a24000f0b200041023a002120024180026a24000bc70f030a7f017e057f230041f0006b220424000240024002400240024002400240024002400240024002400240024002400240411a10262205450d00200541186a41002f00dc86403b0000200541106a41002900d48640370000200541086a41002900cc8640370000200541002900c486403700002005411a413410272205450d012005200136001a200441c8006a41186a22064200370300200441c8006a41106a22074200370300200441c8006a41086a22084200370300200442003703482005411e200441c8006a1002200441286a41186a2006290300370300200441286a41106a2007290300370300200441286a41086a200829030037030020042004290348370328200441286a412041a886c50041004100100121062005102302400240024002402006417f460d00200441086a41186a200041186a290000370300200441086a41106a200041106a290000370300200441086a41086a200041086a29000037030020042000290000370308411010262205450d06200541086a4100290098864037000020054100290090864037000020054110412010272205450d07200520013600102005412041c00010272205450d08200520042903083700142005412c6a200441086a41186a2209290300370000200541246a200441086a41106a220a2903003700002005411c6a200441086a41086a220b290300370000200441c8006a41186a22064200370300200441c8006a41106a22074200370300200441c8006a41086a220842003703002004420037034820054134200441c8006a1002200441286a41186a2006290300370300200441286a41106a2007290300370300200441286a41086a200829030037030020042004290348370328200441286a412041a886c500410041001001210c20051023200c417f470d0b200441086a200110302006200041186a2900003703002007200041106a2900003703002008200041086a2900003703002004200029000037034820042802102206200428020c220d470d01200641016a22052006490d0c20064101742207200520052007491b220dad420586220e422088a70d0c200ea722074100480d0c2006450d022004280208200641057420071027220f450d030c090b200441f0006a240041fcc2c0000f0b200641016a21052004280208210f0c080b20071026220f0d060b20074101102a000b411a4101102a000b41344101102a000b41104101102a000b41204101102a000b41c0004101102a000b2004200d36020c2004200f3602080b200441086a41086a2005360200200f20064105746a22062004290348370000200641186a200441c8006a41186a290300370000200641106a200441c8006a41106a290300370000200641086a200441c8006a41086a290300370000411310262206450d072006410f6a41002800e28740360000200641086a41002900db8740370000200641002900d3874037000020064113412610272210450d0820102001360013200441c8006a41186a22074200370300200441c8006a41106a22084200370300200441c8006a41086a220642003703002004420037034820104117200441c8006a1002200441286a41186a2007290300370300200441286a41106a2008290300370300200441286a41086a20062903003703002004200429034837032820044100360250200442013703482004200536026c200441ec006a200441c8006a1041024002402005450d00200541057421114100200628020022066b210820042802482112200428024c210c200f210503400240200c20086a411f4b0d00200641206a22072006490d05200c4101742213200720072013491b22074100480d0502400240200c450d002012200c2007102722120d010c080b200710262212450d070b2007210c0b201220066a22072005290000370000200741186a200541186a290000370000200741106a200541106a290000370000200741086a200541086a290000370000200841606a2108200641206a2106200541206a2105201141606a22110d000b200441d0006a20063602002004200c36024c200420123602480c010b20062802002106200428024c210c200428024821120b200441286a41202012200610040240200c450d00201210230b20101023200d450d00200f10230b2009200041186a290000370300200a200041106a290000370300200b200041086a29000037030020042000290000370308411010262205450d02200541086a4100290098864037000020054100290090864037000020054110412010272205450d03200520013600102005412041c00010272205450d04200520042903083700142005412c6a200441086a41186a290300370000200541246a200441086a41106a2903003700002005411c6a200441086a41086a290300370000200441c8006a41186a22064200370300200441c8006a41106a22074200370300200441c8006a41086a220842003703002004420037034820054134200441c8006a1002200441286a41186a2006290300370300200441286a41106a2007290300370300200441286a41086a200829030037030020042004290348370328410110262206450d05200641807f410020021b2003723a0000200441286a41202006410110042006102320051023200441f0006a240041000f0b101e000b20074101102a000b41104101102a000b41204101102a000b41c0004101102a000b41014101102a000b41134101102a000b41264101102a000ba80704027f017e037f037e230041d0006b2204240002400240024002400240411410262205450d00200541106a41002800f9b641360000200541086a41002900f1b641370000200541002900e9b64137000020054114413410272205450d01200520012900003700142005412c6a200141186a290000370000200541246a200141106a2900003700002005411c6a200141086a29000037000042002106200441306a41186a22074200370300200441306a41106a22084200370300200441306a41086a220942003703002004420037033020054134200441306a1002200441106a41186a2007290300370300200441106a41106a2008290300370300200441106a41086a200929030037030020042004290330370310024002400240200441106a412041a886c500410041001001417f460d002004420037033820044200370330200441106a4120200441306a4110410010012207417f460d022007410f4d0d02200441386a290300210a200429033021060c010b4200210a0b2005102302400240200620025a200a20035a200a2003511b0d0041a9b8c2002105411521010c010b200441086a20014104200620027d220b200a20037d2006200254ad7d2206108302024020042802082205450d00200428020c21010c010b411810262205450d05200541106a410029008db741370000200541086a4100290085b741370000200541002900fdb64137000020054118413810272205450d0620052001290000370018200541306a200141186a290000370000200541286a200141106a290000370000200541206a200141086a2900003700004200210a200441306a41186a22074200370300200441306a41106a22084200370300200441306a41086a220942003703002004420037033020054138200441306a1002200441106a41186a2007290300370300200441106a41106a2008290300370300200441106a41086a20092903003703002004200429033037031002400240200441106a412041a886c500410041001001417f460d002004420037033820044200370330200441106a4120200441306a4110410010012207417f460d062007410f4d0d06200441386a290300210c2004290330210a0c010b4200210c0b200510232001200a20027c2202200c20037c2002200a54ad7c10fe012001200b200610df01410021050b2000200136020420002005360200200441d0006a24000f0b41d4aac10041331021000b41144101102a000b41344101102a000b41d4aac10041331021000b41184101102a000b41384101102a000b9c0501077f230041106b2202240020024100360208200242013703002000280200210320022000280208220036020c2002410c6a20021041024002400240024002402000450d00200041f8006c2104200241086a2105034020052802002100200228020421060240024002400240024002400240024002402003280200410e470d0020062000470d01200041016a22062000490d0b20004101742207200620062007491b22074100480d0b2000450d03200228020020002007102722060d040c0c0b20062000470d01200041016a22062000490d0a20004101742207200620062007491b22074100480d0a2000450d05200228020020002007102722060d060c0c0b200228020021060c030b200228020021060c050b200710262206450d080b2002200736020420022006360200200528020021000b2005200041016a360200200620006a41003a0000200341f8006a2103200441887f6a22040d030c040b200710262206450d060b2002200736020420022006360200200528020021000b2005200041016a360200200620006a41013a0000200320021039200341f0006a2802002107024002400240024020022802042206200528020022006b41044f0d00200041046a22082000490d0620064101742200200820082000491b22004100480d062006450d01200228020020062000102722060d020c090b200228020021060c020b200010262206450d070b2002200036020420022006360200200528020021000b2005200041046a360200200620006a2007360000200341f8006a2103200441887f6a22040d000b0b200228020421002001280200200128020420022802002203200241086a280200100402402000450d00200310230b200241106a24000f0b101e000b20074101102a000b20074101102a000b20004101102a000bf90801037f200141046a2802002102200141086a280200210302400240024002400240024002400240024002400240024002400240024020002d00004101470d0020022003470d01200341016a22022003490d0c20034101742204200220022004491b22044100480d0c2003450d0320012802002003200410272202450d040c090b20022003470d01200341016a22022003490d0b20034101742204200220022004491b22044100480d0b2003450d0420012802002003200410272202450d050c060b200128020021020c080b200128020021020c050b2004102622020d050b20044101102a000b2004102622020d010b20044101102a000b20012002360200200141046a2004360200200141086a28020021030b200141086a200341016a360200200220036a41003a00000c020b20012002360200200141046a2004360200200141086a28020021030b200141086a2204200341016a360200200220036a41013a000002400240024002400240200141046a2802002202200428020022036b41204f0d00200341206a22042003490d0620024101742203200420042003491b22034100480d062002450d0120012802002002200310272202450d020c030b200128020021020c030b2003102622020d010b20034101102a000b20012002360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200220036a220341186a200041196a290000370000200341106a200041116a290000370000200341086a200041096a290000370000200320002900013700000b200141046a2802002102200141086a28020021030240024002400240024002400240024002400240024020002d00214101470d0020022003470d01200341016a22022003490d0b20034101742204200220022004491b22044100480d0b2003450d0320012802002003200410272202450d040c090b20022003470d01200341016a22002003490d0a20034101742202200020002002491b22024100480d0a2003450d0420012802002003200210272200450d050c060b200128020021020c080b200128020021000c050b2004102622020d050b20044101102a000b2002102622000d010b20024101102a000b20012000360200200141046a2002360200200141086a28020021030b200141086a200341016a360200200020036a41003a00000f0b20012002360200200141046a2004360200200141086a28020021030b200141086a2204200341016a360200200220036a41013a0000024002400240200141046a2802002202200428020022036b41204f0d00200341206a22042003490d0320024101742203200420042003491b22034100480d032002450d0120012802002002200310272202450d020c040b200128020021020c040b2003102622020d020b20034101102a000b101e000b20012002360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200220036a220141186a2000413a6a290000370000200141106a200041326a290000370000200141086a2000412a6a2900003700002001200041226a2900003700000bbe0503047f027e057f230041d0006b22022400024002400240411310262203450d002003410f6a41002800ed8640360000200341086a41002900e68640370000200341002900de864037000020034113412610272204450d0120042000360013200241286a41186a22034200370300200241286a41106a22004200370300200241286a41086a220542003703002002420037032820044117200241286a1002200241086a41186a2003290300370300200241086a41106a2000290300370300200241086a41086a2005290300370300200220022903283703082002410036023020024201370328200141086a290300210620012903002107411010262203450d02200320073700002003200637000820024290808080800237022c20022003360228200128021021082002200141186a280200220336024c200241cc006a200241286a104102400240024002402003450d0020034105742109200241286a41086a28020021002002280228210a200228022c210b2008210303400240024002400240200b20006b41204f0d00200041206a22052000490d07200b410174220c20052005200c491b220c4100480d07200b450d01200a200b200c1027220a0d020c080b200041206a21050c020b200c1026220a450d060b200c210b0b200a20006a22002003290000370000200041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a29000037000020052100200341206a2103200941606a22090d000b200241306a20053602002002200b36022c2002200a3602280c010b200241306a2802002105200228022c210b2002280228210a0b200241086a4120200a200510040240200b450d00200a10230b200410230240200141146a280200450d00200810230b200241d0006a24000f0b101e000b200c4101102a000b41134101102a000b41264101102a000b41104101102a000bdf0401037f230041106b220224002002410036020820024201370300200020021039024002400240024002400240024002400240024002400240024002400240024002400240024020002d007022004101460d0020004102470d012002280204200241086a2802002200470d03200041016a22032000490d0b20004101742204200320032004491b22044100480d0b2000450d0720022802002000200410272203450d080c100b2002280204200241086a2802002200470d01200041016a22032000490d0a20004101742204200320032004491b22044100480d0a2000450d0420022802002000200410272203450d050c0d0b2002280204200241086a2802002200470d02200041016a22032000490d0920004101742204200320032004491b22044100480d092000450d0720022802002000200410272203450d080c0a0b200228020021030c0c0b200228020021030c0d0b200228020021030c080b2004102622030d080b20044101102a000b2004102622030d080b20044101102a000b2004102622030d020b20044101102a000b101e000b2002200436020420022003360200200241086a28020021000b200241086a200041016a360200200320006a41003a00000c040b2002200436020420022003360200200241086a28020021000b200241086a200041016a360200200320006a41013a00000c020b2002200436020420022003360200200241086a28020021000b200241086a200041016a360200200320006a41023a00000b200228020421002001280200200128020420022802002201200241086a280200100402402000450d00200110230b200241106a24000b110020012000280200200028020410b3010b4b02017f017e230041206b2202240020012902002103200241146a20012902083702002002200337020c20022000360208200241a886c500360204200241a886c500360200200210f503000b831005017f017e077f027e057f230041a0016b2206240042002107200641086a41086a220842003703002006420037030841af98c300410d200641086a1000200641f8006a41086a2008290300370300200620062903083703780240024002400240024002400240024002400240200641f8006a411041a886c500410041001001417f460d0020064200370308200641f8006a4110200641086a41084100100141016a41084d0d01200629030821070b200641086a41106a2003370300200641086a41286a20053a0000200641086a41186a2004370300200641286a22092000290000370300200620023703104201210420064201370308200641f8006a20011080022006280278210a200628027c210b200628028001220c450d02200641f8006a41186a220d2000460d01200c41286c210e42012104200a21050340200541086a2903002102200541106a2903002103200541186a290300210f20052903002110200641f8006a41206a200541206a290300370300200641f8006a41186a200f370300200641f8006a41106a22112003370300200641f8006a41086a2002370300200620103703780240024002400240200d2900002000290000510d0020112903002007580d01200641e8006a41086a200d41086a2903003703002006200d2903003703682011290300210220062903800121032006290378210f42014201520d030c020b200641e8006a41086a200941086a29030037030020062903082110420021042006420037030820062009290300370368200641086a41186a2903002102200629031821032006290310210f20104201510d010c020b42004201520d010b200541286a21050c060b200541286a2105200e41586a220e0d000c030b0b41d4aac10041331021000b200c41286c210e200a41286a2105200641206a2903002102200629031821032006290310210f200629030821040340200641e8006a41086a200941086a290300370300200642003703082006200929030037036820044201510d02200541286a210542002104200e41586a220e0d000b0b4100210c0240200b450d00200a10230b410821124100211320044201510d020c050b420021040b200641d8006a41086a220e200641e8006a41086a29030037030020062006290368370358200641c8006a41086a2211200e29030037030020062006290358370348200641386a41086a220e201129030037030020062006290348370338024002400240412810262212450d00201220062903383703182012200f37030020122003370308201241206a200e290300370300201241106a20023703002005200a200c41286c6a220d460d01200641f8006a41186a210e4101210c41012113034002400240200e2000460d000340200641f8006a41206a200541206a290300370300200e200541186a290300370300200641f8006a41106a2211200541106a290300370300200641f8006a41086a200541086a290300370300200620052903003703780240024002400240200e2900002000290000510d0020112903002007580d01200641e8006a41086a200e41086a2903003703002006200e2903003703682011290300210220062903800121032006290378210f42014201520d030c020b200641e8006a41086a200941086a29030037030020062903082110420021042006420037030820062009290300370368200641086a41186a2903002102200629031821032006290310210f20104201510d010c020b42004201520d010b200541286a21050c030b200d200541286a2205470d000c060b0b200641086a41186a2903002102200629031821032006290310210f2006290308210402400340200641e8006a41086a200941086a290300370300200642003703082006200929030037036820044201510d0142002104200d200541286a2205470d000c060b0b200541286a2105420021040b200641d8006a41086a2211200641e8006a41086a29030037030020062006290368370358200641c8006a41086a2214201129030037030020062006290358370348200641f8006a41086a2215201429030037030020062006290348370378024002402013200c470d00200c41016a2211200c490d07200c4101742213201120112013491b2213ad42287e2210422088a70d072010a722114100480d070240200c450d002012200c41286c2011102722120d010c020b201110262212450d010b2012200c41286c6a221120033703082011200f37030020112006290378370318201141106a2002370300201141206a2015290300370300200c41016a210c2005200d470d010c040b0b20114108102a000b41284108102a000b4101210c410121130b0240200b450d00200a10230b20044201520d030b200641f8006a41206a2209200841206a290300370300200641f8006a41186a2200200841186a290300370300200641f8006a41106a220e200841106a290300370300200641f8006a41086a2211200841086a29030037030020062008290300370378200c2013470d01200c41016a2205200c490d00200c410174220d20052005200d491b2213ad42287e2204422088a70d002004a722054100480d0002400240200c450d002012200c41286c200510272212450d010c030b2005102622120d020b20054108102a000b101e000b2012200c41286c6a22052006290378370300200541206a2009290300370300200541186a2000290300370300200541106a200e290300370300200541086a2011290300370300200c41016a210c0b2006200c360280012006201336027c200620123602782001200641f8006a108702200641a0016a24000bf31107017f017e087f047e017f037e057f23004180016b2203240042002104200341086a41086a220542003703002003420037030841af98c300410d200341086a1000200341d8006a41086a2005290300370300200320032903083703580240024002400240024002400240200341d8006a411041a886c500410041001001417f460d0020034200370308200341d8006a4110200341086a41084100100141016a41084d0d01200329030821040b200341086a41106a427f370300200341086a41286a41023a0000200341086a41186a2002370300200341286a20002900003703002003427f3703104201210220034201370308200341d8006a200110800220032802582106200328025c2107024002400240024002400240024020032802602208450d000240200341d8006a41186a22092000460d00200341f9006a210a200841286c210b420121022006210c0340200c41086a290300210d200c41106a290300210e200c41186a290300210f200c2903002110200341d8006a41206a200c41206a290300370300200341d8006a41186a200f370300200341d8006a41106a2211200e370300200341d8006a41086a200d370300200320103703580240024020092900002000290000510d002011290300220d2004580d010c050b2003290308210d4200210220034200370308200d4201510d060b200c41286a210c200b41586a220b0d000c020b0b200841286c210b200341086a41186a29030021122003290318211320032903102114200329030821022006210c0340200c41086a290300210d200c41106a290300210e200c41186a290300210f200c2903002110200341d8006a41206a200c41206a290300370300200341d8006a41186a200f370300200341d8006a41106a200e370300200341d8006a41086a200d370300200342003703082003201037035820024201510d03200c41286a210c42002102200b41586a220b0d000b0b4100210802402007450d00200610230b4108210a4100211520024201510d050c0b0b2003200a2800003602502003200a41036a280000360053200c41286a210c200341e0006a290300210e200341f8006a2d0000210b200341f0006a290300210f200329035821100c030b200c41286a210c0c010b200341086a41186a29030021122003290318211320032903102114200c41286a210c0b200341e0006a2903002202201320142003290358220d54201320025420132002511b220b1b210e200d2014200b1b2110200341e8006a2903002202201220122002541b210d200341f8006a2d0000410272210b200341f0006a290300210f420021020b2003200328005336004b200320032802503602482003200328004b360043200320032802483602402003200328004336003b2003200328024036023841281026220a450d04200a2010370300200a200b3a0020200a200f370318200a200d370310200a2003280238360021200a200e370308200a41246a200328003b36000002400240200c2006200841286c6a2211460d00200341d8006a41186a210b200341f9006a221641036a21174101210841012115034002400240024002400240200b2000460d000340200341d8006a41206a2218200c41206a290300370300200b200c41186a290300370300200341d8006a41106a2209200c41106a290300370300200341d8006a41086a2219200c41086a2903003703002003200c29030037035802400240200b2900002000290000510d002009290300220d2004580d010c040b2003290308210d4200210220034200370308200d4201510d040b2011200c41286a220c470d000c080b0b200341086a41186a290300210e2003290318210d2003290310210f200329030821020340200341d8006a41206a200c41206a290300370300200b200c41186a290300370300200341d8006a41106a200c41106a290300370300200341d8006a41086a200c41086a2903003703002003200c2903003703582003420037030820024201510d03420021022011200c41286a220c470d000c070b0b2003201628000036025020032017280000360053200c41286a210c2019290300211020182d00002118200b290300210e2003290358210f0c020b200341086a41186a290300210e2003290318210d2003290310210f0b200c41286a210c200341d8006a41086a2903002202200d200f2003290358221354200d200254200d2002511b22091b21102013200f20091b210f200341d8006a41106a2903002202200e200e2002541b210d200341d8006a41206a2d00004102722118200b290300210e420021020b2003200328005336004b200320032802503602482003200328004b360043200320032802483602402003200328004336005b20032003280240360258024020152008470d00200841016a22092008490d0620084101742219200920092019491b2215ad42287e2213422088a70d062013a722094100480d0602402008450d00200a200841286c20091027220a0d010c080b20091026220a450d070b200a200841286c6a220920183a0020200920103703082009200f3703002009200e3703182009200d370310200941246a200328005b36000020092003280258360021200841016a2108200c2011470d000c020b0b41012108410121150b02402007450d00200610230b20024201520d060b200341d8006a41206a2200200541206a290300370300200341d8006a41186a220b200541186a290300370300200341d8006a41106a2211200541106a290300370300200341d8006a41086a2209200541086a2903003703002003200529030037035820082015470d04200841016a220c2008490d0120084101742205200c200c2005491b2215ad42287e2202422088a70d012002a7220c4100480d01024002402008450d00200a200841286c200c1027220a450d010c060b200c1026220a0d050b200c4108102a000b41d4aac10041331021000b101e000b20094108102a000b41284108102a000b200a200841286c6a220c2003290358370300200c41206a2000290300370300200c41186a200b290300370300200c41106a2011290300370300200c41086a2009290300370300200841016a21080b200320083602602003201536025c2003200a3602582001200341d8006a10870220034180016a24000bf20a03027f027e077f23004190026b22022400200241206a2001104a024002402002280220450d0020022802242103200241086a2001104c2002290308a7450d00200241186a29030021042002290310210541002106200241003a00f00120012802002001280204200241f0016a410120012802081001210720012001280208200741016a41014b22076a22083602082007450d01024020022d00f0012207450d0020074101470d02200241f0016a41186a22094200370300200241f0016a41106a220a4200370300200241f0016a41086a220b4200370300200242003703f001200141086a220641002001280200200141046a280200200241f0016a41202008100122072007417f461b2207412020074120491b20062802006a22083602002007411f4d0d02200241d0016a41186a22072009290300370300200241d0016a41106a2206200a290300370300200241d0016a41086a2209200b290300370300200220022903f0013703d001200241b0016a41186a220a2007290300370300200241b0016a41106a22072006290300370300200241b0016a41086a22062009290300370300200220022903d0013703b00120024190016a41186a200a29030037030020024190016a41106a200729030037030020024190016a41086a2006290300370300200220022903b00137039001410121060b200241f0006a41186a20024190016a41186a290300370300200241f0006a41106a20024190016a41106a290300370300200241f0006a41086a20024190016a41086a290300370300200220022903900137037041002109200241003a00f0012001280200200141046a280200200241f0016a4101200810012107200141086a22082008280200200741016a41014b22076a22083602002007450d01024020022d00f0012207450d0020074101470d02200241f0016a41186a22094200370300200241f0016a41106a220a4200370300200241f0016a41086a220b4200370300200242003703f001200141086a220741002001280200200141046a280200200241f0016a41202008100122012001417f461b2201412020014120491b20072802006a3602002001411f4d0d02200241d0016a41186a22012009290300370300200241d0016a41106a2207200a290300370300200241d0016a41086a2208200b290300370300200220022903f0013703d001200241b0016a41186a22092001290300370300200241b0016a41106a22012007290300370300200241b0016a41086a22072008290300370300200220022903d0013703b00120024190016a41186a200929030037030020024190016a41106a200129030037030020024190016a41086a2007290300370300200220022903b00137039001410121090b200241306a41186a220120024190016a41186a290300370300200241306a41106a220720024190016a41106a290300370300200241306a41086a220820024190016a41086a2903003703002002200229039001370330200241d0006a41186a220a200241f0006a41186a290300370300200241d0006a41106a220b200241f0006a41106a290300370300200241d0006a41086a220c200241f0006a41086a290300370300200220022903703703502000200437030820002005370300200020063a001820002003360210200041396a20093a000020002002290350370019200041216a200c290300370000200041296a200b290300370000200041316a200a2903003700002000413a6a2002290330370100200041c2006a2008290300370100200041ca006a2007290300370100200041d2006a2001290300370100200041de006a2002412e6a2f01003b0100200041da006a200228012a36010020024190026a24000f0b200041023a001820024190026a24000f0b200041023a001820024190026a24000bf90801067f230041106b220224002002410036020820024201370300200041106a200210412002200036020c2002410c6a2002106620022802042103200228020821040240024002400240024002400240024002400240024002400240024002400240024020002d00184101470d0020032004470d01200441016a22032004490d0c20044101742205200320032005491b22034100480d0c2004450d0320022802002004200310272205450d040c090b20032004470d01200441016a22032004490d0b20044101742205200320032005491b22034100480d0b2004450d0420022802002004200310272205450d050c060b200228020021050c080b200228020021050c050b2003102622050d050b20034101102a000b2003102622050d010b20034101102a000b20022003360204200220053602000b200241086a200441016a2206360200200520046a41003a00000c020b20022003360204200220053602000b200241086a2206200441016a360200200520046a41013a00000240024002400240024020022802042203200628020022046b41204f0d00200441206a22062004490d0620034101742207200620062007491b22074100480d062003450d0120052003200710272205450d020c030b200441206a21060c030b2007102622050d010b20074101102a000b2002200736020420022005360200200721030b200241086a2006360200200520046a220441086a200041216a290000370000200441106a200041296a290000370000200441186a200041316a2900003700002004200041196a2900003700000b024002400240024002400240024002400240200041396a2d00004101470d0020032006470d08200341016a22042003490d0920034101742207200420042007491b22044100480d092003450d0120052003200410272205450d020c070b20032006470d05200341016a22002003490d0820034101742204200020002004491b22004100480d082003450d0220052003200010272205450d030c040b2004102622050d050b20044101102a000b2000102622050d010b20004101102a000b20022000360204200220053602000b200241086a2200200641016a360200200520066a41003a0000200228020421042001280200200128020420022802002203200028020010042004450d060c050b20022004360204200220053602000b200241086a2203200641016a360200200520066a41013a000002400240024020022802042205200328020022046b41204f0d00200441206a22032004490d0320054101742206200320032006491b22064100480d032005450d0120022802002005200610272203450d020c040b200228020021030c040b2006102622030d020b20064101102a000b101e000b2002200636020420022003360200200621050b200241086a200441206a2206360200200320046a220441086a200041c2006a290000370000200441106a200041ca006a290000370000200441186a200041d2006a29000037000020042000413a6a290000370000200128020020012802042003200610042005450d010b200310230b200241106a24000b960a03017f027e057f230041e0006b22022400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200028020022002903002203423f56200041086a290300220442005220045022051b0d00200141046a280200200141086a2802002200470d01200041016a22052000490d1120004101742206200520052006491b22064100480d112000450d0520012802002000200610272205450d060c190b20034280800154410020051b450d01200141046a2802002205200141086a28020022006b41024f0d02200041026a22062000490d1020054101742200200620062000491b22004100480d102005450d0820012802002005200010272205450d090c160b200128020021050c180b200342808080800454410020051b450d01200141046a2802002205200141086a28020022006b41044f0d04200041046a22062000490d0e20054101742200200620062000491b22004100480d0e2005450d08200128020020052000102722050d090c120b200128020021050c140b411020047920037942c0007c20044200521ba74103766b22074104490d0e200141046a280200200141086a2802002206470d03200641016a22052006490d0c20064101742208200520052008491b22054100480d0c2006450d09200128020020062005102722080d0a0c110b2006102622050d130b20064101102a000b200128020021050c050b200128020021080c070b2000102622050d0d0b20004101102a000b200010262205450d090b20012005360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200520006a2003a7410274410272360000200241e0006a24000f0b200510262208450d070b20012008360200200141046a2005360200200141086a28020021060b200141086a2205200641016a360200200820066a200741027441736a3a0000200029030021032002200041086a290300220437030820022003370300200141046a210803400240024002400240200828020020052802002200470d00200041016a22062000490d0520004101742209200620062009491b22094100480d052000450d01200128020020002009102722060d020c060b200128020021060c020b200910262206450d040b2001200636020020082009360200200528020021000b2005200041016a360200200620006a2003a73a000020034208882004423886842103200442088821042007417f6a22070d000b2002200337030020022004370308200320048450450d03200241e0006a24000f0b101e000b20094101102a000b41b8a8c400104f000b20022002360240200241d0a8c400360244200241c8006a41146a4100360200200241286a41146a4103360200200241346a4105360200200241106a41146a4103360200200241a886c5003602582002420137024c200241f898c4003602482002410536022c20024203370214200241d480c5003602102002200241c8006a3602382002200241c4006a3602302002200241c0006a3602282002200241286a360220200241106a41e0a8c4001061000b20004101102a000b20054101102a000b20012005360200200141046a2000360200200141086a28020021000b200141086a200041026a360200200520006a2003a74102744101723b0000200241e0006a24000f0b20012005360200200141046a2006360200200141086a28020021000b200141086a200041016a360200200520006a2003a74102743a0000200241e0006a24000bae0201027f230041106b2202240020024100360208200242013703000240412010262203450d002003200029002c370000200341086a200041346a290000370000200341106a2000413c6a290000370000200341186a200041c4006a290000370000200242a08080808004370204200220033602002002200036020c2002410c6a200210662002200041106a36020c2002410c6a20021066200028022021032002200041286a280200220036020c2002410c6a2002104102402000450d002003200041186c6a210003402002200336020c2002410c6a20021066200341106a200210412000200341186a2203470d000b0b200228020421032001280200200128020420022802002200200241086a280200100402402003450d00200010230b200241106a24000f0b41204101102a000b860100024002400240024002400240200041ff017122004101460d0020004102470d01410110262200450d03200041023a00000c020b410110262200450d03200041013a00000c010b410110262200450d03200041003a00000b20012802002001280204200041011004200010230f0b41014101102a000b41014101102a000b41014101102a000b13002000410d360204200041d0c7c0003602000b130020004107360204200041faf4c0003602000b890501077f230041b0016b22022400024002400240410e10262203450d00200341066a41002900c6c740370000200341002900c0c7403700002003410e412e10272203450d012003200129000037000e200341266a200141186a2900003700002003411e6a200141106a290000370000200341166a200141086a290000370000200241e0006a41186a22014200370300200241e0006a41106a22044200370300200241e0006a41086a22054200370300200242003703602003412e200241e0006a1002200241306a41186a2001290300370300200241306a41106a2004290300370300200241306a41086a20052903003703002002200229036037033002400240200241306a412041a886c500410041001001417f460d00200242203702542002200241306a360250200241e0006a200241d0006a106c2002280280012201450d0420002002290360370300200041186a200241e0006a41186a290300370300200041106a200241e0006a41106a290300370300200041086a200241e0006a41086a290300370300200241086a2204200241e0006a412c6a290200370300200241106a2205200241e0006a41346a290200370300200241186a2206200241e0006a413c6a290200370300200241206a2207200241e0006a41c4006a290200370300200241286a2208200241e0006a41cc006a280200360200200220022902840137030020002001360220200020022903003702242000412c6a2004290300370200200041346a20052903003702002000413c6a2006290300370200200041c4006a2007290300370200200041cc006a20082802003602000c010b200041003602200b20031023200241b0016a24000f0b410e4101102a000b412e4101102a000b41d4aac10041331021000bb60709057f047e017f017e037f027e017f017e017f230041c0016b22022400200241a0016a41186a22034200370300200241a0016a41106a22044200370300200241a0016a41086a22054200370300200242003703a0012001410020012802002001280204200241a0016a41202001280208100122062006417f461b2206412020064120491b20012802086a3602080240024002400240024002400240024002400240024002402006411f4d0d0020024180016a41186a200329030037030020024180016a41106a200429030037030020024180016a41086a2005290300370300200220022903a00137038001200241c8006a2001104c2002290348a7450d01200241c8006a41106a290300210720022903502108200241306a2001104c2002290330a7450d02200241c0006a29030021092002290338210a200241286a2001104a2002280228450d09200228022c220bad42187e220c422088a70d05200ca72206417f4c0d052006450d0320061026220d450d06200b450d040c070b20004100360220200241c0016a24000f0b20004100360220200241c0016a24000f0b20004100360220200241c0016a24000f0b4108210d200b0d030b4100210f4200210c0c030b101d000b20064108102a000b4200210c200241106a41106a210e410021054100210441002103200b210f02400340200241106a2001104c2002290310a7450d01200e290300211020022903182111200241086a2001104a2002280208450d01200341016a2106200228020c211202402003200f470d002005200620062005491b220fad42187e2213422088a70d052013a722144100480d0502402003450d00200d200420141027220d0d010c070b20141026220d450d060b200d20046a2203201037030820032011370300200341106a2012360200200c4280808080107c210c200541026a2105200441186a2104200621032006200b490d000c020b0b200f450d01200d10230c010b200d450d00200241e0006a41186a220120024180016a41186a290300370300200241e0006a41106a220620024180016a41106a290300370300200241e0006a41086a220320024180016a41086a2903003703002002200229038001370360200041186a20093703002000200a37031020002007370308200020083703002000200c200fad843702242000200d3602202000412c6a2002290360370200200041346a20032903003702002000413c6a2006290300370200200041c4006a2001290300370200200241c0016a24000f0b20004100360220200241c0016a24000f0b101e000b20144108102a000bc10906047f047e017f017e097f037e230041e0016b220224000240024002400240024002400240024002400240410f10262203450d00200341076a4100290097f64037000020034100290090f6403700002003410f412f10272204450d012004200129000037000f200441276a200141186a2900003700002004411f6a200141106a290000370000200441176a200141086a290000370000200241f0006a41186a22014200370300200241f0006a41106a22034200370300200241f0006a41086a22054200370300200242003703702004412f200241f0006a1002200241d0006a41186a2001290300370300200241d0006a41106a2003290300370300200241d0006a41086a2005290300370300200220022903703703500240024002400240200241d0006a412041a886c500410041001001417f460d0020024220370294012002200241d0006a36029001200241386a20024190016a104c2002290338a7450d0b200241386a41106a290300210620022903402107200241206a20024190016a104c2002290320a7450d0b200241306a290300210820022903282109200241186a20024190016a104a2002280218450d0b200228021c220aad42307e220b422088a70d03200ba72201417f4c0d032001450d0120011026220c450d06200a450d020c070b2000420037030020004208370320200041186a4200370300200041106a4200370300200041086a4200370300200041286a41003602000c080b4108210c200a0d050b410021104200210b200c450d080c050b101d000b410f4101102a000b412f4101102a000b20014108102a000b200241f0006a41186a210d200241f0006a41106a210e4200210b4100210f4100210541002101200a21100340200d4200370300200e4200370300200241f0006a41086a221142003703002002420037037020024190016a41086a2203200328020022034100200228029001200228029401200241f0006a41202003100122032003417f461b2203412020034120491b6a3602002003411f4d0d03200241c0016a41186a2212200d290300370300200241c0016a41106a2213200e290300370300200241c0016a41086a22142011290300370300200220022903703703c001200220024190016a104c2002290300a7450d03200141016a2103200241106a290300211520022903082116200241a0016a41186a22112012290300370300200241a0016a41106a22122013290300370300200241a0016a41086a22132014290300370300200220022903c0013703a001024020012010470d00200f20032003200f491b2210ad42307e2217422088a70d062017a722144100480d0602402001450d00200c200520141027220c0d010c080b20141026220c450d070b200c20056a2201201537030820012016370300200141286a2011290300370300200141206a2012290300370300200141186a2013290300370300200141106a20022903a001370300200b4280808080107c210b200f41026a210f200541306a2105200321012003200a490d000b200c450d030b200020093703102000200637030820002007370300200041246a200b2010ad843702002000200c360220200041186a20083703000b20041023200241e0016a24000f0b2010450d00200c10230b41d4aac10041331021000b101e000b20144108102a000b8b0401047f230041e0006b2202240002400240410e10262203450d00200341066a4100290094c7403700002003410029008ec7403700002003410e412e10272203450d012003200129000037000e200341266a200141186a2900003700002003411e6a200141106a290000370000200341166a200141086a290000370000200241c0006a41186a22014200370300200241c0006a41106a22044200370300200241c0006a41086a22054200370300200242003703402003412e200241c0006a1002200241206a41186a2001290300370300200241206a41106a2004290300370300200241206a41086a200529030037030020022002290340370320024002400240200241206a412041a886c500410041001001417f460d0020014200370300200442003703002005420037030020024200370340200241206a4120200241c0006a4120410010012201417f460d022001411f4d0d02200241186a2201200241c0006a41186a290300370300200241106a2204200241c0006a41106a290300370300200241086a2205200241c0006a41086a29030037030020022002290340370300200041013a000020002002290300370001200041096a2005290300370000200041116a2004290300370000200041196a20012903003700000c010b200041003a00000b20031023200241e0006a24000f0b41d4aac10041331021000b410e4101102a000b412e4101102a000b130020004114360204200041e8f6c0003602000bf00301087f230041c0006b22022400200241186a4200370300200241106a22034200370300200241086a4200370300200241286a22044100360200200242003703002002420837032020024100360238200242013703302002200236023c2002413c6a200241306a10662002200336023c2002413c6a200241306a10662002280220210320022004280200220436023c2002413c6a200241306a10410240024002402004450d00200441306c2105200241306a41086a21060340024002400240024020022802342207200628020022046b41204f0d00200441206a22082004490d0620074101742209200820082009491b22094100480d062007450d01200228023020072009102722070d020c070b200441206a2108200228023021070c020b200910262207450d050b20022009360234200220073602300b20062008360200200720046a220441086a200341186a290000370000200441106a200341206a290000370000200441186a200341286a2900003700002004200341106a2900003700002002200336023c2002413c6a200241306a1066200341306a2103200541506a22050d000b0b20002002290330370200200041086a200241306a41086a2802003602000240200241246a280200450d00200241206a28020010230b200241c0006a24000f0b101e000b20094101102a000b7001017f230041306b220224002002420037031020024200370308200241033602182002410036022820024201370320200241186a200241206a10412002200241086a36022c2002412c6a200241206a1066200041086a200228022836020020002002290320370200200241306a24000b3401017f0240410410262202450d0020004284808080c00037020420002002360200200241c0843d3600000f0b41044101102a000b3201017f0240410410262202450d0020004284808080c000370204200020023602002002413c3600000f0b41044101102a000b3201017f0240410410262202450d0020004284808080c00037020420002002360200200241043600000f0b41044101102a000be8dd013f017f017e037f057e107f017e037f027e037f017e037f077e207f027e027f017e027f017e087f017e067f027e247f027e057f037e017f017e287f027e037f057e117f017e017f017e0b7f027e047f017e027f027e047f017e027f017e177f017e297f027e367f017e037f027e157f027e0c7f027e077f017e087f017e037f230041b00f6b220224004200210320024190086a41086a22044200370300200242003703900841db98c100411c20024190086a1000200241a8066a41086a2205200429030037030020022002290390083703a8060240024002400240024002400240024002400240200241a8066a411041a886c500410041001001417f460d0020024200370398082002420037039008200241a8066a411020024190086a4110410010012206417f460d022006410f4d0d0220024198086a290300210720022903900821080c010b42002108420021070b20044200370300200242003703900841f798c100411820024190086a10002005200429030037030020022002290390083703a80602400240200241a8066a411041a886c500410041001001417f460d0020024200370398082002420037039008200241a8066a411020024190086a4110410010012204417f460d032004410f4d0d0320024198086a290300210920022903900821030c010b420021090b20024190086a41086a22044200370300200242003703900841f798c100411820024190086a1000200241a8066a41086a2205200429030037030020022002290390083703a8062002200320087c2208370390082002200920077c2008200354ad7c37039808200241a8066a411020024190086a41101004200442003703002002420037039008418f99c100411320024190086a10002005200429030037030020022002290390083703a806410221040240200241a8066a411041a886c500410041001001417f460d00200241003a009008200241a8066a411020024190086a41014100100141016a41014d0d0320022d0090082104200241a8066a411010030b0240200141016a410670450d00200441ff01714102472004710d0020004100360200200241b00f6a24000f0b4200210320024190086a41086a22044200370300200242003703900841f798c100411820024190086a1000200241a8066a41086a200429030037030020022002290390083703a8060240200241a8066a411041a886c500410041001001417f460d0020024200370398082002420037039008200241a8066a411020024190086a4110410010012204417f460d042004410f4d0d0420024198086a290300210a200229039008210b200241a8066a4110100342012103200b200a84500d060c070b420042008450450d060c040b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b410121040c020b410121040c010b024002402003a7450d0020024190086a41086a22044200370300200242003703900841a299c100411620024190086a1000200241a8066a41086a200429030037030020022002290390083703a8064100210c02400240024002400240200241a8066a411041a886c500410041001001417f460d00200242103702a4052002200241a8066a3602a00520024190086a200241a0056a1028200228029008220d450d02200228029408210e20024198086a280200220c41057422040d010c040b4101210d4100210e41004105742204450d020b200d20046a210f4108211020024190086a41086a2111200241a8066a41086a21124120211341122114411021154100211641322117412a2118411821194122211a411a211b4200211c41a886c500211d417f211e4101211f427f212042012121200241b8086a212241302123200241b4086a212442202125200d2126410021270c040b41d4aac10041331021000b410021040c030b410021040c020b410121040c010b410321040b03400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040e040001020f0f0b200241a0036a200b200a200cad22084200109804200241a8086a200a37030020024190086a41106a200b37030020024190086a41086a220441003a0000200241043a00900841a886c500410020024190086a102c20044200370300200242003703900841d099c100411120024190086a1000200241a8066a41086a200429030037030020022002290390083703a806200241a8066a411041a886c5004100410010012104200241a0036a41086a290300210320022903a0032107024002402004417f460d0020024200370398082002420037039008200241a8066a411020024190086a4110410010012204417f460d0c2004410f4d0d0c20024198086a2903002109200229039008212f0c010b4200212f420021090b20024190036a202f20092008420010980402402007200384500d00200229039003220920024190036a41086a290300222d84500d004200210820024190086a41086a22044200370300200242003703900841ecb5c100411620024190086a1000200241a8066a41086a200429030037030020022002290390083703a80602400240200241a8066a411041a886c500410041001001417f460d0020024200370398082002420037039008200241a8066a411020024190086a4110410010012204417f460d0e2004410f4d0d0e20024198086a290300212f20022903900821080c010b4200212f0b200820097d222e200856202f202d7d2008200954ad7d2208202f562008202f511b0d0020024180036a202e20082009202d10970442002108200241d0026a20024180036a41086a2903002209420020074200109804200241e0026a20034200200229038003222f4200109804200241f0026a202f420020074200109804200942005220034200527120022903d8024200527220022903e80242005272200241f0026a41086a290300220320022903d00220022903e0027c7c2207200354720d0020022903f002210920024190086a41086a22044200370300200242003703900841aaedc300410c20024190086a1000200241a8066a41086a200429030037030020022002290390083703a80602400240200241a8066a411041a886c500410041001001417f460d0020024200370398082002420037039008200241a8066a411020024190086a4110410010012204417f460d102004410f4d0d1020024198086a290300210320022903900821080c010b420021030b20024190086a41086a22044200370300200242003703900841aaedc300410c20024190086a1000200241a8066a41086a200429030037030020022002290390083703a8062002427f200320077c200820097c22092008542204ad7c22072004200720035420072003511b22041b370398082002427f200920041b37039008200241a8066a411020024190086a411010040b200e450d0f200d1023410121040c4c0b20024190086a41086a22044200370300200242003703900841e199c100411220024190086a1000200241a8066a41086a200429030037030020022002290390083703a80602400240200241a8066a411041a886c500410041001001417f460d002002410036029008200241a8066a411020024190086a41044100100141016a41044d0d0320022802900841016a21010c010b410121010b20024190086a41086a22044200370300200242003703900841e199c100411220024190086a1000200241a8066a41086a2230200429030037030020022002290390083703a8062002200136029008200241a8066a411020024190086a4104100420044200370300200242003703900841f399c100411620024190086a10002030200429030037030020022002290390083703a806410021310240200241a8066a411041a886c500410041001001417f460d002002410036029008200241a8066a411020024190086a41044100100141016a41044d0d0320022802900821310b20024190086a41086a22044200370300200242003703900841899ac100411d20024190086a1000200241a8066a41086a200429030037030020022002290390083703a806024002400240200241a8066a411041a886c500410041001001417f460d00200241003602900841012132200241a8066a411020024190086a41044100100141016a41044d0d06200228029008220441024f0d010c020b410421040b200421320b200241d0046a41186a22044200370300200241d0046a41106a22014200370300200241d0046a41086a22304200370300200242003703d00441a69ac100411a200241d0046a1002200241a8066a41186a2004290300370300200241a8066a41106a2001290300370300200241a8066a41086a2030290300370300200220022903d0043703a806410021010240200241a8066a412041a886c500410041001001417f460d00200241a0056a41186a4200370300200241a0056a41106a4200370300200241a0056a41086a4200370300200242003703a005200241a8066a4120200241a0056a4120410010012204417f460d052004411f4d0d0520024190086a41186a2204200241a0056a41186a220129030037030020024190086a41106a2230200241a0056a41106a223329030037030020024190086a41086a2205200241a0056a41086a2234290300370300200220022903a0053703900820012004290300370300203320302903003703002034200529030037030020022002290390083703a005410121010b412810262204450d07200420013a0004200441a886c500360200200420022903a005370005200420022f00e8053b00252004410d6a200241a0056a41086a2205290300370000200441156a200241a0056a41106a22342903003700002004411d6a200241a0056a41186a2235290300370000200441276a200241ea056a2d00003a0000200241d0046a41186a22014200370300200241d0046a41106a22304200370300200241d0046a41086a22334200370300200242003703d00441c09ac100411a200241d0046a1002200241a8066a41186a2001290300370300200241a8066a41106a2030290300370300200241a8066a41086a2033290300370300200220022903d0043703a806410021010240200241a8066a412041a886c500410041001001417f460d00203542003703002034420037030020054200370300200242003703a005200241a8066a4120200241a0056a4120410010012201417f460d062001411f4d0d0620024190086a41186a2201200241a0056a41186a223029030037030020024190086a41106a2233200241a0056a41106a220529030037030020024190086a41086a2234200241a0056a41086a2235290300370300200220022903a0053703900820302001290300370300200520332903003703002035203429030037030020022002290390083703a005410121010b412810262233450d08203320013a0004203341a886c500360200203320022903a005370005203320022f00e8053b00252033410d6a200241a0056a41086a290300370000203341156a200241a0056a41106a2903003700002033411d6a200241a0056a41186a290300370000203341276a200241e8056a41026a2d00003a0000200242003702e407200241f098c4003602e0072002410036028008200242083703f80720024190076a411c6a200241e0076a36020020024190076a41186a20024188086a360200200241003602a007200241dc9ac1003602940720022004360290072002200241f8076a3602a407200220024188086a36029c07200220024188086a3602980720024190086a20024190076a1076024002400240024020022d00d00822014102470d00200241023a00e8060c010b200241e8056a41386a223020024190086a41386a290300370300200241e8056a41306a220520024190086a41306a290300370300200241e8056a41286a223420024190086a41286a290300370300200241e8056a41206a223520024190086a41206a290300370300200241e8056a41186a220620024190086a41186a290300370300200241e8056a41106a223620024190086a41106a290300370300200241e8056a41086a222720024190086a41086a290300370300200241f0066a41086a2237200241d9086a2228290000370300200241ff066a2238200241e0086a29000037000020022002290390083703e805200220022900d1083703f00620024190076a41106a4101360200200241cc086a2030290300370200200241c4086a2005290300370200200241bc086a2034290300370200200241b4086a203529030037020020024190086a411c6a200629030037020020024190086a41146a20362903003702002002419c086a2027290300370200200220022903e80537029408200241a0056a20024190086a41c4001094041a200241003602900820024190086a410472200241a0056a41c4001094041a20024190086a41c8006a20013a0000202820022903f006370000200241e1086a2037290300370000200241e8086a2038290000370000200241a8066a20024190076a41146a20024190086a107720022d00e8064102470d010b2004102341082136410021374108213441082130410021350c010b20024190086a2004107841c80010262236450d0c2036200241a8066a41c8001094041a200241b0076a41186a20024190076a41186a290300370300200241b0076a41106a223920024190076a41106a290300370300200241b0076a41086a20024190076a41086a29030037030020022002290390073703b00720024190086a200241b0076a1076024002400240024020022d00d00822274102470d0041012135410121370c010b20024190086a41046a2104200241d9086a210520024190086a410472213a200241c4076a213b200241d1086a21342039280200213c200241a8066a41c0006a213d4102213541c800213041002101410121370340200241e8056a41386a220620024190086a41386a290300370300200241e8056a41306a222820024190086a41306a290300370300200241e8056a41286a223820024190086a41286a290300370300200241e8056a41206a223e20024190086a41206a290300370300200241e8056a41186a223f20024190086a41186a290300370300200241e8056a41106a224020024190086a41106a290300370300200241e8056a41086a224120024190086a41086a290300370300200241f0066a41086a2242203441086a290000370300200241f0066a410f6a22432034410f6a29000037000020022002290390083703e805200220342900003703f0062039203c20016a224441016a360200200441386a2006290300370200200441306a2028290300370200200441286a2038290300370200200441206a203e290300370200200441186a203f290300370200200441106a2040290300370200200441086a2041290300370200200420022903e805370200200241a0056a20024190086a41c4001094041a2002204436029008203a200241a0056a41c4001094041a20024190086a41c8006a20273a0000200520022903f006370000200541086a20422903003700002005410f6a2043290000370000200241a8066a203b20024190086a1077203d2d00004102460d0220024190086a200241a8066a41c8001094041a0240200141016a22062037470d00200241a0056a20022802b00720022802b407280210110000200641016a22272006490d362035202720272035491b2237ad42c8007e2203422088a70d362003a722274100480d3602402001417f460d00203620302027102722360d010c0d0b202710262236450d0c0b203620306a20024190086a41c8001094041a203541026a2135203041c8006a213020024190086a200241b0076a10762006210120024190086a41c0006a2d000022274102470d000b200641016a21350b20362134200241e8066a41023a00000c010b200141016a2135203621340b20022802b007220120022802b407220428020011010002402004280204450d00200110230b203421300b200241a8066a2033107920022802c806223e450d2441012145200241a0056a410172214641282147200241a8066a41286a214841242149200241a8066a41246a214a4118214b4110214c4108214d4120214e20024190086a41206a214f42c800215042202151417f21524105215342d00021544100215541d00021564200215741342158413c215941c400215a4102215b419403215c4160215d41e802215e41c800215f427f2160412c2161410121270c110b024020a101450d0020a1012092016a21a10120a201207e6a210420a20120756a227121a20120042d00000d0f20712092016a21a201207120a001470d1a0c190b209901219f010c240b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b20274108102a000b41284104102a000b41284104102a000b41d4aac10041331021000b41d4aac10041331021000b41c8004108102a000b41d4aac10041331021000b0240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020270e09000102030405060708080b20262206450d1b201410262204450d0f200420156a20162f00bec7403b0000200420106a20162900b6c740370000200420162900aec74037000020042014201710272204450d1020042006290000370012200420186a200620196a2900003700002004201a6a200620156a2900003700002004201b6a200620106a290000370000200241d0046a20196a2201201c370300200241d0046a20156a2205201c370300200241d0046a20106a2228201c3703002002201c3703d00420042017200241d0046a1002200241a0056a20196a2001290300370300200241a0056a20156a2005290300370300200241a0056a20106a2028290300370300200220022903d0043703a00502400240200241a0056a2013201d201620161001201e460d0020022025370294082002200241a0056a36029008200241b8046a20024190086a104a20022802b804450d10200241a0046a20024190086a104c20022903a004a7450d10200241a0046a20156a290300210320022903a80421070c010b42002107420021030b200410230240024002400240200b2007200b2007200b542003200a542003200a511b22041b22297d222a200a2003200a20041b222b7d200b202954ad7d222c84500d0020024190086a2006106d42002109201129030022034200200229039008220720215620034200522003501b22041b212d2007202120041b212e20024190086a20136a280200212820222802002204450d01202e202d84500d192028200420236c6a210142002109420021082028210402400340200241f8036a2004290300200420106a290300202a202c109804200241e8036a20022903f803200241f8036a20106a290300202e202d10970420024188046a200420156a220420022903e803200241e8036a20106a290300107a20022903880421032002290390042107200241a8066a20156a20024188046a20156a290300222f37030020122007370300200220033703a80602402003a7201f470d0020202008202f7c200920077c22072009542205ad7c22032005200320085420032008511b22051b21082020200720051b2109200420136a22042001470d010c020b024020032021520d00200220123602a005200241a0056a107b0b200420136a22042001470d000b0b202e202d84201c520d020c160b420021094200210842002103420021070c020b42002108202e202d84201c510d140b200241d8036a20024190086a20156a29030020024190086a20196a290300202a202c109804200241c8036a20022903d803200241d8036a20106a290300202e202d109704200241c8036a20106a290300210720022903c80321032024280200450d00202810230b200620136a2126200241b0036a2006200320297c222f2007202b7c202f200354ad7c107a20022903b003210320022903b803210720024190086a20156a200241b0036a20156a290300222f370300201120073703002002200337039008024002402003a7201f470d0020202008202f7c200920077c22072009542204ad7c22032004200320085420032008511b22041b21082020200720041b21090c010b20032021520d00200220113602a806200241a8066a107b0b20022008370398082002200937039008200220024190086a3602a806200241a8066a107b2026200f470d16410021040c590b20482802002162204a2802002163200241b0076a204b6a2264200241a8066a204b6a290300370300200241b0076a204c6a2265200241a8066a204c6a290300370300200241b0076a204d6a2266200241a8066a204d6a290300370300200220022903a8063703b007200241a0056a200241b0076a106e02400240024020022d00a0052045470d00200241e8056a204b6a2046204b6a290000370300200241e8056a204c6a2046204c6a290000370300200241e8056a204d6a2046204d6a290000370300200220462900003703e80520024190086a200241e8056a106b204f2802002204450d0120024190086a204d6a2903002167200229039008216820024190086a20496a280200450d02200410230c020b204f20553602000b42002168420021670b2062ad20507e2203205188a70d3e2003a7220420524c0d3e0240024002402004450d00200410262269450d0d20622053742204450d020c010b4108216920622053742204450d010b203e20046a216a4100216b203e216c4100216d0c290b4100216b0c300b02402035450d0020762104034002402030207e6a2d0000450d00203020756a213020042092016a22040d010c020b2030208a016a290300220320980120032098015620302087016a2903002203209501522003501b22011b2207200320950120011b220384209501510d0a200241c0026a209601209601200720031097042030200241c0026a207a6a290300370308203020022903c002370300203020756a213020042092016a22040d000b0b20022802f807229b01207b280200229c01207c6c6a219d01209c01450d24209b01219e014101216d0c280b200220a70120ab016a2d00003a00aa06200220a7012f002c3b01a806200220a70120ac016a29000037039008200220a70120ad016a2900003700950820a7012802282204450d2d20a70128022022ce01200420ae016c6a21cf0120a70120af016a28000021d00120a70120b0016a28000021d10120a70120b1016a28000021d20120a70120b2016a28000021d30120a70120b3016a21d401410021d501410821d601410021d7014103216d0c280b200241d0046a20e2016a224020fb0120e2016a290200370300200241d0046a20e3016a224120fb0120e3016a290200370300200241d0046a20e4016a224220fb0120e4016a290200370300200220fb012902003703d004200241a8066a20fb01106e02400240024020022d00a80620df01470d00200241a0056a20e2016a20e00120e2016a290000370300200241a0056a20e3016a20e00120e3016a290000370300200241a0056a20e4016a20e00120e4016a290000370300200220e0012900003703a00520024190086a200241a0056a106b20e7012802002204450d0120024190086a20e4016a290300212b20022903900821fc0120e801280200450d02200410230c020b20e70120e1013602000b420021fc014200212b0b20fb0120e6016a280200210141082138410021064100213f024020fb01280228220420e9016c222720e901490d002004ad20ea0186220320eb0188a70d3b2003a7220520e101480d3b200510262238450d102004213f0b02402001200120276a460d0041002106203821040340200120ee016a2903002107200120e6016a2903002103200241a8066a20fb01106e02400240024020022d00a80620df01470d00200241a0056a20e2016a20e00120e2016a290000370300200241a0056a20e3016a20e00120e3016a290000370300200241a0056a20e4016a20e00120e4016a290000370300200220e0012900003703a00520024190086a200241a0056a106b20e7012802002205450d0120024190086a20e4016a2903002108200229039008210920e801280200450d02200510230c020b20e70120e1013602000b42002109420021080b200241e0006a200720f00120092008107c220820f001109804200241f0006a200320f001200820f00110980420024190086a20e4016a220520f001370300200220f0013703900820f20120f10120024190086a1000200241d0006a20f00120f001200320f001109804200241a8066a20e4016a200529030037030020022002290390083703a8062002290358212f2002290368212d200229035021092002290360212e200241f0006a20e4016a29030021082002350274212a02400240200241a8066a20e30120f50120e10120e101100120f601460d00200220f00137039808200220f00137039008200241a8066a20e30120024190086a20e30120e1011001222820f601460d08202820f8014d0d08200241c0006a200229039008200529030020f40120f001109704200241c0006a20e4016a290300222c20f0012002290340222920f90156202c20f00152202c501b22051b212c202920f90120051b21290c010b4200212c420121290b200241306a2029202c20f401202a2008202e20097c7c220920eb018684202d202f8420f0015220092008547222051b20f301200920eb018820051b1098042004200337030020042007370308200420ee016a200120e2016a290300370300200420e6016a200120e3016a290300370300200420e2016a200120e4016a290300370300200420e3016a2001290300370300200420ec016a200241306a20e4016a290300370300200420e9016a2002290330370300200420ef016a2104200620df016a2106200120e9016a2101202720f7016a22270d000b0b20fa0120fc0137030020fa01202b37030820fa01203836023020fa0120ec016a200636020020fa0120ed016a203f36020020fa0120ee016a204029030037030020fa0120e6016a204129030037030020fa0120e2016a204229030037030020fa0120022903d00437031020da0120df016a21da0120fa0120ef016a21fa0120fb0120e5016a22fb0120db01470d130c340b200241a8066a20bd02106e02400240024020022d00a806208202470d00200241a0056a2085026a2083022085026a290000370300200241a0056a2086026a2083022086026a290000370300200241a0056a2087026a2083022087026a29000037030020022083022900003703a00520024190086a200241a0056a106b20024190086a2084026a2802002204450d0120024190086a2087026a29030021be0220022903900821bf02208802280200450d02200410230c020b20024190086a2084026a2092023602000b420021bf02420021be020b200241a8066a2085026a22c00220bd022085026a290000370300200241a8066a2086026a22c10220bd022086026a290000370300200241a8066a2087026a22c20220bd022087026a290000370300200220bd022900003703a8060240024020022802c00422c30220fd01460d0020022802c40421c4020c010b208902102622c302450d10410021c40220c30241003b010620c302410036020020c3022087026a20024190086a208a021094041a200241003602c404200220c3023602c0040b20bd022084026a21bd020c200b20fd02450d3420fd022802382204450d2920fd0228023022fe02200420e602746a21ff0220fd0220e9026a2180034106216d0c270b208803208e036a220429030021032088032903002107200241a8066a208f036a2238208903208f036a290000370300200241a8066a208c036a2240208903208c036a290000370300200241a8066a208e036a2241208903208e036a29000037030020022089032900003703a8062088032802282227ad2091037e220820920388a70d382008a722012090034c0d38208803208f036a290300210820042903002109208803290310212f208803290300212d208803280220210402400240024002402001450d00200110262228450d0e2027450d020c010b410821282027450d010b200420272093036c6a2106410021052028210103402001200429030037030020012004208e036a29030037030820012094036a20042094036a2903003703002001208b036a2004208b036a2903003703002001208f036a2004208f036a2903003703002001208c036a2004208c036a29030037030020012093036a2101200520a1036a210520042093036a22042006470d000c020b0b410021050b20024190086a208f036a2008370300208d03202f3703002095032005360200209603202736020020970320283602002002202d37039008200220093703980820980310262204450d0520042099036a209a03290097f6403700002004209a03290090f6403700002004209803209b031027223f450d06203f20022903a80637000f203f209c036a2038290300370000203f209d036a2040290300370000203f209e036a2041290300370000200241d0046a208f036a2204209f03370300200241d0046a208c036a2201209f03370300200241d0046a208e036a2205209f033703002002209f033703d004203f209b03200241d0046a1002200241a0056a208f036a2004290300370300200241a0056a208c036a2001290300370300200241a0056a208e036a2005290300370300200220022903d0043703a005200241e8056a208e036a2206209a03360200200220a0033703e805200220024190086a3602b007200241b0076a200241e8056a10662002208d033602b007200241b0076a200241e8056a10662097032802002104200220950328020022013602b007200241b0076a200241e8056a104102402001450d0020012093036c21270340024002400240024020022802ec052205200628020022016b208b034f0d002001208b036a22282001490d3d200520a103742238202820282038491b2228209a03480d3d2005450d0120022802e80520052028102722050d020c080b20022802e80521050c020b202810262205450d060b200220283602ec05200220053602e8050b20062001208b036a360200200520016a2201208e036a2004208f036a2900003700002001208c036a2004208b036a2900003700002001208f036a20042094036a29000037000020012004208c036a290000370000200220043602b007200241b0076a200241e8056a106620042093036a2104202720a6036a22270d000b0b200720dc01542104200320de01512101200320de0154210520022802ec052127200241a0056a208b0320022802e80522282006280200100402402027450d00202810230b2004200520011b21042087032090036a218703203f10230240209603280200450d0020970328020010230b200320de0120041b21de01200720dc0120041b21dc01208703450d340240208a032085032f01064f0d00208503208a032093036c6a20a2036a218803208503208a0320a303746a208e036a218903208a0320a1036a218a03410721270c1b0b4101210102402085032f0104220520850328020022042f0106490d00410121010340200120a1036a210120042f01042205200428020022042f01064f0d000b0b200420052093036c6a20a2036a2188032004200520a303746a208e036a2189032004200520a403746a20a5036a2802002185034100218a03200120a103460d1120a10320016b210403402085032802f806218503200420a1036a22040d000c130b0b0240024020b40320aa032f01064f0d0020aa0320b40320ae036c6a220420af036a280200210620b40320ad036a21b403200420b0036a2802002201450d360c010b0240024020aa032802002204450d0020aa0333010420b1038620ab03ad842103410121050c010b20ab03ad2103410021050b20aa0310232003a721ab030240200320b10388a7220620042f0106490d0003400240024020042802002201450d00200520ad036a2105200433010420b1038620ab03ad8421030c010b20ab03ad21030b200410232003a721ab0320012104200320b10388a7220620012f01064f0d000b0b2004200620b203746a20b3036a28020021aa032004200620ae036c6a220420af036a2802002106200420b0036a28020021010240200520ad03460d0020ad0320056b2104034020aa032802f80621aa03200420ad036a22040d000b0b410021b4032001450d350b20a90320ac036a21a90302402006450d00200110230b20a9030d120c340b41d4aac10041331021000b20284101102a000b41f8fec400104f000b20044108102a000b410f4101102a000b412f4101102a000b41d4aac10041331021000b41124101102a000b41324101102a000b20014108102a000b41b899c100104f000b20054108102a000b41f8064108102a000b41b899c100104f000b410021270c070b410421270c080b410721270c090b410721270c090b410821270c090b410021040c3d0b410121040c3c0b410221040c3b0b410321040c3a0b410321040c390b410321040c380b410321040c370b410321040c360b410321040c350b410321040c340b4104216d0c060b410021040c070b410221040c060b410121040c050b410321040c040b410321040c030b410321040c020b410321040c010b410321040b0340024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040e0400010204040b20990120796a219f012034203520756c6a21a001207621a101203421710240024002400340207121a20120a00120716b207d4d0d0620a201207e6a2d0000450d0120a201207f6a2d0000450d0220a2012081016a2d0000450d0320a1012083016a21a10120a2012084016a217120a2012085016a2d00000d000b20a201410320756c6a21a201207120a001470d2e0c2d0b20a20120756a227120a001470d290c280b20a2012080016a217120a201410120756c6a21a201207120a001470d2a0c290b20a2012082016a217120a201410220756c6a21a201207120a001460d2c410121040c390b20a201207a6a290300210320a20129030021070340207120756a210402402071207e6a2d0000450d002004217120772004470d010c2e0b2071207a6a2903002208200320712903002209200754200820035420082003511b22011b21032009200720011b2107207120a20120011b21a2012004217120772004470d000b410221040c380b20a20120793a0040209c01450d0220a2012090016a21a30120a2012091016a21a4014102216d0c2d0b410221040c610b024002400240206d0e070001020405060a0a0b206c226e204e6a216c200241e0076a216f20022802e40721700c340b0240209e012802282204450d00200420756c2105209e012802202091016a210403402035200428020022014d0d0b02402034200120756c6a22012d00400d002001290310220320012087016a290300220784500d0020024180026a209e01207a6a290300209501209401209501109804200241b0026a209e012903002208209501209401209501109804200241f0016a2095012095012008209501109804200241a0026a20960120022903b00220022903880220022903f8018420950152200241b0026a207a6a290300220820022903800220022903f0017c7c22092008547222061b209601200920061b2003200710970420024190026a209e012097016a350200209e012087016a2903002203208e0186842003208e018820022903a002200241a0026a207a6a2903001098042001207a6a22062096012006290300220320024190026a207a6a2903007c200129030022072002290390027c22082007542206ad7c22072006200720035420072003511b22061b3703002001209601200820061b3703000b200420756a210420052092016a22050d000b0b209e01207c6a229e01209d01470d1e410021040c360b209b01207c6a21380240209b012802282201450d00209b012802202104200120756c21010340024020a3012004460d0020042093016a20a401209101109604450d00200420756a210420012092016a22010d010c020b209b012087016a2205290300210320a201207a6a22062903002107200420a2012903002208209b01208a016a222829030022097d3703002004200720037d2008200954ad7d37030820a20129030021032005200629030037030020282003370300200420756a210420012092016a22010d000b0b2038219b012038209d01470d1e0b20880120a2012086016a290000370300208b0120a2012089016a29000037030020024190086a207a6a220120a201208c016a290000370300200220a201290020370390080240209a01209901470d002099012079742204209f01209f012004491b229a01ad208d01862203208e0188a70d452003a722042078480d450240209901450d002073209901208f01742004102722730d010c0f0b200410262273450d0e0b2073209901208f01746a220420022903900837000020042087016a2088012903003700002004208a016a208b012903003700002004207a6a200129030037000020342130209f01219901209f012072490d100c390b20ce01220620b4016a2101200620ae016a21ce01207321040240024002400240024002400240034020a90120046b20b5014d0d0120042001460d022004200120b601109604450d020240200420b6016a22052001460d002005200120b601109604450d00200420b7016a22052001460d002005200120b601109604450d00200420b8016a22052001460d00200420b9016a21042005200120b6011096040d010b0b20d4012005460d030c020b200420a901460d02034020012004460d012004200120b601109604450d0120a901200420b6016a2204470d000c030b0b20d40120042205460d010b200520d40120b601109604450d00024020a70120bb016a2903002208200629030022038520a70120ba016a2903002207200620a5016a2903002209858450450d004200210342808080801021070c030b200241d0016a200920c70120c60120c701109804200241e0016a200320c70120c60120c701109804200241c0016a20c70120c701200320c70110980420022903d80120022903c8018420c70152200241e0016a20a5016a290300222f20022903d00120022903c0017c7c222d202f5472450d01200820c20188200720c20186842208200720c20188220784500d0c200241a0016a2003200920082007109704200241a0016a20a5016a290300210320022903a00121070c020b20ce0120cf01470d200c020b200820c801200820c80156200720c701522007501b22041b2203200720c70120041b220784500d0b200241b0016a20022903e001202d20032007109704200241b0016a20a5016a290300210320022903b00121070b20062007370310200620ba016a20033703002002200620bc016a2d00003a008205200220062f00243b0180052002200620b0016a2900003703f0042002200620bd016a2900003700f504200620b1016a2800002101200620b2016a2800002105200620be016a2800002128200620bf016a2800002106024020d50120d701470d0020d50120c0016a220420d501490d4520d50120c001742238200420042038491b2204ad20c1017e220820c20188a70d452008a7223820aa01480d450240024020d501450d0020d60120d50120c3016c2038102722d6010d010c0b0b2038102622d601450d0a0b200421d5010b20022d008205213820022f018005213f20d60120d70120c3016c6a2204200136000f2004200536000b20042028360007200420063600032004203f3b0100200420c4016a20383a000020042007370320200420c5016a2003370300200420ba016a20022900f504370000200420022903f00437001320d70120c0016a21d70120ce0120cf01470d1f0b02400240024020d701450d0020d70120c3016c2201450d0120d60120b6016a210442002103420021070340200420a5016a29030020077c2004290300220720037c2203200754ad7c2107200420c3016a2104200120cc016a22010d000c030b0b20d501450d3720d60110230c370b42002103420021070b20024190016a20c70120c60120037d2208200820c6015620c70120077d200320c60156ad7d220320c701522003501b22041b222d20c701200320041b220320d701ad222e20c70110970420022903900121090240202d202e5420aa012003501b0d0020024190016a20a5016a290300212f20d60120b6016a210420d70121010340200420a5016a220520ca0120052903002203202f7c2004290300220720097c22082007542205ad7c22072005200720035420072003511b22051b370300200420ca01200820051b370300200420c3016a2104200120cb016a22010d000b0b20024180016a20092003202e20031098040240202d2002290380017da72206450d0041002104034020d601200420d7017020c3016c6a220120c5016a220520ca01200529030022082001290320220320c8017c22072003542205ad7c220920052009200854200720035a1b22051b370300200120ca01200720051b370320200420c0016a22042006490d000b0b200220022d00aa063a009e05200220022f01a8063b019c05200220022903900837038805200220022900950837008d050240207220cd01470d00207220c0016a22042072490d44207220c001742201200420042001491b2204ad20c9017e220320c20188a70d442003a7220120aa01480d44024002402072450d002074207220b3016c2001102722740d010c0d0b200110262274450d0c0b200421720b20022d009e05210120022f019c052105207420cd0120b3016c6a220420d00136000f200420d10136000b200420d201360007200420d301360003200420053b0100200420c4016a20013a0000200420ba016a200229008d053700002004200229038805370013200420d701360228200420d501360224200420d60136022020cd0120c0016a21cd0120a70120a6016a22a70120a801470d100c390b20c3022087026a210520c302208b026a213820c3022f0106222820fe01742101417f21040240024002400240024003402001450d0120042082026a210420ab02208202200241a8066a20052084021096042206209202481b20920220061b2206450d04200120bb026a210120052084026a21052006208202460d000b20c4020d010c020b2028210420c402450d010b20c40220ab026a21c40220c302200420a502746a2089026a28020021c3024104216d0c2f0b20024190076a2085026a220120c00229030037030020024190076a2086026a220520c10229030037030020024190076a2087026a220620c202290300370300200220022903a80637039007200241c0046a2087026a222820282802002082026a360200200241e8056a2085026a22c5022001290300370300200241e8056a2086026a22c6022005290300370300200241e8056a2087026a22c702200629030037030020022002290390073703e80520382f01002205208c024f0d0120c302200420fe01746a2201208d026a20012087026a2206200520046b20fe01741095041a20012084026a20c50229030037000020012085026a20c60229030037000020012086026a20c702290300370000200620022903e80537000020c3022004208e026c6a22012090026a2001208f026a220620c302208b026a22052f010020046b208e026c1095041a20012091026a20920236020020012093026a20940237030020012095026a20be0237030020012096026a20bf0237030020012097026a20be02370300200620bf02370300200520052f01002082026a3b010020bd0220ff01470d150c3f0b20c3022004208e026c6a22042095026a20be0237030020042096026a20bf0237030020042097026a20be023703002004208f026a20bf0237030020042091026a209202360200200420bc026a280200210520042093026a22012802002104200120940237030002402004450d002005450d00200410230b20bd0220ff01470d110c3e0b20890210262205450d0c20052092023b0106200520920236020020052087026a20024190086a208a02109404210620024190086a208d026a22c80220c3022098026a29030037030020024190086a2084026a22c90220c3022099026a29030037030020024190086a2085026a22ca0220c302209a026a29030037030020024190086a2086026a22cb0220c302209b026a29030037030020024190086a2087026a22cc0220c302209c026a290300370300200241f0066a2085026a22cd0220c302209d026a290000370300200241f0066a2086026a22ce0220c302209e026a290000370300200241f0066a2087026a22cf0220c302209f026a290000370300200220c3022903880537039008200220c3022900c8013703f006200620c30220a0026a20c302208b026a22282f010020a1026a220120fe017410940421062005208f026a20c30220a2026a2001208e026c109404213f2028208b023b0100200520013b0106200220022d00f2063a009e05200220022f01f0063b019c05200220810229000037038805200220810220fe016a22d00229000037008d05200241f0066a208c026a22d10228000021d20220a40228000021d30220022800f30621d40220022800f70621d502200241a8066a208d026a22d60220c802290300370300200241a8066a2084026a22d70220c90229030037030020c00220ca0229030037030020c10220cb0229030037030020c20220cc0229030037030020022002290390083703a806024002402004208b024b0d0020c3022087026a200420fe01746a22012084026a200120382f010020046b20fe01741095041a20012085026a20c50229030037000020012086026a20c60229030037000020012087026a20c702290300370000200120022903e80537000020c302208f026a2004208e026c6a2201208e026a200120382f010020046b208e026c1095041a20012085026a20be02370300200120bf02370310200120be02370308200120bf023703002001208d026a20920236020020012094023703200c010b2006200420fe01746a20ba026a2006200420a1026a222820fe01746a2206200120a9027120286b20fe01741095041a20062085026a20c50229030037000020062086026a20c60229030037000020062087026a20c702290300370000200620022903e805370000203f2004208e026c6a220420b2026a200420b1026a22012005208b026a22382f010020286b208e026c1095041a200420b5026a20be02370300200420b6026a20bf02370300200420b7026a20be02370300200120bf02370300200420b3026a209202360200200420b4026a2094023703000b203820382f01002082026a3b010020a60220022d009e053a0000200241a0056a2087026a22d80220c202290300370300200241a0056a2086026a22d90220c102290300370300200241a0056a2085026a22da0220c002290300370300200241a0056a2084026a22db0220d702290300370300200241a0056a208d026a22dc0220d602290300370300200220022f019c053b01f80720022002290388053703d0042002200229008d053700d504200220022903a8063703a005200241b0076a208d026a22dd0220dc02290300370300200241b0076a2084026a22de0220db02290300370300200241b0076a2085026a22df0220da02290300370300200241b0076a2086026a22e00220d902290300370300200241b0076a2087026a22e10220d802290300370300200220022903a0053703b007200220a6022d00003a008205200220022f01f8073b018005200220022903d0043703f004200220022900d5043700f50420c30228020022e202450d0120c3022f010421e302410021e402200521e5020c1e0b20024188086a20a5026a224120022d0082053a0000200220022f0180053b018808200220022903f0043703f807200220022900f5043700fd0720dc0220dd0229030037030020db0220de0229030037030020da0220df0229030037030020d90220e00229030037030020d80220e102290300370300200220022903b0073703a00520e30220a90271212820e2022f0106220420aa024d0d0220a70210262206450d0920062092023b0106200620920236020020062087026a20024190086a20a802109404210120cd0220e202209d026a29000037030020ce0220e202209e026a29000037030020cf0220e202209f026a290000370300200220e2022900c8013703f00620c80220e2022098026a29030037030020c90220e2022099026a29030037030020ca0220e202209a026a29030037030020cb0220e202209b026a29030037030020cc0220e202209c026a290300370300200220e2022903880537039008200120e20220a0026a20e202208b026a223f2f0100220520a1026a220420fe017410940421422006208f026a20e20220a2026a2004208e026c109404214420062089026a20e20220ae026a200520af026a223820a502741094042140203f208b023b0100200620043b010602402038450d00410021042040210103402001280200220520043b010420052006360200200120ad026a2101203820042082026a2204470d000b0b20d60220c80229030037030020d70220c90229030037030020c00220ca0229030037030020c10220cb0229030037030020c20220cc0229030037030020022002290390083703a806200220022f01f0063b019c05200220022d00f2063a009e0520d102290000210320022900f3062107200220d00229000037008d05200220810229000037038805200241d0046a208c026a2238200337000020800220022903880537000020800220fe016a2243200229008d05370000200220073700d304200220022d009e053a00d204200220022f019c053b01d00420c80220d60229030037030020c90220d70229030037030020ca0220c00229030037030020cb0220c10229030037030020cc0220c202290300370300200220022903a806370390080240024020e30220a902712201208b024b0d0020e2022087026a220420282082026a220520fe01746a2004202820fe01746a2204203f2f0100224020286b224220fe01741095041a200420d30236000f200420d20236000b200420d502360007200420d402360003200420a5026a20412d00003a0000200420022f0188083b0000200420022903f80737001320042085026a20022900fd0737000020e202208f026a2028208e026c6a2204208e026a20042042208e026c1095041a2004208d026a20dc0229030037030020042084026a20db0229030037030020042085026a20da0229030037030020042086026a20d90229030037030020042087026a20d802290300370300200420022903a005370300203f20402082026a22043b010020e2022089026a2240202820a5027422416a2087026a2040200520a502746a2240200420a9027120056b20a502741095041a204020e5023602002001203f2f010022054f0d0120e20220416a20b0026a210403402004280200220120282082026a22283b0104200120e202360200200420ad026a210420052028470d000c020b0b2042202820af026a220520fe01746a2042202820a1026a220420fe01746a22012006208b026a223f2f010020046b20fe01741095041a20012085026a20022900fd07370000200120d30236000f200120d20236000b200120d502360007200120d402360003200120a5026a20412d00003a0000200120022f0188083b0000200120022903f80737001320442028208e026c6a220120b2026a200120b1026a2241203f2f0100224220046b208e026c1095041a200120b3026a20dc02290300370300200120b4026a20db02290300370300200120b5026a20da02290300370300200120b6026a20d902290300370300200120b7026a20d802290300370300204120022903a005370300203f20422082026a22013b01002040202820a5027422416a20b8026a2040200520a502746a2228200120a9027120056b20a502741095041a202820e5023602002005203f2f010022284b0d00200620416a20b9026a210103402001280200220520042082026a22043b010420052006360200200120ad026a210120282004470d000b0b20e4022082026a2128200241f4076a20a5026a220420022d00d2043a000020c70220cc0229030037030020c60220cb0229030037030020c50220ca02290300370300200241e8056a2084026a220120c902290300370300200241e8056a208d026a220520c802290300370300200220022f01d0043b01f40720022002290390083703e80520022080022900003703e007200220432900003700e507203828000021d202200241d0046a20a3026a28000021d30220022800d30421d40220022800d70421d50220dd02200529030037030020de02200129030037030020df0220c50229030037030020e00220c60229030037030020e10220c702290300370300200220022903e8053703b007200220042d00003a008205200220022f01f4073b018005200220022903e0073703f004200220022900e5073700f504024020e2022802002204450d0020e2022f010421e302200241c0046a1a20e2021a200421e202200621e502202821e4024105216d0c2e0b20e2021a200241c0046a22011a2006210520a702102622040d010c0c0b200241c0046a21012005210520a70210262204450d0b0b200441003b01062004410036020020042087026a20024190086a20a80210940421272004200128020022063602f80620012004360200200120012802042082026a360204200641003b010420062004360200202720042f0106220620fe01746a220120022f0180053b0000200120d30236000f200120d20236000b200120d502360007200120d402360003200120022903f004370013200120a5026a20022d0082053a000020012085026a20022900f50437000020042006208e026c6a22012091026a20dd0229030037030020012093026a20de0229030037030020012095026a20df0229030037030020012096026a20e00229030037030020012097026a20e1022903003703002001208f026a20022903b00737030020042089026a20062082026a220120a502746a2005360200200420013b0106200520013b01042005200436020020c3021a20bd0220ff01470d0f0c3a0b20e2022087026a220120282082026a220520fe01746a2001202820fe01746a2201200420286b220620fe01741095041a200120d30236000f200120d20236000b200120d502360007200120d402360003200120a5026a20412d00003a0000200120022f0188083b0000200120022903f80737001320012085026a20022900fd0737000020e2022028208e026c6a22012090026a2001208f026a22272006208e026c1095041a20012091026a20dc0229030037030020012093026a20db0229030037030020012095026a20da0229030037030020012096026a20d90229030037030020012097026a20d802290300370300202720022903a00537030020e202208b026a220120042082026a22043b010020e2022089026a2206202820a502746a2087026a2006200520a502746a2206200420a9027120056b20a502741095041a200620e5023602000240202820012f010022044f0d0020e50220053b010420e50220e20236020020052004460d00200420ab026a210620e202200520ab026a220420a502746a20ac026a2101034020012802002205200420a5026a3b0104200520e202360200200120ad026a2101200620042082026a2204470d000b0b41001a200241c0046a1a20c3021a20bd0220ff01470d0d0c390b20fe0222810320e9026a21820320810320e8026a21fe02200241c0046a21830320022802c4042184030c2b0b41c8eec300200120351029000b20384108102a000b41d8eec300104f000b41f0eec300104f000b20014104102a000b41a8074108102a000b20044101102a000b41f8064108102a000b41a8074108102a000b410221270c050b410321270c050b410521270c050b410521270c050b410521270c050b410521270c050b410321040c480b410321040c470b410321040c460b410321040c450b410321040c440b410321040c430b4101216d0c0c0b4102216d0c0d0b4103216d0c0d0b4103216d0c0d0b4105216d0c0e0b410221040c120b410121040c110b410221040c100b410121040c0f0b410221040c0e0b410121040c0d0b410221040c0c0b410221040c0b0b410321040c0a0b410321040c090b410321040c080b410321040c070b410321040c060b410321040c050b410321040c040b410321040c030b410021040c010b410121040b0240024002400240024002400240024002400240024003400240024020040e020001010b206f2802002206204d6a210520062f010622382053742101417f2104024002400240024003402001450d01200420456a210420522045206e2005204e10960422282055481b205520281b2228450d042001205d6a21012005204e6a210520282045460d000b20700d010c020b203821042070450d010b207020526a217020062004205b746a205c6a216f410021040c030b206c206a470d080c110b203520062004205b746a205e6a220428020022014d0d0320342001205f6c6a220129031021032001204b6a290300210720682067107c21082035200428020022014d0d0420342001205f6c6a2201204b6a20602007200320087c22082003542205ad7c220920052009200754200820035a1b22051b37030020012060200820051b370310200241f0066a204b6a2201206e204b6a290000370300200241f0066a204c6a2205206e204c6a290000370300200241f0066a204d6a2206206e204d6a2900003703002002206e2900003703f0062004280200212802402062206b470d00206220456a22042062490d1e20622045742238200420042038491b2204ad20507e2203205188a70d1e2003a722382055480d1e024002402062450d0020692062205f6c2038102722690d010c080b203810262269450d070b200421620b2069206b205f6c6a22042057370300200420283602202004204b6a20573703002004204c6a20573703002004204d6a2057370300200420596a2001290300370200200420586a2005290300370200200420616a2006290300370200200420022903f006370224206b20456a216b206c206a470d080c100b208303280200220620ea026a210520062f0106223820eb02742101417f210402400240024003402001450d01200420f1026a210420ec0220f102208203200520ef02109604222820f002481b20f00220281b2228450d03200120f2026a2101200520ef026a2105202820f102460d000b2084030d010c040b20382104208403450d030b20840320ec026a2184032006200420ed02746a20ee026a218303410121040c010b0b200620f4026a200420f3026c6a2204450d00200420ea026a220120f6022001290300220320810320f5026a22012903007c2004290300220720810320f3026a22052903007c22082007542206ad7c22072006200720035420072003511b22061b370300200420f602200820061b37030020024190086a20f7026a20800320f7026a290000220337030020024190086a20e9026a20800320e9026a290000220737030020024190086a20ea026a20800320ea026a290000220837030020022080032900002209370390082001290300212f2005290300212d200241a8066a20ea026a22282008370300200241a8066a20f7026a22382003370300200241a8066a20e9026a223f2007370300200220093703a806200420f9026a2105200420ef026a2106024002400240024020042802282201200420f8026a280200470d00200120f1026a22042001490d1f200120f102742240200420042040491b2240ad20fa027e220320fb0288a70d1f2003a7224120f002480d1f2001450d012006280200200120f3026c2041102722040d020c080b200628020021040c020b204110262204450d060b20062004360200200620fc026a2040360200200528020021010b2004200120f3026c6a2204202f3703082004202d370300200420022903a806370310200420f9026a2038290300370300200420ef026a203f290300370300200420f7026a20282903003703002005200528020020f1026a3602000b20fe0220ff02470d060c0b0b41a889c400200120351029000b41c8eec300200120351029000b20384108102a000b20414108102a000b4100216d0c020b4100216d0c020b4106216d0c020b410321040c020b410321040c010b410321040c000b0b20fd0220e8026a22fd0220e702460d0a41062127410321040c290b20a70120a6016a22a70120a801460d0341032127410321040c280b200241d0046a204b6a22042064290300370300200241d0046a204c6a22012065290300370300200241d0046a204d6a22052066290300370300200220022903b0073703d00420682067107c210320024190076a204b6a2206200429030037030020024190076a204c6a2204200129030037030020024190076a204d6a22012005290300370300200220022903d0043703900702402063450d00203e10230b2069450d0020024190086a204b6a2227200629030037030020024190086a204c6a2206200429030037030020024190086a204d6a222820012903003703002002200229039007370390080240200241f8076a204d6a2205280200220120022802fc07470d00200241a8066a2033107820022802fc072204200528020022386b205220022802a806223e20456a223f203f203e491b223e4f0d002038203e6a223e2038490d0d20042045742238203e203e2038491b223ead20547e2207205188a70d0d2007a722382055480d0d024002402004450d0020022802f807200420566c2038102722040d010c1a0b203810262204450d190b2002203e3602fc07200220043602f8070b20022802f807200120566c6a22042069360220200420022903900837022c200420476a206b360200200420496a20623602002004205737031020042057370308200420033703002004204b6a2057370300200420586a2028290300370200200420596a20062903003702002004205a6a20272903003702002005200120456a360200200241a8066a20331079200241a8066a204e6a280200223e0d1d0b203310230240203520324f0d0002402037450d00203610230b024020024180086a2802002271450d00207141d0006c210420022802f80741206a217103400240207141046a280200450d00207128020010230b207141d0006a2171200441b07f6a22040d000b0b024020022802fc07450d0020022802f80710230b20022802e00720022802e407200241e8076a280200107d0c030b2035203120352031491b2272ad2203421b88a70d0c2003420586a72204417f4c0d0c024002402004450d002004102622730d0120044101102a000b410121730b2003422c7e2203422088a70d0c2003a72204417f4c0d0c0240024002402004450d00200410262274450d1b2072450d020c010b410421742072450d010b41c80021752034203541c8006c22766a217741002178410121794108217a200241f8076a41086a217b41d000217c419f02217d41c000217e418801217f41900121800141d00121810141d80121820141e07d21830141a0022184014198022185014138218601411821870120024190086a41186a21880141302189014110218a0120024190086a41106a218b014128218c014205218d014220218e014105218f01417c219001412021910141b87f21920141242193014280808080102194014200219501427f2196014114219701420121980141002199012072219a01410221270c200b4100219f014100219a010b410821a5010240200241f8076a41086a2802002204450d0041d00021a60120022802f80722a701200441d0006c6a21a8012073209f014105746a21a901410021aa01412e21ab01413f21ac0141c40021ad0141c80021ae01413b21af01413721b001413321b101412f21b201412c21b301412421b40141ff0021b501412021b60141c00021b70141e00021b80141800121b901411821ba01411021bb01412621bc01413c21bd01412b21be01412721bf01410121c001423021c101422021c201413021c301410221c401412821c50142808080801021c601420021c701420121c801422c21c901427f21ca01417f21cb01415021cc01410021cd01410321270c200b410021cd010b02402037450d00203610230b024020024180086a2802002204450d00200441d0006c210120022802f80741206a210403400240200441046a280200450d00200428020010230b200441d0006a2104200141b07f6a22010d000b0b024020022802fc07450d0020022802f80710230b410821d80120022802e00720022802e407200241e0076a41086a280200107d2073450d0020cd01412c6c2204412c6e21d901410021da012004412c490d0120d901ad4206862203422088a70d092003a722014100480d092001102622d801450d192074207420046a22db01470d020c030b420021dc0120024190086a41086a22714200370300200242003703900841d099c100411120024190086a1000200241a8066a41086a207129030037030020022002290390083703a806410021dd0102400240200241a8066a411041a886c500410041001001417f460d0020024200370398082002420037039008200241a8066a411020024190086a4110410010012271417f460d162071410f4d0d1620024198086a29030021de0120022903900821dc010c010b420021de010b0c070b410021d9012074207420046a22db01460d010b410121df01200241a8066a41017221e001410021e101411821e201411021e301410821e401412c21e501412021e60120024190086a41206a21e701200241b4086a21e801413021e901420621ea01422021eb01413821ec01413421ed01412821ee0141c00021ef01420021f001411621f10141ecb5c10021f20142ffffffff0f21f301427f21f40141a886c50021f501417f21f601415021f701410f21f801420121f901410021da0120d80121fa01207421fb01410421270c1c0b200242003702c40441f098c40021fd01200241f098c4003602c004209f01450d00410521fe012073209f014105746a21ff01200241d0046a41136a218002200241f0066a41136a2181024101218202200241a8066a4101722183024120218402411821850241102186024108218702200241b4086a21880241f80621890241f006218a024106218b02410b218c024128218d024130218e0241e802218f024198032190024190032191024100219202418803219302420821940241800321950241f80221960241f00221970241b00521980241a80521990241a005219a02419805219b02419005219c0241e001219d0241d801219e0241d001219f0241e80121a002417921a10241b80521a202410f21a302200241f0066a410f6a21a402410221a502200241f8076a41026a21a60241a80721a70241a00721a80241ffff0321a902410a21aa02417f21ab0241800721ac02410421ad0241940721ae02417a21af0241fc0621b00241b07d21b10241e07d21b20241d87d21b30241d07d21b40241c87d21b50241c07d21b60241b87d21b702416c21b80241e00621b90241c07e21ba02416021bb02418c0321bc02207321bd02410521270c1c0b410621e60220da014106742204450d0020d80120046a21e70241c00021e802411021e902410821ea02410521eb02417f21ec02410221ed0241f80621ee02412021ef02410021f002410121f102416021f202413021f30241e80221f402413821f502427f21f602411821f702412421f802412821f902423021fa02422021fb02410421fc0220d80121fd02410621270c1c0b20024190086a41086a22044200370300200242003703900841a299c100411620024190086a1000200241a8066a41086a200429030037030020022002290390083703a8064100213a024002400240200241a8066a411041a886c500410041001001417f460d00200242103702a4052002200241a8066a3602a00520024190086a200241a0056a1028200228029008223b450d14200228029408213a20024198086a28020041057422420d010c020b4101213b41004105742242450d010b203b21040340410f10262201450d08200141076a4100290097f64037000020014100290090f6403700002001410f412f10272201450d092001200429000037000f200141276a200441186a223f2900003700002001411f6a200441106a2240290000370000200141176a200441086a2241290000370000200241d0046a41186a22054200370300200241d0046a41106a22064200370300200241d0046a41086a22274200370300200242003703d0042001412f200241d0046a1002200241a0056a41186a22432005290300370300200241a0056a41106a22442006290300370300200241a0056a41086a2285032027290300370300200220022903d0043703a005200241a0056a4120100320011023411210262201450d0a200141106a41002f00a6f54022393b0000200141086a410029009ef540220337000020014100290096f540220737000020014112413210272201450d0b200120042900003700122001412a6a203f290000370000200141226a20402900003700002001411a6a2041290000370000200542003703002006420037030020274200370300200242003703d00420014132200241d0046a1002200241f0066a41186a2005290300370300200241f0066a41106a2006290300370300200241f0066a41086a2027290300370300200220022903d0043703f006410021280240200241f0066a412041a886c500410041001001417f460d002002410036029008200241f0066a412020024190086a41044100100141016a41044d0d082002280290082138200241f0066a41201003410121280b2001102302402038410020281b222841014d0d00411210262201450d0d200141106a20393b0000200141086a20033700002001200737000020014112413210272201450d0e200120042900003700122001412a6a203f290000370000200141226a20402900003700002001411a6a2041290000370000200542003703002006420037030020274200370300200242003703d00420014132200241d0046a100220432005290300370300204420062903003703002085032027290300370300200220022903d0043703a00520022028417f6a36029008200241a0056a412020024190086a41041004200110230b200441206a2104204241606a22420d000b0b0240203a450d00203b10230b20022802c004218503024020022802c4042204450d002004210103402085032802f8062185032001417f6a22010d000b03402004417f6a22040d000b0b4108218603024002400240200241c0046a41086a280200228703450d002085032f0106450d0120850341e8026a21880320850341086a2189034101218a030c020b427f21dc01427f21de010c020b024002402085032f0104228b0320850328020022042f01064f0d00410121010c010b410121010340200141016a210120042f0104228b03200428020022042f01064f0d000b0b2004208b0341306c6a41e8026a2188032004208b034105746a41086a2189032004208b034102746a41fc066a2802002185034100218a0320014101460d00410120016b210403402085032802f806218503200441016a22040d000b0b4110218c0320024190086a41106a218d03427f21dc014108218e034118218f03417f219003423021910342202192034130219303412821940320024190086a41286a219503200241b4086a2196034120218b0320024190086a41206a219703410f21980341072199034100219a03412f219b034127219c03411f219d034117219e034200219f03420121a003410121a10341e80221a203410521a303410221a40341fc0621a503415021a603427f21de010c150b20024190086a2086036a22044200370300200242003703900841d099c100411120024190086a1000200241a8066a2086036a2201200429030037030020022002290390083703a806200220de0137039808200220dc0137039008200241a8066a411020024190086a4110100420044200370300200242003703900841a299c100411620024190086a10002001200429030037030020022002290390083703a806200241003602980820024201370390082002209f013602a005200241a0056a20024190086a104102400240209f01450d00209f014105742128410020024190086a41086a28020022016b2106200228029008213820022802940821272073210403400240202720066a411f4b0d00200141206a22052001490d062027410174223f20052005203f491b22054100480d06024002402027450d00203820272005102722380d010c110b200510262238450d100b200521270b203820016a22052004290000370000200541186a200441186a290000370000200541106a200441106a290000370000200541086a200441086a290000370000200641606a2106200141206a2101200441206a2104202841606a22280d000b20024198086a2001360200200220273602940820022038360290080c010b20024198086a2802002101200228029408212720022802900821380b200241a8066a411020382001100402402027450d00203810230b02400240024002400240209f014105742204450d00200441057522a703ad4205862203422088a70d072003a722014100480d072001102622dd01450d16207320046a2073460d020c010b410121dd01410021a703207320046a2073460d010b209f01410574220541606a410576212720024190086a410172210620dd012104207321010340200241a8066a41186a200141186a290000370300200241a8066a41106a200141106a290000370300200241a8066a41086a200141086a290000370300200220012900003703a80620024190086a200241a8066a106e0240024020022d0090084101470d00200241d0046a41186a200641186a290000370300200241d0046a41106a200641106a290000370300200241d0046a41086a200641086a290000370300200220062900003703d0040c010b200241d0046a41186a4200370300200241d0046a41106a4200370300200241d0046a41086a4200370300200242003703d0040b200141206a2101200420022903d004370000200441186a200241d0046a41186a290300370000200441106a200241d0046a41106a290300370000200441086a200241d0046a41086a290300370000200441206a2104200541606a22050d000b202741016aad42208621a803209a01450d020c010b420021a803209a01450d010b207310230b200241c8046a28020021a90320022802c00421aa03024020022802c4042204450d00034020aa032802f80621aa032004417f6a22040d000b0b20a903450d00410021ab03417f21ac03410121ad03413021ae03418c0321af0341880321b003422021b103410221b20341fc0621b303410021b403410821270c1c0b024020aa0341f098c400460d0020aa03280200217120aa0310232071450d0020712802002104207110232004450d00024020042802002271450d0003402004102320712104207128020022a201217120a2010d000b0b200410230b024020da01450d0020da01410674210420d80141306a217103400240207141046a280200450d00207128020010230b207141c0006a2171200441406a22040d000b0b024020d901450d0020d80110230b20a703ad2103024020cd01450d0020cd01412c6c2104207441206a217103400240207141046a280200450d00207128020010230b2071412c6a2171200441546a22040d000b0b20a80320038421032072450d00207410230b20024190086a41086a22714200370300200242003703900841d49cc100411520024190086a1000200241a8066a41086a207129030037030020022002290390083703a80602400240200241a8066a411041a886c500410041001001417f460d002002410036029008200241a8066a411020024190086a41044100100141016a41044d0d0c20022802900821710c010b413c21710b200241206a20dc0120de01428094ebdc034200109704200241106a200229032022f001200241206a41086a29030022074280ec94a37c427f109804200220f00120072071ad2208420010980420024190086a41086a22714200370300200242003703900841db98c100411c20024190086a1000200241a8066a41086a207129030037030020022002290390083703a8062002200229030022f001200820dc0120022903107c7e428094ebdc038042ffffffff0f837c2207370390082002200241086a290300200720f00154ad7c37039808200241a8066a411020024190086a4110100420002003370204200020dd01360200200241b00f6a24000f0b101e000b101d000b41d4aac10041331021000b410f4101102a000b412f4101102a000b41124101102a000b41324101102a000b41124101102a000b41324101102a000b20054101102a000b41d4aac10041331021000b20384108102a000b41d4aac10041331021000b20044104102a000b41d4aac10041331021000b20014101102a000b20014108102a000b410121270c010b410721270c060b410321040c070b410321040c060b410321040c050b410321040c040b410321040c030b410321040c020b410321040c010b410321040c000b0bae07020b7f077e230041b0026b22022400200241086a2001280200200128020428020c1100000240024020022903084201520d00200241e8016a4101722103200241086a41086a2104200241b8016a2105200241bc016a2106200141046a2107200241fb006a21080340200241f8006a41186a2209200441186a290000370300200241f8006a41106a220a200441106a290000370300200241f8006a41086a220b200441086a29000037030020022004290000370378200241e8016a200241f8006a106e02400240024020022d00e8014101470d0020024190026a41186a200341186a29000037030020024190026a41106a200341106a29000037030020024190026a41086a200341086a290000370300200220032900003703900220024198016a20024190026a106b2005280200220c450d0120024198016a41086a290300210d200229039801210e2006280200450d02200c10230c020b200541003602000b4200210e4200210d0b200241e8016a41186a220c2009290300370300200241e8016a41106a2209200a290300370300200241e8016a41086a220a200b290300370300200220022903783703e80120024198016a41186a220b200c29030037030020024198016a41106a220c200929030037030020024198016a41086a2209200a290300370300200220022903e8013703980102400240200e200d107c220f4200510d0020024190026a41186a200b29030037030020024190026a41106a200c29030037030020024190026a41086a200929030037030020022002290398013703900220022002280078360270200220082800003600734200211041002109200f2111200e2112200d21130c010b410221090b200241d0006a41186a20024190026a41186a290300370300200241d0006a41106a20024190026a41106a290300370300200241d0006a41086a20024190026a41086a2903003703002002200229039002370350200220022802703602482002200228007336004b20094102470d02200241086a2001280200200728020028020c11000020022903084201510d000b0b200041023a0040200241b0026a24000f0b20002011370310200042003703082000420037030020002002290350370320200020093a004020002002280248360041200041186a2010370300200041d0006a2013370300200041c8006a2012370300200041c4006a200228004b360000200041286a200241d8006a290300370300200041306a200241e0006a290300370300200041386a200241d0006a41186a290300370300200241b0026a24000be01f03017f027e397f23004180066b22032400200241d8006a2903002104200241d0006a2903002105200228020021062003410c6a200241046a41cc001094041a200341d8006a2003410c6a41046a41c8001094041a20012802002107200341c0026a41186a220820034190016a290300370300200341c0026a41106a220920034188016a290300370300200341c0026a41086a220a20034180016a290300370300200320032903783703c00202400240024041c80010262202450d002002420037030020022006360220200241186a4200370300200241106a4200370300200241086a42003703002002200341f8006a220b2902003702242002412c6a200b41086a290200370200200241346a200b41106a2902003702002002413c6a200b41186a29020037020020052004107c2104200341e8016a41186a2008290300370300200341e8016a41106a2009290300370300200341e8016a41086a200a290300370300200320032903c0023703e8010240024002400240200741046a28020020072802082208470d00200841016a22092008490d032008410174220a20092009200a491b220aad42d0007e2205422088a70d032005a7220c4100480d032008450d012007280200200841d0006c200c10272209450d020c050b200728020021090c050b200c102622090d030b200c4108102a000b101e000b41c8004108102a000b20072009360200200741046a200a360200200741086a28020021080b2009200841d0006c6a22084200370310200842003703082008200437030020082002360220200820032903e80137022c200841186a4200370300200841246a428180808010370200200841c4006a200341e8016a41186a22022903003702002008413c6a200341e8016a41106a2209290300370200200841346a200341e8016a41086a2208290300370200200741086a2207200728020041016a3602002001280208210d2002200b41186a2900003703002009200b41106a2900003703002008200b41086a2900003703002003200b2900003703e8010240024002400240200d280200220a41f098c400460d00200d280204210e0c010b4194031026220a450d014100210e200a41003b0106200a4100360200200a41086a200341c0026a418c031094041a200d4100360204200d200a3602000b0c010b4194034104102a000b41002102024003400240024002400240024002400240024020020e020001010b200a41086a210b200a41066a2109200a2f010622014105742108417f21020240024002400240024003402008450d01200241016a2102417f4101200341e8016a200b412010960422074100481b410020071b2207450d04200841606a2108200b41206a210b20074101460d000b200e0d010c020b20012102200e450d010b200e417f6a210e200a20024102746a4194036a280200210a410021020c0a0b200341a0016a41186a2207200341e8016a41186a2208290300370300200341a0016a41106a220f200341e8016a41106a220b290300370300200341a0016a41086a2201200341e8016a41086a2210290300370300200320032903e8013703a001200d200d28020841016a36020820082007290300370300200b200f29030037030020102001290300370300200320032903a0013703e80120092f0100220f410b4f0d01200a41086a2207200241016a22014105746a200720024105746a2207200f20026b4105741095041a200741186a2008290300370000200741106a200b290300370000200741086a2010290300370000200720032903e801370000200a41e8026a220820014102746a200820024102746a220b200a41066a22082f010020026b4102741095041a200b2006360200200820082f010041016a3b01000c0a0b200a20024102746a41e8026a20063602000c090b41940310262211450d04201141003b010620114100360200201141086a200341c0026a418c03109404210b2003200a41e0016a2900003700ad022003200a2900db013703a8022003200a41ca016a2d00003a00be022003200a2f00c8013b01bc02200a41cb016a2800002112200a41cf016a2800002113200a41d3016a2800002114200a41d7016a2800002115200a280280032116200b200a41e8016a200a41066a22102f010041796a2208410574109404210b201141e8026a200a4184036a20084102741094042107201041063b0100201120083b0106200320032d00be023a00a602200320032f01bc023b01a402200320032903a80237039002200320032900ad023700950202400240200241064b0d00200a41086a2208200241016a220b4105746a200820024105746a220820092f010020026b4105741095041a200841186a200341e8016a41186a290300370000200841106a200341e8016a41106a290300370000200841086a200341e8016a41086a290300370000200820032903e801370000200a41e8026a2208200b4102746a200820024102746a220820092f010020026b4102741095041a0c010b200b2002417a6a220f4105746a200b200241796a22104105746a2202200841ffff037120106b4105741095041a200241186a200341e8016a41186a290300370000200241106a200341e8016a41106a290300370000200241086a200341e8016a41086a290300370000200220032903e8013700002007200f4102746a200720104102746a2208201141066a22092f010020106b4102741095041a0b2008200636020041012110200920092f010041016a3b0100410221172003418c026a41026a221820032d00a6023a0000200320032f01a4023b018c0220032003290390023703d80120032003290095023700dd01200341d4016a41026a221920182d00003a0000200320032900dd013700c501200320032903d8013703c001200320032f018c023b01d401200a280200221a450d01200a2f0104211b41ffff03211c410a211d41c403211e4100211f4108212041bc03212141ca01212241db01212341e001212441cb01212541cf01212641d301212741d7012128418003212941e801212a4106212b4179212c4105212d418403212e41e802212f41b00321304194032131417a21324118213341980321344104210f416c213541fc0221360c060b201820192d00003a0000200320032f01d4013b018c02200320032903c0013703e801200320032900c5013700ed01201b201c712101201a2f01062202201d4d0d01201e10262207450d022007201f3b01062007201f360200200720206a200341c0026a202110940421082003201a20226a2d00003a00be022003201a2f00c8013b01bc022003201a20236a2900003703a8022003201a20246a2900003700ad02201a20256a2800002137201a20266a280000213a201a20276a2800002139201a20286a2800002138201a20296a280200213b2008201a202a6a201a202b6a220c2f0100220b202c6a2202202d74109404213c2007202f6a201a202e6a2002201774109404213d200720316a201a20306a200b20326a2209201774109404213e200c202b3b0100200720023b010602402009450d0041002102203e210803402008280200220b20023b0104200b20073602002008200f6a21082009200220106a2202470d000b0b200320032d00be023a00a602200320032f01bc023b01a402200320032903a80237039002200320032900ad0237009502200341d8016a20176a220920032d00a6023a0000200320032f01a4023b01d80120032003290390023703c00220032003290095023700c50202400240201b201c712208202b4b0d00201a20206a2202200120106a221b202d746a20022001202d746a2202200c2f010020016b202d741095041a200220336a20032900ed013700002002201536000f2002201436000b2002201336000720022012360003200220176a20182d00003a0000200220032f018c023b0000200220032903e801370013201a202f6a220b201b20177422136a200b200120177422026a220b200c2f0100221420016b2017741095041a200b2016360200200c201420106a220b3b0100201a20316a220c20026a20206a200c20136a220c200b201c71220b201b6b2017741095041a200c20113602002008200b4f0d01201a20026a20346a2102034020022802002208200120106a22013b01042008201a3602002002200f6a2102200b2001470d000c020b0b203c200120326a220b202d746a203c2001202c6a2202202d746a22082007202b6a221b2f010020026b202d741095041a200820336a20032900ed013700002008201536000f2008201436000b2008201336000720082012360003200820176a20182d00003a0000200820032f018c023b0000200820032903e801370013203d200b20177422086a203d20022017746a220c201b2f0100221320026b2017741095041a200c2016360200201b201320106a220c3b0100203e2001201774221b6a20356a203e20086a2208200c201c712201200b6b2017741095041a20082011360200200b20014b0d002007201b6a20366a210803402008280200220b200220106a22023b0104200b20073602002008200f6a210820012002470d000b0b201920092d00003a0000200320032f01d8013b01d401200320032903c0023703c001200320032900c5023700c5010240201a2802002202450d00201a2f0104211b203721122038211520392114203a21132002211a203b211620072111410121020c070b203721122038211520392114203a211320072111203b21160b41c40310262202450d03200241003b010620024100360200200241086a200341c0026a41bc0310940421102002200d280200220836029403200d2002360200200d200d28020441016a360204200841003b010420082002360200201020022f0106220b4105746a220820032903c001370013200820032f01d4013b00002008201536000f2008201436000b2008201336000720082012360003200841186a20032900c501370000200841026a200341d4016a41026a2d00003a00002002200b4102746a41e8026a201636020020024194036a200b41016a22084102746a2011360200200220083b0106201120083b0104201120023602000c060b201a41086a2208200141016a220b4105746a200820014105746a2208200220016b4105741095041a200841186a20032900ed013700002008201536000f2008201436000b2008201336000720082012360003200841026a2003418c026a41026a2d00003a0000200820032f018c023b0000200820032903e801370013201a41e8026a2202200b41027422086a2002200141027422106a2202201a41066a22072f0100220f20016b4102741095041a200220163602002007200f41016a22023b0100201a4194036a220720106a41086a200720086a2208200241ffff03712210200b6b4102741095041a20082011360200201b41ffff037120104f0d05201a200b417f6a22024102746a4198036a210803402008280200220b200241016a22023b0104200b201a360200200841046a210820102002470d000c060b0b41c4034104102a000b4194034104102a000b41c4034104102a000b410121020c000b0b2000200341d8006a41c8001094041a20034180066a24000b0900200042003702000bc70703037f047e047f230022022103200241a0026b416071220224002001411c6a22042902002105200420022903d801370200200141146a22042902002106200420022903d0013702002001410c6a22042902002107200420022903c801370200200241003a00c00120012902042108200120022903c00137020420022005370338200220063703302002200737032820022008370320200141246a2d00002109200241c0016a41176a22042002290038370000200241c0016a41106a220a2002290031370300200241c0016a41086a220b2002290029370300200220022900213703c001024002400240024002402008a741ff01714101470d00200241176a2004290000370000200241106a200a290300370300200241086a200b290300370300200220022903c001370300411210262204450d01200441106a41002f00acc7403b0000200441086a41002900a4c7403700002004410029009cc74037000020044112413210272204450d0220042002290300370012200420093a0031200441296a200241176a290000370000200441226a200241106a2903003700002004411a6a200241086a290300370000200241c0016a41186a220a4200370300200241c0016a41106a220b4200370300200241c0016a41086a220c4200370300200242003703c00120044132200241c0016a100220024190016a41186a200a29030037030020024190016a41106a200b29030037030020024190016a41086a200c290300370300200220022903c0013703900120024190016a412041a886c500410041001001417f460d03200242203702b401200220024190016a3602b001200241c0016a200241b0016a10880120022d00cc014102460d0420024180016a41086a220a200241c0016a41086a280200360200200220022903c00137038001200241206a200241cd016a41c3001094041a20024190016a41086a220b200a280200360200200220022903800137039001200241c0016a200241206a41c1001094041a200141246a20024180026a2d00003a00002001411c6a200241f8016a290000370000200141146a200241f0016a2900003700002001410c6a200241c0016a41286a290000370000200120022900e00137000420002002290300370000200041086a200241086a290300370000200041106a200241106a290300370000200041176a200241176a290000370000200020093a001f200041286a200b280200360200200020022903900137022020041023200324000f0b20004100360220200324000f0b41124101102a000b41324101102a000b41faccc40041d7001021000b41d4aac10041331021000b9c0d04057f017e197f027e230041f0026b2204240002400240410d10262205450d00200541056a41002900ee9c41370000200541002900e99c413700002005410d412d10272205450d012005200129000037000d200541256a200141186a2900003700002005411d6a200141106a290000370000200541156a200141086a290000370000200441a0026a41186a22064200370300200441a0026a41106a22074200370300200441a0026a41086a22084200370300200442003703a0022005412d200441a0026a1002200441e0016a41186a2006290300370300200441e0016a41106a2007290300370300200441e0016a41086a2008290300370300200420042903a0023703e001024002400240024002400240200441e0016a412041a886c500410041001001417f460d00200441003a00a002200441e0016a4120200441a0026a41014100100141016a41014d0d0520042d00a002220641034f0d052005102320064101460d0320064102470d01200441a0026a2001106e20042d00a0024101470d02200441f8016a200441b9026a290000370300200441e0016a41106a200441b1026a290000370300200441e0016a41086a200441a9026a290000370300200420042900a1023703e001200441386a200441e0016a20022003107e20043502384201852102200441386a41106a2903002103200441386a41086a29030021090c040b200510230b200441f8006a2001106e20042d00784101470d00200441a0016a41186a20044191016a2205290000370300200441a0016a41106a20044189016a2206290000370300200441a0016a41086a20044181016a2207290000370300200420042900793703a001200441a0026a200441a0016a106b200441c0016a41186a22082005290000370300200441c0016a41106a220a2006290000370300200441c0016a41086a220b2007290000370300200420042900793703c00120042802c002220c450d00200441e0016a41186a220d2008290300370300200441e0016a41106a220e200a290300370300200441e0016a41086a220f200b290300370300200441e0016a41286a2205200441a0026a41086a2206290300370300200441e0016a41306a2207200441a0026a41106a2208290300370300200441e0016a41386a2210200441a0026a41186a2211290300370300200441086a41086a2212200441cc026a2213290200370300200441086a41106a2214200441d4026a2215290200370300200441086a41186a2216200441dc026a2217290200370300200441086a41206a2218200441e4026a2219290200370300200441086a41286a221a200441ec026a221b280200360200200420042903c0013703e001200420042903a00237038002200420042902c402370308200441386a41386a221c2010290300370300200441386a41306a221d2007290300370300200441386a41286a221e2005290300370300200441386a41206a221f200429038002370300200441386a41186a2220200d290300370300200441386a41106a2221200e290300370300200441386a41086a2222200f290300370300200420042903e0013703382010201c2903003703002007201d2903003703002005201e290300370300200441e0016a41206a221c201f290300370300200d2020290300370300200e2021290300370300200f2022290300370300200420042903383703e001200441f8006a41186a2020290300370300200441f8006a41106a2021290300370300200441f8006a41086a202229030037030020042004290338370378201120102903003703002008200729030037030020062005290300370300200441c4026a2205200429030837020020132012290300370200201520142903003702002017201629030037020020192018290300370200201b201a2802003602002004200c3602c0022004201c2903003703a00220082008290300220920027c22233703002011201129030020037c2023200954ad7c37030020062903002109200420042903a002222320027c22243703a0022006200920037c2024202354ad7c370300200441c0016a200120022003107e20043502c0012102200a2903002103200b2903002109200441f8006a200441a0026a107f02402005280200450d00200441a0026a41206a28020010230b200242018521020c020b420021020c010b200441a0026a200120022003107e20043502a0024201852102200441b0026a2903002103200441a8026a29030021090b2000200937030820002002370300200041106a2003370300200441f0026a24000f0b41d4aac10041331021000b410d4101102a000b412d4101102a000bcc0202047f047e230041206b22012400200141106a41086a220242003703002001420037031041ecb5c1004116200141106a1000200141086a22032002290300370300200120012903103703000240024002402001411041a886c500410041001001417f460d00200142003703182001420037031020014110200141106a4110410010012204417f460d022004410f4d0d02200141186a2903002105200129031021060c010b42002106420021050b2000280200220041086a290300210720002903002108200242003703002001420037031041ecb5c1004116200141106a100020032002290300370300200120012903103703002001427f200520077c200620087c22072006542202ad7c22062002200620055420062005511b22021b3703182001427f200720021b37031020014110200141106a41101004200141206a24000f0b41d4aac10041331021000baa0204017f017e017f017e230041c0006b2202240042002103200241306a41086a220442003703002002420037033041ecb5c1004116200241306a1000200241206a41086a200429030037030020022002290330370320024002400240200241206a411041a886c500410041001001417f460d002002420037033820024200370330200241206a4110200241306a4110410010012204417f460d022004410f4d0d02200241106a2002290330200241306a41086a290300427f42001097042002290310220342012003420156200241106a41086a29030022034200522003501b22041b22052003420020041b22038450450d0141a0c9c300104f000b420121050b2002200020012005200310970420022903002103200241c0006a240020030f0b41d4aac10041331021000b920303017f017e027f02402001450d00034020002802940321002001417f6a22010d000b0b02402002450d00410021034100210103402002417f6a21020240200120002f01064f0d00200141016a210120020d010c020b0240024020002802002201450d0020003301044220862003ad842104410121050c010b2003ad210441002105410021010b200010232004a72103024002402004422088a7220620012f01064f0d00200121000c010b03400240024020012802002200450d00200541016a210520013301044220862003ad8421040c010b2003ad2104410021000b200110232004a72103200021012004422088a7220620002f01064f0d000b0b200020064102746a4198036a2802002100024020054101460d00410120056b210103402000280294032100200141016a22010d000b0b4100210120020d000b0b0240200041f098c400460d0020002802002101200010232001450d0020012802002100200110232000450d00024020002802002201450d000340200010232001210020012802002203210120030d000b0b200010230b0b8b0404027f017e037f027e230041d0006b2204240020042001103402400240024002400240024002402004290300200441086a290300844200510d00411410262205450d05200541106a41002800f9b641360000200541086a41002900f1b641370000200541002900e9b64137000020054114413410272205450d06200520012900003700142005412c6a200141186a290000370000200541246a200141106a2900003700002005411c6a200141086a29000037000042002106200441306a41186a22074200370300200441306a41106a22084200370300200441306a41086a220942003703002004420037033020054134200441306a1002200441106a41186a2007290300370300200441106a41106a2008290300370300200441106a41086a200929030037030020042004290330370310200441106a412041a886c500410041001001417f460d012004420037033820044200370330200441106a4120200441306a4110410010012207417f460d042007410f4d0d04200441386a290300210a200429033021060c020b20004193b5c100360204200041086a4122360200410121010c020b4200210a0b200510232001200620027c220b200a20037c200b200654ad7c10df01200041106a2003370300200041086a2002370300410021010b20002001360200200441d0006a24000f0b41d4aac10041331021000b41144101102a000b41344101102a000bd90201047f230041d0006b22022400200242f3e885db96cddbb320370308200241086a2001412c6a2001290300200141086a290300427f410f106202400240410e10262203450d00200341066a41002900c6c740370000200341002900c0c7403700002003410e412e10272203450d012003200029000037000e200341266a200041186a2900003700002003411e6a200041106a290000370000200341166a200041086a290000370000200241306a41186a22004200370300200241306a41106a22044200370300200241306a41086a22054200370300200242003703302003412e200241306a1002200241106a41186a2000290300370300200241106a41106a2004290300370300200241106a41086a200529030037030020022002290330370310200241203602342002200241106a3602302001200241306a106720031023200241d0006a24000f0b410e4101102a000b412e4101102a000b02000bec0301087f23004180016b22032400200341c0006a20011082010240024020032903404201520d002002417f732104200341c0006a41086a21020340200341086a41306a2205200241306a290300370300200341086a41286a2206200241286a290300370300200341086a41206a2207200241206a290300370300200341086a41186a2208200241186a290300370300200341086a41106a2209200241106a290300370300200341086a41086a220a200241086a29030037030020032002290300370308200341c0006a41306a2005290300370300200341c0006a41286a2006290300370300200341c0006a41206a2007290300370300200341c0006a41186a2008290300370300200341c0006a41106a20092903003703002002200a29030037030020032003290308370340200441016a2204450d02200341c0006a200110820120032903404201510d000b0b2000420037030020034180016a24000f0b2000200329034037030820004201370300200041386a200341c0006a41306a290300370300200041306a200341c0006a41286a290300370300200041286a200341c0006a41206a290300370300200041206a200341c0006a41186a290300370300200041186a200341c0006a41106a290300370300200041106a200341c8006a29030037030020034180016a24000bbf0703037f047e047f23002202210320024180026b416071220224002001411c6a22042902002105200420022903b801370200200141146a22042902002106200420022903b0013702002001410c6a22042902002107200420022903a801370200200241003a00a00120012902042108200120022903a00137020420022005370338200220063703302002200737032820022008370320200141246a2d00002109200241a0016a41176a22042002290038370000200241a0016a41106a220a2002290031370300200241a0016a41086a220b2002290029370300200220022900213703a001024002400240024002402008a741ff01714101470d00200241176a2004290000370000200241106a200a290300370300200241086a200b290300370300200220022903a001370300411210262204450d01200441106a41002f00bec7403b0000200441086a41002900b6c740370000200441002900aec74037000020044112413210272204450d0220042002290300370012200420093a0031200441296a200241176a290000370000200441226a200241106a2903003700002004411a6a200241086a290300370000200241a0016a41186a220a4200370300200241a0016a41106a220b4200370300200241a0016a41086a220c4200370300200242003703a00120044132200241a0016a1002200241f0006a41186a200a290300370300200241f0006a41106a200b290300370300200241f0006a41086a200c290300370300200220022903a001370370200241f0006a412041a886c500410041001001417f460d0320024220370294012002200241f0006a36029001200241a0016a20024190016a106420022d00b8014102460d04200241a0016a41086a290300210820022802b001210a20022903a0012105200241206a200241b9016a41c7001094041a200241a0016a200241206a41c1001094041a200241206a200241a0016a41c1001094041a200141246a200241e0006a2d00003a00002001411c6a200241206a41386a290000370000200141146a200241206a41306a2900003700002001410c6a200241206a41286a2900003700002001200229004037000420002002290300370008200041106a200241086a290300370000200041186a200241106a2903003700002000411f6a200241176a290000370000200041306a2008370300200041286a2005370300200041386a200a360200200020093a00272000420137030020041023200324000f0b20004200370300200324000f0b41124101102a000b41324101102a000b41faccc40041d7001021000b41d4aac10041331021000be7d00106037f037e107f017e0f7f057e230041e0046b22032400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d00002204417f6a2205410c4b0d000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020050e0d0008050602090a070e040c0103000b200141306a2903002106200141286a29030021072001411d6a29000021082001411c6a2d000021092001411b6a2d0000210a200141196a2f0000210b200141186a2d0000210c200141176a2d0000210d200141156a2f0000210e200141146a2d0000210f200141136a2d00002110200141116a2f00002111200141106a2d000021122001410c6a2802002113200141086a2802002114200141076a2d00002115200141056a2f00002116200141046a2d0000211720012d000121182002411a6a2901002119200241196a2d0000211a200241186a2d0000211b200241166a2f0100211c200241156a2d0000211d200241146a2d0000211e200241126a2f0100211f200241116a2d00002120200241106a2d000021212002410e6a2f010021222002410d6a2d00002123200241046a2d00002124200241026a2f01002125412a210441db94c300210520022d0000450d144101212641002127410021280c150b4101212620022d000120022d0000720d0b200141046a2802002102200341e0036a41086a22054200370300200342003703e00341a8f5c0004119200341e0036a100020034188016a41086a2005290300370300200320032903e00337038801200320023602e00320034188016a4110200341e0036a410410040c720b200141106a2903002108200141086a2903002106200141186a28020021142002411a6a2901002119200241196a2d0000211a200241186a2d0000211b200241166a2f0100211c200241156a2d0000211d200241146a2d0000211e200241126a2f0100211f200241116a2d00002120200241106a2d000021212002410e6a2f010021222002410d6a2d00002123200241046a2d00002124200241026a2f0100212541db94c3002105412a210420022d0000450d0c4101212641002127410021280c0d0b200141086a280200211b200141046a280200211c20022d000120022d000072450d0d41002126201b450d09201c102320012d000021040c090b4101212620022d000120022d0000720d08200141046a2802002102200341e0036a41086a22054200370300200342003703e00341f399c1004116200341e0036a100020034188016a41086a2005290300370300200320032903e00337038801200320023602e00320034188016a4110200341e0036a410410040c6f0b200141106a2903002108200141086a29030021062002411a6a2901002119200241196a2d0000211a200241186a2d0000211b200241166a2f0100211c200241156a2d0000211d200241146a2d0000211e200241126a2f0100211f200241116a2d00002120200241106a2d000021212002410e6a2f010021222002410d6a2d00002123200241046a2d00002124200241026a2f01002125412a210441db94c300210520022d0000450d0c4101212641002127410021280c0d0b20022d00000d0420022d00014101470d04200241196a2d00002105200241186a2d00002104200241166a2f01002126200241156a2d00002127200241146a2d00002128200241126a2f0100211a200241116a2d0000211b200241106a2d0000211c2002410e6a2f0100211d2002410d6a2d0000211e2002410c6a2d0000211f2002410a6a2f01002120200241096a2d00002121200241086a2d00002122200241066a2f01002123200241056a2d00002124200241046a2d00002125200241026a2f0100211420032002411a6a2901003703e801200320053a00e701200320043a00e601200320263b01e401200320273a00e301200320283a00e2012003201a3b01e0012003201b3a00df012003201c3a00de012003201d3b01dc012003201e3a00db01200320253a00d201200320143b01d001200320212020410874201f41187472723600d701200320242023410874722022411874723600d301200341e0036a200341d0016a106b2003280280042228450d0d200341c0046a41086a220220034194046a290200370300200341c0046a41106a22052003419c046a290200370300200341c0046a41186a2204200341a4046a29020037030020032003418c046a2902003703c004200341e0036a41186a290300212920034188046a280200211b200341ec036a350200211920032903f003212a200328028404211c20033502e003210620032902e4032108200341a0026a41186a2004290300370300200341a0026a41106a2005290300370300200341a0026a41086a2002290300370300200320032903c0043703a002200341e0036a41086a22024200370300200342003703e00341e199c1004112200341e0036a100020034188016a41086a2002290300370300200320032903e0033703880141002126024020034188016a411041a886c500410041001001417f460d00200341003602e00320034188016a4110200341e0036a41044100100141016a41044d0d3c20032802e00321260b20194220862008422088842119200842208620068421080240201b41186c2202450d00202820026a2127200241686a2105202821020340200241086a2903002107200229030021062026200241106a2802002204490d264200201920077d2008200654ad7d2207200820067d2206200856200720195620072019511b22041b21194200200620041b2108200541686a2105200241186a22022027470d000b0b4108211a41002104201c450d28202810234100211b0c2f0b20022d00000d0320022d00014101470d0320012d00012109200241196a2d00002105200241186a2d00002104200241166a2f01002126200241156a2d00002127200241146a2d00002128200241126a2f0100211a200241116a2d0000211b200241106a2d0000211c2002410e6a2f0100211d2002410d6a2d0000211e2002410c6a2d0000211f2002410a6a2f01002120200241096a2d00002121200241086a2d00002122200241066a2f01002123200241056a2d00002124200241046a2d00002125200241026a2f0100211420032002411a6a2901003703a001200320053a009f01200320043a009e01200320263b019c01200320273a009b01200320283a009a012003201a3b0198012003201b3a0097012003201c3a0096012003201d3b0194012003201e3a009301200320253a008a01200320143b01880120032021202041087472201f4118747236008f012003202420234108747220224118747236008b01200341e0036a20034188016a106b2003280280042205450d0c200341c0046a41086a220220034194046a290200370300200341c0046a41106a22042003419c046a290200370300200341c0046a41186a2226200341a4046a29020037030020032003418c046a2902003703c0042003280284042127200341d0016a41186a2026290300370300200341d0016a41106a2004290300370300200341d0016a41086a2002290300370300200320032903c0043703d001410d10262202450d3f200241056a41002900ee9c41370000200241002900e99c413700002002410d412d10272202450d40200220032903d00137000d200241256a200341d0016a41186a2903003700002002411d6a200341d0016a41106a290300370000200241156a200341d0016a41086a290300370000200341c0046a41186a22044200370300200341c0046a41106a22264200370300200341c0046a41086a22284200370300200342003703c0042002412d200341c0046a1002200341c0036a41186a2004290300370300200341c0036a41106a2026290300370300200341c0036a41086a2028290300370300200320032903c0043703c003200341203602e4032003200341c0036a3602e0032009200341e0036a1068200210232027450d6c200510230c6c0b20022d00000d0220022d00014101470d02200141106a2903002119200141086a2903002108200241196a2d00002105200241186a2d00002104200241166a2f01002126200241156a2d00002127200241146a2d00002128200241126a2f0100211a200241116a2d0000211b200241106a2d0000211c2002410e6a2f0100211d2002410d6a2d0000211e2002410c6a2d0000211f2002410a6a2f01002120200241096a2d00002121200241086a2d00002122200241066a2f01002123200241056a2d00002124200241046a2d00002125200241026a2f0100211420032002411a6a2901003703d803200320053a00d703200320043a00d603200320263b01d403200320273a00d303200320283a00d2032003201a3b01d0032003201b3a00cf032003201c3a00ce032003201d3b01cc032003201e3a00cb03200320253a00c203200320143b01c003200320212020410874201f41187472723600c703200320242023410874722022411874723600c303200341e0036a200341c0036a106e20032d00e0034101470d1c200341e0036a410c6a22272d00002102200341ed036a2900002106200341f5036a280000210520032f00e103210420032d00e303212620032902e40321072003200341f9036a290000370358200320053602542003200637024c200320023a004b20032007370043200320263a0042200320043b0140200341e0036a200341c0006a106b2003280280042205450d0b200341c0046a41086a2204200341e0036a41346a290200370300200341c0046a41106a2226200341e0036a413c6a290200370300200341c0046a41186a2228200341e0036a41c4006a29020037030020032003418c046a2902003703c004200341ac046a280200211a200341e0036a41286a280200211b20273502002106200341e0036a41186a290300212920032802e003212720032902e403210720032903f003212a200328028404210220034188016a41186a221c202829030037030020034188016a41106a2228202629030037030020034188016a41086a22262004290300370300200320032903c00437038801200341d0016a41186a22042029370300200341d0016a410c6a20063e0200200341d0016a41286a201b360200200341f4016a221b2002360200200341d0016a41346a2026290300370200200341d0016a413c6a2028290300370200200341d0016a41c4006a201c2903003702002003202a3703e001200320073702d401200320053602f001200320273602d0012003201a36029c0220032003290388013702fc01200341186a200341c0036a10840102402003290318220620032903d001222b7d222c200656200341186a41086a2903002207200341d0016a41086a290300222d7d2006202b54ad7d220620075620062007511b0d00200341d0016a41106a2008202c202c200856200620195620062019511b22021b2208202a7c220737030020042019200620021b221920297c2007200854ad7c37030020032008202b7c22063703d00120032019202d7c2006200854ad7c3703d801200341c0006a200341d0016a107f201b28020021020b2002450d6b200341f0016a28020010230c6b0b2001410c6a280200211c200141086a280200211b200141046a28020021282002411a6a2901002119200241196a2d0000211d200241186a2d0000211e200241166a2f0100211f200241156a2d00002120200241146a2d00002121200241126a2f01002122200241116a2d00002123200241106a2d000021242002410e6a2f010021252002410d6a2d00002114200241046a2d00002109200241026a2f0100210a41db94c3002105412a210420022d0000450d0d41012126410021274100211a0c0e0b20022d00000d0020022d00014101470d00200241196a2d00002105200241186a2d00002104200241166a2f01002126200241156a2d00002127200241146a2d00002128200241126a2f0100211a200241116a2d0000211b200241106a2d0000211c2002410e6a2f0100211d2002410d6a2d0000211e2002410c6a2d0000211f2002410a6a2f01002120200241096a2d00002121200241086a2d00002122200241066a2f01002123200241056a2d00002124200241046a2d00002125200241026a2f0100211420032002411a6a290100370358200320053a0057200320043a0056200320263b0154200320273a0053200320283a00522003201a3b01502003201b3a004f2003201c3a004e2003201d3b014c2003201e3a004b200320253a0042200320143b014020032021202041087472201f4118747236004720032024202341087472202241187472360043200341e0036a200341c0006a106b2003280280042202450d09200341c0046a41086a2204200341e0036a41346a290200370300200341c0046a41106a2226200341e0036a413c6a290200370300200341c0046a41186a2227200341e0036a41c4006a2902003703002003200341e0036a412c6a2902003703c004200341ac046a2802002128200341e0036a41286a280200211a200341e0036a410c6a3502002119200341e0036a41186a290300210820032802e003211b20032902e403210620032903f0032107200328028404210520034188016a41186a221c202729030037030020034188016a41106a2227202629030037030020034188016a41086a22262004290300370300200320032903c00437038801200341d0016a41186a2008370300200341d0016a410c6a20193e0200200341d0016a41286a201a360200200341f4016a2005360200200341d0016a41346a2026290300370200200341d0016a413c6a2027290300370200200341d0016a41c4006a201c290300370200200320073703e001200320063702d401200320023602f0012003201b3602d0012003202836029c0220032003290388013702fc01200341d0016a412c6a220410850120041086012005450d69200210230c690b41db94c3002105412a21020c82010b4101212620022d000120022d000072450d0c0b41b394c300210541282102200441ff01712204410d4b0d11410120047441be3f710d840120044106460d102004410d470d112026450d8401200141086a280200450d8401200141046a28020010230c84010b2001411d6a29000021082001411c6a2d000021092001411b6a2d0000210a200141196a2f0000210b200141186a2d0000210c200141176a2d0000210d200141156a2f0000210e200141146a2d0000210f200141136a2d00002110200141116a2f00002111200141106a2d000021122001410c6a2802002117200141086a280200211a200141076a2d00002115200141056a2f00002116200141046a2d000021132002411a6a2901002119200241196a2d0000211b200241186a2d0000211c200241166a2f0100211d200241156a2d0000211e200241146a2d0000211f200241126a2f01002120200241116a2d00002121200241106a2d000021222002410e6a2f010021232002410d6a2d00002124200241046a2d00002125200241026a2f0100211441db94c3002105412a210420022d0000450d0b4101212641002127410021280c0c0b41012126410021274100212820022d00014101470d002002410c6a2d000021282002410a6a2f01002127200241096a2d00002104200241066a2f0100410874200241056a2d000072200241086a2d0000411874722105410021260b202741ffff0371410874200441ff017172202841187472210220260d7d200320193703d8022003201a3a00d7022003201b3a00d6022003201c3b01d4022003201d3a00d3022003201e3a00d2022003201f3b01d002200320203a00cf02200320213a00ce02200320223b01cc02200320233a00cb02200320023600c702200320053600c302200320243a00c202200320253b01c002200341e0036a200341c0026a106b2003280280042202450d03200341c0046a41086a2204200341e0036a41346a290200370300200341c0046a41106a2226200341e0036a413c6a290200370300200341c0046a41186a2227200341e0036a41c4006a2902003703002003200341e0036a412c6a2902003703c004200341ac046a2802002128200341e0036a41286a280200211a200341e0036a410c6a3502002119200341e0036a41186a290300210720032802e003211b20032902e403212920032903f003212a200328028404210520034188016a41186a221c202729030037030020034188016a41106a2227202629030037030020034188016a41086a22262004290300370300200320032903c00437038801200341d0016a41186a2007370300200341d0016a410c6a20193e0200200341d0016a41286a201a360200200341f4016a2005360200200341d0016a41346a2026290300370200200341d0016a413c6a2027290300370200200341d0016a41c4006a201c2903003702002003202a3703e001200320293702d401200320023602f0012003201b3602d0012003202836029c0220032003290388013702fc012014410a4d0d0f02402005450d00200210230b41bf9fc1002105411b21020c7d0b2001410c6a2802002102200341e0036a41086a22054200370300200342003703e0034181f5c0004115200341e0036a100020034188016a41086a2005290300370300200320032903e00337038801200341003602e803200342013703e003200320023602d001200341d0016a200341e0036a10412002450d1020024105742127200341e0036a41086a280200210520032802e003212820032802e4032126201c210203400240024002400240202620056b41204f0d00200541206a22042005490d7a2026410174221a20042004201a491b221a4100480d7a2026450d0120282026201a102722280d020c320b200541206a21040c020b201a10262228450d300b201a21260b202820056a22052002290000370000200541186a200241186a290000370000200541106a200241106a290000370000200541086a200241086a29000037000020042105200241206a2102202741606a22270d000b200341e8036a2004360200200320263602e403200320283602e0030c110b41012126410021274100212820022d00014101470d002002410c6a2d000021272002410a6a2f01002128200241096a2d00002104200241066a2f0100410874200241056a2d000072200241086a2d0000411874722105410021260b202841ffff0371410874202741187472200441ff017172210220260d7a200320193703582003201a3a00572003201b3a00562003201c3b01542003201d3a00532003201e3a00522003201f3b0150200320203a004f200320213a004e200320223b014c200320233a004b2003200236004720032005360043200320243a0042200320253b0140200341e0036a200341c0006a106b2003280280042204450d00200341c0046a41086a2226200341e0036a41346a290200370300200341c0046a41106a2227200341e0036a413c6a290200370300200341c0046a41186a2228200341e0036a41c4006a29020037030020032003418c046a2902003703c004200341ac046a280200211a200341e0036a41286a2802002105200341e0036a410c6a3502002129200341e0036a41186a290300211920032802e003211b20032902e403212a20032903f0032107200328028404210220034188016a41186a221c202829030037030020034188016a41106a2228202729030037030020034188016a41086a22272026290300370300200320032903c00437038801200341d0016a41186a2019370300200341d0016a410c6a20293e0200200341d0016a41286a2005360200200341f4016a2002360200200341d0016a41346a2027290300370200200341d0016a413c6a2028290300370200200341d0016a41c4006a201c290300370200200320073703e0012003202a3702d401200320043602f0012003201b3602d0012003201a36029c0220032003290388013702fc012005411f4d0d0d02402002450d00200410230b419c9fc1002105412321020c7a0b41819fc1002105411021020c790b41012126410021274100212820022d00014101470d002002410c6a2d000021272002410a6a2f01002128200241096a2d00002104200241066a2f0100410874200241056a2d000072200241086a2d0000411874722105410021260b202841ffff0371410874202741187472200441ff017172210220260d77200320193703a0012003201a3a009f012003201b3a009e012003201c3b019c012003201d3a009b012003201e3a009a012003201f3b019801200320203a009701200320213a009601200320223b019401200320233a0093012003200236008f012003200536008b01200320243a008a01200320253b018801410e10262202450d29200241066a4100290094c7403700002002410029008ec7403700002002410e412e10272202450d2a200220032903880137000e200241266a20034188016a41186a2903003700002002411e6a20034188016a41106a290300370000200241166a20034188016a41086a290300370000200341c0046a41186a22054200370300200341c0046a41106a22044200370300200341c0046a41086a22264200370300200342003703c0042002412e200341c0046a1002200341c0036a41186a2005290300370300200341c0036a41106a2004290300370300200341c0036a41086a2026290300370300200320032903c0043703c003200341c0036a412041a886c5004100410010012105200210232005417f460d0641ed9ec1002105411421020c770b41012126410021274100211a20022d00014101470d002002410c6a2d0000211a2002410a6a2f01002127200241096a2d00002104200241066a2f0100410874200241056a2d000072200241086a2d0000411874722105410021260b202741ffff0371410874200441ff017172201a41187472210220260d7320032019370398032003201d3a0097032003201e3a0096032003201f3b019403200320203a009303200320213a009203200320223b019003200320233a008f03200320243a008e03200320253b018c03200320143a008b0320032002360087032003200536008303200320093a0082032003200a3b018003200341e0036a20034180036a106b200328028004221a450d03200341c0046a41086a2202200341e0036a41346a290200370300200341c0046a41106a2205200341e0036a413c6a290200370300200341c0046a41186a2204200341e0036a41c4006a2902003703002003200341e0036a412c6a2902003703c004200341ac046a2802002126200341e0036a41286a2802002127200341e0036a410c6a3502002119200341e0036a41186a290300210820032802e003211d20032902e403210620032903f0032107200328028404211e20034188016a41186a221f200429030037030020034188016a41106a2204200529030037030020034188016a41086a22052002290300370300200320032903c00437038801200341d0016a41186a2008370300200341d0016a410c6a20193e0200200341d0016a41286a2027360200200341d0016a41246a201e360200200341d0016a41346a2005290300370200200341d0016a413c6a2004290300370200200341d0016a41c4006a201f290300370200200320073703e001200320063702d4012003201a3602f0012003201d3602d0012003202636029c0220032003290388013702fc01201c450d0b201c41246c2202450d0d200341a0026a41026a2205202841036a2d00003a0000200341c0046a41086a2227202841146a290000370300200341c0046a410d6a221d202841196a290000370000200320282f00013b01a0022003202829000c3703c004202841246a210420282d0000221f4102460d0e2028280008212020282800042126200341e0026a41026a20052d00003a000020034188016a41086a202729030037030020034188016a410d6a201d290000370000200320032f01a0023b01e002200320032903c00437038801201f4101470d15200341a0036a202641067610870120032802a003212720032802a8032026413f7122054d0d1a200341c0026a41026a202720054105746a220541026a2d00003a0000200341c8006a200541136a290000370300200341cd006a200541186a290000370000200320052f00003b01c0022003200529000b37034020052800072120200528000321264101210520032802a403450d680c670b41012126200341013a00d001200341e0036a41086a22024200370300200342003703e003418f99c1004113200341e0036a100020034188016a41086a2002290300370300200320032903e0033703880120034188016a4110200341d0016a41011004410021050c5b0b41012126410021274100212820022d00014101470d002002410c6a2d000021282002410a6a2f01002127200241096a2d00002104200241066a2f0100410874200241056a2d000072200241086a2d0000411874722105410021260b202741ffff0371410874200441ff017172202841187472210220260d72200320193703b8022003201b3a00b7022003201c3a00b6022003201d3b01b4022003201e3a00b3022003201f3a00b202200320203b01b002200320213a00af02200320223a00ae02200320233b01ac02200320243a00ab02200320023600a702200320053600a302200320253a00a202200320143b01a002200341e0036a200341a0026a106e41012126024020032d00e0034101470d00200341ec036a2d00002102200341ed036a2900002119200341f5036a280000210520032f00e103210420032d00e303212620032902e40321062003200341f9036a2900003703d802200320053602d402200320193702cc02200320023a00cb02200320063700c302200320263a00c202200320043b01c002201341ff01714101470d56200341e0036a201a41067610870120032802e003210520032802e803201a413f7122024d0d0d200520024105746a2202290018210820022d0017210920022d0016210a20022f0014210b20022d0013210c20022d0012210d20022f0010210e20022d000f210f20022d000e211020022f000c211120022d000b2112200228000721262002280003212720022d0002211520022f000021164101210420032802e403450d550c540b41919fc1002105410b21024101212720012d00002204410d4d0d740c750b4110210241819fc10021054100212741012126201b0d700c720b201741ff01714101470d50200341e0036a201441067610870120032802e003210520032802e8032014413f7122024d0d0c200520024105746a2202290018210820022d0017210920022d0016210a20022f0014210b20022d0013210c20022d0012210d20022f0010210e20022d000f210f20022d000e211020022f000c211120022d000b2112200228000721262002280003212720022d0002211520022f000021164101210420032802e403450d4f0c4e0b200141086a280200450d73200141046a28020010230c730b200141086a280200450d72200141046a28020010230c720b200341d0016a412c6a2205108601200320083703302003200637032820032014360238411210262202450d23200241106a41002f00bec7403b0000200241086a41002900b6c740370000200241002900aec74037000020024112413210272202450d24200220052900003700122002412a6a200541186a290000370000200241226a200541106a2900003700002002411a6a200541086a290000370000200341c0046a41186a22044200370300200341c0046a41106a22264200370300200341c0046a41086a22274200370300200342003703c00420024132200341c0046a1002200341c0036a41186a2004290300370300200341c0036a41106a2026290300370300200341c0036a41086a2027290300370300200320032903c0043703c003200341c0036a412041a886c500410041001001417f460d082003422037028c012003200341c0036a36028801200341e0036a20034188016a106420032d00f80322264102460d28200341a0026a41186a20034191046a290000370300200341a0026a41106a20034189046a290000370300200341a0026a41086a20034181046a290000370300200341e0026a41086a200341a2046a290100370300200341e0026a41106a200341aa046a290100370300200341e0026a41186a200341b2046a290100370300200320032900f9033703a00220032003419a046a2901003703e00220034199046a2d000021280c440b200720062007200654201920085420192008511b22051b22062019200820051b220884500d34200341d0016a41106a200720067d370300200341e8016a201920087d2007200654ad7d370300200341e0036a41086a22024200370300200342003703e0034182b6c100411b200341e0036a100020034188016a41086a2002290300370300200320032903e00337038801024020034188016a411041a886c500410041001001417f460d00200342003703e803200342003703e00320034188016a4110200341e0036a4110410010012202417f460d252002410f4d0d25200341e0016a2202290300220720032903e0035a200341e8016a22052903002219200341e8036a29030022295a20192029511b0d002005420037030020024200370300201920087c200720067c2206200754ad7c21080b200341e0036a41086a22024200370300200342003703e00341e199c1004112200341e0036a100020034188016a41086a2002290300370300200320032903e0033703880120034188016a411041a886c500410041001001417f460d0a200341003602e00320034188016a4110200341e0036a41044100100141016a41044d0d2120032802e00341a0056a21040c0b0b200341e8036a280200210420032802e403212620032802e00321280b20034188016a411020282004100402402026450d00202810230b410121270240201b450d00201c10230b410021260c620b41f9a0c10021054117210241012104201e450d660c650b41919fc1002105410b21020c680b202821040b41002126410121054100211f410021024100450d5b0c5c0b4100210420032802e4030d460c470b20044200370300200341c0046a41106a22264200370300200341c0046a41086a22274200370300200342003703c00441a69ac100411a200341c0046a100220034188016a41186a200429030037030020034188016a41106a202629030037030020034188016a41086a2027290300370300200320032903c0043703880120034188016a412041a886c500410041001001417f460d06200341d8036a4200370300200341c0036a41106a4200370300200341c0036a41086a4200370300200342003703c00320034188016a4120200341c0036a4120410010012204417f460d202004411f4d0d20200341e0036a41186a2204200341c0036a41186a290300370300200341e0036a41106a2226200341c0036a41106a290300370300200341e0036a41086a2227200341c0036a41086a290300370300200320032903c0033703e00320034180036a41186a2228200429030037030020034180036a41106a2204202629030037030020034180036a41086a22262027290300370300200320032903e00337038003200341a0036a41186a2028290300370300200341a0036a41106a2004290300370300200341a0036a41086a202629030037030020032003290380033703a003411210262204450d23200441106a41002f00bec7403b0000200441086a41002900b6c740370000200441002900aec74037000020044112413210272204450d24200420032903a0033700122004412a6a200341a0036a41186a290300370000200441226a200341a0036a41106a2903003700002004411a6a200341a0036a41086a290300370000200341c0046a41186a22264200370300200341c0046a41106a22274200370300200341c0046a41086a22284200370300200342003703c00420044132200341c0046a1002200341c0036a41186a2026290300370300200341c0036a41106a2027290300370300200341c0036a41086a2028290300370300200320032903c0043703c003200341c0036a412041a886c500410041001001417f460d25200342203702442003200341c0036a360240200341e0036a200341c0006a106420032d00f80322264102460d26200341e0036a41086a290300211920032802f003212720032903e003210820034188016a200341f9036a41c7001094041a200341c0006a20034188016a41c1001094041a200320263a00e003200341e0036a410172200341c0006a41c1001094041a200341a4016a20034182046a410020032d0081044101461b36020020032019370390012003200837038801200320053602a0012003202736029801200341c0046a41186a22264200370300200341c0046a41106a22274200370300200341c0046a41086a22284200370300200342003703c00420044132200341c0046a1002200341c0036a41186a2026290300370300200341c0036a41106a2027290300370300200341c0036a41086a2028290300370300200320032903c0043703c003200341003602482003420137034020034188016a41106a200341c0006a1041200320034188016a3602c004200341c0046a200341c0006a1066200328024421262003280248212720032802a001221b450d0d20262027470d0e202741016a22262027490d5d20274101742228202620262028491b22264100480d5d2027450d1020032802402027202610272228450d110c2d0b4100210420032802e4030d410c420b41181026221a450d20201a2006370300201a2004360210201a20073703082005450d08200241186a211d2028201b41186c6a41686a211f410121044101211b0340201d210202400340200241086a2903002107200229030021062026200241106a2802002205490d014200201920077d2008200654ad7d2207200820067d2206200856200720195620072019511b22051b21194200200620051b2108200241186a22022027470d000c0c0b0b0240201b2004470d00200441016a221b2004490d5d2004410174221d201b201b201d491b221bad42187e222b422088a70d5d202ba7221d4100480d5d02402004450d00201a200441186c201d1027221a0d010c220b201d1026221a450d210b200241186a211d201a200441186c6a221e2007370308201e2006370300201e2005360210200441016a2104201f2002470d000c0a0b0b41a00521040b0240200341f8016a2802002202200341f4016a280200470d00200241016a22052002490d5a20024101742226200520052026491b2226ad42187e2219422088a70d5a2019a722274100480d5a2002450d04200341f0016a280200200241186c202710272205450d050c270b200341f0016a28020021050c270b200341c0026a41026a200341e0026a41026a2d00003a0000200341c0006a41086a20034188016a41086a290300370300200341c0006a410d6a20034188016a410d6a290000370000200320032f01e0023b01c00220032003290388013703400c530b4100211b0c060b200341c0046a41186a220442003703002026420037030020274200370300200342003703c00441a69ac100411a200341c0046a1002200341c0036a41186a2004290300370300200341c0036a41106a2026290300370300200341c0036a41086a2027290300370300200320032903c0043703c003412010262204450d2020042005290000370000200441186a200541186a290000370000200441106a200541106a290000370000200441086a200541086a290000370000200341c0036a412020044120100420041023410021280c330b2027102622050d220b20274108102a000b4100210520032802a4030d4c0c4d0b410121044101211b0b201c450d00202810230b200341e0036a41186a202937030020034188046a200436020020034184046a2202201b360200200341a4046a200341a0026a41186a2903003702002003419c046a200341b0026a29030037020020034194046a200341a8026a2903003702002003202a3703f003200320083703e003200320032903a00237028c042003201a36028004200320193703e803200341d0016a200341e0036a107f2002280200450d3d20034180046a28020010230c3d0b20262027470d01202741016a22262027490d4f20274101742228202620262028491b22264100480d4f2027450d0420032802402027202610272228450d050c1a0b200328024021280c1f0b200328024021280c190b2026102622280d1c0b20264101102a000b2026102622280d150b20264101102a000b200341f4036a4101360200200341013602d4012003418898c4003602d001200342013702e403200341d497c4003602e0032003200341d0016a3602f003200341e0036a41c49ec1001061000b201a4101102a000b410e4101102a000b412e4101102a000b41d4aac10041331021000b41d4aac10041331021000b41124101102a000b41324101102a000b41d4aac10041331021000b410d4101102a000b412d4101102a000b41d4aac10041331021000b41d4aac10041331021000b201d4108102a000b41184108102a000b41124101102a000b41324101102a000b41da9fc100419f011021000b41d4aac10041331021000b41204101102a000b20032026360244200320283602400b200341c8006a202741016a221a360200202820276a41003a0000200341a4016a28020022270d050c060b200341f4016a2026360200200341f0016a2005360200200341f8016a28020021020b2005200241186c6a220220083703082002200637030020022004360210200341f8016a2202200228020041016a360200200341c0006a200341d0016a107f200341f4016a28020021020b2002450d1d200341f0016a28020010230c1d0b20032026360244200320283602400b200341c0006a41086a221c202741016a360200202820276a41013a0000024002400240024002402003280244221a201c28020022276b411f4b0d00202741206a22262027490d33201a410174221d20262026201d491b22264100480d33201a450d012028201a202610272228450d020c030b201a21260c030b2026102622280d010b20264101102a000b20032026360244200320283602400b201c202741206a221a360200202820276a222741086a201b41086a290000370000202741106a201b41106a290000370000202741186a201b41186a2900003700002027201b290000370000200341a4016a2802002227450d010b2026201a470d08202641016a221b2026490d2d2026410174221c201b201b201c491b221b4100480d2d2026450d0120282026201b10272228450d020c070b2026201a470d05202641016a22272026490d2c2026410174221b20272027201b491b22274100480d2c2026450d0220282026202710272228450d030c040b201b102622280d050b201b4101102a000b2027102622280d010b20274101102a000b20032027360244200320283602400b200341c8006a2226201a41016a3602002028201a6a41003a00002026280200211b20032802442128200328024021260c020b2003201b360244200320283602400b200341c8006a2226201a41016a3602002028201a6a41013a000002400240024002400240200328024422282026280200221a6b41204f0d00201a41206a2226201a490d292028410174221b20262026201b491b221b4100480d292028450d0120032802402028201b10272226450d020c030b200328024021260c030b201b102622260d010b201b4101102a000b2003201b36024420032026360240201b21280b200341c0006a41086a201a41206a221b3602002026201a6a221a41086a202741086a290000370000201a41106a202741106a290000370000201a41186a202741186a290000370000201a20272900003700000b200341c0036a41202026201b100402402028450d00202610230b20041023200341c0046a41186a22044200370300200341c0046a41106a22264200370300200341c0046a41086a22274200370300200342003703c00441a69ac100411a200341c0046a1002200341c0036a41186a2004290300370300200341c0036a41106a2026290300370300200341c0036a41086a2027290300370300200320032903c0043703c003412010262204450d0220042005290000370000200441186a200541186a290000370000200441106a200541106a290000370000200441086a200541086a290000370000200341c0036a412020044120100420041023200341e0026a41186a200341a0036a41186a290300370300200341e0026a41106a200341a0036a41106a290300370300200341e0026a41086a200341a0036a41086a290300370300200320032903a0033703e002410121280b410021260b200341e0036a41186a200341a0026a41186a290300370300200341e0036a41106a200341a0026a41106a290300370300200341e0036a41086a200341a0026a41086a29030037030020034188016a41086a200341e0026a41086a29030037030020034188016a41106a200341e0026a41106a29030037030020034188016a41186a200341e0026a41186a290300370300200320032903a0023703e003200320032903e00237038801200341c0046a41186a22054200370300200341c0046a41106a22044200370300200341c0046a41086a22274200370300200342003703c00420024132200341c0046a1002200341c0036a41186a2005290300370300200341c0036a41106a2004290300370300200341c0036a41086a2027290300370300200320032903c0043703c0032003410036024820034201370340200341286a41106a200341c0006a10412003200341286a3602c004200341c0046a200341c0006a10662003280244210520032802482104024002400240024002400240024020264101470d0020052004470d01200441016a22052004490d2820044101742226200520052026491b22054100480d282004450d0320032802402004200510272226450d040c0a0b20052004470d01200441016a22052004490d2720044101742226200520052026491b22054100480d272004450d0420032802402004200510272226450d050c070b200328024021260c090b200328024021260c060b2005102622260d060b20054101102a000b2005102622260d020b20054101102a000b41204101102a000b20032005360244200320263602400b200341c8006a200441016a2227360200202620046a41003a00000c020b20032005360244200320263602400b200341c0006a41086a221a200441016a360200202620046a41013a00000240024002400240024020032802442227201a28020022046b411f4b0d00200441206a22052004490d212027410174221b20052005201b491b22054100480d212027450d0120262027200510272226450d020c030b202721050c030b2005102622260d010b20054101102a000b20032005360244200320263602400b201a200441206a2227360200202620046a220441086a200341e0036a41086a290300370000200441106a200341e0036a41106a290300370000200441186a200341e0036a41186a290300370000200420032903e0033700000b0240024002400240024002400240024002400240202841ff01714101470d0020052027470d08200541016a22042005490d2520054101742228200420042028491b22044100480d252005450d0120262005200410272226450d020c070b20052027470d05200541016a22042005490d2420054101742228200420042028491b22044100480d242005450d0220262005200410272226450d030c040b2004102622260d050b20044101102a000b2004102622260d010b20044101102a000b20032004360244200320263602400b200341c8006a2205202741016a360200202620276a41003a00002005280200212720032802442104200328024021050c020b20032004360244200320263602400b200341c8006a2205202741016a360200202620276a41013a00000240024002400240024020032802442204200528020022266b41204f0d00202641206a22052026490d2120044101742227200520052027491b22274100480d212004450d0120032802402004202710272205450d020c030b200328024021050c030b2027102622050d010b20274101102a000b2003202736024420032005360240202721040b200341c0006a41086a202641206a2227360200200520266a222641086a20034188016a41086a290300370000202641106a20034188016a41106a290300370000202641186a20034188016a41186a29030037000020262003290388013700000b200341c0036a412020052027100402402004450d00200510230b20021023200341f4016a280200450d08200341f0016a28020010230c080b200510230b202741d9cac40020041b21052026411520041b21022004450d2020052114200221130b200320083703e801200320093a00e7012003200a3a00e6012003200b3b01e4012003200c3a00e3012003200d3a00e2012003200e3b01e0012003200f3a00df01200320103a00de01200320113b01dc01200320123a00db01200320133600d701200320143600d301200320153a00d201200320163b01d0010240024002400240024002400240410e10262202450d00200241066a41002900c6c740370000200241002900c0c7403700002002410e412e10272202450d01200220032903d00137000e200241266a200341d0016a41186a22272903003700002002411e6a200341d0016a41106a2228290300370000200241166a200341d0016a41086a221a290300370000200341c0046a41186a22054200370300200341c0046a41106a22044200370300200341c0046a41086a22264200370300200342003703c0042002412e200341c0046a1002200341c0036a41186a2005290300370300200341c0036a41106a2004290300370300200341c0036a41086a2026290300370300200320032903c0043703c003200341c0036a412041a886c5004100410010012105200210232005417f470d0a200341e0036a41186a2027290300370300200341e0036a41106a2028290300370300200341e0036a41086a201a290300370300200320032903d0013703e003410e10262202450d02200241066a4100290094c7403700002002410029008ec7403700002002410e412e10272202450d03200220032903880137000e200241266a20034188016a41186a2903003700002002411e6a20034188016a41106a290300370000200241166a20034188016a41086a290300370000200341c0046a41186a22054200370300200341c0046a41106a22044200370300200341c0046a41086a22264200370300200342003703c0042002412e200341c0046a1002200341c0036a41186a2005290300370300200341c0036a41106a2004290300370300200341c0036a41086a2026290300370300200320032903c0043703c003412010262205450d04200520032903e003370000200541186a200341e0036a41186a290300370000200541106a200341e0036a41106a290300370000200541086a200341e0036a41086a290300370000200341c0036a41202005412010042005102320021023410d10262202450d05200241056a41002900ee9c41370000200241002900e99c413700002002410d412d10272202450d06200220032903880137000d200241256a20034188016a41186a22052903003700002002411d6a20034188016a41106a2204290300370000200241156a20034188016a41086a2226290300370000200341c0046a41186a22274200370300200341c0046a41106a22284200370300200341c0046a41086a221a4200370300200342003703c0042002412d200341c0046a1002200341c0036a41186a2027290300370300200341c0036a41106a2028290300370300200341c0036a41086a201a290300370300200320032903c0043703c003200341203602e4032003200341c0036a3602e0032018200341e0036a106820021023200341086a20034188016a108401200341086a41086a29030021192003290308210820034188046a4100360200200341e0036a41186a201920062008200754201920065420192006511b22021b2219370300200341a4046a20052903003702002003419c046a200429030037020020034194046a2026290300370200200342083703800420032008200720021b22083703f003200320193703e803200320083703e003200320032903880137028c04200341d0016a200341e0036a107f20034184046a280200450d0c200341e0036a41206a28020010230c0c0b410e4101102a000b412e4101102a000b410e4101102a000b412e4101102a000b41204101102a000b410d4101102a000b412d4101102a000b200510230b202741d9cac40020041b21052026411520041b21022004450d1d2005211a200221170b200320083703f802200320093a00f7022003200a3a00f6022003200b3b01f4022003200c3a00f3022003200d3a00f2022003200e3b01f0022003200f3a00ef02200320103a00ee02200320113b01ec02200320123a00eb02200320173600e7022003201a3600e302200320153a00e202200320163b01e002410e10262202450d04200241066a41002900c6c740370000200241002900c0c7403700002002410e412e10272202450d05200220032903e00237000e200241266a200341e0026a41186a2903003700002002411e6a200341e0026a41106a290300370000200241166a200341e0026a41086a290300370000200341c0046a41186a22054200370300200341c0046a41106a22044200370300200341c0046a41086a22264200370300200342003703c0042002412e200341c0046a1002200341c0036a41186a2005290300370300200341c0036a41106a2004290300370300200341c0036a41086a2026290300370300200320032903c0043703c003200341c0036a412041a886c5004100410010012105200210232005417f470d00200341e0026a200341c0026a4120109604450d02410e10262202450d06200241066a4100290094c7403700002002410029008ec7403700002002410e412e10272202450d07200220032903a00237000e200241266a200341a0026a41186a2903003700002002411e6a200341a0026a41106a290300370000200241166a200341a0026a41086a290300370000200341c0046a41186a22054200370300200341c0046a41106a22044200370300200341c0046a41086a22264200370300200342003703c0042002412e200341c0046a1002200341c0036a41186a2005290300370300200341c0036a41106a2004290300370300200341c0036a41086a2026290300370300200320032903c0043703c003412010262205450d08200520032903e002370000200541186a200341e0026a41186a290300370000200541106a200341e0026a41106a290300370000200541086a200341e0026a41086a290300370000200341c0036a41202005412010042005102320021023410e10262202450d0941002105200241066a41002900c6c740370000200241002900c0c7403700002002410e412e10272202450d0a200220032903c00237000e200241266a200341c0026a41186a2903003700002002411e6a200341c0026a41106a290300370000200241166a200341c0026a41086a290300370000200341c0046a41186a22044200370300200341c0046a41106a22264200370300200341c0046a41086a22274200370300200342003703c0042002412e200341c0046a1002200341c0036a41186a2004290300370300200341c0036a41106a2026290300370300200341c0036a41086a2027290300370300200320032903c0043703c0030240200341c0036a412041a886c500410041001001417f460d002003422037022c2003200341c0036a360228200341e0036a200341286a106c2003280280042205450d0c200341c0046a41186a200341e0036a41186a290300370300200341c0046a41106a200341e0036a41106a290300370300200341c0046a41086a200341e0036a41086a290300370300200341d0016a41086a2003418c046a290200370300200341d0016a41106a20034194046a290200370300200341d0016a41186a2003419c046a290200370300200341d0016a41206a200341a4046a290200370300200341f8016a200341ac046a280200360200200320032903e0033703c00420032003290284043703d001200341c0036a412010030b200341a0036a41186a2004290300370300200341a0036a41106a2026290300370300200341a0036a41086a202729030037030020034188016a41086a200341d0016a41086a29030037030020034188016a41106a200341d0016a41106a29030037030020034188016a41186a200341d0016a41186a29030037030020034188016a41206a200341d0016a41206a29030037030020034188016a41286a2204200341d0016a41286a280200360200200320032903c0043703a003200320032903d001370388012005450d0120034180036a41186a2226200341a0036a41186a29030037030020034180036a41106a2227200341a0036a41106a29030037030020034180036a41086a2228200341a0036a41086a290300370300200341c0006a41086a221a20034188016a41086a290300370300200341c0006a41106a221b20034188016a41106a290300370300200341c0006a41186a221c20034188016a41186a290300370300200341c0006a41206a221d20034188016a41206a290300370300200341c0006a41286a221e2004280200360200200320032903a00337038003200320032903880137034020021023200341e0036a41186a2026290300370300200341e0036a41106a2027290300370300200341e0036a41086a202829030037030020034184046a20032903403702002003418c046a201a29030037020020034194046a201b2903003702002003419c046a201c290300370200200341a4046a201d290300370200200341ac046a201e280200360200200320053602800420032003290380033703e003410e10262202450d0c200241066a41002900c6c740370000200241002900c0c7403700002002410e412e10272202450d0d200220032903e00237000e200241266a200341e0026a41186a2903003700002002411e6a200341e0026a41106a290300370000200241166a200341e0026a41086a290300370000200341c0046a41186a22054200370300200341c0046a41106a22044200370300200341c0046a41086a22264200370300200342003703c0042002412e200341c0046a1002200341c0036a41186a2005290300370300200341c0036a41106a2004290300370300200341c0036a41086a2026290300370300200320032903c0043703c003200341203602d4012003200341c0036a3602d001200341e0036a200341d0016a10672002102320034184046a280200450d02200341e0036a41206a28020010230c020b41d49ec1002105411921020c1b0b200210230b41002105410121260b4101212720012d00002204410d4d0d1a0c1b0b410e4101102a000b412e4101102a000b410e4101102a000b412e4101102a000b41204101102a000b410e4101102a000b412e4101102a000b41d4aac10041331021000b410e4101102a000b412e4101102a000b202710230b20050d0041d9cac4002126410121054100211f4100210241d9cac4000d020c010b200341286a41026a2227200341c0026a41026a2d00003a0000200341e0036a41086a2205200341c0006a41086a290300370300200341e0036a410d6a221d200341c0006a410d6a290000370000200320032f01c0023b0128200320032903403703e003200341c0036a410d6a221f201d290000370000200341c0036a41086a221d2005290300370300200320032903e0033703c0030240024002400240412010262205450d00200520032f01283b00002005202036000720052026360003200520032903c00337000b200541026a20272d00003a0000200541136a201d290300370000200541186a201f2900003700000240024002400240202820026a22152004460d00200341a0026a41026a2202202841276a2d00003a0000200341c0046a41086a2226202841386a290000370300200341c0046a410d6a22272028413d6a290000370000200320282f00253b01a002200320282900303703c004202841c8006a2104202841246a2d0000221f4102460d01202828002c21092028280028211d200341e0026a41026a20022d00003a000020034188016a41086a202629030037030020034188016a410d6a2027290000370000200320032f01a0023b01e002200320032903c00437038801201f4101470d02200341e0036a201d41067610870120032802e003212620032802e803201d413f7122024d0d03200341c0026a41026a202620024105746a220241026a2d00003a0000200341c8006a200241136a290000370300200341cd006a200241186a290000370000200320022f00003b01c0022003200229000b370340200228000721092002280003211d4101210220032802e403450d060c050b201521040b4101211f410021264101210241000d070c060b200341c0026a41026a200341e0026a41026a2d00003a0000200341c0006a41086a20034188016a41086a290300370300200341c0006a410d6a20034188016a410d6a290000370000200320032f01e0023b01c00220032003290388013703400c040b410021022020210920032802e4030d010c020b41204101102a000b202610230b20020d004101211f41d9cac40021264101210241d9cac4000d020c010b200341286a41026a2224200341c0026a41026a220d2d00003a0000200341c0036a41086a2225200341c0006a41086a220e290300370300200341c0036a410d6a2214200341c0006a410d6a220f290000370000200320032f01c0023b0128200320032903403703c003201c41246c41b87f6a2112200341cb046a212141022122412021204102211f410021274101210202400240024002400340202120032903c003370000202141086a20252903003700002021410d6a2014290000370000200320093600c7042003201d3600c304200320032f01283b01c004200320242d00003a00c2040240201f417f6a2002470d002022201f201f2022491b2202ad4205862219422088a70d0a2019a722264100480d0a20052020202610272205450d050b200520206a222620032903c004370000202641186a200341c0046a41186a290300370000202641106a200341c0046a41106a290300370000202641086a200341c0046a41086a2223290300370000202741f803460d02024020122027460d00200341a0026a41026a220a202820276a222641cb006a2d00003a00002023202641dc006a290000370300200341c0046a410d6a220b202641e1006a2900003700002003202641c9006a2f00003b01a0022003202641d4006a2900003703c004202641c8006a2d0000220c4102460d02202641d0006a2800002110202641cc006a280000211d200341e0026a41026a2211200a2d00003a000020034188016a41086a220a202329030037030020034188016a410d6a2223200b290000370000200320032f01a0023b01e002200320032903c0043703880102400240200c4101470d00200341a0036a201d410676108701201d413f7121234100210a20032802a003210b0240200341a0036a41086a28020020234d0d00200d200b20234105746a221d41026a2d00003a0000200e201d41136a290000370300200f201d41186a2900003700002003201d2f00003b01c0022003201d29000b370340201d2800072109201d280003211d4101210a0b024020032802a403450d00200b10230b200a0d010c060b200d20112d00003a0000200e200a290300370300200f2023290000370000200320032f01e0023b01c0022003200329038801370340201021090b200441246a21042024200d2d00003a0000200341e0036a41086a2226200e290300370300200341e0036a410d6a2223200f290000370000200320032f01c0023b0128200320032903403703e0032014202329000037000020252026290300370300200320032903e0033703c003202241026a2122202041206a2120201f41016a211f202741246a21270c010b0b201521044100212641000d050c040b202641ec006a21040b4100212641000d030c020b202641ec006a210441d9cac400212641d9cac4000d020c010b20264101102a000b410021200c010b4101212002402002450d00200510230b20262105411521020b200341d0016a412c6a211d2028201c41246c6a21270240034020272004460d0120042d00002126200441246a210420264102470d000b0b0240201b450d00202810230b02402020450d0041002104201e0d050c060b201d1085012003201f3602c802200320023602c402200320053602c0020240024002400240024002400240024002400240024002400240411210262202450d00200241106a41002f00acc7403b0000200241086a41002900a4c7403700002002410029009cc7403700002002411241321027221c450d01201c201d290000370012201c412a6a201d41186a290000370000201c41226a201d41106a290000370000201c411a6a201d41086a290000370000200341c0046a41186a22024200370300200341c0046a41106a22054200370300200341c0046a41086a22044200370300200342003703c004201c4132200341c0046a1002200341c0036a41186a2002290300370300200341c0036a41106a2005290300370300200341c0036a41086a2004290300370300200320032903c0043703c0030240200341c0036a412041a886c500410041001001417f460d002003422037028c012003200341c0036a36028801200341e0036a20034188016a10880120032d00ec0322024102460d03200341a0026a41086a200341f5036a290000370300200341a0026a41106a200341fd036a290000370300200341a0026a41186a20034185046a290000370300200341e0026a41086a20034196046a290100370300200341e0026a41106a2003419e046a290100370300200341e0026a41186a200341a6046a290100370300200320032900ed033703a00220032003418e046a2901003703e0022003418d046a2d0000210520032802e403450d0d20032802e00310230c0d0b20024200370300200341c0046a41106a22054200370300200341c0046a41086a22044200370300200342003703c00441c09ac100411a200341c0046a100220034188016a41186a200229030037030020034188016a41106a200529030037030020034188016a41086a2004290300370300200320032903c00437038801024002400240024020034188016a412041a886c500410041001001417f460d00200341d8036a4200370300200341c0036a41106a4200370300200341c0036a41086a4200370300200342003703c00320034188016a4120200341c0036a4120410010012202417f460d072002411f4d0d07200341e0036a41186a2202200341c0036a41186a290300370300200341e0036a41106a2205200341c0036a41106a290300370300200341e0036a41086a2204200341c0036a41086a290300370300200320032903c0033703e003200341a0036a41186a22262002290300370300200341a0036a41106a22022005290300370300200341a0036a41086a22052004290300370300200320032903e0033703a003200341c0006a41186a2026290300370300200341c0006a41106a2002290300370300200341c0006a41086a2005290300370300200320032903a003370340411210262202450d08200241106a41002f00acc7403b0000200241086a41002900a4c7403700002002410029009cc7403700002002411241321027221b450d09201b2003290340370012201b412a6a200341c0006a41186a290300370000201b41226a200341c0006a41106a290300370000201b411a6a200341c0006a41086a290300370000200341c0046a41186a22024200370300200341c0046a41106a22054200370300200341c0046a41086a22044200370300200342003703c004201b4132200341c0046a1002200341c0036a41186a2002290300370300200341c0036a41106a2005290300370300200341c0036a41086a2004290300370300200320032903c0043703c003200341c0036a412041a886c500410041001001417f460d0a200342203702c4042003200341c0036a3602c004200341e0036a200341c0046a10880120032d00ec0322054102460d0b20032802e403211f20032802e003211e20032802e803210220034188016a200341ed036a41c3001094041a200320053a00e003200341e0036a41017220034188016a41c1001094041a20032d0081042120200341c0046a41186a22054200370300200341c0046a41106a22044200370300200341c0046a41086a22264200370300200342003703c004201b4132200341c0046a1002200341c0036a41186a2005290300370300200341c0036a41106a2004290300370300200341c0036a41086a2026290300370300200320032903c0043703c00320034201370388012003410036029001200320023602c004200341c0046a20034188016a104120032802900121052002450d012002410574211a410020056b2104200328028c012126201e210203400240024002400240202620046a41204f0d00200541206a22272005490d1720264101742228202720272028491b22284100480d172026450d0120032802880120262028102722270d020c080b20032802880121270c020b202810262227450d060b2003202836028c012003202736028801202821260b20034188016a41086a200541206a2228360200202720056a220541086a200241086a290000370000200541106a200241106a290000370000200541186a200241186a29000037000020052002290000370000200441606a210420282105200241206a2102201a41606a221a0d000c030b0b200341c0046a41186a220242003703002005420037030020044200370300200342003703c00441c09ac100411a200341c0046a1002200341c0036a41186a2002290300370300200341c0036a41106a2005290300370300200341c0036a41086a2004290300370300200320032903c0043703c003412010262202450d0b2002201d290000370000200241186a201d41186a290000370000200241106a201d41106a290000370000200241086a201d41086a290000370000200341c0036a412020024120100420021023410021050c0e0b200521280b024002400240200328028c012028470d00202841016a22022028490d1220284101742205200220022005491b22054100480d122028450d012003280288012028200510272202450d020c0d0b20032802880121020c0d0b2005102622020d0b0b20054101102a000b20284101102a000b41124101102a000b41324101102a000b41d4aac10041331021000b41d4aac10041331021000b41124101102a000b41324101102a000b41da9fc100419f011021000b41d4aac10041331021000b41204101102a000b2003200536028c0120032002360288010b20034188016a41086a2226202841016a360200200220286a41013a000002400240024002400240200328028c012227202628020022046b411f4b0d00200441206a22052004490d0820274101742228200520052028491b22054100480d082027450d0120022027200510272202450d020c030b202721050c030b2005102622020d010b20054101102a000b2003200536028c0120032002360288010b2026200441206a2228360200200220046a222641086a201d41086a290000370000202641106a201d41106a290000370000202641186a201d41186a2900003700002026201d29000037000002400240024002400240024002400240024002400240024020034182046a410020204101461b2226450d0020052028470d01200541016a22272005490d0f2005410174221a20272027201a491b22274100480d0f2005450d0320022005202710272202450d040c090b20052028470d01200541016a22262005490d0e20054101742227202620262027491b221a4100480d0e2005450d0420022005201a10272202450d050c060b200521270c080b2005211a0c050b2027102622020d050b20274101102a000b201a102622020d010b201a4101102a000b2003201a36028c0120032002360288010b20034190016a200441216a2204360200200220286a41003a00000c020b2003202736028c0120032002360288010b20034188016a41086a2220200441216a2205360200200220286a41013a000002400240024002400240202720056b411f4b0d00200541206a22282005490d092027410174221a20282028201a491b221a4100480d092027450d0120022027201a10272202450d020c030b2027211a0c030b201a102622020d010b201a4101102a000b2003201a36028c0120032002360288010b2020200441c1006a2204360200200220056a220541086a202641086a290000370000200541106a202641106a290000370000200541186a202641186a290000370000200520262900003700000b200341c0036a41202002200410040240201a450d00200210230b0240201f450d00201e10230b201b1023200341c0046a41186a22024200370300200341c0046a41106a22054200370300200341c0046a41086a22044200370300200342003703c00441c09ac100411a200341c0046a1002200341c0036a41186a2002290300370300200341c0036a41106a2005290300370300200341c0036a41086a2004290300370300200320032903c0043703c003412010262202450d052002201d290000370000200241186a201d41186a290000370000200241106a201d41106a290000370000200241086a201d41086a290000370000200341c0036a412020024120100420021023200341e0026a41186a200341c0006a41186a290300370300200341e0026a41106a200341c0006a41106a290300370300200341e0026a41086a200341c0006a41086a290300370300200320032903403703e002410121050b410021020b20034185046a20053a000020034186046a20032903e002370100200341ed036a200341a0026a41086a290300370000200341f5036a200341a0026a41106a290300370000200341fd036a200341a0026a41186a2903003700002003418e046a200341e0026a41086a29030037010020034196046a200341e0026a41106a2903003701002003419e046a200341e0026a41186a290300370100200320023a00e403200320032903a0023700e5032003200341c0026a3602e003200341c0046a41186a22024200370300200341c0046a41106a22054200370300200341c0046a41086a22044200370300200342003703c004201c4132200341c0046a1002200341c0036a41186a2002290300370300200341c0036a41106a2005290300370300200341c0036a41086a2004290300370300200320032903c0043703c0032003410036029001200342013703880120032802c00221022003200341c0026a41086a2802002205360240200341c0006a20034188016a104102402005450d0020054105742128410020034188016a41086a28020022056b2126200328028801211a200328028c01212703400240202720266a411f4b0d00200541206a22042005490d042027410174221b20042004201b491b22044100480d04024002402027450d00201a202720041027221a0d010c070b20041026221a450d060b200421270b201a20056a22042002290000370000200441186a200241186a290000370000200441106a200241106a290000370000200441086a200241086a290000370000202641606a2126200541206a2105200241206a2102202841606a22280d000b20034190016a20053602002003202736028c012003201a360288010b200341e0036a41047220034188016a105d200328028c012102200341c0036a4120200328028801220520034188016a41086a280200100402402002450d00200510230b201c1023024020032802c402450d0020032802c00210230b0240200341f4016a280200450d00200341f0016a28020010230b41002127410121260b4100210520012d00002204410d4d0d090c0a0b101e000b20044101102a000b41204101102a000b201a10230b20040d00410021274101212620012d00002204410d4d0d040c050b4100212741012126201b450d020b2028102320012d00002204410d4d0d020c030b41012126410121270b20012d00002204410d4b0d010b410120047441be3f710d01024020044106460d002004410d470d012026450d02200141086a280200450d02200141046a28020010230c020b2027450d01200141086a280200450d01200141046a28020010230c010b200141086a280200450d00200141046a28020010230b2000200236020420002005360200200341e0046a24000b9a0304027f017e027f017e230041c0006b2202240002400240411410262203450d00200341106a41002800f9b641360000200341086a41002900f1b641370000200341002900e9b64137000020034114413410272203450d01200320012900003700142003412c6a200141186a290000370000200341246a200141106a2900003700002003411c6a200141086a29000037000042002104200241206a41186a22014200370300200241206a41106a22054200370300200241206a41086a220642003703002002420037032020034134200241206a1002200241186a2001290300370300200241106a2005290300370300200241086a2006290300370300200220022903203703000240024002402002412041a886c500410041001001417f460d00200242003703282002420037032020024120200241206a4110410010012201417f460d022001410f4d0d02200241286a2903002107200229032021040c010b420021070b200310232000200737030820002004370300200241c0006a24000f0b41d4aac10041331021000b41144101102a000b41344101102a000b9c1501077f230041c0036b220124000240024002400240024002400240024002400240024002400240024002400240411210262202450d00200241106a41002f00bec7403b0000200241086a41002900b6c740370000200241002900aec74037000020024112413210272202450d01200220002900003700122002412a6a200041186a290000370000200241226a200041106a2900003700002002411a6a200041086a290000370000200141e0026a41186a22004200370300200141e0026a41106a22034200370300200141e0026a41086a22044200370300200142003703e00220024132200141e0026a1002200141b0026a41186a2000290300370300200141b0026a41106a2003290300370300200141b0026a41086a2004290300370300200120012903e0023703b00202400240200141b0026a412041a886c500410041001001417f460d002001422037026c2001200141b0026a360268200141e0026a200141e8006a106420012d00f80222034102460d0420014188016a41186a20014191036a29000037030020014188016a41106a20014189036a29000037030020014188016a41086a20014181036a290000370300200141e8016a41086a200141a2036a290100370300200141e8016a41106a200141aa036a290100370300200141e8016a41186a200141b2036a290100370300200120012900f9023703880120012001419a036a2901003703e80120014199036a2d00002104200141b0026a412010030c010b410221030b200141286a41186a20014188016a41186a290300370300200141286a41106a220020014188016a41106a290300370300200141286a41086a220520014188016a41086a290300370300200141086a41086a2206200141e8016a41086a290300370300200141086a41106a2207200141e8016a41106a290300370300200141086a41186a200141e8016a41186a2903003703002001200129038801370328200120012903e8013703082002102320034102460d0f200141e8006a41186a200141286a41186a290300370300200141e8006a41106a2000290300370300200141e8006a41086a2005290300370300200141c8006a41086a2006290300370300200141c8006a41106a2007290300370300200141c8006a41186a200141086a41186a2903003703002001200129032837036820012001290308370348410021020240200441ff01714101470d00411210262202450d06200241106a41002f00bec7403b0000200241086a41002900b6c740370000200241002900aec74037000020024112413210272202450d07200220012903483700122002412a6a200141e0006a290300370000200241226a200141c8006a41106a2903003700002002411a6a200141c8006a41086a2903003700000b0240024020034101470d00411210262200450d09200041106a41002f00bec7403b0000200041086a41002900b6c740370000200041002900aec74037000020004112413210272200450d0a200020012903683700122000412a6a200141e8006a41186a290300370000200041226a200141e8006a41106a2903003700002000411a6a200141e8006a41086a290300370000200141e0026a41186a22054200370300200141e0026a41106a22064200370300200141e0026a41086a22074200370300200142003703e00220004132200141e0026a1002200141b0026a41186a2005290300370300200141b0026a41106a2006290300370300200141b0026a41086a2007290300370300200120012903e0023703b002200141b0026a412041a886c500410041001001417f460d0b200142203702d4022001200141b0026a3602d002200141e0026a200141d0026a106420012d00f80222074102460d0c20014188016a41106a200141e0026a41106a220529030037030020014188016a41086a200141e0026a41086a2206290300370300200120012903e00237038801200141e8016a200141e0026a41196a41c7001094041a200120073a00a00120014188016a41196a200141e8016a41c7001094041a200141c1016a20043a0000200141c2016a2001290348370100200141ca016a200141c8006a41086a290300370100200141d2016a200141c8006a41106a290300370100200141da016a200141c8006a41186a290300370100200141e0026a41186a220442003703002005420037030020064200370300200142003703e00220004132200141e0026a1002200141b0026a41186a2004290300370300200141b0026a41106a2005290300370300200141b0026a41086a2006290300370300200120012903e0023703b002200141203602e4022001200141b0026a3602e00220014188016a200141e0026a1065200010234101210420020d010c0e0b200141e0026a41186a22004200370300200141e0026a41106a22054200370300200141e0026a41086a22064200370300200142003703e00241a69ac100411a200141e0026a1002200141b0026a41186a2000290300370300200141b0026a41106a2005290300370300200141b0026a41086a2006290300370300200120012903e0023703b0020240200441ff01714101470d00412010262200450d0d20002001290348370000200041186a200141c8006a41186a290300370000200041106a200141c8006a41106a290300370000200041086a200141c8006a41086a290300370000200141b0026a412020004120100420001023410021004100210420020d010c0e0b200141b0026a4120100341002100410021042002450d0d0b200141e0026a41186a22054200370300200141e0026a41106a22064200370300200141e0026a41086a22074200370300200142003703e00220024132200141e0026a1002200141b0026a41186a2005290300370300200141b0026a41106a2006290300370300200141b0026a41086a2007290300370300200120012903e0023703b002200141b0026a412041a886c500410041001001417f460d03200142203702d4022001200141b0026a3602d002200141e0026a200141d0026a106420012d00f8024102460d0420014188016a41106a200141e0026a41106a220529030037030020014188016a41086a200141e0026a41086a2206290300370300200120012903e00237038801200141e8016a200141e0026a41196a41c7001094041a20014188016a41196a200141e8016a41c7001094042001290368370000200141a9016a200141e8006a41086a290300370000200141b1016a200141e8006a41106a290300370000200141b9016a200141e8006a41186a290300370000200120033a00a001200141e0026a41186a220342003703002005420037030020064200370300200142003703e00220024132200141e0026a1002200141b0026a41186a2003290300370300200141b0026a41106a2005290300370300200141b0026a41086a2006290300370300200120012903e0023703b002200141203602e4022001200141b0026a3602e00220014188016a200141e0026a106520021023410121032004200045720d0e0c0d0b41124101102a000b41324101102a000b41d4aac10041331021000b4190a1c10041d3001021000b41d4aac10041331021000b41124101102a000b41324101102a000b41124101102a000b41324101102a000b4190a1c10041d3001021000b41d4aac10041331021000b41204101102a000b410021032004200045720d010b200010230b2002452003720d00200210230b200141c0036a24000bf41a010f7f230041a0036b220124000240024002400240024002400240024002400240024002400240024002400240411210262202450d00200241106a41002f00acc7403b0000200241086a41002900a4c7403700002002410029009cc74037000020024112413210272202450d01200220002900003700122002412a6a200041186a290000370000200241226a200041106a2900003700002002411a6a200041086a290000370000200141d0026a41186a22004200370300200141d0026a41106a22034200370300200141d0026a41086a22044200370300200142003703d00220024132200141d0026a1002200141a0026a41186a2000290300370300200141a0026a41106a2003290300370300200141a0026a41086a2004290300370300200120012903d0023703a00202400240200141a0026a412041a886c500410041001001417f460d002001422037026c2001200141a0026a360268200141d0026a200141e8006a10880120012d00dc0222054102460d0420014188016a41086a200141e5026a29000037030020014188016a41106a200141ed026a29000037030020014188016a41186a200141f5026a290000370300200141d8016a41086a20014186036a290100370300200141d8016a41106a2001418e036a290100370300200141d8016a41186a20014196036a290100370300200120012900dd02370388012001200141fe026a2901003703d801200141fd026a2d0000210020012802d402210620012802d0022107200141a0026a412010030c010b410221050b200141286a41186a20014188016a41186a290300370300200141286a41106a220320014188016a41106a290300370300200141286a41086a220420014188016a41086a290300370300200141086a41086a2208200141d8016a41086a290300370300200141086a41106a2209200141d8016a41106a290300370300200141086a41186a200141d8016a41186a2903003703002001200129038801370328200120012903d8013703082002102320054102460d0f200141e8006a41186a200141286a41186a290300370300200141e8006a41106a2003290300370300200141e8006a41086a2004290300370300200141c8006a41086a2008290300370300200141c8006a41106a2009290300370300200141c8006a41186a200141086a41186a29030037030020012001290328370368200120012903083703484100210a0240200041ff01714101470d00411210262202450d06200241106a41002f00acc7403b0000200241086a41002900a4c7403700002002410029009cc7403700002002411241321027220a450d07200a2001290348370012200a412a6a200141e0006a290300370000200a41226a200141c8006a41106a290300370000200a411a6a200141c8006a41086a2903003700000b0240024002400240024020054101470d00411210262202450d0c200241106a41002f00acc7403b0000200241086a41002900a4c7403700002002410029009cc7403700002002411241321027220b450d0d200b2001290368370012200b412a6a200141e8006a41186a290300370000200b41226a200141e8006a41106a290300370000200b411a6a200141e8006a41086a290300370000200141d0026a41186a22024200370300200141d0026a41106a22034200370300200141d0026a41086a22044200370300200142003703d002200b4132200141d0026a1002200141a0026a41186a2002290300370300200141a0026a41106a2003290300370300200141a0026a41086a2004290300370300200120012903d0023703a002200141a0026a412041a886c500410041001001417f460d0e200142203702c4022001200141a0026a3602c002200141d0026a200141c0026a10880120012d00dc0222024102460d0f20014188016a41086a2203200141d0026a41086a220c280200360200200120012903d00237038801200141d8016a200141d0026a410d6a41c3001094041a200120023a00940120014188016a410d6a200141d8016a41c3001094041a200141b5016a20003a0000200141b6016a2001290348370100200141be016a200141c8006a41086a290300370100200141c6016a200141c8006a41106a290300370100200141ce016a200141c8006a41186a290300370100200141d0026a41186a22024200370300200141d0026a41106a22004200370300200c4200370300200142003703d002200b4132200141d0026a1002200141a0026a41186a2002290300370300200141a0026a41106a2000290300370300200141a0026a41086a200c290300370300200120012903d0023703a002200141003602d802200142013703d002200128028801210d2001200328020022023602d801200141d8016a200141d0026a104102402002450d00200241057421094100200c28020022006b210420012802d002210e20012802d4022108200d210203400240200820046a411f4b0d00200041206a22032000490d052008410174220f20032003200f491b22034100480d05024002402008450d00200e200820031027220e0d010c090b20031026220e450d080b200321080b200e20006a22032002290000370000200341186a200241186a290000370000200341106a200241106a290000370000200341086a200241086a290000370000200441606a2104200041206a2100200241206a2102200941606a22090d000b200141d8026a2000360200200120083602d4022001200e3602d0020b20014194016a200141d0026a105d20012802d4022102200141a0026a412020012802d0022200200c280200100402402002450d00200010230b0240200128028c01450d00200d10230b200b10234101210d200a0d010c110b200141d0026a41186a22024200370300200141d0026a41106a22034200370300200141d0026a41086a22044200370300200142003703d00241c09ac100411a200141d0026a1002200141a0026a41186a2002290300370300200141a0026a41106a2003290300370300200141a0026a41086a2004290300370300200120012903d0023703a0020240200041ff01714101470d00412010262202450d1020022001290348370000200241186a200141c8006a41186a290300370000200241106a200141c8006a41106a290300370000200241086a200141c8006a41086a290300370000200141a0026a4120200241201004200210234100210b4100210d200a0d010c110b200141a0026a412010034100210b4100210d200a450d100b200141d0026a41186a22024200370300200141d0026a41106a22004200370300200141d0026a41086a22034200370300200142003703d002200a4132200141d0026a1002200141a0026a41186a2002290300370300200141a0026a41106a2000290300370300200141a0026a41086a2003290300370300200120012903d0023703a002200141a0026a412041a886c500410041001001417f460d06200142203702c4022001200141a0026a3602c002200141d0026a200141c0026a10880120012d00dc024102460d0720014188016a41086a2202200141d0026a41086a220c280200360200200120012903d00237038801200141d8016a200141d0026a410d6a41c3001094041a20014188016a410d6a200141d8016a41c30010940420012903683700002001419d016a200141e8006a41086a290300370000200141a5016a200141e8006a41106a290300370000200141ad016a200141e8006a41186a290300370000200120053a009401200141d0026a41186a22004200370300200141d0026a41106a22034200370300200c4200370300200142003703d002200a4132200141d0026a1002200141a0026a41186a2000290300370300200141a0026a41106a2003290300370300200141a0026a41086a200c290300370300200120012903d0023703a002200141003602d802200142013703d00220012802880121052001200228020022023602d801200141d8016a200141d0026a104102402002450d00200241057421094100200c28020022006b210420012802d002210e20012802d40221082005210203400240200820046a411f4b0d00200041206a22032000490d032008410174220f20032003200f491b22034100480d03024002402008450d00200e200820031027220e0d010c060b20031026220e450d050b200321080b200e20006a22032002290000370000200341186a200241186a290000370000200341106a200241106a290000370000200341086a200241086a290000370000200441606a2104200041206a2100200241206a2102200941606a22090d000b200141d8026a2000360200200120083602d4022001200e3602d0020b20014194016a200141d0026a105d20012802d4022102200141a0026a412020012802d0022200200c280200100402402002450d00200010230b0240200128028c01450d00200510230b200a102341012102200d200b45720d110c100b101e000b20034101102a000b20034101102a000b41124101102a000b41324101102a000b41d4aac10041331021000b4190a1c10041d3001021000b41d4aac10041331021000b41124101102a000b41324101102a000b41124101102a000b41324101102a000b4190a1c10041d3001021000b41d4aac10041331021000b41204101102a000b41002102200d200b45720d010b200b10230b02400240200a45200272450d002006450d020c010b200a10232006450d010b200710230b200141a0036a24000bc30201047f230041d0006b22022400024002400240410f10262203450d00200341076a41002900849544370000200341002900fd94443700002003410f411e10272203450d012003200136000f200241306a41186a22014200370300200241306a41106a22044200370300200241306a41086a220542003703002002420037033020034113200241306a1002200241186a2001290300370300200241106a2004290300370300200241086a200529030037030020022002290330370300024002402002412041a886c500410041001001417f460d002002422037022420022002360220200241306a200241206a102820022802302201450d0420002002290234370204200020013602000c010b20004100360208200042013702000b20031023200241d0006a24000f0b410f4101102a000b411e4101102a000b41d4aac10041331021000bb80a010b7f230041f0016b22022400200220011028024020022802002203450d00200241086a28020021042002280204210541002106200241003a00d00120012802002001280204200241d0016a410120012802081001210720012001280208200741016a41014b22076a220836020802402007450d00024020022d00d0012207450d0020074101470d01200241d0016a41186a22094200370300200241d0016a41106a220a4200370300200241d0016a41086a220b4200370300200242003703d001200141086a220641002001280200200141046a280200200241d0016a41202008100122072007417f461b2207412020074120491b20062802006a22083602002007411f4d0d01200241b0016a41186a22072009290300370300200241b0016a41106a2206200a290300370300200241b0016a41086a2209200b290300370300200220022903d0013703b00120024190016a41186a220a200729030037030020024190016a41106a2207200629030037030020024190016a41086a22062009290300370300200220022903b00137039001200241f0006a41186a200a290300370300200241f0006a41106a2007290300370300200241f0006a41086a20062903003703002002200229039001370370410121060b200241d0006a41186a200241f0006a41186a290300370300200241d0006a41106a200241f0006a41106a290300370300200241d0006a41086a200241f0006a41086a2903003703002002200229037037035041002109200241003a00d0012001280200200141046a280200200241d0016a4101200810012107200141086a22082008280200200741016a41014b22076a22083602002007450d00024020022d00d0012207450d0020074101470d01200241d0016a41186a22094200370300200241d0016a41106a220a4200370300200241d0016a41086a220b4200370300200242003703d001200141086a220741002001280200200141046a280200200241d0016a41202008100122012001417f461b2201412020014120491b20072802006a3602002001411f4d0d01200241b0016a41186a22012009290300370300200241b0016a41106a2207200a290300370300200241b0016a41086a2208200b290300370300200220022903d0013703b00120024190016a41186a2209200129030037030020024190016a41106a2201200729030037030020024190016a41086a22072008290300370300200220022903b00137039001200241f0006a41186a2009290300370300200241f0006a41106a2001290300370300200241f0006a41086a20072903003703002002200229039001370370410121090b200241106a41186a2201200241f0006a41186a290300370300200241106a41106a2207200241f0006a41106a290300370300200241106a41086a2208200241f0006a41086a29030037030020022002290370370310200241306a41186a220a200241d0006a41186a290300370300200241306a41106a220b200241d0006a41106a290300370300200241306a41086a220c200241d0006a41086a29030037030020022002290350370330200020063a000c2000200436020820002005360204200020033602002000412d6a20093a00002000200229033037000d200041156a200c2903003700002000411d6a200b290300370000200041256a200a2903003700002000412e6a2002290310370000200041366a20082903003700002000413e6a2007290300370000200041c6006a2001290300370000200241f0016a24000f0b200041023a000c02402005450d00200310230b200241f0016a24000f0b200041023a000c200241f0016a24000bae23032a7f037e257f230041c0026b2205240002400240024020014115490d00410121064102210741032108413221094105210a417f210b4120210c4100210d411f210e410b210f41602110411821114110211241082113419fc000211441807f2115416821164170211741782118412821194130211a4138211b4101211c4101211d4100211e0c010b410021200c010b410121200b034002400240024002400240024002400240024002400240024002400240024002400240024002400240024020200e020001010b20014102490d0c41602149200041606a214a4101214b4105214c417f214d4120214e4118214f411021504108215141002152413821534130215441282155410121564101211e0c010b024002400240201e0e03000d01010b201c201d71211f0c010b203b203e200a746a212002400340203d203e200b6a223e4f0d01200541c0016a2020200c1096042122202020106a222121202022200d480d000c100b0b200020052903c00137000020332038290300370000203520392903003700002037203a2903003700002001203d20066a2220490d0820002020200a746a2100200120206b22014115490d020b2004450d090240201c2006710d0020002001108a012004200b6a21040b2001200776222020086c21212020200674212241002123024020012009490d0020202020200b6a222320002020200a746a20002023200a746a200c1096042224200d4822251b2226202020066a22272023202020251b222020002027200a746a20002020200a746a200c109604200d4822271b222020002020200a746a20002026200a746a200c1096042226200d481b212020222022200b6a222320002022200a746a20002023200a746a200c1096042228200d4822291b222a2022200672222b2023202220291b22222000202b200a746a20002022200a746a200c1096042229200d481b222220002022200a746a2000202a200a746a200c109604222a200d481b212220212021200b6a222320002021200a746a20002023200a746a200c109604222b200d48222c1b222d202120066a222e20232021202c1b22212000202e200a746a20002021200a746a200c1096042223200d481b222120002021200a746a2000202d200a746a200c109604222c200d481b21212007200620251b2024200e7620271b2026200e766a2028200e766a2029200e766a202a200e766a202b200e766a2023200e766a202c200e766a21230b20002022200a746a20002020200a746a200c1096042225200e7620236a20002021200a746a2000202020222025200d4822251b2224200a746a200c1096042226200e766a21230240024002402000202120242026200d481b2221200a746a20002022202020251b222c200a746a200c109604200b4a0d00202320066a2223200f4b0d0120234521200c020b2021212c20234521200c010b024020012006762221450d0020002001200a746a20106a2120200021220340200541206a20116a2223202220116a2225290000370300200541206a20126a2224202220126a2226290000370300200541206a20136a2227202220136a222829000037030020052022290000370320202020136a2229290000212f202020126a222a2900002130202029000021312025202020116a222b290000370000202620303700002028202f370000202220313700002020200529032037000020292027290300370000202a2024290300370000202b2023290300370000202020106a21202022200c6a21222021200b6a22210d000b0b2001202c200b736a212c410121200b0240201f200b73202045722006710d0020002001108b010d0c0b024002402003450d00202c20014f0d0a20032000202c200a746a2220200c109604200d480d01200541206a20116a2232200020116a2233290000370300200541206a20126a2234200020126a2235290000370300200541206a20136a2236200020136a223729000037030020052000290000370320202020136a2222290000212f202020126a22212900002130202029000021312033202020116a2223290000370000203520303700002037202f3700002000203137000020232032290300370000202120342903003700002022203629030037000020202005290320370000200541c0016a20116a22382033290000370300200541c0016a20126a22392035290000370300200541c0016a20136a223a2037290000370300200520002900003703c001200020106a213b2000200c6a213c4100213d41002001223e200b6a22224f0d040c100b2001450d070b202c20014f0d05200541206a20116a221d200020116a223f290000370300200541206a20126a222d200020126a2240290000370300200541206a20136a222e200020136a2241290000370300200520002900003703202000202c200a746a2220290000212f202020136a22222900002130202020126a22212900002131203f202020116a222329000037000020402031370000204120303700002000202f370000202020052903203700002022202e2903003700002021202d2903003700002023201d290300370000200520116a2242203f290000370300200520126a22432040290000370300200520136a22442041290000370300200520002900003703002000200c6a21264100214502402001200b6a2221450d0020262120034020202005200c109604200b4a0d012020200c6a2120204520066a22452021490d000b0b20002001200a746a21202021212202400340202021232022224620454d0d012046200b6a2122202320106a22202005200c109604200d4e0d000b0b20462045490d0420212046490d03418001212c410021244100212a4100212541002129418001211c20262045200a746a2247212603400240024002400240024002400240202320266b222020144b22480d002020200a76222020156a2020202a202449202920254922227222211b21202021450d01201c202020221b211c2020202c20221b212c0b20292025470d020c010b20202020200676221c6b212c20292025470d010b201c450d0141002120200541c0006a22292125202621220340202520203a0000202520222005200c109604200b73200e766a21252022200c6a2122201c202020066a2220470d000b0b202a2024470d020c010b200541c0006a22252129202a2024470d010b0240202c450d00202320106a212041002122200541c0016a222a21240340202420223a0000202420202005200c109604200e766a2124202020106a2120202c202220066a2222470d000c020b0b200541c0016a2224212a0b02402024202a6b2220202520296b2222202220204b1b222b450d00201d202620292d0000200a746a222020116a290000370300202d202020126a290000370300202e202020136a29000037030020052020290000370320202620292d0000200a746a22202023202a2d0000200b73200a746a2222290000370000202020116a202220116a290000370000202020126a202220126a290000370000202020136a202220136a2900003700000240202b2006460d004100212003402023202a20206a22272d0000200b73200a746a22222026202920206a20066a22282d0000200a746a2221290000370000202220116a202120116a290000370000202220126a202120126a290000370000202220136a202120136a290000370000202620282d0000200a746a22222023202720066a2d0000200b73200a746a2221290000370000202220116a202120116a290000370000202220126a202120126a290000370000202220136a202120136a290000370000202020076a2122202020066a222121202022202b490d000b202a20216a212a202920216a21290b2023202a2d0000200b73200a746a22202005290320370000202020116a201d290300370000202020126a202d290300370000202020136a202e290300370000202a20066a212a202920066a21290b2023202c200a746b2023202a2024461b21232026201c200a746a202620292025461b212620480d000b02400240202920254f0d000340201d20262025200b6a22252d0000200a746a222220116a2221290000370300202d202220126a2224290000370300202e202220136a222729000037030020052022290000370320202320106a2220290000212f202320166a22282900002130202320176a222a29000021312021202320186a222329000037000020242031370000202720303700002022202f370000202020052903203700002028202e290300370000202a202d2903003700002023201d2903003700002020212320292025490d000c020b0b0240202a20244f0d002026212003402024200b6a22242d00002122201d202020116a2221290000370300202d202020126a2225290000370300202e202020136a22262900003703002005202029000037032020232022200b73200a746a2222290000212f202220136a22272900002130202220126a222829000021312021202220116a222929000037000020252031370000202620303700002020202f370000202220052903203700002027202e2903003700002028202d2903003700002029201d2903003700002020200c6a2120202a2024490d000c020b0b202621200b203f20422903003700002040204329030037000020412044290300370000200020052903003700000240024002402001202020476b200a7620456a22224d0d00201d203f290000370300202d2040290000370300202e20412900003703002005200029000037032020002022200a746a2220290000212f202020136a22212900002130202020126a22232900002131203f202020116a222529000037000020402031370000204120303700002000202f370000202020052903203700002021202e2903003700002023202d2903003700002025201d290300370000200120226b2221450d0120212022202220214b1b2123200120087621252020200c6a21240240024020222021200b6a22014f0d002000202220022003200410890120202103202421000c010b20242001200220202004108901202221010b202320254f211c204620454d211d200141154f0d02410021200c160b41f4a1c100202220011029000b4184a2c100104f000b4100211e410121200c130b410121200c120b410021200c110b4102211e410121200c100b20462021108c01000b204520461048000b41f4a1c100202c20011029000b41e4a1c100410041001029000b202020011048000b419ca2c100202c20011029000b20002001108d01200541c0026a24000f0b2056204c7421202056204d6a21222056204b6a21560240200020206a222020002022204c746a2221204e109604204d4a0d00200541c0016a204f6a22232020204f6a2225290000370300200541c0016a20506a2224202020506a2226290000370300200541c0016a20516a2227202020516a2228290000370300200520202900003703c001202020212900003700002028202120516a2900003700002026202120506a29000037000020252021204f6a2900003700004100212102402022450d00204a212002400340200541c0016a2020204e10960420524e0d012020204e6a2020290000370000202020536a2020204f6a290000370000202020546a202020506a290000370000202020556a202020516a290000370000202020496a21202022204d6a22220d000c020b0b202221210b20002021204c746a222020052903c0013700002020204f6a2023290300370000202020506a2024290300370000202020516a20272903003700000b204a204e6a214a20562001470d010b200541c0026a24000f0b4101211e410121200c060b2032203c203d200a746a222020116a22222900003703002034202020126a22232900003703002036202020136a2225290000370300200520202900003703202021200c6a2224290000212f202120196a222629000021302021201a6a2227290000213120222021201b6a222129000037000020232031370000202520303700002020202f37000020212032290300370000202720342903003700002026203629030037000020242005290320370000203d20066a223d203e200b6a22224f0d010b203c203d200a746a212002400340200541c0016a2020200c109604200b4c0d012020200c6a2120203d20066a223d2022490d000b4102211e0c020b4102211e0c020b4102211e0c020b410121200c020b410121200c010b410121200c000b0bd40608077f027e017f017e017f017e017f017e230041206b22022400024002400240024020014108490d00200141017641feffffff07712203417f6a220420014f0d032001410d74200173220541117620057322054105742005732206417f2001417f6a677622077122054100200120052001491b6b220520014f0d01200020044105746a220441186a22082900002109200020054105746a2205290000210a200541086a220b290000210c200541106a220d290000210e2008200541186a220f290000370000200441106a220829000021102008200e370000200441086a2208290000210e2008200c3700002004290000210c2004200a370000200241186a2009370300200241106a2010370300200241086a200e370300200f2009370000200d2010370000200b200e3700002005200c3700002002200c370300200320014f0d022006410d7420067322054111762005732205410574200573220620077122054100200120052001491b6b220520014f0d01200020034105746a220441186a22082900002109200020054105746a2205290000210a200541086a220b290000210c200541106a220d290000210e2008200541186a220f290000370000200441106a220829000021102008200e370000200441086a2208290000210e2008200c3700002004290000210c2004200a370000200241186a2009370300200241106a2010370300200241086a200e370300200f2009370000200d2010370000200b200e3700002005200c3700002002200c3703002003410172220420014f0d032006410d742006732205411176200573220541057420057320077122054100200120052001491b6b220520014f0d01200020044105746a220141186a22042900002109200020054105746a2200290000210a200041086a2205290000210c200041106a2203290000210e2004200041186a2206290000370000200141106a220429000021102004200e370000200141086a2204290000210e2004200c3700002001290000210c2001200a370000200241186a2009370300200241106a2010370300200241086a200e37030020062009370000200320103700002005200e3700002000200c3700002002200c3703000b200241206a24000f0b41f4a1c100200520011029000b200321040b41e4a1c100200420011029000b970909077f017e037f017e027f017e027f017e047f230041206b220224000240200141324f0d00410121030240200141014d0d00200041206a200041201096044100480d00200041c0006a21044102210503402005220320014f0d01200341016a21052004200441606a41201096042106200441206a2104200641004e0d000b0b200241206a240020032001460f0b200041a07f6a210741012103410021080240024003400240024002400240200320014f0d00200020034105746a210403402004200441606a41201096044100480d02200441206a2104200341016a22032001490d000b0b4100210420032001460d010c020b4101210420032001470d010b200241206a240041010f0b2003417f6a220520014f0d012004450d02200020054105746a22042900002109200420002003410574220a6a220529000037000020052009370000200241186a220b200441186a220c290000220d370300200241106a220e200441106a220f2900002210370300200241086a2211200441086a221229000022133703002012200541086a221429000037000020142013370000200f200541106a221529000037000020152010370000200c200541186a22162900003700002016200d37000020022009370300024020034102490d00200420002003417e6a22064105746a22174120109604417f4a0d002004290000210920042017290000370000200b200c290000370300200e200f290000370300201120122900003703002012201741086a290000370000200f201741106a290000370000200c201741186a290000370000200220093703004100210c02402006450d002007200a6a21040240034020022004412010960441004e0d01200441206a2004290000370000200441386a200441186a290000370000200441306a200441106a290000370000200441286a200441086a290000370000200441606a21042006417f6a22060d000c020b0b2006210c0b2000200c4105746a22042002290300370000200441186a200b290300370000200441106a200e290300370000200441086a20112903003700000b200841016a21080240200120036b220f4102490d00200541206a220420054120109604417f4a0d002005290000210920052004290000370000200b2016290000370300200e2015290000370300201120142900003703002014200441086a2900003700002015200441106a2900003700002016200441186a29000037000020022009370300410121120240200f4103490d00200541c0006a20024120109604417f4a0d00410321064102210c024003402005200c4105746a220441606a2004290000370000200441786a200441186a290000370000200441706a200441106a290000370000200441686a200441086a2900003700002006200f4f0d0120064105742104200c21122006210c200641016a2106200520046a200241201096044100480d000c020b0b200c21120b200520124105746a22042002290300370000200441186a200b290300370000200441106a200e290300370000200441086a20112903003700000b20084105490d000b200241206a240041000f0b41e4a1c100200520011029000b41f4a1c100200320011029000b6f01017f230041306b2202240020022001360204200220003602002002412c6a41023602002002411c6a4102360200200241023602242002420237020c200241b488c5003602082002200241046a360228200220023602202002200241206a360218200241086a41c488c5001061000be308090d7f017e027f017e017f027e017f017e0d7f230041206b2202240002400240024020014101762203450d00417f210441022105410521064120210741002108411821094108210a4110210b4100210c0c010b410021180c010b410121180b0340024002400240024002400240024002400240024002400240024020180e020001010b4102211920014102490d01417f211a4118211b4105211c4108211d4110211e4101211f4120212041002121200121224101210c0c0a0b02400240200c0e020001010b200320046a2203210d0340200d410174221041017221180240201020056a221020014f0d00201820014f0d0620102018200020182006746a200020102006746a20071096042008481b21180b0240201820014f0d00200d20014f0d042000200d2006746a220d200020182006746a2210200710960420044a0d00200d20096a220e290000210f2010200a6a221129000021122010200b6a2213290000211420102900002115200e201020096a2216290000370000200d200b6a220e2900002117200e2014370000200d200a6a220e2900002114200e2012370000200d2900002112200d2015370000200220096a200f3703002002200b6a20173703002002200a6a20143703002016200f370000201320173700002011201437000020102012370000200220123703002018210d0c010b0b20030d07410021180c0c0b2022201a6a222220014f0d052000201b6a220d290000210f20002022201c746a221829000021152018201d6a221029000021122018201e6a220e2900002114200d2018201b6a22112900003700002000201e6a220d2900002117200d20143700002000201d6a220d2900002114200d201237000020002900002112200020153700002002201b6a220c200f3703002002201e6a222320173703002002201d6a222420143703002011200f370000200e20173700002010201437000020182012370000200220123703004100210d0340200d201f742210201f7221180240201020196a221020224f0d00201820224f0d062010201820002018201c746a20002010201c746a20201096042021481b21180b0240201820224f0d00200d20224f0d042000200d201c746a220d20002018201c746a22102020109604201a4a0d00200d201b6a220e290000210f2010201d6a221129000021122010201e6a2213290000211420102900002115200e2010201b6a2216290000370000200d201e6a220e2900002117200e2014370000200d201d6a220e2900002114200e2012370000200d2900002112200d2015370000200c200f37030020232017370300202420143703002016200f370000201320173700002011201437000020102012370000200220123703002018210d0c010b0b2022201f4b0d070b200241206a24000f0b41f8a3c100200d20011029000b41f8a3c100200d20221029000b41e8a3c100201820011029000b41e8a3c100201820221029000b41f4a1c100202220011029000b4100210c0c010b4101210c0c020b410121180c020b410121180c010b410121180c000b0baa23032a7f037e257f230041c0026b2204240002400240024020014115490d004101210541022106410321074132210841052109417f210a4120210b4100210c411f210d410b210e4160210f411821104110211141082112419fc000211341807f211441682115417021164178211741282118413021194138211a4101211b4101211c4100211d0c010b4100211f0c010b4101211f0b0340024002400240024002400240024002400240024002400240024002400240024002400240024002400240201f0e020001010b20014102490d0c41602148200041606a21494101214a4105214b417f214c4120214d4118214e4110214f4108215041002151413821524130215341282154410121554101211d0c010b024002400240201d0e03000d01010b201b201c71211e0c010b203a203d2009746a211f02400340203c203d200a6a223d4f0d01200441c0016a201f200b1096042121201f200f6a2220211f2021200c480d000c100b0b200020042903c0013700002032203729030037000020342038290300370000203620392903003700002001203c20056a221f490d082000201f2009746a21002001201f6b22014115490d020b2003450d090240201b2005710d0020002001108a012003200a6a21030b2001200676221f20076c2120201f200574212141002122024020012008490d00201f201f200a6a22222000201f2009746a200020222009746a200b1096042223200c4822241b2225201f20056a22262022201f20241b221f200020262009746a2000201f2009746a200b109604200c4822261b221f2000201f2009746a200020252009746a200b1096042225200c481b211f20212021200a6a2222200020212009746a200020222009746a200b1096042227200c4822281b22292021200572222a2022202120281b22212000202a2009746a200020212009746a200b1096042228200c481b2221200020212009746a200020292009746a200b1096042229200c481b212120202020200a6a2222200020202009746a200020222009746a200b109604222a200c48222b1b222c202020056a222d20222020202b1b22202000202d2009746a200020202009746a200b1096042222200c481b2220200020202009746a2000202c2009746a200b109604222b200c481b21202006200520241b2023200d7620261b2025200d766a2027200d766a2028200d766a2029200d766a202a200d766a2022200d766a202b200d766a21220b200020212009746a2000201f2009746a200b1096042224200d7620226a200020202009746a2000201f20212024200c4822241b22232009746a200b1096042225200d766a21220240024002402000202020232025200c481b22202009746a20002021201f20241b222b2009746a200b109604200a4a0d00202220056a2222200e4b0d01202245211f0c020b2020212b202245211f0c010b024020012005762220450d00200020012009746a200f6a211f200021210340200441206a20106a2222202120106a2224290000370300200441206a20116a2223202120116a2225290000370300200441206a20126a2226202120126a222729000037030020042021290000370320201f20126a2228290000212e201f20116a2229290000212f201f29000021302024201f20106a222a2900003700002025202f3700002027202e37000020212030370000201f20042903203700002028202629030037000020292023290300370000202a2022290300370000201f200f6a211f2021200b6a21212020200a6a22200d000b0b2001202b200a736a212b4101211f0b0240201e200a73201f45722005710d0020002001108b010d0c0b024002402002450d00202b20014f0d0a20022000202b2009746a221f200b109604200c480d01200441206a20106a2231200020106a2232290000370300200441206a20116a2233200020116a2234290000370300200441206a20126a2235200020126a223629000037030020042000290000370320201f20126a2221290000212e201f20116a2220290000212f201f29000021302032201f20106a22222900003700002034202f3700002036202e37000020002030370000202220312903003700002020203329030037000020212035290300370000201f2004290320370000200441c0016a20106a22372032290000370300200441c0016a20116a22382034290000370300200441c0016a20126a22392036290000370300200420002900003703c0012000200f6a213a2000200b6a213b4100213c41002001223d200a6a22214f0d040c100b2001450d070b202b20014f0d05200441206a20106a221c200020106a223e290000370300200441206a20116a222c200020116a223f290000370300200441206a20126a222d200020126a2240290000370300200420002900003703202000202b2009746a221f290000212e201f20126a2221290000212f201f20116a22202900002130203e201f20106a2222290000370000203f20303700002040202f3700002000202e370000201f20042903203700002021202d2903003700002020202c2903003700002022201c290300370000200420106a2241203e290000370300200420116a2242203f290000370300200420126a22432040290000370300200420002900003703002000200b6a21254100214402402001200a6a2220450d002025211f0340201f2004200b109604200a4a0d01201f200b6a211f204420056a22442020490d000b0b200020012009746a211f2020212102400340201f21222021224520444d0d012045200a6a21212022200f6a221f2004200b109604200c4e0d000b0b20452044490d0420202045490d03418001212b41002123410021294100212441002128418001211b202520442009746a2246212503400240024002400240024002400240202220256b221f20134b22470d00201f200976221f20146a201f2029202349202820244922217222201b211f2020450d01201b201f20211b211b201f202b20211b212b0b20282024470d020c010b201f201f200576221b6b212b20282024470d010b201b450d014100211f200441c0006a222821242025212103402024201f3a0000202420212004200b109604200a73200d766a21242021200b6a2121201b201f20056a221f470d000b0b20292023470d020c010b200441c0006a2224212820292023470d010b0240202b450d002022200f6a211f41002121200441c0016a222921230340202320213a00002023201f2004200b109604200d766a2123201f200f6a211f202b202120056a2221470d000c020b0b200441c0016a222321290b0240202320296b221f202420286b22212021201f4b1b222a450d00201c202520282d00002009746a221f20106a290000370300202c201f20116a290000370300202d201f20126a2900003703002004201f290000370320202520282d00002009746a221f202220292d0000200a732009746a2221290000370000201f20106a202120106a290000370000201f20116a202120116a290000370000201f20126a202120126a2900003700000240202a2005460d004100211f034020222029201f6a22262d0000200a732009746a222120252028201f6a20056a22272d00002009746a2220290000370000202120106a202020106a290000370000202120116a202020116a290000370000202120126a202020126a290000370000202520272d00002009746a22212022202620056a2d0000200a732009746a2220290000370000202120106a202020106a290000370000202120116a202020116a290000370000202120126a202020126a290000370000201f20066a2121201f20056a2220211f2021202a490d000b202920206a2129202820206a21280b202220292d0000200a732009746a221f2004290320370000201f20106a201c290300370000201f20116a202c290300370000201f20126a202d290300370000202920056a2129202820056a21280b2022202b2009746b202220292023461b21222025201b2009746a202520282024461b212520470d000b02400240202820244f0d000340201c20252024200a6a22242d00002009746a222120106a2220290000370300202c202120116a2223290000370300202d202120126a2226290000370300200420212900003703202022200f6a221f290000212e202220156a2227290000212f202220166a222929000021302020202220176a2222290000370000202320303700002026202f3700002021202e370000201f20042903203700002027202d2903003700002029202c2903003700002022201c290300370000201f212220282024490d000c020b0b0240202920234f0d002025211f03402023200a6a22232d00002121201c201f20106a2220290000370300202c201f20116a2224290000370300202d201f20126a22252900003703002004201f29000037032020222021200a732009746a2221290000212e202120126a2226290000212f202120116a222729000021302020202120106a2228290000370000202420303700002025202f370000201f202e370000202120042903203700002026202d2903003700002027202c2903003700002028201c290300370000201f200b6a211f20292023490d000c020b0b2025211f0b203e2041290300370000203f204229030037000020402043290300370000200020042903003700000240024002402001201f20466b20097620446a22214d0d00201c203e290000370300202c203f290000370300202d204029000037030020042000290000370320200020212009746a221f290000212e201f20126a2220290000212f201f20116a22222900002130203e201f20106a2224290000370000203f20303700002040202f3700002000202e370000201f20042903203700002020202d2903003700002022202c2903003700002024201c290300370000200120216b2220450d0120202021202120204b1b212220012007762124201f200b6a21230240024020212020200a6a22014f0d002000202120022003108e01201f2102202321000c010b20232001201f2003108e01202121010b202220244f211b204520444d211c200141154f0d024100211f0c160b41f4a1c100202120011029000b4184a2c100104f000b4100211d4101211f0c130b4101211f0c120b4100211f0c110b4102211d4101211f0c100b20452020108c01000b204420451048000b41f4a1c100202b20011029000b41e4a1c100410041001029000b201f20011048000b419ca2c100202b20011029000b20002001108d01200441c0026a24000f0b2055204b74211f2055204c6a21212055204a6a215502402000201f6a221f20002021204b746a2220204d109604204c4a0d00200441c0016a204e6a2222201f204e6a2224290000370300200441c0016a204f6a2223201f204f6a2225290000370300200441c0016a20506a2226201f20506a22272900003703002004201f2900003703c001201f20202900003700002027202020506a29000037000020252020204f6a29000037000020242020204e6a2900003700004100212002402021450d002049211f02400340200441c0016a201f204d10960420514e0d01201f204d6a201f290000370000201f20526a201f204e6a290000370000201f20536a201f204f6a290000370000201f20546a201f20506a290000370000201f20486a211f2021204c6a22210d000c020b0b202121200b20002020204b746a221f20042903c001370000201f204e6a2022290300370000201f204f6a2023290300370000201f20506a20262903003700000b2049204d6a214920552001470d010b200441c0026a24000f0b4101211d4101211f0c060b2031203b203c2009746a221f20106a22212900003703002033201f20116a22222900003703002035201f20126a22242900003703002004201f2900003703202020200b6a2223290000212e202020186a2225290000212f202020196a2226290000213020212020201a6a2220290000370000202220303700002024202f370000201f202e37000020202031290300370000202620332903003700002025203529030037000020232004290320370000203c20056a223c203d200a6a22214f0d010b203b203c2009746a211f02400340200441c0016a201f200b109604200a4c0d01201f200b6a211f203c20056a223c2021490d000b4102211d0c020b4102211d0c020b4102211d0c020b4101211f0c020b4101211f0c010b4101211f0c000b0bed0b05077f017e027f017e027f23004190026b22022400200241f0016a41186a22034200370300200241f0016a41106a22044200370300200241f0016a41086a22054200370300200242003703f001200241f0016a2001280200220620012802042207412020074120491b22081094041a2001200720086b3602042001200620086a360200024002402007411f4d0d00200241d0016a41186a22072003290300370300200241d0016a41106a22082004290300370300200241d0016a41086a22062005290300370300200220022903f0013703d001200241b0016a41186a2007290300370300200241b0016a41106a2008290300370300200241b0016a41086a2006290300370300200220022903d0013703b001410121070c010b410021070b200241f0016a41186a2208200241b0016a41186a290300370300200241f0016a41106a2206200241b0016a41106a290300370300200241f0016a41086a2203200241b0016a41086a290300370300200220022903b0013703f001024002400240024002402007450d00200241f0006a41186a2008290300370300200241f0006a41106a2006290300370300200241f0006a41086a2003290300370300200220022903f0013703702002200110462002290300a7450d0120022903082109200241f0016a41186a22054200370300200241f0016a41106a220a4200370300200241f0016a41086a220b4200370300200242003703f001200241f0016a20012802002204200141046a22032802002207412020074120491b22081094041a2003200720086b22063602002001200420086a22083602002007411f4d0d02200241d0016a41186a22072005290300370300200241d0016a41106a2204200a290300370300200241d0016a41086a2205200b290300370300200220022903f0013703d00120024190016a41186a200729030037030020024190016a41106a200429030037030020024190016a41086a2005290300370300200220022903d00137039001200241f0016a2006412020064120491b22076a41004100412020076b2007411f4b1b1093041a200241f0016a200820071094041a2003200620076b3602002001200820076a3602002006411f4d0d03200241d0016a41186a2207200241f0016a41186a290300370300200241d0016a41106a2208200241f0016a41106a290300370300200241d0016a41086a2206200241f0016a41086a290300370300200220022903f0013703d001200241b0016a41186a22032007290300370300200241b0016a41106a22072008290300370300200241b0016a41086a22082006290300370300200220022903d0013703b001200241f0016a200110900120022802f0012201450d0420022902f401210c200241d0006a41186a2206200241f0006a41186a290300370300200241d0006a41106a2204200241f0006a41106a290300370300200241d0006a41086a2205200241f0006a41086a290300370300200241306a41086a220a20024190016a41086a290300370300200241306a41106a220b20024190016a41106a290300370300200241306a41186a220d20024190016a41186a290300370300200241106a41086a220e2008290300370300200241106a41106a22082007290300370300200241106a41186a22072003290300370300200220022903703703502002200229039001370330200220022903b0013703102000200c37020c2000200136020820002009370300200041146a20022903503702002000411c6a2005290300370200200041246a20042903003702002000412c6a2006290300370200200041346a20022903303702002000413c6a200a290300370200200041c4006a200b290300370200200041cc006a200d290300370200200041ec006a2007290300370200200041e4006a2008290300370200200041dc006a200e290300370200200041d4006a200229031037020020024190026a24000f0b2000410036020820024190026a24000f0b2000410036020820024190026a24000f0b2000410036020820024190026a24000f0b2000410036020820024190026a24000f0b2000410036020820024190026a24000b9d0d03027f017e137f230041f0006b22022400200241106a2001104502400240024002400240024002400240024002402002280210450d0020022802142203ad42247e2204422088a70d092004a72205417f4c0d092005450d01200510262206450d032003450d020c040b20004100360200200241f0006a24000f0b4104210620030d020b4100210e4100210d0c020b20054104102a000b200241d0006a41046a21072002413d6a2108200241d7006a2109200241e3006a220a41056a210b4100210c2003210d4100210e0340200141046a220f2802002105200241003a0050200241d0006a20012802002210200541004722111094041a02400240024002400240024020052011490d00200f200520116b22123602002001201020116a221336020002400240024002400240024002402005450d004105211120022d0050220541064b0d0a024020050e07000d030d020405000b200241086a200110452002280208450d0a200228020c2210417f4c0d122010450d05201010ac012212450d0820122001280200200f2802002205201020052010491b22051094041a200f28020022132005490d09200f201320056b3602002001200128020020056a36020020052010470d060c0b0b410521110c090b200241d0006a200110a30220022802542210450d0820022d0053211520022f0150210520022d005221112002200241d0006a41086a2903003702442002201036024020052011411074722117410221110c0a0b200241d0006a2012412020124120491b22056a41004100412020056b2005411f4b1b1093041a200241d0006a201320051094041a200f201220056b3602002001201320056a3602002012411f4d0d07200241c0006a41086a200941086a280000360200200220092900003703402002200a2900003703302002200b29000037003520022f0150210520022d0052211120022800532115200841026a200241cd006a41026a2d00003a0000200820022f004d3b0000201541087621142005201141107472211741002111200228024021100c090b200241d0006a200110a30220022802542210450d0620022d0053211520022f0150210520022d005221112002200241d0006a41086a2903003702442002201036024020052011411074722117410321110c080b200241d0006a200110a30220022802542210450d0520022d0053211520022f0150210520022d005221112002200241d0006a41086a2903003702442002201036024020052011411074722117410121110c070b4101211241002010460d050b2010450d03201210230c030b201120051048000b20104101102a000b200520131048000b0c010b200241c0006a41086a2002280250360200200241306a41086a200741086a2902003703002002200729020037033020022010ad22044220862004843703402012410876211441042111201221150b20072002290330370200200741086a200241306a41086a2903003702002002200241c0006a41086a28020036025020114105460d022002280244210f200241186a41106a2212200241d0006a41106a280200360200200241186a41086a2213200241d0006a41086a290200370300200220022902503703180240200e200d470d00200d41016a2205200d490d04200d4101742216200520052016491b2205ad42247e2204422088a70d042004a722164100480d0402400240200d450d002006200d41246c2016102722060d010c070b201610262206450d060b2005210d0b2006200c6a220520113a00002005410c6a200f360200200541086a2010360200200541046a2014410874201541ff017172360200200541036a20174110763a0000200541016a20173b0000200541206a2012280200360200200541186a2013290300370200200541106a2002290318370200200c41246a210c200e41016a220e2003490d000b0b2000200d36020420002006360200200041086a200e360200200241f0006a24000f0b200041003602000240200e450d002006210503400240024020052d0000221141034b0d0002400240024020110e0404000102040b2005410c6a280200450d03200541086a2802001023200541246a2105200c415c6a220c0d040c050b2005410c6a280200450d02200541086a2802001023200541246a2105200c415c6a220c0d030c040b2005410c6a280200450d01200541086a2802001023200541246a2105200c415c6a220c0d020c030b200541086a280200450d00200541046a28020010230b200541246a2105200c415c6a220c0d000b0b0240200d450d00200610230b200241f0006a24000f0b101e000b20164104102a000b101d000bf71c09017f017e037f017e057f037e027f027e027f230041c0006b2200240020004188a4c10041101092012000290308210120002802002102200041306a41086a220342003703002000420037033041f3a6c1004115200041306a1000200041106a41086a2003290300370300200020002903303703100240024002400240024002400240024002400240024002400240024002400240200041106a411041a886c500410041001001417f460d00200041003a0030200041106a4110200041306a41014100100141016a41014d0d0120002d00300d050b410810262204450d0120044200370300200041306a41086a22034200370300200042003703304198a4c1004115200041306a1000200041106a41086a200329030037030020002000290330370310200041003602382000420137033020004101360220200041206a200041306a10412004290300210502400240024020002802342206200028023822076b41084f0d00200741086a22082007490d0820064101742203200820082003491b22094100480d082006450d0120002802302006200910272203450d020c050b200741086a2108200028023021030c050b2009102622030d030b20094101102a000b41d4aac10041331021000b41084108102a000b2000200936023420002003360230200921060b200041306a41086a2008360200200320076a2005370000200041106a411020032008100402402006450d00200310230b20041023024002400240410810262208450d0020084200370300200041306a41086a22034200370300200042003703304188a7c1004116200041306a1000200041106a41086a200329030037030020002000290330370310200041003602382000420137033020004101360220200041206a200041306a10412008290300210502400240024020002802342207200028023822066b41084f0d00200641086a22032006490d0720074101742204200320032004491b22034100480d072007450d0120002802302007200310272204450d020c040b200028023021040c040b2003102622040d020b20034101102a000b41084108102a000b2000200336023420002004360230200321070b200041306a41086a2203200641086a2209360200200420066a2005370000200041106a411020042009100402402007450d00200410230b200810232003420037030020004200370330419ea7c1004110200041306a1000200041106a41086a220420032903003703002000200029033037031020004200370330200041106a4110200041306a41081004200041013a0020200342003703002000420037033041f3a6c1004115200041306a10002004200329030037030020002000290330370310200041106a4110200041206a410110040b4108210a4200210b200041306a41086a22034200370300200042003703304198a4c1004115200041306a1000200041106a41086a200329030037030020002000290330370310024002400240024002400240024002400240200041106a411041a886c500410041001001417f460d00200042103702242000200041106a360220200041306a200041206a1093012000280230220a450d012000290234210b0b410821074200210c200041306a41086a22034200370300200042003703304188a7c1004116200041306a1000200041106a41086a2003290300370300200020002903303703100240200041106a411041a886c500410041001001417f460d00200042103702242000200041106a360220200041306a200041206a10930120002802302207450d022000290234210c0b200041306a41086a220342003703002000420037033041aea7c1004114200041306a1000200041106a41086a20032903003703002000200029033037031002400240200041106a411041a886c500410041001001417f460d0020004200370330200041106a4110200041306a41084100100141016a41084d0d014201200029033022052005501b210d200b422088a7210e20020d050c040b42e500210d200b422088a7210e2002450d030c040b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b200e417f6a2203200e4b0d012003200e4f0d01200a20034103746a2203450d01200329030021010b4100200e41016a2203200da7417f200d428080808010541b6b2204200420034b1b220f200e4b0d01200a200f4103746a21090240024002400240200f450d00200c4220882110200a21020340200229030021054100210302402010a722044101460d002004450d0341002103034020032004410176220820036a22062005200720064103746a290300541b2103200420086b220441014b0d000b0b2005200720034103746a22042903002211520d0320102003ad580d042004200441086a2003417f732010a76a4103741095041a200c42ffffffff0f8320104220864280808080707c84210c2010427f7c2110200241086a22022009470d000b0b200b42ffffffff0f8321100240200e200f6b2203450d000240200f450d00200a200920034103741095041a0b2003ad42208620108421100b410021030240200c4220882205a72202450d00024020024101460d004100210320022104034020032004410176220820036a22062001200720064103746a290300541b2103200420086b220441014b0d000b0b200320032001200720034103746a2903002211566a20012011511b220320024b0d060b2002200ca7470d06200241016a22042002490d072005a722064101742208200420042008491bad220c4203862211422088a70d072011a722044100480d07024002402002450d0020072006410374200410272207450d010c080b2004102622070d070b20044108102a000b4100109401000b200320052011566a109401000b41fcc3c200104f000b41c2a7c10041261021000b41cce3c400104f000b4180e4c400104f000b200720034103746a220441086a2004200220036b4103741095041a2004200137030002402010a72010422088220ba72203470d00200341016a22042003490d0120034101742208200420042008491bad22104203862211422088a70d012011a722044100480d01024002402003450d00200a200341037420041027220a450d010c020b20041026220a0d010b20044108102a000b200a20034103746a20013703002005a7221241016a2213450d052013410176220320134f0d06200720034103746a2903002111024020134101710d002003417f6a220320134f0d08200720034103746a29030020117c42018821110b200041306a41086a220f4200370300200042003703304198a4c1004115200041306a1000200041106a41086a200f2903003703002000200029033037031020004100360238200042013703302000200b42017c2201a72203360220200041206a200041306a1041024002402003450d002003410374210e4100200f28020022036b210420002802342106200a21080340200829030021050240024002400240200620046a41084f0d00200341086a22022003490d0720064101742209200220022009491b22094100480d072006450d01200028023020062009102722020d020c090b200028023021020c020b200910262202450d070b2000200936023420002002360230200921060b200841086a2108200f200341086a2209360200200220036a2005370000200441786a210420092103200e41786a220e0d000c020b0b200f280200210920002802342106200028023021020b200041106a411020022009100402402006450d00200210230b02402010a7450d00200a10230b200041306a41086a220f4200370300200042003703304188a7c1004116200041306a1000200041106a41086a200f29030037030020002000290330370310200042013703302000410036023820002013360220201241037441086a2109200041206a200041306a10414100200028023822036b210420002802342106200721080340200829030021050240024002400240200620046a41084f0d00200341086a22022003490d052006410174220e20022002200e491b220e4100480d052006450d0120002802302006200e102722020d020c060b200028023021020c020b200e10262202450d040b2000200e36023420002002360230200e21060b200841086a2108200f200341086a220e360200200220036a2005370000200441786a2104200e2103200941786a22090d000b200041106a41102002200e100402402006450d00200210230b0240200ca7450d00200710230b42002105200041306a41086a2203420037030020004200370330419ea7c1004110200041306a1000200041106a41086a220420032903003703002000200029033037031020002011370330200041106a4110200041306a410810040240200d200142ffffffff0f83520d00200342003703002000420037033041af98c300410d200041306a100020042003290300370300200020002903303703100240200041106a411041a886c500410041001001417f460d0020004200370330200041106a4110200041306a41084100100141016a41084d0d05200029033021050b200041306a41086a220342003703002000420037033041c0a8c1004117200041306a1000200041106a41086a20032903003703002000200029033037031002400240200041106a411041a886c500410041001001417f460d0020004200370330200041106a4110200041306a41084100100141016a41084d0d07200029033021100c010b42e80721100b2011200d4201887c20107c2005560d00200041306a41086a220342003703002000420037033041aec8c3004117200041306a1000200041106a41086a200329030037030020002000290330370310410810262203450d092003200d427f7c37000020034108411010272203450d0a20032011370008200041106a4110200341101004200310230b200041c0006a24000f0b101e000b200e4101102a000b20094101102a000b41d4aac10041331021000b41d4aac10041331021000b4198a8c100104f000b41b0a8c100200320131029000b41b0a8c100200320131029000b41084101102a000b41104101102a000bbd0104017f017e017f017e230041206b2203240042002104200341106a41086a220542003703002003420037031020012002200341106a1000200341086a2005290300370300200320032903103703000240024002402003411041a886c500410041001001417f460d002003420037031020034110200341106a41084100100141016a41084d0d0220032903102106200341101003420121040c010b0b2000200437030020002006370308200341206a24000f0b41d4aac10041331021000bc10304027f017e087f017e230041106b2202240020022001104a02400240024002400240024002400240024002402002280200450d0020022802042203ad2204421d88a70d032004420386a72205417f4c0d032005450d01200510262206450d042003450d020c050b20004100360200200241106a24000f0b4108210620030d030b410021054100210b0c030b101d000b20054108102a000b200141046a210741002108410021094100210a2003210b034020024200370308200141086a2205410020012802002007280200200241086a410820052802001001220c200c417f461b220c4108200c4108491b20052802006a360200200c41074d0d02200a41016a2105200229030821040240200a200b470d002008200520052008491b220bad420386220d422088a70d04200da7220c4100480d040240200a450d0020062009200c102722060d010c060b200c10262206450d050b200620096a2004370300200841026a2108200941086a21092005210a20052003490d000b0b2000200b36020420002006360200200041086a2005360200200241106a24000f0b200041003602000240200b450d00200610230b200241106a24000f0b101e000b200c4108102a000b7d01017f230041c0006b220124002001412e36020c200141e8a7c100360208200120003602142001413c6a41063602002001412c6a4102360200200141013602342001420237021c2001419083c5003602182001200141146a3602382001200141086a3602302001200141306a360228200141186a41a083c5001061000b1300200041013602042000419ca9c1003602000b8c0605027f027e017f027e027f230041a0016b22022400200028020021000240024002400240024002400240024002400240200128020022034110710d00200041086a29030021042000290300210520034120710d0120054290ce005441002004501b0d0241272100200241186a21060340200241106a200520044290ce0042001097042002200229031022072006290300220842f0b17f427f109804200241206a20006a2203417c6a200520022903007ca7220941e4006e220a41017441ea86c5006a2f00003b00002003417e6a200a419c7f6c20096a41017441ea86c5006a2f00003b0000200542ffc1d72f56210320044200522109200450210a2000417c6a2100200721052008210420032009200a1b0d000b2007a7220341e3004a0d030c060b200041086a2903002105200029030021044180012100024003402000450d01200241206a20006a417f6a2004a7410f712203413072200341d7006a2003410a491b3a00002000417f6a210020044204882005423c8684220420054204882205844200520d000b0b20004181014f0d032001410141d889c5004102200241206a20006a41800120006b1097012100200241a0016a240020000f0b4180012100024003402000450d01200241206a20006a417f6a2005a7410f712203413072200341376a2003410a491b3a00002000417f6a210020054204882004423c8684220520044204882204844200520d000b0b20004181014f0d032001410141d889c5004102200241206a20006a41800120006b1097012100200241a0016a240020000f0b412721002005a7220341e3004c0d030b200241206a2000417e6a22006a2003200341ffff037141e4006e2209419c7f6c6a41ffff037141017441ea86c5006a2f00003b0000200941094a0d030c040b20004180011048000b20004180011048000b2003220941094c0d010b200241206a2000417e6a22006a200941017441ea86c5006a2f00003b00000c010b200241206a2000417f6a22006a200941306a3a00000b2001410141a886c5004100200241206a20006a412720006b1097012100200241a0016a240020000bd70601067f024002400240024002400240024002402001450d00412b418080c4002000280200220641017122011b2107200120056a21082006410471450d010c020b200541016a2108412d2107200028020022064104710d010b410021024101210120002802084101470d010c020b4100210902402003450d002003210a200221010340200920012d000041c00171418001466a2109200141016a2101200a417f6a220a0d000b0b200820036a20096b21084101210120002802084101460d010b20002007200220031082040d012000280218200420052000411c6a28020028020c1102000f0b024002400240024002400240024002402000410c6a280200220920084d0d0020064108710d01200920086b210b410120002d0030220120014103461b2201410371450d0220014102460d03200b21094100210b0c040b20002007200220031082040d072000280218200420052000411c6a28020028020c1102000f0b41012101200041013a00302000413036020420002007200220031082040d06200920086b21084101200041306a2d0000220120014103461b2201410371450d0320014102460d0420082109410021080c050b410021090c010b200b4101762109200b41016a410176210b0b417f2101200041046a210a200041186a21082000411c6a210602400340200141016a220120094f0d012008280200200a2802002006280200280210110300450d000b41010f0b200041046a280200210a4101210120002007200220031082040d03200041186a2209280200200420052000411c6a220328020028020c1102000d0320092802002100417f2109200328020041106a21030340200941016a2209200b4f0d05410121012000200a2003280200110300450d000c040b0b410021090c010b20084101762109200841016a41017621080b417f2101200041046a210a200041186a21032000411c6a210202400340200141016a220120094f0d012003280200200a2802002002280200280210110300450d000b41010f0b200041046a280200210a41012101200041186a2209280200200420052000411c6a220328020028020c1102000d0020092802002100417f2109200328020041106a21030340200941016a220920084f0d03410121012000200a2003280200110300450d000b0b20010f0b41000f0b41000b11002000280200200028020420011099010b951102167f017e230041206b22032400410121040240200228021841222002411c6a2802002802101103000d00024002402001450d00200020016a2105200241186a21062002411c6a210720002108410021094100210a024003402008210b200841016a210c024002400240024002400240024002400240024020082c0000220d4100480d00200d41ff0171210d0c010b024002400240200c2005460d00200c2d0000413f71210e200841026a2208210c200d411f71210f200d41ff0171220d41e001490d010c020b4100210e20052108200d411f71210f200d41ff0171220d41e0014f0d010b200e200f41067472210d0c010b0240024020082005460d00200841016a220c211020082d0000413f71200e41067472210e200d41f001490d010c030b200521104100200e41067472210e200d41f0014f0d020b200e200f410c7472210d0b200c21084102210c200d41776a220f411e4d0d010c020b0240024020102005460d00201041016a210820102d0000413f71210d0c010b4100210d200c21080b200e410674200f411274418080f0007172200d72220d418080c400460d084102210c200d41776a220f411e4b0d010b41f400210e024002400240200f0e1f07010505000505050505050505050505050505050505050505040505050504070b41f200210e0c010b41ee00210e0b0c040b200d41dc00470d010b0c010b0240200d1086040d0002400240200d41ffff034b0d00200d4180fe0371410876211141a098c5002112410021134100210c0c010b0240200d41ffff074b0d00200d4180fe0371410876211641db9dc5002117410021184101210c0c010b200d41ef83384b0d01200d41e28b746a41e28d2c490d01200d419fa8746a419f18490d01200d41dee2746a410e490d01200d41feffff0071419ef00a460d01200d41a9b2756a4129490d01200d41cb91756a410a4d0d010c040b0240034002400240200c0e020001010b201241026a2114201320122d0001220c6a2110024002400240024002400240024020122d0000220e2011470d0020102013490d06201041b0024f0d05201341f098c5006a210e0340200c450d02200c417f6a210c200e2d0000210f200e41016a210e200f200d41ff0171470d000c0b0b0b200e20114b0d012010211320142112201441f098c500470d030c010b2010211320142112201441f098c500470d010b200d41ffff0371210e419f9bc500210c4101210f02400340200c41016a211002400240200c2d000022144118744118752215417f4c0d002010210c200e20146b220e4100480d030c010b0240201041db9dc500460d00200c41016a2110200c41026a210c200e201541ff007141087420102d0000726b220e41004e0d010c030b41b88ac500104f000b200f410173210f200c41db9dc500470d000b0b200f410171450d070c0a0b4100210c0c040b4100210c0c030b201041af02108c01000b201320101048000b201741026a2114201820172d0001220c6a211002400240024002400240024020172d0000220e2016470d0020102018490d072010419f014f0d052018419d9ec5006a210e0340200c450d02200c417f6a210c200e2d0000210f200e41016a210e200f200d41ff0171470d000c090b0b200e20164b0d0120102118201421172014419d9ec500470d030c010b20102118201421172014419d9ec500470d010b200d41ffff0371210e41bb9fc500210c4101210f02400340200c41016a211002400240200c2d000022144118744118752215417f4c0d002010210c200e20146b220e4100480d030c010b0240201041b8a2c500460d00200c41016a2110200c41026a210c200e201541ff007141087420102d0000726b220e41004e0d010c030b41b88ac500104f000b200f410173210f200c41b8a2c500470d000b0b200f410171450d050c080b4101210c0c020b4101210c0c010b0b2010419e01108c01000b201820101048000b200d41017267410276410773ad4280808080d0008421194103210c0b200d210e0b2003200136020420032000360200200320093602082003200a36020c02400240200a2009490d0002402009450d0020092001460d00200920014f0d01200020096a2c000041bf7f4c0d010b0240200a450d00200a2001460d00200a20014f0d012000200a6a2c000041bf7f4c0d010b2006280200200020096a200a20096b200728020028020c1102000d0103400240024002400240024002400240200c4101460d0041dc0021090240200c4102460d00200c4103470d062019422088a741ff0171417f6a220c41044b0d060240200c0e050006040503000b201942ffffffff8f608321194103210c41fd0021090c070b4101210c0c060b4100210c200e21090c050b201942ffffffff8f60834280808080c0008421194103210c0c040b201942ffffffff8f60834280808080208421194103210c41fb0021090c030b201942ffffffff8f60834280808080308421194103210c41f50021090c020b200e2019a7220f410274411c7176410f71220c413072200c41d7006a200c410a491b21090240200f450d002019427f7c42ffffffff0f832019428080808070838421194103210c0c020b201942ffffffff8f60834280808080108421194103210c0c010b4101210c0240200d418001490d004102210c200d418010490d0041034104200d41808004491b210c0b200c200a6a2109200a200b6b20086a210a20052008470d050c060b200628020020092007280200280210110300450d000b200341206a240041010f0b20032003410c6a3602182003200341086a36021420032003360210200341106a108a04000b200341206a240041010f0b200a200b6b20086a210a20052008470d000b0b2009450d0120092001460d010240200920014f0d00200020096a2c000041bf7f4a0d020b2000200120092001108304000b410021090b200241186a220c280200200020096a200120096b2002411c6a220a28020028020c1102000d00200c2802004122200a28020028021011030021040b200341206a240020040bc9bb02092b7f017efa017f027e7d7f017e797f027e057f230041e0006b22032400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d0000417f6a2204410d4b0d00024020040e0e00090607030a0c080e050d02040b000b200141186a2802002105200141146a2802002106200141106a28020021072001410c6a2802002108200141086a2802002109200141046a280200210a200241046a280200200241086a2802002204470d16200441016a220b2004490d5a2004410174220c200b200b200c491b220c4100480d5a2004450d2d20022802002004200c1027220b450d2e0c570b2001410c6a280200210b200141086a2802002107200141046a280200210520012d0001210d200241046a280200200241086a2802002204470d0d200441016a22062004490d592004410174220e20062006200e491b220e4100480d592004450d1c20022802002004200e10272206450d1d0c540b2001410c6a280200210f200141086a2802002110200141046a2802002111200241046a280200200241086a2802002204470d0d200441016a220b2004490d5920044101742205200b200b2005491b22054100480d592004450d1d2002280200200420051027220b450d1e0c510b2001410c6a2802002112200141086a2802002113200141046a2802002114200241046a280200200241086a2802002204470d0d200441016a220b2004490d5720044101742205200b200b2005491b22054100480d572004450d1e2002280200200420051027220b450d1f0c4e0b200141146a2802002115200141106a28020021162001410c6a2802002117200141086a2802002118200141056a2d00002119200141046a2d0000211a200241046a280200200241086a2802002204470d0d200441016a220b2004490d5720044101742205200b200b2005491b22054100480d572004450d1f2002280200200420051027220b450d200c4b0b2001410c6a280200211b200141086a280200211c200141046a280200211d200241046a280200200241086a2802002204470d0d200441016a220b2004490d5520044101742205200b200b2005491b22054100480d552004450d202002280200200420051027220b450d210c480b2001410c6a2802002106200141086a280200211e200141046a280200211f200241046a280200200241086a2802002204470d0d200441016a220b2004490d5420044101742205200b200b2005491b22054100480d542004450d212002280200200420051027220b450d220c450b2001410c6a2802002106200141086a2802002120200141046a2802002121200241046a280200200241086a2802002204470d0d200441016a220b2004490d5320044101742205200b200b2005491b22054100480d532004450d222002280200200420051027220b450d230c420b2001410c6a2802002106200141086a2802002122200141046a2802002123200241046a280200200241086a2802002204470d0d200441016a220b2004490d5220044101742205200b200b2005491b22054100480d522004450d232002280200200420051027220b450d240c3f0b2001410c6a2802002106200141086a2802002124200141046a2802002125200241046a280200200241086a2802002204470d0e200441016a220b2004490d5120044101742205200b200b2005491b22054100480d512004450d262002280200200420051027220b450d270c3c0b2001410c6a2802002126200141086a2802002127200141046a2802002128200241046a280200200241086a2802002204470d0e200441016a220b2004490d5020044101742205200b200b2005491b22054100480d502004450d272002280200200420051027220b450d280c390b200141286a2802002108200141246a2802002129200141206a280200212a2001411c6a280200212b200141186a280200212c200141146a280200212d2001410c6a290200212e200141086a280200212f200141046a2802002130200241046a280200200241086a2802002231470d0e203141016a22042031490d5020314101742232200420042032491b22324100480d502031450d2820022802002031203210272204450d290c360b2001410c6a2802002133200141086a2802002134200141046a2802002135200241046a280200200241086a2802002204470d0e200441016a220b2004490d4e20044101742205200b200b2005491b22054100480d4e2004450d292002280200200420051027220b450d2a0c330b2001410c6a2802002136200141086a2802002137200141046a2802002138200241046a280200200241086a2802002204470d0e200441016a220b2004490d4e20044101742205200b200b2005491b22054100480d4e2004450d2a2002280200200420051027220b450d2b0c300b200141046a2802002104200241046a280200200241086a280200220b470d0e200b41016a2205200b490d4c200b4101742206200520052006491b22064100480d4c200b450d2b2002280200200b200610272205450d2c0c2d0b200228020021060c470b2002280200210b0c440b2002280200210b0c410b2002280200210b0c3e0b2002280200210b0c3b0b2002280200210b0c380b2002280200210b0c350b2002280200210b0c320b2002280200210b0c410b2002280200210b0c2e0b2002280200210b0c2b0b200228020021040c280b2002280200210b0c250b2002280200210b0c220b200228020021050c1f0b200e102622060d370b200e4101102a000b20051026220b0d330b20054101102a000b20051026220b0d2f0b20054101102a000b20051026220b0d2b0b20054101102a000b20051026220b0d270b20054101102a000b20051026220b0d230b20054101102a000b20051026220b0d1f0b20054101102a000b20051026220b0d1b0b20054101102a000b200c1026220b0d290b200c4101102a000b20051026220b0d150b20054101102a000b20051026220b0d110b20054101102a000b2032102622040d0d0b20324101102a000b20051026220b0d090b20054101102a000b20051026220b0d050b20054101102a000b2006102622050d010b20064101102a000b20022005360200200241046a2006360200200241086a280200210b0b200241086a200b41016a3602002005200b6a41083a00004101210e410021064100210b024002400240024003400240200b2006470d0020064101742205200641016a220720072005491b22054100480d23024002402006450d00200e200620051027220e0d010c040b20051026220e450d030b200521060b200e200b6a200441807f72200441ff0071200441077622051b3a0000200b41016a210b2005210420050d000b200b417f6a2109200241086a2107200241046a2139200b210503400240024002400240203928020020072802002204470d00200441016a220d2004490d2620044101742208200d200d2008491b22084100480d262004450d012002280200200420081027220d0d020c060b2002280200210d0c020b20081026220d450d040b2002200d36020020392008360200200728020021040b2007200441016a360200200d20046a200541807f72200541ff0071200541077622041b3a00002004210520040d000b0240200241046a2802002205200241086a28020022046b20094d0d00200228020021050c040b2004200b6a22072004490d2120054101742204200720072004491b22044100480d21024002402005450d0020022802002005200410272205450d010c040b2004102622050d030b20044101102a000b20054101102a000b20084101102a000b20022005360200200241046a2004360200200241086a28020021040b200241086a2004200b6a360200200520046a200e200b1094041a4101213902402006450d00200e10230b4101210e4101210d410621040c1c0b2002200b360200200241046a2005360200200241086a28020021040b41012196024108219702200241086a200441016a360200200b20046a410a3a000041002198022003412c6a229902410036020020034201370224200320023602202038203641186c6a219a024107219b0241ff00219c0241807f219d024100219e024100219f02203621a0020240024041004100460d00411621450c010b41152145410e21040c1b0b410e21040c1a0b2002200b360200200241046a2005360200200241086a28020021040b41012189024108218a02200241086a200441016a360200200b20046a41063a00004100218b02200341dc006a228c0241003602002003420137025420032002360250203520334104746a218d024107218e0241ff00218f0241807f2190024100219102410021920220332193020240024041004100460d00411221450c010b41112145410e21040c190b410e21040c180b20022004360200200241046a2032360200200241086a28020021310b200241086a203141016a360200200420316a41003a0000202e422088a72106410121324100210b4100213141002104202ea722880221050240024002400340024020312004470d00200441016a220b2004490d1d20044101742207200b200b2007491b220b4100480d1d024002402004450d0020322004200b102722320d010c040b200b10262232450d030b200b21040b203220316a200541807f72200541ff0071200541077622071b3a0000203141016a21312007210520070d000b200420316b2088024f0d0220312088026a220b2031490d1b20044101742205200b200b2005491b220b4100480d1b024002402004450d0020322004200b10272232450d010c030b200b102622320d020b200b4101102a000b200b4101102a000b200b21040b203220316a20302088021094041a0240202f450d0020301023200b21040b20880220316a2131024002400240024002400340024020312004470d00200441016a220b2004490d1f20044101742205200b200b2005491b220b4100480d1f024002402004450d0020322004200b102722320d010c040b200b10262232450d030b200b21040b203220316a200641807f72200641ff0071200641077622051b3a0000203141016a21312005210620050d000b024002400240202d450d00202b210503400240024002400240200b2031470d00200b41016a2231200b490d25200b4101742204203120312004491b22044100480d25200b450d012032200b2004102722320d020c090b200b21040c020b200410262232450d070b200b21312004210b0b203220316a200541807f72200541ff0071200541077622061b3a0000203141016a21312006210520060d000b200420316b202b4f0d062031202b6a220b2031490d2020044101742205200b200b2005491b220b4100480d202004450d0120322004200b10272232450d020c050b200b21044101212f0c060b200b102622320d030b200b4101102a000b200b4101102a000b20044101102a000b200b21040b203220316a202d202b1094041a2031202b6a21314100212f202c450d00202d10230b202a20084104746a21302008210b024002400340024002400240024020042031470d00200441016a22312004490d1f20044101742205203120312005491b222b4100480d1f2004450d0120322004202b102722320d020c050b2004212b0c020b202b10262232450d030b20042131202b21040b203220316a200b41807f72200b41ff0071200b41077622051b3a0000203141016a21312005210b20050d000b02402008450d0041102184034108218503410c218603417f218703410621880341012189034100218a034107218b0341ff00218c0341807f218d034102218e034103218f0341c00021900341ff0121910341042192034105219303202a218802412121450c020b202a218802410821040c180b202b4101102a000b410e21040c160b2002200b360200200241046a2005360200200241086a28020021040b200241086a200441016a360200200b20046a41053a000020282026410c6c6a21f9014100210b410021fa01410021fb01410121fc0120262104024002400340024020fa0120fb01470d00200b20fa0141016a22052005200b491b22fb014100480d190240200b450d0020fc0120fa0120fb01102722fc010d010c030b20fb01102622fc01450d020b20fc0120fa016a200441807f72200441ff0071200441077622051b3a0000200b41026a210b20fa0141016a21fa012005210420050d000b02402026450d00410c21fd01410221fe01410121ff01410821800241002181024104218202410721830241ff0021840241807f2185022028218602411021450c020b2028218702410721040c160b20fb014101102a000b410e21040c140b2002200b360200200241046a2005360200200241086a28020021040b200241086a200441016a360200200b20046a41013a0000202520064104746a21e9014100210b410021ea01410021eb01410121ec0120062104024002400340024020ea0120eb01470d00200b20ea0141016a22052005200b491b22eb014100480d170240200b450d0020ec0120ea0120eb01102722ec010d010c030b20eb01102622ec01450d020b20ec0120ea016a200441807f72200441ff0071200441077622051b3a0000200b41026a210b20ea0141016a21ea012005210420050d000b02402006450d00411021ed01410521ee01410121ef01410021f001410421f101410221f201410721f30141ff0021f40141807f21f501410321f601202521f701410f21450c020b202521f801410521040c140b20eb014101102a000b410e21040c120b2002200b360200200241046a2005360200200241086a28020021040b200241086a200441016a360200200b20046a41073a00002023200641146c6a21d9014100210b410021da01410021db01410121dc0120062104024002400340024020da0120db01470d00200b20da0141016a22052005200b491b22db014100480d150240200b450d0020dc0120da0120db01102722dc010d010c030b20db01102622dc01450d020b20dc0120da016a200441807f72200441ff0071200441077622051b3a0000200b41026a210b20da0141016a21da012005210420050d000b02402006450d00411421dd01410421de01410121df01411021e001410721e10141ff0021e20141807f21e301410021e401410221e501202321e601410e21450c020b202321e701410421040c120b20db014101102a000b410e21040c100b2002200b360200200241046a2005360200200241086a28020021040b200241086a200441016a360200200b20046a41033a0000202120064102746a21cd014100210b410021ce01410021cf01410121d001200621040240024002400340024020ce0120cf01470d00200b20ce0141016a22052005200b491b22cf014100480d140240200b450d0020d00120ce0120cf01102722d0010d010c030b20cf01102622d001450d020b20d00120ce016a200441807f72200441ff0071200441077622051b3a0000200b41026a210b20ce0141016a21ce012005210420050d000b2006450d01410121d101410721d20141ff0021d30141807f21d401410021d501410221d601410421d701202121d801410d21450c020b20cf014101102a000b410121040c0f0b410e21040c0e0b2002200b360200200241046a2005360200200241086a28020021040b200241086a200441016a360200200b20046a41023a0000201f200641286c6a21aa014100210b410021ab01410021ac01410121ad0120062104024002400340024020ab0120ac01470d00200b20ab0141016a22052005200b491b22ac014100480d110240200b450d0020ad0120ab0120ac01102722ad010d010c030b20ac01102622ad01450d020b20ad0120ab016a200441807f72200441ff0071200441077622051b3a0000200b41026a210b20ab0141016a21ab012005210420050d000b02402006450d00412821ae01410421af01412421b001412021b101411c21b201411a21b301411921b401411421b501411021b601410721b70141ff0021b80141807f21b901410121ba01410021bb01410221bc0141f00021bd01410321be01417f21bf01413f21c00141c00021c10141ff0121c201201f21c301410c21450c020b201f21c301410321040c0e0b20ac014101102a000b410e21040c0c0b2002200b360200200241046a2005360200200241086a28020021040b41012181014108218201200241086a200441016a360200200b20046a41093a00004100218301200341dc006a22840141003602002003420137025420032002360250201d201b411c6c6a218501410721860141ff0021870141807f21880141002189014100218a01201b218b010240024041004100460d00410821450c010b41072145410e21040c0b0b410e21040c0a0b2002200b360200200241046a2005360200200241086a28020021040b4101216d200241086a200441016a3602004100216e200b20046a41003a0000024002400240024002400240024041041026226f450d00206f41eec2b5ab063600000240024002400240024002400240201a4101460d000240201a4102460d002018217020172171201621724101217341012174201a4103460d0e41012170410021044100210b20162105034002400240024002402004200b470d00200441016a220b2004490d1e20044101742206200b200b2006491b22714100480d1e2004450d01207020042071102722700d020c0b0b200421710c020b207110262270450d090b2004210b207121040b2070200b6a200541807f72200541ff0071200541077622061b3a0000200b41016a210b2006210520060d000b2071200b6b20164f0d0d200b20166a2204200b490d1920714101742205200420042005491b22044100480d192071450d0420702071200410272270450d050c0c0b2003410036024820034201370340200341c8006a2194034101210741002105410021042018210b0340024020042005470d00200541016a22062005490d1a20054101742208200620062008491b22064100480d1a024002402005450d00200720052006102722070d010c0a0b200610262207450d090b2003200636024420032007360240200621050b209403200441016a2208360200200720046a200b41807f72200b41ff0071200b41077622061b3a0000200821042006210b20060d000b201720154104746a2194032018450d0120172195032015450d0220940341706a2196034100219703410121980341102199034104219a03417f219b034108219c034107219d0341ff00219e0341807f219f03411a21a003200341dc006a21a103410021a203201821a303201721a403410621450c0a0b4100216d2003410036024820034201370340200341086a410c6a2015360200200341086a41086a20163602002003201736020c20032018360208200341d0006a200341086a200341c0006a109b01024020032d00502279411a470d00200341c0006a41086a2802002172200328024421712003280240217041012173410021744100216e41012119410121754101102622760d080c190b200341d0006a41086a35020021a803200328025421a90320032d005321a50320032d005221a60320032d005121a703200341d0006a410c6a350200422086212e02402003280244450d00200328024010230b202e20a8038421a803410b21040c150b20172195030b209503209403460d06410c21040c130b2004102622700d070b20044101102a000b20714101102a000b20064101102a000b41044101102a000b410021040c0d0b410d21040c0c0b410e21040c0b0b200421710b2070200b6a201820161094041a200b20166a21724101216d02402017450d00201810230b41002174410121734101216e410021190b41012175410110262276450d0b410021040c080b2002200b360200200241046a2005360200200241086a28020021040b200241086a200441016a360200200b20046a41043a000020142012410c6c6a215d4100210b4100215e4100215f41012160201221040240024003400240205e205f470d00200b205e41016a22052005200b491b225f4100480d0b0240200b450d002060205e205f102722600d010c030b205f10262260450d020b2060205e6a200441807f72200441ff0071200441077622051b3a0000200b41026a210b205e41016a215e2005210420050d000b02402012450d00410c21614102216241082163410121644100216541f0002166410421674107216841ff00216941807f216a2014216b410521450c020b2014216c410221040c080b205f4101102a000b410e21040c060b2002200b360200200241046a2005360200200241086a28020021040b4101213a4108213b200241086a200441016a360200200b20046a410b3a00004100213c200341dc006a223d410036020020034201370254200320023602502011200f411c6c6a213e4107213f41ff00214041807f21414100214241002143200f21440240024041004100460d00410121450c010b41002145410e21040c050b410e21040c040b20022006360200200241046a200e360200200241086a28020021040b200241086a220e200441016a360200200620046a200d3a000002400240024002400240200241046a2802002206200e28020022046b200b4f0d002004200b6a220d2004490d0820064101742204200d200d2004491b22044100480d082006450d0120022802002006200410272206450d020c030b200228020021060c030b2004102622060d010b20044101102a000b20022006360200200241046a2004360200200241086a28020021040b200241086a2004200b6a360200200620046a2005200b1094041a4100210e4101213902402007450d00200510230b4101210d410621040c020b2002200b360200200241046a200c360200200241086a28020021040b4101210c200241086a200441016a360200410021e801200b20046a41003a00002003411c6a2005360200200341186a200636020020032007360214200320083602102003200936020c2003200a360208200341d0006a200341086a2002109c01200320032900513703402003200341d0006a41086a29000037004702400240024020032d00502204411a470d004101210e410021394101210d0c010b20002003290340370001200020043a0000200041086a20032900473700000c010b410621040c010b410a21040b0340024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040e0f000102030405060708090a2324252c2c0b207620193a0000410121044101210b20722105034002400240024002402004200b470d00200420756a220b2004490d8c0220042075742206200b200b2006491b22774100480d8c022004450d01207620042077102722760d020c2e0b200421770c020b207710262276450d2c0b2004210b207721040b2076200b6a200541807f72200541ff0071200541077622061b3a0000200b20756a210b2006210520060d000b2077200b6b20724f0d1c200b20726a2204200b490d870220774101742205200420042005491b22044100480d87022077450d1a20762077200410272276450d1d0c1b0b02402020450d00202110230b200241086a2105200241046a210720ce01210b03400240024002400240200728020020052802002204470d00200441016a22062004490d8a022004410174220d20062006200d491b220d4100480d8a022004450d0120022802002004200d102722060d020c290b200228020021060c020b200d10262206450d270b200220063602002007200d360200200528020021040b2005200441016a360200200620046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b0240200241046a280200220b200241086a28020022046b20ce014f0d00200420ce016a22052004490d8602200b4101742204200520052004491b22044100480d8602200b450d122002280200200b20041027220b450d150c130b2002280200210b0c130b20142012410c6c6a206c6b2104024003402004450d01200441746a2104206c280204210b206c410c6a216c200b4102470d000b0b02402013450d00201410230b200241086a2105200241046a2107205e210b03400240024002400240200728020020052802002204470d00200441016a22062004490d89022004410174220d20062006200d491b220d4100480d89022004450d0120022802002004200d102722060d020c290b200228020021060c020b200d10262206450d270b200220063602002007200d360200200528020021040b2005200441016a360200200620046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b0240200241046a280200220b200241086a28020022046b205e4f0d002004205e6a22052004490d8502200b4101742204200520052004491b22044100480d8502200b450d0d2002280200200b20041027220b450d100c0e0b2002280200210b0c0e0b20c30120aa01460d9101034020c30141186a2d00004104460d920120c30141106a280200210420c301410c6a280200210b024020c30141046a280200450d0020c30128020010230b02402004450d00200b10230b20c30141286a22c30120aa01470d000c92010b0b20e70120d901460d8f01034020e701410c6a2802004104460d9001024020e70141046a280200450d0020e70128020010230b20e70141146a22e70120d901470d000c90010b0b20f80120e901460dd801034020f801410d6a2d00004105460dd901024020f80141046a280200450d0020f80128020010230b20f80141106a22f80120e901470d000cd9010b0b410121c4010c8f010b20282026410c6c6a2087026b2104024003402004450d01200441746a2104208702280204210b208702410c6a218702200b4102470d000b0b02402027450d00202810230b200241086a2105200241046a210720fa01210b03400240024002400240200728020020052802002204470d00200441016a22062004490d84022004410174220d20062006200d491b220d4100480d84022004450d0120022802002004200d102722060d020c250b200228020021060c020b200d10262206450d230b200220063602002007200d360200200528020021040b2005200441016a360200200620046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b0240200241046a280200220b200241086a28020022046b20fa014f0d00200420fa016a22052004490d8002200b4101742204200520052004491b22044100480d8002200b450d042002280200200b20041027220b450d070c050b2002280200210b0c050b024003402030208802460d01208802280200210420880241106a21880220044108470d000b0b02402029450d00202a10230b200241086a2105200241046a21072031210b03400240024002400240200728020020052802002204470d00200441016a22062004490d84022004410174220d20062006200d491b220d4100480d84022004450d0120022802002004200d102722060d020c250b200228020021060c020b200d10262206450d230b200220063602002007200d360200200528020021040b2005200441016a360200200620046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b0240200241046a280200220b200241086a28020022046b20314f0d00200420316a22052004490d8002200b4101742204200520052004491b22044100480d8002200b450d0f2002280200200b20041027220b450d120c100b2002280200210b0c100b02402034450d00203510230b200341d0006a41086a2802002145200328025421082003280250220541046a210d200341dc006a2802002239210b03400240024002400240200d280200200541086a22072802002204470d00200441016a22062004490d82022004410174220e20062006200e491b220e4100480d82022004450d0120052802002004200e102722060d020c260b200528020021060c020b200e10262206450d240b20052006360200200d200e360200200728020021040b2007200441016a360200200620046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b0240200541046a280200220b200541086a28020022046b20394f0d00200420396a22062004490dfe01200b4101742204200620062004491b22044100480dfe01200b450d162005280200200b20041027220b450d190c170b2005280200210b0c170b410121050c6f0b20041026220b450d020b2002200b360200200241046a2004360200200241086a28020021040b200241086a200420fa016a360200200b20046a20fc0120fa011094041a4100210841012139024020fb01450d0020fc0110230b4101210e4101210d410121c401410121cc01410121070c8b010b20044101102a000b20041026220b450d020b2002200b360200200241046a2004360200200241086a28020021040b200241086a2004205e6a360200200b20046a2060205e1094041a41002107410121390240205f450d00206010230b4101210e4101210d410121c401410121cc010c86010b20044101102a000b20041026220b450d020b2002200b360200200241046a2004360200200241086a28020021040b200241086a200420ce016a360200200b20046a20d00120ce011094041a410021cc0141012139024020cf01450d0020d00110230b4101210e4101210d410121c4010c81010b20044101102a000b20041026220b450d020b2002200b360200200241046a2004360200200241086a28020021040b200241086a200420316a360200200b20046a203220311094041a0240202b450d00203210230b410021c901410121390240202d450d00202f450d00202c450d00202d10230b4101210e4101210d410121c401410121cc0141012107410121084101214541012105410121094101210b4101210a410121060ccf010b20044101102a000b200410262276450d020b200421770b2076200b6a207020721094041a02402071450d00207010230b200b20726a2178024002400240201a450d000240201a4101460d00201a4102470d02411a21792073450d692015450d684104217a201720154104746a217b4110217c410c217d4108217e4174217f2017218001412521450c130b411a2179206d450d682015450d672015410c6c210b201721040340024020042802002205450d00200441046a280200450d00200510230b2004410c6a2104200b41746a220b0d000c680b0b411a2179201745206e720d670c010b411a21792017452074720d660b201810230c650b20044101102a000b20041026220b450d020b2005200b360200200541046a2004360200200541086a28020021040b200541086a200420396a360200200b20046a200820391094041a02402045450d00200810230b41002145410121394101210e4101210d410121c401410121cc0141012107410121080c780b20044101102a000b4100217741012176410021780c600b4110218f04410c21900441742191044104219204412321450c090b02402016450d00201710230b200341c8006a2802002172200328024421712003280240217041022119410021734101216d410021744100216e410121754101102622760d140ce3010b200d4101102a000b200d4101102a000b200d4101102a000b200d4101102a000b20774101102a000b200e4101102a000b024002400240024002400240024002400240024002400240024002400240024002400240024020450e280100030562076b0a090c0e5d0f101112bf01b201b3016766a801a90187018601797877765958575675555453085251510b200328025421040c010b2042203a6a22042042490dec012042203a74220b20042004200b491b220b203c480dec01024002402042450d0020032802542042200b102722040d010c3f0b200b10262204450d3e0b200341d0006a203b6a200b36020020032004360254203d28020021430b203d2043203a6a360200200420436a204420417220442040712044203f7622041b3a000002402004450d0020042144200341d0006a203b6a2802002242203d2802002243470d29410021450c180b20112146200f450d01411c214741182148411421494108214a4107214b41ff00214c41807f214d200341dc006a214e4101214f41002150411a215120112152410221450c160b205220476a214620522802042209450d00205220486a2802002108205220496a280200210a2052204a6a290200212e2052280200210b2052280210214503400240024002400240200341d0006a204a6a2205280200204e2802002204470d002004204f6a22062004490def012004204f742207200620062007491b22072050480def012004450d01200328025420042007102722060d020c4a0b200328025421060c020b200710262206450d480b2005200736020020032006360254204e28020021040b204e2004204f6a360200200620046a200b204d72200b204c71200b204b7622041b3a00002004210b20040d000b2003202e37024420032009360240200341086a200341c0006a200341d0006a109d0120032d000822532051470d5f2008210b034002400240024002402005280200204e2802002204470d002004204f6a22062004490def012004204f742207200620062007491b22072050480def012004450d01200328025420042007102722060d020c480b200328025421060c020b200710262206450d460b2005200736020020032006360254204e28020021040b204e2004204f6a360200200620046a200b204d72200b204c71200b204b7622041b3a00002004210b20040d000b02400240024002402005280200220b204e28020022046b20084f0d00200420086a22062004490dee01200b204f742204200620062004491b22042050480dee01200b450d012003280254200b20041027220b0d020c350b2003280254210b0c020b20041026220b450d330b200520043602002003200b360254204e28020021040b204e200420086a360200200b20046a204520081094041a0240200a450d00204510230b204621522046203e470d260c020b2046203e460d01411c215441142155410c21564108215741042158411021594109215a41ffffffff03215b4170215c410321450c130b20462802042205450d00204620556a2802002106204620576a2802002107204628021021080240204620566a2802002204450d002004205874210b200521040340024020042d0000205a470d00200420576a280200205b71450d00200420586a28020010230b200420596a2104200b205c6a220b0d000b0b02402007450d00200510230b204620546a214602402006450d00200810230b2046203e470d230b02402010450d00201110230b200341d0006a41086a2802002145200328025421082003280250220541046a210d200341dc006a2802002239210b03400240024002400240200d280200200541086a22062802002204470d00200441016a22072004490dec012004410174220e20072007200e491b220e4100480dec012004450d0120052802002004200e102722070d020c3b0b200528020021070c020b200e10262207450d390b20052007360200200d200e360200200628020021040b2006200441016a360200200720046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b200541046a280200220b200541086a28020022046b20394f0d7d200420396a22062004490de701200b4101742204200620062004491b22044100480de701200b450d532005280200200b20041027220b450d550c540b206b20616a216c206b28020422092062460d16206b20636a2802002107206b2802002104024002400240205f205e470d00205e20646a220b205e490de801205e2064742205200b200b2005491b220b2065480de801205e450d012060205e200b102722600d020c370b205f210b0c010b200b10262260450d350b2060205e6a20663a00000240024002400240200b205e20646a2205470d00200b20646a2205200b490de901200b206474225e20052005205e491b225f2065480de901200b450d012060200b205f102722600d020c370b200b215f0c020b205f10262260450d350b200b21050b206020056a20092064463a0000200520646a215e2005206474220b20676a2108200b20626a210503402008210b0240205e205f470d00205e20646a2206205e490de7012005200620062005491b225f2065480de7010240205e450d002060205e205f102722600d010c450b205f10262260450d440b2060205e6a2004206a722004206971200420687622061b3a0000200b20626a2108200520626a2105205e20646a215e2006210420060d000b024020092064470d0003400240205e205f470d00205e20646a2204205e490de801200b20042004200b491b225f2065480de8010240205e450d002060205e205f102722600d010c410b205f10262260450d400b2060205e6a2007206a722007206971200720687622041b3a0000200b20626a210b205e20646a215e2004210720040d000b0b206c216b206c205d470d20205d216c0c170b2080012206207c6a218001024020062802042204450d0002402006207d6a280200220b450d00200b207d6c210b0340024020042802002205450d002004207a6a280200450d00200510230b2004207d6a2104200b207f6a220b0d000b0b2006207e6a280200450d002006207a6a28020010230b208001207b470d180c5f0b200328025421040c010b2089012081016a2204208901490de30120890120810174220b20042004200b491b220b208301480de30102400240208901450d002003280254208901200b102722040d010c350b200b10262204450d340b200341d0006a2082016a200b36020020032004360254208401280200218a010b208401208a012081016a3602002004208a016a208b0120880172208b0120870171208b012086017622041b3a000002402004450d002004218b01200341d0006a2082016a280200228901208401280200228a01470d1c410721450c0c0b201d218c01201b450d01411c218d014118218e014114218f014108219001410721910141ff0021920141807f219301200341dc006a21940141012195014100219601411a21970141022198014104219901201d219a01410921450c0a0b209a01208d016a218c01209a012802042208450d00209a01208e016a2802002107209a01208f016a280200219b01209a012090016a290200212e209a01280210219c01209a01280200210b03400240024002400240200341d0006a2090016a229d012802002094012802002204470d0020042095016a22052004490de6012004209501742206200520052006491b2206209601480de6012004450d01200328025420042006102722050d020c400b200328025421050c020b200610262205450d3e0b209d0120063602002003200536025420940128020021040b20940120042095016a360200200520046a200b20930172200b20920171200b2091017622041b3a00002004210b20040d000b2003202e37024420032008360240200341086a200341c0006a200341d0006a109d0120032d0008229e01209701470d51209c012007209801746a219f012007210b03400240024002400240209d012802002094012802002204470d0020042095016a22052004490de6012004209501742206200520052006491b2206209601480de6012004450d01200328025420042006102722050d020c3e0b200328025421050c020b200610262205450d3c0b209d0120063602002003200536025420940128020021040b20940120042095016a360200200520046a200b20930172200b20920171200b2091017622041b3a00002004210b20040d000b2007450dbc01209c0121a001410021040c7b0b208c01208501460dbc01411c21a101411421a201410c21a301410821a401410421a501411021a601410921a70141ffffffff0321a801417021a901410a21450c070b208c012802042205450dbb01208c0120a2016a2802002106208c0120a4016a2802002107208c0128021021080240208c0120a3016a2802002204450d00200420a50174210b200521040340024020042d000020a701470d00200420a4016a28020020a80171450d00200420a5016a28020010230b200420a6016a2104200b20a9016a220b0d000b0b02402007450d00200510230b208c0120a1016a218c0102402006450d00200810230b208c01208501470d170cbb010b20c301220420ae016a21c30120042d001822c40120af01460d0d200420b0016a2800002109200420b1016a28000021c501200420b2016a2800002107200420b3016a2d000021c601200420b4016a2c000021c701200420b5016a280200210a200420b6016a28020021c801200428020c21c901200428020421ca01200428020021cb014101214520ab01410174210620ab01210b200428020822cc0121050340204521040240200b20ac01470d00200b20ba016a22ac01200b490ddf01200620ac0120ac012006491b22ac0120bb01480ddf010240200b450d0020ad01200b20ac01102722ad010d010c420b20ac01102622ad01450d410b20ad01200b6a200520b90172200520b80171200520b7017622081b3a0000200420ba016a2145200620bc016a2106200b20ba016a210b2008210520080d000b024020ac01200b6b20cc014f0d00200b20cc016a2205200b490dde0120ac0120ba01742206200520052006491b220520bb01480dde010240024020ac01450d0020ad0120ac012005102722ad010d010c2d0b2005102622ad01450d2c0b200521ac010b20ad01200b6a20cb0120cc011094041a024020ca01450d0020cb0110230b20ab0120cc016a210620bb0120ab016b20cc016b2108200a210b03400240200620046a220520ac01470d00200520ba016a22ab012005490ddf01200520ba017422ac0120ab0120ab0120ac01491b22ac0120bb01480ddf01024020082004470d0020ac01102622ad010d010c410b20ad01200520ac01102722ad01450d400b20ad0120066a20046a200b20b90172200b20b80171200b20b7017622051b3a0000200420ba016a21042005210b20050d000b024002400240200820ac016a20046b200a4f0d00200620046a2205200a6a220b2005490de00120ac0120ba01742205200b200b2005491b220b20bb01480de00120ac01450d0120ad0120ac01200b102722ad010d020c2c0b20ac01210b0c010b200b102622ad01450d2a0b20ad0120066a20046a20c901200a1094041a2006200a6a2205200b6b21ab01024020c801450d0020c90110230b200520046a210520ab0120046a2104024002400240024002400240024002400240024002400240024002400240024002400240024020c40120ba01460d00024020c40120bc01460d0020c40120be01470d022004450d05200b21ab010c0f0b2004450d02200b21040c080b2004450d02200b21ab010c0a0b2004450d03200b21ac010c0f0b200b20ba016a2204200b490ded01200b20ba01742205200420042005491b220420bb01480ded01200b450d0320ad01200b2004102722ad010d040c2f0b200b20ba016a2204200b490dec01200b20ba01742205200420042005491b22ab0120bb01480dec01200b450d0520ad01200b20ab01102722ad010d060c2d0b200b20ba016a2204200b490deb01200b20ba01742205200420042005491b22ab0120bb01480deb01200b450d0720ad01200b20ab01102722ad010d080c2b0b200b20ba016a2204200b490dea01200b20ba01742205200420042005491b22ac0120bb01480dea01200b450d0920ad01200b20ac01102722ad010d0a0c290b2004102622ad01450d2b0b200b21050b20ad0120056a20bc013a000002400240024002402004200520ba016a220b470d00200420ba016a220b2004490deb01200420ba01742205200b200b2005491b22ac0120bb01480deb012004450d0120ad01200420ac01102722ad010d020c320b200421ac010c020b20ac01102622ad01450d300b2004210b0b20ad01200b6a20c50120ba01463a0000200b20ba016a21ab01200b20ba0174220420af016a2106200420bc016a210b034020062104024020ab0120ac01470d0020ab0120ba016a220520ab01490de901200b20052005200b491b22ac0120bb01480de901024020ab01450d0020ad0120ab0120ac01102722ad010d010c410b20ac01102622ad01450d400b20ad0120ab016a200720b90172200720b80171200720b7017622051b3a0000200420bc016a2106200b20bc016a210b20ab0120ba016a21ab012005210720050d000b20c50120ba01470d090340024020ab0120ac01470d0020ab0120ba016a220b20ab01490de9012004200b200b2004491b22ac0120bb01480de901024020ab01450d0020ad0120ab0120ac01102722ad010d010c3e0b20ac01102622ad01450d3d0b20ad0120ab016a200920b90172200920b80171200920b70176220b1b3a0000200420bc016a210420ab0120ba016a21ab01200b2109200b0d000c0a0b0b20ab01102622ad01450d270b200b21050b20ad0120056a20ba013a0000024002400240024020ab01200520ba016a220b470d0020ab0120ba016a220420ab01490de80120ab0120ba0174220b20042004200b491b220420bb01480de80120ab01450d0120ad0120ab012004102722ad010d020c2e0b20ab0121040c020b2004102622ad01450d2c0b20ab01210b0b20ad01200b6a20bd013a000002400240024002402004200b20ba016a220b470d00200420ba016a220b2004490de801200420ba01742205200b200b2005491b22ac0120bb01480de8012004450d0120ad01200420ac01102722ad010d020c2d0b200421ac010c020b20ac01102622ad01450d2b0b2004210b0b20ad01200b6a20c50120ba01463a0000200b20ba016a21ab01200b20ba0174220420af016a2106200420bc016a210b034020062104024020ab0120ac01470d0020ab0120ba016a220520ab01490de601200b20052005200b491b22ac0120bb01480de601024020ab01450d0020ad0120ab0120ac01102722ad010d010c3d0b20ac01102622ad01450d3c0b20ad0120ab016a200720b90172200720b80171200720b7017622051b3a0000200420bc016a2106200b20bc016a210b20ab0120ba016a21ab012005210720050d000b20c50120ba01470d060340024020ab0120ac01470d0020ab0120ba016a220b20ab01490de6012004200b200b2004491b22ac0120bb01480de601024020ab01450d0020ad0120ab0120ac01102722ad010d010c3a0b20ac01102622ad01450d390b20ad0120ab016a200920b90172200920b80171200920b70176220b1b3a0000200420bc016a210420ab0120ba016a21ab01200b2109200b0d000c070b0b20ab01102622ad01450d230b200b21050b20ad0120056a20be013a0000024002400240024020ab01200520ba016a220b470d0020ab0120ba016a220420ab01490de50120ab0120ba0174220b20042004200b491b220420bb01480de50120ab01450d0120ad0120ab012004102722ad010d020c290b20ab0121040c020b2004102622ad01450d270b20ab01210b0b20ad01200b6a20c70120bf0173220520c0017120c10172200520c70120bf014a1b3a000002400240024002402004200b20ba016a220b470d00200420ba016a220b2004490de501200420ba01742205200b200b2005491b22ac0120bb01480de5012004450d0120ad01200420ac01102722ad010d020c280b200421ac010c020b20ac01102622ad01450d260b2004210b0b20ad01200b6a20c60120c2017120bb01473a0000200b20ba016a21ab0120c30120aa01470d180c6f0b20ac01102622ad01450d1f0b200b21050b20ad0120056a20bb013a0000200520ba016a21ab01200520ba017420bc016a21040340024020ab0120ac01470d0020ab0120ba016a220b20ab01490de0012004200b200b2004491b22ac0120bb01480de001024020ab01450d0020ad0120ab0120ac01102722ad010d010c360b20ac01102622ad01450d350b20ad0120ab016a200720b90172200720b80171200720b70176220b1b3a0000200420bc016a210420ab0120ba016a21ab01200b2107200b0d000b0b20c30120aa01470d150c6b0b20ce0120d10174210b20d80128020021040340024020ce0120cf01470d0020ce0120d1016a220520ce01490dde01200b20052005200b491b22cf0120d501480dde01024020ce01450d0020d00120ce0120cf01102722d0010d010c420b20cf01102622d001450d410b20d00120ce016a200420d40172200420d30171200420d2017622051b3a0000200b20d6016a210b20ce0120d1016a21ce012005210420050d000b20d80120d7016a22d80120cd01470d12410121040cdb010b20e60120dd016a21e70120e60128020c220920de01460d0a20e601280204214520e601280200210820da0120df0174210520e60120e0016a280200210420e6012802082207210b0340024020da0120db01470d0020da0120df016a220620da01490ddd012005200620062005491b22db0120e401480ddd01024020da01450d0020dc0120da0120db01102722dc010d010c3e0b20db01102622dc01450d3d0b20dc0120da016a200b20e30172200b20e20171200b20e1017622061b3a0000200520e5016a210520da0120df016a21da012006210b20060d000b02400240024020db0120da016b20074f0d0020da0120076a220b20da01490dde0120db0120df01742205200b200b2005491b220b20e401480dde0120db01450d0120dc0120db01200b102722dc010d020c290b20db01210b0c010b200b102622dc01450d270b20dc0120da016a200820071094041a2007200b6b20da016a210502402045450d00200810230b024002402005450d00200720da016a2105200b21db010c010b200b20df016a2205200b490ddc01200b20df017422da012005200520da01491b22db0120e401480ddc0102400240200b450d0020dc01200b20db01102722dc010d010c270b20db01102622dc01450d260b200b21050b20dc0120056a20093a0000200520df016a21da01200520df017420e5016a210b0340024020da0120db01470d0020da0120df016a220520da01490ddd01200b20052005200b491b22db0120e401480ddd01024020da01450d0020dc0120da0120db01102722dc010d010c3d0b20db01102622dc01450d3c0b20dc0120da016a200420e30172200420e20171200420e1017622051b3a0000200b20e5016a210b20da0120df016a21da012005210420050d000b20e70121e60120e70120d901470d100c680b20f70120ed016a21f80120f7012d000d220920ee01460d0820f7012d000c210420f701280208210820f701280204210a20f70128020021f701024020eb0120ea01470d0020ea0120ef016a220b20ea01490ddb0120ea0120ef01742205200b200b2005491b22eb0120f001480ddb01024020ea01450d0020ec0120ea0120eb01102722ec010d010c260b20eb01102622ec01450d250b20ec0120ea016a20043a000020ea0120ef016a210420ea0120ef0174220b20f1016a2107200b20f2016a21052008210b0340200721060240200420eb01470d00200420ef016a22ea012004490ddc01200520ea0120ea012005491b22eb0120f001480ddc0102402004450d0020ec01200420eb01102722ec010d010c3b0b20eb01102622ec01450d3a0b20ec0120046a200b20f50172200b20f40171200b20f3017622ea011b3a0000200620f2016a2107200520f2016a2105200420ef016a210420ea01210b20ea010d000b2008450dad014100210502400340200420056a210b20f70120056a2d0000220720f6014b0db00141ff0021ea0102400240024002400240024020070e0401000203010b41fe0021ea010b200b20eb01470d030c020b41fd0021ea01200b20eb01460d010c020b41fc0021ea01200b20eb01470d010b200b20ef016a2207200b490ddd012006200720072006491b22eb0120f001480ddd010240200b450d0020ec01200b20eb01102722ec010d010c030b20eb01102622ec01450d020b20ec0120046a20056a20ea013a0000200620f2016a21062008200520ef016a2205470d000b200420056a210b200a0db0010cb1010b20eb014101102a000b410e21040cd8010b410e21040cd7010b410e21040cd6010b410e21040cd5010b410e21040cd4010b410e21040cd3010b410e21040cd2010b410e21040cd1010b410521040cd0010b410421040ccf010b410321040cce010b410221040ccd010b410221040ccc010b410021040ccb010b41252145410e21040cca010b410e2145410e21040cc9010b410d2145410e21040cc8010b410c2145410e21040cc7010b410c2145410e21040cc6010b410a2145410e21040cc5010b41082145410e21040cc4010b41052145410e21040cc3010b41032145410e21040cc2010b41022145410e21040cc1010b41012145410e21040cc0010b20ac014101102a000b20ab014101102a000b20ab014101102a000b20044101102a000b20ac014101102a000b20044101102a000b20ac014101102a000b20044101102a000b20ac014101102a000b20044101102a000b20db014101102a000b20eb014101102a000b200b4101102a000b200b4101102a000b20054101102a000b205f4101102a000b200b4101102a000b200e4101102a000b200b4101102a000b200b4101102a000b20ac014101102a000b20ac014101102a000b20ac014101102a000b20ac014101102a000b20ac014101102a000b205f4101102a000b20064101102a000b20074101102a000b20064101102a000b20074101102a000b205f4101102a000b20eb014101102a000b20db014101102a000b20db014101102a000b20ac014101102a000b20ac014101102a000b20cf014101102a000b20a504220420a4046a21a504024020042802042206450d00200428020821070240200420a6046a2802002204450d00200420a6046c210b200621040340024020042802002205450d00200420a8046a280200450d00200510230b200420a6046a2104200b20a7046a220b0d000b0b2007450d00200610230b20a504209403460d1a41272145410e21040c9a010b209c042206209e046a219c04024020062802042204450d0002402006209b046a280200220b450d00200b209b046c210b0340024020042802002205450d00200420a0046a280200450d00200510230b2004209b046a2104200b20a1046a220b0d000b0b2006209f046a280200450d00200620a0046a28020010230b209c04209d04460d4e41262145410e21040c99010b20a102280200220b450d3520a1022094046a280200210420a1022095046a280200210620a10228020c2105024020a102280204450d00200b10230b02402004450d00200420960474210b200521040340024020042d0000209704470d0020042098046a28020020990471450d0020042096046a28020010230b20042095046a2104200b209a046a220b0d000b0b20a1022093046a21a10202402006450d00200510230b20a102209a02460d3541242145410e21040c98010b2095032204208f046a219503024020042802042206450d0020042802082107024020042090046a2802002204450d0020042090046c210b200621040340024020042802002205450d0020042092046a280200450d00200510230b20042090046a2104200b2091046a220b0d000b0b2007450d00200610230b0240209503209403470d00410d21040c98010b41232145410e21040c97010b2089042206208b046a218904024020062802042204450d00024020062088046a280200220b450d00200b2088046c210b0340024020042802002205450d002004208d046a280200450d00200510230b20042088046a2104200b208e046a220b0d000b0b2006208c046a280200450d002006208d046a28020010230b208904208a04460d8d0141222145410e21040c96010b024020800420fd036a280200220b450d002080042802042104200b20ff0374210b0340024020042d0000208504470d0020042082046a28020020860471450d00200420ff036a28020010230b20042084046a2104200b2087046a220b0d000b0b02402080042082046a280200450d0020800420ff036a28020010230b20800420fe036a210402402080042083046a280200450d0020800428021010230b20042180042004208104460d4641202145410e21040c95010b024020f603280208220b450d0020f6032802002104200b20f50374210b0340024020042d000020f903470d00200420fa036a28020020fb0371450d00200420f5036a28020010230b200420f8036a2104200b20fc036a220b0d000b0b20f60320f8036a2104024020f60320f5036a280200450d0020f60328020010230b200421f603200420f703460d43411f2145410e21040c94010b024020ed0320ea036a280200220b450d0020ed032802042104200b20ec0374210b0340024020042d000020f203470d00200420ef036a28020020f30371450d00200420ec036a28020010230b200420f1036a2104200b20f4036a220b0d000b0b024020ed0320ef036a280200450d0020ed0320ec036a28020010230b20ed0320eb036a2104024020ed0320f0036a280200450d0020ed0328021010230b200421ed03200420ee03460d3c411e2145410e21040c93010b024020e20320e1036a280200450d0020e20328020010230b024020e20320e4036a280200220b450d0020e20328020c2104200b20e10374210b0340024020042d000020e603470d00200420e7036a28020020e80371450d00200420e1036a28020010230b200420e5036a2104200b20e9036a220b0d000b0b20e20320e0036a2104024020e20320e5036a280200450d0020e20320df036a28020010230b200421e203200420e303460d36411d2145410e21040c92010b20041026220b450d010b2005200b360200200541046a2004360200200541086a28020021040c290b20044101102a000b208c012802042205450d01208c0120d7036a2802002106208c0120d9036a2802002107208c0128021021080240208c0120d8036a2802002204450d00200420da0374210b200521040340024020042d000020dc03470d00200420d9036a28020020dd0371450d00200420da036a28020010230b200420db036a2104200b20de036a220b0d000b0b02402007450d00200510230b208c0120d6036a218c0102402006450d00200810230b208c01208501460d01410b2145410e21040c8e010b200341146a28020021d003200341106a28020021d103200328020c21d20320032d000b21d30320032d000a21d40320032d000921d5030240209b01450d00209c0110230b208c01208501460d00411c21d603411421d703410c21d803410821d903410421da03411021db03410921dc0341ffffffff0321dd03417021de03410b21450c020b0240201c450d00201d10230b0240200341d0006a41086a280200450d00200328025410230b200020d5033a00012000209e013a00002000410c6a20d003360000200041086a20d103360000200041046a20d203360000200041036a20d3033a0000200041026a20d4033a000041002105410121e8014101210c0b410121060c290b410e21040c8a010b20462802042205450d01204620c8036a2802002106204620ca036a2802002107204628021021080240204620c9036a2802002204450d00200420cb0374210b200521040340024020042d000020cd03470d00200420ca036a28020020ce0371450d00200420cb036a28020010230b200420cc036a2104200b20cf036a220b0d000b0b02402007450d00200510230b204620c7036a214602402006450d00200810230b2046203e460d0141042145410e21040c89010b200341146a28020021c103200341106a28020021c203200328020c21c30320032d000b21c40320032d000a21c50320032d000921c6030240200a450d00204510230b2046203e460d00411c21c703411421c803410c21c903410821ca03410421cb03411021cc03410921cd0341ffffffff0321ce03417021cf03410421450c010b02402010450d00201110230b0240200341d0006a41086a280200450d00200328025410230b200020c6033a0001200020533a00002000410c6a20c103360000200041086a20c203360000200041046a20c303360000200041036a20c4033a0000200041026a20c5033a000041002107410121e8014101210c41012105410121060c260b410e21040c86010b20bb0320bc036a2d000020bd03460d4e20bb03280204210620bb032802002105024020bb032802082204450d00200420b80374210b200521040340024020042d000020be03470d00200420bf036a28020020c00371450d00200420b8036a28020010230b200420ba036a2104200b20b9036a220b0d000b0b20bb0320ba036a21bb0302402006450d00200510230b20bb03208d02460d4e41142145410e21040c85010b0240024020940220ab036a2d000020ac03460d002094022802042106209402280200210502402094022802082204450d00200420ad0374210b200521040340024020042d000020ae03470d00200420af036a28020020b00371450d00200420ad036a28020010230b200420aa036a2104200b20b1036a220b0d000b0b20940220aa036a21940202402006450d00200510230b0240209402208d02470d00410921040c87010b411321450c010b410921040c85010b410e21040c84010b2016450d00201710230b0b0240024002402079411a470d002003411c6a2078360200200341086a41106a20773602002003207636021420034284808080c00037020c2003206f360208200341d0006a200341086a2002109c01200320032900513703402003200341d0006a41086a29000037004720032d00502204411a470d0141002106410121394101210e4101210d410121c401410121cc0141012107410121084101214541012105410121094101210b4101210a0c660b20a50341ff017141107420a60341ff01714108747220a70341ff017172210402402077450d00207610230b200041086a20a803370200200041046a20a90336020020002004410874207972360200206f10230c010b20002003290340370001200020043a0000200041086a20032900473700000b4100210b410121e8014101210c41012105410121064101210720012d00002204410e4b0d220c210b20a4032105024003402005209a036a28020022080d0120a2032098036a21a20320940320052099036a2205470d000c080b0b20052099036a21a40320a2032098036a210a20a303209b036a21a3032005209c036a290200212e20052802002109200341c0006a209c036a227928020021042003280244210b034002400240024002402004200b470d00200b2098036a2206200b490d8701200b209803742207200620062007491b2207209703480d8701200b450d012003280240200b2007102722060d020c060b200328024021060c020b200710262206450d040b20032007360244200320063602402007210b0b207920042098036a2207360200200620046a20a203209f037220a203209e037120a203209d037622061b3a000020072104200621a20320060d000b200341086a209c036a202e3703002003200836020c20032009360208200341d0006a200341086a200341c0006a109b01024020032d0050227920a003470d00024020a303450d00200a21a2032096032005470d040b200541106a229503209403470d060c050b20a10335020021a204200341d0006a209c036a35020021a304200328025421a90320032d005321a50320032d005221a60320032d005121a70320940341706a2005460d00411021a404200541106a21a504410c21a604417421a704410421a804412721450c080b02402016450d00201710230b20a20442208621a80302402003280244450d00200328024010230b20a80320a3048421a8030c020b20074101102a000b410621450c040b410b21040c7c0b410d21040c7b0b410c21040c7a0b410d21040c790b410e21040c780b410e21040c770b20880222052084036a2188020240024002400240024020052802002206208503460d0020052085036a28020021042005280204210b024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020062087036a22062088034b0d0020052086036a2802002108024002400240024020060e0700050203010607000b202b2031470d0b202b2089036a2231202b490dd201202b208903742205203120312005491b2206208a03480dd201202b450d1b2032202b2006102722320d1c0c490b202b2031470d06202b2089036a2231202b490dd101202b208903742205203120312005491b2206208a03480dd101202b450d0e2032202b2006102722320d0f0c450b202b2031470d06202b2089036a2231202b490dd001202b208903742205203120312005491b2206208a03480dd001202b450d102032202b2006102722320d110c450b202b2031470d06202b2089036a2231202b490dcf01202b208903742205203120312005491b2206208a03480dcf01202b450d122032202b2006102722320d130c450b202b2031470d06202b2089036a2231202b490dce01202b208903742205203120312005491b2206208a03480dce01202b450d142032202b2006102722320d150c410b202b2031470d07202b2089036a2231202b490dcd01202b208903742205203120312005491b2206208a03480dcd01202b450d192032202b2006102722320d1a0c450b202b2031470d07202b2089036a2231202b490dcc01202b208903742205203120312005491b2206208a03480dcc01202b450d1b2032202b2006102722320d1c0c450b202b2031470d07202b2089036a2231202b490dcb01202b208903742205203120312005491b2206208a03480dcb01202b450d1d2032202b2006102722320d1e0c450b202b21060c090b202b21060c0b0b202b21060c0d0b202b21060c0f0b202b21060c110b202b21060c130b202b21060c150b202b21060c170b200610262232450d360b202b21310b203220316a2093033a000020312089036a21310340024002400240024020062031470d0020062089036a22312006490dc5012006208903742205203120312005491b2205208a03480dc5012006450d01203220062005102722320d020c270b200621050c020b200510262232450d250b20062131200521060b203220316a200b208d0372200b208c0371200b208b037622071b3a000020312089036a21312007210b20070d000b0340024002400240024020052031470d0020052089036a22312005490dc501200520890374220b20312031200b491b220b208a03480dc5012005450d0120322005200b102722320d020c280b2005210b0c020b200b10262232450d260b20052131200b21050b203220316a2004208d03722004208c03712004208b037622061b3a000020312089036a21312006210420060d000b20082090037121062008208c0371210902400240024002402008208b037522040d002006450d010b03400240200620910371450d002004208703460d020b0240024002400240200b2031470d00200b2089036a2231200b490dc801200b208903742205203120312005491b2205208a03480dc801200b450d012032200b2005102722320d020c380b200b21050c020b200510262232450d360b200b21312005210b0b203220316a2008208d03723a000020042090037121062004208c0371210920312089036a2131200421082004208b03752207210420070d002005210b2007210420060d000b20052031470d020c010b200b22052031470d010b20052089036a22312005490dc1012005208903742204203120312004491b222b208a03480dc1012005450d1720322005202b102722320d180c3c0b2005212b0c180b200610262232450d340b202b21310b203220316a208f033a000020312089036a21310340024002400240024020062031470d0020062089036a22312006490dc2012006208903742205203120312005491b2205208a03480dc2012006450d01203220062005102722320d020c260b200621050c020b200510262232450d240b20062131200521060b203220316a200b208d0372200b208c0371200b208b037622071b3a000020312089036a21312007210b20070d000b0340024002400240024020052031470d0020052089036a22312005490dc201200520890374220b20312031200b491b220b208a03480dc2012005450d0120322005200b102722320d020c270b2005210b0c020b200b10262232450d250b20052131200b21050b203220316a2004208d03722004208c03712004208b037622061b3a000020312089036a21312006210420060d000b20082090037121062008208c0371210902400240024002402008208b037522040d002006450d010b03400240200620910371450d002004208703460d020b0240024002400240200b2031470d00200b2089036a2231200b490dc501200b208903742205203120312005491b2205208a03480dc501200b450d012032200b2005102722320d020c360b200b21050c020b200510262232450d340b200b21312005210b0b203220316a2008208d03723a000020042090037121062004208c0371210920312089036a2131200421082004208b03752207210420070d002005210b2007210420060d000b20052031470d020c010b200b22052031470d010b20052089036a22312005490dbe012005208903742204203120312004491b222b208a03480dbe012005450d1720322005202b102722320d180c3a0b2005212b0c180b200610262232450d320b202b21310b203220316a2092033a000020312089036a21310340024002400240024020062031470d0020062089036a22312006490dbf012006208903742205203120312005491b2205208a03480dbf012006450d01203220062005102722320d020c250b200621050c020b200510262232450d230b20062131200521060b203220316a200b208d0372200b208c0371200b208b037622071b3a000020312089036a21312007210b20070d000b0340024002400240024020052031470d0020052089036a22312005490dbf01200520890374220b20312031200b491b220b208a03480dbf012005450d0120322005200b102722320d020c260b2005210b0c020b200b10262232450d240b20052131200b21050b203220316a2004208d03722004208c03712004208b037622061b3a000020312089036a21312006210420060d000b20082090037121062008208c0371210902400240024002402008208b037522040d002006450d010b03400240200620910371450d002004208703460d020b0240024002400240200b2031470d00200b2089036a2231200b490dc201200b208903742205203120312005491b2205208a03480dc201200b450d012032200b2005102722320d020c340b200b21050c020b200510262232450d320b200b21312005210b0b203220316a2008208d03723a000020042090037121062004208c0371210920312089036a2131200421082004208b03752207210420070d002005210b2007210420060d000b20052031470d020c010b200b22052031470d010b20052089036a22312005490dbb012005208903742204203120312004491b222b208a03480dbb012005450d1720322005202b102722320d180c380b2005212b0c180b200610262232450d2c0b202b21310b203220316a208a033a000020312089036a21310340024002400240024020062031470d0020062089036a22312006490dbc012006208903742205203120312005491b2205208a03480dbc012006450d01203220062005102722320d020c1c0b200621050c020b200510262232450d1a0b20062131200521060b203220316a200b208d0372200b208c0371200b208b037622071b3a000020312089036a21312007210b20070d000b0340024002400240024020052031470d0020052089036a22312005490dbc01200520890374220b20312031200b491b222b208a03480dbc012005450d0120322005202b102722320d020c1d0b2005212b0c020b202b10262232450d1b0b20052131202b21050b203220316a2004208d03722004208c03712004208b0376220b1b3a000020312089036a2131200b2104200b0d000c0d0b0b200610262232450d2d0b202b21310b203220316a2089033a000020312089036a21310340024002400240024020062031470d0020062089036a22312006490db9012006208903742205203120312005491b2205208a03480db9012006450d01203220062005102722320d020c210b200621050c020b200510262232450d1f0b20062131200521060b203220316a200b208d0372200b208c0371200b208b037622071b3a000020312089036a21312007210b20070d000b0340024002400240024020052031470d0020052089036a22312005490db901200520890374220b20312031200b491b222b208a03480db9012005450d0120322005202b102722320d020c220b2005212b0c020b202b10262232450d200b20052131202b21050b203220316a2004208d03722004208c03712004208b0376220b1b3a000020312089036a2131200b2104200b0d000c0a0b0b200610262232450d2b0b202b21310b203220316a208e033a000020312089036a21310340024002400240024020062031470d0020062089036a22312006490db6012006208903742205203120312005491b2205208a03480db6012006450d01203220062005102722320d020c200b200621050c020b200510262232450d1e0b20062131200521060b203220316a200b208d0372200b208c0371200b208b037622071b3a000020312089036a21312007210b20070d000b0340024002400240024020052031470d0020052089036a22312005490db601200520890374220b20312031200b491b222b208a03480db6012005450d0120322005202b102722320d020c210b2005212b0c020b202b10262232450d1f0b20052131202b21050b203220316a2004208d03722004208c03712004208b0376220b1b3a000020312089036a2131200b2104200b0d000c070b0b200610262232450d290b202b21310b203220316a2088033a000020312089036a21310340024002400240024020062031470d0020062089036a22312006490db3012006208903742205203120312005491b2205208a03480db3012006450d01203220062005102722320d020c1f0b200621050c020b200510262232450d1d0b20062131200521060b203220316a200b208d0372200b208c0371200b208b037622071b3a000020312089036a21312007210b20070d000b0340024002400240024020052031470d0020052089036a22312005490db301200520890374220b20312031200b491b222b208a03480db3012005450d0120322005202b102722320d020c200b2005212b0c020b202b10262232450d1e0b20052131202b21050b203220316a2004208d03722004208c03712004208b0376220b1b3a000020312089036a2131200b2104200b0d000c040b0b200610262232450d270b202b21310b203220316a208b033a000020312089036a21310340024002400240024020062031470d0020062089036a22312006490db0012006208903742205203120312005491b2205208a03480db0012006450d01203220062005102722320d020c1e0b200621050c020b200510262232450d1c0b20062131200521060b203220316a200b208d0372200b208c0371200b208b037622071b3a000020312089036a21312007210b20070d000b0340024002400240024020052031470d0020052089036a22312005490db001200520890374220b20312031200b491b222b208a03480db0012005450d0120322005202b102722320d020c1f0b2005212b0c020b202b10262232450d1d0b20052131202b21050b203220316a2004208d03722004208c03712004208b0376220b1b3a000020312089036a2131200b2104200b0d000b0b2088022030470d280c090b202b10262232450d240b200521310b203220316a20093a000020312089036a21312088022030470d260c060b202b10262232450d220b200521310b203220316a20093a000020312089036a21312088022030470d250c030b202b10262232450d200b200521310b203220316a20093a000020312089036a21312088022030470d210b20302188020c220b20054101102a000b202b4101102a000b20054101102a000b200b4101102a000b20054101102a000b200b4101102a000b20054101102a000b200b4101102a000b20054101102a000b202b4101102a000b20054101102a000b202b4101102a000b20054101102a000b202b4101102a000b20054101102a000b202b4101102a000b20054101102a000b20054101102a000b20054101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b20064101102a000b202b4101102a000b202b4101102a000b202b4101102a000b412121450c050b412121450c050b412121450c050b412121450c050b410821040c7b0b410821040c7a0b410e21040c790b410e21040c780b410e21040c770b410e21040c760b024020fc0220f9026a280200220b450d0020fc022802042104200b20fb0274210b0340024020042d0000208103470d00200420fe026a28020020820371450d00200420fb026a28020010230b20042080036a2104200b2083036a220b0d000b0b024020fc0220fe026a280200450d0020fc0220fb026a28020010230b20fc0220fa026a2104024020fc0220ff026a280200450d0020fc0228021010230b200421fc02200420fd02460d66411c2145410e21040c750b024020f202280208220b450d0020f2022802002104200b20f10274210b0340024020042d000020f502470d00200420f6026a28020020f70271450d00200420f1026a28020010230b200420f4026a2104200b20f8026a220b0d000b0b20f20220f4026a2104024020f20220f1026a280200450d0020f20228020010230b200421f202200420f302460d63411b2145410e21040c740b024020e90220e6026a280200220b450d0020e9022802042104200b20e80274210b0340024020042d000020ee02470d00200420eb026a28020020ef0271450d00200420e8026a28020010230b200420ed026a2104200b20f0026a220b0d000b0b024020e90220eb026a280200450d0020e90220e8026a28020010230b20e90220e7026a2104024020e90220ec026a280200450d0020e90228021010230b200421e902200420ea02460d5c411a2145410e21040c730b024020de0220dd026a280200450d0020de0228020010230b024020de0220e0026a280200220b450d0020de0228020c2104200b20dd0274210b0340024020042d000020e202470d00200420e3026a28020020e40271450d00200420dd026a28020010230b200420e1026a2104200b20e5026a220b0d000b0b20de0220dc026a2104024020de0220e1026a280200450d0020de0220db026a28020010230b200421de02200420df02460d5641192145410e21040c720b02402022450d00202310230b200241086a2105200241046a210720da01210b024003400240024002400240200728020020052802002204470d00200441016a22062004490d782004410174220d20062006200d491b220d4100480d782004450d0120022802002004200d102722060d020c050b200228020021060c020b200d10262206450d030b200220063602002007200d360200200528020021040b2005200441016a360200200620046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b02400240024002400240200241046a280200220b200241086a28020022046b20da014f0d00200420da016a22052004490d78200b4101742204200520052004491b22044100480d78200b450d012002280200200b20041027220b450d040c020b2002280200210b0c020b20041026220b450d020b2002200b360200200241046a2004360200200241086a28020021040b200241086a200420da016a360200200b20046a20dc0120da011094041a4100210541012139024020db01450d0020dc0110230b4101210e4101210d410121c401410121cc014101210741012108410121450c080b20044101102a000b200d4101102a000b0240201e450d00201f10230b200241086a2105200241046a210720ab01210b03400240024002400240200728020020052802002204470d00200441016a22062004490d762004410174220d20062006200d491b220d4100480d762004450d0120022802002004200d102722060d020c0c0b200228020021060c020b200d10262206450d0a0b200220063602002007200d360200200528020021040b2005200441016a360200200620046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b0240024002400240200241046a280200220b200241086a28020022046b20ab014f0d00200420ab016a22052004490d75200b4101742204200520052004491b22044100480d75200b450d012002280200200b20041027220b450d0a0c020b2002280200210b0c020b20041026220b450d080b2002200b360200200241046a2004360200200241086a28020021040b200241086a200420ab016a360200200b20046a20ad0120ab011094041a410021c40141012139024020ac01450d0020ad0110230b4101210e4101210d0b410121cc010b410121070b410121080b410121450b410121050b410121090c490b20044101102a000b200d4101102a000b2005280200210b0b200541086a200420396a360200200b20046a200820391094041a02402045450d00200810230b4100210a410121394101210e4101210d410121c401410121cc0141012107410121084101214541012105410121094101210b0c470b20a102280200220b450d2520a10220d4026a280200210420a10220d5026a280200210620a10228020c2105024020a102280204450d00200b10230b02402004450d00200420d60274210b200521040340024020042d000020d702470d00200420d8026a28020020d90271450d00200420d6026a28020010230b200420d5026a2104200b20da026a220b0d000b0b20a10220d3026a21a10202402006450d00200510230b20a102209a02460d2541182145410e21040c650b20c00220a4026a21a10220c00228020022c102450d2320c00220a5026a28020021c20220c00220a6026a28020021c30220c00228020c21c40220c002290204212e410021c50220a8024100360200200320a90237024420c102202e20aa0288a722c60220ab02746a21c7022003200341206a360240202ea721c802410021c902024041004100460d00410121040c010b410221040b03400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040e06000102040607070b20a001280200210b03400240024002400240209d012802002094012802002204470d0020042095016a22052004490d84012004209501742206200520052006491b2206209601480d84012004450d01200328025420042006102722050d020c0d0b200328025421050c020b200610262205450d0b0b209d0120063602002003200536025420940128020021040b20940120042095016a360200200520046a200b20930172200b20920171200b2091017622041b3a00002004210b20040d000b20a0012099016a22a001209f01470d130c5a0b200328024421040c010b20c50220a2026a220420c502490d7d20c50220a20274220b20042004200b491b220b20af02480d7d0240024020c502450d00200328024420c502200b102722040d010c0a0b200b10262204450d090b20b102200b3602002003200436024420a80228020021c9020b20a80220c90220a2026a360200200420c9026a20c60220ae027220c60220ad027120c60220ac027622041b3a000002402004450d00200421c60220b10228020022c50220a80228020022c902470d12410221040c170b20c70220c102460d0120c10221ca02410321040c160b20ca0220b0026a21cb0220ca02290200222e20aa0288a7220420bc027120b202460d13200420a4027420a402752107202ea7210b0340024002400240024020b10228020020a8022802002204470d00200420a2026a22052004490d8001200420a202742206200520052006491b220620af02480d80012004450d01200328024420042006102722050d020c0a0b200328024421050c020b200610262205450d080b20b10220063602002003200536024420a80228020021040b20a802200420a2026a360200200520046a200b20ae0272200b20ad0271200b20ac027622041b3a00002004210b20040d000b024002400240024020b10228020020a8022802002204470d00200420a2026a220b2004490d7f200420a202742205200b200b2005491b220520af02480d7f2004450d012003280244200420051027220b0d020c0c0b2003280244210b0c020b20051026220b450d0a0b20b10220053602002003200b36024420a80228020021040b20a802200420a2026a360200200b20046a200720bd0273220420be027120bf02722004200720bd024a1b3a000020cb0221ca0220cb0220c702470d1120c70220c70222cb02470d140c030b20c10221cb02410421040c140b20c70220cb02460d01410521040c130b20cb022d0004210420cb0220b0026a21cb02200420b202470d0f0b024020c802450d0020c10210230b20c40220c20220b2027422046a210602400240024002400240024002400240024020c202450d0020c40220a4026a210b200420b6026a210720c4022104034020042d0000210520b802200420ab026a2d00003a00002003200420a2026a2f00003b0108200520b502460d02200341306a20b7026a220820b8022d00003a0000200320032f01083b0130200420b2026a290200212e200341086a20a7026a200420a7026a28020036020020a30220032f01303b000020a30220b7026a20082d00003a0000200320053a00082003202e37020c200341d0006a200341086a200341c0006a109e0120032d005022cc0220b902462205450d05200b20a6026a210b200720b6026a2107200420a6026a22042006470d000c040b0b20c40222042006460d020c010b200420a6026a22042006460d010b03400240024020042d0000220b20b302460d00200b20b502470d010c030b200420b0026a28020020b40271450d00200420b2026a28020010230b200420a6026a22042006470d000b0b024020c302450d0020c40210230b20b102280200210a200328024421092003280240210520a80228020022c002210b03400240024002400240200520b0026a2208280200200520a7026a22062802002204470d00200420a2026a22072004490d8101200420a202742245200720072045491b224520af02480d81012004450d01200520b2026a28020020042045102722070d020c0d0b200520b2026a28020021070c020b204510262207450d0b0b20082045360200200520b2026a2007360200200628020021040b2006200420a2026a360200200720046a200b20ae0272200b20ad0271200b20ac027622041b3a00002004210b20040d000b02402008280200220b200628020022046b20c0024f0d00200420c0026a22072004490d7d200b20a202742204200720072004491b220420af02480d7d200b450d02200520b2026a280200200b20041027220b0d030c0b0b200520b2026a280200210b0c030b200341d0006a20a7026a28020021cd02200341d0006a20b0026a28020021ce02200328025421cf0220032d005321d00220032d005221d10220032d005121d20202402007450d00034002400240200b20ba026a22042d0000220720b302460d00200720b502470d010c030b200b28020020b40271450d00200b20bb026a28020010230b200b20a6026a210b200420a6026a2006470d000b0b024020c302450d0020c40210230b024020b102280200450d00200328024410230b2005450d0320a10221c00220a102209a02470d0b0c390b20041026220b450d080b20082004360200200520b2026a200b360200200628020021040b2006200420c0026a360200200b20046a200920c0021094041a0240200a450d00200910230b20a10221c00220a102209a02470d070c360b20a102209a02460d1241182193044114219404411021950441042196044109219704410821980441ffffffff032199044170219a04412421450c0a0b20064101102a000b20064101102a000b200b4101102a000b20454101102a000b20054101102a000b20044101102a000b411721450c010b411721450c010b410e21040c6c0b410e21040c6b0b410e21040c6a0b410021040c050b410121040c040b410321040c030b410421040c020b410421040c010b410521040c000b0b02402037450d00203810230b0240200341206a41086a280200450d00200328022410230b200020d2023a0001200020cc023a00002000410c6a20cd02360000200041086a20ce02360000200041046a20cf02360000200041036a20d0023a0000200041026a20d1023a000041002106410121e8014101210c410121050b410121070b4101210b20012d00002204410e4b0d010b024020040e0f000c0b0a05070d0e12011003080602000b200141086a280200450d63200141046a2802001023200341e0006a24000f0b2001109f01200341e0006a24000f0b0240200141086a280200450d00200141046a28020010230b0240200141146a2802002202450d00200141186a280200450d00200210230b200141246a280200450d61200141206a2802001023200341e0006a24000f0b2006450d60410c21df032001410c6a2802002204450d00411821e003410421e103200141046a28020022e203200441186c6a21e303411421e403411021e503410921e603410821e70341ffffffff0321e803417021e903411d21450c130b200141086a280200450d5f200141046a2802001023200341e0006a24000f0b200141086a280200450d5e200141046a2802001023200341e0006a24000f0b200b450d5d200141046a2d000022044102460d0d20044101460d0c20040d0f2001410c6a280200450d5d200141086a2802001023200341e0006a24000f0b200141086a280200450d5c200141046a2802001023200341e0006a24000f0b2007450d5b410c21ea032001410c6a2802002204450d00411c21eb03410421ec03200141046a28020022ed032004411c6c6a21ee03410821ef03411421f003411021f103410921f20341ffffffff0321f303417021f403411e21450c0f0b200141086a280200450d5a200141046a2802001023200341e0006a24000f0b02402001410c6a2802002231450d00200141046a2802002102203141286c213103400240200241046a280200450d00200228020010230b0240200241106a280200450d002002410c6a28020010230b200241286a2102203141586a22310d000b0b200141086a280200450d59200141046a2802001023200341e0006a24000f0b02402001410c6a2802002231450d00200141046a28020021022031410474213103400240200241046a280200450d00200228020010230b200241106a2102203141706a22310d000b0b200141086a280200450d58200141046a2802001023200341e0006a24000f0b20e801450d570240200141086a280200450d00200141046a28020010230b200141146a280200450d57200141106a2802001023200341e0006a24000f0b200141086a280200450d56200141046a2802001023200341e0006a24000f0b200c450d552001410c6a2802002204450d00410421f503200141046a28020022f60320044104746a21f703411021f803410921f903410821fa0341ffffffff0321fb03417021fc03411f21450c0a0b200141086a280200450d54200141046a2802001023200341e0006a24000f0b2005450d53410c21fd032001410c6a2802002204450d00411c21fe03410421ff03200141046a2802002280042004411c6c6a218104410821820441142183044110218404410921850441ffffffff032186044170218704412021450c090b200141086a280200450d52200141046a2802001023200341e0006a24000f0b02402001410c6a2802002231450d00200141046a2802002102203141146c213103400240200241046a280200450d00200228020010230b200241146a21022031416c6a22310d000b0b200141086a280200450d51200141046a2802001023200341e0006a24000f0b0240200141146a2802002231450d002001410c6a28020021022031410c6c21310340024020022802002204450d00200241046a280200450d00200410230b2002410c6a2102203141746a22310d000b0b200141106a280200450d502001410c6a2802001023200341e0006a24000f0b200141146a2802002204450d00410c219b042001410c6a280200229c0420044104746a219d044110219e044108219f04410421a004417421a104412621450c060b200141106a280200450d4e2001410c6a2802001023200341e0006a24000f0b2001410c6a280200450d4d200141086a2802001023200341e0006a24000f0b410e21040c480b410e21040c470b410e21040c460b410e21040c450b410e21040c440b209e022096026a2204209e02490d45209e0220960274220b20042004200b491b220b209802480d45024002400240209e02450d002003280224209e02200b102722040d010c020b200b10262204450d010b200341206a2097026a200b36020020032004360224209902280200219f020c020b200b4101102a000b200328022421040b209902209f022096026a3602002004209f026a20a002209d027220a002209c027120a002209b027622041b3a000002402004450d00200421a002200341206a2097026a280200229e02209902280200229f02470d03411521450c040b203821a1022036450d00410121a202200341086a41017221a302411821a402411421a502411021a602410c21a702200341c0006a410c6a21a802420121a902422021aa02410321ab02410721ac0241ff0021ad0241807f21ae02410021af02410821b002200341c0006a41086a21b102410421b202410921b30241ffffffff0321b40241ac0121b502417021b602410221b702200341086a41026a21b802411a21b902417821ba02417c21bb0241ff0121bc02417f21bd02413f21be0241c00021bf02203821c002411721450c050b20a102209a02460d00411821d302411421d402411021d502410421d602410921d702410821d80241ffffffff0321d902417021da02411821450c050b02402037450d00203810230b200341206a41086a2802002145200328022421082003280220220541046a210d2003412c6a2802002239210b024003400240024002400240200d280200200541086a22062802002204470d00200441016a22072004490d472004410174220e20072007200e491b220e4100480d472004450d0120052802002004200e102722070d020c050b200528020021070c020b200e10262207450d030b20052007360200200d200e360200200628020021040b2006200441016a360200200720046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b02400240024002400240200541046a280200220b200541086a28020022046b20394f0d00200420396a22062004490d47200b4101742204200620062004491b22044100480d47200b450d012005280200200b20041027220b450d040c020b2005280200210b0c020b20041026220b450d020b2005200b360200200541046a2004360200200541086a28020021040b200541086a200420396a360200200b20046a200820391094041a02402045450d00200810230b4100210b410121394101210e4101210d410121c401410121cc0141012107410121084101214541012105410121090c210b20044101102a000b200e4101102a000b411621450c010b410e21040c3d0b410e21040c3c0b410e21040c3b0b410e21040c3a0b2091022089026a2204209102490d3a20910220890274220b20042004200b491b220b208b02480d3a024002400240209102450d002003280254209102200b102722040d010c020b200b10262204450d010b200341d0006a208a026a200b36020020032004360254208c022802002192020c020b200b4101102a000b200328025421040b208c022092022089026a36020020042092026a20930220900272209302208f0271209302208e027622041b3a000002402004450d002004219302200341d0006a208a026a280200229102208c02280200229202470d04411121450c070b2035219402024002402033450d004100210602400340200341086a41086a2209203520066a220b41086a2802003602002003200b290200370308200b410d6a2d0000220a4102460d01200341306a41086a2204200928020036020020032003290308370330200b410c6a2d0000219502200341206a41086a22cc012004280200360200200320032903303703200240024002400240200341d0006a41086a2207280200200341d0006a410c6a22052802002204470d00200441016a22082004490d40200441017422c4012008200820c401491b22c4014100480d402004450d012003280254200420c401102722080d020c090b200328025421080c020b20c40110262208450d070b200720c40136020020032008360254200528020021040b2005200441016a360200200820046a41fdf9ff7720950241037441187141107376413f7141c000723a00000240024002400240200728020020052802002204470d00200441016a22082004490d40200441017422950220082008209502491b2295024100480d402004450d0120032802542004209502102722080d020c0a0b200328025421080c020b20950210262208450d080b200720950236020020032008360254200528020021040b2005200441016a360200200820046a200a4100473a0000200341c0006a41086a20cc0128020036020020032003290320370340200341086a200341c0006a200341d0006a109d0120032d0008229502411a470d03200641106a2106200b41106a208d02470d000c090b0b200b41106a2194020b209402208d02460d05411021aa03410d21ab03410221ac03410421ad03410921ae03410821af0341ffffffff0321b003417021b103411321450c090b200341086a410c6a28020021b203200928020021b303200328020c21b40320032d000b21b50320032d000a21b60320032d000921b703410421b803417021b903203341047441706a2006460d00411021ba03200b41106a21bb03410d21bc03410221bd03410921be03410821bf0341ffffffff0321c003411421450c090b02402034450d00203510230b0240200341d0006a41086a280200450d00200328025410230b200020b7033a000120002095023a00002000410c6a20b203360000200041086a20b303360000200041046a20b403360000200041036a20b5033a0000200041026a20b6033a00004100210c410121e801410a21040c360b20c4014101102a000b2095024101102a000b411221450c030b410921040c320b410921040c310b410e21040c300b410e21040c2f0b410e21040c2e0b410e21040c2d0b20860220fd016a218702024002400240208602280204220920fe01460d002086022080026a2802002107208602280200210b0240024002400240024020fb0120fa01470d0020fa0120ff016a220420fa01490d3520fa0120ff01742205200420042005491b22fb01208102480d35024020fa01450d0020fc0120fa0120fb01102722fc010d010c020b20fb01102622fc01450d010b20fc0120fa016a200920ff01463a000020fa0120ff016a210420fa0120ff017422052082026a2108200520fe016a21fa01024002400340200821050240200420fb01470d00200420ff016a22062004490d3820fa012006200620fa01491b22fb01208102480d3802402004450d0020fc01200420fb01102722fc010d010c030b20fb01102622fc01450d020b20fc0120046a200b20850272200b20840271200b2083027622061b3a0000200520fe016a210820fa0120fe016a21fa01200420ff016a21042006210b20060d000b02400240200920ff01470d00200421fa010340024020fa0120fb01470d0020fa0120ff016a220420fa01490d3a2005200420042005491b22fb01208102480d3a024020fa01450d0020fc0120fa0120fb01102722fc010d010c060b20fb01102622fc01450d050b20fc0120fa016a20072085027220072084027120072083027622041b3a0000200520fe016a210520fa0120ff016a21fa012004210720040d000b20870221860220870220f901470d050c010b200421fa0120870221860220870220f901470d050b20f9012187020c050b20fb014101102a000b20fb014101102a000b20fb014101102a000b411021450c030b411021450c030b410721040c2f0b410721040c2e0b410e21040c2d0b410e21040c2c0b2004210b0b200a450d010b20f70110230b024002400240024002400240200920f101470d0020eb01200b470d02200b20ef016a2204200b490d2f200b20ef01742205200420042005491b22eb0120f001480d2f200b450d0120ec01200b20eb01102722ec010d020c070b024020eb01200b470d00200b20ef016a2204200b490d2f200b20ef01742205200420042005491b220420f001480d2f200b450d0320ec01200b2004102722ec010d040c080b20eb0121040c030b20eb01102622ec01450d050b20ec01200b6a20f0013a00000c020b2004102622ec01450d040b20ec01200b6a20ef013a000002400240024002402004200b20ef016a220b470d00200420ef016a220b2004490d2e200420ef01742205200b200b2005491b22eb0120f001480d2e2004450d0120ec01200420eb01102722ec010d020c080b200421eb010c020b20eb01102622ec01450d060b2004210b0b20ec01200b6a200920f3017120f401733a00000b200b20ef016a21ea0120f80121f70120f80120e901470d040b02402024450d00202510230b200241086a2105200241046a210720ea01210b024003400240024002400240200728020020052802002204470d00200441016a22062004490d2e2004410174220d20062006200d491b220d4100480d2e2004450d0120022802002004200d102722060d020c050b200228020021060c020b200d10262206450d030b200220063602002007200d360200200528020021040b2005200441016a360200200620046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b02400240024002400240200241046a280200220b200241086a28020022046b20ea014f0d00200420ea016a22052004490d2e200b4101742204200520052004491b22044100480d2e200b450d012002280200200b20041027220b450d040c020b2002280200210b0c020b20041026220b450d020b2002200b360200200241046a2004360200200241086a28020021040b200241086a200420ea016a360200200b20046a20ec0120ea011094041a4100210d41012139024020eb01450d0020ec0110230b4101210e410621040c290b20044101102a000b200d4101102a000b20eb014101102a000b20044101102a000b20eb014101102a000b410f2145410e21040c230b0240209b01450d00209c0110230b208c01219a01208c01208501470d1c0b0240201c450d00201d10230b200341d0006a41086a2802002145200328025421082003280250220541046a210d200341dc006a2802002239210b03400240024002400240200d280200200541086a22062802002204470d00200441016a22072004490d282004410174220e20072007200e491b220e4100480d282004450d0120052802002004200e102722070d020c1f0b200528020021070c020b200e10262207450d1d0b20052007360200200d200e360200200628020021040b2006200441016a360200200720046a200b41807f72200b41ff0071200b41077622041b3a00002004210b20040d000b0240024002400240200541046a280200220b200541086a28020022046b20394f0d00200420396a22062004490d27200b4101742204200620062004491b22044100480d27200b450d012005280200200b20041027220b450d190c020b2005280200210b0c020b20041026220b450d170b2005200b360200200541046a2004360200200541086a28020021040b200541086a200420396a360200200b20046a200820391094041a02402045450d00200810230b41002109410121394101210e4101210d410121c401410121cc01410121074101210841012145410121050b4101210b0b4101210a0b410121060b410121c9010b2000411a3a000020012d00002204410e4b0d0f02400240024020040e0f000b0a0904060c0d11120f02070501000b200e450d22200141086a280200450d22200141046a2802001023200341e0006a24000f0b20c901450d210240200141086a280200450d00200141046a28020010230b0240200141146a2802002202450d00200141186a280200450d00200210230b200141246a280200450d21200141206a2802001023200341e0006a24000f0b200b450d20410c21db022001410c6a2802002204450d00411821dc02410421dd02200141046a28020022de02200441186c6a21df02411421e002411021e102410921e202410821e30241ffffffff0321e402417021e502411921450c170b200141086a280200450d1f200141046a2802001023200341e0006a24000f0b20cc01450d1e200141086a280200450d1e200141046a2802001023200341e0006a24000f0b2006450d1d200141046a2d000022044102460d0f20044101460d0e20040d112001410c6a280200450d1d200141086a2802001023200341e0006a24000f0b2007450d1c200141086a280200450d1c200141046a2802001023200341e0006a24000f0b200a450d1b410c21e6022001410c6a2802002204450d00411c21e702410421e802200141046a28020022e9022004411c6c6a21ea02410821eb02411421ec02411021ed02410921ee0241ffffffff0321ef02417021f002411a21450c130b200141086a280200450d1a200141046a2802001023200341e0006a24000f0b20c401450d1902402001410c6a2802002231450d00200141046a2802002102203141286c213103400240200241046a280200450d00200228020010230b0240200241106a280200450d002002410c6a28020010230b200241286a2102203141586a22310d000b0b200141086a280200450d19200141046a2802001023200341e0006a24000f0b200d450d1802402001410c6a2802002231450d00200141046a28020021022031410474213103400240200241046a280200450d00200228020010230b200241106a2102203141706a22310d000b0b200141086a280200450d18200141046a2802001023200341e0006a24000f0b2039450d170240200141086a280200450d00200141046a28020010230b200141146a280200450d17200141106a2802001023200341e0006a24000f0b2008450d16200141086a280200450d16200141046a2802001023200341e0006a24000f0b2045450d152001410c6a2802002204450d00410421f102200141046a28020022f20220044104746a21f302411021f402410921f502410821f60241ffffffff0321f702417021f802411b21450c0e0b200141086a280200450d14200141046a2802001023200341e0006a24000f0b2009450d13410c21f9022001410c6a2802002204450d00411c21fa02410421fb02200141046a28020022fc022004411c6c6a21fd02410821fe02411421ff024110218003410921810341ffffffff032182034170218303411c21450c0d0b200141086a280200450d12200141046a2802001023200341e0006a24000f0b2005450d1102402001410c6a2802002231450d00200141046a2802002102203141146c213103400240200241046a280200450d00200228020010230b200241146a21022031416c6a22310d000b0b200141086a280200450d11200141046a2802001023200341e0006a24000f0b2001109f010c100b20044101102a000b0240200141146a2802002231450d002001410c6a28020021022031410c6c21310340024020022802002204450d00200241046a280200450d00200410230b2002410c6a2102203141746a22310d000b0b200141106a280200450d0e2001410c6a2802001023200341e0006a24000f0b200141146a2802002204450d00410c2188042001410c6a28020022890420044104746a218a044110218b044108218c044104218d044174218e04412221450c080b200141106a280200450d0c2001410c6a2802001023200341e0006a24000f0b2001410c6a280200450d0b200141086a2802001023200341e0006a24000f0b200e4101102a000b41092145410e21040c050b410e21040c040b410e21040c030b410e21040c020b410e21040c010b410e21040c000b0b101e000b101e000b41014101102a000b200341e0006a24000bf807030e7f017e017f200241086a2103200241046a21042001280200220521060240024002400240024003400240024002400240200428020020032802002207470d00200741016a22082007490d0520074101742209200820082009491b22094100480d052007450d01200228020020072009102722080d020c060b200228020021080c020b200910262208450d040b2002200836020020042009360200200328020021070b2003200741016a360200200820076a200641807f72200641ff0071200641077622071b3a00002007210620070d000b2001280204220a2001410c6a2802002206410c6c6a210b200141086a280200210c200a2107024002402006450d00200a21072005450d00200b41746a210d200241086a210341002107200a210e0340200e2108024003402008280200220f0d01200741016a2107200b2008410c6a2208470d000c040b0b2008410c6a210e200741016a21102005417f6a2105200841046a290200211103400240024002400240200241046a220428020020032802002206470d00200641016a22092006490d0820064101742201200920092001491b22014100480d082006450d01200228020020062001102722090d020c0a0b200228020021090c020b200110262209450d080b2002200936020020042001360200200328020021060b2003200641016a360200200920066a200741807f72200741ff0071200741077622061b3a00002006210720060d000b2011422088a72212210603400240024002400240200428020020032802002207470d00200741016a22092007490d0820074101742201200920092001491b22014100480d082007450d01200228020020072001102722090d020c0b0b200228020021090c020b200110262209450d090b2002200936020020042001360200200328020021070b2003200741016a360200200920076a200641807f72200641ff0071200641077622071b3a00002007210620070d000b024002400240024020042802002206200328020022076b20124f0d00200720126a22092007490d0720064101742207200920092007491b22074100480d072006450d01200228020020062007102722060d020c0b0b200228020021060c020b200710262206450d090b2002200636020020042007360200200328020021070b2003200720126a360200200620076a200f20121094041a02402011a7450d00200f10230b0240200d2008460d002010210720050d010b0b2008410c6a21070b2007200b460d000340024020072802002206450d00200741046a280200450d00200610230b2007410c6a2207200b470d000b0b0240200c450d00200a10230b2000411a3a00000f0b101e000b20094101102a000b20014101102a000b20014101102a000b20074101102a000bd806010a7f200128020421032001280200210441002105410121064100210720012802082208210902400240024002400240024002400340024020072005470d002005410174220a200541016a220b200b200a491b220a4100480d05024002402005450d0020062005200a102722060d010c040b200a10262206450d030b200a21050b200620076a200941807f72200941ff00712009410776220a1b3a0000200741016a2107200a2109200a0d000b200520076b20084f0d02200720086a22092007490d032005410174220a20092009200a491b22094100480d03024002402005450d0020062005200910272206450d010c030b2009102622060d020b20094101102a000b200a4101102a000b200921050b200620076a200420081094041a02402003450d00200410230b200128020c210c02400240024002400240200520086b20076b200141146a28020022094f0d00200820076a220a20096a2203200a490d052005410174220a20032003200a491b220a4100480d052005450d0120062005200a10272206450d020c030b200820096a20076a21030c030b200a102622060d010b200a4101102a000b200a21050b200620086a20076a200c20091094041a200241086a210a200241046a210820032109034002400240024002402008280200200a2802002207470d00200741016a220b2007490d0520074101742204200b200b2004491b22044100480d052007450d012002280200200720041027220b0d020c060b2002280200210b0c020b20041026220b450d040b2002200b36020020082004360200200a28020021070b200a200741016a360200200b20076a200941807f72200941ff0071200941077622071b3a00002007210920070d000b024002400240200241046a2802002209200241086a28020022076b20034f0d00200720036a220a2007490d0320094101742207200a200a2007491b22074100480d032009450d0120022802002009200710272209450d020c050b200228020021090c050b2007102622090d030b20074101102a000b101e000b20044101102a000b20022009360200200241046a2007360200200241086a28020021070b200241086a200720036a360200200920076a200620031094041a02402005450d00200610230b2000411a3a00000240200141106a280200450d00200c10230b0bbd04020d7f017e230041c0006b22032400200128020022042001280208220541047422066a2107200128020421082004210102400240024002402005450d00200341306a41017221094100210a200341306a41026a210b200341206a410172220c41076a210d02400340200b2004200a6a220141036a2d00003a00002003200141016a2f00003b013020012d0000220e41ac01460d012003410c6a41026a220f200b2d00003a0000200320032f01303b010c200141046a2902002110200341306a410c6a2001410c6a280200360200200920032f010c3b0000200941026a200f2d00003a00002003200e3a003020032010370234200341206a200341306a200210ae022003200c2900003703102003200d29000037001720032d0020220e411a470d042006200a41106a220a470d000c030b0b200141106a21010b20012007460d0003400240024020012d0000220a4109460d00200a41ac01470d010c030b200141086a28020041ffffffff0371450d00200141046a28020010230b200141106a22012007470d000b0b02402008450d00200410230b2000411a3a00000c010b200020032903103700012000200e3a0000200041086a20032900173700000240200541047441706a200a460d00200141186a2101034002400240200141786a220a2d0000220b4109460d00200b41ac01470d010c030b200128020041ffffffff0371450d002001417c6a28020010230b200141106a2101200a41106a2007470d000b0b2008450d0020041023200341c0006a24000f0b200341c0006a24000bd3ec0203077f017e037f230041106b2203240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d0000417f6a220441aa014b0d000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040eab01000b1c1001ab01a801aa01a401240d14a90104151b9b01541e2555063607a201890173279201a101a70135090f8a013a9e01a50105023b44754c74578e01030a47177a7c4285017926297b8b01080e282f1319950197012399019d01a6015ea301189c01611f5d129f01a00121930177760c1145482b1698011d6332940191018c012c1a379a013d2a674d5868644e8001437f318d0188012e8f019601204941309001723e228101624b7d86012d34333940705f6f84018301388701515282017869657e6c603c563f6a4f466d506e5a6b664a59535b5c000b200241086a2802002002410c6a2802002204470dcf01200441016a22052004490dfe0720044101742206200520052006491b22064100480dfe072004450d9f03200241046a2802002004200610272205450da0030c8e080b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dfd0720044101742206200520052006491b22064100480dfd072004450dd602200241046a2802002004200610272205450dd7020c8b080b200241046a2107200141086a2802002106200141046a2802002105200241086a2802002002410c6a2802002204470daa01200441016a22082004490d870820044101742209200820082009491b22084100480d87082004450dd70220072802002004200810272209450dd8020c85080b200241046a2105200141086a290300210a200241086a2802002002410c6a2802002204470daa01200441016a22062004490d860820044101742208200620062008491b22084100480d86082004450dd80220052802002004200810272206450dd9020c82080b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dfa0720044101742206200520052006491b22064100480dfa072004450dd902200241046a2802002004200610272205450dda020cff070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490d840820044101742209200820082009491b22084100480d84082004450dda0220072802002004200810272209450ddb020cfc070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490df80720044101742209200820082009491b22084100480df8072004450ddb0220072802002004200810272209450ddc020cf6070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490df70720044101742209200820082009491b22084100480df7072004450ddc0220072802002004200810272209450ddd020cf3070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d810820044101742206200520052006491b22064100480d81082004450ddd02200241046a2802002004200610272205450dde020cf0070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490df50720044101742209200820082009491b22084100480df5072004450dde0220072802002004200810272209450ddf020ced070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dff0720044101742206200520052006491b22064100480dff072004450ddf02200241046a2802002004200610272205450de0020cea070b200241046a210520012d00012108200241086a2802002002410c6a2802002204470daa01200441016a22062004490df30720044101742209200620062009491b22094100480df3072004450de00220052802002004200910272206450de1020ce7070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490da30520044101742206200520052006491b22064100480da3052004450de102200241046a2802002004200610272205450de2020ce4070b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470daa01200641016a22052006490df10720064101742208200520052008491b22054100480df1072006450de20220072802002006200510272208450de3020ce1070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dfb0720044101742206200520052006491b22064100480dfb072004450de302200241046a2802002004200610272205450de4020cde070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490dfa0720044101742209200820082009491b22084100480dfa072004450de40220072802002004200810272209450de5020cdb070b200241046a210520012d00012108200241086a2802002002410c6a2802002204470daa01200441016a22062004490dee0720044101742209200620062009491b22094100480dee072004450de50220052802002004200910272206450de6020cd8070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d9e0520044101742206200520052006491b22064100480d9e052004450de602200241046a2802002004200610272205450de7020cd5070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df70720044101742206200520052006491b22064100480df7072004450de702200241046a2802002004200610272205450de8020cd2070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df60720044101742206200520052006491b22064100480df6072004450de802200241046a2802002004200610272205450de9020ccf070b200241046a210b200141046a280200210520012d0001210c200241086a2802002002410c6a2802002204470daa01200441016a22062004490dea0720044101742208200620062008491b22064100480dea072004450de902200b2802002004200610272208450dea020ccc070b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470daa01200641016a22052006490de90720064101742208200520052008491b22054100480de9072006450dea0220072802002006200510272208450deb020cc9070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d990520044101742206200520052006491b22064100480d99052004450deb02200241046a2802002004200610272205450dec020cc6070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df20720044101742206200520052006491b22064100480df2072004450dec02200241046a2802002004200610272205450ded020cc3070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df10720044101742206200520052006491b22064100480df1072004450ded02200241046a2802002004200610272205450dee020cc0070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df00720044101742206200520052006491b22064100480df0072004450dee02200241046a2802002004200610272205450def020cbd070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d950520044101742206200520052006491b22064100480d95052004450def02200241046a2802002004200610272205450df0020cba070b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470daa01200641016a22052006490de30720064101742208200520052008491b22054100480de3072006450df00220072802002006200510272208450df1020cb7070b200241046a210520012d00012108200241086a2802002002410c6a2802002204470daa01200441016a22062004490de20720044101742209200620062009491b22094100480de2072004450df10220052802002004200910272206450df2020cb4070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d920520044101742206200520052006491b22064100480d92052004450df202200241046a2802002004200610272205450df3020cb1070b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470daa01200641016a22052006490de00720064101742208200520052008491b22054100480de0072006450df30220072802002006200510272208450df4020cae070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dea0720044101742206200520052006491b22064100480dea072004450df402200241046a2802002004200610272205450df5020cab070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d8f0520044101742206200520052006491b22064100480d8f052004450df502200241046a2802002004200610272205450df6020ca8070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490de80720044101742206200520052006491b22064100480de8072004450df602200241046a2802002004200610272205450df7020ca5070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d8d0520044101742206200520052006491b22064100480d8d052004450df702200241046a2802002004200610272205450df8020ca2070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490de60720044101742206200520052006491b22064100480de6072004450df802200241046a2802002004200610272205450df9020c9f070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dda0720044101742206200520052006491b22064100480dda072004450df902200241046a2802002004200610272205450dfa020c9c070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dd90720044101742209200820082009491b22084100480dd9072004450dfc0220072802002004200810272209450dfd020c99070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de30720044101742206200520052006491b22064100480de3072004450dfd02200241046a2802002004200610272205450dfe020c96070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dd70720044101742209200820082009491b22084100480dd7072004450dfe0220072802002004200810272209450dff020c93070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de10720044101742206200520052006491b22064100480de1072004450dff02200241046a2802002004200610272205450d80030c90070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de00720044101742206200520052006491b22064100480de0072004450d8003200241046a2802002004200610272205450d81030c8d070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d850520044101742206200520052006491b22064100480d85052004450d8103200241046a2802002004200610272205450d82030c8a070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d840520044101742206200520052006491b22064100480d84052004450d8203200241046a2802002004200610272205450d83030c87070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d830520044101742206200520052006491b22064100480d83052004450d8303200241046a2802002004200610272205450d84030c84070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d820520044101742206200520052006491b22064100480d82052004450d8403200241046a2802002004200610272205450d85030c81070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d810520044101742206200520052006491b22064100480d81052004450d8503200241046a2802002004200610272205450d86030cfe060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dda0720044101742206200520052006491b22064100480dda072004450d8603200241046a2802002004200610272205450d87030cfb060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dff0420044101742206200520052006491b22064100480dff042004450d8703200241046a2802002004200610272205450d88030cf8060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfe0420044101742206200520052006491b22064100480dfe042004450d8803200241046a2802002004200610272205450d89030cf5060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfd0420044101742206200520052006491b22064100480dfd042004450d8903200241046a2802002004200610272205450d8a030cf2060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfc0420044101742206200520052006491b22064100480dfc042004450d8a03200241046a2802002004200610272205450d8b030cef060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfb0420044101742206200520052006491b22064100480dfb042004450d8b03200241046a2802002004200610272205450d8c030cec060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dc90720044101742209200820082009491b22084100480dc9072004450d8c0320072802002004200810272209450d8d030ce9060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dc80720044101742209200820082009491b22084100480dc8072004450d8d0320072802002004200810272209450d8e030ce6060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df80420044101742206200520052006491b22064100480df8042004450d8e03200241046a2802002004200610272205450d8f030ce3060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df70420044101742206200520052006491b22064100480df7042004450d8f03200241046a2802002004200610272205450d90030ce0060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df60420044101742206200520052006491b22064100480df6042004450d9003200241046a2802002004200610272205450d91030cdd060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dcf0720044101742209200820082009491b22084100480dcf072004450d910320072802002004200810272209450d92030cda060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dce0720044101742209200820082009491b22084100480dce072004450d920320072802002004200810272209450d93030cd7060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df30420044101742206200520052006491b22064100480df3042004450d9303200241046a2802002004200610272205450d94030cd4060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df20420044101742206200520052006491b22064100480df2042004450d9403200241046a2802002004200610272205450d95030cd1060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df10420044101742206200520052006491b22064100480df1042004450d9503200241046a2802002004200610272205450d96030cce060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df00420044101742206200520052006491b22064100480df0042004450d9603200241046a2802002004200610272205450d97030ccb060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490def0420044101742206200520052006491b22064100480def042004450d9703200241046a2802002004200610272205450d98030cc8060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dee0420044101742206200520052006491b22064100480dee042004450d9803200241046a2802002004200610272205450d99030cc5060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc70720044101742206200520052006491b22064100480dc7072004450d9903200241046a2802002004200610272205450d9a030cc2060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dec0420044101742206200520052006491b22064100480dec042004450d9a03200241046a2802002004200610272205450d9b030cbf060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dc50720044101742209200820082009491b22084100480dc5072004450d9b0320072802002004200810272209450d9c030cbc060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dea0420044101742206200520052006491b22064100480dea042004450d9c03200241046a2802002004200610272205450d9d030cb9060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dea0420044101742206200520052006491b22064100480dea042004450d9d03200241046a2802002004200610272205450d9e030cb6060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc20720044101742206200520052006491b22064100480dc2072004450d9e03200241046a2802002004200610272205450d9f030cb3060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de70420044101742206200520052006491b22064100480de7042004450d9f03200241046a2802002004200610272205450da0030cb0060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de60420044101742206200520052006491b22064100480de6042004450da003200241046a2802002004200610272205450da1030cad060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de60420044101742206200520052006491b22064100480de6042004450da103200241046a2802002004200610272205450da2030caa060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de40420044101742206200520052006491b22064100480de4042004450da203200241046a2802002004200610272205450da3030ca7060b200241046a210520012d00012108200241086a2802002002410c6a2802002204470dab01200441016a22062004490dbd0720044101742209200620062009491b22094100480dbd072004450da30320052802002004200910272206450da4030ca4060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de20420044101742206200520052006491b22064100480de2042004450da403200241046a2802002004200610272205450da5030ca1060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de10420044101742206200520052006491b22064100480de1042004450da503200241046a2802002004200610272205450da6030c9e060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de00420044101742206200520052006491b22064100480de0042004450da603200241046a2802002004200610272205450da7030c9b060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de00420044101742206200520052006491b22064100480de0042004450da703200241046a2802002004200610272205450da8030c98060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dde0420044101742206200520052006491b22064100480dde042004450da803200241046a2802002004200610272205450da9030c95060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490ddd0420044101742206200520052006491b22064100480ddd042004450da903200241046a2802002004200610272205450daa030c92060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490ddd0420044101742206200520052006491b22064100480ddd042004450daa03200241046a2802002004200610272205450dab030c8f060b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470dab01200641016a22052006490daa0720064101742208200520052008491b22054100480daa072006450dab0320072802002006200510272208450dac030c8c060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490da90720044101742209200820082009491b22084100480da9072004450dac0320072802002004200810272209450dad030c89060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd90420044101742206200520052006491b22064100480dd9042004450dad03200241046a2802002004200610272205450dae030c86060b200141086a290300210a200241086a2802002002410c6a2802002204470dab01200441016a22052004490db20720044101742206200520052006491b22064100480db2072004450dae03200241046a2802002004200610272205450daf030c82060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd70420044101742206200520052006491b22064100480dd7042004450daf03200241046a2802002004200610272205450db0030cff050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd70420044101742206200520052006491b22064100480dd7042004450db003200241046a2802002004200610272205450db1030cfc050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd60420044101742206200520052006491b22064100480dd6042004450db103200241046a2802002004200610272205450db2030cf9050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd50420044101742206200520052006491b22064100480dd5042004450db203200241046a2802002004200610272205450db3030cf6050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd40420044101742206200520052006491b22064100480dd4042004450db303200241046a2802002004200610272205450db4030cf3050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dac0720044101742206200520052006491b22064100480dac072004450db403200241046a2802002004200610272205450db5030cf0050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dab0720044101742206200520052006491b22064100480dab072004450db503200241046a2802002004200610272205450db6030ced050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd00420044101742206200520052006491b22064100480dd0042004450db603200241046a2802002004200610272205450db7030cea050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dcf0420044101742206200520052006491b22064100480dcf042004450db703200241046a2802002004200610272205450db8030ce7050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da80720044101742206200520052006491b22064100480da8072004450db803200241046a2802002004200610272205450db9030ce4050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dcd0420044101742206200520052006491b22064100480dcd042004450db903200241046a2802002004200610272205450dba030ce1050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dcc0420044101742206200520052006491b22064100480dcc042004450dba03200241046a2802002004200610272205450dbb030cde050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dcb0420044101742206200520052006491b22064100480dcb042004450dbb03200241046a2802002004200610272205450dbc030cdb050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dca0420044101742206200520052006491b22064100480dca042004450dbc03200241046a2802002004200610272205450dbd030cd8050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dca0420044101742206200520052006491b22064100480dca042004450dbd03200241046a2802002004200610272205450dbe030cd5050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc80420044101742206200520052006491b22064100480dc8042004450dbe03200241046a2802002004200610272205450dbf030cd2050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc70420044101742206200520052006491b22064100480dc7042004450dbf03200241046a2802002004200610272205450dc0030ccf050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc60420044101742206200520052006491b22064100480dc6042004450dc003200241046a2802002004200610272205450dc1030ccc050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc50420044101742206200520052006491b22064100480dc5042004450dc103200241046a2802002004200610272205450dc2030cc9050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc50420044101742206200520052006491b22064100480dc5042004450dc203200241046a2802002004200610272205450dc3030cc6050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc30420044101742206200520052006491b22064100480dc3042004450dc303200241046a2802002004200610272205450dc4030cc3050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc30420044101742206200520052006491b22064100480dc3042004450dc403200241046a2802002004200610272205450dc5030cc0050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc20420044101742206200520052006491b22064100480dc2042004450dc503200241046a2802002004200610272205450dc6030cbd050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc00420044101742206200520052006491b22064100480dc0042004450dc603200241046a2802002004200610272205450dc7030cba050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dbf0420044101742206200520052006491b22064100480dbf042004450dc703200241046a2802002004200610272205450dc8030cb7050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d8d0720044101742206200520052006491b22064100480d8d072004450dc803200241046a2802002004200610272205450dc9030cb4050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dbd0420044101742206200520052006491b22064100480dbd042004450dc903200241046a2802002004200610272205450dca030cb1050b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490d8b0720044101742209200820082009491b22084100480d8b072004450dca0320072802002004200810272209450dcb030cae050b200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22052004490d950720044101742208200520052008491b22084100480d95072004450dcb03200241046a2802002004200810272205450dcc030cab050b200241046a210520012d00012108200241086a2802002002410c6a2802002204470dab01200441016a22062004490d940720044101742209200620062009491b22094100480d94072004450dcc0320052802002004200910272206450dcd030ca8050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db90420044101742206200520052006491b22064100480db9042004450dcd03200241046a2802002004200610272205450dce030ca5050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db80420044101742206200520052006491b22064100480db8042004450dce03200241046a2802002004200610272205450dcf030ca2050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db70420044101742206200520052006491b22064100480db7042004450dcf03200241046a2802002004200610272205450dd0030c9f050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d900720044101742206200520052006491b22064100480d90072004450dd003200241046a2802002004200610272205450dd1030c9c050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d8f0720044101742206200520052006491b22064100480d8f072004450dd103200241046a2802002004200610272205450dd2030c99050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d8e0720044101742206200520052006491b22064100480d8e072004450dd203200241046a2802002004200610272205450dd3030c96050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d8d0720044101742206200520052006491b22064100480d8d072004450dd303200241046a2802002004200610272205450dd4030c93050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db20420044101742206200520052006491b22064100480db2042004450dd403200241046a2802002004200610272205450dd5030c90050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db10420044101742206200520052006491b22064100480db1042004450dd503200241046a2802002004200610272205450dd6030c8d050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db00420044101742206200520052006491b22064100480db0042004450dd603200241046a2802002004200610272205450dd7030c8a050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490daf0420044101742206200520052006491b22064100480daf042004450dd703200241046a2802002004200610272205450dd8030c87050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dae0420044101742206200520052006491b22064100480dae042004450dd803200241046a2802002004200610272205450dd9030c84050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dad0420044101742206200520052006491b22064100480dad042004450dd903200241046a2802002004200610272205450dda030c81050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dac0420044101742206200520052006491b22064100480dac042004450dda03200241046a2802002004200610272205450ddb030cfe040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dab0420044101742206200520052006491b22064100480dab042004450ddb03200241046a2802002004200610272205450ddc030cfb040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d840720044101742206200520052006491b22064100480d84072004450ddc03200241046a2802002004200610272205450ddd030cf8040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da90420044101742206200520052006491b22064100480da9042004450ddd03200241046a2802002004200610272205450dde030cf5040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da80420044101742206200520052006491b22064100480da8042004450dde03200241046a2802002004200610272205450ddf030cf2040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da70420044101742206200520052006491b22064100480da7042004450ddf03200241046a2802002004200610272205450de0030cef040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490df50620044101742209200820082009491b22084100480df5062004450de00320072802002004200810272209450de1030cec040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dff0620044101742209200820082009491b22084100480dff062004450de10320072802002004200810272209450de2030ce9040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfe0620044101742206200520052006491b22064100480dfe062004450de203200241046a2802002004200610272205450de3030ce6040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da30420044101742206200520052006491b22064100480da3042004450de303200241046a2802002004200610272205450de4030ce3040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da20420044101742206200520052006491b22064100480da2042004450de403200241046a2802002004200610272205450de5030ce0040b200241046a2105200141046a2802002108200241086a2802002002410c6a2802002204470dab01200441016a22062004490dfb0620044101742209200620062009491b22094100480dfb062004450de50320052802002004200910272206450de6030cdd040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da00420044101742206200520052006491b22064100480da0042004450de603200241046a2802002004200610272205450de7030cda040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d9f0420044101742206200520052006491b22064100480d9f042004450de703200241046a2802002004200610272205450de8030cd7040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d9e0420044101742206200520052006491b22064100480d9e042004450de803200241046a2802002004200610272205450de9030cd4040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dec0620044101742209200820082009491b22084100480dec062004450de90320072802002004200810272209450dea030cd1040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df60620044101742206200520052006491b22064100480df6062004450dea03200241046a2802002004200610272205450deb030cce040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d9b0420044101742206200520052006491b22064100480d9b042004450deb03200241046a2802002004200610272205450dec030ccb040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df40620044101742206200520052006491b22064100480df4062004450dec03200241046a2802002004200610272205450ded030cc8040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d990420044101742206200520052006491b22064100480d99042004450ded03200241046a2802002004200610272205450dee030cc5040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df20620044101742206200520052006491b22064100480df2062004450dee03200241046a2802002004200610272205450def030cc2040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d970420044101742206200520052006491b22064100480d97042004450def03200241046a2802002004200610272205450df0030cbf040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df00620044101742206200520052006491b22064100480df0062004450df003200241046a2802002004200610272205450df1030cbc040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d950420044101742206200520052006491b22064100480d95042004450df103200241046a2802002004200610272205450df2030cb9040b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470dab01200641016a22052006490de30620064101742208200520052008491b22054100480de3062006450df20320072802002006200510272208450df3030cb6040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490ded0620044101742206200520052006491b22064100480ded062004450df303200241046a2802002004200610272205450df4030cb3040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dec0620044101742206200520052006491b22064100480dec062004450df403200241046a2802002004200610272205450df5030cb0040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490deb0620044101742209200820082009491b22084100480deb062004450df50320072802002004200810272209450df6030cad040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dea0620044101742206200520052006491b22064100480dea062004450df603200241046a2802002004200610272205450df7030caa040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de90620044101742206200520052006491b22064100480de9062004450df703200241046a2802002004200610272205450df8030ca7040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490ddd0620044101742209200820082009491b22084100480ddd062004450df80320072802002004200810272209450df9030ca4040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490ddc0620044101742209200820082009491b22084100480ddc062004450df90320072802002004200810272209450dfa030ca1040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de60620044101742206200520052006491b22064100480de6062004450dfa03200241046a2802002004200610272205450dfb030c9e040b200241046a21092001410c6a2802002104200141086a280200210b200141046a280200210d200241086a2802002002410c6a2802002205470dab01200541016a22012005490dda0620054101742206200120012006491b22014100480dda062005450dfb0320092802002005200110272206450dfc030c9b040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490de40620044101742209200820082009491b22084100480de4062004450dfc0320072802002004200810272209450dfd030c98040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de30620044101742206200520052006491b22064100480de3062004450dfd03200241046a2802002004200610272205450dfe030c95040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dd70620044101742209200820082009491b22084100480dd7062004450dfe0320072802002004200810272209450dff030c92040b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470dab01200641016a22052006490dd60620064101742208200520052008491b22054100480dd6062006450dff0320072802002006200510272208450d80040c8f040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd50620044101742206200520052006491b22064100480dd5062004450d8004200241046a2802002004200610272205450d81040c8c040b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470dab01200641016a22052006490dd40620064101742208200520052008491b22054100480dd4062006450d810420072802002006200510272208450d82040c89040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd30620044101742206200520052006491b22064100480dd3062004450d8204200241046a2802002004200610272205450d83040c86040b200241046a28020021050ce1060b200728020021090cdb060b200528020021060cd8060b200241046a28020021050cd5060b200728020021090cd2060b200728020021090ccc060b200728020021090cc9060b200241046a28020021050cc6060b200728020021090cc3060b200241046a28020021050cc0060b200528020021060cbd060b200241046a28020021050cba060b200728020021080cb7060b200241046a28020021050cb4060b200728020021090cb1060b200528020021060cae060b200241046a28020021050cab060b200241046a28020021050ca8060b200241046a28020021050ca5060b200b28020021080ca2060b200728020021080c9f060b200241046a28020021050c9c060b200241046a28020021050c99060b200241046a28020021050c96060b200241046a28020021050c93060b200241046a28020021050c90060b200728020021080c8d060b200528020021060c8a060b200241046a28020021050c87060b200728020021080c84060b200241046a28020021050c81060b200241046a28020021050cfe050b200241046a28020021050cfb050b200241046a28020021050cf8050b200241046a28020021050cf5050b200241046a28020021050cf2050b200241046a28020021050cbf060b200728020021090cee050b200241046a28020021050ceb050b200728020021090ce8050b200241046a28020021050ce5050b200241046a28020021050ce2050b200241046a28020021050cdf050b200241046a28020021050cdc050b200241046a28020021050cd9050b200241046a28020021050cd6050b200241046a28020021050cd3050b200241046a28020021050cd0050b200241046a28020021050ccd050b200241046a28020021050cca050b200241046a28020021050cc7050b200241046a28020021050cc4050b200241046a28020021050cc1050b200728020021090cbe050b200728020021090cbb050b200241046a28020021050cb8050b200241046a28020021050cb5050b200241046a28020021050cb2050b200728020021090caf050b200728020021090cac050b200241046a28020021050ca9050b200241046a28020021050ca6050b200241046a28020021050ca3050b200241046a28020021050ca0050b200241046a28020021050c9d050b200241046a28020021050c9a050b200241046a28020021050c97050b200241046a28020021050c94050b200728020021090c91050b200241046a28020021050c8e050b200241046a28020021050c8b050b200241046a28020021050c88050b200241046a28020021050c85050b200241046a28020021050c82050b200241046a28020021050cff040b200241046a28020021050cfc040b200528020021060cf9040b200241046a28020021050cf6040b200241046a28020021050cf3040b200241046a28020021050cf0040b200241046a28020021050ced040b200241046a28020021050cea040b200241046a28020021050ce7040b200241046a28020021050ce4040b200728020021080ce1040b200728020021090cde040b200241046a28020021050cdb040b200241046a28020021050cd7040b200241046a28020021050cd4040b200241046a28020021050cd1040b200241046a28020021050cce040b200241046a28020021050ccb040b200241046a28020021050cc8040b200241046a28020021050cc5040b200241046a28020021050cc2040b200241046a28020021050cbf040b200241046a28020021050cbc040b200241046a28020021050cb9040b200241046a28020021050cb6040b200241046a28020021050cb3040b200241046a28020021050cb0040b200241046a28020021050cad040b200241046a28020021050caa040b200241046a28020021050ca7040b200241046a28020021050ca4040b200241046a28020021050ca1040b200241046a28020021050c9e040b200241046a28020021050c9b040b200241046a28020021050c98040b200241046a28020021050c95040b200241046a28020021050c92040b200241046a28020021050c8f040b200241046a28020021050c8c040b200241046a28020021050c89040b200241046a28020021050c86040b200728020021090c83040b200241046a28020021050c80040b200528020021060cfd030b200241046a28020021050cfa030b200241046a28020021050cf7030b200241046a28020021050cf4030b200241046a28020021050cf1030b200241046a28020021050cee030b200241046a28020021050ceb030b200241046a28020021050ce8030b200241046a28020021050ce5030b200241046a28020021050ce2030b200241046a28020021050cdf030b200241046a28020021050cdc030b200241046a28020021050cd9030b200241046a28020021050cd6030b200241046a28020021050cd3030b200241046a28020021050cd0030b200241046a28020021050ccd030b200241046a28020021050cca030b200241046a28020021050cc7030b200241046a28020021050cc4030b200728020021090cc1030b200728020021090cbe030b200241046a28020021050cbb030b200241046a28020021050cb8030b200241046a28020021050cb5030b200528020021060cb2030b200241046a28020021050caf030b200241046a28020021050cac030b200241046a28020021050ca9030b200728020021090ca6030b200241046a28020021050ca3030b200241046a28020021050ca0030b200241046a28020021050c9d030b200241046a28020021050c9a030b200241046a28020021050c97030b200241046a28020021050c94030b200241046a28020021050c91030b200241046a28020021050c8e030b200728020021080c8b030b200241046a28020021050c88030b200241046a28020021050c85030b200728020021090c82030b200241046a28020021050cff020b200241046a28020021050cfc020b200728020021090cf9020b200728020021090cf6020b200241046a28020021050cf3020b200928020021060cf0020b200728020021090ced020b200241046a28020021050cea020b200728020021090ce7020b200728020021080ce4020b200241046a28020021050ce1020b200728020021080cde020b200241046a28020021050cdb020b2006102622050db4050b20064101102a000b2008102622090dad050b20084101102a000b2008102622060da9050b20084101102a000b2006102622050da5050b20064101102a000b2008102622090da1050b20084101102a000b2008102622090d9a050b20084101102a000b2008102622090d96050b20084101102a000b2006102622050d92050b20064101102a000b2008102622090d8e050b20084101102a000b2006102622050d8a050b20064101102a000b2009102622060d86050b20094101102a000b2006102622050d82050b20064101102a000b2005102622080dfe040b20054101102a000b2006102622050dfa040b20064101102a000b2008102622090df6040b20084101102a000b2009102622060df2040b20094101102a000b2006102622050dee040b20064101102a000b2006102622050dea040b20064101102a000b2006102622050de6040b20064101102a000b2006102622080de2040b20064101102a000b2005102622080dde040b20054101102a000b2006102622050dda040b20064101102a000b2006102622050dd6040b20064101102a000b2006102622050dd2040b20064101102a000b2006102622050dce040b20064101102a000b2006102622050dca040b20064101102a000b2005102622080dc6040b20054101102a000b2009102622060dc2040b20094101102a000b2006102622050dbe040b20064101102a000b2005102622080dba040b20054101102a000b2006102622050db6040b20064101102a000b2006102622050db2040b20064101102a000b2006102622050dae040b20064101102a000b2006102622050daa040b20064101102a000b2006102622050da6040b20064101102a000b2006102622050da2040b20064101102a000b2006102622050dee040b20064101102a000b2008102622090d9c040b20084101102a000b2006102622050d98040b20064101102a000b2008102622090d94040b20084101102a000b2006102622050d90040b20064101102a000b2006102622050d8c040b20064101102a000b2006102622050d88040b20064101102a000b2006102622050d84040b20064101102a000b2006102622050d80040b20064101102a000b2006102622050dfc030b20064101102a000b2006102622050df8030b20064101102a000b2006102622050df4030b20064101102a000b2006102622050df0030b20064101102a000b2006102622050dec030b20064101102a000b2006102622050de8030b20064101102a000b2006102622050de4030b20064101102a000b2006102622050de0030b20064101102a000b2008102622090ddc030b20084101102a000b2008102622090dd8030b20084101102a000b2006102622050dd4030b20064101102a000b2006102622050dd0030b20064101102a000b2006102622050dcc030b20064101102a000b2008102622090dc8030b20084101102a000b2008102622090dc4030b20084101102a000b2006102622050dc0030b20064101102a000b2006102622050dbc030b20064101102a000b2006102622050db8030b20064101102a000b2006102622050db4030b20064101102a000b2006102622050db0030b20064101102a000b2006102622050dac030b20064101102a000b2006102622050da8030b20064101102a000b2006102622050da4030b20064101102a000b2008102622090da0030b20084101102a000b2006102622050d9c030b20064101102a000b2006102622050d98030b20064101102a000b2006102622050d94030b20064101102a000b2006102622050d90030b20064101102a000b2006102622050d8c030b20064101102a000b2006102622050d88030b20064101102a000b2006102622050d84030b20064101102a000b2009102622060d80030b20094101102a000b2006102622050dfc020b20064101102a000b2006102622050df8020b20064101102a000b2006102622050df4020b20064101102a000b2006102622050df0020b20064101102a000b2006102622050dec020b20064101102a000b2006102622050de8020b20064101102a000b2006102622050de4020b20064101102a000b2005102622080de0020b20054101102a000b2008102622090ddc020b20084101102a000b2006102622050dd8020b20064101102a000b2006102622050dd3020b20064101102a000b2006102622050dcf020b20064101102a000b2006102622050dcb020b20064101102a000b2006102622050dc7020b20064101102a000b2006102622050dc3020b20064101102a000b2006102622050dbf020b20064101102a000b2006102622050dbb020b20064101102a000b2006102622050db7020b20064101102a000b2006102622050db3020b20064101102a000b2006102622050daf020b20064101102a000b2006102622050dab020b20064101102a000b2006102622050da7020b20064101102a000b2006102622050da3020b20064101102a000b2006102622050d9f020b20064101102a000b2006102622050d9b020b20064101102a000b2006102622050d97020b20064101102a000b2006102622050d93020b20064101102a000b2006102622050d8f020b20064101102a000b2006102622050d8b020b20064101102a000b2006102622050d87020b20064101102a000b2006102622050d83020b20064101102a000b2006102622050dff010b20064101102a000b2006102622050dfb010b20064101102a000b2006102622050df7010b20064101102a000b2006102622050df3010b20064101102a000b2006102622050def010b20064101102a000b2006102622050deb010b20064101102a000b2006102622050de7010b20064101102a000b2008102622090de3010b20084101102a000b2008102622050ddf010b20084101102a000b2009102622060ddb010b20094101102a000b2006102622050dd7010b20064101102a000b2006102622050dd3010b20064101102a000b2006102622050dcf010b20064101102a000b2006102622050dcb010b20064101102a000b2006102622050dc7010b20064101102a000b2006102622050dc3010b20064101102a000b2006102622050dbf010b20064101102a000b2006102622050dbb010b20064101102a000b2006102622050db7010b20064101102a000b2006102622050db3010b20064101102a000b2006102622050daf010b20064101102a000b2006102622050dab010b20064101102a000b2006102622050da7010b20064101102a000b2006102622050da3010b20064101102a000b2006102622050d9f010b20064101102a000b2006102622050d9b010b20064101102a000b2006102622050d97010b20064101102a000b2006102622050d93010b20064101102a000b2006102622050d8f010b20064101102a000b2008102622090d8b010b20084101102a000b2008102622090d87010b20084101102a000b2006102622050d83010b20064101102a000b2006102622050d7f0b20064101102a000b2006102622050d7b0b20064101102a000b2009102622060d770b20094101102a000b2006102622050d730b20064101102a000b2006102622050d6f0b20064101102a000b2006102622050d6b0b20064101102a000b2008102622090d670b20084101102a000b2006102622050d630b20064101102a000b2006102622050d5f0b20064101102a000b2006102622050d5b0b20064101102a000b2006102622050d570b20064101102a000b2006102622050d530b20064101102a000b2006102622050d4f0b20064101102a000b2006102622050d4b0b20064101102a000b2006102622050d470b20064101102a000b2005102622080d430b20054101102a000b2006102622050d3f0b20064101102a000b2006102622050d3b0b20064101102a000b2008102622090d370b20084101102a000b2006102622050d330b20064101102a000b2006102622050d2f0b20064101102a000b2008102622090d2b0b20084101102a000b2008102622090d270b20084101102a000b2006102622050d230b20064101102a000b2001102622060d1f0b20014101102a000b2008102622090d1b0b20084101102a000b2006102622050d170b20064101102a000b2008102622090d130b20084101102a000b2005102622080d0f0b20054101102a000b2006102622050d0b0b20064101102a000b2005102622080d070b20054101102a000b2006102622050d030b20064101102a000b101e000b101e000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a410b3a00000cdd020b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a410d3a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490dcf0220024101742209200620062009491b22094100480dcf022002450d01200728020020022009102722060d020c050b200728020021060c020b200910262206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000cdd020b0b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a411a3a00000cd9020b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a410c3a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490dcb0220024101742209200620062009491b22094100480dcb022002450d01200728020020022009102722060d020c050b200728020021060c020b200910262206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000cd9020b0b20094101102a000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41333a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dca022004410174220d20092009200d491b220d4100480dca022004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dca0220024101742209200620062009491b22094100480dca022002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cd8020b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41dc003a00000cd3020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413a3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dd1022004410174220d20092009200d491b220d4100480dd1022004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dd10220024101742209200620062009491b22094100480dd1022002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cd4020b0b200d4101102a000b20094101102a000b200241086a2001360200200241046a20063602002002410c6a28020021050b2002410c6a2201200541016a360200200620056a410e3a00002003200b200d200d200b4102746a200210af020240024020032d0000411a470d00200241086a2106200241046a210703400240024002400240200628020020012802002202470d00200241016a22052002490dc40220024101742208200520052008491b22084100480dc4022002450d01200928020020022008102722050d020c060b200928020021050c020b200810262205450d040b2006200836020020072005360200200128020021020b2001200241016a360200200520026a200441807f72200441ff0071200441077622021b3a00002002210420020d000b0240200b41ffffffff0371450d00200d10230b2000411a3a0000200341106a24000f0b20002003290300370200200041086a200341086a290300370200200b41ffffffff0371450dd102200d1023200341106a24000f0b20084101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41de003a00000ccd020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412d3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dc0022004410174220d20092009200d491b220d4100480dc0022004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dc00220024101742209200620062009491b22094100480dc0022002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cce020b0b200d4101102a000b20094101102a000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41323a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dbe022004410174220d20092009200d491b220d4100480dbe022004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dbe0220024101742209200620062009491b22094100480dbe022002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000ccc020b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e6003a00000cc7020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e5003a00000cc5020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41393a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dc3022004410174220d20092009200d491b220d4100480dc3022004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dc30220024101742209200620062009491b22094100480dc3022002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cc6020b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41db003a00000cc1020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e0003a00000cbf020b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41223a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490db10220024101742209200620062009491b22094100480db1022002450d01200728020020022009102722060d020c050b200728020021060c020b200910262206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000cbf020b0b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fb003a00000cbb020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41da003a00000cb9020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f1003a00000cb7020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d8003a00000cb5020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418c013a00000cb3020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d7003a00000cb1020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f5003a00000caf020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e8003a00000cad020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41313a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490da0022004410174220d20092009200d491b220d4100480da0022004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490da00220024101742209200620062009491b22094100480da0022002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cae020b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f6003a00000ca9020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4191013a00000ca7020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418b013a00000ca5020b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41c3003a000002400240024002400240200241086a2802002206200928020022046b41044f0d00200441046a22092004490da10220064101742204200920092004491b22044100480da1022006450d0120052802002006200410272205450d020c030b200528020021050c030b2004102622050d010b20044101102a000b200241086a2004360200200241046a20053602002002410c6a28020021040b2002410c6a200441046a360200200520046a20083600000ca3020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4188013a00000ca1020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f7003a00000c9f020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d0003a00000c9d020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41373a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d9b022004410174220d20092009200d491b220d4100480d9b022004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d9b0220024101742209200620062009491b22094100480d9b022002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c9e020b0b200d4101102a000b20094101102a000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412e3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d8e022004410174220d20092009200d491b220d4100480d8e022004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d8e0220024101742209200620062009491b22094100480d8e022002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c9c020b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4189013a00000c97020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a5013a00000c95020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4199013a00000c93020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cb003a00000c91020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a2013a00000c8f020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a3013a00000c8d020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a8013a00000c8b020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4195013a00000c89020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4184013a00000c87020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4186013a00000c85020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ac013a00000c83020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4198013a00000c81020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c9003a00000cff010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cf003a00000cfd010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c8003a00000cfb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cc003a00000cf9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a9013a00000cf7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e9003a00000cf5010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ea003a00000cf3010b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a413f3a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490def0120044101742209200620062009491b22064100480def012004450d0120052802002004200610272205450d020c030b200528020021050c030b2006102622050d010b20064101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a20083a00000cf1010b200241086a2008360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c1003a000020032006200210b00220032d0000411a460def0120002003290300370200200041086a200341086a29030037020020012d00004109470df0010c3a0b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412f3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490de2012004410174220d20092009200d491b220d4100480de2012004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490de20120024101742209200620062009491b22094100480de2012002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cf0010b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4192013a00000ceb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41003a00000ce9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419f013a00000ce7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a1013a00000ce5010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b7013a00000ce3010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b5013a00000ce1010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ad013a00000cdf010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b9013a00000cdd010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b2013a00000cdb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41aa013a00000cd9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4181013a00000cd7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fe003a00000cd5010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ba013a00000cd3010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ab013a00000cd1010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4182013a00000ccf010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f3003a00000ccd010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4196013a00000ccb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e1003a00000cc9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ae013a00000cc7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a0013a00000cc5010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41dd003a00000cc3010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e3003a00000cc1010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bf013a00000cbf010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41be013a00000cbd010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b8013a00000cbb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bc013a00000cb9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4180013a00000cb7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c2003a00002003200a200210b10220032d0000411a460db50120002003290300370200200041086a200341086a29030037020020012d00004109470db6010b200141086a28020041ffffffff0371450db501200141046a2802001023200341106a24000f0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b0013a00000cb2010b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41293a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490da5012004410174220d20092009200d491b220d4100480da5012004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490da50120024101742209200620062009491b22094100480da5012002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cb3010b0b200d4101102a000b20094101102a000b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41233a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490da20120024101742209200620062009491b22094100480da2012002450d01200728020020022009102722060d020c050b200728020021060c020b200910262206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000cb0010b0b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bd013a00000cac010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a7013a00000caa010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a6013a00000ca8010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b6013a00000ca6010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b3013a00000ca4010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4183013a00000ca2010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ff003a00000ca0010b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41c0003a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490d9c0120044101742209200620062009491b22064100480d9c012004450d0120052802002004200610272205450d020c030b200528020021050c030b2006102622050d010b20064101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a20083a00000c9e010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4197013a00000c9c010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bb013a00000c9a010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418e013a00000c98010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ee003a00000c96010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c6003a00000c94010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b4013a00000c92010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ed003a00000c90010b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413e3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d8e012004410174220d20092009200d491b220d4100480d8e012004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d8e0120024101742209200620062009491b22094100480d8e012002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c91010b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4185013a00000c8c010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ca003a00000c8a010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418f013a00000c88010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419e013a00000c86010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b1013a00000c84010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4193013a00000c82010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fc003a00000c80010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41af013a00000c7e0b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413d3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d7c2004410174220d20092009200d491b220d4100480d7c2004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d7c20024101742209200620062009491b22094100480d7c2002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c7f0b0b200d4101102a000b20094101102a000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41383a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d7a2004410174220d20092009200d491b220d4100480d7a2004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d7a20024101742209200620062009491b22094100480d7a2002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c7d0b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419d013a00000c780b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a4013a00000c760b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fa003a00000c740b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412b3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d672004410174220d20092009200d491b220d4100480d672004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d6720024101742209200620062009491b22094100480d672002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c750b0b200d4101102a000b20094101102a000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41343a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d652004410174220d20092009200d491b220d4100480d652004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d6520024101742209200620062009491b22094100480d652002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c730b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419b013a00000c6e0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419c013a00000c6c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f4003a00000c6a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4187013a00000c680b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4190013a00000c660b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d4003a00000c640b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418a013a00000c620b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419a013a00000c600b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f8003a00000c5e0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ef003a00000c5c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fd003a00000c5a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ce003a00000c580b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d3003a00000c560b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41303a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d492004410174220d20092009200d491b220d4100480d492004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d4920024101742209200620062009491b22094100480d492002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c570b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cd003a00000c520b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41283a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d452004410174220d20092009200d491b220d4100480d452004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d4520024101742209200620062009491b22094100480d452002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c530b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a410f3a00000c4e0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d9003a00000c4c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4194013a00000c4a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e7003a00000c480b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418d013a00000c460b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e2003a00000c440b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41243a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490d3620024101742209200620062009491b22094100480d362002450d01200728020020022009102722060d020c050b200728020021060c020b200910262206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000c440b0b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f2003a00000c400b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41033a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490d3120044101742209200620062009491b22064100480d312004450d0120052802002004200610272205450d020c030b200528020021050c030b2006102622050d010b20064101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a42c0818386fcdffffe7c2008410374412073ad42f8018388a7413f7141c000723a00000c3e0b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41213a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490d3020024101742209200620062009491b22094100480d302002450d01200728020020022009102722060d020c050b200728020021060c020b200910262206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000c3e0b0b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f9003a00000c3a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d6003a00000c380b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41df003a00000c360b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c7003a00000c340b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f0003a00000c320b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41203a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490d2420024101742209200620062009491b22094100480d242002450d01200728020020022009102722060d020c050b200728020021060c020b200910262206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000c320b0b20094101102a000b200241086a2006360200200241046a20083602002002410c6a28020021040b2002410c6a2206200441016a360200200820046a41113a0000200241086a2109200241046a210d02400240024003400240024002400240200928020020062802002204470d00200441016a22082004490d2420044101742207200820082007491b22074100480d242004450d01200b28020020042007102722080d020c050b200b28020021080c020b200710262208450d030b20092007360200200d2008360200200628020021040b2006200441016a360200200820046a200541807f72200541ff0071200541077622041b3a00002004210520040d000b024002400240200241086a2802002002410c6a2802002204470d00200441016a22052004490d2220044101742206200520052006491b22064100480d222004450d01200b2802002004200610272205450d020c040b200b28020021050c040b2006102622050d020b20064101102a000b20074101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a200c3a00000c2e0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d5003a00000c2c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e4003a00000c2a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ec003a00000c280b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41043a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490d1920044101742209200620062009491b22064100480d192004450d0120052802002004200610272205450d020c030b200528020021050c030b2006102622050d010b20064101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a42c0818386fcdffffe7c2008410374412073ad42f8018388a7413f7141c000723a00000c260b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41363a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d242004410174220d20092009200d491b220d4100480d242004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d2420024101742209200620062009491b22094100480d242002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c270b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d2003a00000c220b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41103a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490d1420024101742209200620062009491b22094100480d142002450d01200728020020022009102722060d020c050b200728020021060c020b200910262206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000c220b0b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41eb003a00000c1e0b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41023a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490d0f20044101742209200620062009491b22064100480d0f2004450d0120052802002004200610272205450d020c030b200528020021050c030b2006102622050d010b20064101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a42c0818386fcdffffe7c2008410374412073ad42f8018388a7413f7141c000723a00000c1c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c5003a00000c1a0b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41353a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d182004410174220d20092009200d491b220d4100480d182004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d1820024101742209200620062009491b22094100480d182002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c1b0b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d1003a00000c160b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412c3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d092004410174220d20092009200d491b220d4100480d092004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d0920024101742209200620062009491b22094100480d092002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c170b0b200d4101102a000b20094101102a000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412a3a0000200241086a210b200241046a210c03400240024002400240200b28020020082802002204470d00200441016a22092004490d052004410174220d20092009200d491b220d4100480d052004450d0120072802002004200d102722090d020c060b200728020021090c020b200d10262209450d040b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d0520024101742209200620062009491b22094100480d052002450d01200728020020022009102722060d020c070b200728020021060c020b200910262206450d050b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c130b0b101e000b200d4101102a000b20094101102a000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413b3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d0d2004410174220d20092009200d491b220d4100480d0d2004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d0d20024101742209200620062009491b22094100480d0d2002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c100b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a411b3a00000c0b0b200241086a2008360200200241046a20063602002002410c6a28020021040b2002410c6a2208200441016a360200200620046a41c4003a000002400240024002400240200241086a2802002206200828020022046b41084f0d00200441086a22082004490d0720064101742204200820082004491b22044100480d072006450d0120052802002006200410272205450d020c030b200528020021050c030b2004102622050d010b20044101102a000b200241086a2004360200200241046a20053602002002410c6a28020021040b2002410c6a200441086a360200200520046a200a3700000c090b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413c3a0000200241086a210b200241046a210c03400240024002400240200b28020020082802002204470d00200441016a22092004490d052004410174220d20092009200d491b220d4100480d052004450d0120072802002004200d102722090d020c060b200728020021090c020b200d10262209450d040b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200541807f72200541ff0071200541077622041b3a00002004210520040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22052002490d0520024101742209200520052009491b22094100480d052002450d01200728020020022009102722050d020c070b200728020021050c020b200910262205450d050b20082009360200200b2005360200200428020021020b2004200241016a360200200520026a200641807f72200641ff0071200641077622021b3a00002002210620020d000c080b0b101e000b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41053a00000c020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41013a00000b2000411a3a000020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010230b200341106a24000bf30f01347f0240024002400240024002400240024002400240024002400240024002400240024002400240024020002d00002201410d4b0d00024020010e0e000203040506070809140a0b0c0d000b200041086a280200450d13200041046a28020010230f0b0240200041086a280200450d00200041046a28020010230b0240200041146a2802002201450d00200041186a280200450d00200110230b200041246a280200450d12200041206a28020010230f0b0240200041086a280200450d00200041046a28020010230b200041146a280200450d11200041106a28020010230f0b02402000410c6a2802002202450d00200041046a28020021012002410474210203400240200141046a280200450d00200128020010230b200141106a2101200241706a22020d000b0b200041086a280200450d10200041046a28020010230f0b02402000410c6a2802002202450d00200041046a2802002101200241286c210203400240200141046a280200450d00200128020010230b0240200141106a280200450d002001410c6a28020010230b200141286a2101200241586a22020d000b0b200041086a280200450d0f200041046a28020010230f0b200041086a280200450d0e200041046a28020010230f0b200041086a280200450d0d200041046a28020010230f0b200041086a280200450d0c200041046a28020010230f0b2000410c6a2802002201450d0a41042103200041046a280200220420014104746a210541102106410921074108210841ffffffff0321094170210a410021010c050b02402000410c6a2802002202450d00200041046a2802002101200241146c210203400240200141046a280200450d00200128020010230b200141146a21012002416c6a22020d000b0b200041086a280200450d0a200041046a28020010230f0b410c210b2000410c6a2802002201450d07411c210c4104210d200041046a280200220e2001411c6c6a210f4108211041142111411021124109211341ffffffff03211441702115410121010c030b410c21162000410c6a2802002201450d054118211741042118200041046a2802002219200141186c6a211a4114211b4110211c4109211d4108211e41ffffffff03211f41702120410221010c020b410c21212000410c6a2802002201450d03411c212241042123200041046a28020022242001411c6c6a21254108212641142127411021284109212941ffffffff03212a4170212b410321010c010b024002400240200041046a2d000022014102460d0020014101460d0120010d022000410c6a280200450d09200041086a28020010230f0b200041146a2802002201450d03410c212c2000410c6a280200222d20014104746a212e4110212f410821304104213141742132410421010c020b0240200041146a2802002202450d002000410c6a28020021012002410c6c21020340024020012802002206450d00200141046a280200450d00200610230b2001410c6a2101200241746a22020d000b0b200041106a280200450d072000410c6a28020010230f0b2000410c6a280200450d06200041086a28020010230f0b0340024002400240024002400240024002400240024020010e050001020304040b024020042802082202450d0020042802002101200220037421020340024020012d00002007470d00200120086a280200200971450d00200120036a28020010230b200120066a21012002200a6a22020d000b0b200420066a21010240200420036a280200450d00200428020010230b2001210420012005470d040c0e0b0240200e200b6a2802002202450d00200e28020421012002200d7421020340024020012d00002013470d00200120106a280200201471450d002001200d6a28020010230b200120126a2101200220156a22020d000b0b0240200e20106a280200450d00200e200d6a28020010230b200e200c6a21010240200e20116a280200450d00200e28021010230b2001210e2001200f470d040c0c0b0240201920186a280200450d00201928020010230b02402019201b6a2802002202450d00201928020c2101200220187421020340024020012d0000201d470d002001201e6a280200201f71450d00200120186a28020010230b2001201c6a2101200220206a22020d000b0b201920176a210102402019201c6a280200450d00201920166a28020010230b200121192001201a470d040c0a0b0240202420216a2802002202450d0020242802042101200220237421020340024020012d00002029470d00200120266a280200202a71450d00200120236a28020010230b200120286a21012002202b6a22020d000b0b0240202420266a280200450d00202420236a28020010230b202420226a21010240202420276a280200450d00202428021010230b2001212420012025470d040c080b202d2233202f6a212d024020332802042201450d0002402033202c6a2802002202450d002002202c6c21020340024020012802002234450d00200120316a280200450d00203410230b2001202c6a2101200220326a22020d000b0b203320306a280200450d00203320316a28020010230b202d202e470d040c060b410021010c040b410121010c030b410221010c020b410321010c010b410421010c000b0b200041106a280200450d042000410c6a28020010230c040b200041086a280200450d03200041046a28020010230f0b200041086a280200450d02200041046a28020010230f0b200041086a280200450d01200041046a28020010230f0b200041086a280200450d00200041046a28020010230f0b0be3da012d067f017e017f017e027f017e027f017e3b7f027e107f017e0f7f027e067f017e117f027e0e7f017e0b7f027e107f027e177f027e177f017e067f017e017f017e027f017e017f017e1a7f017e097f017e0b7f017e0b7f017e277f230041f080046b2202240002400240200141046a280200220320012802082204470d00200241013a0028200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241286a3602202002200241206a360250200241d880046a200241c0006a10a20120022802dc8004210120022802d88004210420004101360200200041003a00042001450d01200410230c010b200441016a21050240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402004417f460d0020032005490d01200128020020046a2d00002104200141086a20053602000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402004410b4b0d0002400240024002400240024002400240024002400240024020040e0c00070405020809060b030a01000b200241c0006a200110a301410121062002280244210720022802404101470d1220074108762101200241d0006a2802002104200241c0006a41086a29030021080cb0010b200241c0006a200110a40120022802404101470d0b200228024422014108762109200241c0006a41086a290300220a4220882108200241d0006a280200210b0cc3010b200241c0006a200110a40120022802404101470d0b200228024422044108762103200241c0006a41086a2903002208422088210a200241d0006a28020021010cc0010b200241c0006a200110a40120022802404101470d0b20022802442201410876210c200241c0006a41086a290300220d4220882108200241d0006a280200210e0cbd010b200241c0006a200110a40120022802404101470d0b200228024422014108762104200241c0006a41086a2903002208422088210a200241d0006a28020021030cba010b200241c0006a200110a40120022802404101470d0b200228024422014108762104200241c0006a41086a2903002208422088210a200241d0006a28020021030cb7010b200241c0006a200110a40120022802404101470d0b200228024422014108762104200241c0006a41086a2903002208422088210a200241d0006a28020021030cb4010b200241c0006a200110a40120022802404101470d0c200228024422014108762104200241c0006a41086a2903002208422088210a200241d0006a28020021030cb1010b200241c0006a200110a40120022802404101470d0c200228024422014108762104200241c0006a41086a2903002208422088210a200241d0006a28020021030cae010b200241c0006a200110a40120022802404101470d0c2002280244220f4108762101200241c0006a41086a29030022104220882108200241d0006a28020021110cab010b200241c0006a200110a40120022802404101470d0c200228024422124108762101200241c0006a41086a2903002208422088210a200241d0006a28020021130ca8010b200241c0006a200110a40120022802404101470d0c200041013602002000200241c0006a41047222012902003702042000410c6a200141086a290200370200200241f080046a24000f0b200041123a000420004101360200200041056a20043a0000200241f080046a24000f0b200241386a200241d4006a280200360200200241306a2214200241c0006a410c6a2902003703002002200229024437032841002109410021014100211503402001411f4b0d0c20142802002205200241286a410c6a22162802002204460d1d200441016a21032004417f460d5820052003490d59200228022820046a2d0000210420162003360200200441ff00712001411f71742015722115200141076a21012004418001710d000b20014120490d2a20046741686a41ff017141044f0d2a41002109410d21170c0c0b200241e880046a200241d4006a280200360200200241e080046a2201200241cc006a290200370300200220022902443703d88004200128020021034100210420022802e48004210120022802d8800421184100211903402004411f4b0d0d20032001460d1d2001417f460d592003200141016a2207490d5a201820016a2d0000220541ff00712004411f71742019722119200441076a2104200721012005418001710d000b200241e480046a200736020020044120490d2a20056741686a41ff017141044f0d2a41002104410d21070c0d0b200241e880046a200241d4006a280200360200200241e080046a221a200241c0006a410c6a290200370300200220022902443703d880044100210c410021014100211b03402001411f4b0d0e201a2802002205200241d880046a410c6a221c2802002204460d1d200441016a21032004417f460d5a20052003490d5b20022802d8800420046a2d00002104201c2003360200200441ff00712001411f7174201b72211b200141076a21012004418001710d000b20014120490d2a20046741686a41ff017141044f0d2a4100210c410d211d0c0e0b200241e880046a200241d4006a280200360200200241e080046a221e200241c0006a410c6a290200370300200220022902443703d880044100211f410021014100210603402001411f4b0d0f201e2802002205200241d880046a410c6a22202802002204460d1d200441016a21032004417f460d5b20052003490d5c20022802d8800420046a2d0000210420202003360200200441ff00712001411f71742006722106200141076a21012004418001710d000b20014120490d2a20046741686a41ff017141044f0d2a410d2101410021070cad010b200241d4006a2802002121200241d0006a2802002101200241cc006a2802002122200241c8006a28020021232002280244212441002120410021044100212503402004411f4b0d0f20222001460d1d2001417f460d5c2022200141016a2226490d5d202420016a2d0000220341ff00712004411f71742025722125200441076a2104202621012003418001710d000b20044120490d2a20036741686a41ff017141044f0d2a410d2101410021040caa010b200241e880046a200241d4006a280200360200200241e080046a2227200241c0006a410c6a290200370300200220022902443703d8800441002128410021014100212903402001411f4b0d0f20272802002205200241d880046a410c6a22202802002204460d1d200441016a21032004417f460d5d20052003490d5e20022802d8800420046a2d0000210420202003360200200441ff00712001411f71742029722129200141076a21012004418001710d000b20014120490d2a20046741686a41ff017141044f0d2a410d2101410021070ca7010b200241c0006a4100418080011093041a410021184100210502402007450d00200141086a2125200141046a21294101210641002118410021034100211903402029280200221b202528020022056b200720196b220441808001200441808001491b2204490d25200520046a22222005490d69201b2022490d6a200241c0006a200128020020056a20041094041a202520223602000240024002400240201820036b20044f0d00200320046a22052003490d890120184101742222200520052022491b22224100480d89012018450d01200620182022102722060d020c6f0b200420036a21050c020b202210262206450d6d0b202221180b200620036a200241c0006a20041094041a200521032007200420196a22194b0d000b0b200241003602d08004200220053602cc8004200220063602c88004200241c0006a200241c880046a10a301410121292002280244210720022802404101470d1520074108762101200241c0006a41086a2903002208422088a72122200241d0006a28020021042008a721250c9c010b200241d4006a280200212a200241d0006a2802002101200241cc006a2802002107200241c8006a280200212b2002280244212c41002120410021044100212d03402004411f4b0d0e20072001460d1c2001417f460d5d2007200141016a222e490d5e202c20016a2d0000220341ff00712004411f7174202d72212d200441076a2104202e21012003418001710d000b20044120490d2920036741686a41ff017141044f0d29410d2101410021070ca3010b200241e880046a200241d4006a280200360200200241e080046a2201200241cc006a290200370300200220022902443703d88004200128020021054100210420022802e48004210120022802d8800421184100210303402004411f4b0d0e20052001460d1c2001417f460d5e2005200141016a2207490d5f201820016a2d0000221941ff00712004411f71742003722103200441076a2104200721012019418001710d000b200241e480046a200736020020044120490d2920196741686a41ff017141044f0d2941002104410d21180c0e0b200241e880046a200241d4006a280200360200200241e080046a222f200241c0006a410c6a290200370300200220022902443703d8800441002130410021014100212003402001411f4b0d0f202f2802002211200241d880046a410c6a22052802002204460d1c200441016a21032004417f460d5f20112003490d6020022802d88004221f20046a2d0000210420052003360200200441ff00712001411f71742020722120200141076a21012004418001710d000b20014120490d2920046741686a41ff017141044f0d29410d210f410021310c9d010b200241d4006a2802002132200241d0006a2802002101200241cc006a2802002118200241c8006a280200213320022802442134410021044100213503402004411f4b0d0f20182001460d1c2001417f460d602018200141016a2219490d61203420016a2d0000220341ff00712004411f71742035722135200441076a2104201921012003418001710d000b20044120490d2920036741686a41ff017141034b0d29410d21120c0f0b200241d4006a2802002106200241d0006a2802002101200241cc006a2802002103200241c8006a280200212220022802442118410021044100210503402004411f4b0d1020032001460d1d2001417f460d612003200141016a2219490d62201820016a2d0000220741ff00712004411f71742005722105200441076a2104201921012007418001710d000b024020044120490d00410d210120076741686a41ff01714104490d1e0b2006201946210102402022450d00201810230b2001450d2b410921040c95010b410f21170b41002136410021370ca9010b200241e480046a200136020041002104410f21070b41002118410021220ca5010b410f211d0b41002138410021390ca1010b410f2101410021070c9e010b410f2101410021040c9b010b410f2101410021070c98010b410f2101410021070c95010b200241e480046a200136020041002104410f21180b41002122410021060c91010b410f210f410021310c8e010b410f21120b0c0c0b410f21010c0d0b2007450d18200241c0006a41004180081093041a200241d080046a222d280200210420022802cc8004211520022802c8800421354101212941002125410021034100211b0340201520046b2007201b6b22014180082001418008491b2201490d1a200420016a22192004490d5520152019490d56200241c0006a203520046a20011094041a202d20193602000240024002400240202520036b20014f0d00200320016a22222003490d7220254101742204202220222004491b22044100480d722025450d01202920252004102722290d020c5b0b200120036a21220c020b200410262229450d590b200421250b202920036a200241c0006a20011094041a201921042022210320072001201b6a221b4b0d000b200241c0006a2029202210a50120022802404101470d27410821072025450d2a202910230c86010b200241013a00c88004200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241c880046a3602202002200241206a360250200241d880046a200241c0006a10a20120022903d880042208422088a7213620022802e08004210b2008a7213741052117410021090c99010b200241e480046a2003360200200241013a00c88004200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241c880046a3602202002200241206a360250200241286a200241c0006a10a20120022903282208422088a72118200228023021012008a7212241052107410021040c96010b200241013a00c88004200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241c880046a3602202002200241206a360250200241286a200241c0006a10a20120022903282208422088a721382002280230210e2008a721394105211d4100210c0c93010b200241013a00c88004200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241c880046a3602202002200241206a360250200241286a200241c0006a10a20120022903282208422088a7211f200228023021032008a72107410521010c90010b200241013a0028200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241286a3602202002200241206a360250200241d880046a200241c0006a10a20120022903d880042208422088a7212020022802e0800421032008a72104410521010c8d010b200241013a00c88004200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241c880046a3602202002200241206a360250200241286a200241c0006a10a20120022903282208422088a72128200228023021032008a72107410521010c8a010b200241013a0028200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241286a3602202002200241206a360250200241d880046a200241c0006a10a20120022903d880042208422088a7212020022802e0800421032008a72107410521010c87010b200241e480046a2005360200200241013a00c88004200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241c880046a3602202002200241206a360250200241286a200241c0006a10a20120022903282208422088a72122200228023021032008a7210641052118410021040c84010b200241013a00c88004200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241c880046a3602202002200241206a360250200241286a200241c0006a10a20120022903282208422088a72130200228023021112008a721314105210f0c81010b200241013a0028200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241286a3602202002200241206a360250200241d880046a200241c0006a10a20120022802e08004211320022903d880042108410521120b2008422088a7213a2008a7213b0c7d0b200241013a0028200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241286a3602202002200241206a360250200241d880046a200241c0006a10a201410521010b2000200136020420004101360200200041086a20022902d88004370200200041106a200241d880046a41086a2802003602002022450d8f0120181023200241f080046a24000f0b200241013a00c88004200241ec80046a410136020020024107360224200242013702dc80042002419cf6c4003602d880042002200241c880046a3602202002200241206a3602e88004200241286a200241d880046a10a20120022802302104200229032821084105210702402018450d00200610230b0c790b2015450d0c4100213c4104213d4101213e411f213f410c2140200241286a410c6a214141082142200241286a41086a2143417f214441ff002145410721464180012147416821484120214941ff01214a41808004214b421c214c4220214d411c214e4110214f410321504118215141142152410421054100211441002116410021200c540b2019450d0c41042105200241d880046a410c6a21294108211b4100210641002125024020032007460d000340200741016a21012007417f460d4a20032001490d4b201820076a2c000021042029200136020020044100480d1d41072107200441c00071450d1e200441807f7222044170470d20200241c0006a200241d880046a10a60120022f004520022d004741107472210420022d0044210720022802404101460d1f200241c0006a410c6a2802002103200241c0006a41086a280200211802400240024020252006470d0020064101742201200641016a222220222001491b2222ad420c7e2208422088a70d622008a722014100480d622006450d0120052006410c6c2001102722050d020c530b200621220c010b200110262205450d510b2005201b6a220120033602002001417b6a200441ffffff077122044110763a0000200141796a20043b00002001417c6a2018360200200141786a20073a0000202541016a220120194f0d21201b410c6a211b20022802d8800421182022210620012125200241d880046a41086a280200220320292802002207470d000b0b200241013a00c88004200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241c880046a360220200241286a200241c0006a10a201200241306a2802002101200228022c211820022802282122410521070c1e0b201b450d0c4100215f4104216041012161411f2162410c2163200241d880046a410c6a216441082165200241d880046a41086a2166417f216741ff00216841072169418001216a4168216b4120216c41ff01216d421c216e4220216f411c2170411021714103217241182173411421744102217542022176417c2177410421054100211a4100211c410121200c530b2006450d0c41042178410021794101217a410c217b200241c0006a410c6a217c4108217d200241c0006a41086a217e417f217f4103218001411f21810141ff0021820141072183014180012184014168218501412021860141ff01218701422821880142202189014128218a01411c218b01411a218c014119218d014118218e014114218f014110219001410221910141c00021920141807f219301417021940141fc012195014100211e4104210541002196014100219701410221200c530b410421052025450d0c41002199014101219a01411f219b01417f219c0141ff00219d014107219e01418001219f01416821a001412021a10141ff0121a201410321a301420221a401422021a501410221a601410021a701410021a801410321200c530b2029450d0c410421a901410021aa01410121ab01410c21ac01410821ad01417f21ae01410321af01411f212841ff0021b001410721b10141800121b201416821b301412021b40141ff0121b501421421b601422021b701411421b8014100212741042105410021b901410021ba01410421200c530b202d450d0c410021bb01410020076b21bc01410421bd01410121be01417f21bf0141e00021c001410321c101411f21c20141ff0021c301410721c40141800121c501416821c601412021c70141ff0121c801411021c901410821ca0141c00021cb0141807f21cc0141fb0121cd014180807c21ce01420421cf01422021d001410221d101410021d20141042105410021d301410021d401410521200c530b2003450d0c200241c0006a410c6a2129200241c0006a41086a21154100212541002119410021014100211b410421050340200241c0006a200241d880046a10a60120022f004520022d0047411074722104202928020021222015280200210620022d0044211820022802404101460d14200141016a210702402001201b470d002025200720072025491b221bad420c7e2208422088a70d592008a7222d4100480d5902402001450d0020052019202d102722050d010c440b202d10262205450d430b200520196a220120183a0000200141036a20044110763a0000200141016a20043b0000200141086a2022360200200141046a2006360200202541026a21252019410c6a21192007210120072003490d000c0e0b0b2020450d0d200241d880046a410c6a215c200241c0006a41086a215b4100215941002158410021544100212f41042153410421d60141042105024020112003460d000340200341016a21042003417f460d4520112004490d46201f20036a2c00002101205c200436020020014100480d1c4106210f200141c00071450d1d200141807f72225d41ff017141fc01490d1e20112004460d1f200341026a21032004417f460d4720112003490d48201f20046a2d00002101410c210f200241d880046a410c6a20033602004100210302402001450d0020014101470d2241800221030b200241c0006a200241d880046a10a701200241c0006a410c6a2802002130205b28020021312002280244210f20022802404101460d22205441016a210402402054202f470d002059200420042059491b222fad420486225e422088a70d59205ea722014100480d59024002402054450d00205320582001102722530d010c4d0b200110262253450d4c0b205321d601205321050b200520586a2201200f3602002001410c6a205a4180807c71205d417f7341ff017172200372225a360200200141086a2030360200200141046a2031360200200420204f0d23205941026a2159205841106a215820022802d88004211f20042154200241d880046a41086a2802002211205c2802002203470d000b0b200241013a00c88004200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241c880046a3602202002200241206a360250200241286a200241c0006a10a2010c1e0b2035450d0d200241c9006a21d701410021d801410421d901410121da01411f21db01417f21dc0141ff0021dd01410721de0141800121df01416821e001412021e10141ff0121e2014180800121e301411021e401200241286a41106a21e501410c21e601200241286a410c6a21e701422021e801410221e901410821ea01200241c0006a41086a21eb01410621ec01411421ed01200241c0006a41146a21ee01420421ef01410321f001421821f101411821f201417e21f301420321f401410721f501420121f601419cf6c40021f70141c00021f80141807f21f90141fb0121fa014180807c21fb0141042105410021fc01410021fd01410621200c510b4100210741002122410021250c0f0b200241013a00c78004200241ec80046a410136020020024107360224200242013702dc80042002419cf6c4003602d880042002200241c780046a3602202002200241206a3602e88004200241286a200241d880046a10a20120022903282208422088a72122200228023021042008a72103410521074100210102402025450d00202910230b200321250c6c0b20024103410220011b3a0028200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241286a3602202002200241206a360250200241d880046a200241c0006a10a201200241cb006a200241e080046a280200360000200220022903d88004370043200041053a000420004101360200200020022900403700052000410c6a200241c7006a290000370000200241f080046a24000f0b410021144104210541002116410021010c500b4100212241042105410021040c130b4100211a410421054100211c410121010c4e0b410021960141042105410021010c640b410021a701410021a8010c620b410021b90141042105410021010c600b410021d30141042105410021590c5e0b41042105410021074100211b0b200241e480046a28020020022802e88004462101024020022802dc8004450d0020022802d8800410230b2001450d022007ad422086201bad84210a410621040c600b41042105410021044100212f0c460b410021fc0141042105410021fd01410221010c460b20024103410220011b3a00c88004200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241c880046a3602202002200241206a360250200241286a200241c0006a10a20120022903282208422088210a200228023021034105210141002104201b450d66200510230c660b202941087621070b2005200241d080046a2802002203490d37200520036b2204417f4c0d38024002402004450d00200410262201450d3b2001200620036a20041094041a0c010b410121010b2022ad42208621082025ad210a2004ad220d422086211002402018450d00200610230b2008200a84210a2010200d8421082007410874202941ff0171722105410121040c5b0b200241d0006a2802002103201b450d62200510230c620b0c5b0b411821070b0c010b20044180feff07714108762103200241d0006a2802002101200241cc006a2802002118200241c0006a41086a28020021220b2003410874200441ff01717221042006450d69200510230c690b202541016a21040b200241e480046a28020020022802e88004462101024020022802dc8004450d0020022802d8800410230b02402001450d002004ad4220862022ad84210a410521040c540b20024103410220011b3a00c88004200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241c880046a3602202002200241206a360250200241286a200241c0006a10a20120022903282208422088210a2002280230210141052104410021032022450d68200510230c680b4118210f0b0c030b205d21010c020b200241013a00c88004200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241c880046a3602202002200241206a360250200241286a200241c0006a10a2010b20022802302111200228022c2130200228022821314105210f0b200141ff0171410874200f72210f2054450d3f0c330b200241d0006a280200211120540d320c3e0b205441016a21040c320b417f20051048000b20052003108c01000b417f20031048000b20032005108c01000b417f200141016a1048000b200141016a2003108c01000b417f20031048000b20032005108c01000b417f20031048000b20032005108c01000b417f200141016a1048000b200141016a2022108c01000b417f20031048000b20032005108c01000b417f200141016a1048000b200141016a2007108c01000b417f200141016a1048000b200141016a2005108c01000b417f20031048000b20032011108c01000b417f200141016a1048000b200141016a2018108c01000b417f200141016a1048000b200141016a2003108c01000b200520221048000b2022201b108c01000b20224101102a000b200420191048000b20192015108c01000b20044101102a000b202d4104102a000b417f20011048000b20012003108c01000b417f20041048000b20042011108c01000b417f20031048000b20032011108c01000b20014104102a000b20014104102a000b200320051048000b101d000b20044101102a000b410321010c080b410321010c070b410321010c060b410321010c050b410321010c040b410321010c030b410321010c020b200520586a21be02411021bf02410421c002410921c102410821c20241ffffffff0321c302417021c402410c2120410321010c010b200241e480046a28020020022802e88004462101024020022802dc8004450d0020022802d8800410230b02402001450d002004ad422086202fad84210a410721040c190b20024103410220011b3a00c88004200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241c880046a3602202002200241206a360250200241286a200241c0006a10a201422021910220022903282110200228023021112004450d124104219202200520044104746a21930241102194024109219502410821960241ffffffff032197024170219802200521990241082120410321010b03400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020010e0400010206060b200241346a28020020022802384621010240200228022c450d00200228022810230b2001450d032016ad4220862014ad84210a410c21040cdf010b200241e480046a28020020022802e88004462101024020022802dc8004450d0020022802d8800410230b2001450d01201cad422086201aad84210a410a21040cde010b2019203246210102402033450d00203410230b2001450d0220fd01ad42208620fc01ad84210a410b21040cdd010b20024103410220011b3a00c880044114219a02200241c0006a41146a410136020020024107360224200242013702442002419cf6c4003602402002200241c880046a3602202002200241206a360250200241286a200241c0006a10a2014220219b022002290328210d2002280230210e201c450d03411c219c022005201c411c6c6a219d02410c219e024108219f02410421a002411021a102410921a20241ffffffff0321a302417021a402200521a502410921200cb9010b20024103410220011b3a00c88004411421a602200241c0006a41146a410136020020024107360224200242013702442002419cf6c4003602402002200241c880046a3602202002200241206a360250200241d880046a200241c0006a10a201422021a70220022903d88004210a20022802e08004210b2016450d04411c21a80220052016411c6c6a21a902410c21aa02410821ab02410421ac02411021ad02410921ae0241ffffffff0321af02417021b002200521b102410a21200cba010b20024103410220011b3a0028411421b202200241c0006a41146a410136020020024107360224200242013702442002419cf6c4003602402002200241286a3602202002200241206a360250200241d880046a200241c0006a10a201422021b30220022903d88004210820022802e08004211320fd01450d05411821b402200520fd0141186c6a21b502410421b602411021b702410c21b802410921b902410821ba0241ffffffff0321bb02417021bc02200521bd02410b21200cbb010b02400240024002400240024002400240024002400240024002400240024002400240024002400240024020200e0f000102030405060b0d1416181c202c2c0b20162253203e6a2116410021014100211f0340410021092001203f4b0d0c2043280200225420412802002204460d0e2004203e6a210320042044460d7420542003490d75200228022820046a2d000021042041200336020020042045712001203f7174201f72211f200120466a210120042047710d000b024020012049490d0020046720486a204a71203d490d530b200241c0006a200241286a10a7012002280240203e460d53200241c0006a20406a2802002155200241c0006a20426a280200215620022802442157410021044100215803402004203f4b0d1d2043280200225420412802002203460d1f2003203e6a210120032044460d840120542001490d85012002280228225920036a2d000021032041200136020020032045712004203f71742058722158200420466a210420032047710d000b024020042049490d0020036720486a204a71203d490d5e0b4100215a200241c0006a4100204b1093041a024002402058450d004100215a4101215b410021034100215c0340205420016b2058205c6b2204204b2004204b491b2204490d3d200120046a225d2001490d9b012054205d490d9c01200241c0006a205920016a20041094041a2041205d3602000240024002400240205a20036b20044f0d00200320046a225d2003490ddd01205a203e742201205d205d2001491b2201203c480ddd01205a450d01205b205a20011027225b0d020ca1010b200420036a215d0c020b20011026225b450d9f010b2001215a0b205b20036a200241c0006a20041094041a20582004205c6a225c4d0d02204128020021012043280200215420022802282159205d21030c000b0b4101215b4100215d0b024020142053470d002014203e7422012014203e6a220420042001491b2204ad204c7e225e204d88a70dd701205ea72201203c480dd701024002402014450d0020052014204e6c2001102722050d010c9e010b200110262205450d9d010b200421140b20052053204e6c6a2201201f20427622043b00012001205b360210200120573602042001201f3a0000200120506a2004204f763a0000200120516a205d360200200120526a205a360200200120406a2055360200200120426a205636020020162015490dae010cbd010b201c225820616a211c410021014100211f03404100210c200120624b0d072066280200225420642802002204460d09200420616a210320042067460d7120542003490d7220022802d8800420046a2d00002104206420033602002004206871200120627174201f72211f200120696a21012004206a710d000b02402001206c490d00200467206b6a206d712060490d4b0b200241c0006a200241d880046a10a70120022802402061460d4b200241c0006a20636a2201280200215c200241c0006a20656a2204280200215d2002280244215a200241c0006a200241d880046a10a80120022802402061460d4c2004280200215b2002280244215902400240024020012802002201450d00200120757422032075752253ad207686225e206f88a70dd801205ea72201205f480dd801200110262254450d9e01200320776a21552054210120592104034020012004280200360200200120606a2101200420606a2104200320776a22030d000b205520757620616a2104205b450d020c010b410021534104215441002104205b450d010b205910230b0240201a2058470d00201a2061742201201a20616a220320032001491b2203ad206e7e225e206f88a70dd601205ea72201205f480dd60102400240201a450d002005201a20706c2001102722050d010c9f010b200110262205450d9e010b2003211a0b2005205820706c6a2201201f20657622033b0001200120543602102001205a3602042001201f3a0000200120726a20032071763a0000200120736a2004360200200120746a2053360200200120636a205c360200200120656a205d360200201c201b490dae010cbd010b200241c0006a200241d880046a10a901207c280200211f207e280200215d2002280244215b2002280240207a460d23200241c0006a200241d880046a10a901207c2802002157207e2802002153200228024421552002280240207a460d24200241d880046a207d6a2802002203200241d880046a207b6a22592802002220460d252020207a6a21012020207f460d850120032001490d860120022802d88004225c20206a2d00002104205920013602004100215a20042080014b0d2602400240024002400240024020040e0400030102000b4100215a4100210441002120034020042081014b0d1d20032001460d1e2001207f460d7f20032001207a6a2258490d8001205c20016a2d000021542059205836020020542082017120042081017174202072212020042083016a2104205821012054208401710d000b4100215a02402004208601490d002054672085016a208701712078490d5b0b209601209701460d030c040b200241c0006a200241d880046a10a601207e290300215e200228024421202002280240207a460d424102215a209601209701460d020c030b20032001460d4320202091016a21582001207f460d9f0120032058490da001205c20016a2c000021042059205836020020042079480d44200420920171450d38200420930172220420870171209501490d3820032058460d4820202080016a21012058207f460da10120032001490da2012004207f732154205c20586a2d00002104410c2120200241d880046a410c6a20013602004103215a4100210302402004450d002004207a470d4b410121030b209601209701460d010c020b20032001460d4120202091016a21042001207f460d900120032004490d9101205c20016a2c00002101205920043602002001207f4c0d44200120920171450d382001209301722201209401470d38200241c0006a200241d880046a10a601207e290300215e200228024421202002280240207a460d484101215a209601209701470d010b209601207a742201209601207a6a220420042001491b2204ad2088017e22980120890188a70dd501209801a722012079480dd50102400240209601450d002005209601208a016c2001102722050d010c93010b200110262205450d92010b20042196010b2005209701208a016c6a2201205536020c2001201f3602082001205d3602042001205b36020020012086016a205e3702002001208b016a20203602002001208c016a20033a00002001208d016a20543a00002001208e016a205a3a00002001208f016a205736020020012090016a2053360200201e208a016a211e209701207a6a220121970120012006490dae010cea010b20a701221f209a016a21a70120262101410021044100210303402004209b014b0d0420222001460d062001209c01460d6d20222001209a016a2226490d6e202420016a2d00002220209d01712004209b01717420037221032004209e016a2104202621012020209f01710d000b0240200420a101490d0020206720a0016a20a2017120a3014d0d480b024020a801201f470d00201f209a0174220120a70120a7012001491b22a801ad20a40186225e20a50188a70dd401205ea72201209901480dd4010240201f450d002005201f20a601742001102722050d010ca1010b200110262205450da0010b2005201f20a601746a200336020020a7012025490dae010ce8010b200241c0006a200241d880046a10a901200228024020ab01460d2b200241c0006a20ad016a280200215a2002280244215d200241d880046a20ad016a2802002204200241d880046a20ac016a22202802002203460d2c200320ab016a2101200320ae01460d8f0120042001490d9001200241c0006a20ac016a280200215320022802d88004221f20036a2d0000215c20202001360200205c20af014b0d2f02400240024002400240205c0e0400030102000b4100215c41002154410021030340205420284b0d1e20042001460d24200120ae01460d86012004200120ab016a2259490d8701201f20016a2d0000215820202059360200205820b001712054202871742003722103205420b1016a215420592101205820b201710d000b4100215c205420b401490d0320586720b3016a20b5017120a9014f0d030c620b41002154410021030340205420284b0d1220042001460d21200120ae01460d89012004200120ab016a2259490d8a01201f20016a2d0000215820202059360200205820b001712054202871742003722103205420b1016a215420592101205820b201710d000b4102215c205420b401490d0220586720b3016a20b5017120a9014f0d020c550b41002154410021030340205420284b0d1120042001460d21200120ae01460d7e2004200120ab016a2259490d7f201f20016a2d0000215820202059360200205820b001712054202871742003722103205420b1016a215420592101205820b201710d000b4103215c205420b401490d0120586720b3016a20b5017120a9014f0d010c540b41002154410021030340205420284b0d1020042001460d1e200120ae01460d7b2004200120ab016a2259490d7c201f20016a2d0000215820202059360200205820b001712054202871742003722103205420b1016a215420592101205820b201710d000b4101215c205420b401490d0020586720b3016a20b5017120a901490d530b200241c880046a20ad016a20033602002002205c3602cc8004200220533602c8800420022902cc8004215e024020b90120ba01470d0020b90120ab0174220120b90120ab016a220420042001491b2204ad20b6017e22980120b70188a70dd301209801a7220120aa01480dd3010240024020b901450d00200520b90120b8016c2001102722050d010c94010b200110262205450d93010b200421b9010b200520ba0120b8016c6a2201205e37020c200120533602082001205a3602042001205d360200202720b8016a212720ba0120ab016a220121ba0120012029490dae010ce6010b2007202e460d34202e20be016a2101202e20bf01460d910120072001490d9201202c202e6a2d0000225820c001470d3820d40120be016a2159202e20c1016a211f4100215841002104410021200340201f212e200420c2014b0d0c20072001460d0d200120bf01460d732007200120be016a2203490d74202c20016a2d0000225420c30171200420c20171742020722120202e20be016a211f200420c4016a210420032101205420c501710d000b0240200420c701490d0020546720c6016a20c8017120bd01490d510b41002104024002402020450d0020bc0120036a2153202c20036a215b4101215a41002154410021014100215d0340205320016a450d30202e450da2012007202e490da301205b20016a2c0000225820bb01480d324106215c205820cb0171450d33205820cc0172225820c8017120cd014d0d33200120be016a211f02402001205d470d002054201f201f2054491b225d20bb01480dd50102402001450d00205a2001205d1027225a0d010ca3010b205d1026225a450da2010b205a20016a205820bf01733a0000205420d1016a2154202e20be016a212e201f2101201f2020490d000b2003201f6a21030c010b4101215a4100211f4100215d0b205a20c9017620c901742253205a20ca017620c8017120ca0174225b72205a20c80171225a72215441002101034041002158200420c2014b0d2820072003460d2a200320bf01460d87012007200320be016a222e490d8801202c20036a2d0000222020c30171200420c20171742001722101200420c4016a2104202e2103202020c501710d000b0240200420c701490d0020206720c6016a20c8017120bd01490d620b024002400240200120be01460d0020010d654104210420d30120d401460d010c020b2007202e460d65202e20bf01460da9012007202e20be016a2201490daa01202c202e6a2c0000225820bb01480d664106215c205820cb0171450d2a205820cc0172225820c8017120cd014d0d2a205820bf017321042001212e20d30120d401470d010b20d30120be0174220120d30120be016a220320032001491b2203ad20cf0186225e20d00188a70dd201205ea7220120bb01480dd2010240024020d301450d00200520d30120bd01742001102722050d010ca4010b200110262205450da3010b200321d3010b200520d40120bd01746a220120d50120ce0171200420c8017120ca01747220c0017222d50136020c2001201f3602082001205d3602042001205b205a7220537236020020d20120c9016a21d201205921d4012059202d490dae010ce4010b20fd01225d20da016a21fd0141002101410021030340200120db014b0d0920182019460d0a201920dc01460d702018201920da016a2204490d71203420196a2d0000221f20dd0171200120db0171742003722103200120de016a210120042119201f20df01710d000b0240200120e101490d00201f6720e0016a20e2017120d901490d4f0b41002158200241c0006a410020e3011093041a024002402003450d004100215c4101215a41002154410021590340201820046b200320596b220120e301200120e301491b2201490d21200420016a22192004490d7e20182019490d7f200241c0006a203420046a20011094041a0240024002400240205c20546b20014f0d00205420016a221f2054490dd701205c20da01742204201f201f2004491b220420d801480dd701205c450d01205a205c20041027225a0d020c8e010b200120546a211f0c020b20041026225a450d8c010b2004215c0b205a20546a200241c0006a20011094041a20192104201f21542003200120596a22594b0d000c020b0b4101215a200421194100215c4100211f0b20e501201f36020020e70141003602002002205a3602282002201fad20e80186205cad8437022c41002101410021590340200120db014b0d24201f2058460d25205820dc01460d8901201f205820da016a2203490d8a01205a20586a2d0000210420e7012003360200200420dd0171200120db0171742059722159200120de016a210120032158200420df01710d000b0240200120e101490d0020046720e0016a20e2017120d901490d5e0b4100215b024002402059450d004100215c410421554100215a0340205a225320da016a215a410021014100211f02400240024002400340200120db014b0d01200241286a20ea016a280200225420e7012802002204460d02200420da016a2103200420dc01460d7b20542003490d7c2002280228225820046a2d0000211220e7012003360200201220dd0171200120db017174201f72211f200120de016a2101201220df01710d000b02400240200120e101490d0020126720e0016a20e2017120f0014d0d010b0240024020542003470d00200220da013a00c8800420ee0120da01360200200220f501360224200241c0006a20e4016a200241206a360200200220f601370244200220f7013602402002200241c880046a360220200241d880046a200241c0006a10a201200241d880046a20ea016a28020021fe0120022802dc800421ff0120022802d880042180024105211f0c010b200420e9016a2101200320dc01460daa0120542001490dab01205820036a2c0000210420e701200136020002400240200420d801480d00200420f801710d014106211f0c020b4118211f0c010b0240200420f90172220120e2017120fa014d0d00201f20fb01712103201f20ea01762104200120dc01732101410021540c060b4106211f200121040b20800220ea0176218102410121544100210320ff0121820220fe0121830220800221010c040b203b2101203a218202410d211f0c020b410f211f203b2101203a2182020c010b200220da013a00c8800420ee0120da01360200200220f501360224200241c0006a20e4016a200241206a360200200220f601370244200220f7013602402002200241c880046a360220200241d880046a200241c0006a10a20120022903d88004225e20e80188a7218202200241d880046a20ea016a2802002113205ea721014105211f0b200120ea017621810241012154410021042013218302410021032001213b208202213a0b2003200420e2017120ea017472201f20e2017172211220540d3b0240205c2053470d00205c20da01742204205c20da016a220320032004491b2204ad20f40186225e20e80188a70dd401205ea7220320d801480dd40102400240205c450d002055205c20f001742003102722550d010ca9010b200310262255450da8010b2004215c0b2055205320f001746a220420013a000420042012360200205a2059490d000c020b0b410421554100215c4100215a0b4101211f4108215641002101410021034100218402034020012104200241c0006a200241286a10aa01200228024020da01460d3a200241d880046a20e9016a220120d70120e9016a2d00003a0000200220d7012f00003b01d88004200241c0006a20e6016a2802002159200241c0006a20e4016a280200215820ee0128020021530240024020eb012d0000225420ec01470d00201f20dc016a211f0c010b205420f3016a20e9014b0d00201f20da016a2257201f4f2185022057211f208502450d540b200241c0006a20e9016a225720012d00003a0000200220022f01d880043b014002402003208402470d00200320da016a22012003490dd201205b20012001205b491b228402ad20ef0186225e20e80188a70dd201205ea7220120d801480dd20102402003450d00205620042001102722560d010ca7010b200110262256450da6010b205620046a220120543a0000200120e6016a2053360200200120ea016a2058360200200120d9016a2059360200200120f0016a20572d00003a0000200120da016a20022f01403b0000205b20e9016a215b200420e4016a2101200320da016a2103201f0d000b20e70128020020e5012802004621010240200228022c450d00200228022810230b2001450d64024020fc01205d470d0020fc0120da0174220120fc0120da016a220420042001491b2204ad20f1017e225e20e80188a70dd101205ea7220120d801480dd1010240024020fc01450d00200520fc0120f2016c2001102722050d010ca8010b200110262205450da7010b200421fc010b2005205d20f2016c6a2201205636020c2001205a3602082001205c36020420012055360200200120ed016a2003360200200120e4016a20840236020020fd012035490dae010cb9010b410f210120a8010de1010cf4010b410f211d20580d480c490b200241013a0028200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241286a3602202002200241206a360250200241d880046a200241c0006a10a20120022802e08004210320022802dc8004212020022802d8800421044105210120a801450df2010cdf010b200241013a00c88004200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241c880046a360220200241286a200241c0006a10a2012002290328225e422088a72138200241306a280200210e205ea721394105211d0c440b02402090022088026a2802002204450d0020900228020421012004208b027421040340024020012d0000208d02470d0020012089026a280200208e0271450d002001208b026a28020010230b2001208c026a21012004208f026a22040d000b0b02402090022089026a280200450d00209002208b026a28020010230b2090022086026a21010240209002208a026a280200450d0020900228021010230b20012190022001208702470daa010c460b410f211720530d540c550b02402099022802082204450d00209902280200210120042092027421040340024020012d0000209502470d0020012096026a28020020970271450d0020012092026a28020010230b20012094026a210120042098026a22040d000b0b2099022094026a210102402099022092026a280200450d0020990228020010230b20012199022001209302470da9010cda010b200241013a00c88004200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241c880046a360220200241d880046a200241c0006a10a20120022903d88004225e422088a72136200241e080046a280200210b205ea721374105211720530d520c530b410f2112205d0d5e0c5f0b200241013a00c88004200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241c880046a360220200241d880046a200241c0006a10a20120022903d88004225e422088a7213a200241e080046a2802002113205ea7213b41052112205d0d5d0c5e0b410f215c0cc8010b200241013a0028200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241286a360220200241d880046a200241c0006a10a20120022903d880042208422088a72120200241e080046a28020021012008a721074105215c0cc7010b410f21014100215c0cc7010b024020a502209e026a2802002204450d0020a5022802042101200420a0027421040340024020012d000020a202470d002001209f026a28020020a30271450d00200120a0026a28020010230b200120a1026a2101200420a4026a22040d000b0b024020a502209f026a280200450d0020a50220a0026a28020010230b20a502209c026a2101024020a502209a026a280200450d0020a50228021010230b200121a5022001209d02470da3010b200d209b02882108410521014100210c201a450deb01200510230ceb010b024020b10220aa026a2802002204450d0020b1022802042101200420ac027421040340024020012d000020ae02470d00200120ab026a28020020af0271450d00200120ac026a28020010230b200120ad026a2101200420b0026a22040d000b0b024020b10220ab026a280200450d0020b10220ac026a28020010230b20b10220a8026a2101024020b10220a6026a280200450d0020b10228021010230b200121b102200120a902470da2010b200a20a70288210841052101410021092014450ded01200510230ced010b024020bd0220b6026a280200450d0020bd0228020010230b024020bd0220b2026a2802002204450d0020bd0228020c2101200420b6027421040340024020012d000020b902470d00200120ba026a28020020bb0271450d00200120b6026a28020010230b200120b7026a2101200420bc026a22040d000b0b20bd0220b4026a2101024020bd0220b7026a280200450d0020bd0220b8026a28020010230b200121bd02200120b502470da1010b200820b30288210a410521124100210120fc01450dd901200510230cd9010b410f21200cc6010b200241013a00c88004200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241c880046a360220200241286a200241c0006a10a201200229022c210820022802282107410521204100215a0cc6010b024020052802082204450d0020052802002101200420c0027421040340024020012d000020c102470d00200120c2026a28020020c30271450d00200120c0026a28020010230b200120bf026a2101200420c4026a22040d000b0b200520bf026a21010240200520c0026a280200450d00200528020010230b2001210520be022001470d9e010cc3010b410f211720550d410c420b410f21010cbc010b200241013a00c88004200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241c880046a360220200241d880046a200241c0006a10a20120022903d88004225e422088a72136200241e080046a280200210b205ea72137410521170c1c0b024020cf0220c7026a2802002204450d0020cf022802042101200420ca027421040340024020012d000020cc02470d00200120c8026a28020020cd0271450d00200120ca026a28020010230b200120cb026a2101200420ce026a22040d000b0b024020cf0220c8026a280200450d0020cf0220ca026a28020010230b20cf0220c5026a2101024020cf0220c9026a280200450d0020cf0228021010230b200121cf02200120c602470d9b010c410b200241013a00c78004200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241c780046a360220200241286a200241c0006a10a2010c100b200241013a00c78004200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241c780046a360220200241286a200241c0006a10a2010c0f0b200241013a00c78004200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241c780046a360220200241286a200241c0006a10a2010c0e0b200241013a00c78004200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241c780046a360220200241286a200241c0006a10a201200229022c210820022802282107410521010cb6010b200241013a00c78004200241ec80046a410136020020024107360224200241e880046a200241206a360200200242013702dc80042002419cf6c4003602d880042002200241c780046a360220200241c880046a200241d880046a10a20120022903c88004225e422088a7213a200241d080046a2802002113205ea7213b41052112205c450d46205a1023205d0d480c490b200241d0006a2802002103205d2107205b21012097010dbf010cc0010b200241d0006a2802002103205321072057211f20552101205d0dbc010cbd010b200241013a00c88004200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241c880046a360220200241286a200241c0006a10a201200229022c210820022802282107410521204100215a410021030cba010b41092120410021030cb9010b410f2112200228022c0d3a0c3b0b200241013a00c88004200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241c880046a360220200241d880046a200241c0006a10a20120022903d88004225e422088a7218202200241e080046a280200218302205ea7213b410521120c300b024020da0220d2026a280200450d0020da0228020010230b024020da0220d3026a2802002204450d0020da0228020c2101200420d2027421040340024020012d000020d602470d00200120d7026a28020020d80271450d00200120d2026a28020010230b200120d4026a2101200420d9026a22040d000b0b20da0220d0026a2101024020da0220d4026a280200450d0020da0220d5026a28020010230b200121da02200120d102470d90010c420b410f215c0b205d0daf010cb0010b200241013a0028200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241286a360220200241d880046a200241c0006a10a201200241e280046a2f01002104200241e180046a2d00002103200241e080046a2d0000210120022802dc8004212020022802d8800421074105215c205d450daf010cae010b2002200241cc006a2902003703c88004200241c8006a28020021072002280244210120022802c88004212820022802cc8004210320ba010dab010cac010b200241013a00c78004200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241c780046a360220200241286a200241c0006a10a2010b200229022c210820022802282107410521014100215c0ca8010b200241013a0028200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241286a360220200241d880046a200241c0006a10a201200241e080046a280200210120022802dc8004212020022802d8800421074105215c205d0d030ca6010b410a21010ca6010b4118215c0b205d450da3010b205a10230ca2010b41062120410021030caa010b410721030c0c0b200241013a0028200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241286a360220200241d880046a200241c0006a10a201200241e280046a2f01002104200241e180046a2d00002103200241e080046a2d0000210120022802dc8004212020022802d8800421074105215c0ca4010b200241013a00c78004200241ec80046a410136020020024107360224200241e880046a200241206a360200200242013702dc80042002419cf6c4003602d880042002200241c780046a360220200241c880046a200241d880046a10a201200241d080046a280200210b20022802cc8004213620022802c88004213741052117205a0d010b2055450d230c220b205b102320550d210c220b4117215c0ca0010b20810220ea0174200120e2017172213b205c0d1d0c1c0b200241d0006a280200218302200241cc006a280200218202200241c8006a280200213b200228024421122003450d1a0c190b200241c0006a41086a200241d0006a2802003602002020418080807871215a20204180807c712103202041087621040c97010b200241013a00c88004200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241c880046a360220200241286a200241c0006a10a201200241306a28020021042002290328215e410521030c040b200241013a00c88004200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241c880046a360220200241286a200241c0006a10a20141052120200229022c210820022802282107410021030c9f010b41182120410021030c9e010b411821030b0b200141ff017141087420037221200c90010b200241013a00c88004200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241c880046a360220200241286a200241c0006a10a201200229022c21082002280228210741052120410021030c9a010b200241d0006a28020021040c8e010b4100215a0c98010b410d210120a8010d9d010cb0010b410d211d20580d040c050b2002280244221d410876210c200241d0006a280200210e200241cc006a2802002138200241c0006a41086a280200213920580d030c040b2002280244211d200241c0006a41106a280200210e200241cc006a2802002138200241c0006a41086a28020021390240205c450d00205c4104742104205a21010340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010230b200141106a2101200441706a22040d000b0b201d410876210c205d0d010b2058450d020c010b205a10232058450d010b411c21860220052058411c6c6a218702410c21880241082189024114218a024104218b024110218c024109218d0241ffffffff03218e024170218f022005219002410721200c760b201a450dad01200510230cad010b410d211720530d0d0c0e0b200228024422174108762109200241d0006a280200210b200241cc006a2802002136200241c0006a41086a280200213720530d0c0c0d0b410d2112205d0d180c190b410d215c0c83010b410d21014100215c0c83010b410d21200c88010b024020544109470d00205841ffffffff0371450d00205910230b411521820241a4c5c200213b410421122003450d010b205621010340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010230b200141106a2101200441706a22040d000b0b0240208402450d00205610230b205c0d010b200228022c450d090c080b20551023200228022c0d070c080b410d21172055450d010b20554104742104205721010340024020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010230b200141106a2101200441706a22040d000b0b4100210902402056450d00205710230b2053450d010b411c21c50220052053411c6c6a21c602410c21c702410821c802411421c902410421ca02411021cb02410921cc0241ffffffff0321cd02417021ce02200521cf02410d21200c700b2014450da101200510230ca1010b410d21010c770b410d2112200228022c450d010b200228022810230b208202213a20830221130c050b410d215c205d0d760c770b4104215c41eb93c300210741242120205d0d750c760b200241013a0028200241d4006a410136020020024107360224200241d0006a200241206a360200200242013702442002419cf6c4003602402002200241286a360220200241d880046a200241c0006a10a201200241e280046a2f01002104200241e180046a2d00002103200241e080046a2d0000210120022802dc8004212020022802d8800421074105215c205d0d740c750b4118215c205d0d730c740b200220f00120e90120011b3a00c88004200241d4006a410136020020024107360224200241c0006a41106a200241206a360200200242013702442002419cf6c4003602402002200241c880046a360220200241d880046a200241c0006a10a201200241d880046a41086a280200211320022802dc8004213a20022802d88004213b02402003450d00200441106a21034100210103400240205620016a22042d00004109470d00200441086a28020041ffffffff0371450d00200441046a28020010230b2003200141106a2201470d000b0b0240208402450d00205610230b41052112205c0d010b205d450d020c010b20551023205d450d010b411821d0022005205d41186c6a21d102410421d202411421d302411021d402410c21d502410921d602410821d70241ffffffff0321d802417021d902200521da02410e21200c650b20fc01450d8201200510230c82010b417f200141016a1048000b200141016a2022108c01000b417f20031048000b20032054108c01000b417f20031048000b20032054108c01000b417f201941016a1048000b201941016a2018108c01000b417f200141016a1048000b200141016a2007108c01000b417f20031048000b20032054108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2004108c01000b417f200141016a1048000b200141016a2004108c01000b200420191048000b20192018108c01000b417f20011048000b20012054108c01000b417f200141016a1048000b200141016a2004108c01000b417f20011048000b20012003108c01000b417f200141016a1048000b200141016a2004108c01000b417f200341016a1048000b200341016a2007108c01000b20044101102a000b417f205841016a1048000b205841016a201f108c01000b417f20041048000b20042003108c01000b20014104102a000b417f20011048000b20012004108c01000b20014104102a000b417f20011048000b20012007108c01000b2001205d1048000b205d2054108c01000b20014101102a000b20014104102a000b20014104102a000b20014104102a000b417f20581048000b20582003108c01000b417f20011048000b20012003108c01000b20014104102a000b205d4101102a000b417f202e1048000b202e2007108c01000b20014104102a000b417f20011048000b20012054108c01000b20034104102a000b20014108102a000b20014104102a000b417f202e41016a1048000b202e41016a2007108c01000b410021200c110b410121200c110b410221200c110b410321200c110b410421200c110b410521200c110b410621200c110b410721200c120b410821200c120b410921200c130b410a21200c140b410b21200c150b410c21200c150b410d21200c160b410e21200c170b410021010c170b410121010c160b410221010c150b410321010c140b410321010c130b410321010c120b410321010c110b410321010c100b410321010c0f0b410321010c0e0b410321010c0d0b410321010c0c0b410321010c0b0b410321010c0a0b410321010c090b410321010c080b410321010c070b410321010c060b410321010c050b410321010c040b410321010c030b410321010c020b410321010c010b410321010c000b0b101e000b200241c0006a41086a20043602002020418080807871215a20204180807c712103202041087621040b2002205e37034020022902442108205ea721070c090b20014110762104200141087621030c040b205c4108742001722101200220083703c880042008a721280240205a450d00205d10230b20022802cc8004210320ba01450d010b2005210403400240200441046a280200450d00200428020010230b200441146a21042027416c6a22270d000b0b20b901450d1c200510230c1c0b205410230b200341ff0171410874200141ff017172210320044110742104205841ff01714108742119024020d401450d002005210103400240200141046a280200450d00200128020010230b200141106a210120d20141706a22d2010d000b0b200320047221032019205c72210120d301450d18200510230c180b202f450d1320d60110230c130b0b41002103410021040b202041ff0171200441ff0171410874722003418080fc077172205a7221012008422088a721032008a7211f02402053450d00205510230b205d450d010b205b10230b209701450d010b2005210403400240200441046a280200450d00200428020010230b0240200441106a280200450d002004410c6a28020010230b200441286a2104201e41586a221e0d000b0b209601450d16200510230c160b20102091028821084105210f41002101202f450d0c200510230c0c0b200510230c120b202e202a4621010240202b450d00202c10230b02402001450d002059ad42208620d301ad84210a410221040c040b20024103410220011b3a0028200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241286a3602202002200241206a360250200241d880046a200241c0006a10a20120022903d88004210820022802e08004210302402059450d00205941047421042005210103400240200141046a280200450d00200128020010230b200141106a2101200441706a22040d000b0b2008422088210a410521014100210420d301450d0e200510230c0e0b200241e480046a28020020022802e88004462104024020022802dc8004450d0020022802d8800410230b02402004450d002001ad42208620b901ad84210a410821040c030b20024103410220041b3a00c88004200241c0006a41146a410136020020024107360224200242013702442002419cf6c4003602402002200241c880046a3602202002200241206a360250200241286a200241c0006a10a201200229032821082002280230210302402001450d00200141146c21042005210103400240200141046a280200450d00200128020010230b200141146a21012004416c6a22040d000b0b2008422088210a410521014100210420b901450d0f200510230c0f0b2026202146210102402023450d00202410230b02402001450d0020a701ad42208620a801ad84210a410421040c020b20024103410220011b3a0028200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241286a3602202002200241206a360250200241d880046a200241c0006a10a20120022903d880042208422088210a20022802e080042103410521014100210420a801450d10200510230c100b200241e480046a28020020022802e88004462104024020022802dc8004450d0020022802d8800410230b2004450d012001ad422086209601ad84210a410321040b200020043a000420004100360200200041056a20022f001d3b0000200041186a2008370200200041146a20013602002000410c6a200a370200200041086a2005360200200041206a200229020c370200200041076a2002411f6a2d00003a0000200041286a2002410c6a41086a290200370200200241f080046a24000f0b20024103410220041b3a00c88004200241d4006a410136020020024107360224200242013702442002419cf6c4003602402002200241c880046a3602202002200241206a360250200241286a200241c0006a10a201200229032821082002280230210302402001450d00200141286c21042005210103400240200141046a280200450d00200128020010230b0240200141106a280200450d002001410c6a28020010230b200141286a2101200441586a22040d000b0b2008422088210a4105210141002104209601450d0f200510230c0f0b2022ad4220862025ad8421082018450d00200610230b20004101360200200041106a2004360200200041086a200837020020002001410874200741ff017172360204200241f080046a24000f0b20124108762101203aad220a422086203bad8421082033450d00203410230b20004101360200200041106a2013360200200041086a200a422086200842ffffffff0f838437020020002001410874201241ff017172360204200241f080046a24000f0b200f41087621012030ad22084220862031ad84211020022802dc8004450d0020022802d8800410230b20004101360200200041106a2011360200200041086a2008422086201042ffffffff0f838437020020002001410874200f41ff017172360204200241f080046a24000f0b200441ffffff07712204410874201841ff01717221012022ad220a4220862006ad84210820022802dc8004450d0020022802d8800410230b20004101360200200041106a2003360200200041086a200a422086200842ffffffff0f838437020020002004410874200141ff017172360204200241f080046a24000f0b200141087621042020ad220a4220862007ad842108202b450d00202c10230b20004101360200200041106a2003360200200041086a200a422086200842ffffffff0f838437020020002004410874200141ff017172360204200241f080046a24000f0b200141087621042028ad220a4220862007ad84210820022802dc8004450d0020022802d8800410230b20004101360200200041106a2003360200200041086a200a422086200842ffffffff0f838437020020002004410874200141ff017172360204200241f080046a24000f0b2020ad220a4220862004ad842108410021042023450d00202410230b20004101360200200041106a2003360200200041086a200a422086200842ffffffff0f838437020020002004410874200141ff017172360204200241f080046a24000f0b20014108762104201fad220a4220862007ad84210820022802dc8004450d0020022802d8800410230b20004101360200200041106a2003360200200041086a200a422086200842ffffffff0f838437020020002004410874200141ff017172360204200241f080046a24000f0b200c410874201d41ff01717221012038ad22084220862039ad84210d20022802dc8004450d0020022802d8800410230b20004101360200200041106a200e360200200041086a2008422086200d42ffffffff0f83843702002000200c410874200141ff017172360204200241f080046a24000f0b200441ffffff07712203410874200741ff01717221042018ad220a4220862022ad84210820022802dc8004450d0020022802d8800410230b20004101360200200041106a2001360200200041086a200a422086200842ffffffff0f838437020020002003410874200441ff017172360204200241f080046a24000f0b2009410874201741ff01717221012036ad22084220862037ad84210a200228022c450d00200228022810230b20004101360200200041106a200b360200200041086a2008422086200a42ffffffff0f838437020020002009410874200141ff017172360204200241f080046a24000f0b200241f080046a24000b6b000240024020002d000022004101460d0020004102470d0120012802184190f6c400410b2001411c6a28020028020c1102000f0b20012802184183f6c400410d2001411c6a28020028020c1102000f0b200128021841f7f5c400410c2001411c6a28020028020c1102000b800301067f230041306b22022400200128020021030240024002400240024002400240200128020422044103742205450d00200341046a2106410021070340200628020020076a2107200641086a2106200541786a22050d000b200141146a280200450d010c020b41002107200141146a2802000d010b200721060c010b2004450d02024002402007410f4b0d002003280204450d010b200720076a220620074f0d010b4101210541002106200241086a21070c010b2006417f4c0d02200241086a210702402006450d002006102622050d0120064101102a000b41012105410021060b200241003602102002200636020c200220053602082002200241086a360214200241186a41106a200141106a290200370300200241186a41086a200141086a290200370300200220012902003703180240200241146a41c482c500200241186a10e2030d0020002007290200370200200041086a200741086a280200360200200241306a24000f0b10fb03000b41b482c500410041001029000b101d000b960301087f230041c0006b2202240041002103200141086a2104200141046a210541002106024002400240024002400340200341204f0d012005280200220720042802002208460d02200841016a21092008417f460d0420072009490d05200128020020086a2d0000210820042009360200200841ff00712003411f71742006722106200341076a21032008418001710d000b20034120490d0220086741686a41ff017141034b0d02200041013602002000410d3a0004200241c0006a24000f0b200041013602002000410f3a0004200241c0006a24000f0b200241013a000f200241346a41013602002002410736023c200242013702242002419cf6c40036022020022002410f6a3602382002200241386a360230200241106a200241206a10a2012002412b6a200241186a28020036000020022002290310370023200041053a000420004101360200200020022900203700052000410c6a200241276a290000370000200241c0006a24000f0b2000410036020020002006360204200241c0006a24000f0b417f20091048000b20092007108c01000ba005010c7f230041c080016b22022400200241086a200110a30141012103024020022802084101470d002000200229020c370204200041013602002000410c6a200241086a410c6a290200370200200241c080016a24000f0b200228020c2104200241086a4100418080011093041a41002105410021060240024002400240024002402004450d00200141086a2107200141046a21084100210941002105410121034100210a03402008280200220b200728020022066b2004200a6b220c41808001200c41808001491b220c490d022006200c6a220d2006490d03200b200d490d04200241086a200128020020066a200c1094041a2007200d3602000240024002400240200520096b200c4f0d002009200c6a22062009490d092005410174220d20062006200d491b220d4100480d092005450d0120032005200d102722030d020c0a0b200c20096a21060c020b200d10262203450d080b200d21050b200320096a200241086a200c1094041a200621092004200c200a6a220a4b0d000b0b2000200336020420004100360200200041146a2006360200200041106a41003602002000410c6a2006360200200041086a2005360200200241c080016a24000f0b200241013a008f8001200241b480016a4101360200200241073602bc8001200242013702a480012002419cf6c4003602a0800120022002418f80016a3602b880012002200241b880016a3602b080012002419080016a200241a080016a10a201200241ab80016a2002419880016a2802003600002002200229039080013700a38001200041053a000420004101360200200020022900a080013700052000410c6a200241a780016a29000037000002402005450d00200310230b200241c080016a24000f0b2006200d1048000b200d200b108c01000b101e000b200d4101102a000bbd0602057f027e0240024002402002450d00200241796a4100200241074b1b2103410021040340024002400240024002400240024002400240024002400240024002400240200120046a22052d000022064118744118752207417f4c0d002005410371450d01200441016a22042002490d0f0c100b42808080801021082006419684c5006a2d000022054104460d0120054103460d0220054102470d08200441016a220620024f0d094280808080802021094280808080102108200120066a2d000041c00171418001460d0d0c110b0240200420034f0d000340200120046a220641046a280200200628020072418081828478710d01200441086a22042003490d000b0b0240200420024f0d000340200120046a2c00004100480d01200441016a22042002490d000b0b20042002490d0d0c0e0b42002109200441016a220520024f0d08200120056a2d00002105200641f001460d01200641f401470d022005411874411875417f4a0d06200541ff0171418f014d0d030c060b42002109200441016a220520024f0d07200120056a2d00002105200641e001460d03200641ed01470d042005411874411875417f4a0d05200541ff017141a001490d090c050b200541f0006a41ff01714130490d010c040b200541ff017141bf014b0d032007410f6a41ff017141024b0d03200541187441187541004e0d030b200441026a220620024f0d04200120066a2d000041c00171418001470d0a42002108200441036a220620024f0d0b200120066a2d000041c00171418001460d070c050b200541e0017141a001470d010c050b02402007411f6a41ff0171410c4f0d002005411874411875417f4a0d01200541ff017141bf014d0d050c010b200541ff017141bf014b0d00200741fe017141ee01470d0020054118744118754100480d040b4280808080802021090c080b420021090b420021080c060b428080808080e000210942808080801021080c050b42002108200441026a220620024f0d04200120066a2d000041c00171418001470d030b200641016a22042002490d000b0b20002001360204200041086a2002360200200041003602000f0b428080808080c000210942808080801021080b200020092008842004ad84370204200041013602000be607010a7f230041c0006b22022400024002400240024002400240024002400240024002400240024002400240024020012802082203200128020c2204470d00200241013a000f2002413c6a4101360200200241073602242002420137022c2002419cf6c40036022820022002410f6a3602202002200241206a360238200241106a200241286a10a201200241326a200241186a2802003601002002200229031037012a20022002412e6a29010037010620022002290128370300410521050c010b200441016a21062004417f460d0b20032006490d0c2001280200220720046a2d00002108410c21052001410c6a2006360200410021064100210902402008450d004101210920084101470d010b410120036b210a200441026a21042001410c6a210b4100210503402006411f4b0d02200a20046a4102460d032004450d0a20032004490d0b200720046a417f6a2d00002108200b2004360200200841ff00712006411f71742005722105200441016a2104200641076a21062008418001710d000b024020064120490d00410d210620086741686a41ff017141034d0d040b2009450d042004417f6a2104410021062001410c6a210b4100210a03402006411f4b0d0720032004460d082004417f460d0e2003200441016a2201490d0f200720046a2d00002108200b2001360200200841ff00712006411f7174200a72210a200641076a2106200121042008418001710d000b024020064120490d00410d210420086741686a41ff017141034d0d090b410121040c050b200020083a0005200020053a000420002002290300370106200041013602002000410c6a2002290106370100200241c0006a24000f0b410f21060c010b200241013a00102002413c6a4101360200200241073602242002420137022c2002419cf6c4003602282002200241106a3602202002200241206a3602382002200241286a10a201410521060b2000200636020420004101360200200041086a2002290200370200200041106a200241086a280200360200200241c0006a24000f0b410021040b20002005360204200041003602002000410c6a200a360200200041086a2004360200200241c0006a24000f0b410f21040c010b200241013a00102002413c6a4101360200200241073602242002420137022c2002419cf6c4003602282002200241106a3602202002200241206a3602382002200241286a10a201410521040b2000200436020420004101360200200041086a2002290200370200200041106a200241086a280200360200200241c0006a24000f0b417f20041048000b20042003108c01000b417f20061048000b20062003108c01000b417f200441016a1048000b200441016a2003108c01000bd503020a7f017e230041306b22022400200241216a220341076a210441002105410021064100210741002108410821090240024002400340200241186a200110aa0120022802184101460d01200220032900003703082002200429000037000f200241186a41086a2d0000210a2002200229000f37001f20022002290308370318024020072008470d00200741016a220b2007490d032005200b200b2005491b2208ad420486220c422088a70d03200ca7220b4100480d0302402007450d0020092006200b102722090d010c050b200b10262209450d040b200920066a220b200a3a0000200b41086a200229001f370000200b41016a2002290318370000200541026a2105200641106a2106200741016a2107200a41ff01714106470d000b20002009360204200041003602002000410c6a2007360200200041086a2008360200200241306a24000f0b2000200229021c370204200041013602002000410c6a200241186a410c6a29020037020002402007450d00200921070340024020072d00004109470d00200741086a28020041ffffffff0371450d00200741046a28020010230b200741106a2107200641706a22060d000b0b02402008450d00200910230b200241306a24000f0b101e000b200b4108102a000bbf07030d7f017e017f230041c0006b22022400410021032001410c6a2104200141086a210541002106024002400240024002400240024002400240024002400240024002400240024003402003411f4b0d012005280200220720042802002208460d02200841016a21092008417f460d0920072009490d0a200128020020086a2d0000210820042009360200200841ff00712003411f71742006722106200341076a21032008418001710d000b024020034120490d00410d210320086741686a41ff017141034d0d030b2006450d032001410c6a2107200141086a210a4100210b4104210c4100210d0340200d220e41016a210d410021034100210403402003411f4b0d07200a280200220520072802002208460d08200841016a21092008417f460d0c20052009490d0d200128020020086a2d0000210820072009360200200841ff00712003411f71742004722104200341076a21032008418001710d000b024020034120490d0020086741686a41ff01714104490d090b0240200b200e470d00200b4101742203200b41016a220820082003491b2203ad420286220f422088a70d0e200fa722084100480d0e02400240200b450d00200c200b41027420081027220c0d010c110b20081026220c450d100b2003210b0b20044108762110200c200e4102746a2004360200200d2006490d000c050b0b410f21030c010b200241013a000f2002413c6a4101360200200241073602142002420137022c2002419cf6c40036022820022002410f6a3602102002200241106a360238200241186a200241286a10a201410521030b200241086a2208200241186a41086a280200360200200220022902183703002000200336020420004101360200200041086a2002290300370200200041106a20082802003602000c0c0b4104210c4100210b4100210d0b2000200c360204200041003602002000410c6a200d360200200041086a200b360200200241c0006a24000f0b410f21030c080b200241013a00002002413c6a4101360200200241073602142002420137022c2002419cf6c400360228200220023602102002200241106a360238200241186a200241286a10a20120022802202104200228021c21092002280218210841002110410521030c070b410d21030c060b417f20091048000b20092007108c01000b417f20091048000b20092005108c01000b101e000b20084104102a000b20004101360200200041106a20043602002000410c6a2009360200200041086a200836020020002010410874200372360204200b450d00200c1023200241c0006a24000f0b200241c0006a24000bcf07010d7f230041c0086b22022400410021032001410c6a2104200141086a210541002106024002400240024002400240024002400240024002400240024003402003411f4b0d012005280200220720042802002208460d02200841016a21092008417f460d0720072009490d082001280200220a20086a2d0000210820042009360200200841ff00712003411f71742006722106200341076a21032008418001710d000b024020034120490d00410d210320086741686a41ff017141034d0d030b2006450d03200241086a41004180081093041a2001410c6a210b200141086a210c4101210d4100210e41002108410021040340200720096b200620046b22034180082003418008491b2203490d05200920036a22052009490d0920072005490d0a200241086a200a20096a20031094041a200b20053602000240024002400240200e20086b20034f0d00200820036a22052008490d0f200e4101742209200520052009491b22094100480d0f200e450d01200d200e20091027220d0d020c100b200320086a21050c020b20091026220d450d0e0b2009210e0b200d20086a200241086a20031094041a02402006200320046a22044d0d00200b2802002109200c28020021072001280200210a200521080c010b0b200241086a200d200510a50120022802084101470d050240200e450d00200d10230b200041083a000420004101360200200241c0086a24000f0b410f21030c010b200241013a0098082002411c6a41013602002002410736028c082002420137020c2002419cf6c400360208200220024198086a36028808200220024188086a360218200241a8086a200241086a10a201410521030b2000200336020420004101360200200041086a20022902a808370200200041106a200241a8086a41086a2802003602000c090b2000428080808010370200200041086a4200370200200241c0086a24000f0b200241013a009708200241bc086a41013602002002410736028c08200242013702ac082002419cf6c4003602a808200220024197086a36028808200220024188086a3602b80820024198086a200241a8086a10a201200241b3086a200241a0086a28020036000020022002290398083700ab08200041053a000420004101360200200020022900a8083700052000410c6a200241af086a290000370000200e450d07200d1023200241c0086a24000f0b2000200d3602042000410c6a2005360200200041086a200e36020020004100360200200241c0086a24000f0b417f20091048000b20092007108c01000b200920051048000b20052007108c01000b101e000b20094101102a000b200241c0086a24000bcbbe0103087f017e037f230041e0006b22022400024020012802082203200128020c2204470d00200241013a0038200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241386a3602282002200241286a360258200241086a200241c8006a10a201200241d3006a200241106a2802003600002002200229030837004b2002200241cf006a29000037001f20022002290048370318200041053a000420004101360200200020022903183700052000410c6a200229001f370000200241e0006a24000f0b200441016a21050240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402004417f460d0020032005490d012001280200220620046a2d000021072001410c6a220820053602000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200741bf014b0d000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020070ec001b504b50400840124b504aa01aa01aa01aa01aa01a801a501a701a101200b11aa01aa01aa01aa01aa01aa01aa01aa01a60103aa01aa01aa01aa0112189801511aaa01aa01aa0121520533069f0186016f238f019e01a40132080d8801379b01a20104013841714970548b010209441476783f8101752226778701070c252c1016920194011f96019a01a3015ba0011599015e1b5a0f9c019d011d900174720a0e42452813950119602f91018e01890129173497013a27644b5565624a7d407b2e8a0185012b8c0193011c463e2d8d016e3b1e7c5f487982012a3130363d6d5c6c80017f3583014e4f7e7366617a695d39533c674c436a4d6b5768634756505859b5040b20032005470dae01200241013a0037200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241376a3602282002200241286a360258200241386a200241c8006a10a201200241d2006a200241c0006a2802003601002002200229033837014a2002200241ce006a29010037011e20022002290148370318410521090cb0020b410120036b2107200441026a2101410021054100210903402005411f4b0db201200720016a4102460de9012001450da80320032001490da903200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490db30220046741686a41ff017141034b0db302410d21010cb2010b200320056b41084f0da801200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a2012002290318210a200041106a2002280220360200200041086a200a37020020004281808080d000370300200241e0006a24000f0b410e21070ca5010b410120036b2107200441026a2101410021054100210903402005411f4b0db101200720016a4102460de8012001450da70320032001490da803200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490db10220046741686a41ff017141034b0db102410d21010cb1010b410120036b2107200441026a2101410021054100210903402005411f4b0db201200720016a4102460de9012001450da80320032001490da903200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490db10220046741686a41ff017141034b0db102410d21010cb2010b410120036b2107200441026a2101410021054100210903402005411f4b0db301200720016a4102460dea012001450da90320032001490daa03200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490db10220046741686a41ff017141034b0db102410d21010cb3010b413d21070ca1010b410120036b2107200441026a2101410021054100210903402005411f4b0db301200720016a4102460dea012001450da90320032001490daa03200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490db00220046741686a41ff017141034b0db002410d21010cb3010b413121070c9f010b41d70021070c9e010b410021014100210903402001411f4b0db20120032005460de9012005417f460da8032003200541016a2207490da903200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b024020014120490d00410d210120046741686a41ff017141034d0dea010b410b21070ca8040b413e21070c9c010b410120036b2107200441026a2101410021054100210903402005411f4b0db101200720016a4102460de9012001450da80320032001490da903200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490dac0220046741686a41ff017141034b0dac02410d21010cb1010b41d80021070c9a010b41d00021070c99010b41c10021070c98010b410021014100210903402001411f4b0daf0120032005460de7012005417f460da6032003200541016a2204490da703200620056a2d0000210720082004360200200741ff00712001411f71742009722109200141076a2101200421052007418001710d000b024020014120490d00410d210120076741686a41ff017141034d0de8010b20032004470dbf02200241013a0038200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241386a3602282002200241286a360258200241086a200241c8006a10a201200241d3006a200241106a2802003600002002200229030837004b2002200241cf006a29000037001f20022002290048370318200041053a000420004101360200200020022903183700052000410c6a200229001f370000200241e0006a24000f0b410021014100210903402001411f4b0daf0120032005460de8012005417f460da7032003200541016a2207490da803200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b024020014120490d00410d210120046741686a41ff017141034d0de9010b410f21070ca1040b41dc0021070c95010b413321070c94010b41cb0021070c93010b41c20021070c92010b41e50021070c91010b410021014100210903402001411f4b0daa0120032005460de4012005417f460da3032003200541016a2207490da403200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b024020014120490d00410d210120046741686a41ff017141034d0de5010b411021070c9b040b41de0021070c8f010b410021014100210903402001411f4b0da90120032005460de4012005417f460da3032003200541016a2207490da403200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b024020014120490d00410d210120046741686a41ff017141034d0de5010b411321070c99040b41ce0021070c8d010b41f90021070c8c010b41d30021070c8b010b41800121070c8a010b41c50021070c89010b410a21070c88010b410120036b2107200441026a2101410021054100210903402005411f4b0da301200720016a4102460ddf012001450d9e0320032001490d9f03200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d990220046741686a41ff017141034b0d9902410d21010ca3010b413921070c86010b410120036b2107200441026a2101410021054100210903402005411f4b0da301200720016a4102460ddf012001450d9e0320032001490d9f03200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d980220046741686a41ff017141034b0d9802410d21010ca3010b20032005470d8701200241013a0037200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241376a3602282002200241286a360258200241386a200241c8006a10a201200241d2006a200241c0006a2802003601002002200229033837014a2002200241ce006a29010037011e20022002290148370318410521090c88020b413f21070c83010b413a21070c82010b41e90021070c81010b41db0021070c80010b41e40021070c7f0b41860121070c7e0b41f60021070c7d0b41c00021070c7c0b41fc0021070c7b0b41f30021070c7a0b41e00021070c790b41880121070c780b41870121070c770b410120036b2107200441026a2101410021054100210903402005411f4b0d9601200720016a4102460dd2012001450d910320032001490d9203200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d8a0220046741686a41ff017141034b0d8a02410d21010c96010b410120036b2107200441026a2101410021054100210903402005411f4b0d9701200720016a4102460dd3012001450d920320032001490d9303200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d8a0220046741686a41ff017141034b0d8a02410d21010c97010b41e60021070c740b41900121070c730b41890121070c720b410120036b2107200441026a2101410021054100210903402005411f4b0d9501200720016a4102460dd1012001450d900320032001490d9103200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d870220046741686a41ff017141034b0d8702410d21010c95010b410120036b2107200441026a2101410021054100210903402005411f4b0d9601200720016a4102460dd2012001450d910320032001490d9203200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490d870220046741686a41ff017141034b0d8702410d21010c96010b419b0121070c6f0b41e80021070c6e0b41ff0021070c6d0b419d0121070c6c0b418a0121070c6b0b41fb0021070c6a0b413621070c690b41f10021070c680b410120036b2107200441026a2101410021054100210903402005411f4b0d8f01200720016a4102460dcb012001450d8a0320032001490d8b03200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490dff0120046741686a41ff017141034b0dff01410d21010c8f010b41d90021070c660b41a00121070c650b413221070c640b41da0021070c630b41fa0021070c620b41a70121070c610b41830121070c600b20032005470d63200241013a0038200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241386a3602282002200241286a360258200241086a200241c8006a10a201200241d3006a200241106a2802003600002002200229030837004b2002200241cf006a29000037001f20022002290048370318200041053a000420004101360200200020022903183700052000410c6a200229001f370000200241e0006a24000f0b41ef0021070c5e0b41eb0021070c5d0b419f0121070c5c0b41a20121070c5b0b41920121070c5a0b41930121070c590b41a90121070c580b410021014100210903402001411f4b0d810120032005460dbd012005417f460dfc022003200541016a2207490dfd02200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b024020014120490d00410d210120046741686a41ff017141034d0dbe010b411221070ce2030b410120036b2107200441026a2101410021054100210903402005411f4b0d8101200720016a4102460dbe012001450dfd0220032001490dfe02200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490def0120046741686a41ff017141034b0def01410d21010c81010b419c0121070c550b4200210a410021010340410e21072001413f4b0dff0120032005460dbe012005417f460dfd022003200541016a2209490dfe02200620056a2d0000210420082009360200200441ff0071220bad2001413f71ad86200a84210a200141076a210120092105200441187441187522094100480d000b200941c0007121052001413f4b0dee012005450dee01200a427f2001413f71ad8684210a412e21070cde030b41ec0021070c530b41a80121070c520b41a40121070c510b41aa0121070c500b41ab0121070c4f0b41cf0021070c4e0b41c90021070c4d0b418c0121070c4c0b419a0121070c4b0b41cd0021070c4a0b41820121070c490b41df0021070c480b41970121070c470b41ee0021070c460b41a60121070c450b41ea0021070c440b41ed0021070c430b41960121070c420b419e0121070c410b41a50121070c400b41990121070c3f0b41a10121070c3e0b41a30121070c3d0b418d0121070c3c0b418b0121070c3b0b41fe0021070c3a0b410120036b2107200441026a2101410021054100210903402005411f4b0d66200720016a4102460da4012001450de40220032001490de502200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490dd40120046741686a41ff017141034b0dd401410d21010c660b41002101410021090340410d210b2001411f4b0dc00320032005460da5012005417f460de5022003200541016a2204490de602200620056a2d0000210720082004360200200741ff00712001411f71742009722109200141076a210120042105200741187441187522044100480d000b200441c0007121052001411f4b0dd4012005450dd4012009417f2001411f7174722109412d21070cc3030b20032005470d3c200241013a0038200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241386a3602282002200241286a360258200241086a200241c8006a10a201200241d3006a200241106a2802003600002002200229030837004b2002200241cf006a29000037001f20022002290048370318200041053a000420004101360200200020022903183700052000410c6a200229001f370000200241e0006a24000f0b41d60021070c360b41950121070c350b41d50021070c340b413821070c330b413421070c320b413b21070c310b413521070c300b41840121070c2f0b41980121070c2e0b41f20021070c2d0b41810121070c2c0b41f00021070c2b0b41940121070c2a0b418f0121070c290b418e0121070c280b413721070c270b41850121070c260b41910121070c250b20032005470d2b200241013a0037200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241376a3602282002200241286a360258200241386a200241c8006a10a201200241d2006a200241c0006a2802003601002002200229033837014a2002200241ce006a29010037011e20022002290148370318410521090cae010b41f50021070c230b410120036b2107200441026a2101410021054100210903402005411f4b0d51200720016a4102460d90012001450dd10220032001490dd202200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490dbf0120046741686a41ff017141034b0dbf01410d21010c510b413c21070c210b410120036b2107200441026a2101410021054100210903402005411f4b0d51200720016a4102460d90012001450dd10220032001490dd202200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490dbe0120046741686a41ff017141034b0dbe01410d21010c510b41e30021070c1f0b41f40021070c1e0b200320056b41044f0d25200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120004281808080d000370300200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b41f70021070c1c0b41fd0021070c1b0b41e20021070c1a0b410120036b2107200441026a2101410021054100210903402005411f4b0d4c200720016a4102460d8b012001450dcc0220032001490dcd02200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490db80120046741686a41ff017141034b0db801410d21010c4c0b41d40021070c180b41e10021070c170b41c30021070c160b41f80021070c150b41c40021070c140b41dd0021070c130b41c60021070c120b41e70021070c110b410021014100210903402001411f4b0d4520032005460d84012005417f460dc5022003200541016a2207490dc602200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b024020014120490d00410d210120046741686a41ff017141034d0d85010b411121070c9b030b41cc0021070c0f0b41c70021070c0e0b410120036b2107200441026a2101410021054100210903402005411f4b0d43200720016a4102460d83012001450dc40220032001490dc502200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490dad0120046741686a41ff017141034b0dad01410d21010c430b41d10021070c0c0b41d20021070c0b0b410120036b2107200441026a2101410021054100210903402005411f4b0d42200720016a4102460d82012001450dc30220032001490dc402200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490dab0120046741686a41ff017141034b0dab01410d21010c420b410120036b2107200441026a2101410021054100210903402005411f4b0d43200720016a4102460d83012001450dc40220032001490dc502200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490dab0120046741686a41ff017141034b0dab01410d21010c430b41ca0021070c080b200241c8006a200110a80141042109200228024822064101470d10200041013602002000200241c8006a41047222012902003702042000410c6a200141086a290200370200200241e0006a24000f0b410120036b2107200441026a2101410021054100210903402005411f4b0d42200720016a4102460d82012001450dc30220032001490dc402200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490da90120046741686a41ff017141034b0da901410d21010c420b41c80021070c050b410120036b2107200441026a2101410021054100210903402005411f4b0d42200720016a4102460d82012001450dc30220032001490dc402200620016a417f6a2d0000210420082001360200200441ff00712005411f71742009722109200141016a2101200541076a21052004418001710d000b20054120490da80120046741686a41ff017141034b0da801410d21010c420b410021014100210903402001411f4b0d4320032005460d83012005417f460dc4022003200541016a2207490dc502200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b024020014120490d00410d210120046741686a41ff017141034d0d84010b410721070c8e030b410d21070c020b410021014100210903402001411f4b0d4220032005460d83012005417f460dc4022003200541016a2207490dc502200620056a2d0000210420082007360200200441ff00712001411f71742009722109200141076a2101200721052004418001710d000b024020014120490d00410d210120046741686a41ff017141034d0d84010b410821070c8c030b410621070b0c89030b2000410b3a000420004101360200200041056a20073a0000200241e0006a24000f0b200441096a2101200541784f0df00220032001490df102200620056a290000210a20082001360200413021070c87030b200441026a21092005417f460df10220032009490df202200620056a2c00002101200820093602004100210b20014100480d7f200141017441807f71200172220141ff0171220541847e6a220941034b0da101024020090e0400f301f101f201000b4103210b410421070c88030b200441026a21012005417f460df20220032001490df302200620056a2d00002109200820013602002009450d8001200041153a000420004101360200200041056a20093a0000200241e0006a24000f0b200441026a21012005417f460df30220032001490df402200620056a2d00002109200820013602002009450d8001200041153a000420004101360200200041056a20093a0000200241e0006a24000f0b200441026a21092005417f460df40220032009490df502200620056a2c00002101200820093602004100210b20014100480d8001200141017441807f71200172220141ff0171220541847e6a220941034b0d9f01024020090e0400f301f101f201000b4103210b410221070c85030b200441026a21092005417f460df50220032009490df602200620056a2c00002101200820093602004100210b20014100480d8101200141017441807f71200172220141ff0171220541847e6a220941034b0d9f01024020090e0400f501f301f401000b4103210b410321070c84030b200441056a21012005417c4f0df60220032001490df702200620056a280000210920082001360200412f21070c82030b200241d0006a280200210b200228024c2103200241d4006a2802002205450d81012005410274220c4102752207ad420286220a422088a70de802200aa722044100480de802200410262209450df70220054102742104200c417c6a210c410021050340200920056a200320056a2802003602002004200541046a2205470d000b200c41027641016a210d200b450dff020cfe020b410f21010b0c360b410f21010b0c360b410f21010b0c360b410f21010b0c360b410f21010b0c360b410f21010c370b410f21010b0c370b410f21010c380b410f21010c390b410f21010c3a0b410f21010c3b0b410f21010b0c3b0b410f21010b0c3b0b410f21010b0c3b0b410f21010b0c3b0b410f21010b0c3b0b410f21010b0c3b0b410f21010b0c3b0b410f21010c3c0b410f21010b0c3c0b410f21010b0c3d0b410f21010b0c3e0b410f21010b0c3e0b410f21010b0c3e0b410f21010c3f0b410f21010b0c3f0b410f21010b0c3f0b410f21010b0c3f0b410f21010b0c3f0b410f21010b0c3f0b410f21010c400b410f21010c410b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0038200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241386a3602282002200241286a360258200241186a200241c8006a10a201200228022021012002290318210a410521070c410b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a2014105210b0c9a020b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202109200228021c210520022802182103410521010b2000200136020420004101360200200041106a20093602002000410c6a2005360200200041086a2003360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a20120022802202103200228021c210520022802182109410521010b2000200136020420004101360200200041106a20033602002000410c6a2005360200200041086a2009360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b411821090b2002200229011e37010e200220022903183703080c81020b412c21074100210b0c86020b412b21074100210b0c85020b411821090b2002200229011e37010e200220022903183703080cfc010b411821090b2002200229011e37010e200220022903183703080cf9010b410021074100210d200b0dfc010cfd010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d3a2001417f460db8012003200141016a2207490db901200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d3b0b200bad210a412821070cfe010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d3b2001417f460db9012003200141016a2207490dba01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d3c0b200bad210a412721070cfd010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d3c2001417f460dba012003200141016a2207490dbb01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d3d0b200bad210a411621070cfc010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d3d2001417f460dbb012003200141016a2207490dbc01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d3e0b200bad210a411821070cfb010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d3e2001417f460dbc012003200141016a2207490dbd01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d3f0b200bad210a412121070cfa010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d3f2001417f460dbd012003200141016a2207490dbe01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d400b200bad210a412221070cf9010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d402001417f460dbe012003200141016a2207490dbf01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d410b200bad210a411421070cf8010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d412001417f460dbf012003200141016a2207490dc001200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d420b200bad210a411c21070cf7010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d422001417f460dc0012003200141016a2207490dc101200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b41202107024020054120490d00410d210120046741686a41ff01714104490d430b200bad210a0cf6010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d432001417f460dc1012003200141016a2207490dc201200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d440b200bad210a411721070cf5010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d442001417f460dc2012003200141016a2207490dc301200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d450b200bad210a412421070cf4010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d452001417f460dc3012003200141016a2207490dc401200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d460b200bad210a412921070cf3010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d462001417f460dc4012003200141016a2207490dc501200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d470b200bad210a412a21070cf2010b2001417f6a2101410021054100210b03402005411f4b0d2320032001460d472001417f460dc5012003200141016a2207490dc601200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d480b200bad210a411521070cf1010b200141c000490d0e2005450d0e200b41ff00470d0f0c110b2001417f6a2101410021054100210b03402005411f4b0d2220032001460d472001417f460dc5012003200141016a2207490dc601200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d480b200bad210a411b21070cef010b20014120490d102005450d102004417f7341ff00716741686a41ff01714105490dea010c110b2001417f6a2101410021054100210b03402005411f4b0d2120032001460d472001417f460dc5012003200141016a2207490dc601200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d480b200bad210a411a21070ced010b2001417f6a2101410021054100210b03402005411f4b0d2120032001460d482001417f460dc6012003200141016a2207490dc701200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d490b200bad210a412321070cec010b2001417f6a2101410021054100210b03402005411f4b0d2120032001460d492001417f460dc7012003200141016a2207490dc801200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d4a0b200bad210a411d21070ceb010b2001417f6a2101410021054100210b03402005411f4b0d2120032001460d4a2001417f460dc8012003200141016a2207490dc901200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d4b0b200bad210a412521070cea010b2001417f6a2101410021054100210b03402005411f4b0d2120032001460d4b2001417f460dc9012003200141016a2207490dca01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d4c0b200bad210a411e21070ce9010b2001417f6a2101410021054100210b03402005411f4b0d2120032001460d4c2001417f460dca012003200141016a2207490dcb01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d4d0b200bad210a411921070ce8010b2001417f6a2101410021054100210b03402005411f4b0d2120032001460d4d2001417f460dcb012003200141016a2207490dcc01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d4e0b200bad210a412621070ce7010b2001417f6a2101410021054100210b03402005411f4b0d2120032001460d4e2001417f460dcc012003200141016a2207490dcd01200620016a2d0000210420082007360200200441ff00712005411f7174200b72210b200541076a2105200721012004418001710d000b024020054120490d00410d210120046741686a41ff01714104490d4f0b200bad210a411f21070ce6010b41062109200541c001470de0014104210b410421070ce6010b41062109200541c001470dde014104210b410221070ce5010b41062109200541c001470ddc014104210b410321070ce4010b200441016a21012004417f460dd90120032001490dda01200620046a2d00002105200820013602002005450d54200041163a000420004101360200200041056a20053a0000200241e0006a24000f0b200141c000490d022009450d020b0b200020022f00083b0005200020073a000420004101360200200041106a2001360200200041086a200a370200200041076a2002410a6a2d00003a0000200241e0006a24000f0b412e21070cdd010b200441ff01716741686a41ff017141044b0d0020014120490d002005450dd9010b412d21070cdc010b410f21010c170b410f21010c180b410f21010c190b410f21010c1a0b410f21010c1b0b410f21010c1c0b410f21010c1d0b410f21010c1e0b410f21010c1f0b410f21010c200b410f21010c210b410f21010c220b410f21010c230b410f21010c240b410f21010c250b410f21010c260b410f21010c270b410f21010c280b410f21010c290b410f21010c2a0b410f21010c2b0b410f21010c2c0b410f21010c2d0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b4101210b0b410421070c96010b4102210b410421070c95010b4101210b0b410221070c93010b4102210b410221070c92010b4101210b0b410321070c90010b4102210b410321070c8f010b410c21074100210b0c8e010b417f20051048000b20052003108c01000b417f20011048000b20012003108c01000b417f20011048000b20012003108c01000b417f20011048000b20012003108c01000b417f20011048000b20012003108c01000b417f20011048000b20012003108c01000b417f200541016a1048000b200541016a2003108c01000b417f20011048000b20012003108c01000b417f200541016a1048000b200541016a2003108c01000b417f200541016a1048000b200541016a2003108c01000b417f200541016a1048000b200541016a2003108c01000b417f200541016a1048000b200541016a2003108c01000b417f20011048000b20012003108c01000b417f20011048000b20012003108c01000b417f20011048000b20012003108c01000b417f20011048000b20012003108c01000b417f20011048000b20012003108c01000b417f20011048000b20012003108c01000b417f20011048000b20012003108c01000b417f200541016a1048000b200541016a2003108c01000b417f20011048000b20012003108c01000b417f200541016a1048000b200541016a2003108c01000b417f20011048000b20012003108c01000b417f200541016a1048000b200541016a2003108c01000b417f20011048000b20012003108c01000b417f20011048000b20012003108c01000b417f20011048000b20012003108c01000b417f200541016a1048000b200541016a2003108c01000b417f20011048000b20012003108c01000b417f20011048000b20012003108c01000b417f20011048000b20012003108c01000b417f20011048000b20012003108c01000b417f20011048000b20012003108c01000b417f200541016a1048000b200541016a2003108c01000b417f200541016a1048000b200541016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b417f200141016a1048000b200141016a2003108c01000b101e000b200520011048000b20012003108c01000b417f20091048000b20092003108c01000b417f20011048000b20012003108c01000b417f20011048000b20012003108c01000b417f20091048000b20092003108c01000b417f20091048000b20092003108c01000b200520011048000b20012003108c01000b20044104102a000b417f20011048000b20012003108c01000b200020013a0005200020093a000420002002290308370106200041013602002000410c6a200229010e370100200241e0006a24000f0b200020013a0005200020093a000420002002290308370106200041013602002000410c6a200229010e370100200241e0006a24000f0b200020013a0005200020093a000420002002290308370106200041013602002000410c6a200229010e370100200241e0006a24000f0b2000200b36020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200241e0006a24000f0b200310230b024020022d004c4105470d002006450d00200241d4006a280200450d00200241d0006a28020010230b0240024002402007200d470d002007210d0c010b2007200d490d010240200d450d0020092007410274200d4102742205102722090d0120054104102a000b4100210d02402007450d00200910230b410421090b410021052001410c6a210b200141086a210c410021070240024002400240024003402005411f4b0d01200c2802002206200b2802002203460d02200341016a21042003417f460d0420062004490d05200128020020036a2d0000210320082004360200200341ff00712005411f71742007722107200541076a21052003418001710d000b024020054120490d00410d210120036741686a41ff01714104490d030b2007ad422086200dad84210a410921070c070b410f21010c010b200241013a0008200241dc006a41013602002002410736022c2002420137024c2002419cf6c4003602482002200241086a3602282002200241286a360258200241186a200241c8006a10a201410521010b2000200136020420004101360200200041086a2002290218370200200041106a200241186a41086a280200360200200d41ffffffff0371450d0620091023200241e0006a24000f0b417f20041048000b20042006108c01000b418080c000104f000b0b0b20004100360200200041106a200a3703002000410c6a2009360200200041096a200b3a0000200041086a20073a00000b200241e0006a24000bbd07050c7f017e027f017e027f23004190026b2202240020024100360230200241306a20012802002203200128020422044104200441044922051b22061094041a2001200420066b22043602042001200320066a2206360200024020050d002002280230210720024200370214200241f098c400360210200241106a41086a21080240024002402007450d00200141046a2109200241c4006a210a200241c0006a210b200241306a410c6a210c4100210d034020024200370330200241306a200620044108200441084922051b22031094041a2009200420036b3602002001200620036a36020020050d022002290330210e200241086a200110452002280208450d020240024002400240200228020c2206417f4c0d00024002402006450d00200610ac01220f450d03200f200128020020092802002204200620042006491b22041094041a200928020022032004490d042009200320046b3602002001200128020020046a36020020042006470d010c050b4101210f41002006460d040b2006450d06200f10230c060b101d000b20064101102a000b200420031048000b200f450d022002200e370320024002402002280210220441f098c400460d00200228021421100c010b41e40110262204450d0441002110200441003b010620044100360200200441086a200241306a41dc011094041a20024100360214200220043602100b200d41016a210d2006ad22114220862011842111024002400340200441086a210520042f010622124103742103417f210602400240024003402003450d01200641016a2106417f4101200241206a2005410810960422134100481b410020131b2213450d05200341786a2103200541086a210520134101460d000b20100d010c020b201221062010450d010b2010417f6a2110200420064102746a41e4016a28020021040c010b0b200a200e370200200b2008360200200c2006360200200241306a41086a200241106a3602002002200436023420024100360230200220113702242002200f360220200241306a200241206a10ad01200d2007490d010c030b20042006410c6c6a220441e4006a2206280200210320062011370200200441e0006a220628020021042006200f36020002402004450d002003450d00200410230b200d20074f0d020b20092802002104200128020021060c000b0b20002002290310370200200041086a200828020036020020024190026a24000f0b2000410036020020022802102002280214200241186a28020010ae0120024190026a24000f0b41e4014104102a000b2000410036020020024190026a24000b0700200010fa030bea1105027f017e067f037e0b7f230041e0026b2202240020002802102203200328020041016a36020020002902142104200028020c2103200028020821052000280200210620002802042100200241306a41086a2207200141086a28020036020020022001290200370330024020002f01062201410b4f0d00200020034103746a220841106a200841086a2208200120036b4103741095041a2008200437000020002003410c6c6a220141ec006a200141e0006a2209200041066a22082f010020036b410c6c1095041a200141e8006a200728020036020020092002290330370200200820082f010041016a3b01002002200036001720022006360013200241e0026a24000f0b02400240024041e4011026220a450d00200a41003b0106200a4100360200200a41086a200241d0006a41dc011094042107200241d0006a41086a2208200041b0016a280200360200200220002902a8013703502000413c6a330000210b2000413e6a310000210c20002d003f21092000350038210d2007200041c0006a200041066a220e2f010041796a22014103741094042107200a41e0006a200041b4016a2001410c6c109404210f200e41063b0100200a20013b0106200241c0006a41086a200828020036020020022002290350370340200d200b200c4210868442208684210b02400240200341064b0d00200041086a20034103746a220741086a2007200041066a22012f010020036b4103741095041a20072004370000200041e0006a2003410c6c6a2207410c6a200720012f010020036b410c6c1095041a200741086a200241306a41086a280200360200200720022903303702000c010b200720034103746a41506a2007200341796a22084103746a2207200141ffff037120086b4103741095041a20072004370000200f2003410c6c6a220341b87f6a200341ac7f6a2207200a41066a22012f010020086b410c6c1095041a200341b47f6a200241306a41086a280200360200200720022903303702000b200120012f010041016a3b0100200241206a41086a2210200241c0006a41086a2211280200360200200220093a0017200220022903403703202002200b3e02102002200b4230883c00162002200b4220883d0114200241086a22122010280200360200200220022903203703002002290310210402400240024020002802002209450d0020002f0104211303402002200641016a220636021020022009360214200241306a41086a2214201228020036020020022002290300370330201341ffff0371210820092f01062200410a4d0d0241940210262207450d03200741003b010620074100360200200741086a200241d0006a418c021094042103200941386a290000210b200241d0006a41086a220f200941b0016a2802003602002002200941a8016a2902003703502003200941c0006a200941066a22152f0100220141796a22004103741094042116200741e0006a200941b4016a2000410c6c1094042117200741e4016a20094180026a2001417a6a220e4102741094042118201541063b0100200720003b01060240200e450d00410021002018210303402003280200220120003b010420012007360200200341046a2103200e200041016a2200470d000b0b2011200f28020036020020022002290350370340200f20112802003602002002200229034037035002400240201341ffff0371220341064b0d00200941086a2200200841016a220e4103746a200020084103746a220020152f0100220120086b22134103741095041a20002004370000200941e0006a2008410c6c6a2200410c6a20002013410c6c1095041a200041086a2014280200360200200020022903303702002015200141016a22003b0100200941e4016a2201200841027422156a41086a2001200e4102746a2213200041ffff03712201200e6b4102741095041a2013200a360200200320014f0d01200920156a41e8016a2100034020002802002203200841016a22083b010420032009360200200041046a210020012008470d000c020b0b20162008417a6a22034103746a2016200841796a22004103746a220e200741066a22012f010020006b4103741095041a200e200437000020172008410c6c6a220e41b87f6a200e41ac7f6a221320012f0100221520006b410c6c1095041a200e41b47f6a2014280200360200201320022903303702002001201541016a220e3b01002018200841027422136a416c6a201820034102746a2201200e41ffff0371220820036b4102741095041a2001200a360200200320084b0d00200720136a41cc016a2103034020032802002201200041016a22003b010420012007360200200341046a210320082000470d000b0b2010200f280200360200200220022903503703202012201028020036020020022002290320370300024020092802002200450d0020092f0104211320002109200b21042007210a0c010b0b2007210a200b21040b41940210262200450d03200041003b010620004100360200200041086a200241d0006a418c0210940421012000200528020022033602e401200520003602002005200528020441016a360204200341003b010420032000360200200120002f010622034103746a200437000020002003410c6c6a220141e8006a200241086a280200360200200141e0006a2002290300370200200041e4016a200341016a22034102746a200a360200200020033b0106200a20033b0104200a20003602000c040b200941086a2201200841016a22034103746a200120084103746a2201200020086b22074103741095041a2001200437000020092008410c6c6a220141ec006a200141e0006a220e2007410c6c1095041a200141e8006a200241306a41086a280200360200200e2002290330370200200941066a200041016a22003b0100200941e4016a220120084102746a41086a200120034102746a2201200041ffff0371220720036b4102741095041a2001200a360200201341ffff037120074f0d0320092003417f6a22004102746a41e8016a2103034020032802002201200041016a22003b010420012009360200200341046a210320072000470d000c040b0b4194024104102a000b41e4014104102a000b4194024104102a000b200241e0026a24000be20303027f017e027f02402001450d00034020002802e40121002001417f6a22010d000b0b02402002450d004100210341002101034002400240200120002f01064f0d0020002001410c6c6a220441e4006a2902002105200141016a2101200441e0006a2802002204450d030c010b0240024020002802002201450d0020003301044220862003ad842105410121060c010b2003ad210541002106410021010b200010232005a72103024002402005422088a7220720012f01064f0d00200121040c010b03400240024020012802002204450d00200641016a210620013301044220862003ad8421050c010b2003ad2105410021040b200110232005a72103200421012005422088a7220720042f01064f0d000b0b200420074102746a41e8016a280200210020042007410c6c6a220141e4006a2902002105200141e0006a2802002104024020064101460d00410120066b2101034020002802e4012100200141016a22010d000b0b410021012004450d020b2002417f6a210202402005a7450d00200410230b20020d000b0b0240200041f098c400460d0020002802002101200010232001450d0020012802002104200110232004450d00024020042802002201450d000340200410232001210420012802002200210120000d000b0b200410230b0bc10703097f047e017f230041e0006b220224000240024020012802202203450d00200141206a2003417f6a36020020012802082104200128020c2203200128020422052f01064f0d01200241186a2206200520034105746a220741206a290000370300200241106a2208200741186a290000370300200241086a2209200741106a2900003703002002200741086a290000370300200241206a41086a220720052003410c6c6a220a41f0026a280200360200200a41e8026a290200210b2001410c6a200341016a360200200141086a2004360200200141046a20053602002002200b370320200241306a41186a2006290300220b370300200241306a41106a2008290300220c370300200241306a41086a2009290300220d370300200241d8006a2007280200220336020020002002290300220e3702042000410c6a200d370200200041146a200c3702002000411c6a200b370200200041246a2002290320220b3702002000412c6a20033602002002200e3703302002200b37035020004101360200200241e0006a24000f0b20004100360200200241e0006a24000f0b200128020021070240024020052802002203450d00200741016a210720053301044220862004ad84210b0c010b2004ad210b410021030b20051023200ba7210402400240200b422088a7220620032f01064f0d00200321050c010b03400240024020032802002205450d00200741016a210720033301044220862004ad84210b0c010b2004ad210b410021050b20031023200ba7210420052103200b422088a7220620052f01064f0d000b0b200241186a2208200520064105746a220341206a290000370300200241106a2209200341186a290000370300200241086a220a200341106a2900003703002002200341086a290000370300200241206a41086a220f20052006410c6c6a220341f0026a2802003602002002200341e8026a290200370320200520064102746a41f0036a2802002103024020074101460d00410120076b2105034020032802ec032103200541016a22050d000b0b200141003602002001410c6a4100360200200141086a2004360200200141046a2003360200200241306a41186a2008290300220b370300200241306a41106a2009290300220c370300200241306a41086a200a290300220d370300200241d8006a200f280200220336020020002002290300220e3702042000410c6a200d370200200041146a200c3702002000411c6a200b370200200041246a2002290320220b3702002000412c6a20033602002002200e3703302002200b37035020004101360200200241e0006a24000b970603087f017e017f23004180026b220224000240024020012802202203450d00200141206a2003417f6a36020020012802082104200128020c2203200128020422052f01064f0d01200241186a2206200520034105746a220741206a290000370300200241106a2208200741186a290000370300200241086a2209200741106a2900003703002002200741086a290000370300200241206a2005200341e0006c6a41e8026a41e0001094041a2001410c6a200341016a360200200141086a2004360200200141046a200536020020024180016a41186a200629030037030020024180016a41106a200829030037030020024180016a41086a2009290300370300200220022903003703800120024180016a41206a200241206a41e0001094041a200020024180016a4180011094041a20024180026a24000f0b2000420237032020024180026a24000f0b200128020021070240024020052802002203450d00200741016a210720053301044220862004ad84210a0c010b2004ad210a0b20051023200aa7210402400240200a422088a7220620032f01064f0d00200321050c010b03400240024020032802002205450d00200741016a210720033301044220862004ad84210a0c010b2004ad210a0b20031023200aa7210420052103200a422088a7220620052f01064f0d000b0b200241186a2208200520064105746a220341206a290000370300200241106a2209200341186a290000370300200241086a220b200341106a2900003703002002200341086a290000370300200241206a2005200641e0006c6a41e8026a41e0001094041a200520064102746a418c0b6a2802002103024020074101460d00410120076b2105034020032802880b2103200541016a22050d000b0b200141003602002001410c6a4100360200200141086a2004360200200141046a200336020020024180016a41186a200829030037030020024180016a41106a200929030037030020024180016a41086a200b290300370300200220022903003703800120024180016a41206a200241206a41e0001094041a200020024180016a4180011094041a20024180026a24000bc60401067f230041106b220224002002410036020820024201370300200120021041200141046a20021041200141086a20021041200228020421032002280208210402400240024002400240024002400240024002400240024002400240024020012d00184101470d0020032004470d01200441016a22032004490d0c20044101742205200320032005491b22054100480d0c2004450d0320022802002004200510272203450d040c090b20032004470d01200441016a22032004490d0b20044101742205200320032005491b22054100480d0b2004450d0420022802002004200510272203450d050c060b200228020021030c080b200228020021030c050b2005102622030d050b20054101102a000b2005102622030d010b20054101102a000b20022005360204200220033602000b200241086a200441016a360200200320046a41003a00000c020b20022005360204200220033602000b200241086a200441016a360200200320046a41013a00000b200128020c21062002200141146a280200220136020c2002410c6a2002104102400240024020022802042205200241086a28020022036b20014f0d00200320016a22042003490d0320054101742207200420042007491b22074100480d032005450d0120022802002005200710272204450d020c040b200228020021040c040b2007102622040d020b20074101102a000b101e000b2002200736020420022004360200200721050b200420036a200620011094041a200041202004200320016a100402402005450d00200410230b200241106a24000b1600200120002802002200280200200028020810b3010b8408010b7f200028021021030240024002400240024002400240024002400240200028020822044101470d0020030d010c020b2003450d070b02402002450d00200120026a2105200041146a280200417f732106410021072001210320012108024002400340200341016a21090240024020032c0000220a4100480d00200a41ff0171210a20092103200641016a22060d010c030b02400240024020092005460d0020092d0000413f71210b200341026a22032109200a411f71210c200a41ff0171220a41e001490d010c020b4100210b20052103200a411f71210c200a41ff0171220a41e0014f0d010b200b200c41067472210a20092103200641016a22060d010c030b02400240024020032005460d00200341016a2209210d20032d0000413f71200b41067472210b200a41f001490d010c020b2005210d4100200b41067472210b200a41f0014f0d010b200b200c410c7472210a20092103200641016a22060d010c030b02400240200d2005460d00200d41016a2103200d2d0000413f71210a0c010b4100210a200921030b200b410674200c411274418080f0007172200a72220a418080c400460d03200641016a2206450d020b200720086b20036a21072003210820052003470d000c020b0b200a418080c400460d00024002402007450d0020072002460d0041002103200720024f0d01200120076a2c00004140480d010b200121030b2007200220031b21022003200120031b21010b2004450d020c010b410021022004450d010b4100210902402002450d002002210a200121030340200920032d000041c00171418001466a2109200341016a2103200a417f6a220a0d000b0b200220096b2000410c6a28020022074f0d01410021064100210902402002450d00410021092002210a200121030340200920032d000041c00171418001466a2109200341016a2103200a417f6a220a0d000b0b200920026b20076a2103410020002d0030220920094103461b2209410371450d0220094102460d0341002108200321060c040b2000280218200120022000411c6a28020028020c1102000f0b2000280218200120022000411c6a28020028020c1102000f0b200321080c010b20034101762106200341016a41017621080b417f2103200041046a2109200041186a210a2000411c6a210702400340200341016a220320064f0d01200a28020020092802002007280200280210110300450d000b41010f0b200041046a280200210941012103200041186a220a280200200120022000411c6a220628020028020c1102000d01200a280200210a417f2103200628020041106a210602400340200341016a220320084f0d01200a20092006280200110300450d000b41010f0b41000f0b2000280218200120022000411c6a28020028020c11020021030b20030bdb1801187f230041c00f6b2202240020002802102203200328020041016a360200200028020c21042000280208210520002802042103200241206a41186a22062000412c6a290000370300200241206a41106a2207200041246a290000370300200241206a41086a22082000411c6a29000037030020022000290014370320200241a0026a200141e0001094041a024020032f01062201410b4f0d00200320044105746a220041286a200041086a2209200120046b4105741095041a200041206a2006290300370000200041186a2007290300370000200041106a2008290300370000200920022903203700002003200441e0006c6a220041c8036a200041e8026a2200200341066a22032f010020046b41e0006c1095041a2000200241a0026a41e0001094042100200320032f010041016a3b0100200241c00f6a240020000f0b02400240024041880b1026220a450d00200a41003b0106200a4100360200200a41086a20024190046a41800b10940421012002200341ca016a2d00003a00aa03200220032f00c8013b01a803200220032900db01370398032002200341e0016a29000037009d03200341cb016a280000210b200341cf016a280000210c200341d3016a280000210d200341d7016a280000210e20024190046a200341a8076a41e0001094041a2001200341e8016a200341066a22062f010041796a22004105741094042101200a41e8026a20034188086a200041e0006c1094042107200641063b0100200a20003b0106200220022d00aa033a009603200220022f01a8033b0194032002200229039803370380032002200229009d0337008503200241b0036a20024190046a41e0001094041a02400240200441064b0d00200341086a20044105746a220141206a2001200341066a22002f010020046b4105741095041a200141186a200241206a41186a290300370000200141106a200241206a41106a290300370000200141086a200241206a41086a29030037000020012002290320370000200341e8026a200441e0006c6a220f41e0006a200f20002f010020046b41e0006c1095041a200f200241a0026a41e0001094041a0c010b200120044105746a41c07e6a2001200441796a22064105746a2201200041ffff037120066b4105741095041a200141186a200241206a41186a290300370000200141106a200241206a41106a290300370000200141086a200241206a41086a290300370000200120022903203700002007200441e0006c6a220041c07b6a200041e07a6a220f200a41066a22002f010020066b41e0006c1095041a200f200241a0026a41e0001094041a0b20024188026a41026a220420022d0096033a0000200020002f010041016a3b0100200220022f0194033b01880220022002290380033703800120022002290085033700850120024190016a200241b0036a41e0001094041a2002411c6a41026a221020042d00003a0000200220022f0188023b011c2002200229038001370308200220022900850137000d200241206a20024190016a41e0001094041a02400240024020032802002207450d0020032f0104211103402002419c026a41026a221620102d00003a0000200220022f011c3b019c0220022002290308370388022002200229000d37008d02200241a0026a200241206a41e0001094041a201141ffff0371210620072f01062203410a4d0d0241b80b10262201450d03200141003b010620014100360200200141086a20024190046a41b00b10940421002002200741ca016a2d00003a00aa03200220072f00c8013b01a803200220072900db01370398032002200741e0016a29000037009d03200741cb016a2800002112200741cf016a2800002115200741d3016a2800002114200741d7016a280000211320024190046a200741a8076a41e0001094041a2000200741e8016a200741066a22092f0100220441796a22034105741094042117200141e8026a20074188086a200341e0006c1094042118200141880b6a200741a40b6a2004417a6a22084102741094042119200941063b0100200120033b010602402008450d00410021032019210003402000280200220420033b010420042001360200200041046a21002008200341016a2203470d000b0b200241b0036a20024190046a41e0001094041a200220022d00aa033a009603200220022f01a8033b0194032002200229039803370380032002200229009d0337008503200241ac036a41026a220820022d0096033a0000200220022f0194033b01ac0320022002290380033703800120022002290085033700850120024190046a200241b0036a41e0001094041a02400240201141ffff0371220041064b0d00200741086a2203200641016a22044105746a200320064105746a220320092f0100221120066b22194105741095041a2003200e36000f2003200d36000b2003200c3600072003200b360003200341026a20162d00003a0000200320022f019c023b00002003200229038802370013200341186a200229008d02370000200741e8026a200641e0006c6a220341e0006a2003201941e0006c1095041a2003200241a0026a41e0001094041a2009201141016a22033b0100200741880b6a2211200641027422196a41086a201120044102746a2211200341ffff037120046b4102741095041a2011200a360200200020092f010022044f0d01200720196a418c0b6a2103034020032802002200200641016a22063b010420002007360200200341046a210320042006470d000c020b0b20172006417a6a22044105746a2017200641796a22034105746a2200200141066a22092f010020036b4105741095041a200041186a200229008d023700002000200e36000f2000200d36000b2000200c3600072000200b360003200041026a20162d00003a0000200020022f019c023b000020002002290388023700132018200641e0006c6a220041c07b6a200041e07a6a220020092f010020036b41e0006c1095041a2000200241a0026a41e0001094041a200920092f010041016a22003b01002019200641027422116a416c6a201920044102746a2209200041ffff0371220620046b4102741095041a2009200a360200200420064b0d00200120116a41f00a6a2100034020002802002204200341016a22033b010420042001360200200041046a210020062003470d000b0b20024184026a41026a220320082d00003a0000200220022f01ac033b01840220022002290380013703f00120022002290085013700f50120024190016a20024190046a41e0001094041a201020032d00003a0000200220022f0184023b011c200220022903f001370308200220022900f50137000d200241206a20024190016a41e0001094041a024020072802002203450d0020072f010421112012210b2013210e2014210d2015210c200321072001210a0c010b0b2012210b2013210e2014210d2015210c2001210a0b41b80b10262203450d03200341003b010620034100360200200341086a20024190046a41b00b10940421012003200528020022003602880b200520033602002005200528020441016a360204200041003b010420002003360200200120032f010622044105746a220020022f011c3b00002000200e36000f2000200d36000b2000200c3600072000200b36000320002002290308370013200041026a2002411c6a41026a2d00003a0000200041186a200229000d3700002003200441e0006c6a41e8026a200241206a41e0001094041a200341880b6a200441016a22004102746a200a360200200320003b0106200a20003b0104200a20033602000c040b200741086a2200200641016a22044105746a200020064105746a2200200320066b22014105741095041a2000200e36000f2000200d36000b2000200c3600072000200b360003200041026a2002419c026a41026a2d00003a0000200020022f019c023b00002000200229038802370013200041186a200229008d023700002007200641e0006c6a220041c8036a200041e8026a2200200141e0006c1095041a2000200241a0026a41e0001094041a200741066a2200200341016a22033b0100200741880b6a220120064102746a41086a200120044102746a2201200341ffff037120046b4102741095041a2001200a360200201141ffff037120002f010022034f0d03200a20043b0104200a200736020020042003460d032003417f6a210120072004417f6a22034102746a41900b6a2100034020002802002204200341026a3b010420042007360200200041046a21002001200341016a2203470d000c040b0b41b80b4108102a000b41880b4108102a000b41b80b4108102a000b200241c00f6a2400200f0bbe0101047f230041306b220124002001200010af01024020012802004101470d00200141286a2102200141246a21030340024020032802002204450d002002280200450d00200410230b2001200010af0120012802004101460d000b0b02402000280204220441f098c400460d0020042802002103200410232003450d0020032802002100200310232000450d00024020002802002204450d000340200010232004210020042802002203210420030d000b0b200010230b200141306a24000ba11f01407f23004190066b22042400200441e0006a41186a200241186a290000370300200441e0006a41106a200241106a290000370300200441e0006a41086a200241086a2900003703002004200229000037036002400240024002402001280200220541f098c400460d00200128020421060c010b41ec0310262205450d0141002106200541003b010620054100360200200541086a200441f8016a41e4031094041a20014100360204200120053602000b0c010b41ec034104102a000b41002102024003400240024002400240024002400240024020020e020001010b200541086a2107200541066a210820052f01062209410574210a417f2102024002400240024002400340200a450d01200241016a2102417f4101200441e0006a20074120109604220b4100481b4100200b1b220b450d04200a41606a210a200741206a2107200b4101460d000b20060d010c020b200921022006450d010b2006417f6a2106200520024102746a41ec036a2802002105410021020c0a0b200441086a41186a220b200441e0006a41186a220a290300370300200441086a41106a220c200441e0006a41106a2207290300370300200441086a41086a2209200441e0006a41086a220d290300370300200420042903603703082001200128020841016a360208200a200b2903003703002007200c290300370300200d200929030037030020042004290308370360200441e8016a41086a220c200341086a280200360200200420032902003703e80120082f01002209410b4f0d01200520024105746a220b41286a200b41086a220e200920026b4105741095041a200b41206a200a290300370000200b41186a2007290300370000200b41106a200d290300370000200e200429036037000020052002410c6c6a220a41f4026a200a41e8026a220d200541066a22072f010020026b410c6c1095041a200a41f0026a200c280200360200200d20042903e801370200200720072f010041016a3b01000c0a0b200441f8016a41086a220a20052002410c6c6a220241f0026a22072802003602002004200241e8026a22022902003703f8012007200341086a28020036020020022003290200370200200441e0006a41086a2202200a280200360200200420042903f801370360200041013602002000410c6a20022802003602002000200429036037020420044190066a24000f0b41ec031026220f450d04200f41003b0106200f4100360200200f41086a200441f8016a41e4031094042107200441f8016a41086a220d200541b8036a280200360200200420052902b0033703f8012004200541e0016a2900003700c501200420052900db013703c0012004200541ca016a2d00003a00d201200420052f00c8013b01d001200541cb016a2800002110200541cf016a2800002111200541d3016a2800002112200541d7016a28000021132007200541e8016a200541066a220b2f010041796a220a4105741094042107200f41e8026a200541bc036a200a410c6c109404210c200b41063b0100200f200a3b0106200420042d00d2013a00be01200420042f01d0013b01bc01200420042903c0013703a801200420042900c5013700ad01200441286a41086a200d280200360200200420042903f80137032802400240200241064b0d00200541086a20024105746a220a41206a200a20082f010020026b4105741095041a200a41186a200441e0006a41186a290300370000200a41106a200441e0006a41106a290300370000200a41086a200441e0006a41086a290300370000200a2004290360370000200541e8026a2002410c6c6a220a410c6a200a20082f010020026b410c6c1095041a200a41086a200441e8016a41086a280200360200200a20042903e8013702000c010b200720024105746a41c07e6a2007200241796a220d4105746a2207200a41ffff0371200d6b4105741095041a200741186a200441e0006a41186a290300370000200741106a200441e0006a41106a290300370000200741086a200441e0006a41086a29030037000020072004290360370000200c2002410c6c6a220241b87f6a200241ac7f6a220a200f41066a22082f0100200d6b410c6c1095041a200241b47f6a200441e8016a41086a280200360200200a20042903e8013702000b4101210d200820082f010041016a3b01004102211420044198016a41026a220220042d00be013a000041082115200441d8016a41086a2216200441286a41086a280200360200200420042f01bc013b019801200420042903a801370350200420042900ad01370055200420042903283703d801200441c0006a41086a221720162802003602002004413c6a41026a221820022d00003a0000200420042903d801370340200420042903503703282004200429005537002d200420042f0198013b013c2005280200220e450d0120052f0104211941ffff03211a410a211b419c04211c4100211d419404211e41ca01211f41db01212041e001212141cb01212241cf01212341d301212441d701212541b803212641b003212741e8012128410621294179212a4105212b41bc03212c41e802212d410c212e418804212f41ec032130417a21314118213241f00321334104210c41ac7f213441b87f213541b47f2136416c213741d40321380c060b20044194016a20146a223d20182d00003a0000200420042f013c3b019401200420042903283703602004200429002d37006520044198016a20156a223e201728020036020020042004290340370398012019201a712109200e2f01062202201b4d0d01201c1026220b450d02200b201d3b0106200b201d360200200b20156a200441f8016a201e109404210a2004200e201f6a2d00003a00d2012004200e2f00c8013b01d0012004200e20206a2900003703c0012004200e20216a2900003700c501200e20226a2800002139200e20236a280000213c200e20246a280000213b200e20256a280000213a200441f8016a20156a223f200e20266a2802003602002004200e20276a2902003703f801200a200e20286a200e20296a22402f01002207202a6a2202202b741094042141200b202d6a200e202c6a2002202e6c1094042142200b20306a200e202f6a200720316a22082014741094042143204020293b0100200b20023b010602402008450d00410021022043210a0340200a280200220720023b01042007200b360200200a200c6a210a20082002200d6a2202470d000b0b200441e8016a20156a2202203f280200360200200420042d00d2013a00be01200420042f01d0013b01bc01200420042903c0013703a801200420042900c5013700ad01200420042903f8013703e801200441d4016a20146a220820042d00be013a0000200420042f01bc013b01d401200420042903a8013703f801200420042900ad013700fd0120162002280200360200200420042903e8013703d801024002402019201a71220a20294b0d00200e20156a22022009200d6a2219202b746a20022009202b746a220220402f010020096b202b741095041a200220326a20042900653700002002201336000f2002201236000b2002201136000720022010360003200220146a203d2d00003a0000200220042f0194013b000020022004290360370013200e202d6a2009202e6c6a2202202e6a200220402f0100220720096b202e6c1095041a200220156a203e280200360200200220042903980137020020402007200d6a22023b0100200e20306a2207200920147422116a20156a200720192014746a22402002201a71220720196b2014741095041a2040200f360200200a20074f0d01200e20116a20336a210203402002280200220a2009200d6a22093b0104200a200e3602002002200c6a210220072009470d000c020b0b2041200920316a2207202b746a20412009202a6a2202202b746a220a200b20296a22192f010020026b202b741095041a200a20326a2004290065370000200a201336000f200a201236000b200a2011360007200a2010360003200a20146a203d2d00003a0000200a20042f0194013b0000200a200429036037001320422009202e6c6a220a20356a200a20346a224020192f0100221120026b202e6c1095041a200a20366a203e280200360200204020042903980137020020192011200d6a220a3b01002043200920147422406a20376a204320072014746a2219200a201a71220920076b2014741095041a2019200f360200200720094b0d00200b20406a20386a210a0340200a28020022072002200d6a22023b01042007200b360200200a200c6a210a20092002470d000b0b20044190016a20146a220220082d00003a000020044180016a20156a220a2016280200360200200420042f01d4013b019001200420042903f801370350200420042900fd01370055200420042903d801370380012017200a280200360200201820022d00003a00002004200429038001370340200420042903503703282004200429005537002d200420042f0190013b013c0240200e2802002202450d00200e2f0104211920392110203a2113203b2112203c21112002210e200b210f410121020c070b20392110203a2113203b2112203c2111200b210f0b419c0410262202450d03200241003b010620024100360200200241086a200441f8016a419404109404210d20022001280200220a3602ec03200120023602002001200128020441016a360204200a41003b0104200a2002360200200d20022f010622074105746a220a2004290328370013200a20042f013c3b0000200a201336000f200a201236000b200a2011360007200a2010360003200a41186a200429002d370000200a41026a2004413c6a41026a2d00003a000020022007410c6c6a220a41f0026a200441c0006a41086a280200360200200a41e8026a2004290340370200200241ec036a200741016a220a4102746a200f3602002002200a3b0106200f200a3b0104200f20023602000c060b200e41086a220a200941016a22074105746a200a20094105746a220a200220096b4105741095041a200a41186a2004290065370000200a201336000f200a201236000b200a2011360007200a2010360003200a41026a20044194016a41026a2d00003a0000200a20042f0194013b0000200a2004290360370013200e2009410c6c6a220241f4026a200241e8026a220a200e41066a220d2f0100220b20096b410c6c1095041a200241f0026a20044198016a41086a280200360200200a200429039801370200200d200b41016a22023b0100200e41ec036a220a20094102746a41086a200a20074102746a220a200241ffff0371220d20076b4102741095041a200a200f360200201941ffff0371200d4f0d05200e2007417f6a22024102746a41f0036a210a0340200a2802002207200241016a22023b01042007200e360200200a41046a210a200d2002470d000c060b0b419c044104102a000b41ec034104102a000b419c044104102a000b410121020c000b0b2000410036020020044190066a24000b9f3401087f23004190016b220824000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402002410c6a280200200241106a28020010052209417f460d00410c1026220a450d01200a2009360208200a42818080801037020002404101450d00200a410141016a3602004101417e460d00200a410141027236020041041026220b450d03200b200a360200200a280208210c41031026220d450d04200d41026a41002d00cce2443a0000200d41002f00cae2443b000041061026220e450d05200e41046a41002f00cfbf443b0000200e41002800cbbf44360000412010262209450d062009200c36021c2009410136021820094286808080e0003702102009200e36020c20094283808080303702042009200d360200200a200a280200417f6a220d3602000240200d0d00200a41086a2802001006200a200a280204417f6a220d360204200d0d00200a10230b41031026220d450d07200d41026a41002d00cce2443a0000200d41002f00cae2443b000041031026220e450d08200e41026a41002d00cfe2443a0000200e41002f00cde2443b00002009412041c00010272209450d092009410836023c2009410036023820094283808080303702302009200e36022c20094283808080303702242009200d36022041031026220d450d0a200d41026a41002d00cce2443a0000200d41002f00cae2443b0000410f1026220e450d0b200e41076a41002900a6ce44370000200e410029009fce44370000200941c00041800110272209450d0c2009410936025c200941003602582009428f808080f0013702502009200e36024c20094283808080303702442009200d36024041031026220d450d0d200d41026a41002d00cce2443a0000200d41002f00cae2443b0000410f1026220e450d0e200e41076a41002900b5ce44370000200e41002900aece443700002009410a36027c200941003602782009428f808080f0013702702009200e36026c20094283808080303702642009200d36026041031026220d450d0f200d41026a41002d00cce2443a0000200d41002f00cae2443b000041081026220e450d10200e42e5f0d1fbb5ac98b6ec00370000200941800141800210272209450d112009410b36029c012009410036029801200942888080808001370290012009200e36028c012009428380808030370284012009200d3602800141031026220d450d12200d41026a41002d00cce2443a0000200d41002f00cae2443b0000410a1026220e450d13200e41086a41002f00cdce443b0000200e41002900c5ce443700002009410c3602bc01200941003602b8012009428a808080a0013702b0012009200e3602ac0120094283808080303702a4012009200d3602a00141031026220d450d14200d41026a41002d00cce2443a0000200d41002f00cae2443b0000410a1026220e450d15200e41086a41002f00d7ce443b0000200e41002900cfce443700002009410d3602dc01200941003602d8012009428a808080a0013702d0012009200e3602cc0120094283808080303702c4012009200d3602c00141031026220d450d16200d41026a41002d00cce2443a0000200d41002f00cae2443b0000410a1026220e450d17200e41086a41002f00e1ce443b0000200e41002900d9ce443700002009410e3602fc01200941003602f8012009428a808080a0013702f0012009200e3602ec0120094283808080303702e4012009200d3602e00141031026220d450d18200d41026a41002d00cce2443a0000200d41002f00cae2443b0000410b1026220e450d19200e41076a41002800eace44360000200e41002900e3ce44370000200941800241800410272209450d1a2009410f36029c0220094100360298022009428b808080b001370290022009200e36028c022009428380808030370284022009200d3602800241031026220d450d1b200d41026a41002d00cce2443a0000200d41002f00cae2443b0000410d1026220e450d1c200e41056a41002900f3ce44370000200e41002900eece44370000200941103602bc02200941003602b8022009428d808080d0013702b0022009200e3602ac0220094283808080303702a4022009200d3602a00241031026220d450d1d200d41026a41002d00cce2443a0000200d41002f00cae2443b0000410c1026220e450d1e200e41086a4100280083cf44360000200e41002900fbce44370000200941113602dc02200941003602d8022009428c808080c0013702d0022009200e3602cc0220094283808080303702c4022009200d3602c00241031026220d450d1f200d41026a41002d00cce2443a0000200d41002f00cae2443b0000410b1026220e450d20200e41076a410028008ecf44360000200e4100290087cf44370000200941123602fc02200941003602f8022009428b808080b0013702f0022009200e3602ec0220094283808080303702e4022009200d3602e00241031026220e450d21200e41026a41002d00cce2443a0000200e41002f00cae2443b000041151026220d450d22200d410d6a410029009fcf44370000200d41086a410029009acf44370000200d4100290092cf443700002009411336029c03200941003602980320094295808080d002370290032009200d36028c032009428380808030370284032009200e3602800341031026220d450d23200d41026a41002d00cce2443a0000200d41002f00cae2443b0000410a1026220e450d24200e41086a41002f00afcf443b0000200e41002900a7cf44370000200941143602bc03200941003602b8032009428a808080a0013702b0032009200e3602ac0320094283808080303702a4032009200d3602a00341031026220d450d25200d41026a41002d00cce2443a0000200d41002f00cae2443b000041071026220e450d26200e41036a41002800b4cf44360000200e41002800b1cf44360000200941153602dc03200941003602d80320094287808080f0003702d0032009200e3602cc0320094283808080303702c4032009200d3602c00341031026220e450d27200e41026a41002d00cce2443a0000200e41002f00cae2443b000041111026220d450d28200d41106a41002d00c8cf443a0000200d41086a41002900c0cf44370000200d41002900b8cf44370000200941163602fc03200941003602f8032009429180808090023702f0032009200d3602ec0320094283808080303702e4032009200e3602e00341031026220d450d29200d41026a41002d00cce2443a0000200d41002f00cae2443b0000410e1026220e450d2a200e41066a41002900cfcf44370000200e41002900c9cf4437000020094180044180081027220c450d2b200c411736029c04200c410036029804200c428e808080e00137029004200c200e36028c04200c42838080803037028404200c200d36028004410310262209450d2c200941026a41002d00cce2443a0000200941002f00cae2443b0000410e1026220d450d2d200d41066a41002900ddcf44370000200d41002900d7cf44370000200c41183602bc04200c41003602b804200c428e808080e0013702b004200c200d3602ac04200c4283808080303702a404200c20093602a004410310262209450d2e200941026a41002d00cce2443a0000200941002f00cae2443b000041101026220d450d2f200d41086a41002900edcf44370000200d41002900e5cf44370000200c41193602dc04200c41003602d804200c429080808080023702d004200c200d3602cc04200c4283808080303702c404200c20093602c004410310262209450d30200941026a41002d00cce2443a0000200941002f00cae2443b000041101026220d450d31200d41086a41002900fdcf44370000200d41002900f5cf44370000200c411a3602fc04200c41003602f804200c429080808080023702f004200c200d3602ec04200c4283808080303702e404200c20093602e00441031026220d450d32200d41026a41002d00cce2443a0000200d41002f00cae2443b0000411110262209450d33200941106a41002d0095d0443a0000200941086a410029008dd04437000020094100290085d044370000200c411b36029c05200c410036029805200c4291808080900237029005200c200936028c05200c42838080803037028405200c200d3602800541031026220d450d34200d41026a41002d00cce2443a0000200d41002f00cae2443b0000411610262209450d352009410e6a41002900a4d044370000200941086a410029009ed04437000020094100290096d044370000200c411c3602bc05200c41003602b805200c4296808080e0023702b005200c20093602ac05200c4283808080303702a405200c200d3602a00541031026220d450d36200d41026a41002d00cce2443a0000200d41002f00cae2443b0000411210262209450d37200941106a41002f00bcd0443b0000200941086a41002900b4d044370000200941002900acd044370000200c411d3602dc05200c41003602d805200c4292808080a0023702d005200c20093602cc05200c4283808080303702c405200c200d3602c005410310262209450d38200941026a41002d00cce2443a0000200941002f00cae2443b0000410b1026220d450d39200d41076a41002800c5d044360000200d41002900bed044370000200c411e3602fc05200c41003602f805200c428b808080b0013702f005200c200d3602ec05200c4283808080303702e405200c20093602e005200841086a41086a2005360200200841086a41206a4100360200200841086a41146a200641086a2802003602002008200436020c2008200336020820084100360238200820073602342008200a36023020084201370320200820062902003702142008200128020036022c200241146a28020021072002411c6a280200210f2008410036025020084201370348200841183602880120084188016a200841c8006a10414100210402400240024002400240024002400340200c20046a220d28020021012008200d41086a28020022093602880120084188016a200841c8006a10410240024002400240200828024c2206200841c8006a41086a220e280200220a6b20094f0d00200a20096a2203200a490d0520064101742205200320032005491b22034100480d052006450d01200828024820062003102722060d020c060b200828024821060c020b200310262206450d040b2008200336024c200820063602480b200e200a20096a3602002006200a6a200120091094041a200d410c6a28020021052008200d41146a28020022013602880120084188016a200841c8006a10410240024002400240200828024c220a200e28020022036b20014f0d00200320016a22092003490d05200a4101742206200920092006491b22064100480d05200a450d012008280248200a2006102722090d020c070b200828024821090c020b200610262209450d050b2008200636024c200820093602482006210a0b200e200320016a2206360200200920036a200520011094041a0240024002400240024002400240024002400240024002400240024002400240200d41186a2802004101470d00200a2006470d01200a41016a2201200a490d11200a4101742203200120012003491b22014100480d11200a450d032009200a2001102722090d040c140b200a2006470d01200a41016a2201200a490d10200a4101742203200120012003491b22014100480d10200a450d052009200a2001102722090d060c140b200a21010c030b200a21010c050b200110262209450d100b2008200136024c200820093602480b200e200641016a220a360200200920066a41023a0000200d411c6a280200210d2001200a6b41034b0d05200a41046a2203200a490d0b20014101742205200320032005491b22034100480d0b2001450d03200920012003102722090d040c100b200110262209450d0e0b2008200136024c200820093602480b200e200641016a220a360200200920066a41013a0000200d411c6a280200210d2001200a6b41034b0d05200a41046a2203200a490d0820014101742205200320032005491b22034100480d082001450d03200920012003102722090d040c0e0b200310262209450d0c0b2008200336024c200820093602480b200e200641056a3602002009200a6a200d360000200441206a2204418006470d040c030b200310262209450d0a0b2008200336024c200820093602480b200e200641056a3602002009200a6a200d360000200441206a2204418006470d010b0b200828024c210902400240411f2007200f20082802482206200841d0006a280200200841086a1007220d417d460d00200d417f470d014100210a2009450d470c460b4102210a20090d450c460b41041026220e450d41200b280200220a28020041016a22014102490d07200a2001360200200e200a36020002402009450d00200610230b20022802042106200228020021012008410036025020084201370348200841003602880120084188016a200841c8006a104120082802502103200828024c21042008280248210a410a10ac012209450d4241012105024002400240200d20012006200a20032009410a200841086a10082206417d460d0020060d462008410936028c012008200941016a36028801024020092d00002206450d00024020064101470d00200841c8006a20084188016a10d0012008280248417e714104470d010b200910232004450d02200a10230c020b410021050b2009102302402004450d00200a10230b410321092005450d010b410221090b200841c8006a41386a200841086a41386a280200360200200841c8006a41306a200841086a41306a290300370300200841c8006a41286a200841086a41286a290300370300200841c8006a41206a200841086a41206a290300370300200841c8006a41186a200841086a41186a290300370300200841c8006a41106a200841086a41106a290300370300200841c8006a41086a200841086a41086a290300370300200820082903083703482000200841c8006a200910d101200d1009200e28020022092009280200417f6a3602000240200e28020022092802000d0020092802081006200e28020022092009280204417f6a360204200e28020022092802040d00200910230b200e102341012106410021010c460b101e000b20034101102a000b20064101102a000b20014101102a000b20014101102a000b20034101102a000b20034101102a000b00000b10d201000b410c4104102a000b41044104102a000b41034101102a000b41064101102a000b41204104102a000b41034101102a000b41034101102a000b41c0004104102a000b41034101102a000b410f4101102a000b4180014104102a000b41034101102a000b410f4101102a000b41034101102a000b41084101102a000b4180024104102a000b41034101102a000b410a4101102a000b41034101102a000b410a4101102a000b41034101102a000b410a4101102a000b41034101102a000b410b4101102a000b4180044104102a000b41034101102a000b410d4101102a000b41034101102a000b410c4101102a000b41034101102a000b410b4101102a000b41034101102a000b41154101102a000b41034101102a000b410a4101102a000b41034101102a000b41074101102a000b41034101102a000b41114101102a000b41034101102a000b410e4101102a000b4180084104102a000b41034101102a000b410e4101102a000b41034101102a000b41104101102a000b41034101102a000b41104101102a000b41034101102a000b41114101102a000b41034101102a000b41164101102a000b41034101102a000b41124101102a000b41034101102a000b410b4101102a000b41044104102a000b410a4101102a000b41e49cc300104f000b200610230b0240200a450d00200841c8006a41386a200841086a41386a280200360200200841c8006a41306a200841086a41306a290300370300200841c8006a41286a200841086a41286a290300370300200841c8006a41206a200841086a41206a290300370300200841c8006a41186a200841086a41186a290300370300200841c8006a41106a200841086a41106a290300370300200841c8006a41086a200841086a41086a290300370300200820082903083703482000200841c8006a200a10d10141002106410121010c010b20004187abc10036020420004102360200200041086a41103602000240200841146a2802002209450d00200841086a41106a280200450d00200910230b0240200841246a280200450d00200841206a28020010230b200841306a2209280200220a200a280200417f6a36020002402009280200220a2802000d00200a28020810062009280200220a200a280204417f6a360204200928020022092802040d00200910230b0240200841386a2802002209450d002008413c6a280200450d00200910230b4100210a03400240200c200a6a220941046a280200450d00200928020010230b0240200941106a280200450d002009410c6a28020010230b200a41206a220a418006470d000b200c1023200b28020022092009280200417f6a3602000240200b28020022092802000d0020092802081006200b28020022092009280204417f6a360204200b28020022092802040d00200910230b200b102320084190016a24000f0b4100210a03400240200c200a6a220941046a280200450d00200928020010230b0240200941106a280200450d002009410c6a28020010230b200a41206a220a418006470d000b200c1023200b28020022092009280200417f6a3602000240200b28020022092802000d0020092802081006200b28020022092009280204417f6a360204200b28020022092802040d00200910230b200b102341002109024020014100472006720d00200d100902400340200e20096a220a280200220d200d280200417f6a36020002400240200a280200220d2802000d00200d2802081006200a280200220d200d280204417f6a360204200a280200220a280204450d010b200941046a22094104470d010c020b200a1023200941046a22094104470d000b0b200e10230b20084190016a24000b5201027e02402003450d0020022802000d00200128022c220342002003290308220420023502047d220520052004562005507222021b37030820004105410420021b3602000f0b41c9b9c10041f4031021000bbb0e03047f037e047f230041900d6b2204240002400240024002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120034102460d0220022802200d0220034103460d0320022802300d0320022802042103200241146a2802002105200241246a2802002106200241346a2802002107200441106a2001280224290338420042204200109804200441386a4200370300200441306a4200370300200441286a4200370300200128022c2202420020022903082208427f200429031020042903184200521b7d220920092008562009507222021b370308200442003703200240024020020d0020012802282802082003200441206a4120100e2202417e460d0020020d06024002400240024002402005450d002004200141246a28020029033842002007ad220a42001098042001412c6a2802002202420020022903082208427f200429030020042903084200521b7d220920092008562009507222021b37030820020d052007450d0120074100480d0e20071026220b450d0f41012102200b2103024020074102490d00200b41002007417f6a220210930420026a2103200721020b200341003a00000c020b4100210b0c020b410021024101210b4200210a0b200141286a2802002802082006200b2002100e2203417e460d0120030d0a200b450d02200a2002ad4220868421090b20012802002102200441c0006a41186a2201200441206a41186a290300370300200441c0006a41106a2207200441206a41106a290300370300200441c0006a41086a2205200441206a41086a2903003703002004200429032037034020022802182103200441e0006a41186a2001290300370300200441e0006a41106a2007290300370300200441e0006a41086a200529030037030020042004290340370360200328020c0d082003410c6a417f360200200441d80c6a41186a200341e4006a290000370300200441d80c6a41106a200341dc006a290000370300200441d80c6a41086a200341d4006a2900003703002004200329004c3703d80c02400240200341106a220c280200220141f098c400460d00200341146a280200210d0c010b41880b10262201450d0d4100210d200141003b010620014100360200200141086a200441d8016a41800b1094041a200341146a4100360200200341106a20013602000b0240024002400240034020012f0106220e410574210641002102417f2107024002400240034020062002460d01200741016a2107417f4101200441d80c6a200120026a41086a412010960422054100481b410020051b2205450d05200241206a210220054101460d000b200d0d010c020b200e2107200d450d010b200d417f6a210d200120074102746a41880b6a28020021010c010b0b20044180016a41186a200441d80c6a41186a29030037030020044180016a41106a200441d80c6a41106a29030037030020044180016a41086a200441d80c6a41086a290300370300200420042903d80c37038001200341186a21024100210d41000d010c020b200341186a21024101450d010b200441f0016a4200370300200441ec016a41f098c400360200200441003602f801200441003602e801200442003703e001200441f098c4003602dc01200441003602d8012001200741e0006c6a41e8026a2102200441d8016a10b5010c010b200441f40c6a20044180016a41086a290300370200200441fc0c6a20044180016a41106a290300370200200441840d6a20044180016a41186a290300370200200420023602e80c200420073602e40c2004200c3602e00c200420013602dc0c2004200d3602d80c20042004290380013702ec0c2004418c026a4200370200200441f8016a20042903c80137030020044180026a200441c8016a41086a29030037030020044195026a20042900a0013700002004419d026a200441a0016a41086a290000370000200441a5026a200441a0016a41106a290000370000200441ad026a200441a0016a41186a290000370000200441b4026a200441bf016a280000360000200442003703f001200442003703d801200441f098c40036028802200441003a009402200441d80c6a200441d8016a10b40121020b200441d8016a41186a200441e0006a41186a290300370300200441d8016a41106a200441e0006a41106a290300370300200441d8016a41086a200441e0006a41086a290300370300200420042903603703d801200420093702a4012004200b3602a001200441d80c6a200241306a200441d8016a200441a0016a10b601024020042802d80c450d0020042802dc0c2202450d00200441e00c6a280200450d00200210230b2003410c6a2202200228020041016a360200410421020c020b200a500d00200b10230b410521020b20002002360200200441900d6a24000f0b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41d8f6c400104f000b10e601000b41d8f6c400104f000b101e000b20074101102a000b41880b4108102a000b940302017f027e230041d0006b22042400024002402003450d0020022802000d002002280204210320042001280224290338420042204200109804200441286a4200370300200441206a4200370300200441186a4200370300200128022c2202420020022903082205427f200429030020042903084200521b7d220620062005562006507222021b3703082004420037031002400240024020020d0020012802282802082003200441106a4120100e2202417e460d0020020d04200441306a20012802002802182202410c6a200241cc006a2002410020022802001b200441106a10e5012004280230450d01200441c0006a41086a2203200441306a41086a28020036020020042004290330370340200141186a210202402001411c6a280200450d00200228020010230b20022004290340370200200241086a2003280200360200410021010c020b20004105360200200441d0006a24000f0b200141206a4100360200410121010b2000410036020020002001360204200441d0006a24000f0b41c9b9c10041f4031021000b41d8f6c400104f000bab0d06027f017e047f027e027f027e230041b0016b220424000240024002400240024002400240024002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120034102460d0220022802204101470d0220034103460d0320022802300d0320034104460d0420022802400d0420034105460d0520022802500d0520034106460d0620022802600d0620022802042105200241286a2903002106200241346a2802002107200241c4006a2802002108200241d4006a2802002109200241e4006a280200210a200441206a20012802242903384200200241146a2802002202ad4200109804200128022c220342002003290308220b427f200429032020042903284200521b7d220c200c200b56200c507222031b37030820030d0e024002402002450d0020024100480d0a200210262203450d0b2003210d4100210e024020024102490d00200341002002417f6a220e109304200e6a210d0b200d41003a0000200e41016a210e0c010b41002102410121034100210e0b024002400240200128022828020820052003200e100e2205417e460d0020050d0a2003450d1120044180016a200e4120200e412049220d1b22056a41004100412020056b2005411f4b1b1093041a20044180016a200320051094041a200d0d00200441306a41186a20044180016a41186a290000370300200441306a41106a20044180016a41106a290000370300200441306a41086a20044180016a41086a290000370300200420042900800137033002402002450d00200310230b200441106a200141246a28020029033842002008ad42001098042001412c6a280200220242002002290308220b427f200429031020042903184200521b7d220c200c200b56200c507222021b37030820020d112008450d0120084100480d0b200810262202450d0e2002210541002103024020084102490d00200241002008417f6a220310930420036a21050b200541003a0000200341016a21030c020b2002450d10200310230c100b4100210841012102410021030b0240024002402001280228280208200720022003100e2205417e460d0020050d0d2002450d112004420037038801200442003703800120044180016a20022003411020034110491b1094041a2003410f4d0d0020044188016a290300210f200429038001211002402008450d00200210230b2004200141246a2802002903384200200aad42001098042001412c6a280200220242002002290308220b427f200429030020042903084200521b7d220c200c200b56200c507222021b37030820020d11200a450d01200a4100480d0b200a10262202450d1041012103200221050240200a4102490d0020024100200a417f6a220310930420036a2105200a21030b200541003a00000c020b2008450d10200210230c100b4100210a41012102410021030b024002400240024002402001280228280208200920022003100e2205417e460d0020050d112002450d13200141206a41003602002001411c6a280200210820012802182107200142013702182001412c6a2802002205290308220b210c2006500d012006210c200b20065a0d01410121032008450d0220071023200a0d030c040b200a450d12200210230c120b200541086a220e200b200c7d3703002005290310210b200441d0006a41186a200541186a2903003703002004200c3703582004200c3703502004200b370360200128020041186a280200210520044180016a41186a200441306a41186a29030037030020044180016a41106a200441306a41106a29030037030020044180016a41086a200441306a41086a2903003703002004200429033037038001200441003602a801200420083602a401200420073602a001200441f0006a200520044180016a2010200f200441d0006a20022003200441a0016a10e701200441f0006a41086a290300210c2004280274210520042802702108200e2004290358200e2903007c3703004101210320084101460d002005450d0002402001411c6a2203280200450d00200141186a28020010230b2003200c370200200141186a2005360200410021030b200a450d010b200210230b2000410036020020002003360204200441b0016a24000f0b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41d8f6c400104f000b101e000b20024101102a000b41d8f6c400104f000b20084101102a000b41d8f6c400104f000b200a4101102a000b20004105360200200441b0016a24000b8f1006027f017e047f027e027f027e230041e0016b22042400024002400240024002400240024002400240024002400240024002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120034102460d0220022802204101470d0220034103460d0320022802300d0320034104460d0420022802400d0420034105460d0520022802500d0520034106460d0620022802600d0620022802042105200241286a2903002106200241346a2802002107200241c4006a2802002108200241d4006a2802002109200241e4006a280200210a200441286a20012802242903384200200241146a2802002202ad4200109804200128022c220342002003290308220b427f200429032820042903304200521b7d220c200c200b56200c507222031b37030820030d13024002402002450d0020024100480d0a200210262203450d0b2003210d4100210e024020024102490d00200341002002417f6a220e109304200e6a210d0b200d41003a0000200e41016a210e0c010b41002102410121034100210e0b024002400240200128022828020820052003200e100e2205417e460d0020050d0a2003450d16200441f8006a200e4120200e412049220d1b22056a41004100412020056b2005411f4b1b1093041a200441f8006a200320051094041a200d0d00200441386a41186a200441f8006a41186a290000370300200441386a41106a200441f8006a41106a290000370300200441386a41086a200441f8006a41086a2900003703002004200429007837033802402002450d00200310230b200441186a200141246a28020029033842002008ad42001098042001412c6a280200220242002002290308220b427f200429031820042903204200521b7d220c200c200b56200c507222021b37030820020d162008450d0120084100480d0b200810262202450d0e2002210541002103024020084102490d00200241002008417f6a220310930420036a21050b200541003a0000200341016a21030c020b2002450d15200310230c150b4100210841012102410021030b0240024002402001280228280208200720022003100e2205417e460d0020050d0d2002450d16200442003703c001200442003703b801200441b8016a20022003411020034110491b1094041a2003410f4d0d00200441c0016a290300210f20042903b801211002402008450d00200210230b200441086a200141246a2802002903384200200aad42001098042001412c6a280200220242002002290308220b427f200429030820042903104200521b7d220c200c200b56200c507222021b37030820020d16200a450d01200a4100480d0b200a10262202450d1041012103200221050240200a4102490d0020024100200a417f6a220310930420036a2105200a21030b200541003a00000c020b2008450d15200210230c150b4100210a41012102410021030b024002402001280228280208200920022003100e2205417e460d0020050d0e2002450d15200141206a41003602002001412c6a2802002205290308220b210c02402006500d004101210e2006210c200b2006540d130b200541086a2208200b200c7d3703002005290310210b20044198016a41186a200541186a2903003703002004200c3703a0012004200c370398012004200b3703a801200441b8016a200128020041186a2802002010200f20044198016a200441386a2002200310e2014101210e20042d00b8014101470d01200441d8006a41086a200441f8006a41086a290300370300200441d8006a41106a200441f8006a41106a290300370300200441d8006a41186a200441f8006a41186a290300370300200820044198016a41086a29030020082903007c37030020042004290378370358200a0d130c140b200a450d14200210230c140b200441f8006a41186a2203200441d1016a290000370300200441f8006a41106a2205200441c9016a290000370300200441f8006a41086a220e200441c1016a290000370300200420042900b901370378200441d8006a41086a2207200e290300370300200441d8006a41106a220e2005290300370300200441d8006a41186a22052003290300370300200820044198016a41086a29030020082903007c37030020042004290378370358200441b8016a41186a2005290300370300200441b8016a41106a200e290300370300200441b8016a41086a2007290300370300200420042903583703b8010240024002402001411c6a2802002205200141206a28020022036b41204f0d00200341206a220e2003490d0b20054101742203200e200e2003491b22034100480d0b2005450d01200141186a2802002005200310272205450d020c110b200141186a28020021050c110b2003102622050d0f0b20034101102a000b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41d8f6c400104f000b101e000b20024101102a000b41d8f6c400104f000b20084101102a000b41d8f6c400104f000b200a4101102a000b2001411c6a2003360200200141186a2005360200200141206a28020021030b200141206a200341206a360200200520036a220341186a200441b8016a41186a290300370000200341106a200441b8016a41106a290300370000200341086a200441b8016a41086a290300370000200320042903b8013700004100210e0b200a450d010b200210230b200041003602002000200e360204200441e0016a24000f0b20004105360200200441e0016a24000bd30403027f027e057f230041106b22042400024002400240024002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120022802042105200420012802242903184200200241146a2802002202ad4200109804200128022c2203420020032903082206427f200429030020042903084200521b7d220720072006562007507222031b37030820030d09200128020c21032001410036020c2003450d02200141106a29020022074280808080105a0d03024002400240024020022007422088a722084d0d002007a7220920086b200220086b220a4f0d012008200a6a220b2008490d082009410174220c200b200b200c491b220b4100480d082009450d0220032009200b10272203450d030c090b2002200820022008491b21020c0b0b2003200822096a210b200a4102490d090c080b200b102622030d060b200b4101102a000b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41bdbdc10041fd001021000b41ccabc400104f000b101e000b20074220882106200bad210720032006a722096a210b200a4102490d010b200b410020022008417f7322086a1093041a2003200920026a20086a22096a210b0b200b41003a0000200941016a21020b02402001280228280208200520032002100e2208417e460d0020080d022007a72108024020012802302205450d00200141346a280200450d00200510230b200141386a2002360200200141346a2008360200200141306a20033602000c010b2007a7450d00200310230b20004105360200200441106a24000f0b41d8f6c400104f000b900101027f200128020021040240412010262205450d002005200429001c370000200541186a200441346a290000370000200541106a2004412c6a290000370000200541086a200441246a29000037000002402001411c6a2204280200450d00200141186a28020010230b20004104360200200442a08080808004370200200141186a20053602000f0b41204101102a000b960101027f200128020028021821040240412010262205450d002005200429004c370000200541186a200441e4006a290000370000200541106a200441dc006a290000370000200541086a200441d4006a29000037000002402001411c6a2204280200450d00200141186a28020010230b20004104360200200442a08080808004370200200141186a20053602000f0b41204101102a000b7703017f027e017f200128022c220441186a2903002105200429031021060240411010262204450d00200420063700002004200537000802402001411c6a2207280200450d00200141186a28020010230b20004104360200200742908080808002370200200141186a20043602000f0b41104101102a000b6202017e027f200128022c29030821040240410810262205450d002005200437000002402001411c6a2206280200450d00200141186a28020010230b20004104360200200642888080808001370200200141186a20053602000f0b41084101102a000bc103020b7f027e230041106b22042400024002402001280200280218220528020c22064100480d00200641ffffffff07460d00200541cc006a21072005410c6a200641016a2208360200200541106a2106200541146a28020021090240024003402006280200220a41086a210b200a2f0106220c410574210d417f21060240024002400340200d450d01200641016a2106417f41012007200b4120109604220e4100481b4100200e1b220e450d03200d41606a210d200b41206a210b200e4101460d000b20090d010c040b200c21062009450d030b2009417f6a2109200a20064102746a41880b6a21060c010b0b200a41e8026a200641e0006c6a2206450d002006280200450d00200641106a290300210f200641086a29030021100c010b20042005411c6a2802002007200541206a28020028021c110400200441086a290300210f200528020c2108200429030021100b2005410c6a2008417f6a360200411010262206450d01200620103700002006200f37000802402001411c6a220d280200450d00200141186a28020010230b20004104360200200d42908080808002370200200141186a2006360200200441106a24000f0b10e401000b41104101102a000b7703017f027e017f2001280200220441086a2903002105200429030021060240411010262204450d00200420063700002004200537000802402001411c6a2207280200450d00200141186a28020010230b20004104360200200742908080808002370200200141186a20043602000f0b41104101102a000bf80303047f027e017f230041306b220424000240024002400240024002402003450d0020022802000d0020034101460d0120022802100d01410521050240200241146a2802002203200128022422062802584b0d00200228020421072004200629033842002003ad4200109804200128022c2202420020022903082208427f200429030020042903084200521b7d220920092008562009507222021b37030820020d00024002402003450d0020034100480d06200310262202450d07410121062002210a024020034102490d00200241002003417f6a220610930420066a210a200321060b200a41003a00000c010b4100210341012102410021060b02402001280228280208200720022006100e2207417e460d0020070d042002450d01200441106a2002200610e301412010262205450d0720052004290310370000200541186a200441106a41186a290300370000200541106a200441106a41106a290300370000200541086a200441106a41086a29030037000002402001411c6a2206280200450d00200141186a28020010230b200642a08080808004370200200141186a2005360200410421050b2003450d00200210230b20002005360200200441306a24000f0b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41d8f6c400104f000b101e000b20034101102a000b41204101102a000b6202017e027f200128020029031021040240410810262205450d002005200437000002402001411c6a2206280200450d00200141186a28020010230b20004104360200200642888080808001370200200141186a20053602000f0b41084101102a000be70a04027f027e027f047e230041b0036b220424000240024002400240024002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120022802042105200441286a20012802242903384200200241146a2802002202ad4200109804200128022c2203420020032903082206427f200429032820042903304200521b7d220720072006562007507222031b37030820030d0a024002402002450d0020024100480d05200210262203450d062003210841002109024020024102490d00200341002002417f6a220910930420096a21080b200841003a0000200941016a21090c010b4100210241012103410021090b024002402001280228280208200520032009100e2205417e460d0020050d042003450d0c200420093602ac01200420033602a801200441a0026a200441a8016a104420042802a0022205410e470d010b2002450d0b200310230c0b0b200441b0016a200441a0026a41047241ec001094041a20042005360238200441386a410472200441b0016a41ec001094041a02402002450d00200310230b200441003602a802200442013703a002200441386a200441a0026a103920042802a8022103024020042802a402450d0020042802a00210230b42002107200441a0026a41086a22024200370300200442003703a002418bcec200411b200441a0026a1000200441b0016a41086a22052002290300370300200420042903a0023703b00102400240200441b0016a411041a886c500410041001001417f460d00200442003703a802200442003703a002200441b0016a4110200441a0026a4110410010012209417f460d072009410f4d0d07200441a8026a290300210620042903a002210a0c010b4200210a420021060b20024200370300200442003703a00241a6cec200411b200441a0026a100020052002290300370300200420042903a0023703b00102400240200441b0016a411041a886c500410041001001417f460d00200442003703a802200442003703a002200441b0016a4110200441a0026a4110410010012202417f460d082002410f4d0d08200441a8026a290300210b20042903a00221070c010b4200210b0b2001412c6a2802002202290310220c200241186a290300220d844200510d07200441186a2007200b2003ad4200109804200441086a20042903182207200a7c220a200441186a41086a29030020067c200a200754ad7c200c200d10970420024200200229030822062004290308427f200441086a41086a290300501b7d220720072006562007507222031b37030802402003450d00200441386a10240c0b0b20012802002102200441b0016a200441386a41f0001094041a200441b8026a2002280218220241e4006a290000370300200441b0026a200241dc006a290000370300200441a0026a41086a200241d4006a2900003703002004200229004c3703a002200441c0026a200441b0016a41f0001094041a2002413c6a22032802002201200241386a280200470d09200141016a22052001490d0320014101742209200520052009491b2205ad4290017e2207422088a70d032007a722094100480d03024002402001450d00200241346a28020020014190016c200910272201450d010c0a0b2009102622010d090b20094108102a000b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41d8f6c400104f000b101e000b20024101102a000b41d4aac10041331021000b41d4aac10041331021000b41c8adc400104f000b200241386a2005360200200241346a20013602002002413c6a28020021010b200241346a28020020014190016c6a200441a0026a4190011094041a2003200328020041016a360200410421020c010b410521020b20002002360200200441b0036a24000b1600200041003602002000200141086a2802003602040ba50202057f027e230041106b2204240002400240024002402003450d0020022802000d0020034101460d0120022802100d0120034102460d0220022802200d02410521030240200141086a2802002205200241146a2802002206490d00200520066b200241246a2802002205470d0020022802042107200128020421082004200128022429034042002005ad4200109804200128022c2202420020022903082209427f200429030020042903084200521b7d220a200a200956200a507222021b37030820020d0020012802282802082007200820066a200510102202417e460d0020020d04410421030b20002003360200200441106a24000f0b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41e8f7c400104f000b1600200041003602002000200141206a2802003602040ba50202057f027e230041106b2204240002400240024002402003450d0020022802000d0020034101460d0120022802100d0120034102460d0220022802200d02410521030240200141206a2802002205200241146a2802002206490d00200520066b200241246a2802002205470d0020022802042107200128021821082004200128022429034042002005ad4200109804200128022c2202420020022903082209427f200429030020042903084200521b7d220a200a200956200a507222021b37030820020d0020012802282802082007200820066a200510102202417e460d0020020d04410421030b20002003360200200441106a24000f0b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41e8f7c400104f000be50f04047f027e0d7f017e230041a0016b22042400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120034102460d0220022802200d0220034103460d0320022802300d03200241246a2802002105200241346a2802002106024002400240200241146a2802002207450d0020022802042103200441c0006a200128022429033842002007ad4200109804200128022c2202420020022903082208427f200429034020042903484200521b7d220920092008562009507222021b3703084105210a20020d1920074100480d1220071026220b450d07200b210c41002102024020074102490d00200b41002007417f6a220210930420026a210c0b200c41003a000020012802282802082003200b200241016a220c100e2202417e460d0f20020d08200b450d192004200c3602542004200b360250200441386a200441d0006a10452004280238450d0f200428023c220dad2209421b88a70d092009420586a72202417f4c0d092002450d0120021026220e450d0a200d450d020c0b0b4101210e4100210c410021130c100b4101210e200d0d090b4100210c41002113200e450d0b0c090b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41c9b9c10041f4031021000b20074101102a000b41d8f6c400104f000b101d000b20024101102a000b2004280250210f20042802542103410021104100211141002112200d21130340200441d8006a2003412020034120491b22026a41004100412020026b2002411f4b1b1093041a200441d8006a200f20021094041a2004200f20026a220f360250200320026b21142003411f4d0d02201241016a210c20044180016a41186a2203200441d8006a41186a29000037030020044180016a41106a2215200441d8006a41106a29000037030020044180016a41086a2216200441d8006a41086a2900003703002004200429005837038001024020122013470d002010200c200c2010491b2213ad4205862209422088a70d082009a722024100480d0802402012450d00200e201120021027220e0d010c070b20021026220e450d060b200e20116a2202200429038001370000200241186a2003290300370000200241106a2015290300370000200241086a2016290300370000201041026a2110201141206a211120142103200c2112200c200d490d000b20042014360254200e450d020b02402007450d00200b10230b200c200141246a28020028024c4d0d040c0a0b200420143602542013450d00200e10230b2007450d0a0b200b10230c090b20024101102a000b200e200c41004120200c676b108e010240200c4102490d00200e2102200c210303402002200241206a22074120109604450d07200721022003417f6a220341014b0d000b0b200441286a200128022429033842002006ad22174200109804200128022c2202420020022903082208427f200429032820042903304200521b7d220920092008562009507222021b37030820020d05024002402006450d0020064100480d02200610262202450d044101210720022103024020064102490d00200241002006417f6a220310930420036a2103200621070b200341003a00000c010b4100210641012102410021070b024002402001280228280208200520022007100e2203417e460d0020030d032002450d07200441086a200141246a28020022122903284200200cad4200109804200441186a20122903204200201742001098042001412c6a2802002103427f2109024020042903204200520d0020042903104200520d002004290318220820042903087c22172008540d00427f201720122903307c220920092017541b21090b200342002003290308220820097d220920092008562009507222121b3703082012450d010b2006450d06200210234105210a20130d070c080b20044180016a41186a22112001280200280218220341e4006a29000037030020044180016a41106a220a200341dc006a29000037030020044180016a41086a220f200341d4006a2900003703002004200329004c37038001200341306a221228020022012003412c6a280200470d04200141016a22102001490d002001410174220b20102010200b491b2210ad42e8007e2209422088a70d002009a7220b4100480d00024002402001450d00200341286a280200200141e8006c200b10272201450d010c050b200b102622010d040b200b4108102a000b101e000b41d8f6c400104f000b20064101102a000b2003412c6a2010360200200341286a2001360200200341306a28020021010b200341286a280200200141e8006c6a2203200429038001370001200341053a0000200341096a200f290300370000200341116a200a290300370000200341196a2011290300370000200341216a20042f00503b0000200341236a200441d2006a2d00003a00002003412c6a2007360000200341286a2006360000200341246a2002360000200341d0006a200441f8006a290300370300200341c8006a200441d8006a41186a290300370300200341c0006a200441d8006a41106a290300370300200341386a200441d8006a41086a290300370300200341306a2004290358370300200341e0006a200c360200200341dc006a20133602002003200e3602582012201228020041016a3602004104210a0c020b4105210a2013450d010b200e10230b2000200a360200200441a0016a24000bb80a03027f027e057f230041a00c6b2204240002400240024002400240024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120022802042105200420012802242903384200200241146a2802002202ad4200109804200128022c2203420020032903082206427f200429030020042903084200521b7d220720072006562007507222031b3703084105210820030d09024002402002450d0020024100480d05200210262203450d06410121092003210a024020024102490d00200341002002417f6a220910930420096a210a200221090b200a41003a00000c010b4100210241012103410021090b0240024002402001280228280208200520032009100e2205417e460d0020050d052003450d0c200442003703a801200442003703a001200441a0016a20032009411020094110491b1094041a2009410f4d0d00200441a8016a290300210720042903a001210602402002450d00200310230b2001280200280218220328020c0d082003410c6a417f36020020044180016a200341e4006a290000370300200441e8006a41106a200341dc006a290000370300200441f0006a200341d4006a2900003703002004200329004c370368200341106a220b280200220141f098c400460d01200341146a280200210a0c020b2002450d0b200310230c0b0b41880b10262201450d074100210a200141003b010620014100360200200141086a200441a0016a41800b1094041a200341146a4100360200200341106a20013602000b02400240034020012f0106220c410574210541002102417f2108024002400240034020052002460d01200841016a2108417f4101200441e8006a200120026a41086a412010960422094100481b410020091b2209450d05200241206a210220094101460d000b200a0d010c020b200c2108200a450d010b200a417f6a210a200120084102746a41880b6a28020021010c010b0b200441106a41186a200441e8006a41186a290300370300200441106a41106a200441e8006a41106a290300370300200441106a41086a200441e8006a41086a29030037030020042004290368370310200341186a21024100210a41000d010c090b200341186a21024101450d080b200441b8016a4200370300200441b4016a41f098c400360200200441003602c001200441003602b001200442003703a801200441f098c4003602a401200441003602a0012001200841e0006c6a41e8026a2102200441a0016a10b5010c080b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41d8f6c400104f000b101e000b20024101102a000b10e601000b41880b4108102a000b20044184016a200441106a41086a2903003702002004418c016a200441106a41106a29030037020020044194016a200441106a41186a29030037020020042002360278200420083602742004200b3602702004200136026c2004200a3602682004200429031037027c200441d4016a4200370200200441c0016a2004290358370300200441c8016a200441d8006a41086a290300370300200441dd016a2004290035370000200441e5016a200441356a41086a290000370000200441ed016a200441356a41106a290000370000200441f5016a200441356a41186a290000370000200441fc016a200441d4006a280000360000200442003703b801200442003703a001200441f098c4003602d001200441003a00dc01200441e8006a200441a0016a10b40121020b200241286a2007370300200241206a2006370300200242013703182003410c6a2202200228020041016a360200410421080b20002008360200200441a00c6a24000bda03020b7f027e230041206b22042400024002402001280200280218220528020c22064100480d00200641ffffffff07460d00200541cc006a21072005410c6a200641016a2208360200200541106a2106200541146a28020021090240024003402006280200220a41086a210b200a2f0106220c410574210d417f21060240024002400340200d450d01200641016a2106417f41012007200b4120109604220e4100481b4100200e1b220e450d03200d41606a210d200b41206a210b200e4101460d000b20090d010c040b200c21062009450d030b2009417f6a2109200a20064102746a41880b6a21060c010b0b200a41e8026a200641e0006c6a2206450d00200641186a280200220d450d00200641286a290300210f200641206a29030021100c010b200441086a2005411c6a2802002007200541206a280200280214110400200441186a290300210f200528020c2108200429031021102004280208210d0b2005410c6a2008417f6a360200411010262206450d0120062010427f200d1b3700002006200f427f200d1b37000802402001411c6a220d280200450d00200141186a28020010230b20004104360200200d42908080808002370200200141186a2006360200200441206a24000f0b10e401000b41104101102a000bff0203027f027e037f230041206b22042400024002400240024002402003450d0020022802000d0020034101460d0120022802100d0120022802042105200420012802242903384200200241146a2802002202ad4200109804200128022c2203420020032903082206427f200429030020042903084200521b7d220720072006562007507222081b37030841052103024020080d00024002402002450d0020024100480d06200210262208450d07410121092008210a024020024102490d00200841002002417f6a220910930420096a210a200221090b200a41003a00000c010b4100210241012108410021090b02402001280228280208200520082009100e2201417e460d0020010d042008450d01200441106a2008200910a501024020042802100d002004280214200441186a280200100f0b410421030b2002450d00200810230b20002003360200200441206a24000f0b41c9b9c10041f4031021000b41c9b9c10041f4031021000b41d8f6c400104f000b101e000b20024101102a000b870603027f017e087f230041c0006b220424002004200136020c2004200041a886c50020011b3602082004200441086a104502400240024002400240024002402004280200450d000240024002400240024020042802042205ad2206421c88a70d002006420486a72201417f4c0d00024002402001450d00200110262207450d032005450d010c040b4108210720050d030b410021014100210b2007450d050c030b101d000b20014108102a000b200441206a4104722108410021094100210a410021002005210b0340200441206a200441086a10d001200441306a41086a220c200841086a280200360200200420082902003703302004280220220d4104460d02200041016a2101200441106a41086a220e200c2802003602002004200429033037031002402000200b470d002009200120012009491b220bad4204862206422088a70d052006a7220c4100480d0502402000450d002007200a200c102722070d010c070b200c10262207450d060b2007200a6a2200200d3602002000410c6a200e280200360200200041046a2004290310370200200941026a2109200a41106a210a2001210020012005490d000b2007450d020b200441206a20022007200120031105002004410036023820044201370330200428022021004101102621010240024020004105470d002001450d06200141013a0000200442818080801037023420042001360230420121060c010b2001450d06200141003a000020044281808080103702342004200136023020014101410210272101024020004104470d002001450d08200141003a0001200442828080802037023420042001360230420221060c010b2001450d08200141013a0001200442828080802037023420042001360230200441206a200441306a10d302200441386a3502002106200428023021010b2001ad42208620068421060240200b450d00200710230b200441c0006a240020060f0b200b450d00200710230b41f19bc30041f0001021000b101e000b200c4108102a000b41014101102a000b41014101102a000b41024101102a000b41024101102a000bcb0401057f230041106b22022400200241003a0008200241086a200128020022032001280204220441004722051094041a024020042005490d00200141046a200420056b22063602002001200320056a22053602000240024002400240024002400240024002402004450d0020022d0008417f6a220441034b0d04024020040e0400030204000b20024100360208200241086a20052006410420064104491b22041094041a200141046a200620046b3602002001200520046a360200200641034d0d052000200228020836020420004100360200200241106a24000f0b20004104360200200241106a24000f0b20024100360208200241086a20052006410420064104491b22041094041a200141046a200620046b3602002001200520046a360200200641034d0d042000200228020836020420004102360200200241106a24000f0b20024200370308200241086a20052006410820064108491b22041094041a200141046a200620046b3602002001200520046a360200200641074d0d04200041086a200229030837030020004101360200200241106a24000f0b20024200370308200241086a20052006410820064108491b22041094041a200141046a200620046b3602002001200520046a360200200641074d0d04200041086a200229030837030020004103360200200241106a24000f0b20004104360200200241106a24000f0b20004104360200200241106a24000f0b20004104360200200241106a24000f0b20004104360200200241106a24000f0b20004104360200200241106a24000f0b200520041048000bb10201027f200128023021030240024002400240200241ff017122024103470d0020030d0320004100360200200128020c22000d010c020b200141346a2802002104024020024102470d002003450d00200141386a2802002102200041013602002000410c6a2002360200200041086a2004360200200041046a2003360200200128020c22000d010c020b20004102360200200041086a4110360200200041046a41c8b3c10036020002402003450d002004450d00200310230b200128020c2200450d010b200141106a280200450d00200010230b02402001411c6a280200450d00200128021810230b200128022822012001280200417f6a22003602000240024020000d002001280208100620012001280204417f6a22003602042000450d010b0f0b200110230f0b41d8b3c100104f000b0a004198abc100104f000bbf0303027f017e027f02402001450d000340200028026c21002001417f6a22010d000b0b4100210341002101024003402002450d010240200120002f01064f0d0020014103742104200141016a21012002417f6a2102200020046a41146a290200a74103470d010c020b0240024020002802002201450d0020003301044220862003ad842105410121060c010b2003ad210541002106410021010b200010232005a72103024002402005422088a7220720012f01064f0d00200121040c010b03400240024020012802002204450d00200641016a210620013301044220862003ad8421050c010b2003ad2105410021040b200110232005a72103200421012005422088a7220720042f01064f0d000b0b200420074102746a41f0006a2802002100200420074103746a41146a2902002105024020064101460d00410120066b21010340200028026c2100200141016a22010d000b0b410021012002417f6a21022005a74103470d000b0b0240200041f098c400460d0020002802002101200010232001450d0020012802002104200110232004450d00024020042802002201450d000340200410232001210420012802002200210120000d000b0b200410230b0b9203010e7f230041b0016b22012400200141086a200010b001024020012903284202510d00200141e0006a2102200141dc006a2103200141d8006a2104200141a4016a2105200141a0016a21062001419c016a210720014198016a210820014190016a210903402002280200210a2004280200210b024002402003280200220c450d00200c210d200b210e0340200e2802ec03210e200d417f6a220d0d000b0340200b200b2f01064102746a41ec036a280200210b200c417f6a220c0d000c020b0b200b210e0b20014188016a41206a200a3602002005200b2f0106360200200641003602002007200b36020020084100360200200942003703002001200e36028c01200141003602880120014188016a10b501200141086a200010b001200141086a41206a2903004202520d000b0b02402000280204220b41f098c400460d00200b280200210c200b1023200c450d00200c280200210e200c1023200e450d000240200e280200220b450d000340200e1023200b210e200b280200220c210b200c0d000b0b200e10230b200141b0016a24000b9a0304027f017e027f017e230041c0006b2203240002400240411410262204450d00200441106a41002800f9b641360000200441086a41002900f1b641370000200441002900e9b64137000020044114413410272204450d01200420022900003700142004412c6a200241186a290000370000200441246a200241106a2900003700002004411c6a200241086a29000037000042002105200341206a41186a22024200370300200341206a41106a22064200370300200341206a41086a220742003703002003420037032020044134200341206a1002200341186a2002290300370300200341106a2006290300370300200341086a2007290300370300200320032903203703000240024002402003412041a886c500410041001001417f460d00200342003703282003420037032020034120200341206a4110410010012202417f460d022002410f4d0d02200341286a2903002108200329032021050c010b420021080b200410232000200837030820002005370300200341c0006a24000f0b41d4aac10041331021000b41144101102a000b41344101102a000bfb0101057f230041c0006b22052400024002402003450d002003280208210620032802002103200541206a41186a22074200370300200541206a41106a22084200370300200541206a41086a220942003703002005420037032020044120200541206a1002200541186a2007290300370300200541106a2008290300370300200541086a200929030037030020052005290320370300200541003602202003200620054120200541206a100a210420052802202203417f460d012000200336020420002004360200200041086a2003360200200541c0006a24000f0b20004100360200200541c0006a24000f0b20004100360200200541c0006a24000b8b0201057f23004190016b22032400200341086a200210d801024020032d000822024102470d00200041003a000020034190016a24000f0b200341f0006a200341c8006a290300370300200341f8006a2204200341d0006a29030037030020034180016a2205200341d8006a29030037030020034188016a2206200341e0006a2903003703002003200341c0006a29030037036802402002450d00200041003a000020034190016a24000f0b2003413c6a2802002102200341386a280200210720002003290370370001200041013a0000200041196a2006290300370000200041116a2005290300370000200041096a200429030037000002402002450d00200710230b20034190016a24000bce0e06087f047e017f037e017f027e23004180016b220224000240024002400240411710262203450d002003410f6a41002900abcd42370000200341086a41002900a4cd423700002003410029009ccd4237000020034117413710272203450d01200320012900003700172003412f6a200141186a290000370000200341276a200141106a2900003700002003411f6a200141086a290000370000200241386a41186a22014200370300200241386a41106a22044200370300200241386a41086a220542003703002002420037033820034137200241386a1002200241086a41186a2001290300370300200241086a41106a2004290300370300200241086a41086a20052903003703002002200229033837030802400240024002400240024002400240200241086a412041a886c500410041001001417f460d002002422037022c2002200241086a360228200241003a0038200241086a4120200241386a410141001001210120022002280230200141016a41014b22016a22043602302001450d0720022d003822014101460d0120010d072002200241286a104a2002280200450d0720022802042201417f4c0d0a2001450d02200110ac012206450d0b200241306a22072001410020022802282204200228022c2205200620012007280200100122082008417f461b2208200820014b1b220920072802006a220836020020092001460d030c060b200041023a00000c040b4200210a200241d0006a4200370300200241c8006a4200370300200241386a41086a42003703002002420037033841002105200241286a41086a22064100200241086a4120200241386a41202004100122012001417f461b2201412020014120491b20062802006a360200024002402001411f4d0d002002200228003b36007b20022002280238360278200241c7006a290000210b200229003f210c200229004f210d2002310057210a2002200228007b36007320022002280278360270410121050c010b0b2002200228007336003b200220022802703602382005450d052002200228003b36006b200220022802383602682002200228006b360063200220022802683602602002200228006336003b200220022802603602382002200241dc006a28000036007b20022002280059360278410121010c020b4101210620022802282204200228022c220541014100200241306a280200220810011a41002001470d030b20024100360238200241286a41086a2207410020042005200241386a41042008100122082008417f461b2208410420084104491b20072802006a2209360200200841034d0d0220022802382108200241d0006a4200370300200241c8006a4200370300200241386a41086a4200370300200242003703382007410020042005200241386a412020091001220e200e417f461b220e4120200e4120491b20096a220936020002400240200e411f4d0d002002200228003b36007b20022002280238360278200241c7006a290000210f200229003f2110200229004f211120022d005721072002200228007b360073200220022802783602704101210e0c010b4100210e0b2002200228007336003b20022002280270360238200e450d022002200228003b36006b200220022802383602682002420037034020024200370338200241286a41086a2212410020042005200241386a411020091001220e200e417f461b220e4110200e4110491b20096a2209360200200e410f4d0d02200241386a41086a290300210b2002290338210c200242003703382012410020042005200241386a410820091001220e200e417f461b220e4108200e4108491b20096a2209360200200e41074d0d022002290338210d200241003a0038200241306a200920042005200241386a41012009100141016a41014b220e6a2209360200200e450d020240024020022d0038220e450d00200e4101470d0420024200370338200241286a41086a410020042005200241386a41082009100122042004417f461b2204410820044108491b20096a360200200441074d0d04200229033821134201210a0c010b4200210a0b2001ad221442208620148421142002200228006b360063200220022802683602602002200228006336007b200220022802603602782002200241dc006a28000036003b20022002280059360238410021010b2002200228003b36007320022002280238360270200220022802783602682002200228007b36006b200041106a200b370000200041086a200c370000200041cf006a200f370000200041c7006a2010370000200020013a00002000413c6a2008360000200041346a2014370000200041306a2006360000200041286a2013370000200041206a200a370000200041186a200d370000200041df006a20073a0000200041d7006a201137000020002002280270360001200041046a2002280073360000200041c0006a2002280268360000200041c3006a200228006b3600000b2003102320024180016a24000f0b2001450d00200610230b41d4aac10041331021000b41174101102a000b41374101102a000b101d000b20014101102a000baf0201047f230041c0006b2202240002400240411710262203450d002003410f6a41002900abcd42370000200341086a41002900a4cd423700002003410029009ccd4237000020034117413710272203450d01200320012900003700172003412f6a200141186a290000370000200341276a200141106a2900003700002003411f6a200141086a290000370000200241206a41186a22014200370300200241206a41106a22044200370300200241206a41086a220542003703002002420037032020034137200241206a1002200241186a2001290300370300200241106a2004290300370300200241086a2005290300370300200220022903203703002002412041a886c500410041001001210120031023200241c0006a24002001417f470f0b41174101102a000b41374101102a000b840102017f037e230041e0006b220324002003200210d8010240024020032d000022024102470d00420021040c010b2002410173ad2104200341106a2903002105200341086a290300210620020d00200341346a280200450d00200341306a28020010230b2000200637030820002004370300200041106a2005370300200341e0006a24000bdb2710067f017e177f017e017f017e047f027e017f047e027f017e027f037e037f017e230041c0046b22022400200241106a4200370300200242003703082002420037030020012802082103200128020021040240024020012802042205450d002005210620042101034020012802880b21012006417f6a22060d000b0340200420042f01064102746a41880b6a28020021042005417f6a22050d000c020b0b200421010b200241086a2107200241186a411c6a20042f0106360200200241186a41186a4100360200200241186a41146a20043602002002200336023820024100360228200242003703202002200136021c2002410036021820024180016a200241186a10b0010240024002400240024020022903a00122084202520d00200241186a10d4010c010b20024180016a41c0006a210920024180016a41386a210a20024180016a410472210b200241dd016a210c20024180016a41086a2103200241e0026a41386a210d20024180016a41306a210e20024180016a41286a210f200241c8016a2110200241d0016a211120024180016a41d8006a2112200241dc016a211320024180016a411c6a211420024180016a41146a211520024180016a41346a2116200241b8036a41206a2217410f41edccc2006b41f5ccc2006a200241b8036a6b6a2118200241e0026a412c6a2119200241a4016a211a200241bc016a211b0340200241e0006a41186a220420024180016a41186a2221290300370300200241e0006a41106a220120024180016a41106a2223290300370300200241e0006a41086a22052003290300370300200241c0006a41086a2206200c41086a290000370300200241c0006a41106a2231200c41106a290000370300200241c0006a41186a2232200c41186a29000037030020022002290380013703602002200c290000370340200e290300212c200f290300212d2010290300213320092903002134200a2903002130201129030021352012280200213620132d0000213720024180026a41186a2229200429030037030020024180026a41106a2238200129030037030020024180026a41086a220120052903003703002002200229036037038002200241a0026a41186a22042032290300370300200241a0026a41106a22322031290300370300200241a0026a41086a22312006290300370300200220022903403703a00202400240024002400240024020084201520d0020024180016a20024180026a202d202c10dc01202329030021392003290300212d20212d00002105200229038001212a200241106a22062903002108200241086a222e290300212c02400240024002400240024020022903004201520d00202a4200510d01427f200820397c202c202d7c222d202c542226ad7c222c2026202c200854202c2008511b22261b212a427f202d20261b212b0c040b202a4200510d01202c202d56200820395620082039511b450d02200820397d202c202d54ad7d212a202c202d7d212b420021080c040b203920087d202d202c54ad7d200820397d202c202d54ad7d202d202c562039200856203920085122261b22251b212a202d202c7d202c202d7d20251b212b202d202c58203920085820261bad21080c030b427f200820397c202c202d7c222d202c542226ad7c222c2026202c200854202c2008511b22261b212a427f202d20261b212b420021080c020b203920087d202d202c54ad7d212a202d202c7d212b0b420121080b2006202a370300202e202b37030020022008370300200541ff01710d010b0240024002400240024002400240024002400240024002400240024002400240024002400240024020360d0020304201510d00203741ff01714101460d002035a721042035422088a72201450d01410020016b2205210620042101034020012802ec032101200641016a22060d000b0340200420042f01064102746a41ec036a2802002104200541016a22050d000c030b0b20024180016a20024180026a10d80120022d00800122054103714102460d0220054101470d0320050d132016280200450d13200e28020010232035a721042035422088a722010d140c150b200421010b20024180016a41206a4100360200201420042f0106360200202141003602002015200436020020234100360200200342003703002002200136028401200241003602800120024180016a10b5010c150b024020050d002016280200450d00200e28020010230b42022108203741ff01710d010c100b200241c0026a41086a2205200941086a290300370300200241c0026a41106a2206200941106a290300370300200241c0026a41186a222e200941186a290300370300200220092903003703c0022023290300212820032903002127201b280200211c200a280200211d2016280200211e200e280200211f200f29030021202021290300212220024180016a41206a29030022084202520d01203741ff0171450d0f0b200241a0046a41186a22262004290300370300200241a0046a41106a22252032290300370300200241a0046a41086a22242031290300370300200220022903a0023703a004200241b8036a41086a22064200370300200242003703b80341d0c5c200411a200241b8036a100020032006290300370300200220022903b8033703800120024180016a411041a886c500410041001001417f460d01200241003602b80320024180016a4110200241b8036a41044100100141016a41044d0d0820022802b80321050c020b201d417f4c0d0b02400240201d0d00410121010c010b201d10262201450d0d2001201f201d1094041a0b200d20022903c002370300200241e0026a41346a201c360200200241e0026a41306a201d3602002019201d360200200241e0026a41286a2001360200200241e0026a41206a2020370300200241e0026a41106a2022370300200241e0026a41186a2008420151ad222d370300200d41086a2005290300370300200d41106a2006290300370300200d41186a202e290300370300200220273703e002200220283703e802201d212f201d21292022212c2027212a2028212b201c210520304201510d020c030b410021050b20064200370300200242003703b80341b9c5c2004117200241b8036a100020032006290300370300200220022903b803370380010240024020024180016a411041a886c500410041001001417f460d00200242003703b80320024180016a4110200241b8036a41084100100141016a41084d0d0420022903b80342017c212c0c010b4201212c0b20064200370300200242003703b80341b9c5c2004117200241b8036a100020032006290300370300200220022903b803370380012002202c3703b80320024180016a4110200241b8036a4108100441201026222e450d06202e200229038002370000202e41186a2029290300370000202e41106a2038290300370000202e41086a2001290300370000202e412041c00010272229450d072029202c37002020214200370300202342003703002003420037030020024200370380012029412820024180016a1002200241b8036a41186a2021290300370300200241b8036a41106a20232903003703002006200329030037030020022002290380013703b803413710262201450d08200142bac6a1cbc68dd9aff300370000200142f4dec98bf6ac999de400370008200141e5cc85ab07360010200141ece8013b00142001413a3a0016200120022903b803370017200120022903c00337001f200120022802c803360027200120022f01cc033b002b200120022d00ce033a002d200120022d00cf033a002e200120022d00d0033a002f200120022d00d1033a0030200120022d00d2033a0031200120022d00d3033a0032200120022d00d4033a0033200120022d00d5033a0034200120022d00d6033a0035200120022d00d7033a0036202910234200212d20064200370300200242003703b80341af98c300410d200241b8036a100020032006290300370300200220022903b803370380014200212c024020024180016a411041a886c500410041001001417f460d00200242003703b80320024180016a4110200241b8036a41084100100141016a41084d0d0420022903b803212c0b200241e0026a41346a2005360200200241e0026a41306a20183602004137212f20194137360200200241e0026a41286a2001360200200d20022903a004370000200241e0026a41186a4200370300200241e0026a41106a202c370300200d41086a2024290300370000200d41106a2025290300370000200d41186a2026290300370000427f212a2002427f3703e8022002427f3703e00220182129427f212b20304201520d010b200220343703e002200220333703e8022034212a2033212b0b0240203741ff0171450d00200d20022903a002370000200d41186a2004290300370000200d41106a2032290300370000200d41086a20312903003700000b02402036450d0042002139200241b8036a41086a22044200370300200242003703b80341af98c300410d200241b8036a100020032004290300370300200220022903b80337038001024020024180016a411041a886c500410041001001417f460d00200242003703b80320024180016a4110200241b8036a41084100100141016a41084d0d0420022903b80321390b4201212d200241e0026a41186a4201370300200241e0026a41206a20393703000b2035a72104024002402035422088a72206450d00410020066b2231213220042106034020062802ec032106203241016a22320d000b0340200420042f01064102746a41ec036a2802002104203141016a22310d000c020b0b200421060b20042f0106213120172036360200200241b8036a411c6a2031360200200241b8036a41186a22264100360200200241b8036a41146a2004360200200241b8036a41106a22254100360200200241b8036a41086a22244200370300200220063602bc03200241003602b80320024180016a200241b8036a10af0102402002280280014101470d000340200241e0036a41186a2231200b41186a290200370300200241e0036a41106a2232200b41106a290200370300200241e0036a41086a2236200b41086a2902003703002002200b2902003703e003201a2802002104200f280200213820024180016a412c6a280200210620024180046a41186a203129030037030020024180046a41106a203229030037030020024180046a41086a2036290300370300200220022903e00337038004202142003703002023420037030020034200370300200242003703800120024180046a412020024180016a1002200241a0046a41186a22322021290300370300200241a0046a41106a22362023290300370300200241a0046a41086a2237200329030037030020022002290380013703a004200241003602800120012029200241a0046a412020024180016a100a212e02402002280280012231417f460d00200520316b21052031450d00202e10230b024002402004450d00202142003703002023420037030020034200370300200242003703800120024180046a412020024180016a100220322021290300370300203620232903003703002037200329030037030020022002290380013703a00420012029200241a0046a412020042006100b200520066a21052038450d01200410230c010b202142003703002023420037030020034200370300200242003703800120024180046a412020024180016a100220322021290300370300203620232903003703002037200329030037030020022002290380013703a00420012029200241a0046a4120100c0b20024180016a200241b8036a10af012002280280014101460d000b200241e0026a41346a20053602000b200241b8036a10b5012026200241c0026a41186a2903003703002025200241c0026a41106a2903003703002024200241c0026a41086a290300370300200220022903c0023703b803024020084202510d002016201c360200200e201d36020020024180016a412c6a201e360200200f201f36020020024180016a41206a20203703002021200837030020232022370300200a20022903b803370300200a41086a2024290300370300200a41106a2025290300370300200a41186a20262903003703002002202737038001200220283703880141012104024002400240201d2029470d0002400240201f2001460d00201f2001201d1096040d02201c2005470d020c010b201c2005470d010b200a200d41201096040d002027202a852028202b85844200520d002022202c520d002008a72205202da7470d0020054101462020200241e0026a41206a29030052712104201e0d010c020b201e450d010b201f10230b20044102460d0020040d00202f450d0e200110230c0e0b2003200241e0026a41d8001094041a200241003a00800120024180026a20024180016a10dd010c0d0b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41204101102a000b41c0004101102a000b41374101102a000b101d000b201d4101102a000b2035a721042035422088a72201450d010b410020016b2205210620042101034020012802ec032101200641016a22060d000b0340200420042f01064102746a41ec036a2802002104200541016a22050d000c020b0b200421010b20024180016a41206a2036360200201420042f0106360200202141003602002015200436020020234100360200200342003703002002200136028401200241003602800120024180016a10b5010b20024180016a200241186a10b00120024180016a41206a29030022084202520d000b20022903002135200241186a10d401203550450d010b200241086a290300200241106a2903008450450d0220022903004200510d010b200220073602800120024180016a10de01200241c0046a24000f0b200220073602800120024180016a107b200241c0046a24000f0b41b4b8c100104f000b970a03057f037e017f23004190016b2204240002400240024002400240411410262205450d00200541106a41002800f9b641360000200541086a41002900f1b641370000200541002900e9b64137000020054114413410272205450d01200520012900003700142005412c6a200141186a290000370000200541246a200141106a2900003700002005411c6a200141086a290000370000200441206a41186a22064200370300200441206a41106a22074200370300200441206a41086a220842003703002004420037032020054134200441206a1002200441186a2006290300370300200441106a2007290300370300200441086a20082903003703002004200429032037030002400240024002402004412041a886c500410041001001417f460d00200442003703282004420037032020044120200441206a4110410010012206417f460d022006410f4d0d02200441286a29030021092004290320210a0c010b4200210a420021090b20051023200441206a41086a22054200370300200442003703204182b6c100411b200441206a1000200441086a20052903003703002004200429032037030002402004411041a886c500410041001001417f460d00200442003703282004420037032020044110200441206a4110410010012205417f460d022005410f4d0d02200a2009844200520d002004290320200258200441286a290300220b200358200b2003511b0d0020004200370300200041013a0018200041106a4200370300200041086a420037030020044190016a24000f0b200441206a41086a22054200370300200442003703204182b6c100411b200441206a1000200441086a200529030037030020042004290320370300024002402004411041a886c500410041001001417f460d00200442003703282004420037032020044110200441206a4110410010012205417f460d062005410f4d0d062004290320200258200441286a290300220b200358200b2003511b0d0020012002200310df01410121050c010b411410262205450d06200541106a41002800f9b641360000200541086a41002900f1b641370000200541002900e9b64137000020054114413410272205450d07200520012900003700142005412c6a200141186a220c290000370000200541246a200141106a2900003700002005411c6a200141086a290000370000200441206a41186a22064200370300200441206a41106a22074200370300200441206a41086a220842003703002004420037032020054134200441206a1002200441186a2006290300370300200441106a2007290300370300200441086a2008290300370300200420042903203703002004412041a886c50041004100100121062005102302402006417f470d00200110e001200441d8006a2003370300200441d0006a2002370300200441206a41086a41003a0000200441296a2001290000370000200441316a200141086a290000370000200441396a200141106a290000370000200441c1006a200c290000370000200441023a002041a886c5004100200441206a102c0b20012002200310df01410021050b2000200a20027d2002200a7d200a200256200920035620092003511b22011b370308200020053a001820002001ad370300200041106a200920037d200a200254ad7d200320097d2002200a54ad7d20011b37030020044190016a24000f0b41d4aac10041331021000b41d4aac10041331021000b41144101102a000b41344101102a000b41d4aac10041331021000b41144101102a000b41344101102a000bd00201047f230041c0006b2202240002400240411710262203450d002003410f6a41002900abcd42370000200341086a41002900a4cd423700002003410029009ccd4237000020034117413710272203450d01200320002900003700172003412f6a200041186a290000370000200341276a200041106a2900003700002003411f6a200041086a290000370000200241206a41186a22004200370300200241206a41106a22044200370300200241206a41086a220542003703002002420037032020034137200241206a1002200241186a2000290300370300200241106a2004290300370300200241086a20052903003703002002200229032037030020024120360224200220023602202001200241206a10b30220031023024020012d00000d00200141346a280200450d00200141306a28020010230b200241c0006a24000f0b41174101102a000b41374101102a000bcd0202047f047e230041206b22012400200141106a41086a220242003703002001420037031041ecb5c1004116200141106a1000200141086a22032002290300370300200120012903103703000240024002402001411041a886c500410041001001417f460d00200142003703182001420037031020014110200141106a4110410010012204417f460d022004410f4d0d02200141186a2903002105200129031021060c010b42002106420021050b2000280200220041086a290300210720002903002108200242003703002001420037031041ecb5c1004116200141106a1000200320022903003703002001200129031037030020014200200520077d2006200854ad7d2207200620087d2208200656200720055620072005511b22021b37031820014200200820021b37031020014110200141106a41101004200141206a24000f0b41d4aac10041331021000ba01f05017f017e017f017e067f230041f0016b2203240042002104200341206a41086a22054200370300200342003703204182b6c100411b200341206a1000200341d0016a41086a2005290300370300200320032903203703d0010240024002400240200341d0016a411041a886c500410041001001417f460d002003420037032820034200370320200341d0016a4110200341206a4110410010012205417f460d022005410f4d0d02200341286a29030021062003290320210441142107411410262205450d010c030b42002106411421074114102622050d020b20074101102a000b41d4aac10041331021000b200541106a41002800f9b641360000200541086a41002900f1b641370000200541002900e9b641370000024002400240024002400240024002400240024002400240024020052007413410272205450d00200520002900003700142005412c6a200041186a290000370000200541246a200041106a2900003700002005411c6a200041086a29000037000020034190016a41186a2207420037030020034190016a41106a2208420037030020034190016a41086a2209420037030020034200370390012005413420034190016a1002200341206a41186a2007290300370300200341206a41106a2008290300370300200341206a41086a20092903003703002003200329039001370320200320013703d001200320023703d801200341206a4120200341d0016a41101004200510232004200158200620025820062002511b0d0b411410262205450d02200541106a41002800f9b641360000200541086a41002900f1b641370000200541002900e9b64137000020054114413410272205450d03200520002900003700142005412c6a200041186a290000370000200541246a200041106a2900003700002005411c6a200041086a290000370000200341086a2005413410e101200341086a41106a2903002102200329031021012003280208210a20051023410e10262205450d04200541066a41002900b0b741370000200541002900aab7413700002005410e412e10272205450d052005200029000037000e200541266a200041186a2900003700002005411e6a200041106a290000370000200541166a200041086a29000037000020034190016a41186a2207420037030020034190016a41106a2208420037030020034190016a41086a2209420037030020034200370390012005412e20034190016a1002200341206a41186a2007290300370300200341206a41106a2008290300370300200341206a41086a20092903003703002003200329039001370320200341206a412010032005102302402001200284500d00200a450d0020032001370320200320023703282003200341206a3602d001200341d0016a10de010b410e10262205450d06200541066a4100290094c7403700002005410029008ec7403700002005410e412e10272205450d072005200029000037000e200541266a200041186a2900003700002005411e6a200041106a290000370000200541166a200041086a29000037000020034190016a41186a2207420037030020034190016a41106a2208420037030020034190016a41086a2209420037030020034200370390012005412e20034190016a1002200341d0016a41186a2007290300370300200341d0016a41106a2008290300370300200341d0016a41086a200929030037030020032003290390013703d00102400240200341d0016a412041a886c500410041001001417f460d00200341206a41186a4200370300200341206a41106a4200370300200341206a41086a420037030020034200370320200341d0016a4120200341206a4120410010012207417f460d032007411f4d0d03200341b0016a41186a2207200341206a41186a290300370300200341b0016a41106a2208200341206a41106a290300370300200341b0016a41086a2209200341206a41086a290300370300200320032903203703b001200341d0016a4120100320051023200341d0016a41186a2007290300370300200341d0016a41106a2008290300370300200341d0016a41086a2009290300370300200320032903b0013703d001410e10262205450d0a200541066a41002900c6c740370000200541002900c0c7403700002005410e412e10272205450d0b200520032903d00137000e200541266a200341d0016a41186a2903003700002005411e6a200341d0016a41106a290300370000200541166a200341d0016a41086a29030037000020034190016a41186a2207420037030020034190016a41106a2208420037030020034190016a41086a2209420037030020034200370390012005412e20034190016a1002200341206a41186a2007290300370300200341206a41106a2008290300370300200341206a41086a20092903003703002003200329039001370320200341206a4120100320051023410d2107410d10262205450d010c0c0b20051023410d2107410d102622050d0b0b20074101102a000b41344101102a000b41d4aac10041331021000b41144101102a000b41344101102a000b410e4101102a000b412e4101102a000b410e4101102a000b412e4101102a000b410e4101102a000b412e4101102a000b200541056a41002900ee9c41370000200541002900e99c41370000024002400240024002400240024002400240024020052007412d10272205450d002005200029000037000d200541256a200041186a2900003700002005411d6a200041106a290000370000200541156a200041086a29000037000020034190016a41186a2207420037030020034190016a41106a2208420037030020034190016a41086a2209420037030020034200370390012005412d20034190016a1002200341206a41186a2007290300370300200341206a41106a2008290300370300200341206a41086a20092903003703002003200329039001370320200341206a4120100320051023411210262205450d01200541106a41002f00a6f5403b0000200541086a410029009ef54037000020054100290096f54037000020054112413210272205450d02200520002900003700122005412a6a200041186a290000370000200541226a200041106a2900003700002005411a6a200041086a29000037000020034190016a41186a2207420037030020034190016a41106a2208420037030020034190016a41086a2209420037030020034200370390012005413220034190016a1002200341206a41186a2007290300370300200341206a41106a2008290300370300200341206a41086a20092903003703002003200329039001370320200341206a412010032005102320001085012000108601200341206a200010d801024002400240024020032d00202205410371450d0020054102470d0120050d02200341d4006a280200450d02200341d0006a2802001023411721074117102622050d030c070b200341d4006a2802002105200341d0006a2802002207200341d8006a280200100d2005450d0120071023411721074117102622050d020c060b20050d00200341d4006a280200450d00200341d0006a28020010230b41172107411710262205450d040b2005410f6a41002900abcd42370000200541086a41002900a4cd423700002005410029009ccd4237000020052007413710272205450d04200520002900003700172005412f6a200041186a290000370000200541276a200041106a2900003700002005411f6a200041086a29000037000020034190016a41186a2207420037030020034190016a41106a2208420037030020034190016a41086a2209420037030020034200370390012005413720034190016a1002200341206a41186a2007290300370300200341206a41106a2008290300370300200341206a41086a20092903003703002003200329039001370320200341206a4120100320051023411210262205450d05200541106a41002f00c4ad443b0000200541086a41002900bcad44370000200541002900b4ad4437000020054112413210272205450d06200520002900003700122005412a6a200041186a290000370000200541226a200041106a2900003700002005411a6a200041086a29000037000020034190016a41186a2207420037030020034190016a41106a2208420037030020034190016a41086a2209420037030020034200370390012005413220034190016a1002200341206a41186a2007290300370300200341206a41106a2008290300370300200341206a41086a20092903003703002003200329039001370320200341206a4120100320051023411810262205450d07200541106a410029008db741370000200541086a4100290085b741370000200541002900fdb64137000020054118413810272205450d0820052000290000370018200541306a200041186a290000370000200541286a200041106a290000370000200541206a200041086a29000037000020034190016a41186a2207420037030020034190016a41106a2208420037030020034190016a41086a2209420037030020034200370390012005413820034190016a1002200341206a41186a2007290300370300200341206a41106a2008290300370300200341206a41086a2009290300370300200320032903900137032002400240200341206a412041a886c500410041001001417f460d00200342003703d801200342003703d001200341206a4120200341d0016a4110410010012207417f460d012007410f4d0d01200341d8016a290300210220032903d001210141002107200510232001200284504101710d0d0c0b0b41012107200510234100410171450d0a0c0c0b41d4aac10041331021000b412d4101102a000b41124101102a000b41324101102a000b20074101102a000b41374101102a000b41124101102a000b41324101102a000b41184101102a000b41384101102a000b20070d010b200341f0016a24000f0b02400240411310262205450d002005410f6a41002800a99943360000200541086a41002900a299433700002005410029009a994337000020054113413310272205450d01200520002900003700132005412b6a200041186a2207290000370000200541236a200041106a22082900003700002005411b6a200041086a220929000037000020034190016a41186a220a420037030020034190016a41106a220b420037030020034190016a41086a220c420037030020034200370390012005413320034190016a1002200341206a41186a200a290300370300200341206a41106a200b290300370300200341206a41086a220a200c2903003703002003200329039001370320200341206a4120100320051023200a41013a0000200341296a2000290000370000200341316a2009290000370000200341396a2008290000370000200341c1006a2007290000370000200341023a002041a886c5004100200341206a102c200341f0016a24000f0b41134101102a000b41334101102a000b950803037f017e077f23004190016b22012400200141206a41086a220242003703002001420037032041f5a7c4004113200141206a1000200141106a41086a2002290300370300200120012903203703104100210202400240024002400240200141106a411041a886c500410041001001417f460d0020014100360220200141106a4110200141206a41044100100141016a41044d0d01200128022021020b412010262203450d01200320002900002204370000200341186a200041186a290000370000200341106a200041106a290000370000200341086a200041086a29000037000020032d0001210520031023200141106a20054108742004a7220341c0017172410676220510870102400240024002402003413f71220320012802184f0d002001200128021020034105746a220310342001290300200141086a290300844200510d010b02402001280214450d00200128021010230b200141206a2002108701024020012802282203413f4d0d00200141286a21050340200241016a210202402001280224450d00200128022010230b200141206a20021087012005280200220341c0004f0d000b0b2001280220210620012802242107200141206a41186a2208200041186a290000370300200141206a41106a2209200041106a290000370300200141206a41086a220a200041086a29000037030020012000290000370320200341016a210520072003470d0620034101742207200520052007491b2207ad4205862204422088a70d052004a7220b4100480d052003450d0120062003410574200b10272206450d020c060b20032000290000370000200341186a200041186a290000370000200341106a200041106a290000370000200341086a200041086a290000370000200141206a41086a200141106a41086a280200360200200120012903103703202005200141206a10b50320014190016a24000f0b200b102622060d040b200b4101102a000b41d4aac10041331021000b41204101102a000b101e000b200320024106746a210b200620034105746a22032001290320370000200341186a2008290300370000200341106a2009290300370000200341086a200a2903003700000240200541c000470d00200141206a41086a220342003703002001420037032041f5a7c4004113200141206a1000200141106a41086a2003290300370300200120012903203703102001200241016a360220200141106a4110200141206a410410040b2001200536022820012007360224200120063602202002200141206a10b503200141206a41086a2000290000370300200141206a41106a200041086a290000370300200141206a41186a200041106a290000370300200141c0006a200041186a2900003703002001200b360224200141013a002041a886c5004100200141206a102c20014190016a24000b980204017f017e037f027e230041c0006b2203240042002104200341206a41186a22054200370300200341206a41106a22064200370300200341206a41086a220742003703002003420037032020012002200341206a1002200341186a2005290300370300200341106a2006290300370300200341086a2007290300370300200320032903203703000240024002402003412041a886c500410041001001417f460d00200342003703282003420037032020034120200341206a4110410010012201417f460d022001410f4d0d02200341286a290300210820032903202109200341201003420121040c010b0b2000200437030020002009370308200041106a2008370300200341c0006a24000f0b41d4aac10041331021000b972403027f027e0a7f230041b00d6b2208240002402001280224200128024022092802b001470d00200041013a0000200041086a4124360200200041046a41ebbcc400360200200841b00d6a24000f0b200442002004290308220a200941a8016a2903007d220b200b200a56200b507222091b37030802402009450d00200041013a0000200041086a412a360200200041046a418fbdc400360200200841b00d6a24000f0b200841b0026a41186a22094200370300200841b0026a41106a220c4200370300200841b0026a41086a220d4200370300200842003703b00220062007200841b0026a1002200841c0016a41186a2009290300370300200841c0016a41106a200c290300370300200841c0016a41086a200d290300370300200820082903b0023703c0010240024002400240024002400240024002400240024002400240412010262209450d0020092005290000370000200941186a200541186a290000370000200941106a200541106a290000370000200941086a200541086a2900003700002009412041c00010272209450d01200920082903c001370020200941386a200841c0016a41186a290300370000200941306a200841c0016a41106a290300370000200941286a200841c0016a41086a290300370000200941c00041800110272209450d022009200141cc006a220e290000370040200941d8006a200e41186a290000370000200941d0006a200e41106a290000370000200941c8006a200e41086a290000370000200841b0026a41186a220c4200370300200841b0026a41106a220d4200370300200841b0026a41086a220f4200370300200842003703b002200941e000200841b0026a1002200841086a41186a200c290300370300200841086a41106a200d290300370300200841086a41086a200f290300370300200820082903b00237030820091023200841cc006a41bcbbc400360200200841386a41086a420037030020082001410c6a2210360248200841f098c40036023c20084100360238200841a0016a41186a200541186a290000370300200841a0016a41106a200541106a290000370300200841a0016a41086a200541086a29000037030020084101360238200820052900003703a0012010200841086a10ea01210920082008280238417f6a220c360238024002400240024002402009450d00200841386a410c6a2802002109200841386a41086a2802002105200828023c2101200041086a412a360200200041046a419eb3c100360200200041013a00002005450d012005210420012100034020002802880b21002004417f6a22040d000b0340200120012f01064102746a41880b6a28020021012005417f6a22050d000c030b0b200c0d082008417f360238200841c0016a41186a200841086a41186a290300370300200841c0016a41106a200841086a41106a290300370300200841c0016a41086a200841086a41086a290300370300200820082903083703c001200828023c220c41f098c400460d02200841386a41086a28020021110c030b200121000b200841cc026a20012f0106360200200841c8026a4100360200200841c4026a2001360200200820093602d002200841003602c002200842003703b802200820003602b402200841003602b002200841b0026a10d401200841b00d6a24000f0b41880b1026220c450d0641002111200c41003b0106200c4100360200200c41086a200841b0026a41800b1094041a200841386a41086a41003602002008200c36023c0b200841386a4104722112024002400340200c2f01062213410574211441002109417f210d024002400240034020142009460d01200d41016a210d417f4101200841c0016a200c20096a41086a4120109604220f4100481b4100200f1b220f450d05200941206a2109200f4101460d000b20110d010c020b2013210d2011450d010b2011417f6a2111200c200d4102746a41880b6a280200210c0c010b0b200841d0006a41186a2209200841c0016a41186a290300370300200841d0006a41106a220f200841c0016a41106a290300370300200841d0006a41086a2214200841c0016a41086a290300370300200820082903c001370350200841dc016a2014290300370200200841e4016a200f290300370200200841ec016a20092903003702002008200841c4006a3602d0012008200d3602cc01200820123602c8012008200c3602c401200841003602c001200820082903503702d401200841e4026a4200370200200841003a00ec02200842003703b002200841f098c4003602e002200842003703c802200841c0016a200841b0026a10b40121090c010b200c200d41e0006c6a41e8026a21090b200941013a003c200941286a427f370300200941206a427f3703002009413d6a20082903a001370000200941d5006a200841a0016a41186a290300370000200941cd006a200841a0016a41106a220c290300370000200941c5006a200841a0016a41086a220d290300370000200942013703182008200828023841016a360238200c200841386a41106a290300370300200d200841386a41086a290300370300200820082903383703a001200841d0006a41186a2214200841086a41186a290300370300200841d0006a41106a2211200841086a41106a290300370300200841d0006a41086a2213200841086a41086a29030037030020082008290308370350200841c0016a200841d0006a10d8014100210f0240024020082d00c00122124102470d000c010b200841f8016a280200210920120d002009417f4c0d07200841f4016a2802002115200841f0016a2802002112024002402009450d0020091026220f450d0b200f201220091094041a20150d010c020b4101210f2015450d010b201210230b200841b0026a41086a200936020020084184036a20132903003702002008418c036a201129030037020020084194036a2014290300370200200841c4026a200d290300370200200841cc026a200c290300370200200820093602b4022008200f3602b002200820082903503702fc02200820082903a0013702bc02200141246a2802002109200141c0006a290200210b2001280248210c200841e8026a4200370300200841e0026a428080808080013703002008200c3602f8022008200b3703f002200842083703d8022008200941016a3602d402200820044101200e200841086a20022003200841b0026a10bc03024020082802002209450d0020082802042101200041013a0000200041086a2001360200200041046a200936020020082802b00222010d0c0c0d0b200841c0016a2005200141c8006a28020028020010c402024020082802c0014101470d00200041046a20082902c401370200200041013a00000c0b0b200841a0016a41186a2205200841c0016a410472220941186a280200360200200841a0016a41106a220c200941106a290200370300200841a0016a41086a220d200941086a290200370300200820092902003703a001200841d0006a41106a200d290300370300200841d0006a41186a200c290300370300200841f0006a200528020036020020084106360254200841e5c4c400360250200820082903a001370358200141c4006a28020021092005200141e4006a290000370300200c200141dc006a290000370300200d200141d4006a2900003703002008200129004c3703a0014200210b20084188016a41086a220e4200370300200842003703880141a298c300410d20084188016a1000200841a0026a41086a200e29030037030020082008290388013703a0020240200841a0026a411041a886c500410041001001417f460d002008420037038801200841a0026a411020084188016a41084100100141016a41084d0d04200829038801210b0b200841e4016a200d290300370200200841ec016a200c290300370200200841f4016a2005290300370200200820023703c0012008200b3703d001200820033703c801200820082903a0013702dc012008200841b0026a3602d801200841003602a801200842013703a001200841f8006a2009200841d0006a200841c0016a20062007200841a0016a200410b70102400240200828027822054101460d0020054102470d01200041046a200829027c370200200041013a0000200841e8006a280200450d0c200841e4006a280200102320082802b00222010d0d0c0e0b20084180016a280200450d00200828027c10230b200841c0016a41186a200141cc006a220541186a290000370300200841c0016a41106a200541106a290000370300200841c0016a41086a200541086a290000370300200841a0016a41086a200841086a41086a290300370300200841a0016a41106a200841086a41106a290300370300200841a0016a41186a200841086a41186a290300370300200820052900003703c001200820082903083703a0010240024002400240200841e0026a2802002205200841dc026a280200470d00200541016a22042005490d0b20054101742209200420042009491b2209ad42e8007e220b422088a70d0b200ba7220c4100480d0b2005450d01200841d8026a280200200541e8006c200c102722040d020c0d0b200841d8026a28020021040c020b200c10262204450d0b0b200841dc026a2009360200200841d8026a2004360200200841e0026a28020021050b2004200541e8006c6a220520082903c001370001200541013a0000200541096a200841c0016a41086a2204290300370000200541116a200841c0016a41106a290300370000200541196a200841c0016a41186a290300370000200541216a20082903a001370000200541296a200841a0016a41086a290300370000200541316a200841a0016a41106a290300370000200541396a200841a0016a41186a290300370000200541c1006a200829008801370000200541c9006a20084188016a41086a290000370000200541d0006a20084197016a290000370000200541e0006a410036020020054201370358200841e0026a2205200528020041016a22093602002004200841bc026a220541086a290200370300200841286a41086a200841cc016a280200360200200820052902003703c001200820082902c401370328200841ec026a280200210c200841e8026a2802002106200841e4026a2802002105200841dc026a2802002107200841d8026a28020021040240200841d0006a41186a280200450d00200841e4006a28020010230b024020082802b002220d450d0020082802b402450d00200d10230b200841c0016a41086a220d200841286a41086a280200360200200820082903283703c001200841b0026a41086a200d280200360200200820082903c0013703b0022010200841b0026a10ec0120082004200941e8006c6a3602bc02200820043602b802200820073602b402200820043602b002200141286a200841b0026a10a20220082005200c4190016c6a3602bc02200820053602b802200820063602b402200820053602b002200141346a200841b0026a10a102200041003a0000200041196a200841206a290300370000200041116a200841186a290300370000200041096a200841086a41086a29030037000020002008290308370001200841b00d6a24000f0b41204101102a000b41c0004101102a000b4180014101102a000b41d4aac10041331021000b10e601000b41880b4108102a000b101d000b101e000b20094101102a000b200c4108102a000b20082802b0022201450d010b20082802b402450d00200110230b200841b0026a41186a2802002109200841c0026a280200210102400240200841b0026a41146a2802002200450d002000210420012105034020052802880b21052004417f6a22040d000b0340200120012f01064102746a41880b6a28020021012000417f6a22000d000c020b0b200121050b200841dc016a20012f0106360200200841c0016a41186a4100360200200841c0016a41146a2001360200200820093602e001200841003602d001200842003703c801200820053602c401200841003602c001200841c0016a10d4010240200841e0026a2802002205450d00200841b0026a41286a2802002101200541e8006c210503400240200141dc006a280200450d00200141d8006a28020010230b024020012d00004105490d00200141286a280200450d00200141246a28020010230b200141e8006a2101200541987f6a22050d000b0b0240200841dc026a280200450d00200841d8026a28020010230b0240200841ec026a2802002201450d0020014190016c2105200841e4026a28020041206a210103402001102420014190016a2101200541f07e6a22050d000b0b0240200841e8026a280200450d00200841e4026a28020010230b200841b00d6a24000bc718012e7f230041b00d6b220324002003200236020420032001360200200341086a10d40202400240024002400240024002400240200328020c2204450d0020032802102105200341086a410c6a2802002202450d0120032c00082101200341086a410041e00c1093041a200441206a2106200420024105746a2107200341900d6a41086a2108410021094100210a4100210b4100210c4100210d4100210e4100210f410021104100211141002112410021134100211441002115410021164100211741002118410021194100211a4100211b4100211c4100211d4100211e4100211f410021204100212141002122410021234100212441002125410021264100212741002128200421294100212a41d100212b02400340202a212c024002400240024002402001450d0020072004460d012001417f7321022029210102400340024020012007460d002001212d200141206a22292101200241016a22020d010c020b20062129200621012004212d200241016a22020d000b0b202d0d040c060b20292007460d012029212d202941206a21290c030b20292007460d042001417f7321010340200141016a2201450d022007202941206a2229470d000c050b0b20072004460d03200621292004222d0d010c030b2029212d202941206a2129202d450d020b2003280204212e2003280200212f20084100360200200342013703900d410110262201450d072001202c3a000020034281808080103702940d200320013602900d2003202e36028c0d2003418c0d6a200341900d6a1041024002400240024020032802940d22022008280200222a6b202e4f0d00202a202e6a2201202a490d0a20024101742230200120012030491b22304100480d0a2002450d0120032802900d20022030102722010d020c0c0b20032802900d21010c020b203010262201450d0a0b200320303602940d200320013602900d203021020b2008202a202e6a22303602002001202a6a202f202e1094041a0240024002400240200220306b411f4b0d00203041206a222e2030490d0a2002410174222a202e202e202a491b222e4100480d0a2002450d0120012002202e102722010d020c0d0b2002212e0c020b202e10262201450d0b0b2003202e3602940d200320013602900d0b200120306a2202202d290000370000200241186a202d41186a290000370000200241106a202d41106a290000370000200241086a202d41086a290000370000200341900d6a41186a22024200370300200341900d6a41106a222d420037030020084200370300200342003703900d2001203041206a200341900d6a1002200341e80c6a41186a22302002290300370300200341e80c6a41106a2202202d290300370300200341e80c6a41086a222d2008290300370300200320032903900d3703e80c0240202e450d00200110230b202b417f6a212b202c41016a212a200341086a202c4103704105746a220120032903e80c370000200141186a2030290300370000200141106a2002290300370000200141086a202d290300370000410021024100212e02400340202c202c41036e222d417d6c6a4102470d01200341086a20026a220141df006a2d000022092001411f6a2d0000220a712009200a722001413f6a2d000071722126200141de006a2d000022092001411e6a2d0000220a712009200a722001413e6a2d000071722125200141dd006a2d000022092001411d6a2d0000220a712009200a722001413d6a2d000071722124200141dc006a2d000022092001411c6a2d0000220a712009200a722001413c6a2d000071722123200141db006a2d000022092001411b6a2d0000220a712009200a722001413b6a2d000071722122200141da006a2d000022092001411a6a2d0000220a712009200a722001413a6a2d000071722121200141d9006a2d00002209200141196a2d0000220a712009200a72200141396a2d000071722120200141d8006a2d00002209200141186a2d0000220a712009200a72200141386a2d00007172211f200141d7006a2d00002209200141176a2d0000220a712009200a72200141376a2d00007172211e200141d6006a2d00002209200141166a2d0000220a712009200a72200141366a2d00007172211d200141d5006a2d00002209200141156a2d0000220a712009200a72200141356a2d00007172211c200141d4006a2d00002209200141146a2d0000220a712009200a72200141346a2d00007172211b200141d3006a2d00002209200141136a2d0000220a712009200a72200141336a2d00007172211a200141d2006a2d00002209200141126a2d0000220a712009200a72200141326a2d000071722119200141d1006a2d00002209200141116a2d0000220a712009200a72200141316a2d000071722118200141d0006a2d00002209200141106a2d0000220a712009200a72200141306a2d000071722117200141cf006a2d000022092001410f6a2d0000220a712009200a722001412f6a2d000071722116200141ce006a2d000022092001410e6a2d0000220a712009200a722001412e6a2d000071722115200141cd006a2d000022092001410d6a2d0000220a712009200a722001412d6a2d000071722114200141cc006a2d000022092001410c6a2d0000220a712009200a722001412c6a2d000071722113200141cb006a2d000022092001410b6a2d0000220a712009200a722001412b6a2d000071722112200141ca006a2d000022092001410a6a2d0000220a712009200a722001412a6a2d000071722111200141c9006a2d00002209200141096a2d0000220a712009200a72200141296a2d000071722110200141c8006a2d00002209200141086a2d0000220a712009200a72200141286a2d00007172210f200141c7006a2d00002209200141076a2d0000220a712009200a72200141276a2d00007172210e200141c6006a2d00002209200141066a2d0000220a712009200a72200141266a2d00007172210d200141c5006a2d00002209200141056a2d0000220a712009200a72200141256a2d00007172210c200141c4006a2d00002209200141046a2d0000220a712009200a72200141246a2d00007172210b200141c3006a2d00002209200141036a2d0000220a712009200a72200141236a2d00007172210a200141c2006a2d00002209200141026a2d00002227712009202772200141226a2d000071722109200141c1006a2d00002227200141016a2d00002228712027202872200141216a2d000071722127200141c0006a2d0000222820012d00002230712028203072200141206a2d000071722128200241800c460d01200341086a2002202d410574202c41096e41e0006c6b6a6a220141ff006a20263a0000200141fe006a20253a0000200141fd006a20243a0000200141fc006a20233a0000200141fb006a20223a0000200141fa006a20213a0000200141f9006a20203a0000200141f8006a201f3a0000200141f7006a201e3a0000200141f6006a201d3a0000200141f5006a201c3a0000200141f4006a201b3a0000200141f3006a201a3a0000200141f2006a20193a0000200141f1006a20183a0000200141f0006a20173a0000200141ef006a20163a0000200141ee006a20153a0000200141ed006a20143a0000200141ec006a20133a0000200141eb006a20123a0000200141ea006a20113a0000200141e9006a20103a0000200141e8006a200f3a0000200141e7006a200e3a0000200141e6006a200d3a0000200141e5006a200c3a0000200141e4006a200b3a0000200141e3006a200a3a0000200141e2006a20093a0000200141e1006a20273a0000200141e0006a20283a0000200241e0006a2102202d212c202e41016a222e4111490d000b0b41002101202b0d000b0b200020263a001f200020253a001e200020243a001d200020233a001c200020223a001b200020213a001a200020203a00192000201f3a00182000201e3a00172000201d3a00162000201c3a00152000201b3a00142000201a3a0013200020193a0012200020183a0011200020173a0010200020163a000f200020153a000e200020143a000d200020133a000c200020123a000b200020113a000a200020103a00092000200f3a00082000200e3a00072000200d3a00062000200c3a00052000200b3a00042000200a3a0003200020093a0002200020273a0001200020283a000020050d020c030b41012104410021050b20004200370000200041186a4200370000200041106a4200370000200041086a42003700002005450d010b200410230b200341b00d6a24000f0b101e000b41014101102a000b20304101102a000b202e4101102a000b7601017f230041c0006b220024002000411836020c200041c8b7c100360208200041346a4120360200200041246a41023602002000410136022c200042023702142000419083c5003602102000200041386a3602302000200041086a3602282000200041286a360220200041106a41a083c5001061000bfd0401137f02400240200128020022054100480d00200541ffffffff07460d002001200541016a360200200141046a2106200141086a28020021070c010b10e401000b410021050340024002400240024002400240024002400240024020050e020001010b2006280200220841086a210920082f0106220a410574210b417f21050240024002400340200b450d01200541016a2105417f4101200220094120109604220c4100481b4100200c1b220c450d03200b41606a210b200941206a2109200c4101460d000b20070d010c040b200a21052007450d030b2007417f6a2107200820054102746a41880b6a2106410021050c0a0b200841e8026a200541e0006c6a2205450d01200541306a210d200541346a280200210e4108210f41052110417f21114102211241ec032113412021144100211541012116416021170c080b200d2802002208200f6a210920082f0106220d201074210b417f21050240024002400340200b450d01200520166a210520112016200420092014109604220c2015481b2015200c1b220c450d03200b20176a210b200920146a2109200c2016460d000b200e0d010c030b200d2105200e450d020b200e20116a210e200820052012746a20136a210d410121050c090b200841e8026a220b2005410c6c6a2216450d0020162802002209450d01200b2005410c6c6a2802082205417f4c0d052005450d02200510262216450d062016200920051094041a0c030b20002001280210200220032004200141146a28020028020c1106000c030b410021160c010b410121160b2000200536020420002016360200200041086a20053602000b20012001280200417f6a3602000f0b101d000b20054101102a000b410121050c000b0b7601017f230041c0006b220024002000411036020c200041b8b7c100360208200041346a4121360200200041246a41023602002000410136022c200042023702142000419083c5003602102000200041386a3602302000200041086a3602282000200041286a360220200041106a41a083c5001061000be41d03027f027e097f230041b0036b2209240002400240024020012802242001280240220a2802b001470d00200041eebac40036020420004101360200200041086a4129360200200841046a2802000d010c020b200542002005290308220b200a41a0016a2903007d220c200c200b56200c5072220a1b37030802400240200a450d0020004197bbc40036020420004101360200200041086a41233602000c010b20024200410110d1021a200941d8016a41186a220d200241186a290000370300200941d8016a41106a220e200241106a290000370300200941d8016a41086a220f200241086a290000370300200920022900003703d801200941c0026a200941d8016a10d8014100211002400240024020092d00c00222114102460d00200941f8026a280200210a02402011450d00410021100c010b200a417f4c0d01200941f4026a2802002112200941f0026a280200211102400240200a450d00200a10262210450d0420102011200a1094041a20120d010c020b410121102012450d010b201110230b200941d8006a4200370300200941d0006a42808080808001370300200941c0006a41bcbbc4003602002009413c6a2001410c6a2212360200200941346a4200370200200941206a41106a41f098c400360200200941206a41086a200a360200200941f4006a200f290300370200200941fc006a200e29030037020020094184016a200d290300370200200942083703482009410036022c2009200a36022420092010360220200920092903d80137026c200920012802483602682009200141c0006a2902003703602009200141246a28020041016a3602440240024002400240024002400240024002400240024002402003200484500d00200941086a20054100200141cc006a200220032004200941206a10bc032009280208220a450d00200928020c21012000200a36020420004101360200200041086a2001360200024020092802202201450d002009280224450d00200110230b200941206a41186a280200210a200941306a2802002101200941206a41146a2802002202450d012002210520012100034020002802880b21002005417f6a22050d000b0340200120012f01064102746a41880b6a28020021012002417f6a22020d000c030b0b201228020022134100480d0a201341ffffffff07460d0a2001410c6a201341016a360200200141106a210a200141146a28020021110240024002400340200a280200220e41086a210d200e2f010622144105742110417f210a02400240024003402010450d01200a41016a210a417f41012002200d4120109604220f4100481b4100200f1b220f450d03201041606a2110200d41206a210d200f4101460d000b20110d010c040b2014210a2011450d030b2011417f6a2111200e200a4102746a41880b6a210a0c010b0b200e200a41e0006c6a41e8026a220a450d00200941c8026a2210200a41c5006a290000370300200941d0026a220d200a41cd006a290000370300200941d8026a220e200a41d5006a2900003703002009200a413d6a2900003703c002200a2d003c4101470d0020094199016a2010290300370000200941a1016a200d290300370000200941a9016a200e290300370000200920092903c00237009101200941013a009001201220133602000c010b20094190016a2001411c6a2802002002200141206a28020028021011040020092d00900121022001200128020c417f6a36020c2002450d010b200941b8016a41186a200941a9016a290000370300200941b8016a41106a200941a1016a290000370300200941b8016a41086a20094199016a29000037030020092009290091013703b801200941c0026a200941b8016a200141c8006a28020028020010c402024020092802c0024101470d00200020092902c40237020420004101360200024020092802202201450d002009280224450d00200110230b200941206a41186a280200210a200941306a2802002101200941206a41146a2802002202450d042002210520012100034020002802880b21002005417f6a22050d000b0340200120012f01064102746a41880b6a28020021012002417f6a22020d000c060b0b20094190026a41186a220a200941c0026a410472220241186a28020036020020094190026a41106a2210200241106a29020037030020094190026a41086a220d200241086a2902003703002009200229020037039002200941d8016a41106a200d290300370300200941d8016a41186a2010290300370300200941f8016a200a280200360200200941043602dc01200941a7c4c4003602d80120092009290390023703e001200141c4006a2802002102200a200141e4006a2900003703002010200141dc006a290000370300200d200141d4006a2900003703002009200129004c370390024200210c200941a0036a41086a220a4200370300200942003703a00341a298c300410d200941a0036a1000200941b0026a41086a200a290300370300200920092903a0033703b002410021100240200941b0026a411041a886c500410041001001417f460d00200942003703a003200941b0026a4110200941a0036a41084100100141016a41084d0d0b20092903a003210c0b200941e4026a20094190026a41086a220a290300370200200941ec026a200941a0026a290300370200200941f4026a200941a8026a290300370200200920033703c0022009200c3703d002200920043703c80220092009290390023702dc022009200941206a3602d802200a200841086a280200360200200920082902003703900220094180026a2002200941d8016a200941c0026a2006200720094190026a200510b7014101210d20092802800222024101460d054100210620024102470d062000200929028402370204200041013602000240200941f0016a280200450d00200941ec016a28020010230b024020092802202201450d002009280224450d00200110230b200941206a41186a2802002108200941306a2802002101200941206a41146a2802002202450d082002210520012100034020002802880b21002005417f6a22050d000b0340200120012f01064102746a41880b6a28020021012002417f6a22020d000c0a0b0b4101210d4100211041002106410121070c060b200121000b200941dc026a20012f0106360200200941c0026a41186a4100360200200941c0026a41146a20013602002009200a3602e002200941003602d002200942003703c802200920003602c402200941003602c002200941c0026a10d4010240200941d0006a2802002200450d00200941206a41286a2802002101200041e8006c210003400240200141dc006a280200450d00200141d8006a28020010230b024020012d00004105490d00200141286a280200450d00200141246a28020010230b200141e8006a2101200041987f6a22000d000b0b0240200941cc006a280200450d00200941c8006a28020010230b0240200941dc006a2802002201450d0020014190016c2100200941d4006a28020041206a210103402001102420014190016a2101200041f07e6a22000d000b0b200941d8006a280200450d0b200941d4006a2802001023200841046a2802000d0c0c0d0b200121000b200941dc026a20012f0106360200200941c0026a41186a4100360200200941c0026a41146a20013602002009200a3602e002200941003602d002200942003703c802200920003602c402200941003602c002200941c0026a10d4010240200941d0006a2802002200450d00200941206a41286a2802002101200041e8006c210003400240200141dc006a280200450d00200141d8006a28020010230b024020012d00004105490d00200141286a280200450d00200141246a28020010230b200141e8006a2101200041987f6a22000d000b0b0240200941cc006a280200450d00200941c8006a28020010230b0240200941dc006a2802002201450d0020014190016c2100200941d4006a28020041206a210103402001102420014190016a2101200041f07e6a22000d000b0b200941d8006a280200450d09200941d4006a2802001023200841046a2802000d0a0c0b0b2009418c026a280200211020094180026a41086a2802002106200928028402210d0b0240200941f0016a280200450d00200941ec016a28020010230b410021070b200941c0026a41086a220a200941346a290200370300200941106a41086a220e200941c0026a410c6a2802003602002009200929022c3703c002200920092902c402370310200941dc006a280200210f200941d8006a2802002111200941206a41346a2802002102200941d0006a2802002113200941cc006a2802002114200941206a41286a2802002105024020092802202215450d002009280224450d00201510230b200a200e280200360200200920092903103703c002200941206a41086a200a280200360200200920092903c0023703202012200941206a10ec0120092005201341e8006c6a36022c200920053602282009201436022420092005360220200141286a200941206a10a20220092002200f4190016c6a36022c200920023602282009201136022420092002360220200141346a200941206a10a1022000410c6a2010360200200041086a20063602002000200d360204200041003602002007450d08200841046a280200450d0820082802001023200941b0036a24000f0b200121000b200941dc026a20012f0106360200200941c0026a41186a4100360200200941c0026a41146a2001360200200920083602e002200941003602d002200942003703c802200920003602c402200941003602c002200941c0026a10d4010240200941d0006a2802002200450d00200941206a41286a2802002101200041e8006c210003400240200141dc006a280200450d00200141d8006a28020010230b024020012d00004105490d00200141286a280200450d00200141246a28020010230b200141e8006a2101200041987f6a22000d000b0b0240200941cc006a280200450d00200941c8006a28020010230b0240200941dc006a2802002201450d0020014190016c2100200941d4006a28020041206a210103402001102420014190016a2101200041f07e6a22000d000b0b200941d8006a280200450d06200941d4006a2802001023200941b0036a24000f0b41d4aac10041331021000b10e401000b101d000b200a4101102a000b200841046a280200450d010b200828020010230b200941b0036a24000bde0202097f027e230041106b220324000240200128020022044100480d00200441ffffffff07460d002001200441016a2205360200200141046a2104200141086a28020021060240024003402004280200220741086a210820072f01062209410574210a417f21040240024002400340200a450d01200441016a2104417f4101200220084120109604220b4100481b4100200b1b220b450d03200a41606a210a200841206a2108200b4101460d000b20060d010c040b200921042006450d030b2006417f6a2106200720044102746a41880b6a21040c010b0b200741e8026a200441e0006c6a2204450d002004280200450d00200441106a290300210c200441086a290300210d0c010b200320012802102002200141146a28020028021c110400200341086a290300210c200128020021052003290300210d0b20012005417f6a3602002000200c3703082000200d370300200341106a24000f0b10e401000ba90301097f230041206b220324000240200128020022044100480d00200441ffffffff07460d002001200441016a2205360200200141046a2104200141086a28020021060240024003402004280200220741086a210820072f01062209410574210a417f21040240024002400340200a450d01200441016a2104417f4101200220084120109604220b4100481b4100200b1b220b450d03200a41606a210a200841206a2108200b4101460d000b20060d010c040b200921042006450d030b2006417f6a2106200720044102746a41880b6a21040c010b0b2007200441e0006c6a41e8026a2204450d00200341086a220a200441c5006a290000370300200341106a2208200441cd006a290000370300200341186a2207200441d5006a29000037030020032004413d6a29000037030020042d003c4101470d0020002003290300370001200041013a0000200041096a200a290300370000200041116a2008290300370000200041196a20072903003700000c010b200020012802102002200141146a280200280210110400200128020021050b20012005417f6a360200200341206a24000f0b10e401000ba40201087f0240200028020022024100480d00200241ffffffff07460d002000200241016a2203360200200041046a2102200041086a2802002104024003402002280200220541086a210620052f010622074105742108417f210202400240024003402008450d01200241016a2102417f410120012006412010960422094100481b410020091b2209450d03200841606a2108200641206a210620094101460d000b20040d010c040b200721022004450d030b2004417f6a2104200520024102746a41880b6a21020c010b0b2005200241e0006c6a41e8026a2202450d002002413c6a2d0000210220002003417f6a36020020024101460f0b20002802102001200041146a280200280218110300210220002000280200417f6a36020020020f0b10e401000bf80202097f037e230041206b220324000240200128020022044100480d00200441ffffffff07460d002001200441016a2205360200200141046a2104200141086a28020021060240024003402004280200220741086a210820072f01062209410574210a417f21040240024002400340200a450d01200441016a2104417f4101200220084120109604220b4100481b4100200b1b220b450d03200a41606a210a200841206a2108200b4101460d000b20060d010c040b200921042006450d030b2006417f6a2106200720044102746a41880b6a21040c010b0b200741e8026a200441e0006c6a2204450d00200441186a290300220ca7450d00200441286a290300210d200441206a290300210e0c010b200341086a20012802102002200141146a280200280214110400200341186a290300210d200128020021052003290310210e2003290308210c0b20012005417f6a360200200041106a200d3703002000200e3703082000200c370300200341206a24000f0b10e401000bff1207057f017e1a7f047e017f017e097f230041b00d6b22022400024020002802000d002000417f36020020012802082103200128020021040240024020012802042205450d002005210620042101034020012802880b21012006417f6a22060d000b0340200420042f01064102746a41880b6a28020021042005417f6a22050d000c020b0b200421010b2002411c6a20042f0106360200200241186a4100360200200241146a20043602002002200336022020024100360210200242003703082002200136020420024100360200200241b0026a200210b0010240024020022903d00222074202510d002000410c6a2108200041046a210920024190016a41146a210a20024190016a41206a2105200241b0026a41047221042002418d036a210b200241b0026a413d6a210c200241ad036a210d200241f8026a210e200241f0026a210f200241b0026a41306a2110200241b0026a41286a21112002418c036a2112200241e8026a211320024180036a211420024184036a211520024188036a2116200241b0026a413c6a2117200241e4026a2118200241c8016a411c6a21190340200241c8006a41086a2203200241b0026a41086a221a290300370300200241c8006a41106a221b200241b0026a41106a221c290300370300200241c8006a41186a221d200241b0026a41186a221e290300370300200241286a41086a221f200b41086a290000370300200241286a41106a2220200b41106a290000370300200241286a41186a2221200b41186a290000370300200220022903b0023703482002200b290000370328200e2903002122200f2903002123201029030021242011290300212520122d0000212620132903002127201428020021012015280200210620162802002128200241246a41026a2229200d41026a2d00003a00002002200d2f00003b0124200241f0006a41186a222a2021290300370300200241f0006a41106a222b2020290300370300200241f0006a41086a222c201f290300370300200241ec006a41026a222d20292d00003a000020022002290328370370200220022f01243b016c20024190016a41186a2220201d29030037030020024190016a41106a221d201b29030037030020024190016a41086a221f20032903003703002002200229034837039001024002402009280200221b41f098c400460d00200041086a280200212e0c010b41880b1026221b450d034100212e201b41003b0106201b4100360200201b41086a200241b0026a41800b1094041a200041086a41003602002009201b3602000b024002400340201b2f0106222f4105742130417f212141002103024002400240034020302003460d01202141016a2121417f410120024190016a201b20036a41086a412010960422294100481b410020291b2229450d05200341206a210320294101460d000b202e0d010c020b202f2121202e450d010b202e417f6a212e201b20214102746a41880b6a280200211b0c010b0b200241c8016a41186a22032020290300370300200241c8016a41106a2220201d290300370300200241c8016a41086a2229201f29030037030020022002290390013703c801201d200836020020024190016a410c6a2021360200201f2009360200200a20022903c801370200200a41086a2029290300370200200a41106a2020290300370200200a41186a20032903003702002002201b36029401200241003602900120112022370300200241b0026a41206a2023370300201c2024370300201a2025370300201720263a0000201320283602002018200636020020102001360200201e2027370300200c2002290370370000200c41086a202c290300370000200c41106a202b290300370000200c41186a202a290300370000200b20022f016c3b0000200b41026a202d2d00003a0000200220073703b00220024190016a200241b0026a10b4011a0c010b201b41e8026a202141e0006c6a22212021290308202520075022031b37030820212021290300200720031b370300202141106a221b201b290300202420031b3703002020202a290300370300201d202b290300370300201f202c290300370300200220022903703703900120212d003c211b201e202141d5006a290000370300201c202141cd006a290000370300201a202141c5006a29000037030020022021413d6a22032900003703b00202400240202641ff01714101470d00200241c8016a41186a2020290300370300200241c8016a41106a201d290300370300200241c8016a41086a201f29030037030020022002290390013703c8014101211b0c010b200241c8016a41186a201e290300370300200241c8016a41106a201c290300370300200241c8016a41086a201a290300370300200220022903b0023703c8010b2021413c6a201b3a0000200341186a200241c8016a41186a2229290300370000200341106a200241c8016a41106a2230290300370000200341086a200241c8016a41086a222e290300370000200320022903c801370000202141286a2203202220032903002027a722031b37030020212023202129032020031b37032020212027202129031820031b370318024002402006450d002006211b20012103034020032802ec032103201b417f6a221b0d000b0340200120012f01064102746a41ec036a28020021012006417f6a22060d000c020b0b200121030b20012f01062106200241c8016a41206a20283602002019200636020020294100360200200241c8016a41146a200136020020304100360200202e4200370300200220033602cc01200241003602c801200241b0026a200241c8016a10af01024020022802b0024101470d00202141306a211b034020024190016a41286a200441286a2802003602002005200441206a2902003703002020200441186a2201290200370300201d200441106a2206290200370300201f200441086a2203290200370300200220042902003703900120024180026a41186a200129000037030020024180026a41106a200629000037030020024180026a41086a20032900003703002002200429000037038002200241a0026a41086a200541086a280200360200200220052902003703a002200241f0016a201b20024180026a200241a0026a10b601024020022802f001450d0020022802f4012201450d00200241f0016a41086a280200450d00200110230b200241b0026a200241c8016a10af0120022802b0024101460d000b0b200241c8016a10b5010b200241b0026a200210b001200241b0026a41206a29030022074202520d000b0b200210d4012000200028020041016a360200200241b00d6a24000f0b41880b4108102a000b10e601000bd30102027f027e200028022021020240024002400240410410262203450d00200320023600002000280224210220034104410810272203450d0120032002360004200041086a29030021042000290300210520034108411810272203450d0220032005370008200341106a2004370000200041186a29030021042000290310210520034118413010272200450d0320002005370018200041206a200437000020012802002001280204200041281004200010230f0b41044101102a000b41084101102a000b41184101102a000b41304101102a000b13002000410a360204200041bcbec1003602000ba70301047f230041c0006b2202240002400240411610262203450d002003410e6a41002900e1b641370000200341086a41002900dbb641370000200341002900d3b64137000020034116413610272203450d01200320012900003700162003412e6a200141186a290000370000200341266a200141106a2900003700002003411e6a200141086a290000370000200241206a41186a22014200370300200241206a41106a22044200370300200241206a41086a220542003703002002420037032020034136200241206a1002200241186a2001290300370300200241106a2004290300370300200241086a2005290300370300200220022903203703000240024002402002412041a886c500410041001001417f460d002002410036022020024120200241206a41044100100141016a4105490d02200228022021012002410036022020024120200241206a41044104100141016a4105490d02200041086a200228022036020020002001360204200041013602000c010b200041003602000b20031023200241c0006a24000f0b41d4aac10041331021000b41164101102a000b41364101102a000b130020004107360204200041e5e4c1003602000b130020004117360204200041ece4c1003602000b3201017f0240410410262202450d0020004284808080c00037020420002002360200200241003600000f0b41044101102a000b3201017f0240410410262202450d0020004284808080c00037020420002002360200200241183600000f0b41044101102a000b3201017f0240410810262202450d0020004288808080800137020420002002360200200242053700000f0b41084101102a000b3301017f0240410810262202450d0020004288808080800137020420002002360200200242e8073700000f0b41084101102a000b3201017f0240410410262202450d0020004284808080c00037020420002002360200200241013600000f0b41044101102a000b3201017f0240410410262202450d0020004284808080c00037020420002002360200200241023600000f0b41044101102a000b3901017f0240411010262202450d002002420037000820024201370000200042908080808002370204200020023602000f0b41104101102a000b3901017f0240411010262202450d002002420037000820024200370000200042908080808002370204200020023602000f0b41104101102a000b3901017f0240411010262202450d002002420037000820024209370000200042908080808002370204200020023602000f0b41104101102a000b130020004102360204200041b88ec2003602000bbe0904027f017e037f077e230041f0006b2202240002400240024002400240411010262203450d00200341086a41002900dd9d42370000200341002900d59d4237000020034110413010272203450d0120032001290000370010200341286a200141186a290000370000200341206a200141106a290000370000200341186a200141086a29000037000042002104200241d0006a41186a22054200370300200241d0006a41106a22064200370300200241d0006a41086a220742003703002002420037035020034130200241d0006a1002200241306a41186a2005290300370300200241306a41106a2006290300370300200241306a41086a200729030037030020022002290350370330024002400240024002400240200241306a412041a886c500410041001001417f460d002002420037035820024200370350200241306a4120200241d0006a4110410010012205417f460d052005410f4d0d05200241d8006a2903002108200229035021092002420037035820024200370350200241306a4120200241d0006a4110411010012205417f460d052005410f4d0d05200241d0006a41086a290300210a2002290350210b20031023411410262203450d09200341106a41002800f9b641360000200341086a41002900f1b641370000200341002900e9b64137000020034114413410272203450d0a200320012900003700142003412c6a200141186a290000370000200341246a200141106a2900003700002003411c6a200141086a29000037000042002104200241d0006a41186a22054200370300200241d0006a41106a22064200370300200241d0006a41086a220142003703002002420037035020034134200241d0006a1002200241306a41186a2005290300370300200241306a41106a2006290300370300200241306a41086a2205200129030037030020022002290350370330200241306a412041a886c500410041001001417f460d012002420037035820024200370350200241306a4120200241d0006a4110410010012206417f460d082006410f4d0d08200241d8006a290300210c2002290350210d0c020b200310234200210c0c020b4200210d4200210c0b20031023200142003703002002420037035041af98c300410d200241d0006a100020052001290300370300200220022903503703300240200241306a411041a886c500410041001001417f460d0020024200370350200241306a4110200241d0006a41084100100141016a41084d0d02200229035021040b4200210e200242004200200b4200109804200241106a200a420020044200109804200241206a20044200200b42001098044200210402404200420052200a42005271200229030842005272200229031842005272200241286a290300220b200229030020022903107c7c220a200b54720d002008200a2002290320220e200954200a200854200a2008511b22011b200a7d2009200e20011b220a200e54ad7d2104200a200e7d210e0b2004200c200d200e56200c200456200c2004511b22011b210c200e200d20011b21040b200020043703002000200c370308200241f0006a24000f0b41d4aac10041331021000b41d4aac10041331021000b41104101102a000b41304101102a000b41d4aac10041331021000b41144101102a000b41344101102a000b130020004108360204200041e59dc2003602000baf0c05017f017e017f017e067f230041b0016b2203240042002104200341206a41086a22054200370300200342003703204182b6c100411b200341206a100020034190016a41086a20052903003703002003200329032037039001024002400240024020034190016a411041a886c500410041001001417f460d00200342003703282003420037032020034190016a4110200341206a4110410010012205417f460d022005410f4d0d02200341286a29030021062003290320210441182107411810262205450d010c030b42002106411821074118102622050d020b20074101102a000b41d4aac10041331021000b200541106a410029008db741370000200541086a4100290085b741370000200541002900fdb64137000002400240024002400240024002400240024020052007413810272205450d0020052000290000370018200541306a200041186a290000370000200541286a200041106a290000370000200541206a200041086a290000370000200341206a41186a22074200370300200341206a41106a22084200370300200341206a41086a220942003703002003420037032020054138200341206a100220034190016a41186a200729030037030020034190016a41106a200829030037030020034190016a41086a20092903003703002003200329032037039001200320013703202003200237032820034190016a4120200341206a41101004200510232004200158200620025820062002511b0d07411810262205450d02200541106a410029008db741370000200541086a4100290085b741370000200541002900fdb64137000020054118413810272205450d0320052000290000370018200541306a200041186a290000370000200541286a200041106a290000370000200541206a200041086a290000370000200341086a2005413810e101200341086a41106a290300210220032802082107200329031021012005102302402001200284500d002007450d0020032001370320200320023703282003200341206a3602900120034190016a10de010b411410262205450d04200541106a41002800f9b641360000200541086a41002900f1b641370000200541002900e9b64137000020054114413410272205450d05200520002900003700142005412c6a200041186a290000370000200541246a200041106a2900003700002005411c6a200041086a290000370000200341206a41186a22074200370300200341206a41106a22084200370300200341206a41086a220942003703002003420037032020054134200341206a100220034190016a41186a200729030037030020034190016a41106a200829030037030020034190016a41086a20092903003703002003200329032037039001024020034190016a412041a886c500410041001001417f460d00200342003703282003420037032020034190016a4120200341206a4110410010012207417f460d022007410f4d0d02200341286a29030021022003290320210141002107200510232001200284504101710d090c070b41012107200510234100410171450d060c080b41384101102a000b41d4aac10041331021000b41184101102a000b41384101102a000b41144101102a000b41344101102a000b20070d010b200341b0016a24000f0b02400240411310262205450d002005410f6a41002800a99943360000200541086a41002900a299433700002005410029009a994337000020054113413310272205450d01200520002900003700132005412b6a200041186a2208290000370000200541236a200041106a22092900003700002005411b6a200041086a220a290000370000200341206a41186a220b4200370300200341206a41106a220c4200370300200341206a41086a220742003703002003420037032020054133200341206a100220034190016a41186a200b29030037030020034190016a41106a200c29030037030020034190016a41086a2007290300370300200320032903203703900120034190016a4120100320051023200741013a0000200341296a2000290000370000200341316a200a290000370000200341396a2009290000370000200341c1006a2008290000370000200341023a002041a886c5004100200341206a102c200341b0016a24000f0b41134101102a000b41334101102a000b13002000410a360204200041f09dc2003602000bc60807057f017e087f047e017f017e017f230041f0006b220224000240024002400240024002400240024002400240410e10262203450d00200341066a41002900b0b741370000200341002900aab7413700002003410e412e10272204450d012004200129000037000e200441266a200141186a2900003700002004411e6a200141106a290000370000200441166a200141086a290000370000200241386a41186a22014200370300200241386a41106a22034200370300200241386a41086a22054200370300200242003703382004412e200241386a1002200241086a41186a2001290300370300200241086a41106a2003290300370300200241086a41086a2005290300370300200220022903383703080240024002400240200241086a412041a886c500410041001001417f460d002002422037022c2002200241086a3602282002200241286a104a2002280200450d0b20022802042206ad42287e2207422088a70d032007a72201417f4c0d032001450d01200110262208450d062006450d020c070b20004100360208200042083702000c080b4108210820060d050b4100210e420021072008450d080c050b101d000b410e4101102a000b412e4101102a000b20014108102a000b200241286a41086a22032802002109200228022c21052002280228210a200241ec006a210b420021074100210c4100210d410021012006210e03402002420037033820034100200a2005200241386a410820091001220f200f417f461b220f4108200f4108491b20096a2209360200200f41074d0d0320022903382110200242003703402002420037033820034100200a2005200241386a411020091001220f200f417f461b220f4110200f4110491b20096a2209360200200f410f4d0d03200241386a41086a2903002111200229033821122002420037033820034100200a2005200241386a410820091001220f200f417f461b220f4108200f4108491b20096a2209360200200f41074d0d0320022903382113200241003a003820032009200a2005200241386a41012009100141016a41014b220f6a2209360200200f450d03200141016a210f20022d003821142002200b280000360063200220022800693602602002200228006336005b2002200228026036025802402001200e470d00200c200f200f200c491b220ead42287e2215422088a70d062015a722164100480d0602402001450d002008200d2016102722080d010c080b201610262208450d070b2008200d6a220141206a20143a00002001201137030820012012370300200141186a2010370300200141106a2013370300200141246a200228005b360000200141216a200228025836000020074280808080107c2107200c41026a210c200d41286a210d200f2101200f2006490d000b2008450d030b20002007200ead84370204200020083602000b20041023200241f0006a24000f0b200e450d00200810230b41d4aac10041331021000b101e000b20164108102a000b850701087f230041900c6b22042400024002400240024020002802000d002000417f360200200441d8006a41186a200141186a290000370300200441d8006a41106a200141106a290000370300200441d8006a41086a200141086a29000037030020042001290000370358024002402000280204220541f098c400460d00200041086a28020021060c010b41880b10262205450d0241002106200541003b010620054100360200200541086a20044190016a41800b1094041a200041086a4100360200200041046a20053602000b200041046a210702400240034020052f01062209410574210a41002101417f21080240024002400340200a2001460d01200841016a2108417f4101200441d8006a200520016a41086a4120109604220b4100481b4100200b1b220b450d05200141206a2101200b4101460d000b20060d010c020b200921082006450d010b2006417f6a2106200520084102746a41880b6a28020021050c010b0b200441186a200441d8006a41186a290300370300200441106a200441d8006a41106a290300370300200441086a200441d8006a41086a290300370300200420042903583703002000410c6a21014100210641000d010c040b2000410c6a21014101450d030b200441a8016a4200370300200441a4016a41f098c400360200200441003602b001200441003602a0012004420037039801200441f098c4003602940120044100360290012005200841e0006c6a41e8026a210120044190016a10b5010c030b10e601000b41880b4108102a000b200441f4006a200441086a290300370200200441fc006a200441106a29030037020020044184016a200441186a2903003702002004200136026820042008360264200420073602602004200536025c200420063602582004200429030037026c200441c4016a4200370200200441b0016a2004290348370300200441b8016a200441c8006a41086a290300370300200441cd016a2004290025370000200441d5016a200441256a41086a290000370000200441dd016a200441256a41106a290000370000200441e5016a200441256a41186a290000370000200441ec016a200441c4006a280000360000200442003703a8012004420037039001200441f098c4003602c001200441003a00cc01200441d8006a20044190016a10b40121010b200141106a200337030020012002370308200142013703002000200028020041016a360200200441900c6a24000b840402057f027e230041c0006b2204240002400240411410262205450d00200541106a41002800f9b641360000200541086a41002900f1b641370000200541002900e9b64137000020054114413410272205450d01200520012900003700142005412c6a200141186a290000370000200541246a200141106a2900003700002005411c6a200141086a290000370000200441206a41186a22064200370300200441206a41106a22074200370300200441206a41086a220842003703002004420037032020054134200441206a1002200441186a2006290300370300200441106a2007290300370300200441086a2008290300370300200420042903203703000240024002402004412041a886c500410041001001417f460d00200442003703282004420037032020044120200441206a4110410010012206417f460d022006410f4d0d02200441286a29030021092004290320210a0c010b4200210a420021090b20051023200441206a2001200a20027c2202200920037c2002200a54ad7c10dc01200441106a200441206a41106a290300220a370300200420042903282202370308200420042903202203370300024020034200510d002004200441086a360220200441206a10de01420021024200210a0b200020023703002000200a370308200441c0006a24000f0b41d4aac10041331021000b41144101102a000b41344101102a000bff0304027f017e027f017e230041d0006b220524000240024002400240200241ff017122064102460d0020064104470d02200541106a200110fc012005290310200356200541186a290300220720045620072004511b0d010c020b2005200110fc012005290300200358200541086a290300220720045820072004511b0d010b41bcb4c1002101412621060c010b200541206a20011080020240024002400240024020052802282201450d0042002107200541c0006a41086a220642003703002005420037034041af98c300410d200541c0006a1000200541306a41086a2006290300370300200520052903403703300240200541306a411041a886c500410041001001417f460d0020054200370340200541306a4110200541c0006a41084100100141016a41084d0d03200529034021070b200141286c210620052802242108200528022022092101034002402007200141106a2903005a0d002001290300200358200141086a290300220a200458200a2004511b0d00200141206a2d000020027141ff0171200241ff0171460d030b200141286a2101200641586a22060d000b410021012008450d040c030b02402005280224450d00200528022010230b410021010c040b41e2b4c100210120080d010c020b41d4aac10041331021000b200910230b413121060b2000200636020420002001360200200541d0006a24000bd30704027f017e037f057e230041c0006b2204240002400240024002400240411410262205450d00200541106a41002800f9b641360000200541086a41002900f1b641370000200541002900e9b64137000020054114413410272205450d01200520012900003700142005412c6a200141186a290000370000200541246a200141106a2900003700002005411c6a200141086a29000037000042002106200441206a41186a22074200370300200441206a41106a22084200370300200441206a41086a220942003703002004420037032020054134200441206a1002200441186a2007290300370300200441106a2008290300370300200441086a2009290300370300200420042903203703000240024002402004412041a886c500410041001001417f460d00200442003703282004420037032020044120200441206a4110410010012207417f460d022007410f4d0d02200441286a290300210a2004290320210b0c010b4200210b4200210a0b200510232001200b2002200b200b200256200a200356200a2003511b22051b220c7d200a2003200a20051b220d7d200b200c54ad7d10df0102400240024002402002200c7d220b2003200d7d2002200c54ad7d220e84500d00411810262205450d08200541106a410029008db741370000200541086a4100290085b741370000200541002900fdb64137000020054118413810272205450d0920052001290000370018200541306a200141186a290000370000200541286a200141106a290000370000200541206a200141086a29000037000042002102200441206a41186a22074200370300200441206a41106a22084200370300200441206a41086a220942003703002004420037032020054138200441206a1002200441186a2007290300370300200441106a2008290300370300200441086a2009290300370300200420042903203703002004412041a886c500410041001001417f460d01200442003703282004420037032020044120200441206a4110410010012207417f460d072007410f4d0d07200441286a2903002103200429032021020c020b4200210e0c020b420021030b2005102320012002200b20022002200b562003200e562003200e511b22051b220a7d2003200e200320051b22067d2002200a54ad7d10fe01200e20067d200b200a54ad7d210e2006200d7c200a200c7c2202200a54ad7c2103200b200a7d21060b2000200637031020002002370300200041186a200e37030020002003370308200441c0006a24000f0b41d4aac10041331021000b41144101102a000b41344101102a000b41d4aac10041331021000b41184101102a000b41384101102a000b8b0604027f017e037f027e230041d0006b220524000240024002400240411410262206450d00200641106a41002800f9b641360000200641086a41002900f1b641370000200641002900e9b64137000020064114413410272206450d01200620012900003700142006412c6a200141186a290000370000200641246a200141106a2900003700002006411c6a200141086a29000037000042002107200541306a41186a22084200370300200541306a41106a22094200370300200541306a41086a220a42003703002005420037033020064134200541306a1002200541106a41186a2008290300370300200541106a41106a2009290300370300200541106a41086a200a29030037030020052005290330370310024002400240200541106a412041a886c500410041001001417f460d002005420037033820054200370330200541106a4120200541306a4110410010012208417f460d022008410f4d0d02200541386a290300210b200529033021070c010b4200210b0b20061023024002400240200720027d220c200756200b20037d2007200254ad7d2207200b562007200b511b450d00200041b5b5c100360204200041086a411d3602000c010b200541306a41086a22064200370300200542003703304182b6c100411b200541306a1000200541106a41086a2006290300370300200520052903303703100240200541106a411041a886c500410041001001417f460d002005420037033820054200370330200541106a4110200541306a4110410010012206417f460d062006410f4d0d06200c20052903305a2007200541306a41086a290300220b5a2007200b511b0d00200041d2b5c100360204200041086a411a3602000c010b200541086a20012004200c200710830220052802082206450d01200528020c210120002006360204200041086a20013602000b410121060c050b2001200c200710df01200041106a2003370300200041086a2002370300410021060c040b41d4aac10041331021000b41144101102a000b41344101102a000b41d4aac10041331021000b20002006360200200541d0006a24000bfc0304017f017e037f037e230041c0006b2202240042002103200241186a41086a2204420037030020024200370318419db6c100411b200241186a1000200241306a41086a22052004290300370300200220022903183703300240024002400240200241306a411041a886c500410041001001417f460d002002420037032020024200370318200241306a4110200241186a4110410010012206417f460d022006410f4d0d02200241206a2903002107200229031821080c010b42002108420021070b200442003703002002420037031841b8b6c100411b200241186a1000200520042903003703002002200229031837033002400240200241306a411041a886c500410041001001417f460d002002420037032020024200370318200241306a4110200241186a4110410010012204417f460d032004410f4d0d03200241206a2903002109200229031821030c010b420021090b200241086a200320092001ad4200109804200241186a20002002290308220320087c2208200241106a29030020077c2008200354ad7c4101108502024020022802184101470d00200228021c2104200241c0006a240020040f0b200229032021032002200241286a290300370320200220033703182002200241186a360230200241306a10de01200241c0006a240041000f0b41d4aac10041331021000b41d4aac10041331021000ba10802097f027e230041d0006b2202240002400240410e10262203450d00200341066a41002900b0b741370000200341002900aab7413700002003410e412e10272204450d012004200029000037000e200441266a200041186a2900003700002004411e6a200041106a290000370000200441166a200041086a290000370000200241286a41186a22004200370300200241286a41106a22034200370300200241286a41086a22054200370300200242003703282004412e200241286a1002200241086a41186a2000290300370300200241086a41106a2003290300370300200241086a41086a20052903003703002002200229032837030820024100360230200242013703282001280200210620022001280208220036024c200241cc006a200241286a104102400240024002400240024002402000450d00200041286c210720052802002108200228022c210003400240024002400240200020086b41084f0d00200841086a22092008490d0720004101742203200920092003491b220a4100480d072000450d0120022802282000200a102722030d020c080b200841086a2109200228022821030c020b200a10262203450d060b2002200a36022c20022003360228200a21000b20052009360200200320086a200641186a290000370000200641086a290300210b2006290300210c0240024002400240200020096b41104f0d00200941106a22082009490d072000410174220a20082008200a491b220a4100480d072000450d0120032000200a102722030d020c090b200941106a21080c020b200a10262203450d070b2002200a36022c20022003360228200a21000b200320096a2209200b3700082009200c37000020052008360200200641106a290300210b0240200020086b41074b0d00200841086a22092008490d042000410174220a20092009200a491b22094100480d04024002402000450d00200320002009102722030d010c090b200910262203450d080b2002200936022c200220033602280b2005200841086a360200200320086a200b3700000240024002400240200228022c220020052802002203470d00200341016a22002003490d0720034101742208200020002008491b22004100480d072003450d01200228022820032000102722090d020c0b0b200228022821090c020b200010262209450d090b2002200036022c200220093602280b2005200341016a2208360200200920036a200641206a2d00003a0000200641286a2106200741586a22070d000c020b0b20052802002108200228022c2100200228022821090b200241086a412020092008100402402000450d00200910230b200410230240200141046a280200450d00200128020010230b200241d0006a24000f0b101e000b200a4101102a000b200a4101102a000b20094101102a000b20004101102a000b410e4101102a000b412e4101102a000b898b010d027f027e067f017e0c7f017e017f037e0f7f027e347f027e347f230041a0026b2201240020014180026a41086a2202420037030020014200370380024184b3c200411420014180026a1000200141e0016a41086a200229030037030020012001290380023703e001024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200141e0016a411041a886c500410041001001417f460d0020014200370370200141e0016a4110200141f0006a41084100100141016a41084d0d02200129037022034200510d044200210420002003824200520d130c010b42002104200042e807824200520d120b20014180026a41086a22022004370300200120043703800241b0b3c200411420014180026a1000200141e0016a41086a200229030037030020012001290380023703e001200141e0016a411041a886c500410041001001417f460d1120014100360270200141e0016a4110200141f0006a41044100100141016a41044d0d0120012802702202450d114108210520014180026a41086a2206420037030020014200370380024195b7c100411520014180026a1000200141e0016a41086a200629030037030020012001290380023703e0014100210602400240200141e0016a411041a886c500410041001001417f460d0020014210370284022001200141e0016a36028002200141f0006a20014180026a10890220012802702205450d07200141f8006a2802002106200128027421070c010b410021070b4200210320014180026a41086a22084200370300200142003703800241c4b3c200411420014180026a1000200141e0016a41086a2209200829030037030020012001290380023703e0010240200141e0016a411041a886c500410041001001417f460d002001200141e0016a3602800220014110360284022001420037037020014100200141e0016a4110200141f0006a41084100100122082008417f461b2208410820084108491b220936028802200841074d0d05200129037021032001410036027020014188026a4100200141e0016a4110200141f0006a41042009100122082008417f461b22084104200841044922081b20096a36020020080d0520012802702108200141f0006a20014180026a10282001280270220a450d0520082001290274220b422088a76b20066a21090240200ba7450d00200a10230b20092002490d080c070b20084200370300200142003703800241af98c300410d20014180026a10002009200829030037030020012001290380023703e0010240200141e0016a411041a886c500410041001001417f460d0020014200370370200141e0016a4110200141f0006a41084100100141016a41084d0d04200129037021030b41002108200620024f0d060c070b41d4aac10041331021000b41d4aac10041331021000b4198b3c200104f000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b0240200820024f0d00200820026b220220066a220820024f0d052005200841286c6a29032021030c010b20014180026a41086a22024200370300200142003703800241d8b3c200411420014180026a1000200141e0016a41086a200229030037030020012001290380023703e0010240200141e0016a411041a886c500410041001001417f460d0020014200370370200141e0016a4110200141f0006a41084100100141016a41084d0d02200129037020037c21030c010b420520037c21030b20014180026a41086a2202420037030020014200370380024184b3c200411420014180026a1000200141e0016a41086a200229030037030020012001290380023703e00102400240024002400240200141e0016a411041a886c500410041001001417f460d0020014200370370200141e0016a4110200141f0006a41084100100141016a41084d0d022001290370220b4200520d0141fcb3c200104f000b42e807210b0b2003200b7c427f7c22032003200b827d210302402007450d00200510230b20032000520d0c4108210c20014180026a41086a2202420037030020014200370380024195b7c100411520014180026a1000200141e0016a41086a200229030037030020012001290380023703e0014100210d02400240200141e0016a411041a886c500410041001001417f460d0020014210370284022001200141e0016a36028002200141f0006a20014180026a1089022001280270220c450d07200141f8006a280200210d2001280274210e0c010b4100210e0b20014180026a41086a22024200370300200142003703800241b0b3c200411420014180026a1000200141e0016a41086a200229030037030020012001290380023703e0014100210f0240200141e0016a411041a886c500410041001001417f460d0020014100360270200141e0016a4110200141f0006a41044100100141016a41044d0d032001280270210f0b4200210320014180026a41086a22024200370300200142003703800241af98c300410d20014180026a1000200141e0016a41086a200229030037030020012001290380023703e0010240200141e0016a411041a886c500410041001001417f460d0020014200370370200141e0016a4110200141f0006a41084100100141016a41084d0d02200129037021030b02400240200d41286c2202450d00200c41206a2903002003580d010b4101211041002111410021120c090b200141e0016a41186a2206200c41186a290300370300200141e0016a41106a2208200c41106a290300370300200141e0016a41086a2205200c41086a2903003703002001200c2903003703e001412010262210450d07201020012903e001370000201041186a2006290300370000201041106a2008290300370000201041086a200529030037000002400240200c20026a200c41286a2202460d00200d41286c41586a21054120210841012106410121110340200241206a2903002003560d02200141e0016a41186a2207200241186a290300370300200141e0016a41106a2209200241106a290300370300200141e0016a41086a220a200241086a290300370300200120022903003703e00102400240024020112006470d00200641016a22132006490d2020064101742212201320132012491b2212ad420586220b422088a70d20200ba722134100480d202006450d01201020064105742013102722100d020c0a0b200621120c010b201310262210450d080b200241286a2102201020086a220620012903e001370000200641186a2007290300370000200641106a2009290300370000200641086a200a290300370000200841206a2108201141016a211120122106200541586a22050d000c0b0b0b4101211141012112200f200d41016b22064b0d0a0c0b0b20062112200f200d20116b22064b0d090c0a0b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b20134101102a000b41d4aac10041331021000b41ecb3c200200820061029000b41204101102a000b200f200d20116b22064d0d010b20014180026a41086a2202420037030020014200370380024194b4c200411c20014180026a1000200141e0016a41086a200229030037030020012001290380023703e00102400240200141e0016a411041a886c500410041001001417f460d0020014200370370200141e0016a4110200141f0006a41084100100141016a41084d0d072001290370210b0c010b42e807210b0b20014180026a41086a22024200370300200142003703800241c4b3c200411420014180026a1000200141e0016a41086a200229030037030020012001290380023703e0012001410036027820014201370370410810262202450d09200142888080808001370274200120023602702002200b20037c37000020024108411010272202450d0a20014290808080c0013702742002200f20066b221436000820012002360270200120113602800220014180026a200141f0006a1041024002402011450d00201141057421094100200141f0006a41086a28020022066b21052001280270210a200128027421072010210203400240200720056a411f4b0d00200641206a22082006490d1420074101742213200820082013491b22084100480d14024002402007450d00200a200720081027220a0d010c090b20081026220a450d080b200821070b200a20066a22082002290000370000200841186a200241186a290000370000200841106a200241106a290000370000200841086a200241086a290000370000200541606a2105200641206a2106200241206a2102200941606a22090d000b200141f8006a2006360200200120073602742001200a3602700c010b200141f8006a2802002106200128027421072001280270210a0b200141e0016a4110200a2006100402402007450d00200a10230b02402012450d00201010230b20014180026a41086a22024200370300200142003703800241b0b4c200411220014180026a1000200141e0016a41086a200229030037030020012001290380023703e00102400240200141e0016a411041a886c500410041001001417f460d0020014100360270200141e0016a4110200141f0006a41044100100141016a41044d0d0a200128027021060c010b410221060b20014198026a420037030020014190026a420037030020014188026a42003703002001420037038002200620146a2213ad42307e2203422088a70d0f2003a72202417f4c0d0f024002402002450d00200210262210450d0d201021020c010b41082110410821020b200141f0006a41186a220920014180026a41186a290300370300200141f0006a41106a220a20014180026a41106a290300370300200141f0006a41086a20014180026a41086a290300370300200120012903800237037002400240024020134102490d002011200f6a20066a417f6a200d6b21060340200141e0016a41186a22082009290300370300200141e0016a41106a2205200a290300370300200141e0016a41086a2207200141f0006a41086a290300370300200120012903703703e0012002420037030820024200370300200241286a2008290300370300200241206a2005290300370300200241186a2007290300370300200241106a20012903e001370300200241306a21022006417f6a22060d000b2013417f6a21060c010b410021062013450d010b200242003703082002420037030020022001290370370310200241186a200141f8006a290300370300200241206a20014180016a290300370300200241286a200141f0006a41186a290300370300200641016a21060b20012006360278200120133602742001201036027020014180026a41086a22024200370300200142003703800241c2b4c200411320014180026a1000200141e0016a41086a200229030037030020012001290380023703e00120014110360284022001200141e0016a36028002200141f0006a20014180026a108a0202402013450d00201010230b200141f0006a41086a2014360200200141023a0074200141063a007041a886c5004100200141f0006a102c200e0d010c020b02402012450d00201010230b200e450d010b200c10230b20014180026a41086a22022004370300200120043703800241c4b3c200411420014180026a1000200141e0016a41086a200229030037030020012001290380023703e001200141e0016a411041a886c500410041001001417f460d0f2001200141e0016a3602800220014110360284022001420037037020014100200141e0016a4110200141f0006a41084100100122022002417f461b2202410820024108491b22063602880202400240024002400240200241074d0d00200129037021042001410036027020014188026a4100200141e0016a4110200141f0006a41042006100122022002417f461b22024104200241044922021b20066a36020020020d00200141f0006a20014180026a102820012802702215450d002001280274211620042000520d1320014180026a41086a22024200370300200142003703800241c4b3c200411420014180026a1000200141e0016a41086a200229030037030020012001290380023703e001024002400240200141e0016a411041a886c500410041001001417f460d002001200141e0016a360240200141103602442001420037037020014100200141e0016a4110200141f0006a41084100100122022002417f461b2202410820024108491b2206360248200241074d0d062001290370210420014100360270200141c8006a4100200141e0016a4110200141f0006a41042006100122022002417f461b22024104200241044922021b20066a36020020020d0620012802702102200141f0006a200141c0006a102820012802702217450d0620012002360288022001200437038002200129027421182001280288022119200141e0016a41101003410821144200211a20014180026a41086a22024200370300200142003703800241c2b4c200411320014180026a1000200141e0016a41086a200229030037030020012001290380023703e0010240200141e0016a411041a886c500410041001001417f460d0020014210370284022001200141e0016a36028002200141f0006a20014180026a108b0220012802702214450d0c2001290274211a200141e0016a411010030b20014180026a41086a22024200370300200142003703800241af98c300410d20014180026a1000200141e0016a41086a2206200229030037030020012001290380023703e0014200211b0240200141e0016a411041a886c500410041001001417f460d0020014200370370200141e0016a4110200141f0006a41084100100141016a41084d0d052001290370211b0b20024200370300200142003703800241d8b3c200411420014180026a10002006200229030037030020012001290380023703e001200141e0016a411041a886c500410041001001417f460d0120014200370370200141e0016a4110200141f0006a41084100100141016a41084d0d052001290370211c0c020b02402016450d00201510230b41c9b5c200410f100f41d8b5c2004135100f200141a0026a24000f0b4205211c0b4200210420014180026a41086a22024200370300200142003703800241a1b5c200411520014180026a1000200141e0016a41086a200229030037030020012001290380023703e00102400240200141e0016a411041a886c500410041001001417f460d002001420037037820014200370370200141e0016a4110200141f0006a4110410010012202417f460d082002410f4d0d08200141f8006a2903002104200129037021000c010b420921000b2014201a422088a7221d41306c6a21020240024002402019450d002019417f6a211341002108024020142002460d002014201d41306c6a220641506a2202290300200641586a29030084500d0220014198026a200641786a29000037030020014190026a200641706a29000037030020014188026a200641686a2900003703002001200641606a29000037038002410121080b410021110c020b4100211141002113410021080c010b410121110b200141f9006a20014180026a41086a29030037000020014181016a20014180026a41106a29030037000020014189016a20014180026a41186a290300370000200120083a007020012001290380023700714101210d200141f0006a410172210602402008450d00200620002004102b200141e0016a41186a200641186a290000370300200141e0016a41106a200641106a290000370300200141e0016a41086a200641086a290000370300200120062900003703e00141201026220e450d0a200e20012903e001370000200e41186a200141e0016a41186a2208290300370000200e41106a200141e0016a41106a2205290300370000200e41086a200141e0016a41086a2207290300370000200141f0006a41017221064102210a412021094101211e4101211f0240410020136b220c41016a4101460d000340201141ff01710d0120142002460d01200241506a2213290300200241586a29030084500d012008200241786a2900003703002005200241706a2900003703002007200241686a2900003703002001200241606a2900003703e001200620012903e001370000200641086a22022007290300370000200641106a22112005290300370000200641186a22102008290300370000200141013a0070200620002004102b20014180026a41186a2212201029000037030020014180026a41106a2210201129000037030020014180026a41086a22112002290000370300200120062900003703800220082012290300370300200520102903003703002007201129030037030020012001290380023703e0010240201e201f470d00201e41016a2202201e490d16200a20022002200a491b221fad4205862203422088a70d162003a722024100480d160240201e450d00200e200920021027220e0d010c090b20021026220e450d080b200e20096a220220012903e001370000200241186a2008290300370000200241106a2005290300370000200241086a2007290300370000200a41026a210a200941206a21094100211120132102200c201e41016a221e6a4101470d000b0b200e20096a210d201e450d0f41082120200141f0006a41086a2121412021224101212341212124411f21254105212641072127417f2128411821294110212a4102212b4201212c4200212d4111212e4190b5c200212f4100213041a886c50021312001419c016a213241132133410f213441332135412b213641232137411b213841042139415f213a200e213b4100213c0c100b200141e0016a41186a200641186a290000370300200141e0016a41106a200641106a290000370300200141e0016a41086a200641086a290000370300200120062900003703e0014100211f4101210e4100211e410021020c100b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b20024101102a000b20084101102a000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41204101102a000b41d4aac10041331021000b41084101102a000b41104101102a000b20024108102a000b410021020c010b410121020b034002400240024002400240024002400240024002400240024002400240024002400240024020020e020001010b4108210f20014180026a41086a2202420037030020014200370380024195b7c100411520014180026a1000200141e0016a41086a200229030037030020012001290380023703e0014100213d024002400240024002400240200141e0016a411041a886c500410041001001417f460d0020014210370284022001200141e0016a36028002200141f0006a20014180026a1089022001280270220f450d02200141f8006a280200213e2001280274213d0c010b4100213e0b200141013602700240024002400240024002402018422088a72207450d004100213f4100214002402007200f203e41286c6a2205200f6b41286e2202200220074b1b2202450d00200241057422064100480d1e200610262208450d0920012008360270200221400b200f2102200721082001280270224121060340200520026b419f014d0d0220062002290000370000200641186a200241186a290000370000200641106a200241106a290000370000200641086a200241086a29000037000020084101460d0320062002290028370020200641386a200241c0006a290000370000200641306a200241386a290000370000200641286a200241306a29000037000020084102460d0420062002290050370040200641d8006a200241e8006a290000370000200641d0006a200241e0006a290000370000200641c8006a200241d8006a29000037000020084103460d0520062002290078370060200641f8006a20024190016a290000370000200641f0006a20024188016a290000370000200641e8006a20024180016a290000370000203f41046a213f20064180016a2106200241a0016a21022008417c6a22080d000c060b0b41002140200128027021414100213f0c040b20052002460d03200f203e41286c6a2109410121050240034020062002290000370000200641186a200241186a290000370000200641106a200241106a290000370000200641086a200241086a29000037000020082005223c460d01203c41016a2105200641206a21062009200241286a2202470d000b0b203f203c6a213f0c030b203f410172213f0c020b203f410272213f0c010b203f410372213f0b201c201b7c210b200f203e41286c6a210c02400240024002400240024002402007450d00200c200f460d012007417f732106203e41286c2108200f21020340200141e0016a41186a200241186a290300370300200141e0016a41106a200241106a290300370300200141e0016a41086a200241086a290300370300200120022903003703e001200641016a2206450d05200241286a2102200841586a22080d000b200c2106200e200d470d030c020b200c200f460d00200141f0006a41186a200f41186a290300370300200141f0006a41106a200f41106a290300370300200141f0006a41086a200f41086a2903003703002001200f290300370370200f41286a2106200f29032021040c040b200f2106200e200d470d010b41002142410821430240203d450d00200f10230b4100213e0c180b200141e0016a41186a200e41186a2202290000370300200141e0016a41106a200e41106a2208290000370300200141e0016a41086a200e41086a22052900003703002001200e2900003703e0012005290000210420082900002100200e290000210320014180026a41186a200229000037030020014180026a41106a200037030020014180026a41086a20043703002001200337038002200e41206a210841022105200b21040c020b200241206a2903002104200141f0006a41186a200141e0016a41186a290300370300200141f0006a41106a200141e0016a41106a290300370300200141f0006a41086a200141e0016a41086a290300370300200120012903e001370370200241286a21060b20014180026a41186a200141f0006a41186a29030037030020014180026a41106a200141f0006a41106a29030037030020014180026a41086a200141f0006a41086a290300370300200120012903703703800241002105200e21080b417f417f200c20066b41286d2202200d20086b4105766a220720072002491b220241016a220720072002491b2242ad42287e2200422088a70d162000a72202417f4c0d16024002402002450d00200210262243450d03204321440c010b41082143410821440b2043200129038002370300204341186a20014180026a41186a290300370300204341106a20014180026a41106a290300370300204341086a20014180026a41086a2903003703002044200437032002400240024002400240024002402005450d002008200d460d03200841086a2900002104200841106a29000021002008290000210320014180026a41186a200841186a29000037030020014180026a41106a200037030020014180026a41086a20043703002001200337038002200841206a21080c010b02402006200c460d00200141f0006a41186a200641186a2202290300370300200141f0006a41106a200641106a2205290300370300200141f0006a41086a200641086a22072903003703002001200629030037037020014180026a41086a200729030037030020014180026a41106a200529030037030020014180026a41186a20022903003703002001200629030037038002200641286a210220062903202104410021110c020b2008200d460d02200141e0016a41186a200841186a2202290000370300200141e0016a41106a200841106a2205290000370300200141e0016a41086a200841086a2207290000370300200120082900003703e00120072900002104200529000021002008290000210320014180026a41186a200229000037030020014180026a41106a200037030020014180026a41086a20043703002001200337038002200841206a21080b41022111200b2104200621020b4102210741022106412821050340200141f0006a41186a223c20014180026a41186a2213290300370300200141f0006a41106a220920014180026a41106a2210290300370300200141f0006a41086a220a20014180026a41086a2212290300370300200120012903800237037002402006223e417f6a22062042470d002006417f417f200c20026b41286d2244200d20086b4105766a224220422044491b224441016a224220422044491b6a22442006490d1d2007204420442007491b2242ad42287e2200422088a70d1d2000a722064100480d1d02400240203e4101470d002006102622430d010c070b20432005200610272243450d060b204321440b204420056a22062001290370370300200641186a203c290300370300200641106a2009290300370300200641086a200a290300370300200641206a2004370300024002400240024002400240201141ff017122064101460d0020064102470d012008200d460d05200841086a2900002104200841106a2900002100200829000021032013200841186a29000037030020102000370300201220043703002001200337038002200841206a210842012100410221110c020b200c2002460d042013200241186a2903003703002010200241106a2903003703002012200241086a2903003703002001200229030037038002200229032021044201210041012111200241286a21020c030b200c2002470d014102211102402008200d460d00200141e0016a41186a200841186a2206290000370300200141e0016a41106a200841106a223c290000370300200141e0016a41086a200841086a2209290000370300200120082900003703e00120092900002104203c2900002100200829000021032013200629000037030020102000370300201220043703002001200337038002200841206a2108420121000c010b420021000c020b200b21040c010b203c200241186a22062903003703002009200241106a223c290300370300200a200241086a22092903003703002001200229030037037020092903002104203c2903002100200229030021032013200629030037030020102000370300201220043703002001200337038002200229032021044201210041002111200241286a21020b200741026a2107203e41016a2106200541286a210520004200520d010b0b203d450d020c010b4101213e203d450d010b200f10230b0240203e41144b0d0041022145203e4102490d16417f2146203e417f6a2147412821482044203e41286c6a21494120214a4118214b4110214c4108214d4103214e41f000214f41582150417821514170215241682153416021544101215541c80021564101213c0c070b203e4101762257ad42287e2204422088a70d172004a72202417f4c0d1741082158024002402002450d00200210262259450d062059215a0c010b410821594108215a0b4158215b204441586a215c204441a87f6a215d4100215e4104215f417f21604101216142032162422021634103216441022165417d21664128216741782168412021694118216a4110216b417e216c4174216d4164216e4150216f410521704109217141f000217241c800217341c00021744138217541302176410a217741042178410021794100217a203e217b4102213c0c080b20064108102a000b41d4aac10041331021000b20024108102a000b20064101102a000b20024108102a000b024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240203c0e050001020304040b2001203b10ef01024020012802002023470d00200120206a2802002108200141206a108c022001280220213d0240200141206a20206a2802002202450d00200220246c2106203d20236a2102200820207621112023200820257174210c20082026762027712213202873210f03400240024002400240200220286a2d00002023470d00200141f0006a20296a200220296a2205290000370300200141f0006a202a6a2002202a6a22072900003703002021200220206a220929000037030020022900002104200141f0006a20226a20113602002001200437037020014180026a200141f0006a108d020240201320014180026a20206a220a28020022084f0d002008200f6a221020084f0d0d20012802800222122010202b746a280200200c7121080240200128028402450d00201210230b2008450d01200141f0006a2002108e022001290370202c520d02200a202d3703002001202d37038002202f202e20014180026a1000200141e0016a20206a2210200a29030037030020012001290380023703e001200141e0016a202a20312030203010012028460d032001203036028002200141e0016a202a20014180026a20392030100120236a20394d0d0e203220012802800220236a3602002033102622080d040c120b200128028402450d0020012802800210230b200220246a21022006203a6a22060d030c040b203310262208450d0d200820346a20302800c5b542360000200820206a20302900beb542370000200820302900b6b54237000020082033203510272208450d0e20082002290000370013200820366a2005290000370000200820376a2007290000370000200820386a2009290000370000200141e0016a20296a2205202d370300200141e0016a202a6a2207202d370300200141e0016a20206a2209202d3703002001202d3703e00120082035200141e0016a1002200141c0006a20296a2005290300370300200141c0006a202a6a2007290300370300200141c0006a20206a2009290300370300200120012903e001370340200141c0006a2022100320081023200220246a21022006203a6a22060d020c030b20324101360200203310262208450d0e0b200820346a20302800c5b542360000200820206a20302900beb542370000200820302900b6b54237000020082033203510272208450d0e20082002290000370013200820366a2005290000370000200820376a2007290000370000200820386a2009290000370000200141e0016a20296a2205202d370300200141e0016a202a6a2207202d3703002010202d3703002001202d3703e00120082035200141e0016a1002200141c0006a20296a2005290300370300200141c0006a202a6a2007290300370300200141c0006a20206a2010290300370300200120012903e00137034020012022360284022001200141c0006a36028002202120014180026a10ed0120081023200220246a21022006203a6a22060d000b0b2001280224450d00203d10230b200d203b20226a223b470d130c180b203e2047220220466a2247490d0d0240203e20476b22062045490d002044200220486c6a2202204a6a22052903002044204720486c6a2208204a6a220729030022045a0d00200141e0016a204b6a223c2008204b6a2209290300370300200141e0016a204c6a220a2008204c6a2211290300370300200141e0016a204d6a22132008204d6a2210290300370300200120082903003703e0012008200229030037030020102002204d6a29030037030020112002204c6a29030037030020092002204b6a2903003703002007200529030037030002402006204e490d002008204f6a29030020045a0d00410221082049210503402005220220506a2002290300370300200220516a2002204a6a290300370300200220526a2002204b6a290300370300200220536a2002204c6a290300370300200220546a2002204d6a290300370300200820556a220820064f0d01200220486a2105200220566a2903002004540d000b0b200220012903e001370300200220043703202002204b6a203c2903003703002002204c6a200a2903003703002002204d6a20132903003703000b204920506a214920470d130c280b207b217c4100217b4101217d207c20606a2209450d1f0240024002400240024002402044200920676c6a20696a2903002044207c20676c22026a206f6a29030022045a0d00205d207c20706c20647422056a2102034020092061460d02200920606a21092004200229030022005421062002205b6a21022000210420060d000c030b0b207c206c6a2105205d20026a21064100217b41002102034020052002460d05200220616a21022004200629030022005a21082006205b6a21062000210420080d000b200220616a217d207c20026b20606a2209450d030c020b410021090b207c2009490d11207c203e4b0d130240207c20096b227d2061762208450d00205c20056a21022044200920676c6a21060340200141f0006a20696a2205200620696a2207290300370300200141f0006a206a6a223c2006206a6a220a290300370300200141f0006a206b6a22112006206b6a2213290300370300200141f0006a20586a2210200620586a221229030037030020012006290300370370200220586a220c29030021042002206b6a220f29030021002002206a6a223d29030021032002290300210b2007200220696a228101290300370300200a200337030020132000370300201220043703002006200b3703002081012005290300370300203d203c290300370300200f2011290300370300200c2010290300370300200220012903703703002002205b6a2102200620676a2106200820606a22080d000b0b2009450d010b207d20714b0d00207c203e4b0d112044200920676c6a217e4100217f0c260b2009217b2079207a460d230c240b207c217d2079207a460d200c210b2087012014460d01208701208a016a2102208701208b016a228701290300200229030084500d012019209601460d1420960120196b210203402014208701460d02208701208a016a2106208701208b016a228701290300200629030084500d0220022096016a22020d000c140b0b2087012014460d0002400340208701208a016a2903002104208701208b016a22022903002100208e01208701208c016a290300370300209101208701208f016a2903003703002094012087012092016a29030037030020012087012095016a290300370380022000200484500d01200141f0006a208d016a2206208e01290300370300200141f0006a2090016a2208209101290300370300200141f0006a2093016a22052094012903003703002001200129038002370370200141e0006a200141f0006a10ef01200141c0006a208d016a2207208e01290300370300200141c0006a2090016a223c209101290300370300200141c0006a2093016a2209209401290300370300200120012903800237034002402001280260209601460d00200221870120142002470d010c030b0b200141e0016a2093016a220a2009290300370300200141e0016a2090016a2209203c290300370300200141e0016a208d016a223c2007290300370300200120012903403703e001200141e0006a2093016a2802002102200141206a208d016a2207203c290300370300200141206a2090016a223c2009290300370300200141206a2093016a2209200a290300370300200120012903e0013703202001208d016a220a200729030037030020012090016a2207203c29030037030020012093016a223c2009290300370300200120012903203703002006200a290300370300200820072903003703002005203c29030037030020012001290300370370024020860120024d0d00208701208b016a2187012085012002209701746a220220012903703700002002208d016a200629030037000020022090016a200829030037000020022093016a20052903003700002089012096016a2189014100211941000d134104213c0c1b0b41d8b4c20020022086011029000b200141206a41186a200141e0016a41186a290300370300200141206a41106a200141e0016a41106a290300370300200141206a41086a200141e0016a41086a290300370300200120012903e0013703200b0240208801450d00201410230b024020860120840141ffffff3f71220220022086014b1b2207450d0020830121022085012106410021050340024020022006460d00200220064120109604450d00411610262208450d0a2008410e6a41002900e1b641370000200841086a41002900dbb641370000200841002900d3b64137000020084116413610272208450d0b200820022900003700162008412e6a200241186a290000370000200841266a200241106a2900003700002008411e6a200241086a290000370000200141e0016a41186a223e4200370300200141e0016a41106a223c4200370300200141e0016a41086a22094200370300200142003703e00120084136200141e0016a1002200141c0006a41186a203e290300370300200141c0006a41106a203c290300370300200141c0006a41086a2009290300370300200120012903e001370340200141c0006a41201003200810230b200241206a2102200641206a2106200541016a22052007490d000b0b2085012086014105746a2102208601213e02400240024002400240024002402086014104490d00200141f0006a41206a213c200141b0016a2109200141d0016a210a200141f0016a21870120014188016a210820014180016a2105200141f8006a210720022106208601213e0340200842003703002005420037030020074200370300200142003703700240203c2006460d00200641606a200141f0006a41201096040d030b20084200370300200542003703002007420037030020014200370370024020092006460d00200641406a200141f0006a41201096040d040b200842003703002005420037030020074200370300200142003703700240200a2006460d00200641a07f6a200141f0006a41201096040d050b20084200370300200542003703002007420037030020014200370370200641807f6a210202402087012006460d002002200141f0006a41201096040d060b203e417c6a213e2002210620022085016b41ff004b0d000b0b2002208501460d05203e417f6a2106200141f0006a41206a210820014188016a210520014180016a2107200141f8006a213e03402005420037030020074200370300203e420037030020014200370370024020082002460d00200241606a200141f0006a41201096040d060b2006417f6a2106208501200241606a2202470d000c060b0b203e417f6a21060c030b203e417e6a21060c020b203e417d6a21060c010b203e417c6a21060b200641016a220220860120860120024b1b2186010b2001418c016a203f360200200141f0006a41186a204036020020014184016a2041360200200141f0006a41106a201e360200200141fc006a201f360200200141f0006a41086a2202200e360200200141033a0074200141063a007041a886c5004100200141f0006a102c20014180026a41086a22064200370300200142003703800241e8b4c200411220014180026a1000200141e0016a41086a200629030037030020012001290380023703e001200141003602782001420137037020012086013602800220014180026a200141f0006a104102400240208601450d00208601410574213e4100200228020022066b21052001280270213c20012802742107208501210203400240200720056a411f4b0d00200641206a22082006490d2b20074101742209200820082009491b22084100480d2b024002402007450d00203c200720081027223c0d010c080b20081026223c450d070b200821070b203c20066a22082002290000370000200841186a200241186a290000370000200841106a200241106a290000370000200841086a200241086a290000370000200541606a2105200641206a2106200241206a2102203e41606a223e0d000b200141f8006a2006360200200120073602742001203c3602700c010b20022802002106200128027421072001280270213c0b200141e0016a4110203c2006100402402007450d00203c10230b0240208401450d0020850110230b20014180026a41086a22024200370300200142003703800241fab4c200411620014180026a1000200141e0016a41086a2206200229030037030020012001290380023703e0012001208901360270200141e0016a4110200141f0006a410410042002420037030020014200370380024190b5c200411120014180026a10002006200229030037030020012001290380023703e00102400240200141e0016a411041a886c500410041001001417f460d0020014100360270200141e0016a4110200141f0006a41044100100141016a41044d0d0c200128027041016a21020c010b410121020b20014180026a41086a2206420037030020014200370380024190b5c200411120014180026a1000200141e0016a41086a200629030037030020012001290380023703e00120012002360270200141e0016a4110200141f0006a410410040240208201450d0020830110230b2018a7450d28201710230c280b41ecb3c200201020081029000b41d4aac10041331021000b20084101102a000b41134101102a000b41334101102a000b41134101102a000b41334101102a000b41164101102a000b41364101102a000b2047203e1048000b41d4aac10041331021000b2009207c1048000b207c2009417f6a227b490d160b207c203e108c01000b4100213c0c050b4101213c0c060b4103213c0c080b4104213c0c080b4104213c0c080b410021020c110b410121020c100b410121020c0f0b410121020c0e0b410121020c0d0b410121020c0c0b410121020c0b0b410121020c0a0b410121020c090b410021020c050b410121020c040b410221020c030b410121020c020b410221020c010b410321020b03400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020020e0400010204040b2079207a470d12410121020c160b207920616a22022079490d1a20792061742206200220022006491b2202ad2062862204206388a70d1a2004a72206205e480d1a024002402079450d00207820792064742006102722780d010c030b200610262278450d020b20022179410221020c150b2078207a2064746a2202207d3602042002207b360200207a20616a228001217a2080012065490d024101217f0c130b20064104102a000b02400240207f0e020001010b207c200920606a227b490d140240207c207b6b227d2065490d002044200920676c6a220220696a22082903002044207b20676c6a220620696a220529030022045a0d00200141e0016a206a6a22072006206a6a223c290300370300200141e0016a206b6a220a2006206b6a2211290300370300200141e0016a20586a2213200620586a2210290300370300200120062903003703e001200620022903003703002010200220586a29030037030020112002206b6a290300370300203c2002206a6a290300370300200520082903003703000240207d2064490d00200620726a29030020045a0d0041022106207e2108024003402008220220696a200220736a2903003703002002206a6a200220746a2903003703002002206b6a200220756a290300370300200220586a200220766a2903003703002002200220676a2208290300370300200620616a2206207d4f0d01200220726a2903002004540d000b0b200220676a21020b200220012903e001370300200220043703202002206a6a20072903003703002002206b6a200a290300370300200220586a20132903003703000b207b450d0e207e205b6a217e207b2109207d2077490d0c410021020c130b02400240024002402078208001221320606a2280012064746a2202280200450d00207820132064746a2207206d6a2802002205200228020422064d0d004102217a201341024d0d042078201320666a22022064746a2802042208200620056a4d0d014103217a201341034d0d042007206e6a280200200820056a4d0d010c050b20132064490d01200228020421062078201320666a22022064746a28020421080b20082006490d010b2013206c6a21020b2013200220616a227a4d0d03201320024d0d04207820022064746a2212280204223d20122802006a22022078207a2064746a220c280200220f490d052002203e4b0d062012205f6a2181012044200f20676c6a2211200c280204221020676c22066a2107200220676c2108024002400240024002402002200f6b223c20106b220220104f0d0020592007200220676c22061094041a205a20066a210520102061480d0120022061480d01205c20086a210820072102034020082002205b6a223c2005205b6a220a200520686a290300200220686a2903005422071b2206290300370300200820696a200620696a2903003703002008206a6a2006206a6a2903003703002008206b6a2006206b6a290300370300200820586a200620586a2903003703002005200a20071b21052011203c200220071b22024f0d042008205b6a2108205a2106205a2005490d000c050b0b2059201120061094041a205a20066a210520102061480d01203c20104c0d01204420086a210a205a2106201121020340200220072006200720696a290300200620696a29030054223c1b2208290300370300200220696a200820696a2903003703002002206a6a2008206a6a2903003703002002206b6a2008206b6a290300370300200220586a200820586a2903003703002006200620676a203c1b2106200220676a2102200720676a2007203c1b2207200a4f0d04200520064b0d000c040b0b200721020c010b201121020b205a21060b20022006200520066b220820082067706b1094041a208101203d20106a3602002012200f360200200c200c20586a207a20607320136a2064741095041a208001217a20800120614b0d0c0b207b0d060c010b2013217a207b0d060b02402079450d00207810230b2057450d11205910230c110b41b0a8c100207a20131029000b41b0a8c100200220131029000b200f20021048000b2002203e108c01000b4102213c0c010b4102213c0c010b410121020c0b0b410121020c0a0b4100217f0c030b4101217f0c030b410021020c040b410221020c030b410321020c020b410321020c010b410321020c000b0b207b207c1048000b2001203e360278200120423602742001204336027020014180026a41086a2202420037030020014200370380024195b7c100411520014180026a1000200141e0016a41086a2206200229030037030020012001290380023703e00120014110360284022001200141e0016a36028002200141f0006a20014180026a108f0202402042450d00204310230b2041203f10900220024200370300200142003703800241e8b4c200411220014180026a10002006200229030037030020012001290380023703e001410021820102400240024002400240200141e0016a411041a886c500410041001001417f460d0020014210370284022001200141e0016a36028002200141f0006a20014180026a10282001280270228301450d02200141f8006a28020021840120012802742182010c010b410121830141002184010b200141d8006a4200370300200141d0006a4200370300200141c8006a420037030020014200370340208401ad2204421b88a70d042004420586a72202417f4c0d04024002402002450d00200210262285010d0120024101102a000b41012185010b200141f0006a41186a2208200141c0006a41186a290300370300200141f0006a41106a2205200141c0006a41106a290300370300200141f0006a41086a2207200141c0006a41086a290300370300200120012903403703700240024002402084014102490d00208401417f6a21062085012102034020022001290370370000200241186a2008290300370000200241106a2005290300370000200241086a2007290300370000200241206a21022006417f6a22060d000b208401417f6a2186010c010b41002186012085012102208401450d010b20022001290370370000200241186a200141f0006a41186a290300370000200241106a200141f0006a41106a290300370000200241086a200141f0006a41086a29030037000020860141016a2186010b2014201d41306c6a218701201aa721880141002189014158218a014150218b014178218c014118218d0120014180026a41186a218e014170218f01411021900120014180026a41106a2191014168219201410821930120014180026a41086a2194014160219501410121960141052197012019450d014103213c0c020b41d4aac10041331021000b4104213c410121020c010b410121020c000b0b101d000b101e000b2016450d00201510230b200141a0026a24000bf90504027f017e0f7f017e230041f0006b22022400200241086a2001104a0240024002400240024002400240024002402002280208450d00200228020c2203ad42287e2204422088a70d032004a72205417f4c0d032005450d01200510262206450d042003450d020c050b20004100360200200241f0006a24000f0b4108210620030d030b4100210f4100210d0c030b101d000b20054108102a000b200241d0006a41186a2107200241d0006a41106a2108200141046a21094100210a4100210b4100210c2003210d024003402007420037030020084200370300200241d0006a41086a220e420037030020024200370350200141086a2205410020012802002009280200200241d0006a412020052802001001220f200f417f461b220f4120200f412049220f1b20052802006a2210360200200f0d01200241306a41186a22112007290300370300200241306a41106a22122008290300370300200241306a41086a2213200e29030037030020022002290350370330200242003703502005410020012802002009280200200241d0006a410820101001220f200f417f461b220f4108200f4108491b20052802006a360200200f41074d0d01200c41016a210f20022903502104200241106a41186a220e2011290300370300200241106a41106a22102012290300370300200241106a41086a22112013290300370300200220022903303703100240200c200d470d00200a200f200f200a491b220dad42287e2214422088a70d042014a722054100480d040240200c450d002006200b2005102722060d010c060b200510262206450d050b2006200b6a22052002290310370300200541186a200e290300370300200541106a2010290300370300200541086a2011290300370300200541206a2004370300200a41026a210a200b41286a210b200f210c200f2003490d000c020b0b200041003602000240200d450d00200610230b200241f0006a24000f0b2000200d36020420002006360200200041086a200f360200200241f0006a24000f0b101e000b20054108102a000b9e0403057f027e027f230041106b2202240020024100360208200242013703002000280200210320022000280208220036020c2002410c6a200210410240024002400240024002402000450d002003200041306c6a2104200241086a280200210520022802002106200228020421000340200341086a2903002107200329030021080240024002400240200020056b41104f0d00200541106a22092005490d062000410174220a20092009200a491b220a4100480d062000450d0120062000200a102722060d020c070b200541106a21090c020b200a10262206450d050b200a21000b200620056a22052007370008200520083700000240024002400240200020096b41204f0d00200941206a22052009490d062000410174220a20052005200a491b220a4100480d062000450d0120062000200a102722060d020c080b200941206a21050c020b200a10262206450d060b200a21000b200620096a220941186a200341286a290000370000200941106a200341206a290000370000200941086a200341186a2900003700002009200341106a290000370000200341306a22032004470d000b200241086a20053602002002200036020420022006360200200128020020012802042006200510042000450d050c040b200228020421032001280200200128020420022802002206200241086a280200100420030d030c040b101e000b200a4101102a000b200a4101102a000b200610230b200241106a24000bce0506027f017e0b7f017e027f017e230041d0006b22022400200241086a2001104a0240024002400240024002400240024002402002280208450d00200228020c2203ad42307e2204422088a70d032004a72205417f4c0d032005450d01200510262206450d042003450d020c050b20004100360200200241d0006a24000f0b4108210620030d030b4100210d4100210c0c030b101d000b20054108102a000b200141046a2107200141086a2108200241306a41186a21094100210a4100210b410021052003210c0240034020024200370338200242003703302008410020012802002007280200200241306a411020082802001001220d200d417f461b220d4110200d4110491b20082802006a220e360200200d410f4d0d01200241306a41086a220f29030021042002290330211020094200370300200241306a41106a22114200370300200f4200370300200242003703302008410020012802002007280200200241306a4120200e1001220d200d417f461b220d4120200d4120491b20082802006a360200200d411f4d0d01200541016a210d200241106a41186a220e2009290300370300200241106a41106a22122011290300370300200241106a41086a2211200f2903003703002002200229033037031002402005200c470d00200a200d200d200a491b220cad42307e2213422088a70d042013a7220f4100480d0402402005450d002006200b200f102722060d010c060b200f10262206450d050b2006200b6a2205200437030820052010370300200541286a200e290300370300200541206a2012290300370300200541186a2011290300370300200541106a2002290310370300200a41026a210a200b41306a210b200d2105200d2003490d000c020b0b200041003602000240200c450d00200610230b200241d0006a24000f0b2000200c36020420002006360200200041086a200d360200200241d0006a24000f0b101e000b200f4108102a000b8603020c7f017e230041206b2201240020014100109102200141106a410110910202400240024020012802182202450d00410221032001280204210420012802082105200141186a210603402001280214210b2001280210210a024002400240200420056b200241216c220241216d220c4f0d002005200c6a220c2005490d0520044101742208200c200c2008491b2209ad42217e220d422088a70d05200da722074100480d050240024020040d00200710262208450d080c010b2001280200200441216c200710272208450d070b20012008360200200921042008200541216c6a200a20021094041a200b0d010c020b2005200c6a210c2001280200200541216c6a200a20021094041a200b450d010b200a10230b200141106a2003109102200341016a2103200c2105200628020022020d000b200141086a200c360200200120043602040b02402001280214450d00200128021010230b20002001290300370200200041086a200141086a280200360200200141206a24000f0b101e000b20074101102a000bad0301047f230041d0006b220224000240024002400240411310262203450d002003410f6a410028009cb642360000200341086a4100290095b6423700002003410029008db64237000020034113413310272203450d01200320012900003700132003412b6a200141186a290000370000200341236a200141106a2900003700002003411b6a200141086a290000370000200128022021042003413341e60010272201450d0220012004360033200241306a41186a22034200370300200241306a41106a22044200370300200241306a41086a220542003703002002420037033020014137200241306a1002200241186a2003290300370300200241106a2004290300370300200241086a200529030037030020022002290330370300024002402002412041a886c500410041001001417f460d002002422037022420022002360220200241306a200241206a10920220022802302203450d0520002002290234370204200020033602000c010b20004100360208200042043702000b20011023200241d0006a24000f0b41134101102a000b41334101102a000b41e6004101102a000b41d4aac10041331021000bf50402057f037e230041c0006b2202240002400240411310262203450d002003410f6a41002800c5b542360000200341086a41002900beb542370000200341002900b6b54237000020034113413310272203450d01200320012900003700132003412b6a200141186a290000370000200341236a200141106a2900003700002003411b6a200141086a290000370000200241206a41186a22014200370300200241206a41106a22044200370300200241206a41086a220542003703002002420037032020034133200241206a1002200241186a2001290300370300200241106a2004290300370300200241086a2005290300370300200220022903203703000240024002402002412041a886c500410041001001417f460d0020024100360220410020024120200241206a41044100100122012001417f461b220141034d0d022002280220210420024100360220410020024120200241206a41042001410420014104491b2205100122012001417f461b220141034d0d0220022802202106200242003703282002420037032020024120200241206a41102001410420014104491b20056a220110012205417f460d022005410f4d0d02200241286a290300210720022903202108200242003703282002420037032020024120200241206a4110200141107210012201417f460d022001410f4d0d0220022903202109200041206a200241286a290300370300200041186a2009370300200041106a2007370300200020083703082000412c6a2006360200200041286a2004360200200042013703000c010b200042003703000b20031023200241c0006a24000f0b41d4aac10041331021000b41134101102a000b41334101102a000ba00402087f017e230041106b2202240020024100360208200242013703002000280200210320022000280208220036020c2002410c6a200210410240024002400240024002402000450d002003200041286c6a2104200241086a220528020021002002280204210603400240024002400240200620006b41204f0d00200041206a22072000490d0620064101742208200720072008491b22094100480d062006450d01200228020020062009102722080d020c070b200041206a2107200228020021080c020b200910262208450d050b2002200936020420022008360200200921060b20052007360200200820006a220041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a29000037000020002003290000370000200341206a290300210a0240024002400240200620076b41084f0d00200741086a22002007490d0620064101742209200020002009491b22094100480d062006450d01200820062009102722080d020c080b200741086a21000c020b200910262208450d060b2002200936020420022008360200200921060b20052000360200200820076a200a3700002004200341286a2203470d000b200128020020012802042008200010042006450d050c040b200228020421032001280200200128020420022802002208200241086a280200100420030d030c040b101e000b20094101102a000b20094101102a000b200810230b200241106a24000b840e05027f017e0d7f067e047f230022022103200241e0016b416071220224000240024002402001ad2204421b88a70d002004420586a72205417f4c0d000240024002402005450d00200510262206450d0441002107410021084100210520010d010c020b410121064100210741002108410021052001450d010b20014105742109416020006b210a2006210520002108034020052008290000370000200541186a200841186a290000370000200541106a200841106a290000370000200541086a200841086a290000370000200541206a2105200841206a2108200941606a22090d000b200020014105746a200a6a41057641016a2105200121080b20022005360218200220083602142002200636021020062005200241d8016a200741202005676b108901200241a0016a41086a22054200370300200242003703a0014188a8c4004118200241a0016a100020024180016a41086a2005290300370300200220022903a00137038001024002400240024002400240024020024180016a411041a886c500200720071001417f460d0020024210370244200220024180016a360240200241a0016a200241c0006a102820022802a001220b450d0920022802a401210c4105210d200241a8016a28020041057422000d010c020b4101210b4100210c4105210d41004105742200450d010b200241a0016a411472210e200241a0016a410872210f200b21050340200241206a41186a220a200541186a290000370300200241206a41106a2210200541106a290000370300200241206a41086a2211200541086a29000037030020022005290000370320200241c0006a200241206a10b603200241003602a80120022903582112200220022903b801221337035820022903502114200220022903b001221537035020022903402116200220022903a00137034020022903482104200220022903a80122173703482015422088a721062017422088a721012013a721072017a7210902402004a72208450d00200220163703a001200220043703a801200220143703b001200220123703b8012002418c016a221820082014a7200d746a36020020024180016a41086a2219200836020020024180016a41106a221a200241106a36020020022004422088a7360284012002200836028001200241f0006a20024180016a10ab02200f41086a200241f0006a41086a221b280200360200200f200229037037020020182014422088a722082012422088a7200d746a36020020192008360200201a200241106a36020020022012a7360284012002200836028001200241f0006a20024180016a10ab02200e41086a201b280200360200200e200229037037020020022903b801211720022903b001211220022903a801210420022903a001211402402009450d0002402001450d00200910230b2007450d00200610230b20022014370340200220043703482004422088a72101200220123703502012422088a72106200220173703582004a721092017a721070b41151026210802402009450d002008450d032008410d6a41002900ada844370000200841086a41002900a8a844370000200841002900a0a84437000020084115413510272208450d04200820022903203700152008412d6a200a290300370000200841256a20102903003700002008411d6a2011290300370000200241a0016a41186a220a4200370300200241a0016a41106a22104200370300200241a0016a41086a22114200370300200242003703a00120084135200241a0016a100220024180016a41186a200a29030037030020024180016a41106a201029030037030020024180016a41086a2011290300370300200220022903a00137038001200241203602a401200220024180016a3602a001200241c0006a200241a0016a10ad032008102302402001450d00200910230b02402007450d00200610230b200541206a2105200041606a22000d010c020b2008450d042008410d6a41002900ada844370000200841086a41002900a8a844370000200841002900a0a84437000020084115413510272208450d05200820022903203700152008412d6a200a290300370000200841256a20102903003700002008411d6a2011290300370000200241a0016a41186a22094200370300200241a0016a41106a22014200370300200241a0016a41086a22074200370300200242003703a00120084135200241a0016a100220024180016a41186a200929030037030020024180016a41106a200129030037030020024180016a41086a2007290300370300200220022903a0013703800120024180016a4120100320081023200541206a2105200041606a22000d000b0b0240200c450d00200b10230b02402002280214450d00200228021010230b200324000f0b41154101102a000b41354101102a000b41154101102a000b41354101102a000b101d000b20054101102a000b41d4aac10041331021000b9a0805057f017e0b7f017e017f230041a0016b220224000240024002400240024002400240024002400240410e10262203450d00200341066a41002900a6b642370000200341002900a0b6423700002003410e411c10272204450d012004200136000e200241c0006a41186a22034200370300200241c0006a41106a22014200370300200241c0006a41086a220542003703002002420037034020044112200241c0006a1002200241106a41186a2003290300370300200241106a41106a2001290300370300200241106a41086a2005290300370300200220022903403703100240024002400240200241106a412041a886c500410041001001417f460d00200242203702342002200241106a360230200241086a200241306a104a2002280208450d0b200228020c2206ad42217e2207422088a70d032007a72203417f4c0d032003450d01200310262208450d062006450d020c070b20004100360208200042013702000c080b4101210820060d050b4100210e420021072008450d080c050b101d000b410e4101102a000b411c4101102a000b20034101102a000b200241306a41086a220928020021012002280234210a2002280230210b420021074100210c4100210d410021032006210e0340200241003a004020092001200b200a200241c0006a41012001100141016a41014b22056a22013602002005450d034100210f024020022d00402205450d0020054101470d04200241c0006a41186a220f4200370300200241c0006a41106a22104200370300200241c0006a41086a221142003703002002420037034020094100200b200a200241c0006a41202001100122052005417f461b2205412020054120491b20016a22013602002005411f4d0d0420024180016a41186a200f29030037030020024180016a41106a201029030037030020024180016a41086a201129030037030020022002290340370380014101210f0b200341016a2105200241e0006a41186a221020024180016a41186a290300370300200241e0006a41106a221120024180016a41106a290300370300200241e0006a41086a221220024180016a41086a290300370300200220022903800137036002402003200e470d00200c20052005200c491b220ead42217e2213422088a70d062013a722144100480d0602402003450d002008200d2014102722080d010c080b201410262208450d070b2008200d6a2203200f3a0000200341196a2010290300370000200341116a2011290300370000200341096a2012290300370000200341016a200229036037000020074280808080107c2107200c41026a210c200d41216a210d2005210320052006490d000b2008450d030b20002007200ead84370204200020083602000b20041023200241a0016a24000f0b200e450d00200810230b41d4aac10041331021000b101e000b20144101102a000bc50303027f017e097f230041106b2202240020022001104a02400240024002400240024002400240024002402002280200450d0020022802042203ad2204421e88a70d032004420286a72205417f4c0d032005450d01200510262206450d042003450d020c050b20004100360200200241106a24000f0b4104210620030d030b410021054100210b0c030b101d000b20054104102a000b200141086a210741002108410021094100210a2003210b0340200141046a28020021052007280200210c2002410036020c20074100200128020020052002410c6a4104200c100122052005417f461b2205410420054104491b20072802006a360200200541034d0d02200a41016a2105200228020c210c0240200a200b470d002008200520052008491b220bad4202862204422088a70d042004a7220d4100480d040240200a450d0020062009200d102722060d010c060b200d10262206450d050b200620096a200c360200200841026a2108200941046a21092005210a20052003490d000b0b2000200b36020420002006360200200041086a2005360200200241106a24000f0b200041003602000240200b450d00200610230b200241106a24000f0b101e000b200d4104102a000bce0304027f017e037f017e230041c0006b2204240002400240411810262205450d00200541106a410029008db741370000200541086a4100290085b741370000200541002900fdb64137000020054118413810272205450d0120052001290000370018200541306a200141186a290000370000200541286a200141106a290000370000200541206a200141086a29000037000042002106200441206a41186a22074200370300200441206a41106a22084200370300200441206a41086a220942003703002004420037032020054138200441206a1002200441186a2007290300370300200441106a2008290300370300200441086a2009290300370300200420042903203703000240024002402004412041a886c500410041001001417f460d00200442003703282004420037032020044120200441206a4110410010012207417f460d022007410f4d0d02200441286a290300210a200429032021060c010b4200210a0b2005102320012006200220062006200256200a200356200a2003511b22051b22027d200a2003200a20051b22037d2006200254ad7d10fe012000200337030820002002370300200441c0006a24000f0b41d4aac10041331021000b41184101102a000b41384101102a000bf01004047f017e087f037e230041d0046b22022400200241186a200110450240024002400240024002400240024002402002280218450d00200241003a00a002200241a0026a200128020022032001280204220441004722051094041a20042005490d04200141046a200420056b3602002001200320056a3602002004450d0120022d00a002220441ff00714101470d022004411874411875417f4c0d03420221060c080b20004203370370200241d0046a24000f0b20004203370370200241d0046a24000f0b20004203370370200241d0046a24000f0b200241a8046a200110950202400240024020022d00a8044102460d0020024180046a41206a200241a8046a41206a28020036020020024180046a41186a200241a8046a41186a29030037030020024180046a41106a200241a8046a41106a29030037030020024180046a41086a200241a8046a41086a290300370300200220022903a80437038004200241a0026a41386a22074200370300200241a0026a41306a22084200370300200241a0026a41286a22094200370300200241a0026a41206a220a4200370300200241a0026a41186a220b4200370300200241a0026a41106a220c4200370300200241a0026a41086a220d4200370300200242003703a002200241a0026a20012802002203200141046a220e280200220441c000200441c000491b22051094041a200e200420056b3602002001200320056a3602002004413f4d0d0020024190036a41386a200729030037030020024190036a41306a200829030037030020024190036a41286a200929030037030020024190036a41206a200a29030037030020024190036a41186a200b29030037030020024190036a41106a200c29030037030020024190036a41086a200d290300370300200220022903a00237039003200241086a200110462002280208450d002002290310210f200141046a220e2802002104200241003a00a002200241a0026a20012802002207200441004722051094041a20042005490d04200e200420056b22033602002001200720056a22053602002004450d0020023100a0022210500d01200241003a00a002200241a0026a2005200341004722041094041a20032004490d05200141046a200320046b3602002001200520046a3602002003450d0042022010420f838622114204540d004201210620023100a0024208862010844204882011420c882210420120104201561b7e22102011540d020b420221060c050b420021060b20024188016a41206a20024180046a41206a28020036020020024188016a41186a20024180046a41186a29030037030020024188016a41106a20024180046a41106a29030037030020024188016a41086a20024180046a41086a290300370300200241b0016a41086a20024190036a41086a290300370300200241b0016a41106a20024190036a41106a290300370300200241b0016a41186a20024190036a41186a290300370300200241b0016a41206a20024190036a41206a290300370300200241b0016a41286a20024190036a41286a290300370300200241b0016a41306a20024190036a41306a290300370300200241b0016a41386a20024190036a41386a29030037030020022002290380043703880120022002290390033703b0010c030b200520041048000b200520041048000b200420031048000b20024190036a41206a220420024188016a41206a28020036020020024190036a41186a220520024188016a41186a29030037030020024190036a41106a220320024188016a41106a29030037030020024190036a41086a220e20024188016a41086a290300370300200241a0026a41086a2207200241b0016a41086a290300370300200241a0026a41106a2208200241b0016a41106a290300370300200241a0026a41186a2209200241b0016a41186a290300370300200241a0026a41206a220a200241b0016a41206a290300370300200241a0026a41286a220b200241b0016a41286a290300370300200241a0026a41306a220c200241b0016a41306a290300370300200241a0026a41386a220d200241b0016a41386a290300370300200220022903880137039003200220022903b0013703a002024020064202520d0020004203370370200241d0046a24000f0b200241e0006a41206a2004280200360200200241e0006a41186a2005290300370300200241e0006a41106a2003290300370300200241e0006a41086a200e290300370300200241206a41086a2007290300370300200241206a41106a2008290300370300200241206a41186a2009290300370300200241206a41206a200a290300370300200241206a41286a200b290300370300200241206a41306a200c290300370300200241206a41386a200d2903003703002002200229039003370360200220022903a0023703200b200241a0026a2001104420022802a002210120024190036a200241a0026a41047241ec001094041a02402001410e470d0020004203370370200241d0046a24000f0b200241b0016a20024190036a41ec001094041a2000200f37030020002002290360370308200041106a200241e0006a41086a290300370300200041186a200241e0006a41106a290300370300200041206a200241e0006a41186a290300370300200041286a200241e0006a41206a2802003602002000200229032037022c200041346a200241206a41086a2903003702002000413c6a200241206a41106a290300370200200041c4006a200241206a41186a290300370200200041cc006a200241206a41206a290300370200200041d4006a200241206a41286a290300370200200041dc006a200241d0006a290300370200200041e4006a200241d8006a29030037020020004188016a200136020020004180016a201037030020002011370378200020063703702000418c016a200241b0016a41ec001094041a200241d0046a24000b8c0701067f230041f0006b22022400200241003a0050200241d0006a200128020022032001280204220441004722051094041a02400240024020042005490d00200141046a200420056b22063602002001200320056a220536020002402004450d0020022d0050220441ef014d0d02200441847e6a220441034b0d00024002400240024020040e0400010203000b200241003b0150200241d0006a20052006410220064102491b22041094041a200141046a200620046b3602002001200520046a360200200641014d0d0320022f0150220441f0014f0d050c030b20024100360250200241d0006a20052006410420064104491b22041094041a200141046a200620046b3602002001200520046a360200200641034d0d024101210120022802502204418080044f0d050c020b200141046a20062006410420064104491b22046b3602002001200520046a3602000c010b41002103200241d0006a2006412020064120491b22046a41004100412020046b2004411f4b1b1093041a200241d0006a200520041094041a200141046a200620046b3602002001200520046a360200024002402006411f4d0d00200241c8006a41026a200241d0006a41026a2d00003a0000200241306a200241df006a290000370300200241386a200241e7006a290000370300200241c0006a200241d0006a411f6a2d00003a0000200220022f00503b01482002200229005737032820022800532104410121030c010b0b200241cc006a41026a2201200241c8006a41026a2d00003a0000200241d0006a41086a2205200241286a41086a290300370300200241d0006a41106a2206200241286a41106a290300370300200241d0006a41186a2207200241286a41186a2d00003a0000200220022f01483b014c200220022903283703502003450d00200241246a41026a20012d00003a0000200241086a41086a2005290300370300200241086a41106a2006290300370300200241086a41186a20072d00003a0000200220022f014c3b012420022002290350370308410021010c030b200041023a0000200241f0006a24000f0b200520041048000b410121010b200020022f01243b0001200020013a0000200041046a2004360200200041086a2002290308370200200041036a200241266a2d00003a0000200041106a200241086a41086a290300370200200041186a200241086a41106a290300370200200041206a200241086a41186a280200360200200241f0006a24000b9d1707017f027e037f017e017f017e047f230041e0046b2202240002400240200129037022034202520d00200241086a20014188016a41f0001094041a420021030c010b200241b6016a2001410b6a2d00003a000020024198016a41086a2001411c6a29020037030020024198016a410d6a200141216a290000370000200220012f00093b01b40120022001290214370398012001410c6a280200210520012d0008210620012802102107200241f0016a200141e4006a290000370300200241e8016a200141dc006a290000370300200241e0016a200141d4006a290000370300200241d8016a200141cc006a290000370300200241d0016a200141c4006a290000370300200241b8016a41106a2001413c6a290000370300200241b8016a41086a200141346a2900003703002002200129002c3703b80120012903002108200241f8016a41106a200141f0006a220941106a290300370300200241f8016a41086a200941086a290300370300200220092903003703f8014200210a200241d8026a41086a220b4200370300200242003703d80241af98c300410d200241d8026a1000200241c0046a41086a200b290300370300200220022903d8023703c00442002104024002400240024002400240024002400240024002400240200241c0046a411041a886c500410041001001417f460d00200242003703d802200241c0046a4110200241d8026a41084100100141016a41084d0d0120022903d8022104200929030021030b024020034201520d002001290378220a500d02200420014180016a290300220320032004541b2204200420037d200a827d210a0b200241d8026a200a109702200241ac026a41026a20022d00da023a0000200241c0046a41086a2209200241eb026a290000370300200241c0046a410d6a220b200241f0026a290000370000200220022f01d8023b01ac02200220022900e3023703c00420022800db02210c20022800df02210d20024190026a410d6a200b29000037000020024190026a41086a2009290300370300200220022903c004370390022002418c046a41026a2209200241b4016a41026a2d00003a0000200241d8026a41086a220b20024198016a41086a290300370300200241d8026a410d6a220e20024198016a410d6a290000370000200220022f01b4013b018c0420022002290398013703d8020240024002400240024002400240200641ff01714101470d0020024190046a200541067610870120022802900421092002280298042005413f7122054d0d0120024188046a41026a200920054105746a220541026a2d00003a0000200241a8046a200541136a290000370300200241ad046a200541186a290000370000200220052f00003b0188042002200529000b3703a0042005280007210720052800032105410121062002280294040d020c030b20024188046a41026a20092d00003a0000200241a0046a41086a200b290300370300200241a0046a410d6a200e290000370000200220022f018c043b018804200220022903d8023703a0040c030b41002106200228029404450d010b200910230b2006450d010b20024190046a41026a20024188046a41026a2d00003a0000200241d8026a41086a200241a0046a41086a290300370300200241d8026a410d6a200241a0046a410d6a290000370000200220022f0188043b019004200220022903a0043703d802410021090c010b410121094115210741d9cac40021050b200241d4026a41026a220620024190046a41026a2d00003a0000200241c0046a41086a220b200241d8026a41086a220e290300370300200241c0046a41106a200241d8026a41106a290300370300200220022f0190043b01d402200220022903d8023703c00402402009450d002000200536020420004101360200200041086a200736020020014188016a1024200241e0046a24000f0b200241c3026a200b290300370000200241c8026a200241c0046a410d6a290000370000200220022f01d4023b01b002200220073600b702200220053600b302200220022903c0043700bb02200220062d00003a00b202200220083703d802200e20014188016a41f000109404210b200241ef036a200d360000200241eb036a200c360000200241d8026a4188016a200241f8016a41106a290300370300200241d8036a2201200241f8016a41086a290300370300200241ea036a200241ac026a41026a2d00003a0000200241f3036a200229039002370000200241fb036a20024190026a41086a29030037000020024180046a20024190026a410d6a290000370000200220022903f8013703d003200220022f01ac023b01e803200241003602c804200242013703c004200241d8026a200241c0046a109802200b200241c0046a103902400240024002400240024020022903d0034201520d0020012903002203420c882204420120044201561b22044200510d08200241e0036a290300200480210420022802c4042205200241c8046a28020022016b41024f0d01200141026a22092001490d0e20054101742201200920092001491b22014100480d0e2005450d0420022802c0042005200110272205450d050c0b0b024020022802c404200241c8046a2802002201470d00200141016a22052001490d0e20014101742209200520052009491b22094100480d0e2001450d0220022802c0042001200910272205450d030c090b20022802c00421050c090b20022802c00421050c0a0b2009102622050d060b20094101102a000b2001102622050d060b20014101102a000b41d4aac10041331021000b41e0fec400104f000b41b099c300104f000b200220093602c404200220053602c004200241c8046a28020021010b200241c8046a200141016a360200200520016a41003a00000c020b200220013602c404200220053602c004200241c8046a28020021010b200241c8046a200141026a360200200520016a2004a741047420037aa7417f6a22014101200141014b1b2201410f2001410f491b723b00000b02400240024020022802c4042206200241c8046a28020022016b41204f0d00200141206a22052001490d0320064101742201200520052001491b22094100480d032006450d0120022802c0042006200910272205450d020c040b20022802c00421050c040b2009102622050d020b20094101102a000b101e000b200220093602c404200220053602c004200241c8046a2802002101200921060b200520016a2209200241e8036a2207290000370000200941186a200741186a290000370000200941106a200741106a290000370000200941086a200741086a2900003700000240024002400240200141206a2201418102490d00200241c0046a41186a22094200370300200241c0046a41106a22074200370300200241c0046a41086a220c4200370300200242003703c00420052001200241c0046a1002200241a0046a41186a2009290300370300200241a0046a41106a2007290300370300200241a0046a41086a200c290300370300200220022903c0043703a004200241a0046a4120200241b8016a200241b0026a1011450d01200241a0046a4120200241b8016a200241b0026a101245210120060d020c030b20052001200241b8016a200241b0026a1011450d0020052001200241b8016a200241b0026a101245210120060d010c020b410121012006450d010b200510230b02402001450d00200241f8006a41186a200241b0026a41186a290300370300200241f8006a41106a200241b0026a41106a290300370300200241f8006a41086a200241b0026a41086a290300370300200220022903b00237037820022903d8022104200241086a200b41f0001094041a420121030c010b200041eecac40036020420004101360200200041086a411a360200200b1024200241e0046a24000f0b200041106a2002290378370300200041086a2003370300200041306a2004370300200041186a200241f8006a41086a290300370300200041206a200241f8006a41106a290300370300200041286a200241f8006a41186a290300370300200041386a200241086a41f0001094041a20004100360200200241e0046a24000ba40301057f230041c0006b2202240002400240411010262203450d00200341086a410029009299433700002003410029008a994337000020034110412010272203450d0120032001370010200241206a41186a22044200370300200241206a41106a22054200370300200241206a41086a220642003703002002420037032020034118200241206a1002200241186a2004290300370300200241106a2005290300370300200241086a2006290300370300200220022903203703000240024002402002412041a886c500410041001001417f460d002004420037030020054200370300200241286a42003703002002420037032020024120200241206a4120410010012204417f460d022004411f4d0d0220002002290320370000200041186a200241206a41186a290300370000200041106a200241206a41106a290300370000200041086a200241206a41086a2903003700000c010b20004200370000200041186a4200370000200041106a4200370000200041086a42003700000b20031023200241c0006a24000f0b41d4aac10041331021000b41104101102a000b41204101102a000bc00903017f017e057f230041e0006b2202240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020002903002203423f560d00200141046a280200200141086a2802002200470d01200041016a22042000490d1120004101742205200420042005491b22054100480d112000450d0520012802002000200510272204450d060c190b2003428080015a0d01200141046a2802002204200141086a28020022006b41024f0d02200041026a22052000490d1020044101742200200520052000491b22004100480d102004450d0820012802002004200010272204450d090c160b200128020021040c180b20034280808080045a0d01200141046a2802002204200141086a28020022006b41044f0d04200041046a22052000490d0e20044101742200200520052000491b22004100480d0e2004450d08200128020020042000102722040d090c120b200128020021040c140b4108200379a74103766b22064104490d0e200141046a280200200141086a2802002205470d03200541016a22042005490d0c20054101742207200420042007491b22044100480d0c2005450d09200128020020052004102722070d0a0c110b2005102622040d130b20054101102a000b200128020021040c050b200128020021070c070b2000102622040d0d0b20004101102a000b200010262204450d090b20012004360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200420006a2003a7410274410272360000200241e0006a24000f0b200410262207450d070b20012007360200200141046a2004360200200141086a28020021050b200141086a2204200541016a360200200720056a200641027441736a3a0000200220002903002203370308200141046a210703400240024002400240200728020020042802002200470d00200041016a22052000490d0520004101742208200520052008491b22084100480d052000450d01200128020020002008102722050d020c060b200128020021050c020b200810262205450d040b2001200536020020072008360200200428020021000b2004200041016a360200200520006a2003a73a0000200342088821032006417f6a22060d000b20022003370308200350450d03200241e0006a24000f0b101e000b20084101102a000b41d498c400104f000b2002200241086a360240200241f098c400360244200241c8006a41146a4100360200200241286a41146a4103360200200241346a4122360200200241106a41146a4103360200200241a886c5003602582002420137024c200241f898c4003602482002412236022c20024203370214200241d480c5003602102002200241c8006a3602382002200241c4006a3602302002200241c0006a3602282002200241286a360220200241106a418099c4001061000b20004101102a000b20044101102a000b20012004360200200141046a2000360200200141086a28020021000b200141086a200041026a360200200420006a2003a74102744101723b0000200241e0006a24000f0b20012004360200200141046a2005360200200141086a28020021000b200141086a200041016a360200200420006a2003a74102743a0000200241e0006a24000bc92c06057f027e027f017e0d7f097e230041b0026b2203240041012104024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200128020022054101460d0020054102470d1520034190016a41026a200141076a2d00003a0000200341286a41086a2204200141186a290200370300200341286a410d6a22062001411d6a290000370000200320012f00053b0190012003200141106a2902003703284128210720022d000120022d000072450d0141b394c30021050c200b200141306a2903002108200141286a2903002109200341246a41026a200141076a2d00003a0000200341086a41086a200141186a290200370300200341086a410d6a2001411d6a290000370000200320012f00053b01242003200141106a290200370308200141086a28020021062001410c6a280200210a20012d0004210b2002411a6a290100210c200241196a2d0000210d200241186a2d0000210e200241166a2f0100210f200241156a2d00002110200241146a2d00002111200241126a2f01002112200241116a2d00002113200241106a2d000021142002410e6a2f010021152002410d6a2d00002116200241046a2d00002117200241026a2f01002118412a21074100210141db94c300210520022d0000450d01410021190c020b200141c0006a2903002108200141386a290300210c200141306a2903002109200141286a290300211a2001410c6a2802002107200141086a280200210520012d000421012003418c016a41026a220220034190016a41026a2d00003a0000200341c0016a41086a2004290300370300200341c0016a410d6a2006290000370000200320032f0190013b018c01200320032903283703c001200141ff01714101470d02200341086a20054106761087012003280208210220032802102005413f7122014d0d0920034188016a41026a200220014105746a220141026a2d00003a0000200341f8006a200141136a290000370300200341fd006a200141186a290000370000200320012f00003b0188012003200129000b370370200128000721072001280003210541012101200328020c0d0a0c0b0b41012104410021014100211920022d00014101470d002002410c6a2d000021012002410a6a2f01002119200241096a2d00002107200241066a2f0100410874200241056a2d000072200241086a2d0000411874722105410021040b201941ffff0371410874200141187472200741ff017172210720040d1c2003200c3703402003200d3a003f2003200e3a003e2003200f3b013c200320103a003b200320113a003a200320123b0138200320133a0037200320143a0036200320153b0134200320163a00332003200736002f2003200536002b200320173a002a200320183b01282003418c016a41026a2201200341246a41026a2d00003a0000200341c0016a41086a2202200341086a41086a290300370300200341c0016a410d6a2205200341086a410d6a290000370000200320032f01243b018c01200320032903083703c0010240200b41ff01714101470d0020034190016a200641067610870120032802900121022003280298012006413f7122014d0d0220034188016a41026a200220014105746a220141026a2d00003a0000200341f8006a200141136a290000370300200341fd006a200141186a290000370000200320012f00003b0188012003200129000b3703702001280007210a20012800032106410121012003280294010d030c040b20034188016a41026a20012d00003a0000200341f0006a41086a2002290300370300200341f0006a410d6a2005290000370000200320032f018c013b018801200320032903c0013703700c040b20034188016a41026a20022d00003a0000200341f0006a41086a200341c0016a41086a290300370300200341f0006a410d6a200341c0016a410d6a290000370000200320032f018c013b018801200320032903c0013703700c090b41002101200328029401450d010b200210230b2001450d010b20034190016a41026a20034188016a41026a2d00003a0000200341c0016a41086a200341f0006a41086a290300370300200341c0016a410d6a200341f0006a410d6a290000370000200320032f0188013b019001200320032903703703c001410021010c010b410121014115210a41d9cac40021060b200341cc006a41026a220220034190016a41026a2d00003a0000200341a0016a41086a2205200341c0016a41086a290300370300200341a0016a41106a200341c0016a41106a290300370300200320032f0190013b014c200320032903c0013703a00102402001450d00200a2107200621050c160b200341e3006a2005290300370000200341e8006a200341ad016a290000370000200320032f014c3b01502003200a36005720032006360053200320032903a00137005b200320022d00003a0052411410262201450d0c200141106a41002800f9b641360000200141086a41002900f1b641370000200141002900e9b64137000020014114413410272201450d0d200120032903283700142001412c6a200341286a41186a290300370000200141246a200341286a41106a2903003700002001411c6a200341286a41086a2903003700004200210c200341c0016a41186a22024200370300200341c0016a41106a22054200370300200341c0016a41086a22074200370300200342003703c00120014134200341c0016a1002200341a0016a41186a2002290300370300200341a0016a41106a2005290300370300200341a0016a41086a2007290300370300200320032903c0013703a001200341a0016a412041a886c500410041001001417f460d06200342003703c801200342003703c001200341a0016a4120200341c0016a4110410010012202417f460d0b2002410f4d0d0b200341c8016a290300211a20032903c001210c2001102341142102411410262201450d070c140b41002101200328020c450d010b200210230b2001450d010b200341086a41026a20034188016a41026a2d00003a0000200341c0016a41086a200341f0006a41086a290300370300200341c0016a410d6a200341f0006a410d6a290000370000200320032f0188013b0108200320032903703703c001410021010c010b410121014115210741d9cac40021050b200341cc006a41026a2202200341086a41026a2d00003a0000200341a0016a41086a2204200341c0016a41086a290300370300200341a0016a41106a200341c0016a41106a290300370300200320032f01083b014c200320032903c0013703a00120010d0f200341e3006a2004290300370000200341e8006a200341ad016a290000370000200320032f014c3b01502003200736005720032005360053200320032903a00137005b200320022d00003a0052411410262201450d0a200141106a41002800f9b641360000200141086a41002900f1b641370000200141002900e9b64137000020014114413410272201450d0b200120032903503700142001412c6a200341d0006a41186a290300370000200141246a200341d0006a41106a2903003700002001411c6a200341d0006a41086a2903003700004200211d200341c0016a41186a22024200370300200341c0016a41106a22054200370300200341c0016a41086a22044200370300200342003703c00120014134200341c0016a1002200341a0016a41186a2002290300370300200341a0016a41106a2005290300370300200341a0016a41086a2004290300370300200320032903c0013703a001200341a0016a412041a886c500410041001001417f460d02200342003703c801200342003703c001200341a0016a4120200341c0016a4110410010012202417f460d082002410f4d0d08200341c8016a290300211b20032903c001211d0c030b4200211a20011023411421024114102622010d0d0b20024101102a000b4200211b0b2001102302400240201d201a5a201b20095a201b20095122011b0d002003201a201d7d3703c00120032009201b7d201a201d54ad7d3703c8012003200341c0016a3602a001200341a0016a107b0c010b201d201a58201b20095820011b0d002003201d201a7d3703c0012003201b20097d201d201a54ad7d3703c8012003200341c0016a3602a001200341a0016a10de010b200341d0006a201a200910df01411810262201450d08200141106a410029008db741370000200141086a4100290085b741370000200141002900fdb64137000020014118413810272201450d0920012003290350370018200141306a200341d0006a41186a290300370000200141286a200341d0006a41106a290300370000200141206a200341d0006a41086a29030037000042002109200341c0016a41186a22024200370300200341c0016a41106a22054200370300200341c0016a41086a22044200370300200342003703c00120014138200341c0016a1002200341a0016a41186a2002290300370300200341a0016a41106a2005290300370300200341a0016a41086a2004290300370300200320032903c0013703a00102400240200341a0016a412041a886c500410041001001417f460d00200342003703c801200342003703c001200341a0016a4120200341c0016a4110410010012202417f460d072002410f4d0d07200341c8016a290300211a20032903c00121090c010b4200211a0b20011023024002402009200c5a201a20085a201a20085122011b0d002003200c20097d3703c00120032008201a7d200c200954ad7d3703c8012003200341c0016a3602a001200341a0016a107b0c010b2009200c58201a20085820011b0d0020032009200c7d3703c0012003201a20087d2009200c54ad7d3703c8012003200341c0016a3602a001200341a0016a10de010b200341d0006a200c200810fe01410021050c0b0b200341d4016a4101360200200341013602a4012003418898c4003602a001200342013702c401200341d497c4003602c0012003200341a0016a3602d001200341c0016a41e0b7c1001061000b41d4aac10041331021000b41144101102a000b41344101102a000b41d4aac10041331021000b41d4aac10041331021000b41144101102a000b41344101102a000b41184101102a000b41384101102a000b200141106a41002800f9b641360000200141086a41002900f1b641370000200141002900e9b6413700000240024002400240024020012002413410272201450d00200120032903503700142001412c6a200341d0006a41186a290300370000200141246a200341d0006a41106a2903003700002001411c6a200341d0006a41086a290300370000200341c0016a41186a22024200370300200341c0016a41106a22054200370300200341c0016a41086a22074200370300200342003703c00120014134200341c0016a1002200341a0016a41186a2002290300370300200341a0016a41106a2005290300370300200341a0016a41086a2007290300370300200320032903c0013703a001024002400240200341a0016a412041a886c500410041001001417f460d00200342003703c801200342003703c001200341a0016a4120200341c0016a4110410010012202417f460d022002410f4d0d02200341c8016a290300211b20032903c001211c0c010b4200211c4200211b0b20011023200341c0016a41086a22014200370300200342003703c0010240024002400240201c201b84221e4200510d0041d8b9c2004114200341c0016a1000200341a0016a41086a2001290300370300200320032903c0013703a001200341a0016a411041a886c500410041001001417f460d02200342003703c801200342003703c001200341a0016a4110200341c0016a4110410010012201417f460d062001410f4d0d06200341c8016a290300211f0c010b41c4b9c2004114200341c0016a1000200341a0016a41086a2001290300370300200320032903c0013703a001200341a0016a411041a886c500410041001001417f460d01200342003703c801200342003703c001200341a0016a4110200341c0016a4110410010012201417f460d062001410f4d0d06200341c8016a290300211f0b20032903c00121200c010b420021204200211f0b0240200920207c222120095422012008201f7c2001ad7c221d200854201d2008511b450d004128210741ecb9c20021050c070b0240200c20217d2222200c56201a201d7d200c202154ad7d220c201a56200c201a511b450d00411d21074182bcc40021050c070b201e4200520d05200341c0016a41086a22014200370300200342003703c0014182b6c100411b200341c0016a1000200341a0016a41086a2001290300370300200320032903c0013703a001200341a0016a411041a886c500410041001001417f460d05200342003703c801200342003703c001200341a0016a4110200341c0016a4110410010012201417f460d042001410f4d0d0420032903c001200956200341c8016a290300221a200856201a2008511b450d05411f2107419fbcc40021050c060b41d4aac10041331021000b41344101102a000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b2003200341286a41022022200c108302024020032802002205450d00200328020421070c010b0240201c20097c221d201c542201201b20087c2001ad7c221a201b54201a201b511b450d00412d210741bebcc40021050c010b024002400240200341286a200341d0006a4120109604450d00200341286a2022200c10df01411410262201450d01200141106a41002800f9b641360000200141086a41002900f1b641370000200141002900e9b64137000020014114413410272201450d02200120032903503700142001412c6a200341d0006a41186a2202290300370000200141246a200341d0006a41106a2903003700002001411c6a200341d0006a41086a290300370000200341c0016a41186a22054200370300200341c0016a41106a22074200370300200341c0016a41086a22044200370300200342003703c00120014134200341c0016a1002200341a0016a41186a2005290300370300200341a0016a41106a2007290300370300200341a0016a41086a2004290300370300200320032903c0013703a001200341a0016a412041a886c50041004100100121052001102302402005417f470d00200341d0006a10e001200341f8016a201a370300200341f0016a201d370300200341c0016a41086a41003a0000200341c9016a2003290350370000200341d1016a200341d0006a41086a290300370000200341d9016a200341e0006a290300370000200341e1016a2002290300370000200341023a00c00141a886c5004100200341c0016a102c0b200341d0006a201d201a10df012003201f3703c801200320203703c0012003200341c0016a3602a001200341a0016a10de01200341c0016a41086a41023a0000200341c9016a2003290328370000200341d1016a200341286a41086a290300370000200341d9016a200341286a41106a290300370000200341e1016a200341286a41186a290300370000200341e9016a2003290350370000200341f1016a200341d0006a41086a290300370000200341f9016a200341d0006a41106a29030037000020034181026a2002290300370000200341023a00c001200341a8026a201f370300200341a0026a202037030020034198026a200837030020034190026a200937030041a886c5004100200341c0016a102c0b410021050c020b41144101102a000b41344101102a000b2000200736020420002005360200200341b0026a24000bb2be0117197f027e107f017e107f017e037f027e107f017e0f7f027e017f027e0a7f027e117f0a7e2e7f017e087f017e197f230041d0036b2203240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001280200417f6a220441094b0d000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040e0a00060304010708050902000b200141086a28020021052001280204210620022d00000d0a4101210720022d00014101470d0a200241196a2d00002104200241186a2d00002108200241166a2f01002109200241156a2d0000210a200241146a2d0000210b200241126a2f0100210c200241116a2d0000210d200241106a2d0000210e2002410e6a2f0100210f2002410d6a2d000021102002410c6a2d000021112002410a6a2f01002112200241096a2d00002113200241086a2d00002114200241066a2f01002115200241056a2d00002116200241046a2d00002117200241026a2f010021182001410c6a2802002119200141146a280200211a200141106a280200211b20032002411a6a29010037038002200320043a00ff01200320083a00fe01200320093b01fc012003200a3a00fb012003200b3a00fa012003200c3b01f8012003200d3a00f7012003200e3a00f6012003200f3b01f401200320103a00f301200320173a00ea01200320183b01e801200320132012410874201141187472723600ef01200320162015410874722014411874723600eb01200320193602b003200320053602ac03200320063602a803200341086a200341e8016a200341a8036a201b201a109b02200328020c21022003280208210441002108200128020022054101470d510c500b200128020421092002411a6a290100211c200241196a2d0000210a200241186a2d0000210b200241166a2f0100210c200241156a2d0000210d200241146a2d0000210e200241126a2f0100210f200241116a2d00002110200241106a2d000021112002410e6a2f010021122002410d6a2d00002113200241046a2d00002114200241026a2f0100211541db94c3002104412a210520022d0000450d0b4101210741002108410021060c0c0b20022d000120022d0000720d07200141086a290300211c200341a8036a41086a22024200370300200342003703a80341d8b3c2004114200341a8036a1000200341d8016a41086a2002290300370300200320032903a8033703d8012003201c3703e801200341d8016a4110200341e8016a410810040c4c0b200141216a290000211d200141206a2d0000211e2001411d6a2f0000211f2001411c6a2d00002120200141196a2f00002121200141186a2d00002122200141156a2f00002123200141146a2d00002124200141106a28020021252001410c6a2802002126200141086a2d00002127200141306a28020021282001412c6a280200210620012d001f212920012d001b212a20012d0017212b20012d000b212c20012f0009212d200128020421082002411a6a290100212e200241196a2d0000212f200241186a2d00002130200241166a2f01002131200241156a2d00002132200241146a2d00002133200241126a2f01002134200241116a2d00002135200241106a2d000021362002410e6a2f010021372002410d6a2d00002138200241046a2d00002139200241026a2f0100213a412a211141db94c300210420022d0000450d0b4101213b4100213c4100213d0c0c0b200128020421152002411a6a290100211c200241196a2d00002109200241186a2d0000210a200241166a2f0100210b200241156a2d0000210c200241146a2d0000210d200241126a2f0100210e200241116a2d0000210f200241106a2d000021102002410e6a2f010021112002410d6a2d00002112200241046a2d00002113200241026a2f0100211441db94c3002104412a210520022d0000450d0c4101210741002108410021060c0d0b20022d000120022d0000720d04200141086a280200210420012d00044101470d11200341e8016a200441067610870120032802e801213e20032802f0012004413f7122024d0d14203e20024105746a2202290018213f20022d0017210720022d0016210a20022f0014210b20022d0013210c20022d0012211220022f0010211420022d000f211520022d000e211620022f000c211a20022d000b2140200228000721412002280003210420022d0002213c20022f000021424101210520032802ec01450d3d0c3c0b200141086a28020021052001280204210620022d00000d0520022d00014101470d052001410c6a2802002118200141146a2802002119200141106a280200211a200241196a2d00002104200241186a2d00002107200241166a2f01002108200241156a2d00002109200241146a2d0000210a200241126a2f0100210b200241116a2d0000210c200241106a2d0000210d2002410e6a2f0100210e2002410d6a2d0000210f2002410c6a2d000021102002410a6a2f01002111200241096a2d00002112200241086a2d00002113200241066a2f01002114200241056a2d00002115200241046a2d00002116200241026a2f0100211720032002411a6a2901003703c003200320043a00bf03200320073a00be03200320083b01bc03200320093a00bb032003200a3a00ba032003200b3b01b8032003200c3a00b7032003200d3a00b6032003200e3b01b4032003200f3a00b303200320163a00aa03200320173b01a803200320122011410874201041187472723600af03200320152014410874722013411874723600ab03200341e8016a200341a8036a104220032d00e8014101470d14200341f4016a2d00002102200341f5016a290000211c200341fd016a280000210420032f00e901210720032d00eb01210820032902ec012143200320034181026a29000037038002200320043602fc012003201c3702f401200320023a00f301200320433700eb01200320083a00ea01200320073b01e801200320183602b003200320053602ac03200320063602a803200341106a200341e8016a200341a8036a201a2019109b0220032802142102200328021021044101210841002107200128020022054101470d4b0c4a0b200141386a290300211c200141306a29030021432001411d6a29000021442001411c6a2d00002145200141196a2f00002146200141186a2d00002147200141156a2f00002148200141146a2d00002149200141116a2f0000214a200141106a2d0000214b2001410c6a280200214c200141086a280200214d200141286a280200214e20012d001b214f20012d0017215020012d0013215120012d0007215220012f0005215320012d000421542002411a6a2901002155200241196a2d00002156200241186a2d00002157200241166a2f01002158200241156a2d00002159200241146a2d0000215a200241126a2f0100215b200241116a2d0000215c200241106a2d0000215d2002410e6a2f0100215e2002410d6a2d0000215f200241046a2d00002160200241026a2f0100216141db94c3002104412a211820022d0000450d0b4101216241002163410021640c0c0b20022d000120022d0000720d0120012802042102200341a8036a41086a22044200370300200342003703a80341b0b3c2004114200341a8036a1000200341d8016a41086a2004290300370300200320032903a8033703d801200320023602e801200341d8016a4110200341e8016a410410040c460b20022d000120022d000072450d0b0b41b394c3002104412821020c480b41db94c3002104412a210241002108410121072005450d4020061023200128020022054101470d460c450b41db94c3002104412a210241012108410021072005450d3f0c340b41012107410021084100210620022d00014101470d002002410c6a2d000021062002410a6a2f01002108200241096a2d00002105200241066a2f0100410874200241056a2d000072200241086a2d0000411874722104410021070b200841ffff0371410874200541ff017172200641187472210220070d3c2003201c370398032003200a3a0097032003200b3a0096032003200c3b0194032003200d3a0093032003200e3a0092032003200f3b019003200320103a008f03200320113a008e03200320123b018c03200320133a008b0320032002360087032003200436008303200320143a008203200320153b018003411610262202450d192002410e6a41002900e1b641370000200241086a41002900dbb641370000200241002900d3b64137000020024116413610272204450d1a20042003290380033700162004412e6a20034180036a41186a290300370000200441266a20034180036a41106a290300370000411e21022004411e6a20034180036a41086a290300370000200341e8016a41186a22054200370300200341e8016a41106a22074200370300200341e8016a41086a22084200370300200342003703e80120044136200341e8016a1002200341a8036a41186a2005290300370300200341a8036a41106a2007290300370300200341a8036a41086a2008290300370300200320032903e8013703a803200341a8036a412041a886c500410041001001210520041023419ebdc20021042005417f470d3c200341a8036a41086a22024200370300200342003703a80341fab4c2004116200341a8036a1000200341d8016a41086a2002290300370300200320032903a8033703d8014100210b0240200341d8016a411041a886c500410041001001417f460d00200341003602e801200341d8016a4110200341e8016a41044100100141016a41044d0d1920032802e801210b0b200341a8036a41086a22024200370300200342003703a80341e8b4c2004112200341a8036a1000200341d8016a41086a2002290300370300200320032903a8033703d8014100210c200341d8016a411041a886c500410041001001417f460d12200342103702ac032003200341d8016a3602a803200341e8016a200341a8036a102820032802e801220d450d1e200341f0016a280200210520032802ec01210c200b2009460d130c140b4101213b4100213c4100213d20022d00014101470d002002410c6a2d0000213c2002410a6a2f0100213d200241096a2d00002111200241066a2f0100410874200241056a2d000072200241086a2d00004118747221044100213b0b203d41ffff0371410874203c41187472201141ff0171722102203b0d3a2003202e3703a8012003202f3a00a701200320303a00a601200320313b01a401200320323a00a301200320333a00a201200320343b01a001200320353a009f01200320363a009e01200320373b019c01200320383a009b0120032002360097012003200436009301200320393a0092012003203a3b019001202741ff01714101470d2f200341e8016a202641067610870120032802e801210420032802f0012026413f7122024d0d08200420024105746a2202290018211d20022d0017211e20022d0016212920022f0014211f20022d0013212020022d0012212a20022f0010212120022d000f212220022d000e212b20022f000c212320022d000b21242002280007213b2002280003213c20022d0002212c20022f0000212d4101211120032802ec01450d2e0c2d0b41012107410021084100210620022d00014101470d002002410c6a2d000021062002410a6a2f01002108200241096a2d00002105200241066a2f0100410874200241056a2d000072200241086a2d0000411874722104410021070b200841ffff0371410874200541ff017172200641187472210220070d382003201c37039803200320093a0097032003200a3a0096032003200b3b0194032003200c3a0093032003200d3a0092032003200e3b0190032003200f3a008f03200320103a008e03200320113b018c03200320123a008b0320032002360087032003200436008303200320133a008203200320143b018003200341a8036a41086a22024200370300200342003703a80341c4b3c2004114200341a8036a1000200341d8016a41086a2002290300370300200320032903a8033703d801200341d8016a411041a886c500410041001001417f460d0341e8bcc2002104411e21020c380b41012162410021634100216420022d00014101470d002002410c6a2d000021642002410a6a2f01002163200241096a2d00002118200241066a2f0100410874200241056a2d000072200241086a2d0000411874722104410021620b206341ffff0371410874201841ff017172206441187472210220620d36200320553703f002200320563a00ef02200320573a00ee02200320583b01ec02200320593a00eb022003205a3a00ea022003205b3b01e8022003205c3a00e7022003205d3a00e6022003205e3b01e4022003205f3a00e302200320023600df02200320043600db02200320603a00da02200320613b01d8022043201c844200510d03205441ff01714101470d28200341e8016a204d41067610870120032802e801210420032802f001204d413f7122024d0d0a200420024105746a2202290018214420022d0017214520022d0016214f20022f0014214620022d0013214720022d0012215020022f0010214820022d000f214920022d000e215120022f000c214a20022d000b214b200228000721622002280003216320022d0002215220022f000021534101211820032802ec01450d270c260b200141086a290300211c200341a8036a41086a22024200370300200342003703a8034194b4c200411c200341a8036a1000200341d8016a41086a2002290300370300200320032903a8033703d8012003201c3703e801200341d8016a4110200341e8016a410810040c390b411310262202450d132002410f6a41002800c5b542360000200241086a41002900beb542370000200241002900b6b54237000020024113413310272204450d142004200329038003370013411821022004412b6a20034180036a41186a290300370000200441236a20034180036a41106a2903003700002004411b6a20034180036a41086a290300370000200341e8016a41186a22054200370300200341e8016a41106a22074200370300200341e8016a41086a22084200370300200342003703e80120044133200341e8016a1002200341a8036a41186a2005290300370300200341a8036a41106a2007290300370300200341a8036a41086a2008290300370300200320032903e8013703a803200341a8036a412041a886c5004100410010012105200410232005417f460d09200341a8036a2015410676109102410021052015413f71220420032802b0034f0d0520032802a803200441216c6a22042d00004101470d0520042f00012107200441196a290000211c200441186a2d00002108200441176a2d00002106200441156a2f00002109200441146a2d0000210a200441136a2d0000210b200441116a2f0000210c200441106a2d0000210d2004410f6a2d0000210e2004410d6a2f0000210f2004410c6a2d00002110200441086a2800002111200441046a2800002112200441036a2d000021044101210520032802ac030d060c070b2001410c6a2802002102200141106a2d00002140200141116a2f0000211a200141146a2d00002115200141156a2f00002114200141186a2d0000210c200141196a2f0000210b2001411c6a2d000021072001411d6a290000213f20012f0005214220012d0007213c20012d0013211620012d0017211220012d001b210a0c2c0b41f0bdc200210441d00021020c320b4100211120032802ec010d240c250b4100210520032802ec010d270c280b4194bac2002104410b2102410121084100210720050d250c300b20032802ac03450d010b20032802a80310230b2005450d052003201c37038002200320083a00ff01200320063a00fe01200320093b01fc012003200a3a00fb012003200b3a00fa012003200c3b01f8012003200d3a00f7012003200e3a00f6012003200f3b01f401200320103a00f301200320113600ef01200320123600eb01200320043a00ea01200320073b01e801200341e8016a20034180036a4120109604450d0641b7bcc2002104411921020c2c0b4100211820032802ec010d1b0c1c0b4186bdc20021040c2a0b4101210d41002105200b2009470d010b20052009460d0c0b41bcbdc200210441162102200520094d0d0c20034180026a4200370300200341f8016a4200370300200341f0016a4200370300200342003703e801200d20094105746a2207200341e8016a460d0b2007200341e8016a41201096040d0c0c0b0b41d0bcc20021040c260b20034180036a2015109c024200211c200341a8036a41086a22024200370300200342003703a80341a5bcc2004112200341a8036a1000200341d8016a41086a22042002290300370300200320032903a8033703d80102400240200341d8016a411041a886c500410041001001417f460d00200342003703b003200342003703a803200341d8016a4110200341a8036a4110410010012205417f460d0a2005410f4d0d0a200341b0036a290300214320032903a80321550c010b42002155420021430b20034180036a20552043102b200342e3ded5f3b6ac9ab6f3003703900120024200370300200342003703a80341af98c300410d200341a8036a100020042002290300370300200320032903a8033703d8010240200341d8016a411041a886c500410041001001417f460d00200342003703a803200341d8016a4110200341a8036a41084100100141016a41084d0d0720032903a803211c0b2003201c3703b801200341a8036a20034180036a10800220032802ac03210420032802a803210220032802b0032105200341bc036a20034190016a36020020032002200541286c6a3602b403200320023602b003200320043602ac03200320023602a8032003200341b8016a3602b803200341d8026a200341a8036a109d02200341a8036a41086a200341d8026a41086a280200360200200320032903d8023703a80320034180036a200341a8036a1087020c290b200341fc016a4101360200200341013602ac032003418898c4003602a803200342013702ec01200341d497c4003602e8012003200341a8036a3602f801200341e8016a41b4b9c2001061000b41d4aac10041331021000b41164101102a000b41364101102a000b41134101102a000b41334101102a000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b4200211c200341a8036a41086a22024200370300200342003703a80341a1b5c2004115200341a8036a1000200341d8016a41086a2002290300370300200320032903a8033703d80102400240200341d8016a411041a886c500410041001001417f460d00200342003703f001200342003703e801200341d8016a4110200341e8016a4110410010012202417f460d042002410f4d0d04200341f0016a290300211c20032903e80121430c010b420921430b200341386a20034180036a2043201c105b2003280238450d0141d2bdc2002104411e21020b200c450d1a200d10230c1a0b200341a8036a41086a22024200370300200342003703a8034190b5c2004111200341a8036a1000200341d8016a41086a2002290300370300200320032903a8033703d801410021070240200341d8016a411041a886c500410041001001417f460d00200341003602e801200341d8016a4110200341e8016a41044100100141016a41044d0d0220032802e80121070b411610262202450d022002410e6a41002900e1b641370000200241086a41002900dbb641370000200241002900d3b64137000020024116413610272202450d0320022003290380033700162002412e6a20034180036a41186a290300370000200241266a20034180036a41106a2903003700002002411e6a20034180036a41086a290300370000200341e8016a41186a22044200370300200341e8016a41106a22084200370300200341e8016a41086a22064200370300200342003703e80120024136200341e8016a1002200341a8036a41186a2004290300370300200341a8036a41106a2008290300370300200341a8036a41086a2006290300370300200320032903e8013703a803410410262204450d042004200736000020044104410810272204450d0520042009360004200341a8036a4120200441081004200410232002102302400240024020052009470d00200341e8016a41186a220420034180036a41186a290300370300200341e8016a41106a220520034180036a41106a290300370300200341e8016a41086a220720034180036a41086a29030037030020032003290380033703e801200c2009470d0a200941016a22022009490d1720094101742208200220022008491b220cad420586221c422088a70d17201ca722024100480d172009450d01200d200941057420021027220d450d020c0a0b200341e8016a41186a220420034180036a41186a290300370300200341e8016a41106a220720034180036a41106a290300370300200341e8016a41086a220820034180036a41086a29030037030020032003290380033703e801200520094d0d08200d20094105746a220220032903e801370000200241186a2004290300370000200241106a2007290300370000200241086a20082903003700000c0a0b20021026220d0d080b20024101102a000b41d4aac10041331021000b41d4aac10041331021000b41164101102a000b41364101102a000b41044101102a000b41084101102a000b41d8b4c200200920051029000b200d20094105746a220220032903e801370000200241186a2004290300370000200241106a2005290300370000200241086a2007290300370000200941016a21050b200341a8036a41086a22024200370300200342003703a80341e8b4c2004112200341a8036a1000200341d8016a41086a2002290300370300200320032903a8033703d801200341003602f001200342013703e801200320053602a803200341a8036a200341e8016a10410240024002402005450d00200541057421064100200341e8016a41086a28020022046b210720032802e801210920032802ec012108200d210203400240200820076a411f4b0d00200441206a22052004490d102008410174220a20052005200a491b22054100480d10024002402008450d00200920082005102722090d010c060b200510262209450d050b200521080b200920046a22052002290000370000200541186a200241186a290000370000200541106a200241106a290000370000200541086a200241086a290000370000200741606a2107200441206a2104200241206a2102200641606a22060d000b200341f0016a2004360200200320083602ec01200320093602e8010c010b200341e8016a41086a280200210420032802ec01210820032802e80121090b200341d8016a411020092004100402402008450d00200910230b0240200c450d00200d10230b200341a8036a41086a22024200370300200342003703a80341fab4c2004116200341a8036a1000200341d8016a41086a2002290300370300200320032903a8033703d801410121072003200b41016a3602e801200341d8016a4110200341e8016a41041004410021040c160b20054101102a000b200410230b206341d9cac40020181b21042062411520181b21022018450d0e2004214d2002214c0b2003204437039803200320453a0097032003204f3a009603200320463b019403200320473a009303200320503a009203200320483b019003200320493a008f03200320513a008e032003204a3b018c032003204b3a008b032003204c360087032003204d36008303200320523a008203200320533b018003200341a8036a41086a22024200370300200342003703a8034190b5c2004111200341a8036a1000200341d8016a41086a2002290300370300200320032903a8033703d80141002102024002400240024002400240024002400240024002400240200341d8016a411041a886c500410041001001417f460d00200341003602e801200341d8016a4110200341e8016a41044100100141016a41044d0d0120032802e80121020b02400240024002402002204e470d00200341a8036a41086a22024200370300200342003703a80341c4b3c2004114200341a8036a1000200341d8016a41086a2002290300370300200320032903a8033703d801200341d8016a411041a886c500410041001001417f460d012003200341d8016a3602a803200341103602ac03200342003703e80120034100200341d8016a4110200341e8016a41084100100122022002417f461b22024108200241084922041b22023602b00320040d06200341003602e801200341b0036a4100200341d8016a4110200341e8016a41042002100122042004417f461b22044104200441044922041b20026a36020020040d06200341e8016a200341a8036a102820032802e8012262450d0620032902ec01214442002155200341a8036a41086a22024200370300200342003703a8034190c1c200411c200341a8036a1000200341d8016a41086a2002290300370300200320032903a8033703d801200341d8016a411041a886c500410041001001417f460d02200342003703f001200342003703e801200341d8016a4110200341e8016a4110410010012202417f460d072002410f4d0d07200341f0016a290300215520032903e80121650c030b41edbec2002104411121020c1b0b41c0bec2002104412d21020c1a0b420121650b200341a8036a41086a22024200370300200342003703a80341acc1c2004112200341a8036a1000200341d8016a41086a2002290300370300200320032903a8033703d801410021020240200341d8016a411041a886c500410041001001417f460d00200341003602e801200341d8016a4110200341e8016a41044100100141016a41044d0d0220032802e80121020b20034180016a206520552002ad4200109804411410262202450d0520034180016a41086a29030021552003290380012165200241106a41002800f9b641360000200241086a41002900f1b641370000200241002900e9b64137000020024114413410272202450d06200220032903d8023700142002412c6a200341d8026a41186a290300370000200241246a200341d8026a41106a2903003700002002411c6a200341d8026a41086a29030037000042002168200341e8016a41186a22044200370300200341e8016a41106a22184200370300200341e8016a41086a22634200370300200342003703e80120024134200341e8016a1002200341a8036a41186a2004290300370300200341a8036a41106a2018290300370300200341a8036a41086a2063290300370300200320032903e8013703a80302400240200341a8036a412041a886c500410041001001417f460d00200342003703f001200342003703e801200341a8036a4120200341e8016a4110410010012204417f460d062004410f4d0d06200341f0016a290300216920032903e80121680c010b420021690b2002102302402068206554206920555420692055511b450d0041afbfc2002104412e21022044a70d180c190b200341a8036a41086a22024200370300200342003703a80341c2b4c2004113200341a8036a1000200341d8016a41086a2002290300370300200320032903a8033703d8010240024002400240024002400240200341d8016a411041a886c500410041001001417f460d00200342103702ac032003200341d8016a3602a803200341e8016a200341a8036a108b0220032802e8012218450d0e200341e8016a41086a2802002263450d0f20032802ec0121644180c0c2002104412321022018290300204354201841086a2903002269201c542069201c511b450d0341082158200341a8036a41086a22044200370300200342003703a8034195b7c1004115200341a8036a1000200341d8016a41086a2004290300370300200320032903a8033703d80141002159200341d8016a411041a886c500410041001001417f460d01200342103702ac032003200341d8016a3602a803200341e8016a200341a8036a10890220032802e8012258450d10200341f0016a280200215a20032802ec0121590c020b41febec2002104413121022044a70d1d0c1e0b4100215a0b2058205a41286c6a2157205821044100214d024002400240024002400340205720046b419f014d0d01200420034180036a460d02204d200420034180036a412010960422564100476a214d2056450d02200441286a225620034180036a460d02204d205620034180036a412010960422564100476a214d2056450d02200441d0006a225620034180036a460d02204d205620034180036a412010960422564100476a214d2056450d02200441f8006a225620034180036a460d02200441a0016a2104204d205620034180036a412010960422564100476a214d20560d000c020b0b20572004460d012058205a41286c6a2157034020034180036a2004460d01204d200420034180036a412010960422564100476a214d2056450d012057200441286a2204470d000c020b0b204d2044422088a74f0d010b02402059450d00205810230b20034190016a108c02200341e8016a20034180036a10ef0120032802e8014101470d01200328029001214d2003280298012204450d0520032802ec01216a4121216b204d200441216c6a216c4108216d200341f0016a2802002204410876216e4101216f41012004411f71742170417f217120044105764107712272417f732173420021744201217520034190026a217641202177200341e8016a41206a217841182179200341e8016a41186a217a4110217b20034194026a217c4111217d4190b5c200217e4100217f41a886c500218001411221810141d9c0c200218201419701218301410221840141042185014200216842002169204d2186014101213c0c100b41a3c0c2002104413621022059450d012058102320640d020c030b0240200328029401450d0020032802900110230b41ddbfc20021040b2064450d010b201810230b2044a7450d190c180b4200216842002169410021040c120b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41144101102a000b41344101102a000b41d4aac10041331021000b41ecb3c200410041001029000b41d4aac10041331021000b410121040c070b200410230b203c41d9cac40020111b2104203b411520111b21022011450d0b20042126200221250b2003201d3703d0012003201e3a00cf01200320293a00ce012003201f3b01cc01200320203a00cb012003202a3a00ca01200320213b01c801200320223a00c7012003202b3a00c601200320233b01c401200320243a00c301200320253600bf01200320263600bb012003202c3a00ba012003202d3b01b801200341a8036a41086a22024200370300200342003703a80341c4b3c2004114200341a8036a1000200341d8016a41086a2002290300370300200320032903a8033703d8010240200341d8016a411041a886c500410041001001417f460d00419fbac2002104412621020c0b0b200341e8016a20034190016a108e02024002400240024002400240024020032903e8014201520d00200341e8016a200341b8016a108e0220032903e8014201520d0120034190026a2802002124200341a8036a41086a22024200370300200342003703a8034190b5c2004111200341a8036a1000200341d8016a41086a2002290300370300200320032903a8033703d801410021110240200341d8016a411041a886c500410041001001417f460d00200341003602e801200341d8016a4110200341e8016a41044100100141016a41044d0d0520032802e80121110b41f3bac20021044116210220112028470d11200341a8036a41086a22044200370300200342003703a80341d4bbc200411b200341a8036a1000200341d8016a41086a2004290300370300200320032903a8033703d801200341d8016a411041a886c500410041001001417f460d02200341003602e801200341d8016a4110200341e8016a41044100100141016a41044d0d0520032802e80120246a20284f0d030c060b41c5bac2002104411821020c100b41a8bbc2002104412c21020c0f0b410120246a2028490d030b4189bbc2002104411f21020c0d0b41d4aac10041331021000b41d4aac10041331021000b200341e8016a2008410676109102410021110240024002402008413f71220420032802f0014f0d0020032802e801200441216c6a22042d00004101470d0020042f0001213b200441196a290000211d200441186a2d0000213c200441176a2d0000213d200441156a2f00002126200441146a2d0000211e200441136a2d0000211f200441116a2f00002120200441106a2d000021212004410f6a2d000021222004410d6a2f000021232004410c6a2d00002129200441086a280000212a200441046a280000212b200441036a2d000021044101211120032802ec010d010c020b20032802ec01450d010b20032802e80110230b02400240024002402011450d002003201d3703f0022003203c3a00ef022003203d3a00ee02200320263b01ec022003201e3a00eb022003201f3a00ea02200320203b01e802200320213a00e702200320223a00e602200320233b01e402200320293a00e3022003202a3600df022003202b3600db02200320043a00da022003203b3b01d802200341e8016a2006410676109102410021112006413f71220420032802f0014f0d0120032802e801200441216c6a22042d00004101470d0120042f0001213b200441196a290000211d200441186a2d0000213c200441176a2d0000213d200441156a2f00002126200441146a2d0000211e200441136a2d0000211f200441116a2f00002120200441106a2d000021212004410f6a2d000021222004410d6a2f000021232004410c6a2d00002129200441086a280000212a200441046a280000212b200441036a2d000021044101211120032802ec010d020c030b41ddbac20021040c0d0b20032802ec01450d010b20032802e80110230b024002402011450d002003201d370398032003203c3a0097032003203d3a009603200320263b0194032003201e3a0093032003201f3a009203200320203b019003200320213a008f03200320223a008e03200320233b018c03200320293a008b032003202a360087032003202b36008303200320043a0082032003203b3b018003200341d8026a20034190016a4120109604450d014183bcc2002104411221020c0c0b41efbbc2002104411421020c0b0b024020034180036a200341b8016a4120109604450d004195bcc2002104411021020c0b0b4118212f200341e8016a41186a22a501200341b8016a41186a22a60129030037030041102127200341e8016a41106a22a701200341b8016a41106a22a8012903003703004108212c200341e8016a41086a22a901200341b8016a41086a22aa01290300370300410021042003410036028802200320032903b8013703e801200341a8036a200341e8016a108d020240024020032802b0032223450d0041012111410021ab01417f211e4102212a4120213b200341e8016a41206a21ac0141042129411f2126411e211f411d2120411c2121411b21ad01411a21ae01411921af01411721b001411621b101411521b201411421b301411321b401411221b50141112128410f213a410e2139410d2138410c2137410b2136410a21354109213441ff0121334107213241062131410521304103213d417c21224100212b4100212d41012125410021b6010c010b410121254100212d0c070b4103213c410121040c040b20061023200128020022054101470d100c0f0b203e10230b200441d9cac40020051b21042041411520051b21022005450d070b2003203f3703d001200320073a00cf012003200a3a00ce012003200b3b01cc012003200c3a00cb01200320123a00ca01200320143b01c801200320153a00c701200320163a00c6012003201a3b01c401200320403a00c301200320023600bf01200320043600bb012003203c3a00ba01200320423b01b80141082105200341a8036a41086a22044200370300200342003703a8034195b7c1004115200341a8036a1000200341d8016a41086a2004290300370300200320032903a8033703d8014100210b024002400240024002400240024002400240200341d8016a411041a886c500410041001001417f460d00200342103702ac032003200341d8016a3602a803200341e8016a200341a8036a10890220032802e8012205450d0620032802ec01210b41282107200341f0016a280200221241286c220c0d010c020b4100211241282107410041286c220c450d010b4100210a0340200341e8016a41206a2005200a6a220441206a290300370300200341e8016a41186a200441186a290300370300200341e8016a41106a200441106a290300370300200341e8016a41086a200441086a290300370300200320042903003703e801200341e8016a200341b8016a41201096040d02200c200a20076a220a470d000b0b4108210741002112200b450d01200510234100210a0c0f0b200341a8036a41206a2207200341e8016a41206a290300370300200341a8036a41186a220c200341e8016a41186a290300370300200341a8036a41106a2214200341e8016a41106a290300370300200341a8036a41086a2215200341e8016a41086a290300370300200320032903e8013703a80320034180036a41206a2216200729030037030020034180036a41186a2207200c29030037030020034180036a41106a220c201429030037030020034180036a41086a22142015290300370300200320032903a80337038003200341d8026a41206a22152016290300370300200341d8026a41186a22162007290300370300200341d8026a41106a221a200c290300370300200341d8026a41086a220c201429030037030020032003290380033703d802412810262207450d03200720032903d802370300200741206a2015290300370300200741186a2016290300370300200741106a201a290300370300200741086a200c290300370300201241286c41586a200a460d01200441286a21424128211a2005201241286c6a224041586a21414101213e4120210c411821164110211541082114422821664220213f41002167410121124101210a4100213c0c040b4100210a0c0d0b410121124101210a0c0b0b41d4aac10041331021000b41284108102a000b410121040b034002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040e020001010b2018206341306c6a2157201821040240024002400340205720046b41bf014d0d0141012156200441106a223c20034180036a460d02203c20034180036a4120109604450d02200441c0006a223c20034180036a460d02203c20034180036a4120109604450d02200441f0006a223c20034180036a460d02203c20034180036a4120109604450d02200441a0016a223c20034180036a460d02200441c0016a2104203c20034180036a41201096040d000c020b0b024020042057460d00034041012156200441106a220420034180036a460d02200420034180036a4120109604450d02200441206a22042057470d000b0b4100215620682043852069201c85844200520d0020034180036a41086a290300211d20034180036a41106a290300212e20034180036a41186a290300219001200329038003218b012018201c37030820182043370300200341e8016a41186a209001370300200341e8016a41106a202e370300200341e8016a41086a201d3703002018208b01370310201841186a201d370300201841206a202e370300201841286a2090013703002003208b013703e801206341144b0d01410221910120634102490d1d417f2192012063417f6a21930141302194012018206341306c6a21950141082196014128219701411821980141202199014110219a014103219b0141e800219c014150219d014178219e014170219f01416821a001416021a101415821a201413821a301410121a4014102213c0c0f0b200341c0006a200341d8026a206520551084022003290340211c2003200341c8006a2903003703f0012003201c3703e80141ebc0c2004181c1c20020561b21044116410f20561b21022003200341e8016a3602a803200341a8036a10de0141012105200328029401450d220c210b206341017622be01ad42307e22bf01422088a70d0120bf01a72204417f4c0d01410821090240024002402004450d002004102622c001450d0220c00121c1010c010b410821c001410821c1010b41502113201841506a21c20141302117201841306a21c301201841f07e6a21c401410021c501410421c601417f21c70141012119420321c801422021bf01410321c901410221ca01417d21cb01415821cc01412821104120210f4118210d4110210e417e21cd01417421ce01416421cf0141a87f21d00141a07f21d101410921d20141e80021d301417821d401417021d501416821d601416021d701413821d801410a21d901410421da01410021db01410021dc01206321dd014104213c0c100b20044108102a000b024002400240024002400240024002400240203c0e050001020304040b2042210402400340200341e8016a200c6a223c2004200c6a290300370300200341e8016a20166a2256200420166a290300370300200341e8016a20156a2257200420156a290300370300200341e8016a20146a2258200420146a290300370300200320042903003703e801200341e8016a200341b8016a200c1096040d0120402004201a6a2204470d000c2e0b0b200341a8036a200c6a2242203c290300370300200341a8036a20166a22592056290300370300200341a8036a20156a225a2057290300370300200341a8036a20146a225b2058290300370300200320032903e8013703a80320034180036a200c6a225c204229030037030020034180036a20166a2242205929030037030020034180036a20156a2259205a29030037030020034180036a20146a225a205b290300370300200320032903a80337038003203c205c29030037030020562042290300370300205720592903003703002058205a29030037030020032003290380033703e8010240200a2012470d002012203e6a220a2012490d262012203e742242200a200a2042491b220aad20667e221d203f88a70d26201da722422067480d2602402012450d0020072012201a6c2042102722070d010c060b204210262207450d050b2004201a6a214220072012201a6c6a225920032903e8013703002059200c6a203c290300370300205920166a2056290300370300205920156a2057290300370300205920146a20582903003703002012203e6a211220412004470d0e0c2c0b02402086012d0000206f470d00200341e8016a208601206f6a2257108e0220032903e8012075520d002076280200206a490d002078290300218701207a290300218801200341e8016a207b6a290300218901200341e8016a206d6a290300218a01207c2802002104200341a8036a206d6a22582074370300200320743703a803207e207d200341a8036a1000200341d8016a206d6a22592058290300370300200320032903a8033703d80102400240200341d8016a207b208001207f207f10012071460d002003207f3602a803200341d8016a207b200341a8036a208501207f1001206f6a2085014d0d0720032802a80321560c010b410021560b20582074370300200320743703a803208201208101200341a8036a100020592058290300370300200320032903a8033703d8010240024002400240200341d8016a207b208001207f207f10012071460d002003207f3602a803200341d8016a207b200341a8036a208501207f1001206f6a2085014d0d0a20032802a8032159205620046b2204208301490d020c010b41182159205620046b2204208301490d010b200341e0006a2088012087012059ad2074109804200341e0006a206d6a290300218b012003290360218c010c010b02402004450d002059ad221d20757c228d01201d54ad218e014200218c01208801211d208701212e4200218b010340200341f0006a201d202e208d01208e011097042074202e200341f0006a206d6a2903007d201d2003290370228f0154ad7d229001201d208f017d228f01201d56209001202e56209001202e511b22561b222e208b017c2074208f0120561b221d208c017c228c01201d54ad7c218b01200420716a22040d000c020b0b4200218c014200218b010b200341a8036a20796a205720796a290000370300200341a8036a207b6a2057207b6a29000037030020582057206d6a2900003703002057290000211d200341a8036a20776a206e3602002003201d3703a803200341b8016a200341a8036a108d024200211d4200212e02402072200341b8016a206d6a28020022044f0d00200420736a225620044f0d082087012089017c208801208a017c221d20880154ad7c208b017c201d208c017c229001201d54ad7c207420032802b8012056208401746a28020020707122041b212e209001207420041b211d0b024020032802bc01450d0020032802b80110230b202e20697c201d20687c2268201d54ad7c21690b208601206b6a228601206c470d0e0c100b206320930122042092016a229301490d08024020632093016b2256209101490d00201820042094016c6a220429030020182093012094016c6a223c2903002290015a20042096016a2257290300222e203c2096016a2258290300221d5a202e201d511b0d00200341e8016a2098016a225a203c2097016a2259290300370300200341e8016a209a016a225b203c2099016a225c290300370300200341e8016a2096016a225d203c2098016a225e2903003703002003203c2903103703e801203c200429030037030020582057290300370300203c209a016a2004209a016a290300370300205e20042098016a290300370300205c20042099016a290300370300205920042097016a2903003703004101215702402056209b01490d00203c2903602090015a203c209c016a290300222e201d5a202e201d511b0d004103215720950121580240034020582204209d016a20042903003703002004209e016a20042097016a2903003703002004209f016a20042099016a290300370300200420a0016a20042098016a290300370300200420a1016a2004209a016a290300370300200420a2016a20042096016a2903003703002057225920564f0d01205920a4016a215720042094016a22582903002090015a200420a3016a290300222e201d5a202e201d511b450d000b0b20592092016a21570b20042090013703002004201d370308203c20572094016c6a22042097016a205a29030037030020042099016a205b29030037030020042098016a205d290300370300200420032903e8013703100b209501209d016a2195012093010d0e0c200b2023201e4c0d0520032802ac0321b90120032802a80321ba012023102622b801450d0602402023202a742204450d0020ba0120046a21bb01410021b70120ba0121bc01410021bd010c1c0b410021b7010c200b20dd0121de01410021dd01410121df0120de0120c7016a221b450d1302400240024002400240024002402018201b20176c6a2204290300201820de0120176c22576a223c20d1016a290300222e54200420096a290300229001203c20d0016a290300221d54209001201d511b450d0020c40120576a21040340201b2019460d02202e2004290300228b0154213c201d200420096a2903002290015121df01201d209001542156200420136a2104201b20c7016a211b208b01212e209001211d203c205620df011b0d000c030b0b20de0120cd016a215820c40120576a2104410021dd014100213c03402058203c460d05202e2004290300228b015a21df01201d200420096a290300229001512156201d2090015a2157200420136a2104203c20196a213c208b01212e209001211d20df01205720561b0d000b203c20196a21df0120de01203c6b20c7016a221b0d030c020b4100211b0b20de01201b490d0b20de0120634b0d0d024020de01201b6b22df012019762256450d0020c20120576a21042018201b20176c6a213c0340200341e8016a20106a2257203c20106a2258290300370300200341e8016a200f6a2259203c200f6a225a290300370300200341e8016a200d6a225b203c200d6a225c290300370300200341e8016a200e6a225d203c200e6a225e290300370300200341e8016a20096a225f203c20096a22602903003703002003203c2903003703e801200420096a2261290300211d2004200e6a2245290300212e2004200d6a22462903002190012004200f6a2247290300218b012004290300218c012058200420106a2248290300370300205a208b01370300205c209001370300205e202e3703002060201d370300203c208c0137030020482057290300370300204720592903003703002046205b2903003703002045205d2903003703002061205f290300370300200420032903e801370300203c20176a213c200420136a2104205620c7016a22560d000b0b201b0d010b201b21dd0120db0120dc01460d1b0c1c0b20df0120d2014b0d0120de0120634b0d0a20c301201b20176c6a21e001410121bd010c1d0b20de0121df0120db0120dc01460d150c160b201b21dd0120db0120dc01470d170c160b20424108102a000b41d4aac10041331021000b41d4aac10041331021000b41ecb3c200205620041029000b101d000b20234101102a000b20930120631048000b201b20de011048000b20de01201b417f6a22dd01490d140b20de012063108c01000b4100213c0c030b4101213c0c030b4102213c0c040b410021040c120b410121040c110b410121040c100b410121040c0f0b410121040c0e0b410121040c0d0b410021040c080b410121040c070b410221040c060b410121040c050b410221040c040b410121040c030b410221040c020b410321040c010b410321040b034002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040e0400010204040b20db0120dc01470d15410121040c1a0b20db0120196a220420db01490d1e20db01201974223c20042004203c491b2204ad20c80186221d20bf0188a70d1e201da7223c20c501480d1e0240024020db01450d0020da0120db0120c90174203c102722da010d010c030b203c102622da01450d020b200421db01410221040c190b20da0120dc0120c901746a220420df01360204200420dd0136020020dc0120196a22e10121dc0120e10120ca01490d02410221bd010c170b203c4104102a000b02400240024020bd010e03000102020b20bc01280200213c203b10262204450d0520bc0120296a21bc012004203c2026763a001f2004203c2011713a00002004203c201f762011713a001e2004203c2020762011713a001d2004203c2021762011713a001c2004203c20ad01762011713a001b2004203c20ae01762011713a001a2004203c20af01762011713a00192004203c202f762011713a00182004203c20b001762011713a00172004203c20b101762011713a00162004203c20b201762011713a00152004203c20b301762011713a00142004203c20b401762011713a00132004203c20b501762011713a00122004203c2028762011713a00112004203c2027762011713a00102004203c203a762011713a000f2004203c2039762011713a000e2004203c2038762011713a000d2004203c2037762011713a000c2004203c2036762011713a000b2004203c2035762011713a000a2004203c2034762011713a00092004203c202c762011713a00082004203c203371223c2032763a00072004203c2031762011713a00062004203c2030762011713a00052004203c2029762011713a00042004203c203d762011713a00032004203c202a762011713a00022004203c2011762011713a00014100215602400240024002400240024002400340200420566a223c203b6a20046b203d4d0d01203c20266a2d00000d02203c201f6a2d00000d03203c20206a2d00000d04205620226a2156203c20216a2d0000450d000b2056203b6a20116a22560d050c060b2056203b6a213c0340203c450d062004203c6a2156203c201e6a2257213c2056201e6a2d0000450d000c040b0b205620266a20116a22560d030c040b2056201f6a20116a22560d020c030b205620206a21570b205720116a2256450d010b0240202320b7016b2056203b2056203b491b223c4f0d0020b701203c6a223c20b701490d1f20232011742257203c203c2057491b223c20ab01480d1f024002402023450d0020b8012023203c102722b8010d010c0a0b203c102622b801450d090b203c21230b20b80120b7016a21574100213c02400340203c203b460d012057203c6a2004203c6a2d00002011713a00002056203c20116a223c470d000b0b20b701203c6a21b7010b2004102320bc0120bb01470d0f0c1b0b20de01201b20c7016a22dd01490d18024020de0120dd016b22df0120ca01490d002018201b20176c6a2204290300201820dd0120176c6a223c2903002290015a200420096a2256290300222e203c20096a2257290300221d5a202e201d511b0d00200341e8016a200d6a2259203c20106a2258290300370300200341e8016a200e6a225a203c200f6a225b290300370300200341e8016a20096a225c203c200d6a225d2903003703002003203c2903103703e801203c200429030037030020572056290300370300203c200e6a2004200e6a290300370300205d2004200d6a290300370300205b2004200f6a2903003703002058200420106a29030037030041012156024020df0120c901490d00203c2903602090015a203c20d3016a290300222e201d5a202e201d511b0d004103215620e0012157024003402057220420136a2004290300370300200420d4016a200420106a290300370300200420d5016a2004200f6a290300370300200420d6016a2004200d6a290300370300200420d7016a2004200e6a290300370300200420cc016a200420096a2903003703002056225820df014f0d01205820196a2156200420176a22572903002090015a200420d8016a290300222e201d5a202e201d511b450d000b0b205820c7016a21560b20042090013703002004201d370308203c205620176c6a220420106a20592903003703002004200f6a205a2903003703002004200d6a205c290300370300200420032903e8013703100b20dd01450d1120e00120136a21e00120dd01211b20df0120d901490d0f410021040c170b024002400240024020da0120e101225b20c7016a22e10120c901746a2204280200450d0020da01205b20c901746a225820ce016a28020022572004280204223c4d0d00410221dc01205b41024d0d0420da01205b20cb016a220420c901746a2802042256203c20576a4d0d01410321dc01205b41034d0d04205820cf016a280200205620576a4d0d010c050b205b20c901490d012004280204213c20da01205b20cb016a220420c901746a28020421560b2056203c490d010b205b20cd016a21040b205b200420196a22604d0d05205b20044d0d0620da01200420c901746a225d2802042261205d2802006a220420da01206020c901746a225e280200225f490d07200420634b0d08205d20c6016a21452018205f20176c6a225a205e280204225c20176c223c6a2156200420176c21dc01024002400240024002402004205f6b2258205c6b2204205c4f0d0020c0012056200420176c223c1094041a20c101203c6a2157205c2019480d0120042019480d0120c20120dc016a21dc0120562104034020dc01200420136a2256205720136a22582058290300205629030054205720cc016a290300221d200420cc016a290300222e54201d202e511b22591b223c29030037030020dc0120106a203c20106a29030037030020dc01200f6a203c200f6a29030037030020dc01200d6a203c200d6a29030037030020dc01200e6a203c200e6a29030037030020dc0120096a203c20096a2903003703002057205820591b2157205a2056200420591b22044f0d0420dc0120136a21dc0120c101213c20c1012057490d000c050b0b20c001205a203c1094041a20c101203c6a2157205c2019480d012058205c4c0d01201820dc016a215920c101213c205a2104034020042056203c2056290300203c29030054205620096a290300221d203c20096a290300222e54201d202e511b22581b22dc01290300370300200420106a20dc0120106a2903003703002004200f6a20dc01200f6a2903003703002004200d6a20dc01200d6a2903003703002004200e6a20dc01200e6a290300370300200420096a20dc0120096a290300370300203c203c20176a20581b213c200420176a2104205620176a205620581b225620594f0d042057203c4b0d000c040b0b205621040c010b205a21040b20c101213c0b2004203c2057203c6b22dc0120dc012017706b1094041a20452061205c6a360200205d205f360200205e205e20096a206020c70173205b6a20c901741095041a20e10121dc0120e10120194b0d0f0b20dd010d080c010b205b21dc0120dd010d080b024020db01450d0020da0110230b20be01450d1520c00110230c150b41204101102a000b203c4101102a000b41b0a8c1002060205b1029000b41b0a8c1002004205b1029000b205f20041048000b20042063108c01000b4104213c0c010b4104213c0c010b410121040c0e0b410121040c0d0b410021bd010c040b410121bd010c040b410221bd010c040b410021040c050b410221040c040b410321040c030b410321040c020b410321040c010b410321040c000b0b20dd0120de011048000b200320633602f001200320643602ec01200320183602e801200341a8036a41086a22024200370300200342003703a80341c2b4c2004113200341a8036a1000200341d8016a41086a2002290300370300200320032903a8033703d801200341103602ac032003200341d8016a3602a803200341e8016a200341a8036a108a0202402064450d00201810230b41002105410021042003280294010d040c050b024020b901450d0020ba0110230b02400240024002400240202d202b6b20b7014f0d00202b20b7016a2204202b490d06202d201174223c20042004203c491b223c20ab01480d0602400240202d0d00203c10262225450d050c010b2025202d203c10272225450d040b203c212d2025202b6a20b80120b7011094041a20230d010c020b202b20b7016a21042025202b6a20b80120b7011094041a2023450d010b20b80110230b20ac0120b60120116a22b60136020020a50120a60129030037030020a70120a80129030037030020a90120aa01290300370300200320032903b8013703e801200341a8036a200341e8016a108d022004212b200341a8036a202c6a28020022230d010c040b203c4101102a000b4103213c410121040c000b0b101e000b024020032802ac03450d0020032802a80310230b200341a8036a41086a22024200370300200342003703a80341e8b4c2004112200341a8036a1000200341d8016a41086a2002290300370300200320032903a8033703d8014100210202400240024002400240024002400240200341d8016a411041a886c500410041001001417f460d00200342103702ac032003200341d8016a3602a803200341e8016a200341a8036a102820032802e801220c450d02200341f0016a280200210220032802ec01210d0c010b4101210c4100210d0b02400240200241ffffff3f7122022004200420024b1b2205450d004100210420034180026a2107200341f8016a2109200341f0016a210a200c210203400240202520046a2d0000450d002007420037030020094200370300200a4200370300200342003703e801200341e8016a2002460d002002200341e8016a4120109604450d00200341e8016a200210ef014101210b20032802e8014101470d0020032802ec0120244d0d030b200241206a2102200441016a22042005490d000b0b4100210b0b0240200d450d00200c10230b0240202d450d00202510230b20034190016a200341b8016a200b1b220520082006200b1b109c02200342e3ded5f3b6ac9ab6f3003703b0014200211c200341a8036a41086a22024200370300200342003703a80341af98c300410d200341a8036a1000200341d8016a41086a22072002290300370300200320032903a8033703d80142002143024002400240200341d8016a411041a886c500410041001001417f460d00200342003703e801200341d8016a4110200341e8016a41084100100141016a41084d0d0120032903e80121430b200320433703d801200341e8016a200510800220032802ec01210820032802e801210420032802f0012106200341fc016a200341b0016a36020020032004200641286c6a3602f401200320043602f001200320083602ec01200320043602e8012003200341d8016a3602f801200341a8036a200341e8016a109d02200341e8016a41086a2002280200360200200320032903a8033703e8012005200341e8016a10870220024200370300200342003703a80341a5bcc2004112200341a8036a100020072002290300370300200320032903a8033703d80102400240200341d8016a411041a886c500410041001001417f460d00200342003703f001200342003703e801200341d8016a4110200341e8016a4110410010012202417f460d032002410f4d0d03200341f0016a290300214320032903e801211c200b450d010c090b42002143200b0d080b200341286a20034190016a10340240024002402003290328200341306a290300844200510d00411810262202450d07200241106a410029008db741370000200241086a4100290085b741370000200241002900fdb64137000020024118413810272202450d08200220032903b801370018200241306a200341b8016a41186a290300370000200241286a200341b8016a41106a290300370000200241206a200341b8016a41086a29030037000042002155200341e8016a41186a22044200370300200341e8016a41106a22054200370300200341e8016a41086a22074200370300200342003703e80120024138200341e8016a1002200341a8036a41186a2004290300370300200341a8036a41106a2005290300370300200341a8036a41086a2007290300370300200320032903e8013703a803200341a8036a412041a886c500410041001001417f460d01200342003703f001200342003703e801200341a8036a4120200341e8016a4110410010012204417f460d062004410f4d0d06200341f0016a290300214420032903e80121552002102341142104411410262202450d020c090b4193b5c1002104412221020c0d0b4200214420021023411421044114102622020d070b20044101102a000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41184101102a000b41384101102a000b200241106a41002800f9b641360000200241086a41002900f1b641370000200241002900e9b641370000024020022004413410272202450d0020022003290390013700142002412c6a20034190016a41186a2204290300370000200241246a20034190016a41106a2903003700002002411c6a20034190016a41086a29030037000042002165200341e8016a41186a22054200370300200341e8016a41106a22074200370300200341e8016a41086a22084200370300200342003703e80120024134200341e8016a1002200341a8036a41186a2005290300370300200341a8036a41106a2007290300370300200341a8036a41086a2008290300370300200320032903e8013703a803024002400240200341a8036a412041a886c500410041001001417f460d00200342003703f001200342003703e801200341a8036a4120200341e8016a4110410010012205417f460d022005410f4d0d02200341f0016a290300217420032903e80121650c010b420021740b2002102320034190016a2065201c20552055201c56204420435620442043511b22021b221c7c223f20742043204420021b22437c203f206554ad7c10df01200341b8016a2055201c7d204420437d2055201c54ad7d10fe01200341f5016a200341b8016a41086a290300370000200341fd016a200341b8016a41106a29030037000020034185026a200341b8016a41186a2903003700002003418d026a20032903900137000020034195026a20034190016a41086a2903003700002003419d026a20034190016a41106a290300370000200341a5026a2004290300370000200341003a00ec01200341063a00e801200320032903b8013700ed0141a886c5004100200341e8016a102c0c0a0b41d4aac10041331021000b41344101102a000b200341186a20034190016a201c20431093022003290318211c2003200341186a41086a2903003703f0012003201c3703e8012003200341e8016a3602a803200341a8036a10de01200341f5016a20034190016a41086a290300370000200341fd016a200341a0016a29030037000020034185026a200341a8016a290300370000200341013a00ec01200341063a00e80120032003290390013700ed0141a886c5004100200341e8016a102c0c070b204d10230b02402005450d0002402064450d00201810230b2044a70d010c020b2044a7450d010b206210230b41012107410121080b200128020022054101460d040c050b200b450d00200510230b200320123602f0012003200a3602ec01200320073602e801200341a8036a41086a22044200370300200342003703a8034195b7c1004115200341a8036a1000200341d8016a41086a2004290300370300200320032903a8033703d801200341103602ac032003200341d8016a3602a803200341e8016a200341a8036a108f020240200a450d00200710230b200341e8016a41186a200341b8016a41186a290300370300200341e8016a41106a200341b8016a41106a290300370300200341e8016a41086a200341b8016a41086a290300370300200320032903b8013703e80141012107200341e8016a41011090024100210441012108200128020022054101470d030c020b41002104410121070b41012108200128020022054101470d010b2008450d01200141086a280200450d01200128020410230c010b20054102470d002007450d00200141086a280200450d00200128020410230b2000200236020420002004360200200341d0036a24000bcc310b067f057e017f017e017f017e017f017e017f047e087f23004180026b22052400200541e8006a41086a220642003703002005420037036841e8b4c2004112200541e8006a100020054190016a41086a2006290300370300200520052903683703900141002107024002400240024002400240024020054190016a411041a886c500410041001001417f460d00200542103702e401200520054190016a3602e001200541386a200541e0016a102820052802382208450d02200541c0006a2802002107200528023c21090c010b41012108410021090b200541e8006a41086a220642003703002005420037036841c4b3c2004114200541e8006a100020054190016a41086a220a20062903003703002005200529036837039001024020054190016a411041a886c500410041001001417f460d0041bec1c2002106412e210720090d030c040b20064200370300200542003703684190b5c2004111200541e8006a1000200a2006290300370300200520052903683703900102400240024020054190016a411041a886c500410041001001417f460d002005410036023820054190016a4110200541386a41044100100141016a41044d0d0220052802382003470d010c040b41002003460d030b41ecc1c20021064114210720090d030c040b41d4aac10041331021000b41d4aac10041331021000b0240024002402007450d002007200241086a280200220a4f0d0141c1c2c2002106413c210720090d030c040b4180c2c200210641c10021070c010b200541286a20011034200541286a41086a290300210b2005290328210c200541386a2001108e02024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020052903384201520d00200541d8006a290300210d200541d0006a290300210e200541c8006a290300210f200541e4006a280200211020052903402111200541c0016a2004410676109102410021122004413f71220620052802c8014f0d0120052802c001200641216c6a22062d00004101470d01200541aa016a200641036a2d00003a000020054190016a41086a200641146a2900003703002005419d016a200641196a290000370000200520062f00013b01a80120052006410c6a29000037039001200641086a2800002107200641046a28000021064101211220052802c4010d020c030b411410262206450d1d200641106a41002800f9b641360000200641086a41002900f1b641370000200641002900e9b64137000020064114413410272206450d1e200620012900003700142006412c6a200141186a290000370000200641246a200141106a2900003700002006411c6a200141086a29000037000042002113200541e0016a41186a22074200370300200541e0016a41106a22124200370300200541e0016a41086a22144200370300200542003703e00120064134200541e0016a1002200541c0016a41186a2007290300370300200541c0016a41106a2012290300370300200541c0016a41086a2014290300370300200520052903e0013703c001200541c0016a412041a886c500410041001001417f460d03200542003703e801200542003703e001200541c0016a4120200541e0016a4110410010012207417f460d1b2007410f4d0d1b200541e8016a290300210e20052903e00121150c040b20052802c401450d010b20052802c00110230b024002402012450d0020054188016a41026a200541a8016a41026a2d00003a0000200541c0016a41086a20054190016a41086a290300370300200541c0016a410d6a20054190016a410d6a290000370000200520052f01a8013b01880120052005290390013703c001410021040c010b410121044113210741fdc2c20021060b20054184016a41026a221220054188016a41026a2d00003a0000200541e8006a41086a2214200541c0016a41086a290300370300200541e8006a41106a200541c0016a41106a290300370300200520052f0188013b018401200520052903c00137036820040d2a200541f3016a2014290300370000200541f8016a200541f5006a290000370000200520052f0184013b01e001200520073600e701200520063600e301200520052903683700eb01200520122d00003a00e201200541e0016a2001460d02200541e0016a20014120109604450d024190c3c20021064111210720090d2b0c2c0b420021154200210e0b20061023200541e8006a41086a220642003703002005420037036841a5bcc2004112200541e8006a100020054190016a41086a200629030037030020052005290368370390010240024020054190016a411041a886c500410041001001417f460d00200542003703e801200542003703e00120054190016a4110200541e0016a4110410010012206417f460d192006410f4d0d19200541e8016a290300210d20052903e00121130c010b4200210d0b02402015201358200e200d58200e200d511b0d00200541e0016a2004410676221210910241002106024020052802e8012004413f7122074d0d004101410220052802e001200741216c6a2d00001b21060b024020052802e401450d0020052802e00110230b200641024f0d02200541e8006a41086a220642003703002005420037036841d5c3c2004114200541e8006a100020054190016a41086a2006290300370300200520052903683703900141002107024020054190016a411041a886c500410041001001417f460d00200541003602e00120054190016a4110200541e0016a41044100100141016a41044d0d1d20052802e00121070b200541a8016a200710910220052802b0012206450d06200541c0016a41186a200141186a290000370300200541c0016a41106a200141106a290000370300200541c0016a41086a200141086a290000370300200520012900003703c001200541c0016a2104200641c000470d0b0c0c0b41a1c3c20021064134210720090d290c2a0b200541e8006a41086a220642003703002005420037036841d9c0c2004112200541e8006a100020054190016a41086a2006290300370300200520052903683703900120054190016a411041a886c500410041001001417f460d01200541003602c00120054190016a4110200541c0016a41044100100141016a41044d0d1920052802c0012107200320106b22064197014f0d020c030b200541e8006a2012109102200541e0016a41186a2204200141186a290000370300200541e0016a41106a2214200141106a290000370300200541e0016a41086a2210200141086a290000370300200520012900003703e0012005280270220620074d0d1f20052802682216200741216c6a220620052903e001370001200641013a0000200641096a2010290300370000200641116a2014290300370000200641196a2004290300370000410e10262206450d20200641066a41002900a6b642370000200641002900a0b6423700002006410e411c10272206450d212006201236000e200541e0016a41186a22074200370300200541e0016a41106a22044200370300200541e0016a41086a22124200370300200542003703e00120064112200541e0016a1002200541c0016a41186a2007290300370300200541c0016a41106a2004290300370300200541c0016a41086a2012290300370300200520052903e0013703c001200541203602e4012005200541c0016a3602e001200541e8006a200541e0016a109e0220061023200528026c450d0a201610230c0a0b41182107200320106b2206419701490d010b2005200e200d2007ad4200109804200541086a2903002117200529030021150c030b2006450d012007ad221342017c2218201354ad2119200541186a210442002115420021170340200541106a200e200d201820191097044200200d20042903007d200e2005290310221a54ad7d2213200e201a7d221a200e562013200d562013200d511b22071b220d20177c4200201a20071b220e20157c2215200e54ad7c21172006417f6a22060d000c030b0b4200210e200541e8006a41086a220442003703002005420037036841e9c3c2004111200541e8006a100020054190016a41086a2004290300370300200520052903683703900120054190016a411041a886c500410041001001417f460d02200542003703c801200542003703c00120054190016a4110200541c0016a4110410010012204417f460d1e2004410f4d0d1e200541c8016a290300210d20052903c001210e0c030b42002115420021170b2017200f7c201520117c220e201554ad7c210d0c050b4200210d0b200541e0016a2001200e200d4108108502024020052802e0014101470d0020052802e801210720052802e401210620052802ac01450d1f20052802a801102320090d200c210b20052903e801210e2005200541e0016a41106a2903003703e8012005200e3703e0012005200541e0016a3602c001200541c0016a10de014200210e200541e8006a41086a220442003703002005420037036841e9c3c2004111200541e8006a100020054190016a41086a200429030037030020052005290368370390010240024020054190016a411041a886c500410041001001417f460d00200542003703e801200542003703e00120054190016a4110200541e0016a4110410010012204417f460d1e2004410f4d0d1e200541e8016a290300210d20052903e001210e0c010b4200210d0b200541c0016a41186a200141186a290000370300200541c0016a41106a200141106a290000370300200541c0016a41086a200141086a290000370300200520012900003703c001200b200d7d200c200e54ad7d210b200c200e7d210c200541c0016a21040b200541e0016a41186a200441186a290000370300200541e0016a41106a200441106a290000370300200541e0016a41086a200441086a290000370300200520042900003703e001024002400240024020052802ac012006470d00200641016a22042006490d0720064101742212200420042012491b2214ad42217e220e422088a70d07200ea722124100480d072006450d0120052802a801200641216c2012102722040d020c200b20052802a80121040c020b201210262204450d1e0b200520143602ac01200520043602a8010b200541a8016a41086a200641016a3602002004200641216c6a220420052903e001370001200441013a0000200441096a200541e0016a41086a290300370000200441116a200541e0016a41106a290300370000200441196a200541f8016a2903003700002006413f470d00200541e8006a41086a220642003703002005420037036841d5c3c2004114200541e8006a100020054190016a41086a200629030037030020052005290368370390012005200741016a3602e00120054190016a4110200541e0016a410410040b200541e0016a41086a200541a8016a41086a280200360200200520052903a8013703e0012007200541e0016a109f020b4200210e200541e8006a41086a220642003703002005420037036841a5bcc2004112200541e8006a100020054190016a41086a200629030037030020052005290368370390010240024020054190016a411041a886c500410041001001417f460d00200542003703e801200542003703e00120054190016a4110200541e0016a4110410010012206417f460d112006410f4d0d11200541e8016a290300210d20052903e001210e0c010b4200210d0b200541206a2001200e200d105b024020052802202206450d002005280224210720090d1d0c1e0b200541e8006a41086a220642003703002005420037036841acc1c2004112200541e8006a100020054190016a41086a200629030037030020052005290368370390010240024020054190016a411041a886c500410041001001417f460d00200541003602e00120054190016a4110200541e0016a41044100100141016a41044d0d1220052802e00141016a21060c010b410121060b4200210e200541e8006a41086a220742003703002005420037036841acc1c2004112200541e8006a100020054190016a41086a20072903003703002005200529036837039001200520063602e00120054190016a4110200541e0016a410410044200210d0b200542e3ded5f3b6ac9ab6f3003703b801200541b8016a2001200c200b427f410f1062200541d0006a200b3703002005200c3703482005200d3703402005200e3703382005200336025c20052003360258411310262206450d102006410f6a41002800c5b542360000200641086a41002900beb542370000200641002900b6b54237000020064113413310272206450d11200620012900003700132006412b6a200141186a290000370000200641236a200141106a2900003700002006411b6a200141086a290000370000200541e0016a41186a22074200370300200541e0016a41106a22034200370300200541e0016a41086a22044200370300200542003703e00120064133200541e0016a1002200541c0016a41186a2007290300370300200541c0016a41106a2003290300370300200541c0016a41086a2004290300370300200520052903e0013703c001200541203602e4012005200541c0016a3602e001200541386a200541e0016a10ed01200610232002280204211420022802002103024002400240024002400240200a410576221b450d00201b41027422061026221c450d18201c211d200a0d010c020b4104211c4104211d200a450d010b0240201b0d0041041026221c450d1c4101211b201c211d0b201d4100360200200a417f6a210441012116410021024100210602400340201620024d0d08201d20024102746a22072007280200200320066a2d00002006411f71746a360200200620044f0d0102400240200641016a2206411f71450d00200a20064b0d020c010b0240201b2016470d00201b41016a2207201b490d08201b4101742212200720072012491b2207ad420286220e422088a70d08200ea722124100480d0802400240201b450d00201c201b41027420121027221c0d010c110b20121026221c450d100b201c211d2007211b0b201d20164102746a4100360200200241016a2102201641016a2116200a20064b0d010b0b41ecb3c2002006200a1029000b02402014450d00200310230b4100211e0340200541386a41186a2203200141186a290000370300200541386a41106a220a200141106a290000370300200541386a41086a2204200141086a290000370300200520012900003703382016410820164108491b221f410274212002400240201f450d00202010262221450d0d2021201d20201094042102201f21074113102622060d010c0a0b410421214104210241002107411310262206450d090b2006410f6a410028009cb642360000200641086a4100290095b6423700002006410029008db64237000020064113413310272206450d09200620052903383700132006412b6a2003290300370000200641236a200a2903003700002006411b6a20042903003700002006413341e60010272222450d0a2022201e360033200541e0016a41186a22064200370300200541e0016a41106a22034200370300200541e0016a41086a22104200370300200542003703e00120224137200541e0016a1002200541c0016a41186a2006290300370300200541c0016a41106a2003290300370300200541c0016a41086a2010290300370300200520052903e0013703c00120104100360200200542013703e00120052007360268200541e8006a200541e0016a104102400240024020070d0020052802e4012106200541c0016a412020052802e001220a2010280200100420060d010c020b200741027421044100201028020022066b210720052802e40121030340200228020021140240024002400240200320076a41044f0d00200641046a220a2006490d0c20034101742212200a200a2012491b22124100480d0c2003450d0120052802e001200320121027220a0d020c0d0b20052802e001210a0c020b20121026220a450d0b0b200520123602e4012005200a3602e001201221030b200241046a21022010200641046a2212360200200a20066a20143600002007417c6a2107201221062004417c6a22040d000b200541c0016a4120200a201210042003450d010b200a10230b2016201f6b2116202210230240201f450d00202110230b201d20206a211d201e41016a211e20160d000b201b450d01201c10234100210620090d020c030b2014450d00200310230b410021062009450d010b200810230b0c1d0b101e000b20124101102a000b41d8b4c200200220161029000b41134101102a000b41334101102a000b41e6004101102a000b20204104102a000b20124104102a000b41d4aac10041331021000b41d4aac10041331021000b41144101102a000b41344101102a000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41134101102a000b41334101102a000b20064104102a000b41d8b4c200200720061029000b410e4101102a000b411c4101102a000b41d4aac10041331021000b41044104102a000b41d4aac10041331021000b20124101102a000b2009450d010b200810230b200241046a280200450d00200228020010230b200020073602042000200636020020054180026a24000bf909010c7f23004190016b22022400200241086a20014106762203109102024002400240200228021022042001413f7122014d0d002002280208200141216c6a22012002290028370001200141003a0000200141096a200241286a41086a2204290000370000200141116a200241286a41106a290000370000200141196a200241c0006a2900003700002004200241086a41086a280200360200200220022903083703282003200241286a109f02200442003703002002420037032841acc1c2004112200241286a1000200241f0006a41086a200429030037030020022002290328370370417f210102400240200241f0006a411041a886c500410041001001417f460d0020024100360228200241f0006a4110200241286a41044100100141016a41044d0d012002280228417f6a21010b200241286a41086a220342003703002002420037032841acc1c2004112200241286a1000200241f0006a41086a220520032903003703002002200229032837037020022001360228200241f0006a4110200241286a41041004200241286a41186a2206200041186a2207290000370300200241286a41106a2208200041106a22092900003703002003200041086a220a2900003703002002410036024820022000290000370328200241186a200241286a108d0202400240024002402002280220450d00410021040340200241d0006a41186a220b2007290000370300200241d0006a41106a220c2009290000370300200241d0006a41086a220d200a29000037030020022000290000370350411310262201450d042001410f6a410028009cb642360000200141086a4100290095b6423700002001410029008db64237000020014113413310272201450d02200120022903503700132001412b6a200b290300370000200141236a200c2903003700002001411b6a200d2903003700002001413341e60010272201450d03200120043600332006420037030020084200370300200342003703002002420037032820014137200241286a1002200241f0006a41186a2006290300370300200241f0006a41106a20082903003703002005200329030037030020022002290328370370200241f0006a4120100320011023200441016a21040240200228021c450d00200228021810230b200241286a41206a200436020020062007290000370300200820092900003703002003200a29000037030020022000290000370328200241186a200241286a108d02200241186a41086a2802000d000b0b0240200228021c450d00200228021810230b411310262201450d052001410f6a41002800c5b542360000200141086a41002900beb542370000200141002900b6b54237000020014113413310272201450d06200120002900003700132001412b6a200041186a290000370000200141236a200041106a2900003700002001411b6a200041086a290000370000200241286a41186a22044200370300200241286a41106a22034200370300200241286a41086a220642003703002002420037032820014133200241286a1002200241f0006a41186a2004290300370300200241f0006a41106a2003290300370300200241f0006a41086a200629030037030020022002290328370370200241f0006a412010032001102320024190016a24000f0b41334101102a000b41e6004101102a000b41134101102a000b41d4aac10041331021000b41d8b4c200200120041029000b41134101102a000b41334101102a000bdb0a03087f047e0b7f230041a0016b2202240002400240200141086a220328020022042001410c6a2802002205460d0020012802102106200241f8006a41186a2107200141146a2108034020032004220941286a2204360200200941086a290300210a200941106a290300210b200941186a290300210c2009290300210d200241f8006a41206a200941206a2903003703002007200c370300200241f8006a41106a220e200b370300200241f8006a41086a200a3703002002200d3703780240200e2903002006290300580d002008280200220e2007460d002007290000200e290000520d030b20052004470d000b200521040b2000410036020820004208370200024020042005460d00200141086a2004200541586a20046b41286e41286c6a41286a3602000b02402001280204450d00200128020010230b200241a0016a24000f0b200241d0006a41206a2204200241f8006a41206a290300370300200241d0006a41186a2207200241f8006a41186a290300370300200241d0006a41106a2203200241f8006a41106a290300370300200241d0006a41086a2208200241f8006a41086a29030037030020022002290378370350200241286a41206a220f2004290300370300200241286a41186a22042007290300370300200241286a41106a22072003290300370300200241286a41086a2203200829030037030020022002290350370328200241206a2208200f290300370300200241186a22102004290300370300200241106a22042007290300370300200241086a22072003290300370300200220022903283703000240024002400240024041281026220f450d00200f2002290300370300200f41206a2008290300370300200f41186a2010290300370300200f41106a2004290300370300200f41086a2007290300370300200128020421112001280200211241012101024002400240200541586a2009460d00200e200241f8006a41186a2204460d02200941286a2113200541586a2114410121014101211003402013210902400340200241f8006a41206a2207200941206a2903003703002004200941186a290300370300200241f8006a41106a2203200941106a290300220a370300200241f8006a41086a2208200941086a290300370300200220092903003703780240200a2006290300580d002004290000200e290000520d020b2005200941286a2209470d000c040b0b200241d0006a41206a22132007290300370300200241d0006a41186a22152004290300370300200241d0006a41106a22162003290300370300200241d0006a41086a2217200829030037030020022002290378370350200241286a41206a22182013290300370300200241286a41186a22132015290300370300200241286a41106a22152016290300370300200241286a41086a22162017290300370300200220022903503703282007201829030037030020042013290300370300200320152903003703002008201629030037030020022002290328370378024020102001470d00200141016a22102001490d0720014101742213201020102013491b2210ad42287e220a422088a70d07200aa722134100480d0702402001450d00200f200141286c20131027220f0d010c070b20131026220f450d060b200941286a2113200f200141286c6a22152002290378370300201541206a2007290300370300201541186a2004290300370300201541106a2003290300370300201541086a2008290300370300200141016a210120142009470d000c020b0b410121100b2011450d050c040b4101211020110d030c040b41284108102a000b20134108102a000b101e000b201210230b20002001360208200020103602042000200f360200200241a0016a24000bc60501087f230041106b2202240020024100360208200242013703002000280200210320022000280208220036020c2002410c6a2002104102400240024002400240024002402000450d00200041216c2104200241086a21050240034002400240024002400240024002400240024002400240024020032d00004101470d002002280204220020052802002206470d01200641016a22002006490d0f20064101742207200020002007491b22004100480d0f2006450d03200228020020062000102722070d040c100b2002280204220020052802002206470d01200641016a22002006490d0e20064101742207200020002007491b22004100480d0e2006450d05200228020020062000102722070d060c100b200228020021070c030b200228020021070c050b200010262207450d0c0b20022000360204200220073602000b2005200641016a2208360200200720066a41013a00000240200020086b41204f0d00200841206a22092008490d0a20004101742206200920092006491b22064100480d0a2000450d04200720002006102722070d050c0d0b200641216a21090c050b200010262207450d0a0b20022000360204200220073602000b2005200641016a2209360200200720066a41003a0000200341216a21032004415f6a22040d030c040b200610262207450d080b2002200636020420022007360200200621000b20052009360200200720086a220641086a200341016a220841086a290000370000200641106a200841106a290000370000200641186a200841186a29000037000020062008290000370000200341216a21032004415f6a22040d000b0b200128020020012802042007200910042000450d060c050b200228020421002001280200200128020420022802002207200241086a280200100420000d040c050b101e000b20004101102a000b20004101102a000b20064101102a000b200710230b200241106a24000b840201047f230041c0006b2202240002400240410e10262203450d00200341066a41002900a6b642370000200341002900a0b6423700002003410e411c10272203450d012003200036000e200241206a41186a22004200370300200241206a41106a22044200370300200241206a41086a220542003703002002420037032020034112200241206a1002200241186a2000290300370300200241106a2004290300370300200241086a20052903003703002002200229032037030020024120360224200220023602202001200241206a109e02200310230240200141046a280200450d00200128020010230b200241c0006a24000f0b410e4101102a000b411c4101102a000ba20d010e7f230041e0006b220224000240024020012802042203200128020022046b418001490d00200141046a210503402001200441206a360200200141086a220628020022032802282107200341306a2802002108200241c0006a41186a22034200370300200241c0006a41106a22094200370300200241c0006a41086a220a42003703002002420037034020044120200241c0006a1002200241186a220b2003290300370300200241106a220c2009290300370300200241086a220d200a29030037030020022002290340370300200241003602402007200820024120200241c0006a100a2108024020022802402207417f460d002006280200220e280230210f200e280228210e2003420037030020094200370300200a42003703002002420037034020044120200241c0006a1002200241206a41186a2003290300370300200241206a41106a2009290300370300200241206a41086a200a29030037030020022002290340370320200e200f200241206a4120100c20040d030b20012001280200220441206a3602002006280200220741306a2802002108200728022821072003420037030020094200370300200a42003703002002420037034020044120200241c0006a1002200b2003290300370300200c2009290300370300200d200a29030037030020022002290340370300200241003602402007200820024120200241c0006a100a2108024020022802402207417f460d002006280200220e280230210f200e280228210e2003420037030020094200370300200a42003703002002420037034020044120200241c0006a1002200241206a41186a2003290300370300200241206a41106a2009290300370300200241206a41086a200a29030037030020022002290340370320200e200f200241206a4120100c20040d030b20012001280200220441206a3602002006280200220741306a2802002108200728022821072003420037030020094200370300200a42003703002002420037034020044120200241c0006a1002200b2003290300370300200c2009290300370300200d200a29030037030020022002290340370300200241003602402007200820024120200241c0006a100a2108024020022802402207417f460d002006280200220e280230210f200e280228210e2003420037030020094200370300200a42003703002002420037034020044120200241c0006a1002200241206a41186a2003290300370300200241206a41106a2009290300370300200241206a41086a200a29030037030020022002290340370320200e200f200241206a4120100c20040d030b20012001280200220441206a3602002006280200220741306a2802002108200728022821072003420037030020094200370300200a42003703002002420037034020044120200241c0006a1002200b2003290300370300200c2009290300370300200d200a29030037030020022002290340370300200241003602402007200820024120200241c0006a100a2108024020022802402207417f460d0020062802002206280230210b200628022821062003420037030020094200370300200a42003703002002420037034020044120200241c0006a1002200241206a41186a2003290300370300200241206a41106a2009290300370300200241206a41086a200a290300370300200220022903403703202006200b200241206a4120100c20040d030b20052802002203200128020022046b41ff004b0d000b0b024020042003460d00200141046a210c03402001200441206a360200200141086a220b28020022032802282106200341306a2802002107200241c0006a41186a22034200370300200241c0006a41106a22094200370300200241c0006a41086a220a42003703002002420037034020044120200241c0006a1002200241186a2003290300370300200241106a2009290300370300200241086a200a29030037030020022002290340370300200241003602402006200720024120200241c0006a100a2108024020022802402207417f460d00200b2802002206280230210b200628022821062003420037030020094200370300200a42003703002002420037034020044120200241c0006a1002200241206a41186a2003290300370300200241206a41106a2009290300370300200241206a41086a200a290300370300200220022903403703202006200b200241206a4120100c20040d030b20012802002204200c280200470d000b0b20004100360200200241e0006a24000f0b20002008360204200020043602002000410c6a2007360200200041086a2007360200200241e0006a24000b910202077f017e024002400240024002400240200041046a2802002202200041086a28020022036b2001410c6a2802002204200141086a28020022056b22064190016d22074f0d00200320076a22082003490d0320024101742203200820082003491b2203ad4290017e2209422088a70d032009a722084100480d032002450d01200028020020024190016c200810272202450d020c040b200028020021020c040b2008102622020d020b20084108102a000b101e000b20002002360200200041046a2003360200200041086a28020021030b200220034190016c6a200520061094041a200141086a2004360200200041086a2200200028020020076a36020002402001280204450d00200128020010230b0b910202077f017e024002400240024002400240200041046a2802002202200041086a28020022036b2001410c6a2802002204200141086a28020022056b220641e8006d22074f0d00200320076a22082003490d0320024101742203200820082003491b2203ad42e8007e2209422088a70d032009a722084100480d032002450d012000280200200241e8006c200810272202450d020c040b200028020021020c040b2008102622020d020b20084108102a000b101e000b20002002360200200041046a2003360200200041086a28020021030b2002200341e8006c6a200520061094041a200141086a2004360200200041086a2200200028020020076a36020002402001280204450d00200128020010230b0bcd0201077f230041106b220224002002410036020c2002410c6a20012802002203200128020422044104200441044922051b22061094041a2001200420066b3602042001200320066a3602000240024002400240024002400240024020050d00200228020c21052002200110452002280200450d0320022802042204417f4c0d042004450d01200410ac012203450d0520032001280200200141046a22072802002206200420062004491b22061094041a200728020022082006490d062007200820066b3602002001200128020020066a36020020062004470d020c070b20004100360204200241106a24000f0b4101210341002004460d050b2004450d00200310230b20004100360204200241106a24000f0b101d000b20044101102a000b200620081048000b2000200436020820002003360204200020053602002000410c6a2004360200200241106a24000bdb0201057f230041106b220224002002410036020c20014100200128020020012802042002410c6a41042001280208100122032003417f461b22034104200341044922031b20012802086a360208024002400240024002400240024020030d00200228020c210420022001104a2002280200450d0320022802042203417f4c0d042003450d01200310ac012205450d05200141086a2206200341002001280200200141046a280200200520032006280200100122012001417f461b2201200120034b1b220120062802006a36020020012003470d020c060b20004100360204200241106a24000f0b410121052001280200200141046a28020041014100200141086a28020010011a41002003460d040b2003450d00200510230b20004100360204200241106a24000f0b101d000b20034101102a000b2000200336020820002005360204200020043602002000410c6a2003360200200241106a24000b8203010a7f230041106b220224002002200110450240024002400240024002400240024002402002280200450d0020022802042203417f4c0d072003450d01200310262204450d08200141046a2105410021064100210720032108034020052802002109200241003a000f2002410f6a2001280200220a2009410047220b1094041a2009200b490d0520052009200b6b3602002001200a200b6a3602002009450d04200741016a210920022d000f210b024020072008470d002006200920092006491b22084100480d0702402007450d00200420072008102722040d010c090b200810262204450d080b200420076a200b3a0000200641026a21062009210720092003490d000c030b0b20004100360200200241106a24000f0b4101210441002109410021080b2000200836020420002004360200200041086a2009360200200241106a24000f0b2000410036020002402008450d00200410230b200241106a24000f0b200b20091048000b101e000b20084101102a000b101d000b20034101102a000bf502010a7f230041106b2202240020022001104a024002400240024002400240024002402002280200450d0020022802042203417f4c0d062003450d01200310262204450d07200141046a2105200141086a21064100210741002108200321090340200241003a000f200128020020052802002002410f6a410120062802001001210a20062006280200200a41016a41014b220a6a360200200a450d04200841016a210a20022d000f210b024020082009470d002007200a200a2007491b22094100480d0602402008450d00200420082009102722040d010c080b200910262204450d070b200420086a200b3a0000200741026a2107200a2108200a2003490d000c030b0b20004100360200200241106a24000f0b410121044100210a410021090b2000200936020420002004360200200041086a200a360200200241106a24000f0b2000410036020002402009450d00200410230b200241106a24000f0b101e000b20094101102a000b101d000b20034101102a000bed0504027f017e0f7f017e230041f0006b22022400200241086a200110450240024002400240024002400240024002402002280208450d00200228020c2203ad42287e2204422088a70d032004a72205417f4c0d032005450d01200510262206450d042003450d020c050b20004100360200200241f0006a24000f0b4108210620030d030b410021114100210e0c030b101d000b20054108102a000b200241d0006a41186a2107200241d0006a41106a2108200241d0006a41086a2109200141046a210a4100210b4100210c4100210d2003210e0240034020074200370300200842003703002009420037030020024200370350200241d0006a2001280200220f200a28020022054120200541204922101b22111094041a200a200520116b22053602002001200f20116a221136020020100d01200241306a41186a22102007290300370300200241306a41106a22122008290300370300200241306a41086a221320092903003703002002200229035037033020024200370350200241d0006a20112005410820054108491b220f1094041a200a2005200f6b36020020012011200f6a360200200541074d0d01200d41016a211120022903502104200241106a41186a220f2010290300370300200241106a41106a22102012290300370300200241106a41086a22122013290300370300200220022903303703100240200d200e470d00200b20112011200b491b220ead42287e2214422088a70d042014a722054100480d040240200d450d002006200c2005102722060d010c060b200510262206450d050b2006200c6a22052002290310370300200541186a200f290300370300200541106a2010290300370300200541086a2012290300370300200541206a2004370300200b41026a210b200c41286a210c2011210d20112003490d000c020b0b200041003602000240200e450d00200610230b200241f0006a24000f0b2000200e36020420002006360200200041086a2011360200200241f0006a24000f0b101e000b20054108102a000be60403027f017e0b7f230041106b22022400200241086a2001104a0240024002400240024002400240024002402002280208450d00200228020c2203ad420c7e2204422088a70d082004a72205417f4c0d082005450d01200510262206450d032003450d020c040b20004100360200200241106a24000f0b4104210620030d020b4100210e4100210c0c020b20054104102a000b200141086a2107200141046a2108410021094100210a4100210b2003210c034020022001104a0240024002402002280200450d0020022802042205417f4c0d07024002402005450d00200510ac01220d450d0320072005410020012802002008280200200d200520072802001001220e200e417f461b220e200e20054b1b220e20072802006a360200200e2005470d010c040b4101210d2001280200200828020041014100200728020010011a41002005460d030b2005450d00200d10230b200041003602000240200b450d002006210503400240200541046a280200450d00200528020010230b2005410c6a2105200a41746a220a0d000b0b0240200c450d00200610230b200241106a24000f0b20054101102a000b200b41016a210e0240200b200c470d002009200e200e2009491b220cad420c7e2204422088a70d032004a7220f4100480d030240200b450d002006200a200f102722060d010c050b200f10262206450d040b2006200a6a220b200d360200200b41046a2005ad2204422086200484370200200941026a2109200a410c6a210a200e210b200e2003490d000b0b2000200c36020420002006360200200041086a200e360200200241106a24000f0b101e000b200f4104102a000b101d000bb00d03027f017e167f230041f0006b22022400200241106a2001104a02400240024002400240024002400240024002402002280210450d0020022802142203ad42247e2204422088a70d092004a72205417f4c0d092005450d01200510262206450d032003450d020c040b20004100360200200241f0006a24000f0b4104210620030d020b41002111410021100c020b20054104102a000b200241d0006a41046a21072002413d6a2108200241d7006a2109200141086a210a200241d0006a41186a210b200241d0006a41106a210c200241e3006a220d41056a210e4100210f20032110410021110340200241003a00502001280200200141046a2212280200200241d0006a4101200a28020010012105200a200a280200200541016a41014b22056a2213360200024002400240024002400240024002400240024002402005450d004105211420022d0050220541064b0d08024020050e07000b030b020405000b200241086a2001104a2002280208450d08200228020c2215417f4c0d102015450d05201510ac012205450d07200a201541002001280200201228020020052015200a280200100122122012417f461b2212201220154b1b2212200a2802006a36020020122015470d060c090b410521140c070b200241d0006a200110a40220022802542215450d0620022d0053211720022f0150210520022d005221142002200241d0006a41086a290300370244200220153602402005201441107472211a410221140c080b200b4200370300200c4200370300200241d0006a41086a420037030020024200370350200a410020012802002012280200200241d0006a41202013100122052005417f461b2205412020054120491b200a2802006a3602002005411f4d0d05200241c0006a41086a200941086a280000360200200220092900003703402002200d2900003703302002200e29000037003520022f0150210520022d0052211420022800532117200841026a200241cd006a41026a2d00003a0000200820022f004d3b0000201741087621162005201441107472211a41002114200228024021150c070b200241d0006a200110a40220022802542215450d0420022d0053211720022f0150210520022d005221142002200241d0006a41086a290300370244200220153602402005201441107472211a410321140c060b200241d0006a200110a40220022802542215450d0320022d0053211720022f0150210520022d005221142002200241d0006a41086a290300370244200220153602402005201441107472211a410121140c050b410121052001280200201228020041014100200a28020010011a41002015460d030b2015450d01200510230c010b20154101102a000b0c010b200241c0006a41086a2002280250360200200241306a41086a200741086a2902003703002002200729020037033020022015ad22044220862004843703402005410876211641042114200521170b20072002290330370200200741086a200241306a41086a2903003702002002200241c0006a41086a28020036025020144105460d0220022802442112200241186a41106a2213200c280200360200200241186a41086a2218200241d0006a41086a29020037030020022002290250370318024020112010470d00201041016a22052010490d0420104101742219200520052019491b2205ad42247e2204422088a70d042004a722194100480d04024002402010450d002006201041246c2019102722060d010c070b201910262206450d060b200521100b2006200f6a220520143a00002005410c6a2012360200200541086a2015360200200541046a2016410874201741ff017172360200200541036a201a4110763a0000200541016a201a3b0000200541206a2013280200360200200541186a2018290300370200200541106a2002290318370200200f41246a210f201141016a22112003490d000b0b2000201036020420002006360200200041086a2011360200200241f0006a24000f0b2000410036020002402011450d002006210503400240024020052d0000220a41034b0d00024002400240200a0e0404000102040b2005410c6a280200450d03200541086a2802001023200541246a2105200f415c6a220f0d040c050b2005410c6a280200450d02200541086a2802001023200541246a2105200f415c6a220f0d030c040b2005410c6a280200450d01200541086a2802001023200541246a2105200f415c6a220f0d020c030b200541086a280200450d00200541046a28020010230b200541246a2105200f415c6a220f0d000b0b02402010450d00200610230b200241f0006a24000f0b101e000b20194104102a000b101d000bb30405027f017e077f017e017f230041e0056b2202240020022001104502400240024002400240024002400240024002402002280200450d0020022802042203ad42f8017e2204422088a70d032004a72205417f4c0d032005450d01200510262206450d042003450d020c050b20004100360200200241e0056a24000f0b4108210620030d030b4100210b4100210a0c030b101d000b20054108102a000b200241f8016a41f8006a21074100210841002105410021092003210a0340200241f8016a2001109402200241f0046a200241f8016a41f0001094041a200241f8016a41f0006a2903002104200241f0036a20074180011094041a20044203510d02200941016a210b20024188016a200241f0046a41f0001094041a200241086a200241f0036a4180011094041a02402009200a470d002008200b200b2008491b220aad42f8017e220c422088a70d04200ca7220d4100480d0402402009450d0020062005200d102722060d010c060b200d10262206450d050b200620056a20024188016a41f000109404220941f0006a2004370300200941f8006a200241086a4180011094041a200841026a2108200541f8016a2105200b2109200b2003490d000b0b2000200a36020420002006360200200041086a200b360200200241e0056a24000f0b2000410036020002402009450d0020064188016a210b0340200b1024200b41f8016a210b200541887e6a22050d000b0b0240200a450d00200610230b200241e0056a24000f0b101e000b200d4108102a000be30a04177f027e087f017e23004180016b220224000240200141086a220328020022042001410c6a2802002205460d002001280210220628020021072006280208220841014621094100210a0340024002400240024002400240024002400240200a0e020001010b2003200441206a220b360200200241e0006a41186a200441186a290000370300200241e0006a41106a200441106a290000370300200241e0006a41086a200441086a290000370300200220042900003703604100210a0240024020090d002008450d014100210a2008210c0340200c410176220d200a6a220e200a2007200e4105746a200241e0006a41201096044101481b210a200c200d6b220c41014b0d000b0b2007200a4105746a200241e0006a41201096040d00200b2104200b2005470d07200521040c0a0b200241206a41186a220a200241e0006a41186a290300370300200241206a41106a220f200241e0006a41106a290300370300200241206a41086a220c200241e0006a41086a29030037030020022002290360370320200241186a220d200a290300370300200241106a220a200f290300370300200241086a220f200c29030037030020022002290320370300200241c0006a41186a220c200d290300370300200241c0006a41106a220d200a290300370300200241c0006a41086a220a200f29030037030020022002290300370340412010262210450d0420102002290340370000201041186a200c290300370000201041106a200d290300370000201041086a200a2903003700002001280204211120012802002112200b2005460d014101210f41082113200641086a211441182115411021164120211741052118420521194220211a4100211b4101211c4101211d4101210a0c080b2014280200211e2006280200211f02400340200241e0006a20156a2220200b20156a290000370300200241e0006a20166a2221200b20166a290000370300200241e0006a20136a2222200b20136a2900003703002002200b290000370360200b20176a210b4100210a0240201e200f460d00201e450d024100210a201e210c0340200c200f76220d200a6a220e200a201f200e2018746a200241e0006a2017109604200f481b210a200c200d6b220c200f4b0d000b0b201f200a2018746a200241e0006a20171096040d01200b2005470d000c030b0b200241206a20156a220a2020290300370300200241206a20166a220c2021290300370300200241206a20136a220d202229030037030020022002290360370320200241c0006a20156a220e200a290300370300200241c0006a20166a220a200c290300370300200241c0006a20136a220c200d29030037030020022002290320370340200220156a220d200e290300370300200220166a220e200a290300370300200220136a221f200c290300370300200220022903403703000240201d201c470d00201c200f6a220a201c490d03201c200f74220c200a200a200c491b221dad2019862223201a88a70d032023a7220a201b480d030240201c450d002010201c201874200a102722100d010c060b200a10262210450d050b2010201c2018746a220a2002290300370000200a20156a200d290300370000200a20166a200e290300370000200a20136a201f290300370000201c200f6a211c200b2005470d060c010b4101211c4101211d0b02402011450d00201210230b2000201c3602082000201d3602042000201036020020024180016a24000f0b101e000b41204101102a000b200a4101102a000b4100210a0c010b4101210a0c000b0b2000410036020820004201370200024020042005460d00200141086a2004200520046b41606a4160716a41206a3602000b02402001280204450d00200128020010230b20024180016a24000b0c002000280200200110ad020bce7601027f230041106b22022400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020002d0000417f6a220341aa014b0d00024020030eab010002030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f80018101820183018401850186018701880189018a018b018c018d018e018f0190019101920193019401950196019701980199019a019b019c019d019e019f01a001a101a201a301a401a501a601a701a801a901aa01ab01000b200128021841d3eac40041032001411c6a28020028020c11020021010cb1010b200128021841c8eac400410b2001411c6a28020028020c11020021010cb0010b2002200128021841d6eac40041052001411c6a28020028020c1102003a000820022001360200200241003a000920024100360204410121012002200041016a36020c20022002410c6a41dceac40010de031a20022d0008210020022802042203450da9010240200041ff01710d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000caf010b2002200128021841eceac40041042001411c6a28020028020c1102003a000820022001360200200241003a000920024100360204410121012002200041016a36020c20022002410c6a41dceac40010de031a20022d0008210020022802042203450da9010240200041ff01710d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000cae010b2002200128021841f0eac40041022001411c6a28020028020c1102003a000820022001360200200241003a000920024100360204410121012002200041016a36020c20022002410c6a41dceac40010de031a20022d0008210020022802042203450da9010240200041ff01710d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000cad010b200128021841f2eac40041042001411c6a28020028020c11020021010cac010b200128021841f6eac40041032001411c6a28020028020c11020021010cab010b2002200128021841f9eac40041022001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de031a20022d0008210120022802042203450daa01200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000caa010b20022001280218418cebc40041042001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de031a20022d0008210120022802042203450da901200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000ca9010b200220012802184190ebc40041072001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a4198ebc40010de03210120022000410c6a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450da801200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000ca8010b200128021841a8ebc40041062001411c6a28020028020c11020021010ca7010b2002200128021841aeebc40041042001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de031a20022d0008210120022802042203450da601200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000ca6010b2002200128021841b2ebc400410c2001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c4101210120022002410c6a41fceac40010de0321032002200041016a36020c20032002410c6a41c0ebc40010de031a20022d0008210020022802042203450da2010240200041ff01710d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000ca5010b200128021841d0ebc40041042001411c6a28020028020c11020021010ca4010b200128021841d4ebc40041062001411c6a28020028020c11020021010ca3010b2002200128021841daebc40041082001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de031a20022d0008210120022802042203450da201200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000ca2010b2002200128021841e2ebc40041082001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de031a20022d0008210120022802042203450da101200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000ca1010b2002200128021841eaebc40041082001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de031a20022d0008210120022802042203450da001200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000ca0010b2002200128021841f2ebc40041092001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de031a20022d0008210120022802042203450d9f01200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c9f010b2002200128021841fbebc40041092001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de031a20022d0008210120022802042203450d9e01200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c9e010b200220012802184184ecc40041072001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d9d01200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c9d010b20022001280218418becc40041072001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d9c01200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c9c010b200220012802184192ecc40041072001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d9b01200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c9b010b200220012802184199ecc40041072001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d9a01200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c9a010b2002200128021841a0ecc40041092001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d9901200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c99010b2002200128021841a9ecc40041092001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d9801200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c98010b2002200128021841b2ecc400410a2001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d9701200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c97010b2002200128021841bcecc400410a2001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d9601200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c96010b2002200128021841c6ecc40041092001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d9501200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c95010b2002200128021841cfecc40041092001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d9401200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c94010b2002200128021841d8ecc400410a2001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d9301200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c93010b2002200128021841e2ecc400410a2001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d9201200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c92010b2002200128021841ececc400410a2001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d9101200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c91010b2002200128021841f6ecc400410a2001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d9001200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c90010b200220012802184180edc40041082001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d8f01200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c8f010b200220012802184188edc40041082001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d8e01200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c8e010b200220012802184190edc40041082001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d8d01200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c8d010b200220012802184198edc40041082001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d8c01200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c8c010b2002200128021841a0edc40041092001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d8b01200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c8b010b2002200128021841a9edc400410a2001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d8a01200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c8a010b2002200128021841b3edc40041092001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d8901200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c89010b2002200128021841bcedc400410a2001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d8801200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c88010b2002200128021841c6edc400410a2001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de0321012002200041086a36020c20012002410c6a41fceac40010de031a20022d0008210120022802042203450d8701200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c87010b2002200128021841d0edc400410d2001411c6a28020028020c1102003a000820022001360200200241003a000920024100360204410121012002200041016a36020c20022002410c6a41c0ebc40010de031a20022d0008210020022802042203450d84010240200041ff01710d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c86010b2002200128021841ddedc400410a2001411c6a28020028020c1102003a000820022001360200200241003a000920024100360204410121012002200041016a36020c20022002410c6a41c0ebc40010de031a20022d0008210020022802042203450d84010240200041ff01710d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c85010b2002200128021841e7edc40041082001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41f0edc40010de031a20022d0008210120022802042203450d8401200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c84010b200220012802184180eec40041082001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041086a36020c20022002410c6a4188eec40010de031a20022d0008210120022802042203450d8301200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c83010b200220012802184198eec40041082001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041046a36020c20022002410c6a41fceac40010de031a20022d0008210120022802042203450d8201200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c82010b2002200128021841a0eec40041082001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200041086a36020c20022002410c6a41a8eec40010de031a20022d0008210120022802042203450d8101200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000c81010b200128021841b8eec40041062001411c6a28020028020c11020021010c80010b200128021841beeec40041052001411c6a28020028020c11020021010c7f0b200128021841c3eec40041052001411c6a28020028020c11020021010c7e0b200128021841c8eec40041062001411c6a28020028020c11020021010c7d0b200128021841ceeec40041062001411c6a28020028020c11020021010c7c0b200128021841d4eec40041062001411c6a28020028020c11020021010c7b0b200128021841daeec40041062001411c6a28020028020c11020021010c7a0b200128021841e0eec40041062001411c6a28020028020c11020021010c790b200128021841e6eec40041062001411c6a28020028020c11020021010c780b200128021841eceec40041062001411c6a28020028020c11020021010c770b200128021841f2eec40041062001411c6a28020028020c11020021010c760b200128021841f8eec40041062001411c6a28020028020c11020021010c750b200128021841feeec40041052001411c6a28020028020c11020021010c740b20012802184183efc40041052001411c6a28020028020c11020021010c730b20012802184188efc40041062001411c6a28020028020c11020021010c720b2001280218418eefc40041062001411c6a28020028020c11020021010c710b20012802184194efc40041062001411c6a28020028020c11020021010c700b2001280218419aefc40041062001411c6a28020028020c11020021010c6f0b200128021841a0efc40041062001411c6a28020028020c11020021010c6e0b200128021841a6efc40041062001411c6a28020028020c11020021010c6d0b200128021841acefc40041062001411c6a28020028020c11020021010c6c0b200128021841b2efc40041062001411c6a28020028020c11020021010c6b0b200128021841b8efc40041052001411c6a28020028020c11020021010c6a0b200128021841bdefc40041052001411c6a28020028020c11020021010c690b200128021841c2efc40041052001411c6a28020028020c11020021010c680b200128021841c7efc40041052001411c6a28020028020c11020021010c670b200128021841ccefc40041052001411c6a28020028020c11020021010c660b200128021841d1efc40041052001411c6a28020028020c11020021010c650b200128021841d6efc40041052001411c6a28020028020c11020021010c640b200128021841dbefc40041052001411c6a28020028020c11020021010c630b200128021841e0efc40041052001411c6a28020028020c11020021010c620b200128021841e5efc40041052001411c6a28020028020c11020021010c610b200128021841eaefc40041052001411c6a28020028020c11020021010c600b200128021841efefc40041052001411c6a28020028020c11020021010c5f0b200128021841f4efc40041062001411c6a28020028020c11020021010c5e0b200128021841faefc40041062001411c6a28020028020c11020021010c5d0b20012802184180f0c40041092001411c6a28020028020c11020021010c5c0b20012802184189f0c40041062001411c6a28020028020c11020021010c5b0b2001280218418ff0c40041062001411c6a28020028020c11020021010c5a0b20012802184195f0c40041062001411c6a28020028020c11020021010c590b2001280218419bf0c40041072001411c6a28020028020c11020021010c580b200128021841a2f0c40041072001411c6a28020028020c11020021010c570b200128021841a9f0c40041072001411c6a28020028020c11020021010c560b200128021841b0f0c40041072001411c6a28020028020c11020021010c550b200128021841b7f0c40041062001411c6a28020028020c11020021010c540b200128021841bdf0c40041052001411c6a28020028020c11020021010c530b200128021841c2f0c40041062001411c6a28020028020c11020021010c520b200128021841c8f0c40041062001411c6a28020028020c11020021010c510b200128021841cef0c40041072001411c6a28020028020c11020021010c500b200128021841d5f0c40041072001411c6a28020028020c11020021010c4f0b200128021841dcf0c40041072001411c6a28020028020c11020021010c4e0b200128021841e3f0c40041072001411c6a28020028020c11020021010c4d0b200128021841eaf0c40041062001411c6a28020028020c11020021010c4c0b200128021841f0f0c40041062001411c6a28020028020c11020021010c4b0b200128021841f6f0c40041092001411c6a28020028020c11020021010c4a0b200128021841fff0c40041062001411c6a28020028020c11020021010c490b20012802184185f1c40041062001411c6a28020028020c11020021010c480b2001280218418bf1c40041062001411c6a28020028020c11020021010c470b20012802184191f1c40041072001411c6a28020028020c11020021010c460b20012802184198f1c40041072001411c6a28020028020c11020021010c450b2001280218419ff1c40041072001411c6a28020028020c11020021010c440b200128021841a6f1c40041072001411c6a28020028020c11020021010c430b200128021841adf1c40041062001411c6a28020028020c11020021010c420b200128021841b3f1c40041052001411c6a28020028020c11020021010c410b200128021841b8f1c40041062001411c6a28020028020c11020021010c400b200128021841bef1c40041062001411c6a28020028020c11020021010c3f0b200128021841c4f1c40041072001411c6a28020028020c11020021010c3e0b200128021841cbf1c40041072001411c6a28020028020c11020021010c3d0b200128021841d2f1c40041072001411c6a28020028020c11020021010c3c0b200128021841d9f1c40041072001411c6a28020028020c11020021010c3b0b200128021841e0f1c40041062001411c6a28020028020c11020021010c3a0b200128021841e6f1c40041062001411c6a28020028020c11020021010c390b200128021841ecf1c40041072001411c6a28020028020c11020021010c380b200128021841f3f1c40041082001411c6a28020028020c11020021010c370b200128021841fbf1c40041082001411c6a28020028020c11020021010c360b20012802184183f2c400410a2001411c6a28020028020c11020021010c350b2001280218418df2c40041072001411c6a28020028020c11020021010c340b20012802184194f2c40041062001411c6a28020028020c11020021010c330b2001280218419af2c40041062001411c6a28020028020c11020021010c320b200128021841a0f2c40041062001411c6a28020028020c11020021010c310b200128021841a6f2c40041062001411c6a28020028020c11020021010c300b200128021841acf2c40041062001411c6a28020028020c11020021010c2f0b200128021841b2f2c40041062001411c6a28020028020c11020021010c2e0b200128021841b8f2c400410b2001411c6a28020028020c11020021010c2d0b200128021841c3f2c40041062001411c6a28020028020c11020021010c2c0b200128021841c9f2c40041062001411c6a28020028020c11020021010c2b0b200128021841cff2c40041072001411c6a28020028020c11020021010c2a0b200128021841d6f2c40041082001411c6a28020028020c11020021010c290b200128021841def2c40041082001411c6a28020028020c11020021010c280b200128021841e6f2c400410a2001411c6a28020028020c11020021010c270b200128021841f0f2c40041072001411c6a28020028020c11020021010c260b200128021841f7f2c40041062001411c6a28020028020c11020021010c250b200128021841fdf2c40041062001411c6a28020028020c11020021010c240b20012802184183f3c40041062001411c6a28020028020c11020021010c230b20012802184189f3c40041062001411c6a28020028020c11020021010c220b2001280218418ff3c40041062001411c6a28020028020c11020021010c210b20012802184195f3c40041062001411c6a28020028020c11020021010c200b2001280218419bf3c400410b2001411c6a28020028020c11020021010c1f0b200128021841a6f3c400410a2001411c6a28020028020c11020021010c1e0b200128021841b0f3c400410c2001411c6a28020028020c11020021010c1d0b200128021841bcf3c400410c2001411c6a28020028020c11020021010c1c0b200128021841c8f3c400410c2001411c6a28020028020c11020021010c1b0b200128021841d4f3c400410c2001411c6a28020028020c11020021010c1a0b200128021841e0f3c400410d2001411c6a28020028020c11020021010c190b200128021841edf3c400410d2001411c6a28020028020c11020021010c180b200128021841faf3c400410c2001411c6a28020028020c11020021010c170b20012802184186f4c400410c2001411c6a28020028020c11020021010c160b20012802184192f4c400410c2001411c6a28020028020c11020021010c150b2001280218419ef4c400410c2001411c6a28020028020c11020021010c140b200128021841aaf4c400410e2001411c6a28020028020c11020021010c130b200128021841b8f4c400410e2001411c6a28020028020c11020021010c120b200128021841c6f4c400410e2001411c6a28020028020c11020021010c110b200128021841d4f4c400410e2001411c6a28020028020c11020021010c100b200128021841e2f4c400410c2001411c6a28020028020c11020021010c0f0b200128021841eef4c400410e2001411c6a28020028020c11020021010c0e0b200128021841fcf4c400410e2001411c6a28020028020c11020021010c0d0b2001280218418af5c400410e2001411c6a28020028020c11020021010c0c0b20012802184198f5c400410e2001411c6a28020028020c11020021010c0b0b200128021841a6f5c400410d2001411c6a28020028020c11020021010c0a0b200128021841b3f5c40041112001411c6a28020028020c11020021010c090b200128021841c4f5c40041112001411c6a28020028020c11020021010c080b200128021841d5f5c40041112001411c6a28020028020c11020021010c070b200128021841e6f5c40041112001411c6a28020028020c11020021010c060b200021010c050b200021010c040b200021010c030b200021010c020b200021010c010b200021010b200241106a2400200141ff01714100470bd3ec0203077f017e037f230041106b2203240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d0000417f6a220441aa014b0d000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040eab01000b1c1001ab01a801aa01a401240d14a90104151b9b01541e2555063607a201890173279201a101a70135090f8a013a9e01a50105023b44754c74578e01030a47177a7c4285017926297b8b01080e282f1319950197012399019d01a6015ea301189c01611f5d129f01a00121930177760c1145482b1698011d6332940191018c012c1a379a013d2a674d5868644e8001437f318d0188012e8f019601204941309001723e228101624b7d86012d34333940705f6f84018301388701515282017869657e6c603c563f6a4f466d506e5a6b664a59535b5c000b200241086a2802002002410c6a2802002204470dcf01200441016a22052004490dfe0720044101742206200520052006491b22064100480dfe072004450d9f03200241046a2802002004200610272205450da0030c8e080b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dfd0720044101742206200520052006491b22064100480dfd072004450dd602200241046a2802002004200610272205450dd7020c8b080b200241046a2107200141086a2802002106200141046a2802002105200241086a2802002002410c6a2802002204470daa01200441016a22082004490d870820044101742209200820082009491b22084100480d87082004450dd70220072802002004200810272209450dd8020c85080b200241046a2105200141086a290300210a200241086a2802002002410c6a2802002204470daa01200441016a22062004490d860820044101742208200620062008491b22084100480d86082004450dd80220052802002004200810272206450dd9020c82080b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dfa0720044101742206200520052006491b22064100480dfa072004450dd902200241046a2802002004200610272205450dda020cff070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490d840820044101742209200820082009491b22084100480d84082004450dda0220072802002004200810272209450ddb020cfc070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490df80720044101742209200820082009491b22084100480df8072004450ddb0220072802002004200810272209450ddc020cf6070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490df70720044101742209200820082009491b22084100480df7072004450ddc0220072802002004200810272209450ddd020cf3070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d810820044101742206200520052006491b22064100480d81082004450ddd02200241046a2802002004200610272205450dde020cf0070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490df50720044101742209200820082009491b22084100480df5072004450dde0220072802002004200810272209450ddf020ced070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dff0720044101742206200520052006491b22064100480dff072004450ddf02200241046a2802002004200610272205450de0020cea070b200241046a210520012d00012108200241086a2802002002410c6a2802002204470daa01200441016a22062004490df30720044101742209200620062009491b22094100480df3072004450de00220052802002004200910272206450de1020ce7070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490da30520044101742206200520052006491b22064100480da3052004450de102200241046a2802002004200610272205450de2020ce4070b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470daa01200641016a22052006490df10720064101742208200520052008491b22054100480df1072006450de20220072802002006200510272208450de3020ce1070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dfb0720044101742206200520052006491b22064100480dfb072004450de302200241046a2802002004200610272205450de4020cde070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470daa01200441016a22082004490dfa0720044101742209200820082009491b22084100480dfa072004450de40220072802002004200810272209450de5020cdb070b200241046a210520012d00012108200241086a2802002002410c6a2802002204470daa01200441016a22062004490dee0720044101742209200620062009491b22094100480dee072004450de50220052802002004200910272206450de6020cd8070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d9e0520044101742206200520052006491b22064100480d9e052004450de602200241046a2802002004200610272205450de7020cd5070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df70720044101742206200520052006491b22064100480df7072004450de702200241046a2802002004200610272205450de8020cd2070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df60720044101742206200520052006491b22064100480df6072004450de802200241046a2802002004200610272205450de9020ccf070b200241046a210b200141046a280200210520012d0001210c200241086a2802002002410c6a2802002204470daa01200441016a22062004490dea0720044101742208200620062008491b22064100480dea072004450de902200b2802002004200610272208450dea020ccc070b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470daa01200641016a22052006490de90720064101742208200520052008491b22054100480de9072006450dea0220072802002006200510272208450deb020cc9070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d990520044101742206200520052006491b22064100480d99052004450deb02200241046a2802002004200610272205450dec020cc6070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df20720044101742206200520052006491b22064100480df2072004450dec02200241046a2802002004200610272205450ded020cc3070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df10720044101742206200520052006491b22064100480df1072004450ded02200241046a2802002004200610272205450dee020cc0070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490df00720044101742206200520052006491b22064100480df0072004450dee02200241046a2802002004200610272205450def020cbd070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d950520044101742206200520052006491b22064100480d95052004450def02200241046a2802002004200610272205450df0020cba070b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470daa01200641016a22052006490de30720064101742208200520052008491b22054100480de3072006450df00220072802002006200510272208450df1020cb7070b200241046a210520012d00012108200241086a2802002002410c6a2802002204470daa01200441016a22062004490de20720044101742209200620062009491b22094100480de2072004450df10220052802002004200910272206450df2020cb4070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d920520044101742206200520052006491b22064100480d92052004450df202200241046a2802002004200610272205450df3020cb1070b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470daa01200641016a22052006490de00720064101742208200520052008491b22054100480de0072006450df30220072802002006200510272208450df4020cae070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dea0720044101742206200520052006491b22064100480dea072004450df402200241046a2802002004200610272205450df5020cab070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d8f0520044101742206200520052006491b22064100480d8f052004450df502200241046a2802002004200610272205450df6020ca8070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490de80720044101742206200520052006491b22064100480de8072004450df602200241046a2802002004200610272205450df7020ca5070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490d8d0520044101742206200520052006491b22064100480d8d052004450df702200241046a2802002004200610272205450df8020ca2070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490de60720044101742206200520052006491b22064100480de6072004450df802200241046a2802002004200610272205450df9020c9f070b200241086a2802002002410c6a2802002204470daa01200441016a22052004490dda0720044101742206200520052006491b22064100480dda072004450df902200241046a2802002004200610272205450dfa020c9c070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dd90720044101742209200820082009491b22084100480dd9072004450dfc0220072802002004200810272209450dfd020c99070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de30720044101742206200520052006491b22064100480de3072004450dfd02200241046a2802002004200610272205450dfe020c96070b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dd70720044101742209200820082009491b22084100480dd7072004450dfe0220072802002004200810272209450dff020c93070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de10720044101742206200520052006491b22064100480de1072004450dff02200241046a2802002004200610272205450d80030c90070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de00720044101742206200520052006491b22064100480de0072004450d8003200241046a2802002004200610272205450d81030c8d070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d850520044101742206200520052006491b22064100480d85052004450d8103200241046a2802002004200610272205450d82030c8a070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d840520044101742206200520052006491b22064100480d84052004450d8203200241046a2802002004200610272205450d83030c87070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d830520044101742206200520052006491b22064100480d83052004450d8303200241046a2802002004200610272205450d84030c84070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d820520044101742206200520052006491b22064100480d82052004450d8403200241046a2802002004200610272205450d85030c81070b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d810520044101742206200520052006491b22064100480d81052004450d8503200241046a2802002004200610272205450d86030cfe060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dda0720044101742206200520052006491b22064100480dda072004450d8603200241046a2802002004200610272205450d87030cfb060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dff0420044101742206200520052006491b22064100480dff042004450d8703200241046a2802002004200610272205450d88030cf8060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfe0420044101742206200520052006491b22064100480dfe042004450d8803200241046a2802002004200610272205450d89030cf5060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfd0420044101742206200520052006491b22064100480dfd042004450d8903200241046a2802002004200610272205450d8a030cf2060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfc0420044101742206200520052006491b22064100480dfc042004450d8a03200241046a2802002004200610272205450d8b030cef060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfb0420044101742206200520052006491b22064100480dfb042004450d8b03200241046a2802002004200610272205450d8c030cec060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dc90720044101742209200820082009491b22084100480dc9072004450d8c0320072802002004200810272209450d8d030ce9060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dc80720044101742209200820082009491b22084100480dc8072004450d8d0320072802002004200810272209450d8e030ce6060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df80420044101742206200520052006491b22064100480df8042004450d8e03200241046a2802002004200610272205450d8f030ce3060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df70420044101742206200520052006491b22064100480df7042004450d8f03200241046a2802002004200610272205450d90030ce0060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df60420044101742206200520052006491b22064100480df6042004450d9003200241046a2802002004200610272205450d91030cdd060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dcf0720044101742209200820082009491b22084100480dcf072004450d910320072802002004200810272209450d92030cda060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dce0720044101742209200820082009491b22084100480dce072004450d920320072802002004200810272209450d93030cd7060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df30420044101742206200520052006491b22064100480df3042004450d9303200241046a2802002004200610272205450d94030cd4060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df20420044101742206200520052006491b22064100480df2042004450d9403200241046a2802002004200610272205450d95030cd1060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df10420044101742206200520052006491b22064100480df1042004450d9503200241046a2802002004200610272205450d96030cce060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df00420044101742206200520052006491b22064100480df0042004450d9603200241046a2802002004200610272205450d97030ccb060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490def0420044101742206200520052006491b22064100480def042004450d9703200241046a2802002004200610272205450d98030cc8060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dee0420044101742206200520052006491b22064100480dee042004450d9803200241046a2802002004200610272205450d99030cc5060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc70720044101742206200520052006491b22064100480dc7072004450d9903200241046a2802002004200610272205450d9a030cc2060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dec0420044101742206200520052006491b22064100480dec042004450d9a03200241046a2802002004200610272205450d9b030cbf060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dc50720044101742209200820082009491b22084100480dc5072004450d9b0320072802002004200810272209450d9c030cbc060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dea0420044101742206200520052006491b22064100480dea042004450d9c03200241046a2802002004200610272205450d9d030cb9060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dea0420044101742206200520052006491b22064100480dea042004450d9d03200241046a2802002004200610272205450d9e030cb6060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc20720044101742206200520052006491b22064100480dc2072004450d9e03200241046a2802002004200610272205450d9f030cb3060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de70420044101742206200520052006491b22064100480de7042004450d9f03200241046a2802002004200610272205450da0030cb0060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de60420044101742206200520052006491b22064100480de6042004450da003200241046a2802002004200610272205450da1030cad060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de60420044101742206200520052006491b22064100480de6042004450da103200241046a2802002004200610272205450da2030caa060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de40420044101742206200520052006491b22064100480de4042004450da203200241046a2802002004200610272205450da3030ca7060b200241046a210520012d00012108200241086a2802002002410c6a2802002204470dab01200441016a22062004490dbd0720044101742209200620062009491b22094100480dbd072004450da30320052802002004200910272206450da4030ca4060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de20420044101742206200520052006491b22064100480de2042004450da403200241046a2802002004200610272205450da5030ca1060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de10420044101742206200520052006491b22064100480de1042004450da503200241046a2802002004200610272205450da6030c9e060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de00420044101742206200520052006491b22064100480de0042004450da603200241046a2802002004200610272205450da7030c9b060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de00420044101742206200520052006491b22064100480de0042004450da703200241046a2802002004200610272205450da8030c98060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dde0420044101742206200520052006491b22064100480dde042004450da803200241046a2802002004200610272205450da9030c95060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490ddd0420044101742206200520052006491b22064100480ddd042004450da903200241046a2802002004200610272205450daa030c92060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490ddd0420044101742206200520052006491b22064100480ddd042004450daa03200241046a2802002004200610272205450dab030c8f060b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470dab01200641016a22052006490daa0720064101742208200520052008491b22054100480daa072006450dab0320072802002006200510272208450dac030c8c060b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490da90720044101742209200820082009491b22084100480da9072004450dac0320072802002004200810272209450dad030c89060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd90420044101742206200520052006491b22064100480dd9042004450dad03200241046a2802002004200610272205450dae030c86060b200141086a290300210a200241086a2802002002410c6a2802002204470dab01200441016a22052004490db20720044101742206200520052006491b22064100480db2072004450dae03200241046a2802002004200610272205450daf030c82060b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd70420044101742206200520052006491b22064100480dd7042004450daf03200241046a2802002004200610272205450db0030cff050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd70420044101742206200520052006491b22064100480dd7042004450db003200241046a2802002004200610272205450db1030cfc050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd60420044101742206200520052006491b22064100480dd6042004450db103200241046a2802002004200610272205450db2030cf9050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd50420044101742206200520052006491b22064100480dd5042004450db203200241046a2802002004200610272205450db3030cf6050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd40420044101742206200520052006491b22064100480dd4042004450db303200241046a2802002004200610272205450db4030cf3050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dac0720044101742206200520052006491b22064100480dac072004450db403200241046a2802002004200610272205450db5030cf0050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dab0720044101742206200520052006491b22064100480dab072004450db503200241046a2802002004200610272205450db6030ced050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd00420044101742206200520052006491b22064100480dd0042004450db603200241046a2802002004200610272205450db7030cea050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dcf0420044101742206200520052006491b22064100480dcf042004450db703200241046a2802002004200610272205450db8030ce7050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da80720044101742206200520052006491b22064100480da8072004450db803200241046a2802002004200610272205450db9030ce4050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dcd0420044101742206200520052006491b22064100480dcd042004450db903200241046a2802002004200610272205450dba030ce1050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dcc0420044101742206200520052006491b22064100480dcc042004450dba03200241046a2802002004200610272205450dbb030cde050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dcb0420044101742206200520052006491b22064100480dcb042004450dbb03200241046a2802002004200610272205450dbc030cdb050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dca0420044101742206200520052006491b22064100480dca042004450dbc03200241046a2802002004200610272205450dbd030cd8050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dca0420044101742206200520052006491b22064100480dca042004450dbd03200241046a2802002004200610272205450dbe030cd5050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc80420044101742206200520052006491b22064100480dc8042004450dbe03200241046a2802002004200610272205450dbf030cd2050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc70420044101742206200520052006491b22064100480dc7042004450dbf03200241046a2802002004200610272205450dc0030ccf050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc60420044101742206200520052006491b22064100480dc6042004450dc003200241046a2802002004200610272205450dc1030ccc050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc50420044101742206200520052006491b22064100480dc5042004450dc103200241046a2802002004200610272205450dc2030cc9050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc50420044101742206200520052006491b22064100480dc5042004450dc203200241046a2802002004200610272205450dc3030cc6050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc30420044101742206200520052006491b22064100480dc3042004450dc303200241046a2802002004200610272205450dc4030cc3050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc30420044101742206200520052006491b22064100480dc3042004450dc403200241046a2802002004200610272205450dc5030cc0050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc20420044101742206200520052006491b22064100480dc2042004450dc503200241046a2802002004200610272205450dc6030cbd050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dc00420044101742206200520052006491b22064100480dc0042004450dc603200241046a2802002004200610272205450dc7030cba050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dbf0420044101742206200520052006491b22064100480dbf042004450dc703200241046a2802002004200610272205450dc8030cb7050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d8d0720044101742206200520052006491b22064100480d8d072004450dc803200241046a2802002004200610272205450dc9030cb4050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dbd0420044101742206200520052006491b22064100480dbd042004450dc903200241046a2802002004200610272205450dca030cb1050b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490d8b0720044101742209200820082009491b22084100480d8b072004450dca0320072802002004200810272209450dcb030cae050b200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22052004490d950720044101742208200520052008491b22084100480d95072004450dcb03200241046a2802002004200810272205450dcc030cab050b200241046a210520012d00012108200241086a2802002002410c6a2802002204470dab01200441016a22062004490d940720044101742209200620062009491b22094100480d94072004450dcc0320052802002004200910272206450dcd030ca8050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db90420044101742206200520052006491b22064100480db9042004450dcd03200241046a2802002004200610272205450dce030ca5050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db80420044101742206200520052006491b22064100480db8042004450dce03200241046a2802002004200610272205450dcf030ca2050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db70420044101742206200520052006491b22064100480db7042004450dcf03200241046a2802002004200610272205450dd0030c9f050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d900720044101742206200520052006491b22064100480d90072004450dd003200241046a2802002004200610272205450dd1030c9c050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d8f0720044101742206200520052006491b22064100480d8f072004450dd103200241046a2802002004200610272205450dd2030c99050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d8e0720044101742206200520052006491b22064100480d8e072004450dd203200241046a2802002004200610272205450dd3030c96050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d8d0720044101742206200520052006491b22064100480d8d072004450dd303200241046a2802002004200610272205450dd4030c93050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db20420044101742206200520052006491b22064100480db2042004450dd403200241046a2802002004200610272205450dd5030c90050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db10420044101742206200520052006491b22064100480db1042004450dd503200241046a2802002004200610272205450dd6030c8d050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490db00420044101742206200520052006491b22064100480db0042004450dd603200241046a2802002004200610272205450dd7030c8a050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490daf0420044101742206200520052006491b22064100480daf042004450dd703200241046a2802002004200610272205450dd8030c87050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dae0420044101742206200520052006491b22064100480dae042004450dd803200241046a2802002004200610272205450dd9030c84050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dad0420044101742206200520052006491b22064100480dad042004450dd903200241046a2802002004200610272205450dda030c81050b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dac0420044101742206200520052006491b22064100480dac042004450dda03200241046a2802002004200610272205450ddb030cfe040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dab0420044101742206200520052006491b22064100480dab042004450ddb03200241046a2802002004200610272205450ddc030cfb040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d840720044101742206200520052006491b22064100480d84072004450ddc03200241046a2802002004200610272205450ddd030cf8040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da90420044101742206200520052006491b22064100480da9042004450ddd03200241046a2802002004200610272205450dde030cf5040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da80420044101742206200520052006491b22064100480da8042004450dde03200241046a2802002004200610272205450ddf030cf2040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da70420044101742206200520052006491b22064100480da7042004450ddf03200241046a2802002004200610272205450de0030cef040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490df50620044101742209200820082009491b22084100480df5062004450de00320072802002004200810272209450de1030cec040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dff0620044101742209200820082009491b22084100480dff062004450de10320072802002004200810272209450de2030ce9040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dfe0620044101742206200520052006491b22064100480dfe062004450de203200241046a2802002004200610272205450de3030ce6040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da30420044101742206200520052006491b22064100480da3042004450de303200241046a2802002004200610272205450de4030ce3040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da20420044101742206200520052006491b22064100480da2042004450de403200241046a2802002004200610272205450de5030ce0040b200241046a2105200141046a2802002108200241086a2802002002410c6a2802002204470dab01200441016a22062004490dfb0620044101742209200620062009491b22094100480dfb062004450de50320052802002004200910272206450de6030cdd040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490da00420044101742206200520052006491b22064100480da0042004450de603200241046a2802002004200610272205450de7030cda040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d9f0420044101742206200520052006491b22064100480d9f042004450de703200241046a2802002004200610272205450de8030cd7040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d9e0420044101742206200520052006491b22064100480d9e042004450de803200241046a2802002004200610272205450de9030cd4040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dec0620044101742209200820082009491b22084100480dec062004450de90320072802002004200810272209450dea030cd1040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df60620044101742206200520052006491b22064100480df6062004450dea03200241046a2802002004200610272205450deb030cce040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d9b0420044101742206200520052006491b22064100480d9b042004450deb03200241046a2802002004200610272205450dec030ccb040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df40620044101742206200520052006491b22064100480df4062004450dec03200241046a2802002004200610272205450ded030cc8040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d990420044101742206200520052006491b22064100480d99042004450ded03200241046a2802002004200610272205450dee030cc5040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df20620044101742206200520052006491b22064100480df2062004450dee03200241046a2802002004200610272205450def030cc2040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d970420044101742206200520052006491b22064100480d97042004450def03200241046a2802002004200610272205450df0030cbf040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490df00620044101742206200520052006491b22064100480df0062004450df003200241046a2802002004200610272205450df1030cbc040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490d950420044101742206200520052006491b22064100480d95042004450df103200241046a2802002004200610272205450df2030cb9040b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470dab01200641016a22052006490de30620064101742208200520052008491b22054100480de3062006450df20320072802002006200510272208450df3030cb6040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490ded0620044101742206200520052006491b22064100480ded062004450df303200241046a2802002004200610272205450df4030cb3040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dec0620044101742206200520052006491b22064100480dec062004450df403200241046a2802002004200610272205450df5030cb0040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490deb0620044101742209200820082009491b22084100480deb062004450df50320072802002004200810272209450df6030cad040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dea0620044101742206200520052006491b22064100480dea062004450df603200241046a2802002004200610272205450df7030caa040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de90620044101742206200520052006491b22064100480de9062004450df703200241046a2802002004200610272205450df8030ca7040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490ddd0620044101742209200820082009491b22084100480ddd062004450df80320072802002004200810272209450df9030ca4040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490ddc0620044101742209200820082009491b22084100480ddc062004450df90320072802002004200810272209450dfa030ca1040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de60620044101742206200520052006491b22064100480de6062004450dfa03200241046a2802002004200610272205450dfb030c9e040b200241046a21092001410c6a2802002104200141086a280200210b200141046a280200210d200241086a2802002002410c6a2802002205470dab01200541016a22012005490dda0620054101742206200120012006491b22014100480dda062005450dfb0320092802002005200110272206450dfc030c9b040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490de40620044101742209200820082009491b22084100480de4062004450dfc0320072802002004200810272209450dfd030c98040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490de30620044101742206200520052006491b22064100480de3062004450dfd03200241046a2802002004200610272205450dfe030c95040b200241046a2107200141086a2802002105200141046a2802002106200241086a2802002002410c6a2802002204470dab01200441016a22082004490dd70620044101742209200820082009491b22084100480dd7062004450dfe0320072802002004200810272209450dff030c92040b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470dab01200641016a22052006490dd60620064101742208200520052008491b22054100480dd6062006450dff0320072802002006200510272208450d80040c8f040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd50620044101742206200520052006491b22064100480dd5062004450d8004200241046a2802002004200610272205450d81040c8c040b200241046a2107200141046a2802002104200241086a2802002002410c6a2802002206470dab01200641016a22052006490dd40620064101742208200520052008491b22054100480dd4062006450d810420072802002006200510272208450d82040c89040b200241086a2802002002410c6a2802002204470dab01200441016a22052004490dd30620044101742206200520052006491b22064100480dd3062004450d8204200241046a2802002004200610272205450d83040c86040b200241046a28020021050ce1060b200728020021090cdb060b200528020021060cd8060b200241046a28020021050cd5060b200728020021090cd2060b200728020021090ccc060b200728020021090cc9060b200241046a28020021050cc6060b200728020021090cc3060b200241046a28020021050cc0060b200528020021060cbd060b200241046a28020021050cba060b200728020021080cb7060b200241046a28020021050cb4060b200728020021090cb1060b200528020021060cae060b200241046a28020021050cab060b200241046a28020021050ca8060b200241046a28020021050ca5060b200b28020021080ca2060b200728020021080c9f060b200241046a28020021050c9c060b200241046a28020021050c99060b200241046a28020021050c96060b200241046a28020021050c93060b200241046a28020021050c90060b200728020021080c8d060b200528020021060c8a060b200241046a28020021050c87060b200728020021080c84060b200241046a28020021050c81060b200241046a28020021050cfe050b200241046a28020021050cfb050b200241046a28020021050cf8050b200241046a28020021050cf5050b200241046a28020021050cf2050b200241046a28020021050cbf060b200728020021090cee050b200241046a28020021050ceb050b200728020021090ce8050b200241046a28020021050ce5050b200241046a28020021050ce2050b200241046a28020021050cdf050b200241046a28020021050cdc050b200241046a28020021050cd9050b200241046a28020021050cd6050b200241046a28020021050cd3050b200241046a28020021050cd0050b200241046a28020021050ccd050b200241046a28020021050cca050b200241046a28020021050cc7050b200241046a28020021050cc4050b200241046a28020021050cc1050b200728020021090cbe050b200728020021090cbb050b200241046a28020021050cb8050b200241046a28020021050cb5050b200241046a28020021050cb2050b200728020021090caf050b200728020021090cac050b200241046a28020021050ca9050b200241046a28020021050ca6050b200241046a28020021050ca3050b200241046a28020021050ca0050b200241046a28020021050c9d050b200241046a28020021050c9a050b200241046a28020021050c97050b200241046a28020021050c94050b200728020021090c91050b200241046a28020021050c8e050b200241046a28020021050c8b050b200241046a28020021050c88050b200241046a28020021050c85050b200241046a28020021050c82050b200241046a28020021050cff040b200241046a28020021050cfc040b200528020021060cf9040b200241046a28020021050cf6040b200241046a28020021050cf3040b200241046a28020021050cf0040b200241046a28020021050ced040b200241046a28020021050cea040b200241046a28020021050ce7040b200241046a28020021050ce4040b200728020021080ce1040b200728020021090cde040b200241046a28020021050cdb040b200241046a28020021050cd7040b200241046a28020021050cd4040b200241046a28020021050cd1040b200241046a28020021050cce040b200241046a28020021050ccb040b200241046a28020021050cc8040b200241046a28020021050cc5040b200241046a28020021050cc2040b200241046a28020021050cbf040b200241046a28020021050cbc040b200241046a28020021050cb9040b200241046a28020021050cb6040b200241046a28020021050cb3040b200241046a28020021050cb0040b200241046a28020021050cad040b200241046a28020021050caa040b200241046a28020021050ca7040b200241046a28020021050ca4040b200241046a28020021050ca1040b200241046a28020021050c9e040b200241046a28020021050c9b040b200241046a28020021050c98040b200241046a28020021050c95040b200241046a28020021050c92040b200241046a28020021050c8f040b200241046a28020021050c8c040b200241046a28020021050c89040b200241046a28020021050c86040b200728020021090c83040b200241046a28020021050c80040b200528020021060cfd030b200241046a28020021050cfa030b200241046a28020021050cf7030b200241046a28020021050cf4030b200241046a28020021050cf1030b200241046a28020021050cee030b200241046a28020021050ceb030b200241046a28020021050ce8030b200241046a28020021050ce5030b200241046a28020021050ce2030b200241046a28020021050cdf030b200241046a28020021050cdc030b200241046a28020021050cd9030b200241046a28020021050cd6030b200241046a28020021050cd3030b200241046a28020021050cd0030b200241046a28020021050ccd030b200241046a28020021050cca030b200241046a28020021050cc7030b200241046a28020021050cc4030b200728020021090cc1030b200728020021090cbe030b200241046a28020021050cbb030b200241046a28020021050cb8030b200241046a28020021050cb5030b200528020021060cb2030b200241046a28020021050caf030b200241046a28020021050cac030b200241046a28020021050ca9030b200728020021090ca6030b200241046a28020021050ca3030b200241046a28020021050ca0030b200241046a28020021050c9d030b200241046a28020021050c9a030b200241046a28020021050c97030b200241046a28020021050c94030b200241046a28020021050c91030b200241046a28020021050c8e030b200728020021080c8b030b200241046a28020021050c88030b200241046a28020021050c85030b200728020021090c82030b200241046a28020021050cff020b200241046a28020021050cfc020b200728020021090cf9020b200728020021090cf6020b200241046a28020021050cf3020b200928020021060cf0020b200728020021090ced020b200241046a28020021050cea020b200728020021090ce7020b200728020021080ce4020b200241046a28020021050ce1020b200728020021080cde020b200241046a28020021050cdb020b2006102622050db4050b20064101102a000b2008102622090dad050b20084101102a000b2008102622060da9050b20084101102a000b2006102622050da5050b20064101102a000b2008102622090da1050b20084101102a000b2008102622090d9a050b20084101102a000b2008102622090d96050b20084101102a000b2006102622050d92050b20064101102a000b2008102622090d8e050b20084101102a000b2006102622050d8a050b20064101102a000b2009102622060d86050b20094101102a000b2006102622050d82050b20064101102a000b2005102622080dfe040b20054101102a000b2006102622050dfa040b20064101102a000b2008102622090df6040b20084101102a000b2009102622060df2040b20094101102a000b2006102622050dee040b20064101102a000b2006102622050dea040b20064101102a000b2006102622050de6040b20064101102a000b2006102622080de2040b20064101102a000b2005102622080dde040b20054101102a000b2006102622050dda040b20064101102a000b2006102622050dd6040b20064101102a000b2006102622050dd2040b20064101102a000b2006102622050dce040b20064101102a000b2006102622050dca040b20064101102a000b2005102622080dc6040b20054101102a000b2009102622060dc2040b20094101102a000b2006102622050dbe040b20064101102a000b2005102622080dba040b20054101102a000b2006102622050db6040b20064101102a000b2006102622050db2040b20064101102a000b2006102622050dae040b20064101102a000b2006102622050daa040b20064101102a000b2006102622050da6040b20064101102a000b2006102622050da2040b20064101102a000b2006102622050dee040b20064101102a000b2008102622090d9c040b20084101102a000b2006102622050d98040b20064101102a000b2008102622090d94040b20084101102a000b2006102622050d90040b20064101102a000b2006102622050d8c040b20064101102a000b2006102622050d88040b20064101102a000b2006102622050d84040b20064101102a000b2006102622050d80040b20064101102a000b2006102622050dfc030b20064101102a000b2006102622050df8030b20064101102a000b2006102622050df4030b20064101102a000b2006102622050df0030b20064101102a000b2006102622050dec030b20064101102a000b2006102622050de8030b20064101102a000b2006102622050de4030b20064101102a000b2006102622050de0030b20064101102a000b2008102622090ddc030b20084101102a000b2008102622090dd8030b20084101102a000b2006102622050dd4030b20064101102a000b2006102622050dd0030b20064101102a000b2006102622050dcc030b20064101102a000b2008102622090dc8030b20084101102a000b2008102622090dc4030b20084101102a000b2006102622050dc0030b20064101102a000b2006102622050dbc030b20064101102a000b2006102622050db8030b20064101102a000b2006102622050db4030b20064101102a000b2006102622050db0030b20064101102a000b2006102622050dac030b20064101102a000b2006102622050da8030b20064101102a000b2006102622050da4030b20064101102a000b2008102622090da0030b20084101102a000b2006102622050d9c030b20064101102a000b2006102622050d98030b20064101102a000b2006102622050d94030b20064101102a000b2006102622050d90030b20064101102a000b2006102622050d8c030b20064101102a000b2006102622050d88030b20064101102a000b2006102622050d84030b20064101102a000b2009102622060d80030b20094101102a000b2006102622050dfc020b20064101102a000b2006102622050df8020b20064101102a000b2006102622050df4020b20064101102a000b2006102622050df0020b20064101102a000b2006102622050dec020b20064101102a000b2006102622050de8020b20064101102a000b2006102622050de4020b20064101102a000b2005102622080de0020b20054101102a000b2008102622090ddc020b20084101102a000b2006102622050dd8020b20064101102a000b2006102622050dd3020b20064101102a000b2006102622050dcf020b20064101102a000b2006102622050dcb020b20064101102a000b2006102622050dc7020b20064101102a000b2006102622050dc3020b20064101102a000b2006102622050dbf020b20064101102a000b2006102622050dbb020b20064101102a000b2006102622050db7020b20064101102a000b2006102622050db3020b20064101102a000b2006102622050daf020b20064101102a000b2006102622050dab020b20064101102a000b2006102622050da7020b20064101102a000b2006102622050da3020b20064101102a000b2006102622050d9f020b20064101102a000b2006102622050d9b020b20064101102a000b2006102622050d97020b20064101102a000b2006102622050d93020b20064101102a000b2006102622050d8f020b20064101102a000b2006102622050d8b020b20064101102a000b2006102622050d87020b20064101102a000b2006102622050d83020b20064101102a000b2006102622050dff010b20064101102a000b2006102622050dfb010b20064101102a000b2006102622050df7010b20064101102a000b2006102622050df3010b20064101102a000b2006102622050def010b20064101102a000b2006102622050deb010b20064101102a000b2006102622050de7010b20064101102a000b2008102622090de3010b20084101102a000b2008102622050ddf010b20084101102a000b2009102622060ddb010b20094101102a000b2006102622050dd7010b20064101102a000b2006102622050dd3010b20064101102a000b2006102622050dcf010b20064101102a000b2006102622050dcb010b20064101102a000b2006102622050dc7010b20064101102a000b2006102622050dc3010b20064101102a000b2006102622050dbf010b20064101102a000b2006102622050dbb010b20064101102a000b2006102622050db7010b20064101102a000b2006102622050db3010b20064101102a000b2006102622050daf010b20064101102a000b2006102622050dab010b20064101102a000b2006102622050da7010b20064101102a000b2006102622050da3010b20064101102a000b2006102622050d9f010b20064101102a000b2006102622050d9b010b20064101102a000b2006102622050d97010b20064101102a000b2006102622050d93010b20064101102a000b2006102622050d8f010b20064101102a000b2008102622090d8b010b20084101102a000b2008102622090d87010b20084101102a000b2006102622050d83010b20064101102a000b2006102622050d7f0b20064101102a000b2006102622050d7b0b20064101102a000b2009102622060d770b20094101102a000b2006102622050d730b20064101102a000b2006102622050d6f0b20064101102a000b2006102622050d6b0b20064101102a000b2008102622090d670b20084101102a000b2006102622050d630b20064101102a000b2006102622050d5f0b20064101102a000b2006102622050d5b0b20064101102a000b2006102622050d570b20064101102a000b2006102622050d530b20064101102a000b2006102622050d4f0b20064101102a000b2006102622050d4b0b20064101102a000b2006102622050d470b20064101102a000b2005102622080d430b20054101102a000b2006102622050d3f0b20064101102a000b2006102622050d3b0b20064101102a000b2008102622090d370b20084101102a000b2006102622050d330b20064101102a000b2006102622050d2f0b20064101102a000b2008102622090d2b0b20084101102a000b2008102622090d270b20084101102a000b2006102622050d230b20064101102a000b2001102622060d1f0b20014101102a000b2008102622090d1b0b20084101102a000b2006102622050d170b20064101102a000b2008102622090d130b20084101102a000b2005102622080d0f0b20054101102a000b2006102622050d0b0b20064101102a000b2005102622080d070b20054101102a000b2006102622050d030b20064101102a000b101e000b101e000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a410b3a00000cdd020b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a410d3a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490dcf0220024101742209200620062009491b22094100480dcf022002450d01200728020020022009102722060d020c050b200728020021060c020b200910262206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000cdd020b0b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a411a3a00000cd9020b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a410c3a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490dcb0220024101742209200620062009491b22094100480dcb022002450d01200728020020022009102722060d020c050b200728020021060c020b200910262206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000cd9020b0b20094101102a000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41333a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dca022004410174220d20092009200d491b220d4100480dca022004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dca0220024101742209200620062009491b22094100480dca022002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cd8020b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41dc003a00000cd3020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413a3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dd1022004410174220d20092009200d491b220d4100480dd1022004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dd10220024101742209200620062009491b22094100480dd1022002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cd4020b0b200d4101102a000b20094101102a000b200241086a2001360200200241046a20063602002002410c6a28020021050b2002410c6a2201200541016a360200200620056a410e3a00002003200b200d200d200b4102746a200210af020240024020032d0000411a470d00200241086a2106200241046a210703400240024002400240200628020020012802002202470d00200241016a22052002490dc40220024101742208200520052008491b22084100480dc4022002450d01200928020020022008102722050d020c060b200928020021050c020b200810262205450d040b2006200836020020072005360200200128020021020b2001200241016a360200200520026a200441807f72200441ff0071200441077622021b3a00002002210420020d000b0240200b41ffffffff0371450d00200d10230b2000411a3a0000200341106a24000f0b20002003290300370200200041086a200341086a290300370200200b41ffffffff0371450dd102200d1023200341106a24000f0b20084101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41de003a00000ccd020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412d3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dc0022004410174220d20092009200d491b220d4100480dc0022004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dc00220024101742209200620062009491b22094100480dc0022002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cce020b0b200d4101102a000b20094101102a000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41323a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dbe022004410174220d20092009200d491b220d4100480dbe022004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dbe0220024101742209200620062009491b22094100480dbe022002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000ccc020b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e6003a00000cc7020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e5003a00000cc5020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41393a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490dc3022004410174220d20092009200d491b220d4100480dc3022004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490dc30220024101742209200620062009491b22094100480dc3022002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cc6020b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41db003a00000cc1020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e0003a00000cbf020b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41223a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490db10220024101742209200620062009491b22094100480db1022002450d01200728020020022009102722060d020c050b200728020021060c020b200910262206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000cbf020b0b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fb003a00000cbb020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41da003a00000cb9020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f1003a00000cb7020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d8003a00000cb5020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418c013a00000cb3020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d7003a00000cb1020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f5003a00000caf020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e8003a00000cad020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41313a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490da0022004410174220d20092009200d491b220d4100480da0022004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490da00220024101742209200620062009491b22094100480da0022002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cae020b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f6003a00000ca9020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4191013a00000ca7020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418b013a00000ca5020b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41c3003a000002400240024002400240200241086a2802002206200928020022046b41044f0d00200441046a22092004490da10220064101742204200920092004491b22044100480da1022006450d0120052802002006200410272205450d020c030b200528020021050c030b2004102622050d010b20044101102a000b200241086a2004360200200241046a20053602002002410c6a28020021040b2002410c6a200441046a360200200520046a20083600000ca3020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4188013a00000ca1020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f7003a00000c9f020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d0003a00000c9d020b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41373a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d9b022004410174220d20092009200d491b220d4100480d9b022004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d9b0220024101742209200620062009491b22094100480d9b022002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c9e020b0b200d4101102a000b20094101102a000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412e3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d8e022004410174220d20092009200d491b220d4100480d8e022004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d8e0220024101742209200620062009491b22094100480d8e022002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c9c020b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4189013a00000c97020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a5013a00000c95020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4199013a00000c93020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cb003a00000c91020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a2013a00000c8f020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a3013a00000c8d020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a8013a00000c8b020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4195013a00000c89020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4184013a00000c87020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4186013a00000c85020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ac013a00000c83020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4198013a00000c81020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c9003a00000cff010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cf003a00000cfd010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c8003a00000cfb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cc003a00000cf9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a9013a00000cf7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e9003a00000cf5010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ea003a00000cf3010b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a413f3a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490def0120044101742209200620062009491b22064100480def012004450d0120052802002004200610272205450d020c030b200528020021050c030b2006102622050d010b20064101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a20083a00000cf1010b200241086a2008360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c1003a000020032006200210b00220032d0000411a460def0120002003290300370200200041086a200341086a29030037020020012d00004109470df0010c3a0b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412f3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490de2012004410174220d20092009200d491b220d4100480de2012004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490de20120024101742209200620062009491b22094100480de2012002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cf0010b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4192013a00000ceb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41003a00000ce9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419f013a00000ce7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a1013a00000ce5010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b7013a00000ce3010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b5013a00000ce1010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ad013a00000cdf010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b9013a00000cdd010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b2013a00000cdb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41aa013a00000cd9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4181013a00000cd7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fe003a00000cd5010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ba013a00000cd3010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ab013a00000cd1010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4182013a00000ccf010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f3003a00000ccd010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4196013a00000ccb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e1003a00000cc9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ae013a00000cc7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a0013a00000cc5010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41dd003a00000cc3010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e3003a00000cc1010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bf013a00000cbf010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41be013a00000cbd010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b8013a00000cbb010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bc013a00000cb9010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4180013a00000cb7010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c2003a00002003200a200210b10220032d0000411a460db50120002003290300370200200041086a200341086a29030037020020012d00004109470db6010b200141086a28020041ffffffff0371450db501200141046a2802001023200341106a24000f0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b0013a00000cb2010b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41293a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490da5012004410174220d20092009200d491b220d4100480da5012004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490da50120024101742209200620062009491b22094100480da5012002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000cb3010b0b200d4101102a000b20094101102a000b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41233a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490da20120024101742209200620062009491b22094100480da2012002450d01200728020020022009102722060d020c050b200728020021060c020b200910262206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000cb0010b0b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bd013a00000cac010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a7013a00000caa010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a6013a00000ca8010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b6013a00000ca6010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b3013a00000ca4010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4183013a00000ca2010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ff003a00000ca0010b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41c0003a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490d9c0120044101742209200620062009491b22064100480d9c012004450d0120052802002004200610272205450d020c030b200528020021050c030b2006102622050d010b20064101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a20083a00000c9e010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4197013a00000c9c010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41bb013a00000c9a010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418e013a00000c98010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ee003a00000c96010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c6003a00000c94010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b4013a00000c92010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ed003a00000c90010b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413e3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d8e012004410174220d20092009200d491b220d4100480d8e012004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d8e0120024101742209200620062009491b22094100480d8e012002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c91010b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4185013a00000c8c010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ca003a00000c8a010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418f013a00000c88010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419e013a00000c86010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41b1013a00000c84010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4193013a00000c82010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fc003a00000c80010b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41af013a00000c7e0b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413d3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d7c2004410174220d20092009200d491b220d4100480d7c2004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d7c20024101742209200620062009491b22094100480d7c2002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c7f0b0b200d4101102a000b20094101102a000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41383a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d7a2004410174220d20092009200d491b220d4100480d7a2004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d7a20024101742209200620062009491b22094100480d7a2002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c7d0b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419d013a00000c780b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41a4013a00000c760b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fa003a00000c740b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412b3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d672004410174220d20092009200d491b220d4100480d672004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d6720024101742209200620062009491b22094100480d672002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c750b0b200d4101102a000b20094101102a000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41343a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d652004410174220d20092009200d491b220d4100480d652004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d6520024101742209200620062009491b22094100480d652002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c730b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419b013a00000c6e0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419c013a00000c6c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f4003a00000c6a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4187013a00000c680b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4190013a00000c660b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d4003a00000c640b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418a013a00000c620b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a419a013a00000c600b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f8003a00000c5e0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ef003a00000c5c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41fd003a00000c5a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ce003a00000c580b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d3003a00000c560b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41303a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d492004410174220d20092009200d491b220d4100480d492004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d4920024101742209200620062009491b22094100480d492002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c570b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41cd003a00000c520b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41283a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d452004410174220d20092009200d491b220d4100480d452004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d4520024101742209200620062009491b22094100480d452002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c530b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a410f3a00000c4e0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d9003a00000c4c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a4194013a00000c4a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e7003a00000c480b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a418d013a00000c460b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e2003a00000c440b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41243a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490d3620024101742209200620062009491b22094100480d362002450d01200728020020022009102722060d020c050b200728020021060c020b200910262206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000c440b0b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f2003a00000c400b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41033a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490d3120044101742209200620062009491b22064100480d312004450d0120052802002004200610272205450d020c030b200528020021050c030b2006102622050d010b20064101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a42c0818386fcdffffe7c2008410374412073ad42f8018388a7413f7141c000723a00000c3e0b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41213a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490d3020024101742209200620062009491b22094100480d302002450d01200728020020022009102722060d020c050b200728020021060c020b200910262206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000c3e0b0b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f9003a00000c3a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d6003a00000c380b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41df003a00000c360b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c7003a00000c340b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41f0003a00000c320b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41203a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490d2420024101742209200620062009491b22094100480d242002450d01200728020020022009102722060d020c050b200728020021060c020b200910262206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000c320b0b20094101102a000b200241086a2006360200200241046a20083602002002410c6a28020021040b2002410c6a2206200441016a360200200820046a41113a0000200241086a2109200241046a210d02400240024003400240024002400240200928020020062802002204470d00200441016a22082004490d2420044101742207200820082007491b22074100480d242004450d01200b28020020042007102722080d020c050b200b28020021080c020b200710262208450d030b20092007360200200d2008360200200628020021040b2006200441016a360200200820046a200541807f72200541ff0071200541077622041b3a00002004210520040d000b024002400240200241086a2802002002410c6a2802002204470d00200441016a22052004490d2220044101742206200520052006491b22064100480d222004450d01200b2802002004200610272205450d020c040b200b28020021050c040b2006102622050d020b20064101102a000b20074101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a200c3a00000c2e0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d5003a00000c2c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41e4003a00000c2a0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41ec003a00000c280b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41043a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490d1920044101742209200620062009491b22064100480d192004450d0120052802002004200610272205450d020c030b200528020021050c030b2006102622050d010b20064101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a42c0818386fcdffffe7c2008410374412073ad42f8018388a7413f7141c000723a00000c260b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41363a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d242004410174220d20092009200d491b220d4100480d242004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d2420024101742209200620062009491b22094100480d242002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c270b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d2003a00000c220b200241086a2005360200200241046a20083602002002410c6a28020021060b2002410c6a2205200641016a360200200820066a41103a0000200241086a2108200241046a210b024003400240024002400240200828020020052802002202470d00200241016a22062002490d1420024101742209200620062009491b22094100480d142002450d01200728020020022009102722060d020c050b200728020021060c020b200910262206450d030b20082009360200200b2006360200200528020021020b2005200241016a360200200620026a200441807f72200441ff0071200441077622021b3a00002002210420020d000c220b0b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41eb003a00000c1e0b200241086a2009360200200241046a20063602002002410c6a28020021040b2002410c6a2209200441016a360200200620046a41023a000002400240024002400240200241086a28020020092802002204470d00200441016a22062004490d0f20044101742209200620062009491b22064100480d0f2004450d0120052802002004200610272205450d020c030b200528020021050c030b2006102622050d010b20064101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a42c0818386fcdffffe7c2008410374412073ad42f8018388a7413f7141c000723a00000c1c0b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41c5003a00000c1a0b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a41353a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d182004410174220d20092009200d491b220d4100480d182004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d1820024101742209200620062009491b22094100480d182002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c1b0b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41d1003a00000c160b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412c3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d092004410174220d20092009200d491b220d4100480d092004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d0920024101742209200620062009491b22094100480d092002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c170b0b200d4101102a000b20094101102a000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a412a3a0000200241086a210b200241046a210c03400240024002400240200b28020020082802002204470d00200441016a22092004490d052004410174220d20092009200d491b220d4100480d052004450d0120072802002004200d102722090d020c060b200728020021090c020b200d10262209450d040b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d0520024101742209200620062009491b22094100480d052002450d01200728020020022009102722060d020c070b200728020021060c020b200910262206450d050b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c130b0b101e000b200d4101102a000b20094101102a000b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413b3a0000200241086a210b200241046a210c0240024003400240024002400240200b28020020082802002204470d00200441016a22092004490d0d2004410174220d20092009200d491b220d4100480d0d2004450d0120072802002004200d102722090d020c050b200728020021090c020b200d10262209450d030b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200641807f72200641ff0071200641077622041b3a00002004210620040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22062002490d0d20024101742209200620062009491b22094100480d0d2002450d01200728020020022009102722060d020c060b200728020021060c020b200910262206450d040b20082009360200200b2006360200200428020021020b2004200241016a360200200620026a200541807f72200541ff0071200541077622021b3a00002002210520020d000c100b0b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a411b3a00000c0b0b200241086a2008360200200241046a20063602002002410c6a28020021040b2002410c6a2208200441016a360200200620046a41c4003a000002400240024002400240200241086a2802002206200828020022046b41084f0d00200441086a22082004490d0720064101742204200820082004491b22044100480d072006450d0120052802002006200410272205450d020c030b200528020021050c030b2004102622050d010b20044101102a000b200241086a2004360200200241046a20053602002002410c6a28020021040b2002410c6a200441086a360200200520046a200a3700000c090b200241086a2008360200200241046a20093602002002410c6a28020021040b2002410c6a2208200441016a360200200920046a413c3a0000200241086a210b200241046a210c03400240024002400240200b28020020082802002204470d00200441016a22092004490d052004410174220d20092009200d491b220d4100480d052004450d0120072802002004200d102722090d020c060b200728020021090c020b200d10262209450d040b200b200d360200200c2009360200200828020021040b2008200441016a360200200920046a200541807f72200541ff0071200541077622041b3a00002004210520040d000b2002410c6a2104200241086a2108200241046a210b03400240024002400240200828020020042802002202470d00200241016a22052002490d0520024101742209200520052009491b22094100480d052002450d01200728020020022009102722050d020c070b200728020021050c020b200910262205450d050b20082009360200200b2005360200200428020021020b2004200241016a360200200520026a200641807f72200641ff0071200641077622021b3a00002002210620020d000c080b0b101e000b200d4101102a000b20094101102a000b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41053a00000c020b200241086a2006360200200241046a20053602002002410c6a28020021040b2002410c6a200441016a360200200520046a41013a00000b2000411a3a000020012d00004109470d00200141086a28020041ffffffff0371450d00200141046a28020010230b200341106a24000bc60301067f2004410c6a2105200441086a2106200441046a210702400240024003400240024002400240200628020020052802002208470d00200841016a22092008490d052008410174220a20092009200a491b220a4100480d052008450d0120072802002008200a102722090d020c070b200728020021090c020b200a10262209450d050b2006200a36020020072009360200200528020021080b2005200841016a360200200920086a200141807f72200141ff0071200141077622081b3a00002008210120080d000b024020022003460d002004410c6a2105200441086a2106200441046a210703402002280200210103400240024002400240200628020020052802002208470d00200841016a22092008490d072008410174220a20092009200a491b220a4100480d072008450d0120072802002008200a102722090d020c080b200728020021090c020b200a10262209450d060b2006200a36020020072009360200200528020021080b2005200841016a360200200920086a200141807f72200141ff0071200141077622081b3a00002008210120080d000b200241046a22022003470d000b0b2000411a3a00000f0b101e000b200a4101102a000b200a4101102a000bd40301077f200141c000712103200141ff00712104024002400240024002400240200141077522050d002003450d010b2002410c6a2106200241086a2107200241046a2108034002402005417f470d00200341ff01710d020b0240024002400240200728020020062802002209470d00200941016a22032009490d0620094101742204200320032004491b22044100480d062009450d01200828020020092004102722030d020c070b200828020021030c020b200410262203450d050b2007200436020020082003360200200628020021090b2006200941016a360200200320096a200141807f723a0000200541c000712103200541ff007121042005210120054107752209210520090d002009210520030d000b0b024002400240200241086a2802002002410c6a2802002205470d00200541016a22092005490d0320054101742206200920092006491b22064100480d032005450d01200241046a2802002005200610272209450d020c050b200241046a28020021090c050b2006102622090d030b20064101102a000b101e000b20044101102a000b200241086a2006360200200241046a20093602002002410c6a28020021050b2002410c6a200541016a360200200920056a20043a00002000411a3a00000bd40301077f2001a7220341c000712104200341ff00712105024002400240024002400240200142078722014200520d002004450d010b2002410c6a2106200241086a2107200241046a2108034002402001427f520d00200441ff01710d020b0240024002400240200728020020062802002204470d00200441016a22052004490d0620044101742209200520052009491b22094100480d062004450d01200828020020042009102722050d020c070b200828020021050c020b200910262205450d050b2007200936020020082005360200200628020021040b2006200441016a360200200520046a200341807f723a00002001a7220341c000712104200341ff00712105200142078722014200520d0020040d000b0b024002400240200241086a2802002002410c6a2802002204470d00200441016a22032004490d0320044101742206200320032006491b22064100480d032004450d01200241046a2802002004200610272203450d020c050b200241046a28020021030c050b2006102622030d030b20064101102a000b101e000b20094101102a000b200241086a2006360200200241046a20033602002002410c6a28020021040b2002410c6a200441016a360200200320046a20053a00002000411a3a00000bf61402047f017e2000280248210202400240024002400240024002400240200141046a2802002203200141086a28020022046b41044f0d00200441046a22052004490d0520034101742204200520052004491b22044100480d052003450d0120012802002003200410272203450d020c030b200128020021030c030b2004102622030d010b20044101102a000b20012003360200200141046a2004360200200141086a28020021040b200141086a2205200441046a360200200320046a20023600002000290300210602400240024002400240200141046a2802002203200528020022046b41084f0d00200441086a22022004490d0520034101742204200220022004491b22044100480d052003450d0120012802002003200410272203450d020c030b200128020021030c030b2004102622030d010b20044101102a000b20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290308210602400240024002400240200141046a2802002203200228020022046b41084f0d00200441086a22022004490d0520034101742204200220022004491b22044100480d052003450d0120012802002003200410272203450d020c030b200128020021030c030b2004102622030d010b20044101102a000b20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290310210602400240024002400240200141046a2802002203200228020022046b41084f0d00200441086a22022004490d0520034101742204200220022004491b22044100480d052003450d0120012802002003200410272203450d020c030b200128020021030c030b2004102622030d010b20044101102a000b20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290318210602400240024002400240200141046a2802002203200228020022046b41084f0d00200441086a22022004490d0520034101742204200220022004491b22044100480d052003450d0120012802002003200410272203450d020c030b200128020021030c030b2004102622030d010b20044101102a000b20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290320210602400240024002400240200141046a2802002203200228020022046b41084f0d00200441086a22022004490d0520034101742204200220022004491b22044100480d052003450d0120012802002003200410272203450d020c030b200128020021030c030b2004102622030d010b20044101102a000b20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290328210602400240024002400240200141046a2802002203200228020022046b41084f0d00200441086a22022004490d0520034101742204200220022004491b22044100480d052003450d0120012802002003200410272203450d020c030b200128020021030c030b2004102622030d010b20044101102a000b20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290330210602400240024002400240200141046a2802002203200228020022046b41084f0d00200441086a22022004490d0520034101742204200220022004491b22044100480d052003450d0120012802002003200410272203450d020c030b200128020021030c030b2004102622030d010b20044101102a000b20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290338210602400240024002400240200141046a2802002203200228020022046b41084f0d00200441086a22022004490d0520034101742204200220022004491b22044100480d052003450d0120012802002003200410272203450d020c030b200128020021030c030b2004102622030d010b20044101102a000b20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a20063700002000290340210602400240024002400240200141046a2802002203200228020022046b41084f0d00200441086a22022004490d0520034101742204200220022004491b22044100480d052003450d0120012802002003200410272203450d020c030b200128020021030c030b2004102622030d010b20044101102a000b20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441086a360200200320046a2006370000200028024c210502400240024002400240200141046a2802002203200228020022046b41044f0d00200441046a22022004490d0520034101742204200220022004491b22044100480d052003450d0120012802002003200410272203450d020c030b200128020021030c030b2004102622030d010b20044101102a000b20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441046a360200200320046a20053600002000280250210502400240024002400240200141046a2802002203200228020022046b41044f0d00200441046a22022004490d0520034101742204200220022004491b22044100480d052003450d0120012802002003200410272203450d020c030b200128020021030c030b2004102622030d010b20044101102a000b20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441046a360200200320046a20053600002000280254210502400240024002400240200141046a2802002203200228020022046b41044f0d00200441046a22022004490d0520034101742204200220022004491b22044100480d052003450d0120012802002003200410272203450d020c030b200128020021030c030b2004102622030d010b20044101102a000b20012003360200200141046a2004360200200141086a28020021040b200141086a2202200441046a360200200320046a200536000002400240024002400240200141046a28020020022802002204470d00200441016a22032004490d0520044101742202200320032002491b22024100480d052004450d0120012802002004200210272203450d020c030b200128020021030c030b2002102622030d010b20024101102a000b20012003360200200141046a2002360200200141086a28020021040b200141086a2202200441016a360200200320046a200041dc006a2d00003a000020002802582103024002400240200141046a2802002204200228020022006b41044f0d00200041046a22022000490d0320044101742200200220022000491b22004100480d032004450d0120012802002004200010272204450d020c040b200128020021040c040b2000102622040d020b20004101102a000b101e000b20012004360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200420006a20033600000bc00201037f230041106b22022400200241003602082002420137030020002d0000210341011026210402400240024002400240024020034101470d002004450d03200441013a000020024281808080103702042002200436020020044101412110272204450d0420042000290001370001200441096a200041096a290000370000200441116a200041116a290000370000200441196a200041196a290000370000200242a1808080900437020420022004360200200128020020012802042004412110044100450d010c020b2004450d04200441003a0000200242818080801037020420022004360200200041086a200210b402200228020421002001280200200128020420022802002204200241086a28020010042000450d010b200410230b200241106a24000f0b41014101102a000b41214101102a000b41014101102a000b8a0c02067f027e230041106b22022400200028022821032002200041306a280200220436020c2002410c6a2001104102400240024002400240024002400240200141046a2802002205200141086a28020022066b20044f0d00200620046a22072006490d0520054101742206200720072006491b22064100480d052005450d0120012802002005200610272205450d020c030b200128020021050c030b2006102622050d010b20064101102a000b20012005360200200141046a2006360200200141086a28020021060b200141086a2207200620046a360200200520066a200320041094041a2000280234210502400240024002400240200141046a2802002206200728020022046b41044f0d00200441046a22032004490d0520064101742204200320032004491b22044100480d052006450d0120012802002006200410272206450d020c030b200128020021060c030b2004102622060d010b20044101102a000b20012006360200200141046a2004360200200141086a28020021040b200141086a2203200441046a360200200620046a200536000002400240024002400240200141046a2802002206200328020022046b41204f0d00200441206a22052004490d0520064101742204200520052004491b22044100480d052006450d0120012802002006200410272206450d020c030b200128020021060c030b2004102622060d010b20044101102a000b20012006360200200141046a2004360200200141086a28020021040b200141086a2205200441206a360200200620046a220441186a200041d0006a290000370000200441106a200041c8006a290000370000200441086a200041c0006a29000037000020042000290038370000200041086a29030021082000290300210902400240024002400240200141046a2802002206200528020022046b41104f0d00200441106a22052004490d0520064101742204200520052004491b22044100480d052006450d0120012802002006200410272206450d020c030b200128020021060c030b2004102622060d010b20044101102a000b20012006360200200141046a2004360200200141086a28020021040b200141086a2205200441106a360200200620046a22042008370008200420093700002000290310210802400240024002400240200141046a2802002206200528020022046b41084f0d00200441086a22052004490d0520064101742204200520052004491b22044100480d052006450d0120012802002006200410272206450d020c030b200128020021060c030b2004102622060d010b20044101102a000b20012006360200200141046a2004360200200141086a28020021040b200141086a2205200441086a360200200620046a20083700000240024002400240024002400240024002400240024020002903184201520d00200141046a28020020052802002204470d01200441016a22062004490d0b20044101742205200620062005491b22054100480d0b2004450d0320012802002004200510272206450d040c090b200141046a28020020052802002200470d01200041016a22042000490d0a20004101742206200420042006491b22064100480d0a2000450d0420012802002000200610272204450d050c060b200128020021060c080b200128020021040c050b2005102622060d050b20054101102a000b2006102622040d010b20064101102a000b20012004360200200141046a2006360200200141086a28020021000b200141086a200041016a360200200420006a41003a0000200241106a24000f0b20012006360200200141046a2005360200200141086a28020021040b200141086a2205200441016a360200200620046a41013a0000200041206a2903002108024002400240200141046a2802002204200528020022006b41084f0d00200041086a22062000490d0320044101742200200620062000491b22004100480d032004450d0120012802002004200010272204450d020c040b200128020021040c040b2000102622040d020b20004101102a000b101e000b20012004360200200141046a2000360200200141086a28020021000b200141086a200041086a360200200420006a2008370000200241106a24000b13002000410636020420004198cfc2003602000b130020004108360204200041a0c9c2003602000b13002000411636020420004188e7c2003602000b7801047f230041106b2202240020024100360208200242013703000240410110262203450d00200220033602002002410136020420002002290300370200200241086a22042004280200220441016a2205360200200320046a41003a0000200041086a2005360200200241106a24000f0b41014101102a000b3201017f0240410810262202450d0020004288808080800137020420002002360200200242003700000f0b41084101102a000bab0101017f230041f0006b22022400200241003a005c20024280808480800237035020024201370340200242013703382002420137033020024201370328200242013703202002420137031820024201370310200242013703082002420137030020024280808080c0003703482002412036025820024100360268200242013703602002200241e0006a10b202200041086a200228026836020020002002290360370200200241f0006a24000b3501017f0240410810262202450d002000428880808080013702042000200236020020024280ade2043700000f0b41084101102a000b3301017f0240410410262202450d0020004284808080c00037020420002002360200200241e4003600000f0b41044101102a000b3301017f0240410810262202450d0020004288808080800137020420002002360200200242af013700000f0b41084101102a000b3301017f0240410810262202450d002000428880808080013702042000200236020020024287013700000f0b41084101102a000b3901017f0240411010262202450d002002420037000820024215370000200042908080808002370204200020023602000f0b41104101102a000bc32b05087f037e037f017e047f23004190056b22022400200241003a00c80220012802002001280204200241c8026a410120012802081001210320012001280208200341016a41014b22036a220436020802400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402003450d0020022d00c802220341054b0d06024020030e06000503040206000b200241c8026a200110c102200241b0046a200241c8026a41dc001094041a20024190046a41026a2201200241a7036a2d00003a0000200220022f00a5033b01900420022d00a40322034102470d09200041073a000020024190056a24000f0b200041073a000020024190056a24000f0b200241b0046a41186a22054200370300200241b0046a41106a22064200370300200241b0046a41086a22074200370300200242003703b004200141086a220341002001280200200141046a2208280200200241b0046a41202004100122042004417f461b2204412020044120491b20032802006a22093602002004411f4d0d05200241e8016a41186a22042005290300370300200241e8016a41106a22052006290300370300200241e8016a41086a22062007290300370300200220022903b0043703e801200241c8026a41186a22072004290300370300200241c8026a41106a22042005290300370300200241c8026a41086a22052006290300370300200220022903e8013703c802200241f0036a41186a2007290300370300200241f0036a41106a2004290300370300200241f0036a41086a2005290300370300200220022903c8023703f003200241003a00c80220012802002008280200200241c8026a410120091001210420032003280200200441016a41014b22046a22053602002004450d0920022d00c8022203450d1520034101470d09200241b0046a41186a22044200370300200241b0046a41106a22064200370300200241b0046a41086a22074200370300200242003703b004200141086a220341002001280200200141046a280200200241b0046a41202005100122012001417f461b2201412020014120491b20032802006a3602002001411f4d0d09200241e8016a41186a22012004290300370300200241e8016a41106a22032006290300370300200241e8016a41086a22042007290300370300200220022903b0043703e801200241c8026a41186a22052001290300370300200241c8026a41106a22012003290300370300200241c8026a41086a22032004290300370300200220022903e8013703c80220024190046a41186a200529030037030020024190046a41106a200129030037030020024190046a41086a2003290300370300200220022903c80237039004410121010c160b20024180016a200110c202200241c8026a41086a220320024189016a290000370300200241c8026a41106a220420024191016a290000370300200241c8026a41186a220520024199016a290000370300200241c8026a411f6a2206200241a0016a28000036000020022002290081013703c80220022d00800122074102470d05200041073a000020024190056a24000f0b200241e0006a2001104c2002290360a7450d08200241f0006a290300210a2002290368210b200241d0006a2001104b2002290350a7450d0b2002290358210c200241b0046a41186a22064200370300200241b0046a41106a22074200370300200241b0046a41086a22084200370300200242003703b00441002105200141086a220341002001280200200141046a280200200241b0046a41202003280200100122042004417f461b2204412020044120491b20032802006a36020002402004411f4d0d00200241e8016a41186a22032006290300370300200241e8016a41106a22042007290300370300200241e8016a41086a22052008290300370300200220022903b0043703e80120024180016a41186a200329030037030020024180016a41106a200429030037030020024180016a41086a2005290300370300200220022903e80137038001410121050b200241c8026a41186a220320024180016a41186a290300370300200241c8026a41106a220420024180016a41106a290300370300200241c8026a41086a220620024180016a41086a29030037030020022002290380013703c8022005450d0c20024190046a41186a200329030037030020024190046a41106a200429030037030020024190046a41086a2006290300370300200220022903c80237039004200241c8006a2001104a2002280248450d1a200228024c2203417f4c0d1e2003450d18200310ac012204450d22200141086a2205200341002001280200200141046a280200200420032005280200100122012001417f461b2201200120034b1b220120052802006a36020020012003470d190c260b200241086a2001104b2002290308a7450d082002290310210a20022001104a2002280200450d0f20022802042203417f4c0d1d2003450d0d200310ac012204450d20200141086a2205200341002001280200200141046a280200200420032005280200100122012001417f461b2201200120034b1b220120052802006a36020020012003470d0e0c240b200241b0046a41186a22054200370300200241b0046a41106a22064200370300200241b0046a41086a22074200370300200242003703b004200141086a220341002001280200200141046a2208280200200241b0046a41202004100122042004417f461b2204412020044120491b20032802006a22093602002004411f4d0d04200241e8016a41186a22042005290300370300200241e8016a41106a220d2006290300370300200241e8016a41086a220e2007290300370300200220022903b0043703e801200241c8026a41186a220f2004290300370300200241c8026a41106a2204200d290300370300200241c8026a41086a220d200e290300370300200220022903e8013703c802200241f0036a41186a200f290300370300200241f0036a41106a2004290300370300200241f0036a41086a200d290300370300200220022903c8023703f003200542003703002006420037030020074200370300200242003703b0042003410020012802002008280200200241b0046a41202009100122042004417f461b2204412020044120491b20032802006a22053602002004411f4d0d08200241e8016a41186a2203200241b0046a41186a290300370300200241e8016a41106a2204200241b0046a41106a290300370300200241e8016a41086a2206200241b0046a41086a290300370300200220022903b0043703e80120024190046a41186a200329030037030020024190046a41106a200429030037030020024190046a41086a2006290300370300200220022903e8013703900420024200370388012002420037038001200141086a220441002001280200200141046a28020020024180016a41102005100122032003417f461b2203411020034110491b20042802006a3602002003410f4d0d0f20024180016a41086a290300210c2002290380012110200241f8006a2001104a2002280278450d1b200228027c2211ad220a421b88a70d1c200a420586a72203417f4c0d1c2003450d1920031026220d0d1a20034101102a000b200041073a000020024190056a24000f0b200041073a000020024190056a24000f0b200241b0046a411f6a2006280000360000200241b0046a41186a2005290300370300200241b0046a41106a2004290300370300200241b0046a41086a2003290300370300200220022903c8023703b004200241306a2001104c2002290330a7450d08200241306a41106a290300210a2002290338210b200241206a2001104b2002290320a7450d0d2002290328210c200241186a2001104a2002280218450d12200228021c2203417f4c0d192003450d10200310ac012204450d1e200141086a2205200341002001280200200141046a280200200420032005280200100122012001417f461b2201200120034b1b220120052802006a36020020012003470d110c1f0b200241e8016a200241b0046a41dc001094041a200241f0036a41026a220420012d00003a0000200220022f0190043b01f00320024187016a200241e8016a41dc001094041a200041013a0000200041016a20024180016a41e3001094041a200041e4006a20033a0000200041e5006a20022f01f0033b0000200041e7006a20042d00003a000020024190056a24000f0b200041073a000020024190056a24000f0b200041073a000020024190056a24000f0b200041073a000020024190056a24000f0b200041073a000020024190056a24000f0b200041073a000020024190056a24000f0b200041073a000020024190056a24000f0b200041073a000020024190056a24000f0b200041073a000020024190056a24000f0b410121042001280200200141046a28020041014100200141086a28020010011a41002003460d160b2003450d00200410230b200041073a000020024190056a24000f0b200041073a000020024190056a24000f0b200041073a000020024190056a24000f0b410021010b200241b0036a41186a220320024190046a41186a290300370300200241b0036a41106a220420024190046a41106a290300370300200241b0036a41086a220520024190046a41086a29030037030020022002290390043703b003200241d0036a41186a2206200241f0036a41186a290300370300200241d0036a41106a2207200241f0036a41106a290300370300200241d0036a41086a2208200241f0036a41086a290300370300200220022903f0033703d003200041053a0000200041216a20013a0000200020022903d003370001200041096a2008290300370000200041116a2007290300370000200041196a2006290300370000200041226a20022903b0033700002000412a6a2005290300370000200041326a20042903003700002000413a6a2003290300370000200041e0006a2002419e016a290100370100200041da006a20024180016a41186a290100370100200041d2006a20024180016a41106a290100370100200041ca006a20024180016a41086a290100370100200041c2006a20022901800137010020024190056a24000f0b410121042001280200200141046a28020041014100200141086a28020010011a41002003460d0e0b2003450d00200410230b200041073a000020024190056a24000f0b410121042001280200200141046a28020041014100200141086a28020010011a41002003460d0d0b2003450d00200410230b200041073a000020024190056a24000f0b4101210d0b0240024002402011450d0020024180016a41186a210820024180016a41106a2109200141046a21124200210a410021074100210541002104201121130340200842003703002009420037030020024180016a41086a220e42003703002002420037038001200141086a220341002001280200201228020020024180016a41202003280200100122062006417f461b2206412020064120491b20032802006a3602002006411f4d0d03200441016a2103200241c8026a41186a22062008290300370300200241c8026a41106a220f2009290300370300200241c8026a41086a2214200e29030037030020022002290380013703c802024020042013470d002007200320032007491b2213ad420586220b422088a70d07200ba7220e4100480d0702402004450d00200d2005200e1027220d0d010c090b200e1026220d450d080b200d20056a220420022903c802370000200441186a2006290300370000200441106a200f290300370000200441086a2014290300370000200a4280808080107c210a200741026a2107200541206a21052003210420032011490d000c020b0b410021134200210a0b200d450d01200241d0036a41186a2201200241f0036a41186a290300370300200241d0036a41106a2203200241f0036a41106a290300370300200241d0036a41086a2204200241f0036a41086a290300370300200241b0036a41086a220520024190046a41086a290300370300200241b0036a41106a220620024190046a41106a290300370300200241b0036a41186a220720024190046a41186a290300370300200220022903f0033703d00320022002290390043703b003200041063a0000200020022903d003370001200041096a2004290300370000200041116a2003290300370000200041196a2001290300370000200041216a20022903b003370000200041296a2005290300370000200041316a2006290300370000200041396a2007290300370000200041c1006a20022f00ad033b0000200041c3006a200241af036a2d00003a0000200041d8006a200c370300200041d0006a2010370300200041c8006a200a2013ad84370000200041c4006a200d36000020024190056a24000f0b2013450d00200d10230b200041073a000020024190056a24000f0b101d000b101e000b200e4101102a000b20034101102a000b20034101102a000b20034101102a000b200241e8016a411f6a2201200241b0046a411f6a280000360000200241e8016a41186a2205200241b0046a41186a290300370300200241e8016a41106a2206200241b0046a41106a290300370300200241e8016a41086a2208200241b0046a41086a290300370300200220022903b0043703e801200041c0006a200a370300200041386a200b370300200041033a0000200041046a20073a0000200041c8006a200c3703002000412c6a2003ad220a422086200a84370200200041286a2004360200200020022f00f0033b0001200041036a200241f2036a2d00003a0000200041056a20022903e8013700002000410d6a2008290300370000200041156a20062903003700002000411d6a2005290300370000200041246a2001280000360000200041e0006a20024190046a41106a290300370300200041d8006a20024190046a41086a290300370300200041d0006a20022903900437030020024190056a24000f0b200020022f00c8023b0001200041023a0000200041106a200a370300200041046a2004360000200041036a200241c8026a41026a2d00003a0000200041086a2003ad220a422086200a84370000200041186a20024180016a41d0001094041a20024190056a24000f0b200241f0036a41186a220120024190046a41186a290300370300200241f0036a41106a220520024190046a41106a290300370300200241f0036a41086a220620024190046a41086a29030037030020022002290390043703f003200041386a200a370300200041306a200b370300200041043a0000200041c0006a200c370300200041286a2003ad220a422086200a84370000200041246a2004360000200020022903f003370001200041096a2006290300370000200041116a2005290300370000200041196a2001290300370000200041216a20022f00b0033b0000200041236a200241b2036a2d00003a0000200041c8006a20022903d003370300200041d0006a200241d0036a41086a290300370300200041d8006a200241d0036a41106a290300370300200041e0006a200241d0036a41186a29030037030020024190056a24000be10c05057f017e017f087e037f230041106b22022400200241003602082001410020012802002001280204200241086a41042001280208100122032003417f461b2203410420034104491b20012802086a2204360208024002400240024002400240024002400240024002400240024002400240200341034d0d002002280208210520024200370308200141086a220641002001280200200141046a280200200241086a41082004100122032003417f461b2203410820034108491b20062802006a2204360200200341074d0d012002290308210720024200370308200641002001280200200141046a2208280200200241086a41082004100122032003417f461b2203410820034108491b20062802006a2204360200200341074d0d022002290308210920024200370308200141086a2206410020012802002008280200200241086a41082004100122032003417f461b2203410820034108491b20062802006a2204360200200341074d0d032002290308210a20024200370308200641002001280200200141046a2208280200200241086a41082004100122032003417f461b2203410820034108491b20062802006a2204360200200341074d0d042002290308210b20024200370308200141086a2206410020012802002008280200200241086a41082004100122032003417f461b2203410820034108491b20062802006a2204360200200341074d0d052002290308210c20024200370308200641002001280200200141046a2208280200200241086a41082004100122032003417f461b2203410820034108491b20062802006a2204360200200341074d0d062002290308210d20024200370308200141086a2206410020012802002008280200200241086a41082004100122032003417f461b2203410820034108491b20062802006a2204360200200341074d0d072002290308210e20024200370308200641002001280200200141046a2208280200200241086a41082004100122032003417f461b2203410820034108491b20062802006a2204360200200341074d0d082002290308210f20024200370308200141086a2206410020012802002008280200200241086a41082004100122032003417f461b2203410820034108491b20062802006a2204360200200341074d0d0920022903082110200141046a22082802002103200241003602082006410020012802002003200241086a41042004100122032003417f461b2203410420034104491b20062802006a2204360200200341034d0d0a200228020821112008280200210320024100360208200141086a2206410020012802002003200241086a41042004100122032003417f461b2203410420034104491b20062802006a2204360200200341034d0d0b20022802082112200141046a22082802002103200241003602082006410020012802002003200241086a41042004100122032003417f461b2203410420034104491b20062802006a2204360200200341034d0d0c20022802082113200241003a000820012802002008280200200241086a4101200410012104200141086a22032003280200200441016a41014b22046a22063602002004450d0d20022d00082108200141046a2802002104200241003602082003410020012802002004200241086a41042006100122012001417f461b2201410420014104491b20032802006a360200200141034d0d0e20022802082101200020083a005c2000200136025820002013360254200020123602502000201136024c20002005360248200020103703402000200f3703382000200e3703302000200d3703282000200c3703202000200b3703182000200a3703102000200937030820002007370300200020022f00053b005d200041df006a200241076a2d00003a0000200241106a24000f0b200041023a005c200241106a24000f0b200041023a005c200241106a24000f0b200041023a005c200241106a24000f0b200041023a005c200241106a24000f0b200041023a005c200241106a24000f0b200041023a005c200241106a24000f0b200041023a005c200241106a24000f0b200041023a005c200241106a24000f0b200041023a005c200241106a24000f0b200041023a005c200241106a24000f0b200041023a005c200241106a24000f0b200041023a005c200241106a24000f0b200041023a005c200241106a24000f0b200041023a005c200241106a24000f0b200041023a005c200241106a24000be10701067f230041f0006b22022400200241003a005020012802002001280204200241d0006a410120012802081001210320012001280208200341016a41014b22036a22043602080240024002402003450d0020022d0050220341ef014d0d01200341847e6a220341034b0d00024002400240024020030e0400010203000b200141046a2802002103200241003b0150200141086a2205410020012802002003200241d0006a41022004100122012001417f461b2201410220014102491b20052802006a360200200141014d0d0320022f0150220341f0014f0d040c030b200141046a280200210320024100360250200141086a2205410020012802002003200241d0006a41042004100122012001417f461b2201410420014104491b20052802006a360200200141034d0d024101210120022802502203418080044f0d040c020b200141046a280200210320024100360250200141086a2205410020012802002003200241d0006a41042004100122012001417f461b2201410420014104491b20052802006a3602000c010b200241d0006a41186a4200370300200241d0006a41106a4200370300200241d0006a41086a42003703002002420037035041002105200141086a220341002001280200200141046a280200200241d0006a41202004100122012001417f461b2201412020014120491b20032802006a360200024002402001411f4d0d00200241ca006a20022d00523a0000200241286a41086a200241df006a290000370300200241286a41106a200241e7006a290000370300200241286a41186a200241d0006a411f6a2d00003a0000200220022f01503b01482002200229005737032820022800532103410121050c010b0b200241cc006a41026a2201200241c8006a41026a2d00003a0000200241d0006a41086a2204200241286a41086a290300370300200241d0006a41106a2206200241286a41106a290300370300200241d0006a41186a2207200241286a41186a2d00003a0000200220022f01483b014c200220022903283703502005450d00200241246a41026a20012d00003a0000200241086a41086a2004290300370300200241086a41106a2006290300370300200241086a41186a20072d00003a0000200220022f014c3b012420022002290350370308410021010c020b200041023a0000200241f0006a24000f0b410121010b200020022f01243b0001200020013a0000200041046a2003360200200041086a2002290308370200200041036a200241266a2d00003a0000200041106a200241086a41086a290300370200200041186a200241086a41106a290300370200200041206a200241086a41186a280200360200200241f0006a24000bca3303077f097e097f230041d0036b22022400200241003a00a803200241a8036a200128020022032001280204220441004722051094041a02400240024002400240024002400240024002400240024002400240024020042005490d00200141046a200420056b22063602002001200320056a2205360200024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402004450d0020022d00a803220441054b0d06024020040e06000503040206000b200241003602880120024188016a20052006410420064104491b22031094041a200141046a2207200620036b22043602002001200520036a2205360200200641034d0d072002280288012108200242003703880120024188016a20052004410820044108491b22031094041a2007200420036b22063602002001200520036a2205360200200441074d0d072002290388012109200242003703880120024188016a20052006410820064108491b22031094041a200141046a2207200620036b22043602002001200520036a2205360200200641074d0d07200229038801210a200242003703880120024188016a20052004410820044108491b22031094041a2007200420036b22063602002001200520036a2205360200200441074d0d07200229038801210b200242003703880120024188016a20052006410820064108491b22031094041a200141046a2207200620036b22043602002001200520036a2205360200200641074d0d07200229038801210c200242003703880120024188016a20052004410820044108491b22031094041a2007200420036b22063602002001200520036a2205360200200441074d0d07200229038801210d200242003703880120024188016a20052006410820064108491b22031094041a200141046a2207200620036b22043602002001200520036a2205360200200641074d0d07200229038801210e200242003703880120024188016a20052004410820044108491b22031094041a2007200420036b22063602002001200520036a2205360200200441074d0d07200229038801210f200242003703880120024188016a20052006410820064108491b22031094041a200141046a2207200620036b22043602002001200520036a2205360200200641074d0d072002290388012110200242003703880120024188016a20052004410820044108491b22031094041a2007200420036b22063602002001200520036a2205360200200441074d0d072002290388012111200241003602880120024188016a20052006410420064104491b22031094041a200141046a2207200620036b22043602002001200520036a2205360200200641034d0d072002280288012112200241003602880120024188016a20052004410420044104491b22031094041a2007200420036b22063602002001200520036a2205360200200441034d0d072002280288012107200241003602880120024188016a20052006410420064104491b22031094041a200141046a200620036b22043602002001200520036a2205360200200641034d0d072002280288012113200241003a00880120024188016a2005200441004722061094041a20042006490d2e200141046a2214200420066b22033602002001200520066a22053602002004450d0720022d0088012106200241003602880120024188016a20052003410420034104491b22041094041a2014200320046b3602002001200520046a360200200341034d0d072002280288012101200241d8016a41026a220420024180026a41026a2d00003a0000200220022f0080023b01d801200041013a0000200041e4006a20063a0000200041e0006a2001360000200041dc006a2013360000200041d8006a2007360000200041d4006a2012360000200041d0006a2008360000200041c8006a2011370000200041c0006a2010370000200041386a200f370000200041306a200e370000200041286a200d370000200041206a200c370000200041186a200b370000200041106a200a370000200041086a2009370000200020022800a803360001200041046a200241a8036a41036a280000360000200041e7006a20042d00003a0000200041e5006a20022f01d8013b0000200241d0036a24000f0b200041073a0000200241d0036a24000f0b20024180026a2006412020064120491b22046a41004100412020046b2004411f4b1b1093041a20024180026a200520041094041a200141046a200620046b22033602002001200520046a22043602002006411f4d0d06200241d8016a41186a220520024180026a41186a290000370300200241d8016a41106a220620024180026a41106a290000370300200241d8016a41086a220720024180026a41086a29000037030020022002290080023703d801200241a8036a41186a22082005290300370300200241a8036a41106a22052006290300370300200241a8036a41086a22062007290300370300200220022903d8013703a803200241e8026a41186a2008290300370300200241e8026a41106a2005290300370300200241e8026a41086a2006290300370300200220022903a8033703e802200241003a00a803200241a8036a2004200341004722051094041a20032005490d24200141046a200320056b22063602002001200420056a22043602002003450d0b20022d00a8032205450d1620054101470d0b20024180026a2006412020064120491b22056a41004100412020056b2005411f4b1b1093041a20024180026a200420051094041a200141046a200620056b3602002001200420056a3602002006411f4d0d0b200241d8016a41186a220120024180026a41186a290000370300200241d8016a41106a220420024180026a41106a290000370300200241d8016a41086a220520024180026a41086a29000037030020022002290080023703d801200241a8036a41186a22062001290300370300200241a8036a41106a22012004290300370300200241a8036a41086a22042005290300370300200220022903d8013703a80320024188036a41186a200629030037030020024188036a41106a200129030037030020024188036a41086a2004290300370300200220022903a80337038803410121010c170b20024188016a2001109502200241a8036a41086a220420024191016a290000370300200241a8036a41106a220520024199016a290000370300200241a8036a41186a2206200241a1016a290000370300200241a8036a411f6a2203200241a8016a28000036000020022002290089013703a80320022d00880122074102470d06200041073a0000200241d0036a24000f0b200241e8006a200110472002290368a7450d07200241f8006a29030021092002290370210a200241d8006a200110462002290358a7450d0b2002290360210b20024180026a41186a2207420037030020024180026a41106a2208420037030020024180026a41086a22124200370300200242003703800220024180026a20012802002206200141046a22032802002204412020044120491b22051094041a2003200420056b3602002001200620056a3602002004411f4d0d0c200241d8016a41186a22042007290300370300200241d8016a41106a22052008290300370300200241d8016a41086a2206201229030037030020022002290380023703d80120024188016a41186a200429030037030020024188016a41106a200529030037030020024188016a41086a2006290300370300200220022903d80137038801410121040c0d0b200241106a200110462002290310a7450d0720022903182109200241086a200110452002280208450d10200228020c2204417f4c0d1f2004450d0e200410ac012206450d2320062001280200200141046a22032802002205200420052004491b22051094041a200328020022072005490d242003200720056b3602002001200128020020056a36020020052004470d0f0c2c0b20024180026a2006412020064120491b22046a41004100412020046b2004411f4b1b1093041a20024180026a200520041094041a200141046a2214200620046b22033602002001200520046a22053602002006411f4d0d04200241d8016a41186a220620024180026a41186a2215290000370300200241d8016a41106a220720024180026a41106a2216290000370300200241d8016a41086a220820024180026a41086a221729000037030020022002290080023703d801200241a8036a41186a22042006290300370300200241a8036a41106a22122007290300370300200241a8036a41086a22132008290300370300200220022903d8013703a803200241e8026a41186a2004290300370300200241e8026a41106a2012290300370300200241e8026a41086a2013290300370300200220022903a8033703e80220024180026a2003412020034120491b22046a41004100412020046b2004411f4b1b1093041a20024180026a200520041094041a2014200320046b22123602002001200520046a22043602002003411f4d0d0820062015290000370300200720162900003703002008201729000037030020022002290080023703d80120024188036a41186a200629030037030020024188036a41106a200729030037030020024188036a41086a2008290300370300200220022903d801370388032002420037039001200242003703880120024188016a20042012411020124110491b22051094041a200141046a201220056b3602002001200420056a3602002012410f4d0d1020024190016a290300210b200229038801210c20024180016a20011045200228028001450d1c2002280284012218ad2209421b88a70d1e2009420586a72204417f4c0d1e2004450d1a2004102622160d1b20044101102a000b200041073a0000200241d0036a24000f0b200041073a0000200241d0036a24000f0b200041073a0000200241d0036a24000f0b20024180026a411f6a200328000036000020024180026a41186a200629030037030020024180026a41106a200529030037030020024180026a41086a2004290300370300200220022903a80337038002200241386a200110472002290338a7450d08200241386a41106a29030021092002290340210a200241286a200110462002290328a7450d0d2002290330210b200241206a200110452002280220450d1220022802242204417f4c0d1a2004450d10200410ac012206450d2020062001280200200141046a22032802002205200420052004491b22051094041a200328020022082005490d212003200820056b3602002001200128020020056a36020020052004470d110c260b200041073a0000200241d0036a24000f0b200041073a0000200241d0036a24000f0b200041073a0000200241d0036a24000f0b200041073a0000200241d0036a24000f0b200041073a0000200241d0036a24000f0b200041073a0000200241d0036a24000f0b410021040b200241a8036a41186a220520024188016a41186a290300370300200241a8036a41106a220620024188016a41106a290300370300200241a8036a41086a220320024188016a41086a29030037030020022002290388013703a80302402004450d0020024188036a41186a200529030037030020024188036a41106a200629030037030020024188036a41086a2003290300370300200220022903a80337038803200241d0006a200110452002280250450d0e20022802542204417f4c0d132004450d0c200410ac012206450d1b20062001280200200141046a22032802002205200420052004491b22051094041a200328020022072005490d1c2003200720056b3602002001200128020020056a36020020052004470d0d0c1e0b200041073a0000200241d0036a24000f0b200041073a0000200241d0036a24000f0b4101210641002004460d1d0b2004450d00200610230b200041073a0000200241d0036a24000f0b200041073a0000200241d0036a24000f0b200041073a0000200241d0036a24000f0b410021010b200241a8026a41186a220420024188036a41186a290300370300200241a8026a41106a220520024188036a41106a290300370300200241a8026a41086a220620024188036a41086a29030037030020022002290388033703a802200241c8026a41186a2203200241e8026a41186a290300370300200241c8026a41106a2207200241e8026a41106a290300370300200241c8026a41086a2208200241e8026a41086a290300370300200220022903e8023703c802200041053a0000200041216a20013a0000200020022903c802370001200041096a2008290300370000200041116a2007290300370000200041196a2003290300370000200041226a20022903a8023700002000412a6a2006290300370000200041326a20052903003700002000413a6a2004290300370000200041e0006a200241a6016a290100370100200041da006a20024188016a41186a290100370100200041d2006a20024188016a41106a290100370100200041ca006a20024188016a41086a290100370100200041c2006a200229018801370100200241d0036a24000f0b4101210641002004460d150b2004450d00200610230b200041073a0000200241d0036a24000f0b4101210641002004460d110b2004450d00200610230b200041073a0000200241d0036a24000f0b410121160b0240024002402018450d0020024188016a41186a211220024188016a41106a211420024188016a41086a2113200141046a210842002109410021074100210641002105201821190340201242003703002014420037030020134200370300200242003703880120024188016a2001280200221520082802002204412020044120491b22031094041a2008200420036b3602002001201520036a3602002004411f4d0d03200541016a2104200241a8036a41186a22032012290300370300200241a8036a41106a22152014290300370300200241a8036a41086a2217201329030037030020022002290388013703a803024020052019470d002007200420042007491b2219ad420586220a422088a70d08200aa7221a4100480d0802402005450d0020162006201a102722160d010c0b0b201a10262216450d0a0b201620066a220520022903a803370000200541186a2003290300370000200541106a2015290300370000200541086a201729030037000020094280808080107c2109200741026a2107200641206a21062004210520042018490d000c020b0b41002119420021090b2016450d01200241c8026a41186a2201200241e8026a41186a290300370300200241c8026a41106a2204200241e8026a41106a290300370300200241c8026a41086a2205200241e8026a41086a290300370300200241a8026a41086a220620024188036a41086a290300370300200241a8026a41106a220320024188036a41106a290300370300200241a8026a41186a220720024188036a41186a290300370300200220022903e8023703c80220022002290388033703a802200041063a0000200020022903c802370001200041096a2005290300370000200041116a2004290300370000200041196a2001290300370000200041216a20022903a802370000200041296a2006290300370000200041316a2003290300370000200041396a2007290300370000200041c1006a20022f00a5023b0000200041c3006a200241a7026a2d00003a0000200041d8006a200b370300200041d0006a200c370300200041c8006a20092019ad84370000200041c4006a2016360000200241d0036a24000f0b2019450d00201610230b200041073a0000200241d0036a24000f0b200520041048000b101d000b101e000b200520031048000b201a4101102a000b20044101102a000b200520071048000b20044101102a000b200520081048000b20044101102a000b200520071048000b200620041048000b200241e8026a41186a220120024188036a41186a290300370300200241e8026a41106a220520024188036a41106a290300370300200241e8026a41086a220320024188036a41086a29030037030020022002290388033703e802200041386a2009370300200041306a200a370300200041043a0000200041c0006a200b370300200041286a2004ad2209422086200984370000200041246a2006360000200020022903e802370001200041096a2003290300370000200041116a2005290300370000200041196a2001290300370000200041216a20022f00a8023b0000200041236a200241aa026a2d00003a0000200041c8006a20022903c802370300200041d0006a200241c8026a41086a290300370300200041d8006a200241c8026a41106a290300370300200041e0006a200241c8026a41186a290300370300200241d0036a24000f0b200241d8016a411f6a220120024180026a411f6a280000360000200241d8016a41186a220520024180026a41186a290300370300200241d8016a41106a220320024180026a41106a290300370300200241d8016a41086a220820024180026a41086a29030037030020022002290380023703d801200041c0006a2009370300200041386a200a370300200041033a0000200041046a20073a0000200041c8006a200b3703002000412c6a2004ad2209422086200984370200200041286a2006360200200020022f00e8023b0001200041036a200241ea026a2d00003a0000200041056a20022903d8013700002000410d6a2008290300370000200041156a20032903003700002000411d6a2005290300370000200041246a2001280000360000200041e0006a20024188036a41106a290300370300200041d8006a20024188036a41086a290300370300200041d0006a200229038803370300200241d0036a24000f0b200020022f00a8033b0001200041023a0000200041106a2009370300200041046a2006360000200041036a200241a8036a41026a2d00003a0000200041086a2004ad2209422086200984370000200041186a20024188016a41d0001094041a200241d0036a24000b8812010d7f230041a0016b22032400024002400240024002400240024002400240024002400240024002400240411410262204450d00200441106a41002800d28943360000200441086a41002900ca8943370000200441002900c2894337000020044114413410272204450d01200420012900003700142004412c6a200141186a290000370000200441246a200141106a2900003700002004411c6a200141086a290000370000200341f8006a41186a22054200370300200341f8006a41106a22064200370300200341f8006a41086a220742003703002003420037037820044134200341f8006a1002200341d8006a41186a2005290300370300200341d8006a41106a2006290300370300200341d8006a41086a2007290300370300200320032903783703580240024002400240200341d8006a412041a886c500410041001001417f460d002003422037027c2003200341d8006a360278200341286a200341f8006a104a2003280228450d03200328022c2106200341206a200341f8006a104a2003280220450d0320032802242107200341186a200341f8006a104a2003280218450d03200328021c210841002109200341003a009f0120034180016a2205200528020022052003280278200328027c2003419f016a41012005100141016a41014b22056a3602002005450d03024020032d009f012205450d004101210920054101470d040b200341106a200341f8006a104a2003280210450d0320032802142205417f4c0d092005450d01200510ac01220a450d0620034180016a220b200b280200220b200541002003280278200328027c200a2005200b1001220b200b417f461b220b200b20054b1b220b6a360200200b2005470d020c070b200410234101210441d689c300210641112107410221090c070b4101210a2003280278200328027c4101410020034180016a28020010011a41002005460d050b2005450d00200a10230b41d4aac10041331021000b41144101102a000b41344101102a000b20054101102a000b200341d4006a41026a220b200341386a41026a2d00003a0000200320032f00383b0154200341f8006a41026a220c200b2d00003a0000200320032f01543b017820041023200341d8006a41026a200c2d00003a0000200320032f01783b0158410021040b200341346a41026a220b200341d8006a41026a2d00003a0000200320032f01583b013402402004450d002000200636020420004101360200200041086a2007360200200341a0016a24000f0b200341306a41026a200b2d00003a0000200320032f01343b01300240024002400240200228024820064d0d00411510262204450d05410021062004410d6a41002900f48943370000200441086a41002900ef8943370000200441002900e7894337000020044115413510272204450d06200420012900003700152004412d6a200141186a290000370000200441256a200141106a2900003700002004411d6a200141086a290000370000200341f8006a41186a22074200370300200341f8006a41106a22094200370300200341f8006a41086a220b42003703002003420037037820044135200341f8006a1002200341d8006a41186a2007290300370300200341d8006a41106a2009290300370300200341d8006a41086a200b29030037030020032003290378370358200341d8006a412041a886c500410041001001417f460d012003422037027c2003200341d8006a360278200341086a200341f8006a104a2003280208450d08200328020c2207417f4c0d042007450d02200710ac012206450d0920034180016a220920092802002209200741002003280278200328027c200620072009100122092009417f461b2209200920074b1b22096a36020020092007460d030c070b200521042005210b200a21020c0c0b0c010b410121062003280278200328027c4101410020034180016a28020010011a41002007470d040b200410232007411a20061b210d200641fc89c30020061b210c024002400240024002402006450d00200341f8006a200c2007200210c502200341f8006a41086a2802002107200328027c210620032802784101470d042000200636020420004101360200200041086a2007360200200d450d01200c102320050d020c030b2000200c36020420004101360200200041086a200d3602000b2005450d010b200a10230b200341a0016a24000f0b200341d8006a41026a220e20034197016a2d00003a0000200320032f0095013b015820034194016a2d0000210920034190016a28020021042003418c016a280200210b20034188016a280200210220034184016a280200210802402005450d00200a10230b200341306a41026a200e2d00003a0000200320032f01583b01302004417f4c0d004101210a02402004450d0020041026220a450d09200a200220041094041a0b200341386a41146a2004360200200341386a41106a2004360200200320083602402003200736023c200320063602382003200a3602442003200941ff01714101463a0050411410262205450d06200541106a41002800d28943360000200541086a41002900ca8943370000200541002900c2894337000020054114413410272205450d07200520012900003700142005412c6a200141186a290000370000200541246a200141106a2900003700002005411c6a200141086a290000370000200341f8006a41186a22014200370300200341f8006a41106a220e4200370300200341f8006a41086a220f42003703002003420037037820054134200341f8006a1002200341d8006a41186a2001290300370300200341d8006a41106a200e290300370300200341d8006a41086a200f29030037030020032003290378370358200341d8006a200341386a10b1012005102302402004450d00200a10230b200d450d09200c10230c090b101d000b41154101102a000b41354101102a000b2007450d00200610230b41d4aac10041331021000b20074101102a000b41144101102a000b41344101102a000b20044101102a000b20002006360204200020032f01303b001d200041003602002000411c6a20093a0000200041186a2004360200200041146a200b360200200041106a20023602002000410c6a2008360200200041086a20073602002000411f6a200341326a2d00003a0000200341a0016a24000bc0dc0123227f037e017f017e107f017e067f017e027f017e037f017e017f017e087f017e017f017e027f017e047f017e177f017e017f017e6a7f017e1d7f017e147f017e067f027e0f7f230041e0056b22042400410021052004410036028802200420023602840220042001360280020240024002400240024002400240200241034b0d00200441013a00a803200441e4046a4101360200200441073602bc01200442013702d4042004419cf6c4003602d0042004200441a8036a3602b8012004200441b8016a3602e00420044198026a200441d0046a10a20120042802a0022102200428029c0221062004280298022107410521080c010b20044188026a4104360200024002400240024020012800004180c2cdeb06470d002002417c714104470d01200441013a00a803200441e4046a4101360200200441073602bc01200442013702d4042004419cf6c4003602d0042004200441a8036a3602b8012004200441b8016a3602e00420044198026a200441d0046a10a20120042802a0022102200428029c022106200428029802210741052108410021050c040b410121080c010b02400240024002400240024002400240024002400240200241074d0d0020044180026a41086a41083602000240024002400240200128000422074101470d00200441d0046a20044180026a10a00120042802d0044101470d014104210a4100210b4100210c20042d00d4040d020c050b410221080c0f0b200441d0046a410572210f4104210a200441d0046a412c6a2110200441f4046a2111200441f0046a2112200441ec046a2113200441e8046a2114200441e4046a2115200441e0046a2116200441dc046a2117200441d8046a211841002107412821054100210b4100210c410021090340200441a8036a41026a2219200f41026a2d00003a00002004200f2f00003b01a8032010280200211a200441f8046a280200211b2011280200211c2012280200211d2013280200211e2014280200211f20152802002120201628020021212017280200212220182802002106024020042d00d4042223417e6a220141ff0171410a4b0d0002400240024002400240024002400240024002400240024002400240024002402001410a4b22240d00024020010e0b00070405020809060b030a000b200941ff0171222541014d0d0c0c0b0b200941ff0171222541004b0d0a0c0b0b200941ff0171222541054d0d0a0c090b200941ff01712225410a4d0d090c080b200941ff0171222541034d0d080c070b200941ff0171222541044d0d070c060b200941ff0171222541084d0d060c050b200941ff0171222541024d0d050c040b200941ff0171222541064d0d040c030b200941ff0171222541074d0d030c020b200941ff01712225410b4d0d020c010b200941ff0171222541094d0d010b411321082023410d4b0d010c020b02400240024002400240024002400240024002400240024020240d00024020010e0b00070405020809060b030a000b20254101470d0e0c0b0b20254100460d0a0c0d0b20254105470d0c0c090b2025410a470d0b0c080b20254103470d0a0c070b20254104470d090c060b20254108470d080c050b20254102470d070c040b20254106470d060c030b20254107470d050c020b2025410b470d040c010b20254109470d030b411421082023410d4d0d010b02402022450d00200610230b0240201f450d00201e450d00201f10230b201b450d0d201c1023200b0d0e0c0f0b024002400240024002400240024002400240024002400240024002400240024020230e0e1b0405011b1b1b08031c070002061b0b2021450d1a4118218a012006202141186c6a218b014104218c014114218d014110218e01410c218f014109219001410821910141ffffffff03219201417021930120062194014100215d0c0a0b2021450d19202141286c21022006210103400240200141046a280200450d00200128020010230b0240200141106a280200450d002001410c6a28020010230b200141286a2101200241586a22020d000c1a0b0b2021450d18411c21950120062021411c6c6a219601410c219701410821980141142199014104219a014110219b014109219c0141ffffffff03219d014170219e012006219f014101215d0c090b2021450d17202141146c21022006210103400240200141046a280200450d00200128020010230b200141146a21012002416c6a22020d000c180b0b02402022450d00200610230b201f450d1720201023200b0d180c190b2021450d15202141047421022006210103400240200141046a280200450d00200128020010230b200141106a2101200241706a22020d000c160b0b200641ff017122014102460d0320014101460d022021450d1520221023200b0d160c170b2021450d13411c21a00120062021411c6c6a21a101410c21a201410821a301411421a401410421a501411021a601410921a70141ffffffff0321a801417021a901200621aa014102215d0c050b2021450d12410421ab01200620214104746a21ac01411021ad01410921ae01410821af0141ffffffff0321b001417021b101200621b2014103215d0c050b201f450d10201f410c6c2102202121010340024020012802002205450d00200141046a280200450d00200510230b2001410c6a2101200241746a22020d000c110b0b201f450d0f410421b3012021201f4104746a21b401411021b501410c21b601410821b701417421b801202121b9014106215d0c040b410821010c0b0b410821010c0a0b410821010c090b410821010c080b410821010c070b0240024002400240024002400240024002400240024020240d00024020010e0b00070405020809060b030a000b410121090c0b0b410021090c0a0b410521090c090b410a21090c080b410321090c070b410421090c060b410821090c050b410221090c040b410621090c030b410721090c020b410b21090c010b410921090b20044198026a41026a222420192d00003a0000200420042f01a8033b0198020240200b200c470d00200b41016a2201200b490d072007200120012007491b220cad422c7e2226422088a70d072026a722014100480d070240200b450d00200a200541586a20011027220a0d010c040b20011026220a450d030b200a20056a220141586a20233a00002001201a3602002001417c6a201b360200200141786a201c360200200141746a201d360200200141706a201e3602002001416c6a201f360200200141686a2020360200200141646a2021360200200141606a20223602002001415c6a20063602002001415b6a20242d00003a0000200141596a20042f0198023b0000200741026a21072005412c6a2105200b41016a210b200441d0046a20044180026a10a00120042802d0044101470d000b20042d00d404450d030b20042902d4042227a722084110762105200841087621092027422088a72107200441d0046a41106a2802002102200441dc046a2802002106200b0d090c0a0b20014104102a000b41082002108c01000b200b412c6c2101200a41606a21050240024003402001450d01200141546a2101200541206a21072005412c6a220d210520072d0000410b470d000b200d280200210e0c010b4100210e0b200b412c6c2101200a41586a21050240024003402001450d01200141546a2101200541286a21072005412c6a220d210520072d00004104470d000b200441b0016a200d10be03200e20042802b401460d010c0a0b200e4100470d090b024002400240024002400240024002400240024002400240024020044180026a41086a2802002002470d004280c2cdeb062128200441d4036a200b360200200441d0036a2201200c360200200441cc036a200a36020041002129200441003602c00320044280c2cdeb06428080808010843702c403200a2001290300222a422088a7220e412c6c6a2105200a2101034020052001460d0220012d000021022001412c6a2207210120024102470d000b200441a8016a200741586a10be034104212b20042802a8012102024020042802ac012223450d00202341047422014100480d0f20011026222b450d0b0b410021294100212402402023450d002023410474210741002124202b21010340200241086a2802002205417f4c0d052002410c6a2d0000210d2002280200212c024002402005450d0020051026220f0d010c080b4101210f0b200f202c2005109404212c2001410d6a2002410d6a2d00003a00002001410c6a200d3a0000200141086a2005360200200141046a20053602002001202c360200200141106a2101202441016a2124200241106a2102200741706a22070d000b0b202b450d01202321290c020b200441003a00a803200441e4046a4101360200200441073602bc01200442013702d4042004419cf6c4003602d0042004200441a8036a3602b8012004200441b8016a3602e00420044198026a200441d0046a10a201200441db046a20044198026a41086a28020036000020042004290398023700d304200441cc036a200441d7046a290000370000200441053a00c403200441013602c003200420042900d0043700c5030240200b450d00200b412c6c2108200a210103402001109f012001412c6a2101200841546a22080d000b0b200441c0036a41047221010240200c450d00200a10230b4100450d190c1a0b4104212b410021240b200a200e412c6c6a2107200a210102400240024003404100210541a886c500210d20072001460d0120012d000021022001412c6a222c210120024103470d000b200441a0016a202c41586a10be034100210120042802a0012202450d012002210d4104211020042802a40122010d020c0b0b410021010b410421102001450d090b200141286c211e200d411c6a21014104211d410021054100211441042111410021074100211f410121124100210f410021194104211a41002102410021234100211c4100212c4101210d0340024002400240024002400240024002400240024002400240024002400240024002402001417c6a2d0000221b4101460d000240201b4102460d00201b4103470d022001417e6a22132d000021152001417d6a22162d000021172019200f470d04200f41016a221b200f490d1e200f4101742225201b201b2025491b221b201b6a2218201b490d1e20184100480d1e200f450d0b201220252018102722120d0c0c170b200441d0046a41086a221b200141086a280200360200200420012902003703d00420052014470d06200541016a22132005490d1d20054101742214201320132014491b2214ad420c7e2226422088a70d1d2026a722134100480d1d2005450d0520112005410c6c2013102722110d060c140b200441d0046a41086a221b200141086a280200360200200420012902003703d004201f2007470d01200741016a22132007490d1c20074101742215201320132015491b2215ad420c7e2226422088a70d1c2026a722134100480d1c2007450d06201d2007410c6c20131027221d0d070c140b2001280200211b20232002470d02200241016a22132002490d1b20024101742215201320132015491b2215ad4202862226422088a70d1b2026a722134100480d1b2002450d0a201a200241027420131027221a0d0b0c150b201f21130c060b200f211b2019210f0c070b202321130c090b201310262211450d0e0b20112005410c6c6a221320042903d004370200201341086a201b280200360200200541016a2105200141286a2101201e41586a221e0d0a0c140b20131026221d450d0d0b20072113201521070b201d2013410c6c6a221320042903d004370200201341086a201b280200360200201f41016a211f200141286a2101201e41586a221e0d070c110b201810262212450d0b0b2012200f4101746a220f20154101713a0001200f20173a000020132d0000210f20162d00002113202c201c470d04201c41016a222c201c490d11201c4101742216202c202c2016491b222c202c6a2215202c490d1120154100480d11201c450d03200d201620151027220d0d040c0c0b20131026221a450d0a0b20022113201521020b201a20134102746a201b360200202341016a2123200141286a2101201e41586a221e0d020c0c0b20151026220d450d080b201941016a2119200d201c4101746a2215200f4101713a0001201520133a0000201c41016a211c201b210f200141286a2101201e41586a221e0d000c0a0b0b101d000b20054101102a000b20134104102a000b20134104102a000b20184101102a000b20134104102a000b20154101102a000b20014104102a000b410121124104211d4100211441042111410021074100211f4100210f410021194104211a41002102410021234100211c4100212c4101210d0b200a200e412c6c6a211e200a21010240024002400240024002400240024002400240024002400340201e2001460d0120012d0000211b2001412c6a22132101201b2010470d000b20044198016a201341586a10be03200428029c01221b450d002004280298012101201b410274211b03402001280200211e024002400240024020232002470d00200241016a22102002490d1220024101742213201020102013491b2213ad4202862226422088a70d122026a722104100480d122002450d01201a200241027420101027221a0d020c070b20022113202321100c020b20101026221a450d050b20022110201321020b200141046a2101201a20104102746a201e360200202341016a2123201b417c6a221b0d000c020b0b200221130b200a200e412c6c6a211b200a2101024002400240024002400340201b2001460d0120012d000021022001412c6a221e210120024105470d000b20044190016a201e41586a10be03200428029401410c6c221b450d002004280290012101200441e4046a2115200441e0046a21160340200141086a21020240200141046a2802004101470d0020042002280200221e3602a80320012802002210201e4d0d0020044198026a410c6a41023602002015410236020020044198026a41086a20044180026a3602002004410236029c022004201036028002201620044198026a360200200442023702d4042004418cd6c4003602d0042004200441a8036a36029802200441c0036a200441d0046a10a20120042802c003222d0d040b20012902002126200441d0046a41086a221e2002280200360200200420263703d0040240024002400240201f2007470d00200741016a22022007490d1520074101742210200220022010491b2210ad420c7e2226422088a70d152026a722024100480d152007450d01201d2007410c6c20021027221d0d020c0b0b20072110201f21020c020b20021026221d450d090b20072102201021070b2001410c6a2101201d2002410c6c6a220220042903d004370200200241086a201e280200360200201f41016a211f201b41746a221b0d000c020b0b200721100b200a200e412c6c6a2107200a2101024002400240034020072001460d0120012d000021022001412c6a221b210120024106470d000b20044188016a201b41586a10be03200428028c012202450d0020042802880121012002410c6c211b200541017421072005410c6c21020340200441d0046a200110c00320042802d004222d0d0220012902002126200441d0046a41086a221e200141086a280200360200200420263703d004024020052014470d00200541016a22142005490d132007201420142007491b2214ad420c7e2226422088a70d132026a722154100480d1302402005450d00201120022015102722110d010c0b0b201510262211450d0a0b2001410c6a2101201120026a221520042903d004370200201541086a201e280200360200200741026a21072002410c6a2102200541016a2105201b41746a221b0d000b0b200a200e412c6c6a2107200a210102400240034020072001460d0120012d000021022001412c6a221b210120024107470d000b20044180016a201b41586a10be032004280284012202450d00200428028001220120024104746a2116200441d0046a41086a2117200441e4046a21180340200441d0046a2001200d201c10c10302400240024020042d00d0044101470d002017290300212720042802d404222d450d010c070b200420042d00d10422073a00a80320072001410c6a2d00002202460d0120044198026a410c6a41233602002018410236020020044198026a41086a200441a8036a3602002004412336029c02200420023a008002200441d0046a41106a20044198026a360200200442023702d404200441a0d7c4003602d004200420044180026a36029802200441c0036a200441d0046a10a20120042902c403212720042802c003222d0d060b2001410c6a2d000021070b2001410d6a2d0000211b0240024002402019200f470d00200f41016a2202200f490d16200f4101742215200220022015491b220220026a221e2002490d16201e4100480d16200f450d0120122015201e102722120d020c0e0b200f21022019210f0c010b201e10262212450d0c0b2012200f4101746a220f201b4101713a0001200f20073a0000201941016a21192002210f200141106a22012016470d000c020b0b200f21020b200441f8036a2023360200200441f4036a2013360200200441c0036a412c6a2024360200200441e8036a2029360200200441e0036a2019360200200441dc036a2002360200200441d4036a201f360200200441d0036a20103602002004201a3602f0032004202b3602e403200420123602d8032004201d3602cc03200420053602c803200420143602c403200420113602c003200a200e412c6c6a2105200a210102400240034020052001460d0120012d000021022001412c6a2207210120024104470d000b200441f8006a200741586a10be03200428027c210f0c010b4100210f0b2004200f3602cc01200a200e412c6c6a2105200a210102400240034020052001460d0120012d000021022001412c6a220721012002410b470d000b2004200741606a28020022013602d001200f2001460d010c100b200441003602d001200f4100470d0f0b200f450d09200a200e412c6c6a2105200a2101034020052001460d0420012d000021022001412c6a2207210120024104470d000b200a200e412c6c6a210f200a21010340200f2001460d0520012d000021022001412c6a220521012002410b470d000b200441f0006a200741586a10be0320042802742201450d0a4102212e2004280270222f20014102746a2130200541606a2131200541586a213220044189056a21334100213441142135200441d0046a41146a2136410121374102213841102139200441d0046a41106a213a4201213b41908bc300213c4104213d4118213e412c213f200441c0036a412c6a2140200441e4036a214142ff01214241202143410821444228214520044188056a214620044184056a21474180800121484281808080102149200441f8046a214a4280808080808010214b410c214c200441d0046a410c6a214d4170214e20044180056a214f200441ec046a21504124215141032152412521534203215441a8cbc40021554220215641782157412621584202215941988bc300215a4198dac400215b4100215c4104215d0c0b0b20042902d404212720102107202c450d0c0c0b0b20102107202c0d0a0c0b0b20042902c4032127202c0d090c0a0b41a88ac300411e1021000b41c68ac30041c8001021000b20104104102a000b20024104102a000b20154104102a000b201e4101102a000b410021010c050b410021010c040b410821010c030b200d10230b02402014450d00201110230b02402007450d00201d10230b0240200f450d00201210230b02402024450d0020244104742102202b210103400240200141046a280200450d00200128020010230b200141106a2101200241706a22020d000b0b02402029450d00202b10230b024002402013450d00201a1023202d0d050c010b410421010c020b410521010c010b200441a4026a4102360200200441e4046a41023602002004410236029c02200442023702d404200441988ac3003602d0042004200441d0016a3602a0022004200441cc016a36029802200420044198026a3602e00420044180026a200441d0046a10a2012004290284022127200428028002212d024020042802c4030d00410321010c010b410221010b03400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020010e0900010304050708090c0c0b200a200e412c6c6a2105200a210102400240034020052001460d0120012d000021022001412c6a2207210120024109470d000b2004200741586a28020022013602b801200441f8036a28020020014d0d012004200441f0036a28020020014102746a280200220136028002200441ec036a28020020014d0d03200441e4036a28020020014104746a22013502084200520d07200131000d4220864280808080f000834280808080c000520d070b200a200e412c6c6a2105200a2101034020052001460d5620012d000021022001412c6a2207210120024108470d000b200441e8006a200741586a220110be03200441d0046a200428026c10c6024110215f4114216020044198026a41106a2261200441d0046a41146a22622802003602004108216320044198026a41086a2264200441d0046a410c6a290200370300200420042902d40437039802200441e0006a200110be0320042802642201450d5420042802602265200141146c6a2166410421674105216841b9f3ddf1792169417c216a4103216b4101216c4102216d417e216e41ff01216f4119217041fffdfb772171417f217241808182847821734100217420044198026a410c6a217542202176410221774202217841b8d9c4002179200441e0036a217a200441d8036a217b200441f8036a217c200441f0036a217d200441ec036a217e4105215d0c220b200441e4046a4101360200200441023602ac03200442023702d40420044188dac4003602d0042004200441b8016a3602a8032004200441a8036a3602e00420044198026a200441d0046a10a2010c590b200441e4046a410136020020042080013602ac0320042081013602a803200441013602bc01200442013702d404200441d88bc3003602d0042004200441a8036a3602b8012004200441b8016a3602e00420044180026a200441d0046a10a2012004290284022127200428028002212d208801450d590c6b0b200441e4046a4101360200200441023602ac03200442023702d40420044198dac4003602d004200420044180026a3602a8032004200441a8036a3602e00420044198026a200441d0046a10a2010c570b20042802c0031023410321010c6a0b0240200441d0036a280200450d00200441cc036a28020010230b0240200441dc036a280200450d00200441d8036a28020010230b0240200441ec036a2802002202450d00200441e4036a28020021012002410474210203400240200141046a280200450d00200128020010230b200141106a2101200241706a22020d000b0b0240200441e8036a280200450d00200441e4036a28020010230b0240200441f4036a280200450d00200441f0036a28020010230b202c450d13200d1023410421010c690b202d450d130c6a0b412d1026222d450d04202d41256a41002900cd8b43370000202d41206a41002900c88b43370000202d41186a41002900c08b43370000202d41106a41002900b88b43370000202d41086a41002900b08b43370000202d41002900a88b4337000042ad808080d005212720042802c4030d0a0c090b200a450d02202aa721c701200a200e412c6c6a2105200a210102400240034020052001460d0120012d000021022001412c6a2207210120024102470d000b200441386a200741586a10be0320042802382101200428023c21020c010b410021010b2002410020011b211e200141a886c50020011b211c200a200e412c6c6a2105200a210102400240034020052001460d0120012d000021022001412c6a2207210120024108470d000b200441306a200741586a10be0320042802302101200428023421020c010b410021010b2002410020011b215d200141a886c50020011b2107200a200e412c6c6a2105200a210102400240034020052001460d0120012d000021022001412c6a220f210120024104470d000b200441286a200f41586a10be0320042802282101200428022c21020c010b410021010b2002410020011b211f200141a886c50020011b211b200a200e412c6c6a210f200a2101024002400240034041002102200f2001460d0120012d000021052001412c6a2223210120054103470d000b200441206a202341586a10be0320042802244100200428022022011b22050d010c020b410021014100410041001b2205450d010b200541286c2105200141a886c50020011b41186a2101410021020340200220012d0000456a2102200141286a2101200541586a22050d000b0b2007205d41146c6a215d4100211a4100211902400240024002400240024003402007205d460d012007280200210f4138210141e2bdc400210502400240200741086a28020022234106460d0020234104470d074101211a200f41a7c4c400460d01200f28000041e3c2b1e306460d010c070b41012119200f41e5c4c400460d00200f41e5c4c40041061096040d060b2007410c6a2802000d02200741106a280200220120026b220f20014b0d0341ebc4c400210541262101201f200f4d0d05201b200f4102746a220f450d054191c5c400210541202101201e200f280200220f4d0d05201c200f4104746a220f450d05411f210141d7bec4002105200f2802080d05200741146a2107200f2d000d4104460d000c050b0b201a201971410171450d02200a200e412c6c6a2105200a2101034020052001460d0520012d000021022001412c6a2207210120024106470d000b200441186a200741586a10be03200428021c450d04200041f6bec400360204411f21010c500b41132101419abec40021050c020b412a210141adbec40021050c010b411c411e201941017122081b210141abc4c40041c7c4c40020081b21050b200020053602040c4c0b200a200e412c6c6a2105200a210102400240034020052001460d0120012d000021022001412c6a2207210120024102470d000b200441106a200741586a10be0320042802102101200428021421020c010b410021010b2002410020011b21c801200141a886c50020011b21c901200a200e412c6c6a2105200a2101024002400340410021ca0120052001460d0120012d000021022001412c6a2207210120024103470d000b200441086a200741586a10be0320042802082101200428020c21020c010b410021010b412821cb01200141a886c50020011b22cc012002410020011b41286c6a21cd01410321ce0141cae2c40021cf01410121d001410221d101411c21d201410621d30141cbbfc40021d401410421d501200341dc006a21d601410b21d70141bed0c40021d80141e3cec40021d90141e00021da01410d21db014187cfc40021dc01417d21dd01411321de0141cde2c40021df0141b1cfc40021e001410721e10141bdcec40021e20142e5f0d1fbb5ac98b6ec0021e30141c5cec40021e401410a21e50141cfcec40021e60141d9cec40021e70141a7cfc40021e80141fbcec40021e901410c21ea0141eecec40021eb0141c9cfc40021ec01410e21ed0141d7cfc40021ee01419fcec40021ef01410f21f00141aecec40021f10141e5cfc40021f201411021f30141f5cfc40021f40141b8cfc40021f501411121f6014185d0c40021f70141acd0c40021f801411221f9014192cfc40021fa01411521fb014196d0c40021fc01411621fd01410021fe010c050b200441e4046a4101360200200441023602ac03200442023702d40420044188dac4003602d0042004200441b8016a3602a8032004200441a8036a3602e00420044198026a200441d0046a10a2010c510b200441e4046a4101360200200441023602ac03200441e0046a200441a8036a360200200442023702d40420044198dac4003602d004200420044180026a3602a80320044198026a200441d0046a10a2010c500b4195bfc40041361021000b412d4101102a000b024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240205d0e0a02030405000106080913130b2004205c3602d4012031280200210120322802002102203620373602002004203836028402203a20044180026a3602002004203b3702d4042004203c3602d0042004200441d4016a3602800220044198026a200441d0046a10a201200429029c022127200428029802212d2001205c4d0da70102402027a7450d00202d10230b2004202f280200220136028002024002400240024002400240204028020020014d0d002002205c203e6c6a2202280214221c450d0120412802002001203d746a22052d000d212320052802002119200228020c21012002280200211f2005280208221b210702402002280208221e450d00201e205274210f201b2102201f21050340200220052802006a22072002490d04200520446a210520072102200f20576a220f0d000b0b204410262202450d2a20022023ad20428320458637020020044180026a202e6a220520044198026a202e6a2d00003a0000200420042f0098023b018002204620233a000020472048360200200441d0046a203f6a220f2049370200204a2002360200200441d0046a20436a204b370300200441d0046a203e6a2223203b37030020362007360200203a201e360200204d201f360200200441d0046a20446a201b360200203320042f0180023b00002033202e6a20052d00003a0000200420193602d404201c203d7421052004200441c0036a3602d004410021020340200420023602e801200420013602ec01200441b8016a200441d0046a200110c403024020042802b801450d00200441a8036a20446a200441b8016a20446a280200360200200420042903b8013703a80320044198026a20356a205136020020044198026a204c6a203836020020044180026a20356a205236020020044198026a20396a200441a8036a36020020044198026a20446a200441e8016a3602002004205336029c0220044180026a20396a20044198026a360200200420543702840220042055360280022004200441ec016a36029802200441f0016a20044180026a10a201024020042802ac03450d0020042802a80310230b20042802f00122070d050b200120396a2101200220376a21022005204e6a22050d000b204f2802000d2b02402050280200450d00202328020010230b200f280200450d05204a2802001023205c20376a215c202f203d6a222f2030470d450c610b20362037360200200420383602ac03203a200441a8036a360200200420593702d4042004205b3602d004200420044180026a3602a80320044198026a200441d0046a10a201200429029c022226205688a721012026a7210220042802980222070d030c040b204310262207450d2b2007203e6a20342900a0cb44370000200720396a2034290098cb44370000200720446a2034290090cb4437000020072034290088cb44370000412021024120210120070d020c030b204310262207450d292007203e6a20342900e8dc44370000200720396a20342900e0dc44370000200720446a20342900d8dc44370000200720342900d0dc44370000412021024120210120070d010c020b20042902f401212602402050280200450d00202328020010230b2026205688215e0240200f280200450d00204a28020010230b205ea721012026a721020b200420073602800220042001ad2056862002ad8437028402200420044180026a3602a80320044198026a204c6a20583602002036202e36020020044198026a20446a200441a8036a3602002004203836029c02203a20044198026a360200200420593702d4042004205a3602d0042004200441d4016a36029802200441d8016a200441d0046a10a2010240200428028402450d0020042802800210230b20042802d801222d0d070b205c20376a215c202f203d6a222f2030470d3e410021010cba010b2065227f450d9f0141002102207f2802082280012101207f280200228101210502402080012067490d0041002102208101210120800121050340200128000020022068777320696c2102200120676a21012005206a6a2205206b4b0d000b208001206a6a22012001206a7122056b210120810120056a20676a21050b0240024002402001206c4d0d002005206d6a2107200220687720052f00007320696c21022001206e6a450d020c010b200521072001450d010b200220687720072d00007320696c21020b207f20606a21652002206877206f7320696c228201207076228301206374208301722201205f7420017221840120642802002185014100218601200428029802218701200428029c02218801208201218901410021010c8c010b0240209401208c016a280200450d0020940128020010230b0240209401208d016a2802002202450d0020940128020c21012002208c017421020340024020012d0000209001470d0020012091016a28020020920171450d002001208c016a28020010230b2001208e016a210120022093016a22020d000b0b209401208a016a21010240209401208e016a280200450d00209401208f016a28020010230b20012194012001208b01470d380cbc010b0240209f012097016a2802002202450d00209f0128020421012002209a017421020340024020012d0000209c01470d0020012098016a280200209d0171450d002001209a016a28020010230b2001209b016a21012002209e016a22020d000b0b0240209f012098016a280200450d00209f01209a016a28020010230b209f012095016a21010240209f012099016a280200450d00209f0128021010230b2001219f012001209601470d380cbb010b024020aa0120a2016a2802002202450d0020aa012802042101200220a5017421020340024020012d000020a701470d00200120a3016a28020020a80171450d00200120a5016a28020010230b200120a6016a2101200220a9016a22020d000b0b024020aa0120a3016a280200450d0020aa0120a5016a28020010230b20aa0120a0016a2101024020aa0120a4016a280200450d0020aa0128021010230b200121aa01200120a101470d380cba010b024020b2012802082202450d0020b2012802002101200220ab017421020340024020012d000020ae01470d00200120af016a28020020b00171450d00200120ab016a28020010230b200120ad016a2101200220b1016a22020d000b0b20b20120ad016a2101024020b20120ab016a280200450d0020b20128020010230b200121b201200120ac01470d380cb9010b20b901220720b5016a21b901024020072802042201450d000240200720b6016a2802002202450d00200220b6016c21020340024020012802002205450d00200120b3016a280200450d00200510230b200120b6016a2101200220b8016a22020d000b0b200720b7016a280200450d00200720b3016a28020010230b20b90120b401470d3a0cb7010b20042902dc01212720042802c4030d5c0c5b0b20bb01450d9a01200420bb0128020022013602800220bd0128020020014d0d01200441d0046a20bb0120be016a20c00128020020bf0128020010c10320042d00d00420c101460d0220042d00d1040d03200441c0006a20bb0110c503024020042802442201450d0020042802402102200120c20174210520c301280200210703402004200228020022013602b801200720014d0d60200420c401280200200120c201746a28020022013602800220c50128020020014d0d61200220be016a2102200520c6016a22050d000b0b20bb0120ba016a22bb0120bc01470d390c9a010b024020cc0120cd01460d00418ec1c4002102412d210120cc0128020820ce01470d0d024020cc01280200220520cf01460d00200520cf0120ce011096040d0e0b024020cc012d0018220120d001460d0020cc0120cb016a2105024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200120d101460d00200120ce01460d2641d1bfc40021024136210120c80120cc0128021c22074d0d3520c901200720d501746a220f450d3520cc01280214212320cc0128020c210720d6012d00000d01202320d701470d0141c2c0c400210241382101200720d801460d35200720d80120d701109604450d350c020b41bbc1c4002102412f210120cc0128021420d301470d34024020cc0128020c220720d401460d00200720d40120d3011096040d350b20fe010d2e20cc0120d2016a21fe01200521cc014108215d0ca7010b419cc0c400210241262101202320dd016a222320de014b0d3320230e14013333330c0e330d000b0a06050f070833330910010b200720d901460d0120d901200720d701109604450d01200720dc01460d0220dc01200720d701109604450d020240200720d801460d0020d801200720d7011096040d2b0b20d10110262223450d48202320ca013b0000200f2d000c20da01470d29200f28020820d101470d29200f280200215d410021010340200120d0014b0d04202320016a2102205d20016a2107200120d0016a210120072d000020022d0000460d000c2a0b0b200720df01460d31200720df0120ce01109604450d3120df01200720ce011096040d3120d0011026225d450d4a205d20ca013a0000200f2d000c20da01470d32200f28020820d001470d32200f280200211f41002102034020020d17205d20026a2107201f20026a2123200220d0016a210220232d000020072d0000460d000c330b0b419cc0c400210241262101200f2d000c20da01470d30200f2802080d30200521cc01200f20db016a2d000020d501460d730c300b419cc0c400210241262101200f2d000c20da01470d2f200f2802080d2f200521cc01200f20db016a2d000020d501460d710c2f0b200f20db016a2d0000210120231023200521cc01200120d501460d6f0c260b200720ef01460d0b20ef01200720f001109604450d0b0240200720f101460d0020f101200720f0011096040d2e0b20d0011026221f450d4c201f20ca013a0000200f2d000c20da01470d36200f28020820d001470d36200f280200211b41002107034020070d18201f20076a2123201b20076a215d200720d0016a2107205d2d000020232d0000460d000c370b0b200720ec01460d0b20ec01200720ed01109604450d0b0240200720ee01460d0020ee01200720ed011096040d2d0b20ce011026225d450d47205d20ca013a0002205d20ca013b0000200f2d000c20da01470d38200f28020820ce01470d38200f280200211f410021020340200220d1014b0d18205d20026a2107201f20026a2123200220d0016a210220232d000020072d0000460d000c390b0b200720f501460d0b20f501200720f601109604450d0b0240200720f701460d0020f701200720f6011096040d2c0b20d5011026225d450d42205d20ca01360000200f2d000c20da01470d35200f28020820d501470d35200f280200211f410021020340200220ce014b0d18205d20026a2107201f20026a2123200220d0016a210220232d000020072d0000460d000c360b0b0240200720f801460d0020f801200720f9011096040d2b0b419cc0c400210241262101200f2d000c20da01470d2a200f2802080d2a200521cc01200f20db016a2d000020d501460d570c2a0b0240200720fa01460d0020fa01200720fb011096040d2a0b419cc0c400210241262101200f2d000c20da01470d29200f2802080d29200521cc01200f20db016a2d000020d501460d5f0c290b0240200720eb01460d0020eb01200720db011096040d290b419cc0c400210241262101200f2d000c20da01470d28200f2802080d28200521cc01200f20db016a2d000020d501460d600c280b0240200720e901460d0020e901200720ea011096040d280b419cc0c400210241262101200f2d000c20da01470d27200f2802080d27200521cc01200f20db016a2d000020d501460d5e0c270b0240200720e001460d0020e001200720e1011096040d270b419cc0c400210241262101200f2d000c20da01470d26200f2802080d26200521cc01200f20db016a2d000020d501460d5b0c260b200720e401460d0620e401200720e501109604450d06200720e601460d0e20e601200720e501109604450d0e200720e701460d1420e701200720e501109604450d140240200720e801460d0020e801200720e5011096040d260b20d1011026225d450d41205d20ca013b0000200f2d000c20da01470d33200f28020820d101470d33200f280200211f410021020340200220d0014b0d16205d20026a2107201f20026a2123200220d0016a210220232d000020072d0000460d000c340b0b0240200720e201460d00200729000020e301520d250b20e1011026221f450d42201f20ca01360003201f20d0013a0002201f20ca013b0000200f2d000c20da01470d22200f28020820e101470d22200f280200211b410021070340200720d3014b0d08201f20076a2123201b20076a215d200720d0016a2107205d2d000020232d0000460d000c230b0b200720f201460d0520f201200720f301109604450d050240200720f401460d0020f401200720f3011096040d240b20ce011026225d450d37205d20ca013a0002205d20ca013b0000200f2d000c20da01470d2e200f28020820ce01470d2e200f280200211f410021020340200220d1014b0d11205d20026a2107201f20026a2123200220d0016a210220232d000020072d0000460d000c2f0b0b0240200720fc01460d0020fc01200720fd011096040d230b20d1011026221f450d3c201f20ca013b0000200f2d000c20da01470d21200f28020820d101470d21200f280200211b410021070340200720d0014b0d07201f20076a2123201b20076a215d200720d0016a2107205d2d000020232d0000460d000c220b0b20d5011026225d450d34205d20ca01360000200f2d000c20da01470d28200f28020820d501470d28200f280200211f410021020340200220ce014b0d08205d20026a2107201f20026a2123200220d0016a210220232d000020072d0000460d000c290b0b419cc0c400210241262101200f2d000c20da01470d20200f2802080d20200f20db016a2d0000220720d501460d20200521cc01200720d5017220d501460d520c180b20d1011026225d450d3c205d20ca013b0000200f2d000c20da01470d27200f28020820d101470d27200f280200211f410021020340200220d0014b0d07205d20026a2107201f20026a2123200220d0016a210220232d000020072d0000460d000c280b0b20e1011026221f450d36201f20ca01360003201f20d0013a0002201f20ca013b0000200f2d000c20da01470d24200f28020820e101470d24200f280200211b410021070340200720d3014b0d07201f20076a2123201b20076a215d200720d0016a2107205d2d000020232d0000460d000c250b0b419cc0c400210241262101200f2d000c20da01470d1d200f2802080d1d200f20db016a2d0000220720d501460d1d200521cc01200720d5017220d501460d4d0c150b200f20db016a2d0000220720d501460d1a201f1023200521cc01200720d5017220d501460d590c1c0b200f20db016a2d00002101201f1023200521cc01200120d501460d490c130b200f20db016a2d00002101205d1023200521cc01200120d501460d5a0c120b200f20db016a2d00002101205d1023200521cc01200120d501460d580c110b200f20db016a2d00002101205d1023200521cc01200120d501460d4c0c100b200f20db016a2d0000220720d501460d1d201f1023200521cc01200720d5017220d501460d530c170b20d1011026225d450d2b205d20ca013b0000200f2d000c20da01470d23200f28020820d101470d23200f280200211f410021020340200220d0014b0d05205d20026a2107201f20026a2123200220d0016a210220232d000020072d0000460d000c240b0b200f20db016a2d0000220720d501460d1e201f1023200521cc01200720d5017220d501460d530c150b200f20db016a2d00002101205d1023200521cc01200120d501460d450c0c0b200f20db016a2d00002101205d1023200521cc01200120d501460d460c0b0b200f20db016a2d00002101205d1023200521cc01200120d501460d410c0a0b200f20db016a2d00002101205d1023200521cc01200120d501460d4c0c090b419cc0c400210241262101200f2d000c20da01470d10200f2802080d10200521cc01200f20db016a2d000020d501460d4a0c100b200f20db016a2d00002101205d1023200521cc01200120d501460d480c070b4115210120004187c0c4003602040c98010b41142101200041fac0c4003602040c97010b024020fe01450d0020fe01280204450d0620fe0128020022ff0120fe0141086a2802002280024d0d0820004189c2c40036020441c90021010c97010b410021ff0141002180020c080b200441e4046a4101360200200441023602ac03200442023702d404200441e8d9c4003602d004200420044180026a3602a8032004200441a8036a3602e00420044198026a200441d0046a10a2010c9c010b200441d8046a290300212720042802d404212d20042802c4030d560c550b41201026222d450d2d202d41186a41002900908c43370000202d41106a41002900888c43370000202d41086a41002900808c43370000202d41002900f88b4337000042a08080808004212720042802c4030d530c520b202310230b412621012000419cc0c4003602040c91010b20004193c3c400360204413221010c90010b411f2101200041eac1c4003602040c8f010b20800220032802544d0d00200041d2c2c40036020441c10021010c8e010b200441d0046a41086a22024200370300200441f098c4003602d40420042003290308228102a7417f208102428080808010541b3602e00420042003290310228102a7417f208102428080808010541b3602d004200441d0046a4104722201410d10c6032001410c10c6032001410710c6032001410f10c603200441c8016a20042802e004360200200441b8016a41086a2002290300370300200420042903d0043703b801200a450d23200441d0046a410c6a202a3702002004200a3602d80420042028428080808010843703d00420044198026a200441d0046a10c703410110262201450d24200141003a0000200420042f01d0043b01c003200441e0046a41e0083b0100200441d8046a428180808010370300200420013602d404200441013602d004200420042f01c0033b01e20420044198026a200441d0046a10c8032123410310262202450d25200241026a41002d00cce2443a0000200241002f00cae2443b0000410310262205450d26200541026a41002d00cfe2443a0000200541002f00cde2443b0000200441c0036a41026a228202200441d0046a41026a2283022d00003a0000200420042f00d0043b01c003200441ac026a220f280200210720044198026a41106a28020021012083022082022d00003a0000200420042f01c0033b01d00420072001470d07200141016a22072001490da901200141017422820220072007208202491b228202ad42287e228102422088a70da901208102a722074100480da9012001450d05200441a4026a280200200141286c200710272201450d080c060b2084022d0000208b026a2201208c024b0d7b024002400240024020010e0400030102000b20840228020c2201450d7e2001208d026c2102208402280204208e026a2101034002402001208f026a2802000d0020012802002205208202490d00200120052083026a3602000b2001208d026a210120022090026a22020d000c7f0b0b20840228020c2201450d7d20840228020422a40220012091026c6a21a502410121010c7c0b20840228020c2201450d7c20840228020422a60220012093026c6a21a7020c7a0b2084022802042201208202490d7b2084022088026a20012083026a3602002084022086026a228402208702470d470c7c0b201f10232000419cc0c4003602040c8b010b201f10230b200020023602040c89010b205d10232000419cc0c4003602040c88010b200710262201450d020b200441a8026a208202360200200441a4026a2001360200200441ac026a28020021070b200441a4026a280200200741286c6a220141003a00182001200536020c200142838080803037020420012002360200200141106a4283808080303702002001411b6a200441d2046a2d00003a0000200141196a20042f01d0043b00002001411c6a2023360200200f200f28020041016a360200200441d0046a20044198026a418c011094041a200441a8036a200441d0046a10c903200441a8036a41106a2802002223412c6c210120042802b00322840241586a210202400340410021052001450d01200141546a2101200241286a21072002412c6a220f210220072d00004103470d000b200f41086a2802002201450d00200141286c2102200f28020041186a2101410021050340200520012d0000456a2105200141286a2101200241586a22020d000b0b2023412c6c210120840241586a21022005417f6a21820202400340410021052001450d01200141546a2101200241286a21072002412c6a220f210220072d00004103470d000b200f41086a2802002201450d00200141286c2102200f28020041186a2101410021050340200520012d0000456a2105200141286a2101200241586a22020d000b0b2023412c6c210120840241606a21020240024003402001450d01200141546a2101200241206a21072002412c6a220f210220072d00004104470d000b200f280200210120230d010c780b410021012023450d770b200120056a218502412c2186022084022023412c6c6a2187024104218802200441b8016a4104722189024100218a024178218b024103218c024114218d024110218e02417c218f024101218302416c219002411c21910241022192024118219302410c2194024108219502428080808010219602412d2197024220218102417f219802410b2199024170219a02417e219b0241ec00219c024203219d024202219e0241ff01219f02410521a002410621a102410021a202410021a3024109215d0c700b20074104102a000b201f10232000419cc0c4003602040c83010b205d10232000419cc0c4003602040c82010b205d10232000419cc0c4003602040c81010b201f10232000419cc0c4003602040c80010b205d10232000419cc0c4003602040c7f0b205d10232000419cc0c4003602040c7e0b205d10232000419cc0c4003602040c7d0b205d10232000419cc0c4003602040c7c0b205d10232000419cc0c4003602040c7b0b41084104102a000b41c0cbc400104f000b41204101102a000b41204101102a000b41044101102a000b41034101102a000b41024101102a000b41024101102a000b41044101102a000b41074101102a000b41014101102a000b41024101102a000b41034101102a000b41024101102a000b41024101102a000b41074101102a000b41014101102a000b4195bfc40041361021000b41014101102a000b41034101102a000b41034101102a000b41204101102a000b4100215d0c2d0b4101215d0c2d0b4102215d0c2d0b4103215d0c2d0b4104215d0c2d0b4104215d0c2d0b4106215d0c2e0b4107215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2e0b4108215d0c2f0b4109215d0c300b410021010c5e0b410321010c5d0b410221010c5c0b410321010c5b0b410221010c5a0b410321010c590b410221010c580b410321010c570b410221010c560b410421010c550b410521010c540b410621010c530b410721010c520b410821010c510b410821010c500b410821010c4f0b410821010c4e0b410821010c4d0b410821010c4c0b410821010c4b0b410821010c4a0b410821010c490b410821010c480b410821010c470b410821010c460b410821010c450b410821010c440b410821010c430b410821010c420b410821010c410b410821010c400b410821010c3f0b410821010c3e0b410821010c3d0b410821010c3c0b410821010c3b0b410821010c3a0b410821010c390b410821010c380b410821010c370b410821010c360b410821010c350b410821010c340b410821010c330b410821010c320b410821010c310b410821010c300b410821010c2f0b410821010c2e0b410221010b034002400240024002400240024002400240024002400240024002400240024020010e03000102020b02402087012089012088017122016a2800002205208401732202207273200220716a712073712202450d0003400240208001208501200268206b7620016a20880171206b746a220720676a280200470d0020810120072802002207460d082081012007208001109604450d070b200220726a20027122020d000b0b20860120676a22860120016a21890120052005206c7471207371450d03024020612802000d0020044198026a10c702200428029802218701200428029c022188010b410021010340200120676a22012082012088017122026a21820120870120026a2800002073712205450d000b0240208701200568206b7620026a2088017122016a2c000022022074480d0020870120870128020020737168206b7622016a2d000021020b20870120016a2083013a00002087012001206a6a208801716a20676a2083013a0000206120612802002002206c716b36020020752075280200206c6a36020020642802002001206b746a208001ad207686208101ad8437020002400240024002400240024002400240207f28020c2201206c460d0002402001206d460d002001206b470d022004207f28021022013602f001207a28020020014d0d06207b2802002001206c746a2d0001450d030c070b2004207f28021022013602b801200441c0036a20636a28020020014b0d022062206c360200200420773602ac03200441d0046a205f6a200441a8036a360200200420783702d404200420793602d0042004200441b8016a3602a80320044180026a200441d0046a10a201200428028002222d450d020c110b2004207f28021022013602b801200441c0036a20606a28020020014b0d010c030b2004207f28021022013602f001207c28020020014d0d012004207d2802002001206d746a28020022013602b801207e28020020014d0d050b20652066470d0b0c260b200441e4046a4101360200200441023602ac03200442023702d40420044188dac4003602d0042004200441f0016a3602a8032004200441a8036a3602e00420044180026a200441d0046a10a2012004290284022127200428028002212d2088010d3e0c2c0b200441e4046a4101360200200441023602ac03200442023702d404200441e8d9c4003602d0042004200441b8016a3602a8032004200441a8036a3602e00420044180026a200441d0046a10a2012004290284022127200428028002212d2088010d3d0c2b0b200441e4046a4101360200200441023602ac03200442023702d404200441b8dac4003602d0042004200441f0016a3602a8032004200441a8036a3602e00420044180026a200441d0046a10a2012004290284022127200428028002212d2088010d3c0c2a0b200441e4046a4101360200200441023602ac03200442023702d404200441d8dac4003602d0042004200441f0016a3602a8032004200441a8036a3602e00420044180026a200441d0046a10a2012004290284022127200428028002212d2088010d3b0c290b200441e4046a4101360200200441023602ac03200441e0046a200441a8036a360200200442023702d40420044198dac4003602d0042004200441b8016a3602a80320044180026a200441d0046a10a2012004290284022127200428028002212d2088010d3a0c280b20a40222012091026a21a402024020012802182202450d002001280210210120022092027421020340024020012802002205208202490d00200120052083026a3602000b20012088026a21012002208f026a22020d000b0b20a40220a502470d010c0e0b20a3022111024020a602280214208802742202450d0020a60228020c21010340024020012d0000209902470d0020012088026a22052802002207208202490d00200520072083026a3602000b2001208e026a21012002209a026a22020d000b0b20950210262201450d0620012096023702002088021026221c450d0520a6022094026a2105201c208a0236020020a602208d026a22102802002224450d0841002102410121234101210f4101211b41012107024002400240024041002024221f4f0d000240034020022083026a211f0240024002400240024002400240024020052802002002208802746a2d00002202209b026a208c024f0d00200210ca0321a802200441b8016a2095026a28020021a90220890221aa020c010b0240024002400240024002400240200220a002460d00200220a102470d012007450d0f20072098026a21070c0a0b2007450d0e2023200f470d0120232083026a22022023490d4d202320830274221e20022002201e491b221ead209d0286222620810288a70d4d2026a72202208a02480d4d2023450d0220012023208c02742002102722010d030c040b200210ca0321ab02200441b8016a2095026a28020021ac0220890221ad020c060b2023211e0c010b200210262201450d010b2001200f208c02746a22022083023602042002201f360200024002400240201b20072098026a2223470d00201b208302742202200720072002491b2219ad209e0286222620810288a70d4c2026a72202208a02480d4c201b450d01201c201b2092027420021027221c0d020c040b201b21190c010b20021026221c450d020b200f2083026a2102201c2023209202746a200f360200201f20244f0d180c080b20024104102a000b20024104102a000b410021020c010b410121020b0240024003400240024020020e020001010b20aa0228020022192095026a21a30220192f0106211e410021020240024002400340201e2002460d01208a0220980220830220a30220026a2d0000221a20a802209f0271221d4b1b201a201d461b221a450d0220022083026a2102201a208302460d000b20022098026a211e0b024020a902450d0020a9022098026a21a9022019201e209202746a209c026a21aa02410021020c040b200441b8016a211e20072098026a22022007490d010c0b0b200441b8016a211e024020192002208c02746a208d026a2202450d0020022802002219208302460d0b2019209202470d0020022088026a211e0b20072098026a220220074f0d0a0b200220074b0d09200f201c2002209202746a28020022024d0d0920012002208c02746a22192802042202201e2802006a221e2002490d0920192088026a201e36020002402023200f470d0020232083026a22022023490d49202320830274221e20022002201e491b221ead209d0286222620810288a70d492026a72202208a02480d492023450d0620012023208c02742002102722010d070c0c0b2023211e0c060b20ad0228020022192095026a21a30220192f0106211e4100210202400340201e2002460d01208a0220980220830220a30220026a2d0000221a20ab02209f0271221d4b1b201a201d461b221a450d0320022083026a2102201a208302460d000b20022098026a211e0b024020ac02450d0020ac022098026a21ac022019201e209202746a209c026a21ad02410121020c010b0b200441b8016a211e20072098026a22022007490d010c070b200441b8016a211e024020192002208c02746a208d026a2202450d0020022802002219208302460d072019209202470d0020022088026a211e0b20072098026a220220074f0d060b200220074b0d05200f201c2002209202746a28020022024d0d0520012002208c02746a22192802042202201e2802006a221e2002490d0520192088026a201e3602000b2023211e200f2102201b2119201f2024490d020c120b200210262201450d050b2001200f208c02746a22022083023602042002201f360200024002400240201b2007470d00201b2083026a2202201b490d44201b208302742223200220022023491b2219ad209e0286222620810288a70d442026a72202208a02480d44201b450d01201c201b2092027420021027221c0d020c080b201b21190c010b20021026221c450d060b200f2083026a2102201c2007209202746a200f36020020072083026a2107201f20244f0d100b201e21232002210f2019211b201f22022010280200221f490d000c020b0b02402023450d00200110230b410121a2020240201b450d00201c1023201121a3022084022086026a228402208702470d040c130b201121a3020c110b41d0e2c4002002201f1029000b20024104102a000b20024104102a000b4109215d410821010c390b410121010c0b0b410021010c0a0b410121010c360b410121010c350b4105215d410821010c340b41044104102a000b41084104102a000b20042902840221272088010d300c1e0b20012095026a210f410121194101211e0c010b2002450d0120012002208c02746a210f0b200121234101210203402001290200212620042097023a00d00420042026208102883e02d404200520022026a76a22072098026a200441d0046a10cb0320042099023a00d00420042082023602d40420052007200441d0046a10cb0320022092026a2102200f20012095026a2201470d000b202321010b0240201e450d00200110230b02402019450d00201c10230b20a6022093026a21a60202400240200441b8016a208e026a280200450d0020102802002202450d00200528020021012002208802742102410021050340024020012d0000208602470d0020012099023a000020012088026a20850236020020052083026a21050b2001208e026a21012002209a026a22020d000b410121a30220050d010b201121a3020b20a60220a702460d01410221010c000b0b2084022086026a228402208702470d0d0b024020a202410171450d0020042802b0032109200441b4036a2902002227a7210202402027422088a72201450d002001412c6c21082009210103402001109f012001412c6a2101200841546a22080d000b0b02402002450d00200910230b20042802bc01200441c0016a280200200441c4016a28020010d301200041c5c3c400360204411a21010c030b024020a302410171450d00200441d0046a41106a200441a8036a41106a280200360200200441d0046a41086a200441a8036a41086a290300370300200420042903a8033703d004200441c0036a200441d0046a10c703411010262208450d08200841063a0000410110262201450d09200141003a0000410110262202450d0a200220012d00003a000020011023411010262209450d0b200941063a000041f00010262201450d0c200141063a00602001412c3b015020012082023602442001410b3a0040200141d8003a00302001412d3a0020200141003602142001410f3a0010200141003602042001410f3a00002001200441c8016a280200360224024020092d00004109470d00200928020841ffffffff0371450d00200928020410230b20091023024020082d00004109470d00200828020841ffffffff0371450d00200828020410230b20081023200441f4046a4287808080f000370200200441f0046a2001360200200441ec046a4100360200200441d0046a410c6a4281808080800c370200200441d8046a4101360200200441003602fc04200442043702e404200420023602d404200441013602d004200441c0036a200441d0046a10cc03200441d0046a200441c0036a418c011094041a20044180026a200441d0046a10c90320044180026a410c6a2902002127200428028802218402200428028402210120042802800221080c020b20042802b0032184020b200441b4036a290200212720042802ac03210120042802a80321080b20042802bc01200441c0016a280200200441b8016a410c6a28020010d301208402450d02200441c0036a410c6a202737020020042084023602c80320042001ad4220862008ad843703c003200441d0046a200441c0036a200328025010cd0320042802d0044101470d010240200441d8046a280200450d0020042802d40410230b200041dfc3c400360204412321010b20004101360200200041086a2001360200200441e0056a24000f0b200441dc046a280200222c450d01200441e0046a2903002127200441d8046a280200210220042802d40421092003280248212320044100360288022004420137038002410410262201450d02200441043602840220044188026a22082008280200220541046a3602002004200136028002200120056a20093600000240024002402004280284022209200828020022016b41044f0d00200141046a22082001490d2a20094101742201200820082001491b22014100480d2a2009450d012004280280022009200110272208450d020c0c0b20042802800221080c0c0b2001102622080d0a0b20014101102a000b4195bfc40041361021000b4195bfc40041361021000b41044101102a000b41104108102a000b41014101102a000b41014101102a000b41104108102a000b41f0004108102a000b4109215d410821010c1d0b2004200136028402200420083602800220044188026a28020021010b20044180026a41086a200141046a360200200820016a2002360000202c2027422088a72201412c6c22086a21022027a7210f024002400240024002402001450d00200841546a2122200441d0046a4101722108200441d0046a41276a2105200441d0046a41206a210b200441d0046a41186a2107200441d0046a41106a2106200441d0046a41086a2121202c2101034020012d000021092005200141286a280000360000200b200141216a2900003703002007200141196a2900003703002006200141116a2900003703002021200141096a2900003703002004200141016a2900003703d0042009410f460d02200441c0036a41276a22202005280000360000200441c0036a41206a220a200b290300370300200441c0036a41186a222d2007290300370300200441c0036a41106a220d2006290300370300200441c0036a41086a220e2021290300370300200420042903d0043703c003200820042903c003370000200841086a200e290300370000200841106a200d290300370000200841186a202d290300370000200841206a200a290300370000200841276a2020280000360000200420093a00d00420044198026a200441d0046a20044180026a109a0120042d0098022209411a470d05202241546a21222001412c6a22012002470d000b200222012002470d020c030b202c22012002470d010c020b2001412c6a22012002460d010b200441d0046a4101722108200441d0046a41276a2105200441d0046a41206a210b200441d0046a41186a2107200441d0046a41106a2106200441d0046a41086a2121034020012d000021092005200141286a280000360000200b200141216a2900003703002007200141196a2900003703002006200141116a2900003703002021200141096a2900003703002004200141016a2900003703d0042009410f460d01200441c0036a41276a22222005280000360000200441c0036a41206a2220200b290300370300200441c0036a41186a220a2007290300370300200441c0036a41106a222d2006290300370300200441c0036a41086a220d2021290300370300200420042903d0043703c003200820042903c003370000200841086a200d290300370000200841106a202d290300370000200841186a200a290300370000200841206a2020290300370000200841276a2022280000360000200420093a00d004200441d0046a109f012001412c6a22012002470d000b0b0240200f450d00202c10230b20044180026a41086a280200210120042903800221272000411c6a41003a0000200041186a2001360200200041106a20273702002000410c6a208002360200200041086a20ff0136020020002023360204200041003602002000411d6a20042f00a8033b00002000411f6a200441aa036a2d00003a0000200441e0056a24000f0b20044198026a41086a2802002123200428029c0221820202402022450d002001412c6a2101200441d0046a4101722108200441d0046a41276a210b200441d0046a41206a2107200441d0046a41186a2106200441d0046a41106a2121200441d0046a41086a2122034020012d00002105200b200141286a2800003600002007200141216a2900003703002006200141196a2900003703002021200141116a2900003703002022200141096a2900003703002004200141016a2900003703d0042005410f460d01200441c0036a41276a2220200b280000360000200441c0036a41206a220a2007290300370300200441c0036a41186a222d2006290300370300200441c0036a41106a220d2021290300370300200441c0036a41086a220e2022290300370300200420042903d0043703c003200820042903c003370000200841086a200e290300370000200841106a200d290300370000200841186a202d290300370000200841206a200a290300370000200841276a2020280000360000200420053a00d004200441d0046a109f012001412c6a22012002470d000b0b0240200f450d00202c10230b0240200428028402450d0020042802800210230b024020094105470d002023450d0020820210230b20004182c4c40036020420004101360200200041086a4125360200200441e0056a24000f0b20004101360200200041086a2001360200200a450d2a0240200e450d00200e412c6c2108200a210103402001109f012001412c6a2101200841546a22080d000b0b20c701450d2a200a1023200441e0056a24000f0b200428029c02450d0020042802980210230b200a200e412c6c6a2105200a21010240034020052001460d0120012d000021022001412c6a2207210120024103470d000b200441d8006a200741586a10be03200428025c2201450d0020042802582107200141286c210f41002101200441a4026a211f200441e4046a211b200441a0026a211e200441e0046a211c200441ec036a21230340024002400240200720016a220241186a2d000022054101460d00024020054102460d0020054103470d022002411a6a2d0000450d030c090b200441d0046a2002411c6a10c00320042802d004222d450d020c060b200241206a2802004101470d012002411c6a28020021052004200241246a28020022023602b801200520024d0d01201f4102360200201b4102360200201e200441a8036a3602002004410236029c02200420053602a803201c20044198026a360200200442023702d4042004418cd6c4003602d0042004200441b8016a3602980220044180026a200441d0046a10a201200428028002222d450d010c0c0b20042002411c6a280200220236028002202328020020024d0d050b200f200141286a2201470d000b0b0240200441c0036a41146a28020022014102490d00200441d0046a41146a41013602002004410236028402200420013602a803200442013702d404200441e88bc3003602d0042004200441a8036a36028002200420044180026a3602e00420044198026a200441d0046a10a2010c050b0240200441c8036a280200220141014d0d00200441e4046a41013602002004410236028402200420013602a803200442013702d404200441f08bc3003602d0042004200441a8036a36028002200420044180026a3602e00420044198026a200441d0046a10a2010c050b200a200e412c6c6a2105200a21010240034020052001460d0120012d000021022001412c6a220721012002410c470d000b200441d0006a200741586a10be03200428025022012004280254411c6c6a2105200441c8036a2107200441e0036a210f200441c0036a41186a2123200441e4046a211f200441e0046a211b034020012005460d01200420012802002202360280020240200728020020024b0d00201f4101360200200441023602ac03201b200441a8036a360200200442023702d404200441b8d9c4003602d004200420044180026a3602a80320044198026a200441d0046a10a201200428029802222d0d0a0b200441d0046a200141046a22012023280200200f28020010c10320042d00d0044101460d08200141186a210120042d00d104450d000b41201026222d450d0a202d41186a41002900908c43370000202d41106a41002900888c43370000202d41086a41002900808c43370000202d41002900f88b4337000042a08080808004212720042802c4030d0f0c0e0b200a200e412c6c6a2105200a2101034020052001460d0120012d000021022001412c6a220721012002410a470d000b200441c8006a200741586a10be03200428024c2201450d00411c21ba01200428024822bb012001411c6c6a21bc01200441d4036a21bd01410421be01200441e0036a21bf01200441d8036a21c001410121c101410221c201200441f8036a21c301200441f0036a21c401200441ec036a21c501417c21c6014107215d0c160b024020042802c403450d0020042802c00310230b0240200441d0036a280200450d00200441cc036a28020010230b0240200441dc036a280200450d00200441d8036a28020010230b0240200441ec036a2802002202450d00200441e4036a28020021012002410474210203400240200141046a280200450d00200128020010230b200141106a2101200241706a22020d000b0b0240200441e8036a280200450d00200441e4036a28020010230b0240200441f4036a280200450d00200441f0036a28020010230b202c450d14200d1023410521010c170b20042902d404212720042802c4030d0a0c090b200441e4046a4101360200200441023602ac03200442023702d40420044198dac4003602d004200420044180026a3602a8032004200441a8036a3602e00420044198026a200441d0046a10a2010c010b2002410c6a2802002101200241146a2802002102200441d0046a41146a410136020020042002360284022004200136028002200441013602ac03200442013702d404200441e08bc3003602d004200420044180026a3602a8032004200441a8036a3602e00420044198026a200441d0046a10a2010b200429029c022127200428029802212d0b20042802c403450d04410221010c120b200441d8046a290300212720042802d404212d20042802c4030d090c080b200429029c02212720042802c4030d0c0c0b0b200429028402212720042802c4030d090c080b41204101102a000b410321010c0d0b410321010c0c0b410221010c0b0b410321010c0a0b410221010c090b410321010c080b410221010c070b410321010c060b410221010c050b410321010c040b410221010c030b410521010c020b410821010c010b2087011023024020042802c4030d00410321010c010b410221010c000b0b101e000b02402027a7450d00202d10230b0240200e450d00200e412c6c2108200a210103402001109f012001412c6a2101200841546a22080d000b0b41b9bdc400210141132108202aa7450d0c200a10230c0c0b2020450d0120211023200b0d020c030b2022450d00200610230b200b450d010b200b412c6c210b200a210103402001109f012001412c6a2101200b41546a220b0d000b0b200c450d04200a10230c040b0240200b450d00200b412c6c2108200a210103402001109f012001412c6a2101200841546a22080d000b0b41192108200c450d00200a10230b0b0c010b410021090b200441d0036a2002360200200441cc036a2006360200200441013602c00320042007ad4220862005ad42ffff03834210862009ad42ff0183420886842008ad42ff018384843702c403200441c0036a4104722101200841ff01714105470d010b2001280208450d002001280204102320042802c0030d0041002108200441cc036a2802002209210103402001109f012001412c6a2101200841546a22080d000b200441d0036a280200450d00200910230b41ccbdc4002101411621080b2000200136020420004101360200200041086a20083602000b200441e0056a24000bed0202017e067f024002400240024002400240024002402001450d00200141074b0d01200141016a21010c020b200041086a4280808080c000370200200041046a41a48ec300360200410021010c030b2001ad4203862202422088a70d052002a7220341076e210142808080801021022003410e490d010b417f2001417f6a677641016aad42208621020b2002423d88a70d012002422088a7220141076a417c712203200141046a2204490d0120032002421d88a76a22052003490d012005417d4f0d01200510262206450d022001417f6a220541084921072002422388a741076c2108200641ff012004109304220420036a21030240200141034b0d00200420016a418001410420016b1093041a0b2005200820071b21012000410c6a2003360200200041086a2005360200200041046a20043602000b200041003a0000200041146a2001360200200041106a41003602000f0b41948dc300104f000b20054104102a000b41948dc300104f000be00e03397f017e027f230041206b220124000240024002400240024002400240200028020c220241016a22032002490d00200041046a28020022022104024020024108490d00200241016a41037641076c21040b0240200320044101764f0d00200241016a210541002106410421074103210841fffefdfb0721094107210a417f210b4181828408210c41004101710d020c030b200141086a200310c60220012d00084101460d062001411c6a280200210d200141086a410c6a280200210e200141106a280200210f200128020c2110417f21114180818284782112410421134101211420002802002215200041046a2802006a41016a21162000410c6a28020021172000280208211841202119417c211a4138211b4105211c41b9f3ddf179211d4103211e4102211f417e212041ff01212141002122411921232015280200417f734180818284787122240d040c030b41948dc300104f000b410121020c030b410021020c020b410321020c010b410421020b0240024002400340024002400240024002400240024002400240024002400240024020020e050100090304040b200620086a220220064922030d04200220054f0d042005200620076a20031b200520022005491b21060c010b200620054f0d0320062102200641016a21060b200028020020026a220220022802002202200a76200b73200c7120022009726a3602004101410171450d09410121020c0a0b201520136a21020340200220164f0d03201820196a211820022802002103200220136a22042102200320127122032012460d000b200320127321242004201a6a2115410421020c090b2018202468201b716a22262802002127410021030240202628020422282013490d00410021032027210220282104034020022800002003201c7773201d6c2103200220136a21022004201a6a2204201e4b0d000b2028201a6a22022002201a7122026b2128202720026a20136a21270b024002400240202820144d0d002027201f6a21022003201c7720272f000073201d6c2103202820206a0d010c020b202721022028450d010b2003201c7720022d000073201d6c21030b202420116a2127410021022003201c77202173201d6c222521030340200220136a22022003200f7122046a2103201020046a2800002012712228450d000b02402010202868201e7620046a200f7122026a2c00002022480d00201028020020127168201e7621020b201020026a202520237622033a000020102002201a6a200f716a20136a20033a0000200e2002201e746a2026290200370200202720247122240d05410321020c080b20002802002102200041046a220428020041016a220341034b0d01200241046a200220031095041a2000280200200428020022026a41016a418001410320026b1093041a0c020b2000200d20176b3602102000410c6a2017360200200041086a200e3602002000280200210320002010360200200041046a221328020021022013200f3602002002450d0a200310230c0a0b200220036a20022800003600000b410421294101212a200041046a222b28020041016a222c450d054100212d418001212e4103212f200041086a21304105213141b9f3ddf1792132417c213341022134417e213541ff01213641808182847821374119213841002139410221020c040b20392225202a6a21390240024002400240202520002802006a2d0000202e460d002039202c470d050c010b0240034020302802002025202f746a223b2802002127410021030240203b28020422282029490d004100210320272102202821040340200228000020032031777320326c2103200220296a2102200420336a2204202f4b0d000b202820336a2202200220337122026b2128202720026a20296a21270b0240024002402028202a4d0d00202720346a2102200320317720272f00007320326c2103202820356a0d010c020b202721022028450d010b200320317720022d00007320326c21030b202b28020021282000280200212741002102200320317720367320326c223c21030340200220296a2202200320287122046a2103202720046a2800002037712226450d000b02402027202668202f7620046a20287122026a2c0000202d480d00202728020020377168202f7621020b02402002203c20287122036b202520036b73202871202f4d0d00202720026a22032d000021042003203c20387622263a00002027200220336a2028716a20296a20263a000020042036460d0220302802002002202f746a2202290200213a2002203b290200370200203b203a3702000c010b0b202720256a203c20387622023a000020272028202520336a716a20296a20023a00002039202c470d030c010b2000280200220320256a20363a00002003202b280200202520336a716a20296a20363a000020302802002002202f746a203b2902003702002039202c470d010b200041046a280200221341084f0d070c080b410221020c040b410221020c030b410421020c020b410221020c010b410021020c000b0b417f21130b2013202a6a41037641076c21130b200020132000410c6a2802006b360210200141206a24000f0b200141206a24000b1c00200128021841bbb0c500410e2001411c6a28020028020c1102000b810101017f230041c0006b220424002004200136020c2004200036020820042003360214200420023602102004413c6a41273602002004412c6a4102360200200441013602342004420237021c2004419083c5003602182004200441106a3602382004200441086a3602302004200441306a360228200441186a41a083c5001061000b1c00200128021841b0b0c500410b2001411c6a28020028020c1102000bc10201037f23004180016b220224000240024002400240200128020022034110710d002000280200210420034120710d012004ad4101200110cc02210020024180016a240020000f0b20002802002104410021000340200220006a41ff006a2004410f712203413072200341d7006a2003410a491b3a00002000417f6a2100200441047622040d000b20004180016a22044181014f0d012001410141d889c5004102200220006a4180016a410020006b109701210020024180016a240020000f0b410021000340200220006a41ff006a2004410f712203413072200341376a2003410a491b3a00002000417f6a2100200441047622040d000b20004180016a22044181014f0d012001410141d889c5004102200220006a4180016a410020006b109701210020024180016a240020000f0b20044180011048000b20044180011048000bd40203037f017e027f230041306b220324004127210402400240024020004290ce00540d00412721040340200341096a20046a2205417c6a200020004290ce0080220642f0b17f7e7ca7220741e4006e220841017441ea86c5006a2f00003b00002005417e6a2008419c7f6c20076a41017441ea86c5006a2f00003b00002004417c6a2104200042ffc1d72f5621052006210020050d000b2006a7220541e3004c0d020c010b20002206a7220541e3004c0d010b200341096a2004417e6a22046a2006a7220741ffff037141e4006e2205419c7f6c20076a41ffff037141017441ea86c5006a2f00003b00000b02400240200541094a0d00200341096a2004417f6a22046a200541306a3a00000c010b200341096a2004417e6a22046a200541017441ea86c5006a2f00003b00000b2002200141a886c5004100200341096a20046a412720046b1097012104200341306a240020040be80102037f017e230041206b22012400200141106a41086a220242003703002001420037031041f5ccc2004111200141106a1000200141086a220320022903003703002001200129031037030042002104024002402001411041a886c500410041001001417f460d002001420037031020014110200141106a41084100100141016a41084d0d01200129031021040b200242003703002001420037031041f5ccc2004111200141106a100020032002290300370300200120012903103703002001200420007c37031020014110200141106a41081004200141206a24000f0b41d4aac10041331021000b9a820108067f027e037f017e0f7f027e0c7f027e230041d0076b2203240002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d0000417f6a220441054b0d00024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040e06000402030105000b200341c8056a200141086a41c8001094041a200341d8046a41086a2204200141dc006a290200370300200341d8046a41106a2205200141e4006a2802003602002003200141d4006a2902003703d80420022d000120022d000072450d0a41b394c3002104412821020c5f0b200341c0036a41186a200141196a290000370300200341c0036a41106a200141116a290000370300200341c0036a41086a200141096a290000370300200320012900013703c003200341c8056a41206a200141c1006a2d00003a0000200341c8056a41186a200141396a290000370300200341c8056a41106a200141316a290000370300200341c8056a41086a200141296a2900003703002003200141216a2900003703c805200341b8066a41086a2204200241096a290000370300200341b8066a41106a2205200241116a290000370300200341b8066a41186a2206200241196a290000370300200341b8066a41206a2207200241216a2d00003a0000200341dc046a2208200241266a2f01003b0100200320022900013703b8062003200241226a2801003602d80420022d00002202450d0420034180026a41266a20032802d8043601002003418d026a200429030037000020034195026a20052903003700002003419d026a2006290300370000200341a5026a20072d00003a0000200341aa026a20082f01003b0100200320032903b80637008502200320023a008402200341013a0080020c580b200141c0006a2903002109200141386a290300210a200141306a280200210b2001412c6a280200210c200141286a280200210d2001411d6a290000210e2001411c6a2d0000210f2001411b6a2d00002110200141196a2f00002111200141186a2d00002112200141176a2d00002113200141156a2f00002114200141146a2d00002115200141136a2d00002116200141116a2f00002117200141106a2d000021182001410c6a2802002119200141086a280200211a200141076a2d0000211b200141056a2f0000211c200141046a2d0000211d200141c8006a290300211e2002411a6a290100211f200241196a2d00002120200241186a2d00002121200241166a2f01002122200241156a2d00002123200241146a2d00002124200241126a2f01002125200241116a2d00002126200241106a2d000021272002410e6a2f010021282002410d6a2d00002129200241046a2d0000212a200241026a2f0100212b41db94c3002104412a210520022d0000450d044101210641002107410021080c050b200141386a290300211e200141306a2903002109200141c0006a290300211f200341a0016a41186a200141196a290000370300200341a0016a41106a200141116a290000370300200341a0016a41086a200141096a290000370300200320012900013703a001200141246a280200210d200141286a28020021212001412c6a280200212a2002411a6a290100210e200241196a2d0000211a200241186a2d0000211d200241166a2f0100210c200241156a2d00002120200241146a2d00002122200241126a2f01002123200241116a2d00002124200241106a2d000021252002410e6a2f010021262002410d6a2d00002127200241046a2d00002128200241026a2f0100212941db94c3002104412a210520022d0000450d054101210641002107410021080c060b2001410c6a280200210c200141086a280200211a200141046a280200211d200141106a290300211f2002411a6a290100210e200241196a2d00002120200241186a2d00002121200241166a2f0100210d200241156a2d00002122200241146a2d00002123200241126a2f01002124200241116a2d00002125200241106a2d000021262002410e6a2f010021272002410d6a2d00002128200241046a2d00002129200241026a2f0100212a412a210541db94c300210420022d0000450d074101210641002107410021080c080b200141d8006a290300210e200141d0006a290300211e200341c0016a41186a200141196a290000370300200341c0016a41106a200141116a290000370300200341c0016a41086a200141096a290000370300200320012900013703c001200341e0016a41186a200141396a290000370300200341e0016a41106a200141316a290000370300200341e0016a41086a200141296a2900003703002003200141216a2900003703e001200141c4006a280200211d200141c8006a280200211a200141cc006a280200212a2002411a6a290100211f200241196a2d0000210c200241186a2d00002120200241166a2f01002121200241156a2d0000210d200241146a2d00002122200241126a2f01002123200241116a2d00002124200241106a2d000021252002410e6a2f010021262002410d6a2d00002127200241046a2d00002128200241026a2f0100212941db94c3002104412a210520022d0000450d084101210641002107410021080c090b20034180026a41216a20072d00003a000020034180026a41196a200629030037000020034180026a41116a200529030037000020034180026a41096a2004290300370000200320032903b80637008102200341003a00800220032d00810222024101460d0f20024102470d5320032d00c8054101470d53200341c8056a41017221024200211f0c100b41012106410021074100210820022d00014101470d002002410c6a2d000021082002410a6a2f01002107200241096a2d00002105200241066a2f0100410874200241056a2d000072200241086a2d0000411874722104410021060b200741ffff0371410874200541ff017172200841187472210220060d4e2003201f3703f801200320203a00f701200320213a00f601200320223b01f401200320233a00f301200320243a00f201200320253b01f001200320263a00ef01200320273a00ee01200320283b01ec01200320293a00eb01200320023600e701200320043600e3012003202a3a00e2012003202b3b01e001201d41ff01714101470d4920034180026a201a4106761087012003280280022104200328028802201a413f7122024d0d0f200420024105746a2202290018210e20022d0017210f20022d0016211020022f0014211120022d0013211220022d0012211320022f0010211420022d000f211520022d000e211620022f000c211720022d000b2118200228000721062002280003210720022d0002211b20022f0000211c41012105200328028402450d480c470b41012106410021074100210820022d00014101470d002002410c6a2d000021082002410a6a2f01002107200241096a2d00002105200241066a2f0100410874200241056a2d000072200241086a2d0000411874722104410021060b200741ffff0371410874200541ff017172200841187472210220060d412003200e3703d8012003201a3a00d7012003201d3a00d6012003200c3b01d401200320203a00d301200320223a00d201200320233b01d001200320243a00cf01200320253a00ce01200320263b01cc01200320273a00cb01200320023600c701200320043600c301200320283a00c201200320293b01c00120034180026a200341c0016a201f10cf022003280280024101470d052003280288022102200328028402210420210d420c430b200141d0006a2802002102200341b8066a200341c8056a41c8001094041a200341c0036a41106a2005280200360200200341c0036a41086a2004290300370300200320032903d8043703c003200341a8056a41086a22044200370300200342003703a80541bc8fc3004118200341a8056a1000200341a0016a41086a2004290300370300200320032903a8053703a001410021050240200341a0016a411041a886c500410041001001417f460d00200342103702b4042003200341a0016a3602b00420034180026a200341b0046a10c10220032d00dc024102460d2520032802c80221050b41d48fc30021040240200520024f0d002003418c026a200236020020034180026a41086a41033a00002003410a3a0080024100210441a886c500410020034180026a102c20034180026a200341b8066a41c8001094041a200341d4026a200341c0036a41086a290300370200200341dc026a200341c0036a41106a280200360200200320023602c802200320032903c0033702cc02200341a8056a41086a22024200370300200342003703a80541bc8fc3004118200341a8056a1000200341a0016a41086a2002290300370300200320032903a8053703a001200341003602b804200342013703b00420034180026a200341b0046a10b20220032802b4042102200341a0016a411020032802b004220520032802b80410042002450d00200510230b413521020c4f0b41012106410021074100210820022d00014101470d002002410c6a2d000021072002410a6a2f01002108200241096a2d00002105200241066a2f0100410874200241056a2d000072200241086a2d0000411874722104410021060b200841ffff0371410874200741187472200541ff017172210220060d062003200e3703e005200320203a00df05200320213a00de052003200d3b01dc05200320223a00db05200320233a00da05200320243b01d805200320253a00d705200320263a00d605200320273b01d405200320283a00d305200320023600cf05200320043600cb05200320293a00ca052003202a3b01c805200341a8056a41086a22024200370300200342003703a80541bc8fc3004118200341a8056a1000200341a0016a41086a2002290300370300200320032903a8053703a001200341a0016a411041a886c500410041001001417f460d04200342103702c4032003200341a0016a3602c00320034180026a200341c0036a10c10220032d00dc0222024102460d20200341b8066a20034180026a41dc001094041a20032f00dd022104200341b8066a41df006a20034180026a41df006a2d00003a0000200320043b009507200320023a0094070c050b41012106410021074100210820022d00014101470d002002410c6a2d000021082002410a6a2f01002107200241096a2d00002105200241066a2f0100410874200241056a2d000072200241086a2d0000411874722104410021060b200741ffff0371410874200541ff017172200841187472210220060d392003201f3703c8042003200c3a00c704200320203a00c604200320213b01c4042003200d3a00c304200320223a00c204200320233b01c004200320243a00bf04200320253a00be04200320263b01bc04200320273a00bb04200320023600b704200320043600b304200320283a00b204200320293b01b00420034180026a200341b0046a10d80120032d00800222044102470d0141012104413421024202211f0c0c0b20034180026a41306a290300210e200341a8026a290300211f200341e0016a41186a20034180026a41206a290300370300200341e0016a41106a20034180026a41186a290300370300200341e0016a41086a20034180026a41106a29030037030020032003290388023703e00120034180026a10d002200320034180026a3602bc03200320034180026a36029005200341c8056a41186a2205200341c0016a41186a290300370300200341c8056a41106a2206200341c0016a41106a290300370300200341c8056a41086a2207200341c0016a41086a290300370300200320032903c0013703c805200341b8066a200341c8056a10d8014100210420032d00b80622084102460d31200341f0066a28020021022008450d0e410021040c310b200341a8056a41086a220520034194026a290200370300200341a8056a41106a22062003419c026a280200360200200341c8056a41086a220720034180026a41306a290300370300200341c8056a41106a2208200341b8026a290300370300200341c8056a41186a220c200341c0026a290300370300200341c8056a41206a2220200341c8026a290300370300200341c8056a41286a2221200341d0026a290300370300200341c8056a41306a220d200341d8026a29030037030020032003418c026a2902003703a805200320034180026a41286a2903003703c80520034180026a41086a28020021024202211f42022109024020040d0020034180026a41206a2903002109200341a0016a41106a2006280200360200200341a0016a41086a2005290300370300200341c0036a41086a2007290300370300200341c0036a41106a2008290300370300200341c0036a41186a200c290300370300200341c0036a41206a2020290300370300200341c0036a41286a2021290300370300200341c0036a41306a200d290300370300200320032903a8053703a001200320032903c8053703c0030b20094202520d0941012104413421020c0a0b200341003a00940720034280808480800237038807200342013703f806200342013703f006200342013703e806200342013703e006200342013703d806200342013703d006200342013703c806200342013703c006200342013703b80620034280808080c0003703800720034120360290070b20034180026a200341c8056a201f10cf022003280280024101470d01200328028802210220032802840221040b4100210841012107201a450d31201d10230c310b200341b0026a290300210e200341a8026a290300211f200341a0026a290300210a20034198026a290300212c20034190026a290300211e200329038802212d200341206a20032903b8064200200cad4200109804201e427f200329032020032903284200521b7d2209201e56200950722206450d03412c2102418990c300210541012104201a0d040c2f0b20032d00c8054101460d434200211f200341a8056a41086a22024200370300200342003703a80541b590c300411c200341a8056a1000200341a0016a41086a2002290300370300200320032903a8053703a0010240200341a0016a411041a886c500410041001001417f460d00200342003703b806200341a0016a4110200341b8066a41084100100141016a41084d0d1720032903b806211f0b20034180026a41027221020b4100210441012107200341c0036a201f410010d10241ff01714101470d0b4200211f200341a8056a41086a22054200370300200342003703a80541d190c3004118200341a8056a1000200341a0016a41086a2005290300370300200320032903a8053703a001200341a0016a411041a886c500410041001001417f460d09200342003703e004200342003703d804200341a0016a4110200341d8046a4110410010012205417f460d192005410f4d0d19200341e0046a290300210e20032903d804211f0c0a0b410021052003280284020d370c380b20034180026a201d200c200341b8066a10c5022003280280024101470d0320034188026a2802002102200328028402210541012104201a450d2b0b201d10230c2a0b200341c8056a41106a200341a0016a41106a280200360200200341c8056a41086a200341a0016a41086a29030037030020034180026a41086a200341c0036a41086a29030037030020034180026a41106a200341c0036a41106a29030037030020034180026a41186a200341c0036a41186a29030037030020034180026a41206a200341c0036a41206a29030037030020034180026a41286a200341c0036a41286a29030037030020034180026a41306a200341c0036a41306a290300370300200320032903a0013703c805200320032903c00337038002410021042009211f0b20034190056a41106a2205200341c8056a41106a28020036020020034190056a41086a2206200341c8056a41086a290300370300200341d8046a41086a220720034180026a41086a290300370300200341d8046a41106a220820034180026a41106a290300370300200341d8046a41186a220c20034180026a41186a290300370300200341d8046a41206a222020034180026a41206a290300370300200341d8046a41286a222120034180026a41286a290300370300200341d8046a41306a220d20034180026a41306a290300370300200320032903c8053703900520032003290380023703d80402402004450d0041d291c3002104201a0d2e0c2f0b200341b8066a41206a20032903d804370300200341c4066a2006290300370200200341cc066a2005280200360200200341b8066a41286a2007290300370300200341b8066a41306a2008290300370300200341f0066a200c290300370300200341f8066a202029030037030020034180076a202129030037030020034188076a200d29030037030020032003290390053702bc06200320023602b8062003201f3703d00642002109200341a8056a41086a22024200370300200342003703a80541af98c300410d200341a8056a1000200341a0016a41086a2002290300370300200320032903a8053703a0010240200341a0016a411041a886c500410041001001417f460d002003420037038002200341a0016a411020034180026a41084100100141016a41084d0d1020032903800221090b0240201fa74101470d00200341d8066a2903002009520d00418692c3002104412a2102200341e4066a280200450d2d0c2c0b20034180026a200341c0016a10d80120032d00800222024102470d010c2a0b200341d8046a41186a220420034180026a410472220241186a280200360200200341d8046a41106a2207200241106a290200370300200341d8046a41086a222a200241086a290200370300200320022902003703d80420034180026a41186a2202420037030020034180026a41106a2205420037030020034180026a41086a42003703002003420037038002201d200c20034180026a10022002290300211e20052f0100210820032d009702212020032d009602212120032f019402210d20032d009302212220032d009202212320032d008f02212420032d008e02212520032f018c02212620032d008b0221272003280087022102200328008302210520032d008202212820032f0180022129200341c0036a41186a2004280200360200200341c0036a41106a2007290300370300200341c0036a41086a202a290300370300200320032903d8043703c003411410262204450d14200441106a41002800d28943360000200441086a41002900ca8943370000200441002900c2894337000020044114413410272204450d152004201e37002c200420203a002b200420213a002a2004200d3b0028200420223a0027200420233a0026200420083b0024200420243a0023200420253a0022200420263b0020200420273a001f2004200236001b20042005360017200420283a0016200420293b001420034180026a41186a2207420037030020034180026a41106a222a420037030020034180026a41086a222b420037030020034200370380022004413420034180026a1002200341a8056a41186a2007290300370300200341a8056a41106a202a290300370300200341a8056a41086a202b29030037030020032003290380023703a805200341a8056a200341c0036a10b101200410230240200341c0036a41106a280200450d0020032802cc0310230b411510262204450d162004410d6a41002900f48943370000200441086a41002900ef8943370000200441002900e7894337000020044115413510272204450d172004201e37002d200420203a002c200420213a002b2004200d3b0029200420223a0028200420233a0027200420083b0025200420243a0024200420253a0023200420263b0021200420273a00202004200236001c20042005360018200420283a0017200420293b001520034180026a41186a2207420037030020034180026a41106a222a420037030020034180026a41086a222b420037030020034200370380022004413520034180026a1002200341a8056a41186a2007290300370300200341a8056a41106a202a290300370300200341a8056a41086a202b29030037030020032003290380023703a805200341003602880220034201370380022003200c3602c003200341c0036a20034180026a1041200328028402222b200328028802222a6b200c4f0d02202a200c6a2207202a490d20202b410174220f20072007200f491b220f4100480d20202b450d09200328028002202b200f10272207450d0a0c250b2002450d052003418c026a2d000021022003418d026a290000211f20034195026a280000210420032f008102210520032d0083022106200329028402210a200320034199026a2900003703f004200320043602ec042003201f3702e404200320023a00e3042003200a3700db04200320063a00da04200320053b01d804200341d0066a290300210a200341d8066a290300212c2003201d3602a8052003201d202a4105746a3602ac052003200341b8066a3602b005200341c8056a200341a8056a10a00220032802c805450d0720034180026a41086a2202200341c8056a41086a290300370300200320032903c80537038002411010262205450d192005200329038002370200200541086a2002290300370200200341c0036a41086a200341a8056a41086a280200360200200320032903a8053703c003200341c8056a200341c0036a10a00220032802c805450d0a4101210241012107034020034180026a41086a2206200341c8056a41086a290300370300200320032903c8053703800202400240024020072002470d00200241016a22042002490d2320024101742207200420042007491b2207ad420486221f422088a70d23201fa722084100480d232002450d01200520024104742008102722050d020c140b200241016a21040c010b200810262205450d120b200520024104746a2202200329038002370200200241086a2006290300370200200341c8056a200341c0036a10a0022004210220032802c8050d000c0c0b0b2002417f4c0d33200341ec066a280200211a200341b8066a41306a28020021082002450d05200210262204450d172004200820021094041a201a450d220c210b20032802800221070c230b4200210e0b200341b8066a2002201f200e107e41012106024020032802b8064101470d0020032802c006210220032802bc0621040c2d0b200320032903c0063703b0042003200341c8066a2903003703b8042003200341b0046a3602d804200341d8046a107b0b410121064101211a4101210820012d0000220541064d0d3a0c3b0b200341b4026a280200450d22200341b0026a28020010230c220b41012104201a0d1b0c1c0b4100210741042105410021040c030b200f102622070d1b0b200f4101102a000b41012104410121070b200341e8066a280200210220032802e006210620034100360280022006200220034180026a101321202003280280022206417f460d0b200341c8056a41186a200341e0016a41186a290300370300200341c8056a41106a200341e0016a41106a290300370300200341c8056a41086a200341e0016a41086a290300370300200320032903e0013703c80520034100360288022003420137038002200320063602a805200341a8056a20034180026a1041024002400240200328028402220820032802880222026b20064f0d00200220066a220c2002490d1620084101742221200c200c2021491b22214100480d162008450d01200328028002200820211027220c450d020c110b200328028002220c20026a202020061094041a200220066a2202450d110c120b20211026220c0d0f0b20214101102a000b20034194026a4101360200200341013602bc062003418898c4003602b8062003420137028402200341d497c400360280022003200341b8066a3602900220034180026a41c4cec2001061000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b20084104102a000b41d4aac10041331021000b41d4aac10041331021000b41144101102a000b41344101102a000b41154101102a000b41354101102a000b41f8ffc40041381021000b20024101102a000b41104104102a000b20032021360284022003200c3602800220212108200c20026a202020061094041a200220066a22020d010b4101212120080d010c020b20024100480d02200210262221450d032021200c20021094041a2008450d010b200c10230b20024101742208200241206a220c200c2008491b220d4100480d00024002402002450d0020212002200d10272208450d010c040b200d102622080d030b200d4101102a000b101e000b20024101102a000b200820026a220220032903c805370000200241186a200341c8056a41186a290300370000200241106a200341c8056a41106a290300370000200241086a200341c8056a41086a29030037000020034180026a41186a2202420037030020034180026a41106a2221420037030020034180026a41086a220d420037030020034200370380022008200c20034180026a1002200341c0036a41186a2002290300370300200341c0036a41106a2021290300370300200341c0036a41086a200d29030037030020032003290380023703c0032008102302402006450d00202010230b0240024002400240024002400240200341c0036a200341d8046a4120109604450d00200520044104746a21242004450d01200341e8066a2125200341e0066a212620052102034020022802002206450d03200241046a2802002104200241086a28020021082002410c6a280200210c202528020021202026280200212120034180026a41186a220d420037030020034180026a41106a2222420037030020034180026a41086a2223420037030020034200370380022006412020034180026a1002200341a8056a41186a200d290300370300200341a8056a41106a2022290300370300200341a8056a41086a202329030037030020032003290380023703a80520212020200341a8056a41202004200c100b02402008450d00200410230b200241106a22022024470d000c050b0b2004450d04200441047421082005410c6a2102410021060340200228020020066a2106200241106a2102200841706a22080d000c060b0b200522022024470d010c020b200241106a22022024460d010b03402002280200450d010240200241086a280200450d00200241046a28020010230b200241106a22022024470d000b0b02402007450d00200510230b41b092c300210441162102200341e4066a2802000d090c0a0b410021060b200320032802ec0620066b3602ec0602400240411710262202450d002002410f6a41002900abcd42370000200241086a41002900a4cd423700002002410029009ccd4237000020024117413710272202450d01200220032903b0043700172002412f6a200341b0046a41186a290300370000200241276a200341b0046a41106a2903003700002002411f6a200341b0046a41086a29030037000020034180026a41186a2206420037030020034180026a41106a2208420037030020034180026a41086a220c420037030020034200370380022002413720034180026a1002200341a8056a41186a2006290300370300200341a8056a41106a2008290300370300200341a8056a41086a200c29030037030020032003290380023703a805200341a8056a41201003200210232008200e370300200341a8026a2009202c202a1b37030020034180026a41206a4201200a202a1b37030020062009370300200341b0026a200341e0066a2202290300370300200341b8026a200241086a280200360200200341bc026a200341ec066a280200360200200341c0026a20032903e001370300200341c8026a200341e0016a41086a290300370300200341d0026a200341e0016a41106a290300370300200341d8026a200341e0016a41186a2903003703002003201e37038802200341003a008002200341c0016a20034180026a10dd0120034190016a200341b0046a10840120034190016a41086a290300211f200329039001210e20034180026a200341b0046a4200420010dc01024002402003290380024200510d002003200c3602c805200341c8056a10de010c010b2003200c3602c805200341c8056a107b0b20034180016a200341c0016a200e201f108202200320034188016a2903003703d00520032003290380013703c8052003200341c8056a3602a805200341a8056a107b02402004450d0020044104742104200541046a210203400240200241046a280200450d00200228020010230b200241106a2102200441706a22040d000b0b02402007450d00200510230b410021040240201a450d00201d10230b0c0c0b41174101102a000b41374101102a000b200810230b200341fc036a4100360200200341ec036a221d4200370200200341c0036a41206a41dcacc400360200200341dc036a41a886c500360200200341d4036a22084200370200200341c0036a41106a41f098c400360200200341c0036a41086a2002360200200341a4046a20052903003702002003419c046a200629030037020020034194046a2007290300370200200342083702f4032003428080808080013702e403200341003602cc03200320023602c403200320043602c003200320032903c80537028c04200320034190056a360288042003200341bc036a36028404200320034180026a36028004200341b0046a200341c0036a2009201e200341e0016a200341a0016a200d202a10e2014101210c41012123024020032d00b00422240d00200341b8066a41086a221a2008290200370300200341c8056a41086a200341c4066a280200360200200320032902cc033703b806200320032902bc063703c805200341c8076a200341c8056a10db01200341e8036a2802002220200341f0036a280200220441e8006c6a2108201d280200212220202102024002402004450d00200341c1066a211d202021020240034020022d00002104200341c8056a200241016a41d7001094041a20044106460d01200241d8006a2800002105200241dc006a2800002106200241e0006a2800002107201a20043a00002003410a3a00b806201d200341c8056a41d7001094041a20052007200341b8066a102c02402006450d00200510230b200241e8006a22022008470d000c030b0b200241e8006a21020b20022008460d00034020022d000022044106460d01200241286a2800002105200241246a28000021060240200241dc006a280000450d00200241d8006a28000010230b024020044105490d002005450d00200610230b200241e8006a22022008470d000b0b410021232022450d00202010230b200341e0006a20032903f001200341f8016a29030020032903e801221e420010980420032903e001201e7d10cd02200341f0006a200341c0016a2003290360200341e0006a41086a290300108202200341c8066a200e200341f0006a41086a29030022097d201f2003290370221e54ad7d2009200e7d201e201f54ad7d201e201f582009200e582009200e5122021b22041b220a3703002003201f201e7d201e201f7d20041b222c3703c0062003201e201f562009200e5620021b2202ad221f3703b806024020020d002003202c3703c8052003200a3703d0052003200341c8056a3602d804200341d8046a10de014100210c20032903b806211f0b200341b8066a41086a210202400240201f4200510d00200320023602c805200341c8056a107b0c010b200c450d00200320023602c805200341c8056a10de010b200341f4036a2802002222200341fc036a28020022044190016c6a211d200341f8036a2802002125202221020240024002402004450d00200341c1066a2104200341d8046a4102722105200341b8066a410472210c200341e1066a21202022210202400340200341a8056a41186a2207200241186a290300370300200341a8056a41106a2208200241106a290300370300200341a8056a41086a221a200241086a290300370300200320022903003703a805200241206a2802002106200341c8056a200241246a41ec001094041a2006410e460d01200320063602b806200c200341c8056a41ec001094041a200520032903a805370000200541086a201a290300370000200541106a2008290300370000200541186a200729030037000020034180023b01d804200341d8006a200341b8066a200341d8046a10d20220032802582106200341b8066a41086a41043a000020202006453a0000200420032903a805370000200441086a201a290300370000200441106a2008290300370000200441186a20072903003700002003410a3a00b80641a886c5004100200341b8066a102c20024190016a2202201d470d000b201d2202201d470d020c030b20024190016a21020b2002201d460d010b200341b8066a41206a2105200341b8066a41246a210c0340200341a8056a41186a2206200241186a290300370300200341a8056a41106a2207200241106a290300370300200341a8056a41086a2208200241086a290300370300200320022903003703a805200241206a2802002104200341b8066a200241246a41ec001094041a2004410e460d01200341d8046a41186a221a2006290300370300200341d8046a41106a22062007290300370300200341d8046a41086a22072008290300370300200320032903a8053703d804200341c8056a200341b8066a41ec001094041a20052004360200200341b8066a41186a201a290300370300200341b8066a41106a2006290300370300200341b8066a41086a2007290300370300200320032903d8043703b806200c200341c8056a41ec001094041a2005102420024190016a2202201d470d000b0b02402025450d00202210230b200341b8046a280200210241002104024020244101470d0020032802b40421040b024020032802c0032205450d0020032802c403450d00200510230b2023450d09200341c0036a41186a280200211a200341d0036a280200210502400240200341c0036a41146a2802002207450d002007210820052106034020062802880b21062008417f6a22080d000b0340200520052f01064102746a41880b6a28020021052007417f6a22070d000c020b0b200521060b200341d4066a20052f0106360200200341b8066a41186a4100360200200341b8066a41146a20053602002003201a3602d806200341003602c806200342003703c006200320063602bc06200341003602b806200341b8066a10d4010240200341f0036a2802002206450d00200341c0036a41286a2802002105200641e8006c210603400240200541dc006a280200450d00200541d8006a28020010230b024020052d00004105490d00200541286a280200450d00200541246a28020010230b200541e8006a2105200641987f6a22060d000b0b200341ec036a280200450d09200341e8036a280200102320210d0a0c0b0b2003200f360284022003200736028002200f212b0b2007202a6a201d200c1094041a200341a8056a41202007202a200c6a10040240202b450d00200710230b200410230240201a450d00201d10230b200341a1026a201e370000200341a0026a20203a00002003419f026a20213a00002003419d026a200d3b00002003419c026a20223a00002003419b026a20233a000020034199026a20083b000020034198026a20243a000020034197026a20253a000020034195026a20263b000020034194026a20273a000020034190026a20023602002003418c026a20053602002003418b026a20283a000020034189026a20293b000020034188026a41023a00002003410a3a0080024100210441a886c500410020034180026a102c0b2003202c200a4200200920061b221e4200109804202d201e7d10cd02200341106a200341c8056a2003290300200341086a29030010820220034190026a200e200341106a41086a29030022097d201f2003290310221e54ad7d2009200e7d201e201f54ad7d201e201f582009200e582009200e5122061b22071b220a3703002003201f201e7d201e201f7d20071b222c370388022003201e201f562009200e5620061b2206ad221f3703800241012107024020060d002003202c3703c0032003200a3703c8032003200341c0036a3602d804200341d8046a10de0141002107200329038002211f0b20034180026a41086a210602400240201f4200510d00200320063602c003200341c0036a107b0c010b2007450d00200320063602c003200341c0036a10de010b410021082005410020041b2104410121070b410121064101211a20012d0000220541064d0d170c180b41c692c3002104412e2102200341e4066a280200450d010b20032802e00610230b201a450d010b201d10230b4100211a41012107410121060c110b2021450d010b200d10230b410021060b410121070c0c0b200410230b200741d9cac40020051b21042006411520051b21022005450d052004211a200221190b20034180026a200341e0016a201e10cf0202402003280280024101470d0020032802880221022003280284022104200c0d060c070b20034180026a41306a290300211e200341a8026a290300211f200341b0046a41186a20034180026a41206a290300370300200341b0046a41106a20034180026a41186a290300370300200341b0046a41086a20034180026a41106a29030037030020032003290388023703b00420034180026a10d002200320034180026a36029005200320034180026a3602a001200341c8056a41186a2205200341e0016a41186a290300370300200341c8056a41106a2206200341e0016a41106a290300370300200341c8056a41086a2207200341e0016a41086a290300370300200320032903e0013703c805200341b8066a200341c8056a10d8014100210420032d00b80622084102460d03200341f0066a280200210202402008450d00410021040c040b2002417f4c0d00200341ec066a280200211d200341b8066a41306a280200210802402002450d00200210262204450d022004200820021094041a201d450d040c030b41012104201d0d020c030b101d000b20024101102a000b200810230b200341fc036a4100360200200341ec036a221d4200370200200341c0036a41206a41dcacc400360200200341dc036a41a886c500360200200341d4036a22084200370200200341c0036a41106a41f098c400360200200341c0036a41086a2002360200200341a4046a20052903003702002003419c046a200629030037020020034194046a2007290300370200200342083702f4032003428080808080013702e403200341003602cc03200320023602c403200320043602c003200320032903c80537028c042003200341a0016a36028804200320034190056a36028404200320034180026a360280042003200e3703d0062003200f3a00cf06200320103a00ce06200320113b01cc06200320123a00cb06200320133a00ca06200320143b01c806200320153a00c706200320163a00c606200320173b01c406200320183a00c306200320193600bf062003201a3600bb062003201b3a00ba062003201c3b01b806200341003602d005200342013703c805200341c0016a200341c0036a200341b8066a200a2009200341b0046a200d200b200341c8056a10e7014101212041012123024020032802c00122240d00200341b8066a41086a221a2008290200370300200341c8056a41086a200341c4066a280200360200200320032902cc033703b806200320032902bc063703c805200341c8076a200341c8056a10db01200341e8036a2802002221200341f0036a280200220441e8006c6a2108201d280200212220212102024002402004450d00200341c1066a211d202121020240034020022d00002104200341c8056a200241016a41d7001094041a20044106460d01200241d8006a2800002105200241dc006a2800002106200241e0006a2800002107201a20043a00002003410a3a00b806201d200341c8056a41d7001094041a20052007200341b8066a102c02402006450d00200510230b200241e8006a22022008470d000c030b0b200241e8006a21020b20022008460d00034020022d000022044106460d01200241286a2800002105200241246a28000021060240200241dc006a280000450d00200241d8006a28000010230b024020044105490d002005450d00200610230b200241e8006a22022008470d000b0b410021232022450d00202110230b200341386a20032903c004200341c8046a29030020032903b804220e420010980420032903b004200e7d10cd02200341c8006a200341e0016a2003290338200341386a41086a290300108202200341c8066a201e200341c8006a41086a29030022097d201f2003290348220e54ad7d2009201e7d200e201f54ad7d200e201f582009201e582009201e5122021b22041b220a3703002003201f200e7d200e201f7d20041b222c3703c0062003200e201f562009201e5620021b2202ad221f3703b806024020020d002003202c3703c8052003200a3703d0052003200341c8056a3602d804200341d8046a10de014100212020032903b806211f0b200341b8066a41086a210202400240201f4200510d00200320023602c805200341c8056a107b0c010b2020450d00200320023602c805200341c8056a10de010b200341f4036a2802002222200341fc036a28020022044190016c6a211d200341f8036a2802002125202221020240024002402004450d00200341c1066a2104200341d8046a4102722105200341b8066a4104722120200341e1066a21212022210202400340200341a8056a41186a2207200241186a290300370300200341a8056a41106a2208200241106a290300370300200341a8056a41086a221a200241086a290300370300200320022903003703a805200241206a2802002106200341c8056a200241246a41ec001094041a2006410e460d01200320063602b8062020200341c8056a41ec001094041a200520032903a805370000200541086a201a290300370000200541106a2008290300370000200541186a200729030037000020034180023b01d804200341306a200341b8066a200341d8046a10d20220032802302106200341b8066a41086a41043a000020212006453a0000200420032903a805370000200441086a201a290300370000200441106a2008290300370000200441186a20072903003700002003410a3a00b80641a886c5004100200341b8066a102c20024190016a2202201d470d000b201d2202201d470d020c030b20024190016a21020b2002201d460d010b200341b8066a41206a2105200341b8066a41246a21200340200341a8056a41186a2206200241186a290300370300200341a8056a41106a2207200241106a290300370300200341a8056a41086a2208200241086a290300370300200320022903003703a805200241206a2802002104200341b8066a200241246a41ec001094041a2004410e460d01200341d8046a41186a221a2006290300370300200341d8046a41106a22062007290300370300200341d8046a41086a22072008290300370300200320032903a8053703d804200341c8056a200341b8066a41ec001094041a20052004360200200341b8066a41186a201a290300370300200341b8066a41106a2006290300370300200341b8066a41086a2007290300370300200320032903d8043703b8062020200341c8056a41ec001094041a2005102420024190016a2202201d470d000b0b02402025450d00202210230b200341c8016a280200210220032802c40121050240024002402024450d002005210420032802c00322050d010c020b4100210402402002450d00200510230b20032802c0032205450d010b20032802c403450d00200510230b2023450d00200341c0036a41186a280200211a200341d0036a280200210502400240200341c0036a41146a2802002207450d002007210820052106034020062802880b21062008417f6a22080d000b0340200520052f01064102746a41880b6a28020021052007417f6a22070d000c020b0b200521060b200341d4066a20052f0106360200200341b8066a41186a4100360200200341b8066a41146a20053602002003201a3602d806200341003602c806200342003703c006200320063602bc06200341003602b806200341b8066a10d4010240200341f0036a2802002206450d00200341c0036a41286a2802002105200641e8006c210603400240200541dc006a280200450d00200541d8006a28020010230b024020052d00004105490d00200541286a280200450d00200541246a28020010230b200541e8006a2105200641987f6a22060d000b0b200341ec036a280200450d00200341e8036a2802001023200c0d010c020b200c450d010b200d10230b41012106410021070c020b41e990c300210441e90021020b41012107410121060b4101211a0b4101210820012d0000220541064b0d010b024002400240024020050e0705050003010502050b2008450d04200141086a280200450d04200141046a28020010230c040b2006450d03200141286a280200450d03200141246a28020010230c030b201a450d02200141c8006a280200450d02200141c4006a28020010230c020b2007450d012001412c6a280200450d01200141286a28020010230c010b200141c8006a280200450d00200141c4006a28020010230b2000200236020420002004360200200341d0076a24000bc50602027f047e230041e0006b22032400200341386a41086a22044200370300200342003703384186cdc2004116200341386a1000200341d0006a41086a20042903003703002003200329033837035002400240024002400240200341d0006a411041a886c500410041001001417f460d0020034200370338200341d0006a4110200341386a41084100100141016a41084d0d02200329033821050c010b4280ade20421050b42002106200341386a41086a220442003703002003420037033841f5ccc2004111200341386a1000200341d0006a41086a2004290300370300200320032903383703500240200341d0006a411041a886c500410041001001417f460d0020034200370338200341d0006a4110200341386a41084100100141016a41084d0d02200329033821060b0240200520067d20025a0d0020004188abc40036020420004101360200200041086a411b360200200341e0006a24000f0b42002105200341386a41086a220442003703002003420037033841b3cdc2004111200341386a1000200341d0006a41086a20042903003703002003200329033837035002400240200341d0006a411041a886c500410041001001417f460d002003420037034020034200370338200341d0006a4110200341386a4110410010012204417f460d042004410f4d0d04200341c0006a2903002105200329033821060c010b420121060b200341186a2005420020024200109804200341286a2002420020064200109804200341086a420042002006420010980402402003290310200329032084420052200341286a41086a2903002207200329030820032903187c7c2208200754724101470d00200041a3abc40036020420004101360200200041086a4127360200200341e0006a24000f0b200341386a2001200329032820084108108502024020032802384101470d002000200329023c37020420004101360200200341e0006a24000f0b20032903402107200041306a200341386a41106a290300370300200041286a2007370300200041206a2005370300200041186a2006370300200041106a2002370300200041086a200237030020004100360200200341e0006a24000f0b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000bcf0d06087f097e027f057e017f057e23004190016b22012400200141306a41086a220242003703002001420037033041bc8fc3004118200141306a1000200141106a41086a2002290300370300200120012903303703104100210341102104024002400240200141106a411041a886c500410041001001417f460d00200142103702242001200141106a360220200141306a200141206a10c10220012d008c0122034102460d022001410c6a41026a2001418f016a2d00003a0000200120012f008d013b010c200128028801210520012802840121042001280280012106200128027c210720012802782108200129037021092001290368210a2001290360210b2001290358210c2001290350210d2001290348210e2001290340210f20012903382110200129033021110c010b420121094104210741808004210641202105410021084201210a4201210b4201210c4201210d4201210e4201210f42012110420121110b200141306a41086a22024200370300200142003703304182b6c100411b200141306a1000200141106a41086a2212200229030037030020012001290330370310024002400240024002400240200141106a411041a886c500410041001001417f460d002001420037033820014200370330200141106a4110200141306a4110410010012213417f460d022013410f4d0d02200141386a2903002114200129033021150c010b42002115420021140b200242003703002001420037033041f492c3004111200141306a10002012200229030037030020012001290330370310024002400240200141106a411041a886c500410041001001417f460d0020014100360230200141106a4110200141306a41044100100141016a41044d0d02200128023021120c010b41e40021120b42002116200141306a41086a2202420037030020014200370330418593c3004114200141306a1000200141106a41086a20022903003703002001200129033037031002400240200141106a411041a886c500410041001001417f460d002001420037033820014200370330200141106a4110200141306a4110410010012202417f460d042002410f4d0d04200141386a2903002116200129033021170c010b421521170b42002118200141306a41086a2202420037030020014200370330419993c3004114200141306a1000200141106a41086a221320022903003703002001200129033037031002400240200141106a411041a886c500410041001001417f460d002001420037033820014200370330200141106a4110200141306a4110410010012219417f460d052019410f4d0d05200141386a290300211a2001290330211b0c010b4200211b4200211a0b200242003703002001420037033041ad93c3004114200141306a1000201320022903003703002001200129033037031002400240200141106a411041a886c500410041001001417f460d002001420037033820014200370330200141106a4110200141306a4110410010012202417f460d062002410f4d0d06200141386a290300211c200129033021180c010b4200211c0b200141306a41086a220242003703002001420037033041c193c3004114200141306a1000200141106a41086a2002290300370300200120012903303703100240024002400240200141106a411041a886c500410041001001417f460d0020014200370330200141106a4110200141306a41084100100141016a41084d0d022001290330211d0c010b428701211d0b200141306a41086a220242003703002001420037033041d593c3004116200141306a1000200141106a41086a20022903003703002001200129033037031002400240200141106a411041a886c500410041001001417f460d0020014200370330200141106a4110200141306a41084100100141016a41084d0d032001290330211e0c010b42af01211e0b200020033a005c2000200536025820002004360254200020063602502000200736024c20002008360248200020093703402000200a3703382000200b3703302000200c3703282000200d3703202000200e3703182000200f3703102000201037030820002011370300200020012f010c3b005d200041df006a2001410e6a2d00003a0000200041e8006a201437030020002015370360200020123602b0012000201e3703a8012000201d3703a00120004198016a201c370300200020183703900120004188016a201a3703002000201b37038001200041f8006a20163703002000201737037020014190016a24000f0b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000ba01b09017f017e017f017e047f087e017f027e037f230041b0036b2203240020034190026a200010d801024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020032d009002417f6a41ff017141014d0d0020034190016a41086a200341d8026a29030037030020034190016a41106a200341e0026a29030037030020034190016a41186a200341e8026a2903003703002003200341d0026a2903003703900120034190026a41106a290300210420034190026a41086a22052903002106200341cc026a2802002107200341c8026a2802002108200341c4026a2802002109200341c0026a280200210a20034190026a41186a290300210b20054200370300200342003703900241af98c300410d20034190026a100020034190036a41086a20052903003703002003200329039002370390034200210c024020034190036a411041a886c500410041001001417f460d00200342003703900220034190036a411020034190026a41084100100141016a41084d0d04200329039002210c0b024042004200200c20017d22012001200c561b2201200b7d220b200b2001561b220d500d0020034180016a200010840120034180016a41086a2903002101200329038001210e4200210b20034190026a41086a22054200370300200342003703900241f1cdc200411a20034190026a100020034190036a41086a20052903003703002003200329039002370390030240024020034190036a411041a886c500410041001001417f460d002003420037039802200342003703900220034190036a411020034190026a4110410010012205417f460d072005410f4d0d070240200329039002220b20034190026a41086a290300220f84500d00200341f0006a200e2001200b200f109704200341f0006a41086a29030021102003290370210b0c020b4200210b0b420021100b20034190026a41086a22054200370300200342003703900241c4cdc200411420034190026a100020034190036a41086a20052903003703002003200329039002370390030240024020034190036a411041a886c500410041001001417f460d002003420037039802200342003703900220034190036a411020034190026a4110410010012205417f460d082005410f4d0d0820034198026a290300210f20032903900221110c010b420021114200210f0b200341c0006a4200420020107d2007ad2210200b54ad7d22122010200b7d220b20105620124200522012501b22051b2210420020114200109804200341d0006a200f42004200200b20051b220b4200109804200341e0006a200b420020114200109804427f20032903602010420052200f42005271200329034842005272200329035842005272200341e0006a41086a290300220b200329034020032903507c7c2211200b547222051b220f427f201120051b221184500d004200210b20034190026a41086a2205420037030020034200370390024182b6c100411b20034190026a100020034190036a41086a2207200529030037030020032003290390023703900320034190036a411041a886c500410041001001417f460d022003420037039802200342003703900220034190036a411020034190026a4110410010012213417f460d072013410f4d0d0720034198026a290300211220032903900221140c030b2009450d00200a10230b410021050c170b42002114420021120b20054200370300200342003703900241d8cdc200411920034190026a1000200720052903003703002003200329039002370390030240024020034190036a411041a886c500410041001001417f460d002003420037039802200342003703900220034190036a411020034190026a4110410010012205417f460d062005410f4d0d0620034198026a2903002115200329039002210b0c010b420021150b200341186a20114200200d42ffffffff0f8342ffffffff0f200d428080808010541b22104200109804200341286a200f420020104200109804200341086a42004200200f4200109804200341386a200041084200200e2006427f20032903282003290320200329031084420052200341286a41086a290300220f200329031820032903087c7c2211200f547222051b22102010200656427f201120051b220f200456200f2004511b22051b22117d22062006200e5620012004200f20051b7d200e201154ad7d220420015620042001511b22071b22064200200420071b22041083022003280238210702402006200b20147c2211542004201520127c2011200b54ad7c220b542004200b511b22130d0020070d0020050d00410221052002450d1420034190026a20002010200f41081085022003280290024101460d072003200341a0026a290300220b3703b801200320034190026a41086a29030022013703b00120034190026a200010d80120032d009002220241024622050d06410020034190026a20051b22052d00000d062005200c37031820052005290308220c20017d370308200541106a22052005290300200b7d200c200154ad7d370300411710262205450d082005410f6a41002900abcd42370000200541086a41002900a4cd423700002005410029009ccd4237000020054117413710272205450d09200520002900003700172005412f6a200041186a290000370000200541276a200041106a2900003700002005411f6a200041086a29000037000020034190036a41186a2200420037030020034190036a41106a2207420037030020034190036a41086a2208420037030020034200370390032005413720034190036a1002200341f0026a41186a2000290300370300200341f0026a41106a2007290300370300200341f0026a41086a200829030037030020032003290390033703f00220034120360294032003200341f0026a3602900320034190026a20034190036a10b30220051023024020020d00200341c4026a280200450d00200341c0026a28020010230b2003200341b0016a3602900220034190026a10de014102210520090d150c160b0240024020130d0020070d0020034190026a20002010200f4108108502410121052003280290024101460d0b2003200341a0026a2903003703c801200320034190026a41086a2903003703c0012003200341c0016a3602900320034190036a10de01200e2011542001200b542001200b511b450d010c150b024002400240200e2011542001200b542001200b511b450d00200341f0016a20004200420010dc01200341f8016a210020032903f0014200510d01200320003602900220034190026a10de014101210520090d180c190b200341d0016a20002011200b10dc01200341d8016a210520032903d0014200510d01200320053602900220034190026a10de010c020b200320003602900220034190026a107b4101210520090d160c170b200320053602900220034190026a107b0b2003410036029002200a200820034190026a101321162003280290022202417f460d0a20034190026a41186a20034190016a41186a29030037030020034190026a41106a20034190016a41106a29030037030020034190026a41086a20034190016a41086a29030037030020032003290390013703900220034100360298032003420137039003200320023602f002200341f0026a20034190036a1041024002400240200328029403220720032802980322056b20024f0d00200520026a22132005490d1320074101742217201320132017491b22174100480d132007450d012003280290032007201710272213450d020c0e0b200328029003221320056a201620021094041a200520026a2205450d0e0c0f0b2017102622130d0c0b20174101102a000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41b8ccc20041351021000b41a2cac30041f10020032802940220034190026a41086a28020010c902000b41174101102a000b41374101102a000b4193cbc300412b20032802940220034190026a41086a28020010c902000b41f8ffc40041381021000b2003201736029403200320133602900320172107201320056a201620021094041a200520026a22050d010b4101211720070d010c020b20054100480d02200510262217450d032017201320051094041a2007450d010b201310230b20054101742207200541206a221320132007491b22184100480d00024002402005450d0020172005201810272207450d010c040b2018102622070d030b20184101102a000b101e000b20054101102a000b200720056a2205200329039002370000200541186a20034190026a41186a290300370000200541106a20034190026a41106a290300370000200541086a20034190026a41086a29030037000020034190036a41186a2205420037030020034190036a41106a2217420037030020034190036a41086a2218420037030020034200370390032007201320034190036a1002200341f0026a41186a22132005290300370300200341f0026a41106a22052017290300370300200341f0026a41086a2217201829030037030020032003290390033703f00220071023200341a9026a2013290300370000200341a1026a200529030037000020034199026a201729030037000041012105200341013a009002200320032903f00237009102200020034190026a10dd01200a2008100d2002450d00201610230b2009450d010b200a1023200341b0036a240020050f0b200341b0036a240020050bc46309077f017e147f017e0d7f037e047f027e047f23004190046b22032400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001280200417f6a2204410c4b0d000240024020040e0d002a05080c0b0607040a030901000b200141086a29030020022d000020022d000110ea0221044124210541012106410121070c460b200141086a280200210820012802042104200341e0026a41086a2001411c6a290200370300200341e0026a410d6a200141216a2900003700002003200141146a2902003703e002410121092002411a6a290100210a200241196a2d0000210b200241186a2d0000210c200241166a2f0100210d200241156a2d0000210e200241146a2d0000210f200241126a2f01002106200241116a2d00002107200241106a2d000021102002410e6a2f010021112002410d6a2d000021122002410c6a2d000021132002410a6a2f01002114200241096a2d00002115200241086a2d00002116200241066a2f01002117200241056a2d00002118200241046a2d00002119200241026a2f0100211a20022d0001210520022d0000210220044101460d0b20044102470d2a200141106a280200211b2001410c6a280200211c200341c0036a410d6a200341e0026a410d6a290000370000200341c0036a41086a200341e0026a41086a290300370300200320032903e0023703c0034101210941db94c30021044100211d412a211e200241ff01710d1541002102200541ff01714101470d1620174108742018722016411874722104410021092015211e2014211d201321020c160b200141086a2802002208417f6a220441044b0d2a200141106a290300210a2001410c6a280200211020022d0001210520022d00002102024020040e050014121311000b200aa72108200241ff01710d1841012107200541ff01714101470d18412a210520080d330c340b200341c8006a41306a200141386a290300370300200341c8006a41286a200141306a290300370300200341c8006a41206a200141286a290300370300200341c8006a41186a200141206a290300370300200341c8006a41106a200141186a290300370300200341c8006a41086a200141106a2903003703002003200141086a29030037034820034198026a41206a200241206a29020037030020034198026a41186a200241186a29020037030020034198026a41106a200241106a29020037030020034198026a41086a200241086a2902003703002003200229020037039802200341306a200341c8006a20034198026a10fc02200328023421052003280230210441012106410121070c430b418f94c3002104412421054101210620022d00000d0920022d000141ff01714102470d09200141086a290300210a4200211f20034180046a41086a2202420037030020034200370380044188a4c100411020034180046a100020034180036a41086a2204200229030037030020032003290380043703800320034180036a411041a886c500410041001001417f470d2920024200370300200342003703800441af98c300410d20034180046a100020042002290300370300200320032903800437038003024020034180036a411041a886c500410041001001417f460d002003420037034820034180036a4110200341c8006a41084100100141016a41084d0d272003290348211f0b201f200a540d2a20034180046a41086a2202420037030020034200370380044188a4c100411020034180046a100020034180036a41086a20022903003703002003200329038004370380032003200a37034820034180036a4110200341c8006a4108100441002104410121070c420b200341c8006a200141086a41c8001094041a20034198026a41206a200241206a29020037030020034198026a41186a200241186a29020037030020034198026a41106a200241106a29020037030020034198026a41086a200241086a2902003703002003200229020037039802200341086a200341c8006a20034198026a109902200328020c21052003280208210441012106410121070c410b200341c8006a41386a200141c0006a290300370300200341c8006a41306a200141386a290300370300200341c8006a41286a200141306a290300370300200341c8006a41206a200141286a290300370300200341c8006a41186a200141206a290300370300200341c8006a41106a200141186a290300370300200341c8006a41086a200141106a2903003703002003200141086a29030037034820034198026a41206a200241206a29020037030020034198026a41186a200241186a29020037030020034198026a41106a200241106a29020037030020034198026a41086a200241086a2902003703002003200229020037039802200341206a200341c8006a20034198026a109a0220032802242105200328022021044100210941012106410121074101210b4101210c0c430b20034198026a41206a200141246a29020037030020034198026a41186a2001411c6a29020037030020034198026a41106a200141146a29020037030020034198026a41086a2001410c6a2902003703002003200129020437039802200341c8006a41206a200241206a290200370300200341c8006a41186a200241186a290200370300200341c8006a41106a200241106a290200370300200341c8006a41086a200241086a29020037030020032002290200370348200341286a20034198026a200341c8006a10fd02200328022c2105200328022821044100210d41012106410121074101210b4101210c410121090c430b200141086a280200212020012802042121200341c8006a2001410c6a41c4001094041a2002411a6a290100211f200241196a2d0000210d200241186a2d0000210e200241166a2f0100210f200241156a2d00002114200241146a2d00002117200241126a2f01002118200241116a2d0000211e200241106a2d000021222002410e6a2f010021232002410d6a2d000021242002410c6a2d000021252002410a6a2f01002126200241096a2d00002127200241086a2d00002128200241066a2f01002129200241056a2d0000212a200241046a2d0000212b200241026a2f0100212c20022d0001210c20022d00002109200341f0016a20034184016a290200370300200341e8016a200341fc006a290200370300200341e0016a200341f4006a290200370300200341d8016a200341ec006a290200370300200341b8016a41186a200341e4006a290200370300200341b8016a41106a200341c8006a41146a290200370300200341b8016a41086a200341c8006a410c6a2902003703002003200329024c3703b80141012102412a21054100210841db94c300210420090d0841002109200c41ff01714101470d092029410874202a722028411874722104410021022025210820262109202721050c090b200341c8006a200141086a41e8001094041a20034198026a41206a200241206a29020037030020034198026a41186a200241186a29020037030020034198026a41106a200241106a29020037030020034198026a41086a200241086a2902003703002003200229020037039802200341386a200341c8006a20034198026a10ce02200328023c2105200328023821044100210841012106410121074101210b4101210c410121094101210d4101210e0c430b200141086a280200210c2001280204210d412a210541db94c300210420022d0000450d0441012108410021094100210b0c050b20034198026a41206a200141286a29030037030020034198026a41186a200141206a29030037030020034198026a41106a200141186a29030037030020034198026a41086a200141106a2903003703002003200141086a29030037039802200341c8006a41206a200241206a290200370300200341c8006a41186a200241186a290200370300200341c8006a41106a200241106a290200370300200341c8006a41086a200241086a29020037030020032002290200370348200341186a20034198026a200341c8006a1057200328021c2105200328021821044100210c41012106410121074101210b0c3d0b200341c8006a41306a200141386a290300370300200341c8006a41286a200141306a290300370300200341c8006a41206a200141286a290300370300200341c8006a41186a200141206a290300370300200341c8006a41106a200141186a290300370300200341c8006a41086a200141106a2903003703002003200141086a29030037034820034198026a41206a200241206a29020037030020034198026a41186a200241186a29020037030020034198026a41106a200241106a29020037030020034198026a41086a200241086a2902003703002003200229020037039802200341106a200341c8006a20034198026a10830120032802142105200328021021044100210b41012106410121070c3b0b41db94c30021044100211d412a211e200241ff01710d0b41002102200541ff01714101470d0c20174108742018722016411874722104410021092015211e2014211d201321020c0c0b410121070c380b41012108410021094100210b20022d00014101470d002002410c6a2d000021092002410a6a2f0100210b200241096a2d00002105200241066a2f0100410874200241056a2d000072200241086a2d0000411874722104410021080b200b41ffff0371410874200941187472200541ff017172210502402008450d004100210e410121060240200c450d00200d10230b410121074101210b4101210c410121094101210d0c3c0b410121060240200c450d00200d10230b4100210e410121074101210b4101210c410121094101210d0c280b410021090b200941ffff0371410874200841187472200541ff017172210502402002450d002020450d340c330b2003201f370390022003200d3a008f022003200e3a008e022003200f3b018c02200320143a008b02200320173a008a02200320183b0188022003201e3a008702200320223a008602200320233b018402200320243a008302200320053600ff01200320043600fb012003202b3a00fa012003202c3b01f80120034198026a200341f8016a10fe02200341b8016a41206a2125200341b9026a212620034198026a4101722127410421244100211e41002117410021020c200b200a422088a72109200aa7210b200220057241ff0171450d0e02402009450d002009410c6c21042010210203400240200241046a280200450d00200228020010230b2002410c6a2102200441746a22040d000b0b4101211141002112200b450d2f0c2e0b200aa72108200220057241ff0171450d0e41b394c300210441282105410121074100210620080d2f0c320b200a422088a72109200aa7210b200220057241ff0171450d0e02402009450d00200941186c21042010210203400240200241046a280200450d00200228020010230b0240200241106a280200450d002002410c6a28020010230b200241186a2102200441686a22040d000b0b4100211141012112200b0d2c0c2d0b41012107200220057241ff0171450d0e41b394c300210441282105410021060c300b410021020b201d41ffff0371410874201e41ff017172200241187472210520090d262003200a370398032003200b3a0097032003200c3a0096032003200d3b0194032003200e3a0093032003200f3a009203200320063b019003200320073a008f03200320103a008e03200320113b018c03200320123a008b0320032005360087032003200436008303200320193a0082032003201a3b01800320034180046a41086a22024200370300200342003703800441e0cec300410820034180046a1000200341b8016a41086a200229030037030020032003290380043703b801200341b8016a411041a886c500410041001001417f460d03200341e0006a4200370300200341c8006a41106a4200370300200341c8006a41086a420037030020034200370348200341b8016a4110200341c8006a4120410010012202417f460d172002411f4d0d1720034198026a41186a2202200341c8006a41186a220429030037030020034198026a41106a2205200341c8006a41106a220929030037030020034198026a41086a220b200341c8006a41086a220c29030037030020032003290348370398022004200229030037030020092005290300370300200c200b29030037030020032003290398023703480c040b410021020b201d41ffff0371410874201e41ff017172200241187472210520090d05200320193a0082032003201a3b0180032003200a370398032003200b3a0097032003200c3a0096032003200d3b0194032003200e3a0093032003200f3a009203200320063b019003200320073a008f03200320103a008e03200320113b018c03200320123a008b032003200536008703200320043600830320034180046a41086a22024200370300200342003703800441e0cec300410820034180046a1000200341b8016a41086a200229030037030020032003290380043703b801200341b8016a411041a886c500410041001001417f460d03200341e0006a4200370300200341c8006a41106a4200370300200341d0006a420037030020034200370348200341b8016a4110200341c8006a4120410010012202417f460d162002411f4d0d1620034198026a41186a2202200341c8006a41186a220429030037030020034198026a41106a2205200341c8006a41106a220929030037030020034198026a41086a220b200341c8006a41086a220c29030037030020032003290348370398022004200229030037030020092005290300370300200c200b29030037030020032003290398023703480c040b41db94c3002104412a2105410121074100210620080d280c2b0b200341e0006a4200370300200341c8006a41106a4200370300200341c8006a41086a4200370300200342003703480b024020034180036a200341c8006a4120109604450d0041e8cec3002104413121050c220b200341c8006a410d6a2202200341c0036a410d6a290000370000200341c8006a41086a2204200341c0036a41086a290300370300200320032903c003370348200841ff01714101470d08200341f8016a201c41067610870120032802f8012104200328028002201c413f7122024d0d0b200341c0016a200420024105746a220241136a290000370300200341c5016a200241186a2900003700002003200229000b3703b80120022f0000200241026a2d00004110747221052002280007211b2002280003211c4101210220032802fc01450d1d0c1c0b200341e0006a4200370300200341c8006a41106a4200370300200341d0006a4200370300200342003703480b20034180036a200341c8006a4120109604450d014199cfc3002104412221050b20081024200810230c1e0b200341c8006a200841f0001094041a41002104200341003b019802200341c0006a200341c8006a20034198026a10d20220032802402202450d0520022003280244100f410021020c060b02402009410c6c2202450d00201020026a21042010210203402002280200200241086a28020010032002410c6a22022004470d000b0b02402009450d002009410c6c21042010210203400240200241046a280200450d00200228020010230b2002410c6a2102200441746a22040d000b0b4101211141002112200b450d120c110b41f9c7c30041052010200a422088a71004412a21054101210720080d120c130b0240200941186c2202450d00201020026a21042010210203402002280200200241086a2802002002410c6a280200200241146a2802001004200241186a22022004470d000b0b02402009450d00200941186c21042010210203400240200241046a280200450d00200228020010230b0240200241106a280200450d002002410c6a28020010230b200241186a2102200441686a22040d000b0b4100211141012112200b0d0f0c100b410810262202450d0c2002200a37000041efc7c300410a2002410810042002102341002106412a21050c120b200341b8016a410d6a2002290000370000200341b8016a41086a2004290300370300200320032903483703b801200841087621050c150b410121020b200320023a004a2003410b3b014841a886c5004100200341c8006a102c200810230c150b4100210220032802fc010d100c110b10ff02000b41d4aac10041331021000b200341dc006a41013602002003410136029c022003418898c400360298022003420137024c200341d497c400360248200320034198026a360258200341c8006a41d0cec3001061000b200341dc006a41013602002003410136029c022003418898c400360298022003420137024c200341d497c400360248200320034198026a360258200341c8006a41949bc3001061000b41b0a4c100104f000b41c4a5c100104f000b41d4aac10041331021000b41d4aac10041331021000b41084101102a000b03400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020020e03000104040b02400240201741014622020d0041a886c50021144100210420170d0141202104200341b8016a21140c010b41202104202521140b41012122410021180240024002400240024020032d0098024101470d0002400240024020020d0020170d014120210e202721184100212241202004470d030c020b4120210e202621184100212241202004460d010c020b4100210e41a886c50021184100212241002004470d010b024020182014460d002004210e2018201420041096040d010b201e2017470d03201e4101742202201e41016a220420042002491b2202ad420486221f422088a70d0a201fa722044100480d0a201e450d012024201e4104742004102722240d020c160b410e10262202450d0b200241066a41002900edcd44370000200241002900e7cd443700002002410e411c10272202450d0c2002201736000e200341e0036a41186a22054200370300200341e0036a41106a22084200370300200341e0036a41086a22094200370300200342003703e00320024112200341e0036a1002200341c0036a41186a2005290300370300200341c0036a41106a2008290300370300200341c0036a41086a2009290300370300200320032903e0033703c00302400240200341c0036a412041a886c500410041001001417f460d00200342203702e4032003200341c0036a3602e00320034180036a200341e0036a10a802200328028003220d450d11200329028403211f0c010b4200211f4104210d0b20021023410021020240201f422088222da72223450d00024020234101460d004100210220232105034002400240200d2005410176220920026a220c410c6c6a22082802002014200420082802082208200820044b1b109604220f450d00417f4101200f4100481b21080c010b4100417f410120082004491b20082004461b21080b2002200c20084101461b2102200520096b220541014b0d000b0b02400240200d2002410c6c6a22052802002014200420052802082205200520044b1b1096042208450d00417f410120084100481b21050c010b20052004460d08417f410120052004491b21050b20022005417f466a21020b024002402004450d00200410262209450d102009201420041094041a2002202da722054b0d0f0c010b410121092002202da722054b0d0e0b0240024002402005201fa7470d00200541016a22082005490d0c2005410174220c20082008200c491bad222e420c7e222f422088a70d0c202fa722084100480d0c2005450d01200d2005410c6c20081027220d0d020c130b201f212e0c010b20081026220d450d110b200d2002410c6c6a2208410c6a2008200520026b410c6c1095041a200820043602082008200436020420082009360200202e42ffffffff0f83222f202d42017c222e42208684212d0240024002400240024020220d00202ea7220f450d02410021020240200f4101460d0041002102200f2104034002400240200d2004410176220820026a2209410c6c6a22052802002018200e200528020822052005200e4b1b109604220c450d00417f4101200c4100481b21050c010b4100417f41012005200e491b2005200e461b21050b2002200920054101461b2102200420086b220441014b0d000b0b200d2002410c6c6a220428020022092018200e200428020822052005200e4b1b10960421082005200e470d0220080d022002200f4f0d192004280204210520042004410c6a200f2002417f736a410c6c1095041a202f201f4280808080708384212d20050d010b201e2017460d020c030b20091023201e2017460d010c020b41f5cdc400412a100f201e2017470d010b201e4101742202201e41016a220420042002491b2202ad420486221f422088a70d0a201fa722044100480d0a02400240201e450d002024201e4104742004102722240d010c140b200410262224450d130b2002211e0b202420174104746a2202200d36020420022017360200200241086a202d370200201741016a22174102490d1b0c030b200410262224450d140b2002211e0b202420174104746a4100360204201741016a22174102490d170b4104211120174104742202450d01202420026a21304110211d410e211b4106213141002115411c21324118211c4200210a41082106411221334201213442202135410c210b412021364174211241012116202421190c180b2019201d6a21180240201928020422220d002018211920182030470d1a0c010b201928020021042019290208211f201b10262202450d0d200220316a20152900edcd44370000200220152900e7cd443700002002201b203210272219450d0e2019200436000e200341e0036a201c6a2202200a370300200341e0036a201d6a2204200a370300200341e0036a20066a2205200a3703002003200a3703e00320192033200341e0036a1002200341c0036a201c6a2002290300370300200341c0036a201d6a2004290300370300200341c0036a20066a2005290300370300200320032903e0033703c00320034180036a20066a220d201536020020032034370380032003201f203588a722233602e0032023200b6c210c200341e0036a20034180036a104102400240024020230d002003280284032102200341c0036a20362003280280032209200d280200100420020d010c020b2022200c6a21142022210403402004280200210e2003200420066a28020022023602e003200341e0036a20034180036a104102400240024002402003280284032208200d28020022056b20024f0d00200520026a22092005490d0b2008201674220f20092009200f491b220f2015480d0b2008450d012003280280032008200f102722090d020c0c0b20032802800321090c020b200f10262209450d0a0b2003200f360284032003200936028003200f21080b200d200520026a220f360200200920056a200e20021094041a2004200b6a22042014470d000b200341c0036a20362009200f10042008450d010b200910230b2019102302402023450d002022210203400240200220116a280200450d00200228020010230b2002200b6a2102200c20126a220c0d000b0b0240201fa7450d00202210230b2018211920182030470d180b0240201e450d00202410230b200341e0026a41186a200341f8016a41186a290300370300200341e0026a41106a200341f8016a41106a290300370300200341e0026a41086a200341f8016a41086a290300370300200320032903f8013703e00220034180036a41386a200341b8016a41386a29030037030020034180036a41306a200341b8016a41306a29030037030020034180036a41286a200341b8016a41286a29030037030020034180036a41206a200341b8016a41206a29030037030020034180036a41186a200341b8016a41186a29030037030020034180036a41106a200341b8016a41106a29030037030020034180036a41086a200341b8016a41086a290300370300200320032903b80137038003411210262202450d10200241106a41002f00c4ad443b0000200241086a41002900bcad44370000200241002900b4ad4437000020024112413210272202450d11200220032903e0023700122002412a6a200341e0026a41186a290300370000200241226a200341e0026a41106a2903003700002002411a6a200341e0026a41086a290300370000200341e0036a41186a22044200370300200341e0036a41106a22054200370300200341e0036a41086a22084200370300200342003703e00320024132200341e0036a1002200341c0036a41186a2004290300370300200341c0036a41106a2005290300370300200341c0036a41086a2008290300370300200320032903e0033703c003412010262204450d122004200329038003370000200441186a20034180036a41186a290300370000200441106a20034180036a41106a290300370000200441086a20034180036a41086a2903003700002004412041c00010272204450d13200420032903a003370020200441386a20034180036a41386a290300370000200441306a20034180036a41306a290300370000200441286a20034180036a41286a290300370000200341c0036a4120200441c00010042004102320021023200341013a00e00320034180046a41086a22024200370300200342003703800441dfbac400410f20034180046a100020034180036a41086a200229030037030020032003290380043703800320034180036a4110200341e0036a410110044100210402402020450d00202110230b0c2d0b02402023450d00201f422088a7410c6c2104200d210203400240200241046a280200450d00200228020010230b2002410c6a2102200441746a22040d000b0b0240201fa7450d00200d10230b2017450d0141042110202420174104746a213741102138410c210741082139417421132024211a410221020c190b201a220520386a211a024020052802042202450d000240200520076a2802002204450d00200420076c210403400240200220106a280200450d00200228020010230b200220076a2102200420136a22040d000b0b200520396a280200450d00200520106a28020010230b201a2037470d170b0240201e450d00202410230b41d1cdc40021044116210520200d290c2a0b101e000b200f4101102a000b410e4101102a000b411c4101102a000b4180e4c400104f000b20044101102a000b41d4aac10041331021000b20084104102a000b20044104102a000b410e4101102a000b411c4101102a000b41fcc3c200104f000b20044104102a000b41124101102a000b41324101102a000b41204101102a000b41c0004101102a000b410021020c050b410021020c040b410121020c030b410121020c020b410121020c010b410221020c000b0b201010230b412a21054101210702402008417f6a220241044b0d00410021064101210b4101210c410121094101210d4101210e410121084101210f41002104024002400240024020020e05001d020301000b4100210641000d06200aa70d040c060b410021062012450d050240200a422088a72202450d002002410c6c21042010210203400240200241046a280200450d00200228020010230b2002410c6a2102200441746a22040d000b0b200aa70d030c040b4100210641000d04200aa70d020c040b410021062011450d030240200a422088a72202450d00200241186c21042010210203400240200241046a280200450d00200228020010230b0240200241106a280200450d002002410c6a28020010230b200241186a2102200441686a22040d000b0b200aa70d010c020b0240200a422088a72202450d002002410c6c21042010210203400240200241046a280200450d00200228020010230b2002410c6a2102200441746a22040d000b0b200aa7450d010b201010230b410021060b4101210b4101210c410121094101210d4101210e0b410121084101210f4100210420012802002202410c4d0d150c160b200410230b20020d00410121024115211b41d9cac400211c0c010b200341c8006a410d6a200341b8016a410d6a290000370000200341c8006a41086a200341b8016a41086a290300370300200320032903b801370348410021020b20034198026a41106a200341c8006a41106a29030037030020034198026a41086a2204200341c8006a41086a290300370300200320032903483703980202402002450d00201b2105201c21040c020b200341e0036a410d6a20034198026a410d6a290000370000200341e0036a41086a200429030037030020032003290398023703e00320034180046a41086a22024200370300200342003703800441e0cec300410820034180046a1000200341b8016a41086a200229030037030020032003290380043703b80102400240200341b8016a411041a886c500410041001001417f460d00200341e0006a4200370300200341c8006a41106a4200370300200341d0006a420037030020034200370348200341b8016a4110200341c8006a4120410010012202417f460d042002411f4d0d0420034198026a41186a2202200341c8006a41186a220429030037030020034198026a41106a2208200341c8006a41106a220929030037030020034198026a41086a220b200341c8006a41086a220c29030037030020032003290348370398022004200229030037030020092008290300370300200c200b29030037030020032003290398023703480c010b200341e0006a4200370300200341d8006a4200370300200341d0006a4200370300200342003703480b20034198026a41186a2202200341c8006a41186a29030037030020034198026a41106a2204200341c8006a41106a29030037030020034198026a41086a2209200341c8006a41086a22082903003703002003200329034837039802200341d2006a2009290300370100200341da006a2004290300370100200341e2006a20022903003701002003418b023b0148200320032903980237014a4100210441a886c5004100200341c8006a102c200341c8006a410d6a2209200341e0036a410d6a2900003700002008200341e0036a41086a290300370300200320032903e00337034820034180046a41086a22024200370300200342003703800441e0cec300410820034180046a1000200341b8016a41086a200229030037030020032003290380043703b801412010262202450d03200220053b00002002201b3600072002201c3600032002200329034837000b200241026a20054110763a0000200241136a2008290300370000200241186a2009290000370000200341b8016a4110200241201004200210230b0b4100210f41012106410121074101210b4101210c410121094101210d4101210e4101210820012802002202410c4d0d0f0c100b41d4aac10041331021000b41204101102a000b201010230b41b394c300210441282105410121074100210602402008417f6a220241044b0d004101210b4101210c410121094101210d4101210e410121084101210f024002400240024020020e05000f020301000b200aa70d040c070b2012450d060240200a422088a72202450d002002410c6c21082010210203400240200241046a280200450d00200228020010230b2002410c6a2102200841746a22080d000b0b200aa70d030c060b4100210641000d05200aa70d020c050b2011450d040240200a422088a72202450d00200241186c21082010210203400240200241046a280200450d00200228020010230b0240200241106a280200450d002002410c6a28020010230b200241186a2102200841686a22080d000b0b200aa70d010c040b0240200a422088a72202450d002002410c6c21082010210203400240200241046a280200450d00200228020010230b2002410c6a2102200841746a22080d000b0b200aa7450d030b201010230c020b202110230b41002107410121060b4101210b0b4101210c0b410121090b4101210d0b4101210e0b410121080b4101210f0b20012802002202410c4b0d010b0240024002400240024002400240024002400240024002400240024002400240024002400240024020020e0d02151515000507040615011503020b2007450d14200141086a280200450d14200128020410230c140b200e450d13200141086a280200450d13200128020410230c130b2006450d12200141086a280200220241044b0d0c024020020e051300130c0b130b200141106a280200450d122001410c6a28020010230c120b2008450d11200141086a2d0000220241054b0d0d024020020e061212000f0d12120b200141106a280200450d112001410c6a28020010230c110b2009450d10200141086a28020022024102460d0320024101470d10200141106a280200450d102001410c6a28020010230c100b200b450d0f200141086a2d00002202410c4b0d0d20024106470d0f200141106a280200450d0f2001410c6a28020010230c0f0b200d450d0e20012d000422024102460d0220024101470d0e200141086a22022802001024200228020010230c0e0b200c450d0d200141086a2d0000417f6a220241074b0d0d024020020e08000e0e0e040e0305000b2001410c6a22022802001024200228020010230c0d0b200141106a280200450d0c2001410c6a28020010230c0c0b2001410c6a22022802001024200228020010230c0b0b2001410c6a22022802001024200228020010230c0a0b2001410c6a22022802001024200228020010230c090b2001410c6a22022802001024200228020010230c080b0240200141146a2802002208450d002001410c6a2802002102200841186c210803400240200241046a280200450d00200228020010230b0240200241106a280200450d002002410c6a28020010230b200241186a2102200841686a22080d000b0b200141106a280200450d072001410c6a28020010230c070b200141106a280200450d062001410c6a28020010230c060b0240200141146a2802002208450d002001410c6a28020021022008410c6c210803400240200241046a280200450d00200228020010230b2002410c6a2102200841746a22080d000b0b200141106a280200450d052001410c6a28020010230c050b200141306a280200450d042001412c6a28020010230c040b200141d0006a280200450d03200141cc006a28020010230c030b200141346a280200450d02200141306a28020010230c020b200141106a280200450d012001410c6a28020010230c010b200f450d0020012802044101470d00200141086a22022802001024200228020010230b200020053602042000200436020020034190046a24000ba20b02037f017e0240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200028020022024101460d00024020024102460d0020024103470d02200141046a280200200141086a2802002202470d05200241016a22032002490d1720024101742204200320032004491b22044100480d172002450d0b20012802002002200410272203450d0c0c150b200141046a280200200141086a2802002202470d02200241016a22032002490d1620024101742204200320032004491b22044100480d162002450d0620012802002002200410272203450d070c120b200141046a280200200141086a2802002202470d02200241016a22032002490d1520024101742204200320032004491b22044100480d152002450d0720012802002002200410272203450d080c0f0b200141046a280200200141086a2802002202470d03200241016a22032002490d1420024101742204200320032004491b22044100480d142002450d0a20012802002002200410272203450d0b0c0c0b200128020021030c100b200128020021030c0d0b200128020021030c100b200128020021030c090b2004102622030d0b0b20044101102a000b2004102622030d070b20044101102a000b2004102622030d090b20044101102a000b2004102622030d010b20044101102a000b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41013a0000200041046a280200210302400240024002400240200141046a2802002202200428020022006b41044f0d00200041046a22042000490d0b20024101742200200420042000491b22004100480d0b2002450d0120012802002002200010272202450d020c030b200128020021020c030b2000102622020d010b20004101102a000b20012002360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200220006a20033600000f0b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41023a0000200041086a290300210502400240024002400240200141046a2802002202200428020022006b41084f0d00200041086a22032000490d0920024101742200200320032000491b22004100480d092002450d0120012802002002200010272202450d020c030b200128020021020c030b2000102622020d010b20004101102a000b20012002360200200141046a2000360200200141086a28020021000b200141086a200041086a360200200220006a20053700000f0b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41033a0000200041046a280200210302400240024002400240200141046a2802002202200428020022006b41044f0d00200041046a22042000490d0720024101742200200420042000491b22004100480d072002450d0120012802002002200010272202450d020c030b200128020021020c030b2000102622020d010b20004101102a000b20012002360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200220006a20033600000f0b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41043a0000200041086a2903002105024002400240200141046a2802002202200428020022006b41084f0d00200041086a22032000490d0320024101742200200320032000491b22004100480d032002450d0120012802002002200010272202450d020c040b200128020021020c040b2000102622020d020b20004101102a000b101e000b20012002360200200141046a2000360200200141086a28020021000b200141086a200041086a360200200220006a20053700000bbe0202047f017e230041c0006b22012400200141306a41086a2202420037030020014200370330418d9dc3004115200141306a1000200141086a41086a20022903003703002001200129033037030802400240200141086a411041a886c500410041001001417f460d002001200141086a3602182001411036021c200141003a00302001200141086a4110200141306a41014100100141016a220241014b36022020024102490d0120012d00302102200141306a200141186a102820012802302203450d012001412a6a41026a22042001412d6a41026a2d00003a0000200120012f002d3b012a20012902342105200020023a00002000200537020820002003360204200020012f012a3b0001200041036a20042d00003a0000200141c0006a24000f0b20004100360204200141c0006a24000f0b41d4aac10041331021000bf70605017f017e037f027e017f230041d0006b2201240042002102200141286a41086a220342003703002001420037032841fd98c300410d200141286a1000200141086a41086a20032903003703002001200129032837030841002103024002400240024002400240200141086a411041a886c500410041001001417f460d002001421037021c2001200141086a360218200141286a200141186a10a90220012802282204450d02200129022c2202422088a721032002a721050c010b41042104410021050b200141286a41206a200041206a280200360200200141286a41186a200041186a290200370300200141286a41106a200041106a290200370300200141286a41086a200041086a2902003703002001200029020037032820032005470d0320032002a7470d020240200341016a22002003490d0020034101742205200020002005491bad220642247e2207422088a70d002007a722004100480d00024002402003450d002004200341246c200010272204450d010c040b2000102622040d030b20004104102a000b101e000b41d4aac10041331021000b20024280808080708320068421020b2002422088a721030b2004200341246c22056a22002001290328370200200041206a200141286a41206a280200360200200041186a200141286a41186a290300370200200041106a200141286a41106a290300370200200041086a200141286a41086a22002903003702002001200242ffffffff0f83200341016a2203ad4220868437021c20012004360218200042003703002001420037032841fd98c300410d200141286a1000200141086a41086a2000290300370300200120012903283703082001411036022c2001200141086a360228200141186a200141286a10d6022002a7210802402003450d00200541246a21002004210303400240024020032d0000220541034b0d0002400240024020050e0404000102040b2003410c6a280200450d03200341086a2802001023200341246a21032000415c6a22000d040c050b2003410c6a280200450d02200341086a2802001023200341246a21032000415c6a22000d030c040b2003410c6a280200450d01200341086a2802001023200341246a21032000415c6a22000d020c030b200341086a280200450d00200341046a28020010230b200341246a21032000415c6a22000d000b0b02402008450d00200410230b200141d0006a24000b8803010a7f230041206b22022400200241003602082002420137030020002802002103200220002802082200360210200241106a20021041024002400240024002402000450d00200041246c2104200241086a22052802002100200228020421060340200241106a2003108f03200228021021070240024002400240200620006b200241106a41086a28020022084f0d00200020086a22092000490d062006410174220a20092009200a491b220b4100480d062006450d0120022802002006200b1027220a0d020c070b200020086a21092002280200210a0c020b200b1026220a450d050b2002200b3602042002200a360200200b21060b20052009360200200a20006a200720081094041a02402002280214450d00200710230b200341246a2103200921002004415c6a22040d000b20012802002001280204200a200910042006450d040c030b20022802042100200128020020012802042002280200220a200241086a280200100420000d020c030b101e000b200b4101102a000b200a10230b200241206a24000bec0203027f017e027f230041c0006b2201240002400240411310262202450d002002410f6a41002800a99943360000200241086a41002900a299433700002002410029009a994337000020024113413310272202450d01200220002900003700132002412b6a200041186a290000370000200241236a200041106a2900003700002002411b6a200041086a29000037000042002103200141206a41186a22004200370300200141206a41106a22044200370300200141206a41086a220542003703002001420037032020024133200141206a1002200141186a2000290300370300200141106a2004290300370300200141086a200529030037030020012001290320370300024002402001412041a886c500410041001001417f460d002001420037032020014120200141206a41084100100141016a41084d0d01200129032021030b20021023200141c0006a240020030f0b41d4aac10041331021000b41134101102a000b41334101102a000b800201017f02400240024020002d0000417b6a220141054b0d00024002400240024020010e06000104020403000b200041086a2d00004101470d03200041146a280200450d03200041106a2802001023200041fc006a2802000d040c050b200041046a2d00004103470d0202402000410c6a280200450d00200041086a28020010230b200041186a280200450d02200041146a2802001023200041fc006a2802000d030c040b200041086a280200450d01200041046a2802001023200041fc006a2802000d020c030b200041086a2d00004105490d00200041306a280200450d002000412c6a28020010230b200041fc006a280200450d010b200028027810230b0bec0301027f230041e0006b22032400200341003a0005024002402000413f4b0d00200320004102743a0000410121040c010b02402000418080014f0d00200320004106763a000141022104200341013a0005200320004102744101723a00000c010b024020004180808080044f0d00200341033a0005200320004106763a000120032000410e763a0002200320004116763a0003200320004102744102723a0000410421040c010b200341043a0005200341033a0000200320003a0001200320004108763a0002200320004110763a0003200320004118763a0004410521040b200320043a0005024002402001280200220028020822012002490d0020002802002100200320023602082003200436020c20042002470d012000200320021094041a200341003a0005200341e0006a24000f0b20022001108c01000b2003200341086a36024020032003410c6a360244200341c8006a41146a4100360200200341286a41146a4103360200200341346a4104360200200341106a41146a4103360200200341a886c5003602582003420137024c200341a881c5003602482003410436022c20034203370214200341d480c5003602102003200341c8006a3602382003200341c4006a3602302003200341c0006a3602282003200341286a360220200341106a41e481c5001061000bda0601077f230041106b220224000240024002400240024002400240024002400240024002400240024020002802704101470d00200141046a280200200141086a2802002203470d01200341016a22042003490d0c20034101742205200420042005491b22054100480d0c2003450d0320012802002003200510272204450d040c090b200141046a280200200141086a2802002203470d01200341016a22042003490d0b20034101742205200420042005491b22054100480d0b2003450d0420012802002003200510272204450d050c060b200128020021040c080b200128020021040c050b2005102622040d050b20054101102a000b2005102622040d010b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a0000200041f4006a280200210602400240024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d0820044101742203200520052003491b22034100480d082004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a20063600000c020b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a41013a00000b2000200110dd0220002802782103200220004180016a280200220036020c2002410c6a2001104102402000450d0020004105742106200141086a2104200141046a21070340024002400240024020072802002205200428020022006b41204f0d00200041206a22082000490d0620054101742200200820082000491b22004100480d062005450d01200128020020052000102722050d020c070b200128020021050c020b200010262205450d050b2001200536020020072000360200200428020021000b2004200041206a360200200520006a220041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a29000037000020002003290000370000200341206a2103200641606a22060d000b0b200241106a24000f0b101e000b20004101102a000b6501027f230041206b220224002001411c6a280200210320012802182101200241086a41106a200041106a290200370300200241086a41086a200041086a2902003703002002200029020037030820012003200241086a10e2032100200241206a240020000bc80201037f23004180016b22022400200028020021000240024002400240200128020022034110710d002000280200210420034120710d012004ad4101200110cc02210020024180016a240020000f0b20002802002104410021000340200220006a41ff006a2004410f712203413072200341d7006a2003410a491b3a00002000417f6a2100200441047622040d000b20004180016a22044181014f0d012001410141d889c5004102200220006a4180016a410020006b109701210020024180016a240020000f0b410021000340200220006a41ff006a2004410f712203413072200341376a2003410a491b3a00002000417f6a2100200441047622040d000b20004180016a22044181014f0d012001410141d889c5004102200220006a4180016a410020006b109701210020024180016a240020000f0b20044180011048000b20044180011048000bfecb0103077f027e027f230041106b22022400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020002d0000417f6a2203410a4b0d00024020030e0b00070405020809060b030a000b200141046a280200200141086a2802002203470d11200341016a22042003490d4c20034101742205200420042005491b22054100480d4c2003450d2320012802002003200510272204450d240c4a0b200141046a280200200141086a2802002203470d0a200341016a22042003490d4b20034101742205200420042005491b22054100480d4b2003450d1620012802002003200510272204450d170c470b200141046a2205280200200141086a22042802002203470d0a200341016a22062003490d4a20034101742207200620062007491b22074100480d4a2003450d1720012802002003200710272206450d180c420b200141046a280200200141086a2802002203470d0a200341016a22042003490d3e20034101742205200420042005491b22054100480d3e2003450d1820012802002003200510272204450d190c3c0b200141046a280200200141086a2802002203470d0a200341016a22042003490d4820034101742205200420042005491b22054100480d482003450d1920012802002003200510272204450d1a0c390b200141046a280200200141086a2802002203470d0a200341016a22042003490d4720034101742205200420042005491b22054100480d472003450d1a20012802002003200510272204450d1b0c360b200141046a280200200141086a2802002203470d0a200341016a22042003490d3b20034101742205200420042005491b22054100480d3b2003450d1b20012802002003200510272204450d1c0c330b200141046a280200200141086a2802002203470d0b200341016a22042003490d4520034101742205200420042005491b22054100480d452003450d1e20012802002003200510272204450d1f0c300b200141046a280200200141086a2802002203470d0b200341016a22042003490d4420034101742205200420042005491b22054100480d442003450d1f20012802002003200510272204450d200c2d0b200141046a2205280200200141086a22032802002204470d0b200441016a22062004490d4320044101742207200620062007491b22074100480d432004450d2020012802002004200710272206450d210c2a0b200141046a280200200141086a2802002203470d0b200341016a22042003490d3720034101742205200420042005491b22054100480d372003450d2120012802002003200510272204450d220c270b200141046a280200200141086a2802002203470d0b200341016a22042003490d3620034101742205200420042005491b22054100480d362003450d2220012802002003200510272204450d230c240b200128020021040c3d0b200128020021060c380b200128020021040c320b200128020021040c2f0b200128020021040c2c0b200128020021040c290b200128020021040c390b200128020021040c250b200128020021040c220b200128020021060c1f0b200128020021040c1c0b200128020021040c190b2005102622040d300b20054101102a000b2007102622060d2a0b20074101102a000b2005102622040d230b20054101102a000b2005102622040d1f0b20054101102a000b2005102622040d1b0b20054101102a000b2005102622040d170b20054101102a000b2005102622040d260b20054101102a000b2005102622040d110b20054101102a000b2005102622040d0d0b20054101102a000b2007102622060d090b20074101102a000b2005102622040d050b20054101102a000b2005102622040d010b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41093a000002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200041086a2d0000417f6a220341034b0d00024020030e0400040203000b200141046a280200200141086a2802002203470d07200341016a22042003490d2d20034101742205200420042005491b22054100480d2d2003450d0f20012802002003200510272204450d100c1b0b200141046a28020020052802002203470d03200341016a22042003490d2c20034101742205200420042005491b22054100480d2c2003450d0820012802002003200510272204450d090c180b200141046a280200200141086a2802002203470d03200341016a22042003490d2b20034101742205200420042005491b22054100480d2b2003450d0920012802002003200510272204450d0a0c150b200141046a280200200141086a2802002203470d03200341016a22042003490d2a20034101742205200420042005491b22054100480d2a2003450d0a20012802002003200510272204450d0b0c120b200141046a280200200141086a2802002203470d04200341016a22042003490d2920034101742205200420042005491b22054100480d292003450d0d20012802002003200510272204450d0e0c0f0b200128020021040c150b200128020021040c120b200128020021040c0f0b200128020021040c140b200128020021040c0b0b2005102622040d0f0b20054101102a000b2005102622040d0b0b20054101102a000b2005102622040d070b20054101102a000b2005102622040d0b0b20054101102a000b2005102622040d010b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a00002000412c6a280200210602400240024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d1d20044101742203200520052003491b22034100480d1d2004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341046a360200200420036a2006360000200041386a2903002109200041306a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22052003490d1d20044101742203200520052003491b22034100480d1d2004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341106a360200200420036a220320093700082003200a37000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1d20044101742203200520052003491b22034100480d1d2004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200420036a220141186a200041096a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41043a0000200041186a2903002109200041106a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22002003490d1b20044101742203200020002003491b22034100480d1b2004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a220120093700082001200a370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41033a0000200041186a2903002109200041106a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22002003490d1920044101742203200020002003491b22034100480d192004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a220120093700082001200a370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a00002000410c6a280200210002400240024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d1720044101742203200520052003491b22034100480d172004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a2000360000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a0000200041186a2903002109200041106a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22002003490d1520044101742203200020002003491b22034100480d152004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a220120093700082001200a370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a410b3a0000200041026a2104200141046a2802002106200528020021030240024002400240024002400240024002400240024020002d00014101470d0020062003470d01200341016a22002003490d1920034101742205200020002005491b22054100480d192003450d0320012802002003200510272200450d040c090b20062003470d01200341016a22002003490d1820034101742205200020002005491b22054100480d182003450d0420012802002003200510272200450d050c060b200128020021000c080b200128020021000c050b2005102622000d050b20054101102a000b2005102622000d010b20054101102a000b20012000360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200020036a41003a000002400240024002400240200141046a28020020052802002203470d00200341016a22002003490d1520034101742205200020002005491b22054100480d152003450d0120012802002003200510272200450d020c030b200128020021000c030b2005102622000d010b20054101102a000b20012000360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200020036a20042d00003a0000200241106a24000f0b20012000360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200020036a41013a000002400240024002400240200141046a2802002200200528020022036b41204f0d00200341206a22052003490d1320004101742203200520052003491b22034100480d132000450d0120012802002000200310272200450d020c030b200128020021000c030b2003102622000d010b20034101102a000b20012000360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200020036a220141186a200441186a290000370000200141106a200441106a290000370000200141086a200441086a29000037000020012004290000370000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021040b2003200441016a360200200620046a41073a00000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200041046a2d0000417f6a220441044b0d000240024002400240024020040e050004020301000b200528020020032802002204470d08200441016a22062004490d2f20044101742207200620062007491b22074100480d2f2004450d1120012802002004200710272206450d120c210b200528020020032802002204470d04200441016a22062004490d2e20044101742207200620062007491b22074100480d2e2004450d0a20012802002004200710272206450d0b0c1e0b200528020020032802002204470d04200441016a22062004490d2d20044101742207200620062007491b22074100480d2d2004450d0b20012802002004200710272206450d0c0c1b0b200528020020032802002204470d04200441016a22062004490d2c20044101742207200620062007491b22074100480d2c2004450d0c20012802002004200710272206450d0d0c180b200528020020032802002204470d05200441016a22062004490d2b20044101742207200620062007491b22074100480d2b2004450d0f20012802002004200710272206450d100c150b200528020020032802002204470d05200441016a22062004490d3520044101742207200620062007491b22074100480d352004450d1020012802002004200710272206450d110c120b200128020021060c1a0b200128020021060c170b200128020021060c140b200128020021060c190b200128020021060c100b200128020021060c0d0b2007102622060d130b20074101102a000b2007102622060d0f0b20074101102a000b2007102622060d0b0b20074101102a000b2007102622060d0f0b20074101102a000b2007102622060d050b20074101102a000b2007102622060d010b20074101102a000b20012006360200200141046a2007360200200141086a28020021040b2003200441016a360200200620046a41003a00000240024002400240024020052802002206200328020022046b41204f0d00200441206a22072004490d1b20064101742204200720072004491b22044100480d1b2006450d0120012802002006200410272206450d020c030b200128020021060c030b2004102622060d010b20044101102a000b20012006360200200141046a2004360200200141086a28020021040b2003200441206a360200200620046a220441186a200041056a220641186a290000370000200441106a200641106a290000370000200441086a200641086a29000037000020042006290000370000200041c8006a28020021070240024002400240024020052802002206200328020022046b41044f0d00200441046a22082004490d1b20064101742204200820082004491b22044100480d1b2006450d0120012802002006200410272206450d020c030b200128020021060c030b2004102622060d010b20044101102a000b20012006360200200141046a2004360200200141086a28020021040b2003200441046a360200200620046a20073600000240024002400240024020052802002206200328020022046b41204f0d00200441206a22072004490d1b20064101742204200720072004491b22044100480d1b2006450d0120012802002006200410272206450d020c030b200128020021060c030b2004102622060d010b20044101102a000b20012006360200200141046a2004360200200141086a28020021040b2003200441206a360200200620046a220441186a200041256a220641186a290000370000200441106a200641106a290000370000200441086a200641086a29000037000020042006290000370000200041cc006a28020021060240024002400240024020052802002200200328020022046b41044f0d00200441046a22052004490d1b20004101742204200520052004491b22044100480d1b2000450d0120012802002000200410272200450d020c030b200128020021000c030b2004102622000d010b20044101102a000b20012000360200200141046a2004360200200141086a28020021040b2003200441046a360200200020046a2006360000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021040b2003200441016a360200200620046a41023a00000240024002400240024020052802002205200328020022046b41204f0d00200441206a22062004490d1920054101742204200620062004491b22044100480d192005450d0120012802002005200410272205450d020c030b200128020021050c030b2004102622050d010b20044101102a000b20012005360200200141046a2004360200200141086a28020021040b2003200441206a360200200520046a220141186a200041056a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021040b2003200441016a360200200620046a41043a00000240024002400240024020052802002206200328020022046b41204f0d00200441206a22072004490d1720064101742204200720072004491b22044100480d172006450d0120012802002006200410272206450d020c030b200128020021060c030b2004102622060d010b20044101102a000b20012006360200200141046a2004360200200141086a28020021040b2003200441206a360200200620046a220441186a200041056a220641186a290000370000200441106a200641106a290000370000200441086a200641086a2900003700002004200629000037000002400240024002400240200528020020032802002204470d00200441016a22052004490d1720044101742206200520052006491b22064100480d172004450d0120012802002004200610272205450d020c030b200128020021050c030b2006102622050d010b20064101102a000b20012005360200200141046a2006360200200141086a28020021040b2003200441016a360200200520046a200041256a2d00003a0000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021040b2003200441016a360200200620046a41033a00000240024002400240024020052802002205200328020022046b41204f0d00200441206a22062004490d1520054101742204200620062004491b22044100480d152005450d0120012802002005200410272205450d020c030b200128020021050c030b2004102622050d010b20044101102a000b20012005360200200141046a2004360200200141086a28020021040b2003200441206a360200200520046a220141186a200041056a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021040b2003200441016a360200200620046a41053a00000240024002400240024020052802002206200328020022046b41204f0d00200441206a22072004490d1320064101742204200720072004491b22044100480d132006450d0120012802002006200410272206450d020c030b200128020021060c030b2004102622060d010b20044101102a000b20012006360200200141046a2004360200200141086a28020021040b2003200441206a360200200620046a220441186a200041056a220641186a290000370000200441106a200641106a290000370000200441086a200641086a2900003700002004200629000037000002400240024002400240200528020020032802002204470d00200441016a22052004490d1320044101742206200520052006491b22064100480d132004450d0120012802002004200610272205450d020c030b200128020021050c030b2006102622050d010b20064101102a000b20012005360200200141046a2006360200200141086a28020021040b2003200441016a360200200520046a200041256a2d00003a0000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021040b2003200441016a360200200620046a41013a00000240024002400240024020052802002206200328020022046b41204f0d00200441206a22072004490d1120064101742204200720072004491b22044100480d112006450d0120012802002006200410272206450d020c030b200128020021060c030b2004102622060d010b20044101102a000b20012006360200200141046a2004360200200141086a28020021040b2003200441206a360200200620046a220441186a200041056a220641186a290000370000200441106a200641106a290000370000200441086a200641086a290000370000200420062900003700000240024002400240024020052802002206200328020022046b41204f0d00200441206a22072004490d1120064101742204200720072004491b22044100480d112006450d0120012802002006200410272206450d020c030b200128020021060c030b2004102622060d010b20044101102a000b20012006360200200141046a2004360200200141086a28020021040b2003200441206a360200200620046a220441186a200041256a220641186a290000370000200441106a200641106a290000370000200441086a200641086a2900003700002004200629000037000002400240024002400240200528020020032802002204470d00200441016a22062004490d1120044101742207200620062007491b22074100480d112004450d0120012802002004200710272206450d020c030b200128020021060c030b2007102622060d010b20074101102a000b20012006360200200141046a2007360200200141086a28020021040b2003200441016a360200200620046a200041c5006a2d00003a0000200041c8006a28020021070240024002400240024020052802002206200328020022046b41044f0d00200441046a22082004490d1120064101742204200820082004491b22044100480d112006450d0120012802002006200410272206450d020c030b200128020021060c030b2004102622060d010b20044101102a000b20012006360200200141046a2004360200200141086a28020021040b2003200441046a360200200620046a2007360000200041cc006a28020021060240024002400240024020052802002200200328020022046b41044f0d00200441046a22052004490d1120004101742204200520052004491b22044100480d112000450d0120012802002000200410272200450d020c030b200128020021000c030b2004102622000d010b20044101102a000b20012000360200200141046a2004360200200141086a28020021040b2003200441046a360200200020046a2006360000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41063a00000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200041046a2d000022034101460d00024020034102460d0020034103470d02200141046a280200200141086a2802002203470d05200341016a22042003490d2c20034101742205200420042005491b22054100480d2c2003450d0b20012802002003200510272204450d0c0c150b200141046a280200200141086a2802002203470d02200341016a22042003490d2b20034101742205200420042005491b22054100480d2b2003450d0620012802002003200510272204450d070c120b200141046a28020020052802002203470d02200341016a22042003490d2a20034101742205200420042005491b22054100480d2a2003450d0720012802002003200510272204450d080c0f0b200141046a280200200141086a2802002203470d03200341016a22042003490d2920034101742205200420042005491b22054100480d292003450d0a20012802002003200510272204450d0b0c0c0b200128020021040c100b200128020021040c0d0b200128020021040c100b200128020021040c090b2005102622040d0b0b20054101102a000b2005102622040d070b20054101102a000b2005102622040d090b20054101102a000b2005102622040d010b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d2020044101742203200520052003491b22034100480d202004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041056a220441186a290000370000200341106a200441106a290000370000200341086a200441086a2900003700002003200429000037000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d2020044101742203200520052003491b22034100480d202004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200420036a220141186a200041256a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1e20044101742203200520052003491b22034100480d1e2004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200420036a220141186a200041056a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a0000200041086a280200210002400240024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d1c20044101742203200520052003491b22034100480d1c2004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a2000360000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41033a0000200041086a28020021032002200041106a280200220436020c2002410c6a200110410240024002402004450d0020044105742107200141046a21080340024002400240024020082802002206200528020022046b41204f0d00200441206a220b2004490d1d20064101742204200b200b2004491b22044100480d1d2006450d01200128020020062004102722060d020c060b200128020021060c020b200410262206450d040b2001200636020020082004360200200528020021040b2005200441206a360200200620046a220441186a200341186a290000370000200441106a200341106a290000370000200441086a200341086a29000037000020042003290000370000200341206a2103200741606a22070d000b0b200041146a280200210320022000411c6a280200220436020c2002410c6a200110412004450d1120044105742106200141086a2100200141046a21070340024002400240024020072802002205200028020022046b41204f0d00200441206a22082004490d1c20054101742204200820082004491b22044100480d1c2005450d01200128020020052004102722050d020c060b200128020021050c020b200410262205450d040b2001200536020020072004360200200028020021040b2000200441206a360200200520046a220441186a200341186a290000370000200441106a200341106a290000370000200441086a200341086a29000037000020042003290000370000200341206a2103200641606a22060d000c120b0b20044101102a000b20044101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a00000240024002400240024002400240024002400240024002400240024002400240200041086a2d000022034102460d00024020034101460d0020030d1e200141046a280200200141086a2802002203470d04200341016a22042003490d2420034101742205200420042005491b22054100480d242003450d0920012802002003200510272204450d0a0c0f0b200141046a280200200141086a2802002203470d01200341016a22042003490d2320034101742205200420042005491b22054100480d232003450d0420012802002003200510272204450d050c0c0b200141046a28020020052802002203470d01200341016a22042003490d2220034101742205200420042005491b22054100480d222003450d0520012802002003200510272204450d060c090b200128020021040c0b0b200128020021040c080b200128020021040c0b0b2005102622040d070b20054101102a000b2005102622040d030b20054101102a000b2005102622040d050b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1c20044101742203200520052003491b22034100480d1c2004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a2900003700002003200429000037000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1c20044101742203200520052003491b22034100480d1c2004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041296a220441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200041d8006a2903002109200041d0006a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22052003490d1c20044101742203200520052003491b22034100480d1c2004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341106a360200200420036a220320093700082003200a370000200041e8006a2903002109200041e0006a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22002003490d1c20044101742203200020002003491b22034100480d1c2004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a220120093700082001200a370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1a20044101742203200520052003491b22034100480d1a2004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200420036a220141186a200041096a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1820044101742203200520052003491b22034100480d182004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200041386a2903002109200041306a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22002003490d1820044101742203200020002003491b22034100480d182004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a220120093700082001200a370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41083a000002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d0b20034101742205200420042005491b22044100480d0b2003450d0120012802002003200410272205450d020c030b200128020021050c030b2004102622050d010b20044101102a000b20012005360200200141046a2004360200200141086a28020021030b200141086a2204200341016a360200200520036a41003a0000200041046a280200210320022000410c6a280200220036020c2002410c6a200110412000450d0b2003200041286c6a2108200141046a2105024002400340024002400240024020052802002206200428020022006b41204f0d00200041206a22072000490d0d20064101742200200720072000491b22004100480d0d2006450d01200128020020062000102722060d020c050b200128020021060c020b200010262206450d030b2001200636020020052000360200200428020021000b2004200041206a360200200620006a220041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a29000037000020002003290000370000200341206a2903002109024002400240024020052802002206200428020022006b41084f0d00200041086a22072000490d0d20064101742200200720072000491b22004100480d0d2006450d01200128020020062000102722060d020c060b200128020021060c020b200010262206450d040b2001200636020020052000360200200428020021000b2004200041086a360200200620006a20093700002008200341286a2203470d000c0e0b0b20004101102a000b20004101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41043a000002400240024002400240024002400240024002400240024002400240024002400240200041086a2d000022034101460d0020034102470d01200141046a280200200141086a2802002203470d03200341016a22042003490d2020034101742205200420042005491b22054100480d202003450d0720012802002003200510272204450d080c0f0b200141046a28020020052802002203470d01200341016a22042003490d1f20034101742205200420042005491b22054100480d1f2003450d0420012802002003200510272204450d050c0c0b200141046a280200200141086a2802002203470d02200341016a22042003490d1e20034101742205200420042005491b22054100480d1e2003450d0720012802002003200510272204450d080c090b200128020021040c0b0b200128020021040c0c0b200128020021040c070b2005102622040d070b20054101102a000b2005102622040d070b20054101102a000b2005102622040d010b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a0000200041186a2903002109200041106a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22002003490d1820044101742203200020002003491b22034100480d182004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a220120093700082001200a370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1620044101742203200520052003491b22034100480d162004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a290000370000200320042900003700002000412c6a280200210002400240024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d1620044101742203200520052003491b22034100480d162004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a2000360000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d1420044101742203200520052003491b22034100480d142004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200041386a2903002109200041306a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22002003490d1420044101742203200020002003491b22034100480d142004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a220120093700082001200a370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41033a000002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d1220034101742205200420042005491b22054100480d122003450d0120012802002003200510272204450d020c030b200128020021040c030b2005102622040d010b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a0000200041046a280200210002400240024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d1220044101742203200520052003491b22034100480d122004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a2000360000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a410a3a00000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200041086a2d0000417f6a220341044b0d000240024002400240024020030e050004020301000b200141046a280200200141086a2802002203470d08200341016a22042003490d2320034101742205200420042005491b22054100480d232003450d1120012802002003200510272204450d120c210b200141046a280200200141086a2802002203470d04200341016a22042003490d2220034101742205200420042005491b22054100480d222003450d0a20012802002003200510272204450d0b0c1e0b200141046a280200200141086a2802002203470d04200341016a22042003490d2120034101742205200420042005491b22054100480d212003450d0b20012802002003200510272204450d0c0c1b0b200141046a280200200141086a2802002203470d04200341016a22042003490d2020034101742205200420042005491b22054100480d202003450d0c20012802002003200510272204450d0d0c180b200141046a280200200141086a2802002203470d05200341016a22042003490d1f20034101742205200420042005491b22054100480d1f2003450d0f20012802002003200510272204450d100c150b200141046a28020020052802002203470d05200341016a22042003490d1e20034101742205200420042005491b22054100480d1e2003450d1020012802002003200510272204450d110c120b200128020021040c1a0b200128020021040c170b200128020021040c140b200128020021040c190b200128020021040c100b200128020021040c0d0b2005102622040d130b20054101102a000b2005102622040d0f0b20054101102a000b2005102622040d0b0b20054101102a000b2005102622040d0f0b20054101102a000b2005102622040d050b20054101102a000b2005102622040d010b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d0f20044101742203200520052003491b22034100480d0f2004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a2900003700002003200429000037000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d0f20044101742203200520052003491b22034100480d0f2004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041296a220441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200041d8006a2903002109200041d0006a290300210a02400240024002400240200141046a2802002204200528020022036b41104f0d00200341106a22002003490d0f20044101742203200020002003491b22034100480d0f2004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341106a360200200420036a220120093700082001200a370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41023a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d0d20044101742203200520052003491b22034100480d0d2004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200420036a220141186a200041096a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41043a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d0b20044101742203200520052003491b22034100480d0b2004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a2900003700002003200429000037000002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d0b20034101742205200420042005491b22054100480d0b2003450d0120012802002003200510272204450d020c030b200128020021040c030b2005102622040d010b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a200341016a360200200420036a200041296a2d00003a0000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41033a00002000410c6a280200210002400240024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d0920044101742203200520052003491b22034100480d092004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a2000360000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41053a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d0720044101742203200520052003491b22034100480d072004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a290000370000200320042900003700002000412c6a28020021062002200041346a280200220336020c2002410c6a2001104102400240024002400240200141046a2802002200200528020022046b20034f0d00200420036a22052004490d0720004101742204200520052004491b22044100480d072000450d0120012802002000200410272200450d020c030b200128020021000c030b2004102622000d010b20044101102a000b20012000360200200141046a2004360200200141086a28020021040b200141086a200420036a360200200020046a200620031094041a200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d0520044101742203200520052003491b22034100480d052004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041096a220441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d0320044101742203200520052003491b22034100480d032004450d0120012802002004200310272204450d020c040b200128020021040c040b2003102622040d020b20034101102a000b101e000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341206a360200200420036a220141186a200041296a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41053a0000024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200041086a2d0000417f6a220341094b0d0002400240024002400240024002400240024020030e0a00060304010708050a02000b200528020020042802002203470d0f200341016a22062003490d4720034101742207200620062007491b22074100480d472003450d1f20012802002003200710272206450d200c3f0b200528020020042802002203470d09200341016a22062003490d4620034101742207200620062007491b22074100480d462003450d1420012802002003200710272206450d150c3c0b200528020020042802002203470d09200341016a22062003490d4520034101742207200620062007491b22074100480d452003450d1520012802002003200710272206450d160c390b200528020020042802002203470d09200341016a22062003490d4420034101742207200620062007491b22074100480d442003450d1620012802002003200710272206450d170c360b200528020020042802002203470d09200341016a22062003490d4320034101742207200620062007491b22074100480d432003450d1720012802002003200710272206450d180c330b200528020020042802002203470d09200341016a22062003490d4220034101742207200620062007491b22074100480d422003450d1820012802002003200710272206450d190c300b200528020020042802002203470d0a200341016a22002003490d4120034101742205200020002005491b22054100480d412003450d1b20012802002003200510272200450d1c0c2d0b200528020020042802002203470d0a200341016a22062003490d4020034101742207200620062007491b22074100480d402003450d1c20012802002003200710272206450d1d0c2a0b200528020020042802002203470d0a200341016a22062003490d3f20034101742207200620062007491b22074100480d3f2003450d1d20012802002003200710272206450d1e0c270b200528020020042802002203470d0a200341016a22062003490d3e20034101742207200620062007491b22074100480d3e2003450d1e20012802002003200710272206450d1f0c240b200528020020042802002203470d0a200341016a22062003490d3d20034101742207200620062007491b22074100480d3d2003450d1f20012802002003200710272206450d200c210b200128020021060c330b200128020021060c300b200128020021060c2d0b200128020021060c2a0b200128020021060c270b200128020021060c300b200128020021000c230b200128020021060c200b200128020021060c1d0b200128020021060c1a0b200128020021060c170b2007102622060d270b20074101102a000b2007102622060d230b20074101102a000b2007102622060d1f0b20074101102a000b2007102622060d1b0b20074101102a000b2007102622060d170b20074101102a000b2007102622060d1f0b20074101102a000b2005102622000d110b20054101102a000b2007102622060d0d0b20074101102a000b2007102622060d090b20074101102a000b2007102622060d050b20074101102a000b2007102622060d010b20074101102a000b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41093a00000240024002400240024020052802002205200428020022036b41204f0d00200341206a22062003490d1f20054101742203200620062003491b22034100480d1f2005450d0120012802002005200310272205450d020c030b200128020021050c030b2003102622050d010b20034101102a000b20012005360200200141046a2003360200200141086a28020021030b2004200341206a360200200520036a220141186a200041096a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41003a00002000410c6a28020021070240024002400240024020052802002206200428020022036b41044f0d00200341046a22082003490d1d20064101742203200820082003491b22034100480d1d2006450d0120012802002006200310272206450d020c030b200128020021060c030b2003102622060d010b20034101102a000b20012006360200200141046a2003360200200141086a28020021030b2004200341046a360200200620036a2007360000200041186a2903002109200041106a290300210a0240024002400240024020052802002200200428020022036b41104f0d00200341106a22052003490d1d20004101742203200520052003491b22034100480d1d2000450d0120012802002000200310272200450d020c030b200128020021000c030b2003102622000d010b20034101102a000b20012000360200200141046a2003360200200141086a28020021030b2004200341106a360200200020036a220120093700082001200a370000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41073a00002000410c6a28020021070240024002400240024020052802002206200428020022036b41044f0d00200341046a22082003490d1b20064101742203200820082003491b22034100480d1b2006450d0120012802002006200310272206450d020c030b200128020021060c030b2003102622060d010b20034101102a000b20012006360200200141046a2003360200200141086a28020021030b2004200341046a360200200620036a200736000002400240024002400240200528020020042802002203470d00200341016a22052003490d1b20034101742206200520052006491b22064100480d1b2003450d0120012802002003200610272205450d020c030b200128020021050c030b2006102622050d010b20064101102a000b20012005360200200141046a2006360200200141086a28020021030b2004200341016a360200200520036a200041096a2d00003a0000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41063a00002000410c6a28020021060240024002400240024020052802002200200428020022036b41044f0d00200341046a22052003490d1920004101742203200520052003491b22034100480d192000450d0120012802002000200310272200450d020c030b200128020021000c030b2003102622000d010b20034101102a000b20012000360200200141046a2003360200200141086a28020021030b2004200341046a360200200020036a2006360000200241106a24000f0b20012000360200200141046a2005360200200141086a28020021030b2004200341016a360200200020036a41023a0000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41083a00000240024002400240024020052802002206200428020022036b41204f0d00200341206a22072003490d1520064101742203200720072003491b22034100480d152006450d0120012802002006200310272206450d020c030b200128020021060c030b2003102622060d010b20034101102a000b20012006360200200141046a2003360200200141086a28020021030b2004200341206a360200200620036a220341186a200041096a220641186a290000370000200341106a200641106a290000370000200341086a200641086a290000370000200320062900003700000240024002400240024020052802002205200428020022036b41204f0d00200341206a22062003490d1520054101742203200620062003491b22034100480d152005450d0120012802002005200310272205450d020c030b200128020021050c030b2003102622050d010b20034101102a000b20012005360200200141046a2003360200200141086a28020021030b2004200341206a360200200520036a220141186a200041296a220341186a290000370000200141106a200341106a290000370000200141086a200341086a29000037000020012003290000370000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41043a00002000410c6a28020021060240024002400240024020052802002200200428020022036b41044f0d00200341046a22052003490d1320004101742203200520052003491b22034100480d132000450d0120012802002000200310272200450d020c030b200128020021000c030b2003102622000d010b20034101102a000b20012000360200200141046a2003360200200141086a28020021030b2004200341046a360200200020036a2006360000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41033a00002000410c6a28020021070240024002400240024020052802002206200428020022036b41044f0d00200341046a22082003490d1120064101742203200820082003491b22034100480d112006450d0120012802002006200310272206450d020c030b200128020021060c030b2003102622060d010b20034101102a000b20012006360200200141046a2003360200200141086a28020021030b2004200341046a360200200620036a200736000002400240024002400240024002400240024002400240024002400240024002400240200041096a2d000022034101460d0020034102470d01200528020020042802002203470d03200341016a22002003490d1d20034101742205200020002005491b22054100480d1d2003450d0720012802002003200510272200450d080c0f0b200528020020042802002203470d01200341016a22002003490d1c20034101742205200020002005491b22054100480d1c2003450d0420012802002003200510272200450d050c0c0b200528020020042802002203470d02200341016a22002003490d1b20034101742205200020002005491b22054100480d1b2003450d0720012802002003200510272200450d080c090b200128020021000c0b0b200128020021000c0c0b200128020021000c070b2005102622000d070b20054101102a000b2005102622000d070b20054101102a000b2005102622000d010b20054101102a000b20012000360200200141046a2005360200200141086a28020021030b2004200341016a360200200020036a41003a00000c0a0b20012000360200200141046a2005360200200141086a28020021030b2004200341016a360200200020036a41013a0000200241106a24000f0b20012000360200200141046a2005360200200141086a28020021030b2004200341016a360200200020036a41023a0000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a410a3a00000240024002400240024020052802002206200428020022036b41204f0d00200341206a22072003490d0f20064101742203200720072003491b22034100480d0f2006450d0120012802002006200310272206450d020c030b200128020021060c030b2003102622060d010b20034101102a000b20012006360200200141046a2003360200200141086a28020021030b2004200341206a360200200620036a220341186a200041096a220641186a290000370000200341106a200641106a290000370000200341086a200641086a290000370000200320062900003700000240024002400240024020052802002206200428020022036b41204f0d00200341206a22072003490d0f20064101742203200720072003491b22034100480d0f2006450d0120012802002006200310272206450d020c030b200128020021060c030b2003102622060d010b20034101102a000b20012006360200200141046a2003360200200141086a28020021030b2004200341206a360200200620036a220341186a200041296a220641186a290000370000200341106a200641106a290000370000200341086a200641086a29000037000020032006290000370000200041d0006a29030021090240024002400240024020052802002200200428020022036b41084f0d00200341086a22052003490d0f20004101742203200520052003491b22034100480d0f2000450d0120012802002000200310272200450d020c030b200128020021000c030b2003102622000d010b20034101102a000b20012000360200200141046a2003360200200141086a28020021030b2004200341086a360200200020036a2009370000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41053a00002000410c6a28020021060240024002400240024020052802002200200428020022036b41044f0d00200341046a22052003490d0d20004101742203200520052003491b22034100480d0d2000450d0120012802002000200310272200450d020c030b200128020021000c030b2003102622000d010b20034101102a000b20012000360200200141046a2003360200200141086a28020021030b2004200341046a360200200020036a2006360000200241106a24000f0b20012006360200200141046a2007360200200141086a28020021030b2004200341016a360200200620036a41013a00002000410c6a28020021070240024002400240024020052802002206200428020022036b41044f0d00200341046a22082003490d0b20064101742203200820082003491b22034100480d0b2006450d0120012802002006200310272206450d020c030b200128020021060c030b2003102622060d010b20034101102a000b20012006360200200141046a2003360200200141086a28020021030b2004200341046a360200200620036a2007360000200041286a2903002109200041206a290300210a0240024002400240024020052802002206200428020022036b41104f0d00200341106a22072003490d0b20064101742203200720072003491b22034100480d0b2006450d0120012802002006200310272206450d020c030b200128020021060c030b2003102622060d010b20034101102a000b20012006360200200141046a2003360200200141086a28020021030b200141086a220b200341106a360200200620036a220320093700082003200a370000200041106a28020021032002200041186a280200220036020c2002410c6a200110412000450d0020004105742107200141046a210c0340024002400240024020052802002206200428020022006b41204f0d00200041206a22082000490d0b20064101742200200820082000491b22004100480d0b2006450d01200128020020062000102722060d020c060b200128020021060c020b200010262206450d040b20012006360200200c2000360200200b28020021000b2004200041206a360200200620006a220041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a29000037000020002003290000370000200341206a2103200741606a22070d000b0b200241106a24000f0b20004101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a0000200141046a28020021042005280200210302400240024002400240024002400240024002400240200041016a2d00004101470d0020042003470d01200341016a22042003490d0d20034101742200200420042000491b22004100480d0d2003450d0320012802002003200010272204450d040c090b20042003470d01200341016a22042003490d0c20034101742200200420042000491b22004100480d0c2003450d0420012802002003200010272204450d050c060b200128020021040c080b200128020021040c050b2000102622040d050b20004101102a000b2000102622040d010b20004101102a000b20012004360200200141046a2000360200200141086a28020021030b200141086a200341016a360200200420036a41003a0000200241106a24000f0b20012004360200200141046a2000360200200141086a28020021030b200141086a200341016a360200200420036a41013a0000200241106a24000f0b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41013a000002400240024002400240200141046a28020020052802002203470d00200341016a22042003490d0520034101742205200420042005491b22054100480d052003450d0120012802002003200510272204450d020c030b200128020021040c030b2005102622040d010b20054101102a000b20012004360200200141046a2005360200200141086a28020021030b200141086a2205200341016a360200200420036a41003a000002400240024002400240200141046a2802002204200528020022036b41204f0d00200341206a22052003490d0520044101742203200520052003491b22034100480d052004450d0120012802002004200310272204450d020c030b200128020021040c030b2003102622040d010b20034101102a000b20012004360200200141046a2003360200200141086a28020021030b200141086a2205200341206a360200200420036a220341186a200041086a220441186a290000370000200341106a200441106a290000370000200341086a200441086a29000037000020032004290000370000200041046a2802002100024002400240200141046a2802002204200528020022036b41044f0d00200341046a22052003490d0320044101742203200520052003491b22034100480d032004450d0120012802002004200310272204450d020c040b200128020021040c040b2003102622040d020b20034101102a000b101e000b20012004360200200141046a2003360200200141086a28020021030b200141086a200341046a360200200420036a2000360000200241106a24000b130020004105360204200041b89ec3003602000b130020004106360204200041baa3c3003602000bce0101047f230041206b22002400024002400240418595c300411041a886c500410041001001417f460d002000410036021041012101418595c3004110200041106a41044100100141016a41044d0d0220002802102102418595c300411010030c010b410021010b200041106a41086a220342003703002000420037031041a895c3004115200041106a1000200041086a20032903003703002000200029031037030020002002410020011b36021020004110200041106a41041004200041206a24000f0b41d4aac10041331021000b13002000410d360204200041c0a3c3003602000b970101057f230041206b22022400200241186a22034200370300200241106a22044200370300200241086a22054200370300200242003703000240412010262206450d0020062002290300370000200042a0808080800437020420002006360200200641186a2003290300370000200641106a2004290300370000200641086a2005290300370000200241206a24000f0b41204101102a000b7901027f230041106b2202240020024100360208200242013703000240410110262203450d00200341003a00002002428180808010370204200220033602002002410036020c2002410c6a20021041200041086a200241086a28020036020020002002290300370200200241106a24000f0b41014101102a000b8e1206037f017e057f017e047f027e230041d0016b22012400200141b0016a41086a22024200370300200142003703b00141a895c3004115200141b0016a1000200141f0006a41086a22032002290300370300200120012903b001370370200141f0006a4110100320024200370300200142003703b00141bd95c300411a200141b0016a100020032002290300370300200120012903b001370370200141f0006a41101003200141af98c300410d109201200129030821042001280200210520024200370300200142003703b00141fc9cc3004111200141b0016a100020032002290300370300200120012903b001370370024002400240024002400240024002400240200141f0006a411041a886c500410041001001417f460d00200141c8016a4200370300200141b0016a41106a420037030020024200370300200142003703b001200141f0006a4110200141b0016a4120410010012202417f460d022002411f4d0d0220014190016a41186a2206200141b0016a41186a220229030037030020014190016a41106a2207200141b0016a41106a220329030037030020014190016a41086a2208200141b0016a41086a2209290300370300200120012903b00137039001200141f0006a4110100320022006290300370300200320072903003703002009200829030037030020012001290390013703b001200141106a41186a2002290300370300200141106a41106a2003290300370300200141106a41086a2009290300370300200120012903b0013703100c010b200141b0016a41186a20014190016a41186a290300370300200141b0016a41106a20014190016a41106a290300370300200220014190016a41086a29030037030020012001290390013703b001200141106a41186a4200370300200141106a41106a4200370300200141106a41086a4200370300200142003703100b4200210a200141b0016a41086a22024200370300200142003703b00141fd98c300410d200141b0016a1000200141f0006a41086a2002290300370300200120012903b00137037002400240200141f0006a411041a886c500410041001001417f460d0020014210370294012001200141f0006a36029001200141b0016a20014190016a10a90220012802b0012206450d0520012902b401210a200141f0006a411010030c010b410421060b200141b0016a41086a22024200370300200142003703b00141bc98c3004115200141b0016a1000200141f0006a41086a2002290300370300200120012903b00137037002400240200141f0006a411041a886c500410041001001417f460d00200141c8016a4200370300200141b0016a41106a420037030020024200370300200142003703b001200141f0006a4110200141b0016a4120410010012202417f460d032002411f4d0d0320014190016a41186a2207200141b0016a41186a220229030037030020014190016a41106a2208200141b0016a41106a220329030037030020014190016a41086a220b200141b0016a41086a2209290300370300200120012903b00137039001200141f0006a4110100320022007290300370300200320082903003703002009200b29030037030020012001290390013703b001200141306a41186a2002290300370300200141306a41106a2003290300370300200141306a41086a2009290300370300200120012903b0013703300c010b200141b0016a41186a20014190016a41186a290300370300200141b0016a41106a20014190016a41106a290300370300200220014190016a41086a29030037030020012001290390013703b001200141306a41186a4200370300200141306a41106a4200370300200141306a41086a4200370300200142003703300b200141f0006a41186a22024200370300200141f0006a41106a22034200370300200141f0006a41086a2209420037030020014200370370200141f0006a1015200141d0006a41186a2002290300370300200141d0006a41106a2003290300370300200141d0006a41086a200929030037030020012001290370370350200141b0016a41186a2207200141106a41186a290300370300200141b0016a41106a2208200141106a41106a290300370300200141b0016a41086a220b200141106a41086a290300370300200120012903103703b00120024200370300200342003703002009420037030020014200370370200141b0016a4120200141f0006a1016450d0620014190016a41186a220c200229030037030020014190016a41106a220d200329030037030020014190016a41086a220e200929030037030020012001290370370390012002200c2903003703002003200d2903003703002009200e29030037030020012001290390013703702007200229030037030020082003290300370300200b2009290300370300200120012903703703b001024002400240200a422088220fa72202200aa7470d00200241016a22032002490d05200fa74101742209200320032009491bad221042247e220f422088a70d05200fa722034100480d052002450d012006200241246c200310272206450d020c070b200a21100c070b2003102622060d050b20034104102a000b41d4aac10041331021000b41d4aac10041331021000b101e000b41d4aac10041331021000b200a422088220fa721020b2006200241246c6a220241003a0000200241196a200141c8016a290300370000200241116a200141c0016a290300370000200241096a200141b8016a290300370000200220012903b001370001200220012f0090013b0021200241236a20014192016a2d00003a0000201042ffffffff0f83200f4220864280808080107c84210a0b2000200129031037001420002004420020051b370300200020012903503700342000412c6a200141106a41186a290300370000200041246a200141106a41106a2903003700002000411c6a200141106a41086a2903003700002000413c6a200141d0006a41086a290300370000200041c4006a200141d0006a41106a290300370000200041cc006a200141d0006a41186a290300370000200041ec006a200141306a41186a290300370000200041e4006a200141306a41106a290300370000200041dc006a200141306a41086a290300370000200020012903303700542000410c6a200a37020020002006360208200141d0016a24000bac0101027f230041206b22002400200041106a41086a2201420037030020004200370310419595c3004113200041106a1000200041086a200129030037030020002000290310370300024002402000411041a886c500410041001001417f460d00200041003a001020004110200041106a41014100100141016a41014d0d0120002d001021012000411010032001450d00200041206a24000f0b41d895c300104f000b41d4aac10041331021000b130020004101360204200041b4bcc3003602000b1300200041093602042000418cc0c3003602000b13002000410436020420004198c0c3003602000b3201017f0240410810262202450d0020004288808080800137020420002002360200200242033700000f0b41084101102a000bb23b07027f027e017f017e2a7f0a7e027f23004190056b22032400418f94c30021040240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200141ff01710d00200241ff01714102470d00200341f0046a41086a22044200370300200342003703f004419595c3004113200341f0046a1000200341d0036a41086a22012004290300370300200320032903f0043703d00302400240200341d0036a411041a886c500410041001001417f470d0020044200370300200342003703f00441a298c300410d200341f0046a100020012004290300370300200320032903f0043703d003200341d0036a411041a886c500410041001001417f460d01200342003703e801024002400240200341d0036a4110200341e8016a41084100100141016a41084d0d0020032903e801500d04200341f0046a41086a22044200370300200342003703f00441a298c300410d200341f0046a1000200341d0036a41086a22012004290300370300200320032903f0043703d003420021050240200341d0036a411041a886c500410041001001417f460d00200342003703e801200341d0036a4110200341e8016a41084100100141016a41084d0d0220032903e80121050b20044200370300200342003703f00441e698c3004117200341f0046a100020012004290300370300200320032903f0043703d00302400240200341d0036a411041a886c500410041001001417f460d00200342003703e801200341d0036a4110200341e8016a41084100100141016a41084d0d0420032903e80120057c2000560d010c060b420320057c2000580d050b41bc97c300104f000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41f496c300104f000b200341f0046a41086a22044200370300200342003703f00441a298c300410d200341f0046a1000200341d0036a41086a22012004290300370300200320032903f0043703d003200320003703e801200341d0036a4110200341e8016a41081004200341013a00e80120044200370300200342003703f004419595c3004113200341f0046a100020012004290300370300200320032903f0043703d003200341d0036a4110200341e8016a4101100420014200370300200342003703d00341e698c3004117200341d0036a1000200341e8016a41086a2001290300370300200320032903d0033703e80102400240200341e8016a411041a886c500410041001001417f460d00200342003703d003200341e8016a4110200341d0036a41084100100141016a41084d0d0920032903d00321050c010b420321050b200341d0036a41086a22014200370300200342003703d0034180adc4004112200341d0036a1000200341e8016a41086a22022001290300370300200320032903d0033703e8014100210402400240200341e8016a411041a886c500410041001001417f460d00200342003703d003200341e8016a4110200341d0036a41084100100141016a41084d0d0a20032903d0032106410021070c010b410121070b20014200370300200342003703d0034180adc4004112200341d0036a100020022001290300370300200320032903d0033703e801200320003703d003200341e8016a4110200341d0036a410810042006500d0020070d00427f200520057c220820082005541b22054200510d172000200580220020062005802205580d182000200542017c2206510d00200341d0036a41086a22044200370300200342003703d00341a2adc4004112200341d0036a1000200341e8016a41086a2004290300370300200320032903d0033703e80141002104200341e8016a411041a886c500410041001001417f460d00200342103702bc022003200341e8016a3602b802200341d0036a200341b8026a102820032802d0032209450d1e20032802d403210a024020002005427f857c2200a7417f2000428080808010541b220b450d00200341d8036a280200220c200b4d0d002006a7417f2006428080808010541b210d200341f9036a210e200341d0036a41096a210f200341b8026a4104722110200341e8016a41286a2111200341e8016a41206a2112200341e8016a41246a211320034188046a2114200341d0036a412c6a2115410021160340200341c8016a41186a20092016200d6a200c704105746a220441186a290000370300200341c8016a41106a200441106a290000370300200341c8016a41086a200441086a290000370300200320042900003703c801200341e8016a200341c8016a106b02402012280200223e450d00200341b8026a41086a201141086a290300370300200341b8026a41106a201141106a290300370300200341b8026a41186a201141186a290300370300200341b8026a41206a201141206a280200360200200320112903003703b8022013280200213d200341e0026a41186a2217201041186a290000370300200341e0026a41106a2218201041106a290000370300200341e0026a41086a2219201041086a290000370300200320102900003703e002200341f0046a41086a22224200370300200342003703f0044181f5c0004115200341f0046a1000200341c0036a41086a22232022290300370300200320032903f0043703c0030240024002400240200341c0036a411041a886c500410041001001417f470d0041014100200341e0026a10eb020d020c010b200342103702f4042003200341c0036a3602f004200341d0036a200341f0046a102820032802d0032204450d1620032802d40321012004200341d0036a41086a280200200341e0026a10eb02210202402001450d00200410230b20020d010b411210262204450d16200441106a41002f00a6f54022013b0000200441086a410029009ef540220037000020044100290096f540220537000020044112413210272204450d17200420032903e0023700122004412a6a2017290300370000200441226a20182903003700002004411a6a2019290300370000200341d0046a41186a221a4200370300200341d0046a41106a221b4200370300200341d0046a41086a221c4200370300200342003703d00420044132200341d0046a1002200341d0036a41186a221d201a290300370300200341d0036a41106a221e201b290300370300200341d0036a41086a221f201c290300370300200320032903d0043703d00302400240200341d0036a412041a886c500410041001001417f460d00200341003602f004200341d0036a4120200341f0046a41044100100141016a41044d0d1220032802f0042120200410234112102622040d010c1a0b4100212020041023411210262204450d190b200441106a20013b0000200441086a20003700002004200537000020044112413210272204450d19200420032903e0023700122004412a6a2017290300370000200441226a20182903003700002004411a6a2019290300370000201a4200370300201b4200370300201c4200370300200342003703d00420044132200341d0046a1002201d201a290300370300201e201b290300370300201f201c290300370300200320032903d0043703d0032003202041016a22213602f004200341d0036a4120200341f0046a410410042004102320224200370300200342003703f00441a8f5c0004119200341f0046a100020232022290300370300200320032903f0043703c00302400240200341c0036a411041a886c500410041001001417f460d00200341003602d003200341c0036a4110200341d0036a41044100100141016a41044d0d1320032802d00321240c010b410021240b20034180036a41186a2204201729030037030020034180036a41106a2201201829030037030020034180036a41086a22022019290300370300200320032903e002370380034200210820224200370300200342003703f00441af98c300410d200341f0046a100020232022290300370300200320032903f0043703c0030240200341c0036a411041a886c500410041001001417f460d00200342003703d003200341c0036a4110200341d0036a41084100100141016a41084d0d1020032903d00321080b200341a0036a41186a22252004290300370300200341a0036a41106a22262001290300370300200341a0036a41086a2227200229030037030020032003290380033703a00320224200370300200342003703f00441c1f5c0004117200341f0046a100020232022290300370300200320032903f0043703c00302400240024002400240024002400240200341c0036a411041a886c500410041001001417f460d00200342103702c4042003200341c0036a3602c004200341c0016a200341c0046a104a20032802c001450d1020032802c4012228ad42307e2200422088a70d1b2000a72204417f4c0d1b2004450d01200410262229450d282028450d030c020b200341f0046a41186a22042025290300370300200341f0046a41106a2201202629030037030041082129200341f0046a41086a2202200341a0036a41086a290300370300200320032903a0033703f004201d2004290300370300201e2001290300370300200341d0036a41086a2002290300370300200320032903f0043703d0034100212a420021060c040b410821292028450d010b200341c0046a41086a2207280200212a4100212b20032802c404212c20032802c004212d41002102410021042028212e0340201a4200370300201b4200370300201c4200370300200342003703d00420074100202d202c200341d0046a4120202a100122012001417f461b220141202001412049222f1b202a6a2201360200202f0d0d201d201a290300370300201e201b290300370300201f201c290300370300200320032903d0043703d003200342003703d00420074100202d202c200341d0046a410820011001222a202a417f461b222a4108202a4108491b20016a2201360200202a41074d0d0d20032903d0042100200341003602d00420074100202d202c200341d0046a410420011001222a202a417f461b222f4104202f4104491b20016a222a360200202f41034d0d0d200441016a210120032802d004212f200341f0046a41186a2230201d290300370300200341f0046a41106a2231201e2903003703002022201f290300370300200320032903d0033703f00402402004202e470d00202b20012001202b491b222ead42307e2205422088a70d0d2005a722324100480d0d02402004450d00202920022032102722290d010c160b203210262229450d150b202920026a22042000370300200441206a2030290300370300200441186a2031290300370300200441106a2022290300370300200441086a20032903f004370300200441286a202f360200202b41026a212b200241306a21022001210420012028490d000b20290d010c0d0b410021014100212e2029450d0c0b200341f0046a41186a222b2025290300370300200341f0046a41106a222c202629030037030020222027290300370300200320032903a0033703f00402402001ad422086202ead842206422088a7222a4120490d0041302104202a41306c21072029ad42208621054201210020292102034002402002290300202920046a2201290300580d002001ad4220862000842105200121020b200042017c21002007200441306a2204470d000b2002450d22200542ffffffff0f580d22201d202b290300370300201e202c290300370300201f2022290300370300200320032903f0043703d003202a2005a722044d0d252029200441306c6a22042008370300200441206a201d290300370300200441186a201e290300370300200441106a201f290300370300200420032903d003370308200441013602280c030b201d202b290300370300201e202c290300370300201f2022290300370300200320032903f0043703d0032006a7202a470d010b202a4101742204202a41016a220120012004491bad220042307e2205422088a70d082005a722044100480d0802400240202a450d002029202a41306c2004102722290d010c230b200410262229450d220b2006422088a7212a200021060b2029202a41306c6a22042008370300200441206a201d290300370300200441186a201e290300370300200441106a201f290300370300200420032903d00337030820044101360228200642ffffffff0f83202a41016aad4220868421060b20224200370300200342003703f00441c1f5c0004117200341f0046a100020232022290300370300200320032903f0043703c003201f4100360200200342013703d00320032006422088a722043602f004200341f0046a200341d0036a1041024002402004450d00200441306c212c4158201f28020022046b212a2004412c6a210420032802d403210220292101034002400240024002402002202a6a41286a41204f0d00200441546a222b41206a2207202b490d0d2002410174222b20072007202b491b222b4100480d0d2002450d0120032802d0032002202b102722070d020c100b20032802d00321070c020b202b10262207450d0e0b2003202b3602d403200320073602d003202b21020b201f200441746a222d360200200720046a222b416c6a200141206a290000370000202b41646a200141186a290000370000202b415c6a200141106a290000370000202b41546a200141086a2900003700002001290300210002400240024002402002202a6a222b41086a202b4f0d00202d41086a222b202d490d0d2002410174222d202b202b202d491b222b4100480d0d2002450d0120072002202b102722070d020c110b2002212b0c020b202b10262207450d0f0b2003202b3602d403200320073602d0030b201f2004417c6a2202360200200720046a41746a2000370000200141286a280200212d0240024002400240202b202a6a41034b0d00200241046a222f2002490d0d202b4101742202202f202f2002491b22024100480d0d202b450d012007202b2002102722070d020c120b202b21020c020b200210262207450d100b200320023602d403200320073602d0030b200141306a2101201f2004360200200720046a417c6a202d360000202a41546a212a2004412c6a2104202c41506a222c0d000c020b0b20032802d403210220032802d00321070b200341c0036a41102007201f280200100402402002450d00200710230b02402006a7450d00202910230b411210262204450d1a200441106a41002f00bec7403b0000200441086a41002900b6c740370000200441002900aec74037000020044112413210272204450d1b200420032903e0023700122004412a6a2017290300370000200441226a20182903003700002004411a6a2019290300370000201a4200370300201b4200370300201c4200370300200342003703d00420044132200341d0046a1002201d201a290300370300201e201b290300370300201f201c290300370300200320032903d0043703d0030240024002400240024002400240200341d0036a412041a886c500410041001001417f460d00200342203702f4042003200341d0036a3602f004200341b8016a200341f0046a104a20032802b801450d1b20032802bc012101200341a0016a200341f0046a104c20032802a001450d1b20041023410a2104200141094d0d012021410a20246a4d0d030c020b20041023410321010b20212001220420246a4d0d010b200341d0036a200341e0026a106d201f290300210020032903d00321050240200341d0036a41246a2207280200450d00200341d0036a41206a28020010230b20224200370300200342003703f00441fcf5c0004114200341f0046a100020232022290300370300200320032903f0043703c003200341c0036a411041a886c500410041001001417f460d01200341003602d003200341c0036a4110200341d0036a41044100100141016a41044d0d1620032802d00321010c020b200341f0046a41186a2017290300370300200341f0046a41106a201829030037030020222019290300370300200320032903e0023703f004410121040c020b41c0843d21010b200341f0006a20052000428094ebdc034200109704200341e0006a20032903702206200341f0006a41086a29030022084280ec94a37c427f109804200341d0006a200620082001ad22334200109804200341c0006a200329035022062033200520032903607c7e428094ebdc038042ffffffff0f837c2208200341d0006a41086a2903002008200654ad7c2004109904200341c0006a41086a290300210620032903402108200341d0036a200341e0026a106d20034180016a200341e0026a20032903d003223420052008200441ff004b2005200854200020065420002006511b7222041b22352034203554201f29030022362000200620041b22375420362037511b22041b2208201e29030022382038200856201d29030022392036203720041b22065620392006511b22041b22332006203920041b223a10840220034180016a41086a290300210020032903800121050240200329039001223b20337d223c20087c220820034180016a41186a290300203a7d203b203354ad7d20067c2008203c54ad7c223384500d00203420387d223a203620397d2034203854ad7d223684500d00200341d0036a41286a2802002201450d00200341d0036a41206a2802002204200141306c6a21020340200341106a2004290300200441086a2903002008203310980420032003290310200341106a41086a290300203a2036109704200341206a200441106a2003290300200341086a290300108402427f2000200341206a41086a2903007c200520032903207c22062005542201ad7c22052001200520005420052000511b22011b2100427f200620011b2105200441306a22042002470d000b0b200320053703f004200320003703f8042003200341f0046a3602d004200341d0046a10de0102402007280200450d00200341d0036a41206a28020010230b20224200370300200342003703f00441a2adc4004112200341f0046a1000201f2022290300370300200320032903f0043703d00302400240200341d0036a411041a886c500410041001001417f460d00200342103702d4042003200341d0036a3602d004200341f0046a200341d0046a102820032802f004222d450d252022280200210420032802f40421290c010b4101212d41002104410021290b202d20044105746a212c41002101202d21040240024002400340202c20046b41ff004d0d01200341c8016a2004460d022004200341c8016a41201096042207450d02200441206a2202200341c8016a460d022002200341c8016a4120109604222a450d02200441c0006a2202200341c8016a460d022002200341c8016a41201096042202450d02200441e0006a222b200341c8016a460d0220044180016a2104200120074100476a202a4100476a20024100476a202b200341c8016a412010960422024100476a210120020d000c020b0b2004202c460d010340200341c8016a2004460d012004200341c8016a41201096042202450d01200120024100476a2101202c200441206a2204470d000c020b0b200341013a00d00420224200370300200342003703f00441dfbac400410f200341f0046a1000201f2022290300370300200320032903f0043703d003200341d0036a4110200341d0046a410110040b02402029450d00202d10230b200341f0046a41186a2017290300370300200341f0046a41106a201829030037030020222019290300370300200320032903e0023703f004410221040b20142037370300200341d0036a41306a2035370300201f20043a0000200f20032903f004370000200e20032f00d0043b000020152020360200200f41086a2022290300370000200f41106a200341f0046a41106a290300370000200f41186a200341f0046a41186a290300370000200e41026a200341d0046a41026a2d00003a0000200341043a00d00341a886c5004100200341d0036a102c203d0d010c020b203d450d010b203e10230b201641016a2216200b470d000b0b41002104200a450d00200910230b20034190056a240020040f0b101e000b202e450d00202910230b41d4aac10041331021000b202b4101102a000b202b4101102a000b20024101102a000b41d4aac10041331021000b41d4aac10041331021000b20324108102a000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b101d000b41d4aac10041331021000b41d4aac10041331021000b41124101102a000b41324101102a000b41124101102a000b41324101102a000b41124101102a000b41324101102a000b41fcaec400104f000b41f8afc400104f000b41d8f5c00041131021000b20044108102a000b20044108102a000b41ecf5c0002004202a1029000b41d4aac10041331021000b41d4aac10041331021000bcf0101047f200020014105746a210320002104024002400340200320046b41ff004d0d014101210520042002460d02200420024120109604450d02200441206a22062002460d02200620024120109604450d02200441c0006a22062002460d02200620024120109604450d02200441e0006a22062002460d0220044180016a21042006200241201096040d000c020b0b024020042003460d00200020014105746a210603404101210520022004460d02200420024120109604450d022006200441206a2204470d000b0b41000f0b20050b8e0a01037f02400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020002d00004101470d00200041046a280200220241808004490d01200141046a280200200141086a2802002200470d03200041016a22032000490d1b20004101742204200320032004491b22044100480d1b2000450d0920012802002000200410272203450d0a0c190b200141046a280200200141086a2802002202470d01200241016a22032002490d1a20024101742204200320032004491b22044100480d1a2002450d0420012802002002200410272203450d050c160b200241f001490d02200141046a280200200141086a2802002200470d05200041016a22032000490d1920004101742204200320032004491b22044100480d192000450d09200128020020002004102722030d0a0c120b200128020021030c150b200128020021030c160b200141046a280200200141086a2802002200470d03200041016a22032000490d1620004101742204200320032004491b22044100480d162000450d09200128020020002004102722030d0a0c100b2004102622030d110b20044101102a000b200128020021030c050b200128020021030c070b2004102622030d0f0b20044101102a000b200410262203450d080b20012003360200200141046a2004360200200141086a28020021000b200141086a2204200041016a360200200320006a41fc013a00000240200141046a2802002203200428020022006b41024f0d00200041026a22042000490d0e20034101742200200420042000491b22004100480d0e2003450d04200128020020032000102722030d050c090b200128020021030c050b200410262203450d060b20012003360200200141046a2004360200200141086a28020021000b200141086a200041016a360200200320006a20023a00000f0b200010262203450d040b20012003360200200141046a2000360200200141086a28020021000b200141086a200041026a360200200320006a20023b00000f0b20044101102a000b20044101102a000b20004101102a000b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41ff013a000002400240024002400240200141046a2802002203200428020022026b41204f0d00200241206a22042002490d0720034101742202200420042002491b22024100480d072003450d0120012802002003200210272203450d020c030b200128020021030c030b2002102622030d010b20024101102a000b20012003360200200141046a2002360200200141086a28020021020b200141086a200241206a360200200320026a220141186a200041196a290000370000200141106a200041116a290000370000200141086a200041096a290000370000200120002900013700000f0b20012003360200200141046a2004360200200141086a28020021000b200141086a2204200041016a360200200320006a41fd013a0000024002400240200141046a2802002203200428020022006b41044f0d00200041046a22042000490d0320034101742200200420042000491b22004100480d032003450d0120012802002003200010272203450d020c040b200128020021030c040b2000102622030d020b20004101102a000b101e000b20012003360200200141046a2000360200200141086a28020021000b200141086a200041046a360200200320006a20023600000b9a0b06037f037e037f027e017f027e230041b0016b22012400200141c0006a41086a220242003703002001420037034041becbc300411d200141c0006a1000200141306a41086a2002290300370300200120012903403703300240200141306a411041a886c500410041001001417f460d002001200141306a360200200141103602042001420037034020014100200141306a4110200141c0006a41084100100122022002417f461b2202410820024108491b220336020802400240024002400240024002400240024002400240200241074d0d002001290340210420014200370340200141086a4100200141306a4110200141c0006a41082003100122022002417f461b2202410820024108491b20036a360200200241074d0d0020012903402105200141c0006a200110890220012802402202450d0020012902442106200141003a0040200141086a2203200328020022032001280200220720012802042208200141c0006a41012003100141016a41014b22036a22093602000240024002402003450d0020012d00404101470d004200210a20014200370340200141086a410020072008200141c0006a41082009100122032003417f461b2203410820034108491b20096a360200200341074d0d012001290340210b4201210a0c020b4200210a0b0b200141246a2006370200200141186a200b370300200120023602202001200a370310200120053703082001200437030020042000520d082006422088a7210802400240024002400240200a500d002008ad42287e220a422088a70d06200aa72203417f4c0d062003450d0120031026220c450d072008450d020c0b0b2008ad42287e220a422088a70d05200aa72203417f4c0d052003450d0220031026220c450d072008450d030c080b4108210c20080d090b410021090c090b4108210c20080d050b410021090c050b41d4aac10041331021000b101d000b20034108102a000b20034108102a000b200841286c210741002109200c21030340200241086a290300210a200241106a2903002106200241186a290300210d2002290300210e200341206a200241206a290300370300200341186a200d370300200341106a2006370300200341086a200a3703002003200e370300200341286a2103200941016a2109200241286a2102200741586a22070d000b0b200141d8006a2009360200200141d4006a2008360200200141d0006a200c3602002001200537034820014200370340200141c0006a10ee02200520047c2000510d030c040b200841286c210741002109200c21030340200241086a290300210a200241106a2903002106200241186a290300210d2002290300210e200341206a200241206a290300370300200341186a200d370300200341106a2006370300200341086a200a3703002003200e370300200341286a2103200941016a2109200241286a2102200741586a22070d000b0b200141e0006a2009360200200141dc006a2008360200200141d8006a200c360200200141d0006a20053703002001200b37034820014201370340200141c0006a10ee020b200520047c2000520d010b200141c0006a41086a220242003703002001420037034041dbcbc300411b200141c0006a1000200141306a41086a2209200229030037030020012001290340370330200141103602442001200141306a360240200141206a2203200141c0006a108f02200141cb006a200341086a28000036000020012003290000370043200120012900403703302001200141c7006a29000037003720022001290037370000200141083a00402001200129033037004141a886c5004100200141c0006a102c200242003703002001420037034041becbc300411d200141c0006a10002009200229030037030020012001290340370330200141306a41101003200141b0016a24000f0b200141246a280200450d00200141206a28020010230b200141b0016a24000bfc0d05017f017e037f017e067f230041d0006b220124002001410036023020014201370328024002400240024002400240024002400240024002400240024002400240024002400240024002400240200029030022024201520d00410110262203450d09200141286a41086a22042004280200220541016a3602002001410136022c20012003360228200320056a41013a000020002903082106200128022c2205200428020022036b41084f0d01200341086a22042003490d0f20054101742203200420042003491b22034100480d0f2005450d0320012802282005200310272204450d040c0d0b410110262203450d092001410136022c200141286a41086a22072007280200220441016a36020020012003360228200320046a41003a0000200041106a28020021082001200041186a2802002209360208200141086a200141286a104102402009450d002008200941286c6a210a2008210303400240024002400240200128022c22052007280200220b6b41204f0d00200b41206a2204200b490d142005410174220c20042004200c491b22044100480d142005450d012001280228200520041027220c0d020c0c0b2001280228210c0c020b20041026220c450d0a0b2001200436022c2001200c3602282007280200210b200421050b2007200b41206a2204360200200c200b6a220b41186a200341186a290000370000200b41106a200341106a290000370000200b41086a200341086a290000370000200b2003290000370000200341206a29030021060240200520046b41074b0d00200441086a220b2004490d1120054101742204200b200b2004491b22044100480d11024002402005450d00200c200520041027220c0d010c0c0b20041026220c450d0b0b2001200436022c2001200c360228200728020021040b2007200441086a360200200c20046a2006370000200a200341286a2203470d000b0b20002903082106200128022c2204200728020022036b41084f0d01200341086a22052003490d0e20044101742203200520052003491b22034100480d0e2004450d0420012802282004200310272204450d050c0a0b200128022821040c0c0b200128022821040c090b2003102622040d090b20034101102a000b2003102622040d050b20034101102a000b20044101102a000b20044101102a000b41014101102a000b41014101102a000b2001200336022c20012004360228200141306a28020021030b200141286a41086a200341086a360200200420036a20063700000c070b2001200336022c20012004360228200141306a28020021030b200141286a41086a2207200341086a360200200420036a2006370000200041186a28020021092001200041206a2802002203360208200141086a200141286a104102402003450d002009200341286c6a210a2009210303400240024002400240200128022c22052007280200220b6b41204f0d00200b41206a2204200b490d062005410174220c20042004200c491b22044100480d062005450d012001280228200520041027220c0d020c070b2001280228210c0c020b20041026220c450d050b2001200436022c2001200c3602282007280200210b200421050b2007200b41206a2204360200200c200b6a220b41186a200341186a290000370000200b41106a200341106a290000370000200b41086a200341086a290000370000200b2003290000370000200341206a29030021060240200520046b41074b0d00200441086a220b2004490d0320054101742204200b200b2004491b22044100480d03024002402005450d00200c200520041027220c0d010c070b20041026220c450d060b2001200436022c2001200c360228200728020021040b2007200441086a360200200c20046a2006370000200a200341286a2203470d000b0b200041106a2903002106024002400240200128022c2204200728020022036b41084f0d00200341086a22052003490d0320044101742203200520052003491b22034100480d032004450d0120012802282004200310272204450d020c060b200128022821040c060b2003102622040d040b20034101102a000b101e000b20044101102a000b20044101102a000b2001200336022c20012004360228200141306a28020021030b200141286a41086a200341086a360200200420036a20063700002006a721080b200141086a41086a2203200141286a41086a28020036020020012001290328370308200141246a20032802003600002001200129030837001c200141346a200141206a290000370000200141286a41146a2001290208370200200141286a411c6a2003290200370200200141c6a4b9da04360029200141023a00282001200129001937002d200141286a10d5020240024020024200510d002000411c6a280200450d0120091023200141d0006a24000f0b200041146a280200450d00200810230b200141d0006a24000bfb0c03017f017e097f230041306b2204240042002105200441186a41086a220642003703002004420037031841becbc300411d200441186a1000200441086a41086a2207200629030037030020042004290318370308024002400240024002400240024002400240024002400240200441086a411041a886c500410041001001417f460d00200041046a280200450d0120002802001023200441306a24000f0b200642003703002004420037031841af98c300410d200441186a100020072006290300370300200420042903183703080240200441086a411041a886c500410041001001417f460d0020044200370318200441086a4110200441186a41084100100141016a41084d0d05200429031821050b02402002a74101470d00200441186a41086a220642003703002004420037031841f6cbc300411a200441186a1000200441086a41086a2006290300370300200420042903183703080240200441086a411041a886c500410041001001417f460d0020044200370318200441086a4110200441186a41084100100141016a41084d0d0720042903182005580d00200041046a280200450d0220002802001023200441306a24000f0b200441186a41086a220642003703002004420037031841f6cbc300411a200441186a1000200441086a41086a2006290300370300200420042903183703082004200520014201867c370318200441086a4110200441186a410810040b200028020821062000280204210820002802002109200441186a41086a220042003703002004420037031841becbc300411d200441186a1000200441086a41086a2000290300370300200420042903183703082004410036022020044201370318410810262200450d0620044288808080800137021c200420003602182000200537000020004108411010272200450d0720044290808080800237021c20002001370008200420003602182004200636022c2004412c6a200441186a104102402006450d002009200641286c6a210a200441186a41086a220b280200210c200428021c210720092100034002400240024002402007200c6b41204f0d00200c41206a2206200c490d072007410174220d20062006200d491b220e4100480d072007450d0120042802182007200e1027220d0d020c080b200c41206a21062004280218210d0c020b200e1026220d450d060b2004200e36021c2004200d360218200e21070b200b2006360200200d200c6a220c41186a200041186a290000370000200c41106a200041106a290000370000200c41086a200041086a290000370000200c2000290000370000200041206a29030021050240200720066b41074b0d00200641086a220c2006490d042007410174220e200c200c200e491b220c4100480d04024002402007450d00200d2007200c1027220d0d010c080b200c1026220d450d070b2004200c36021c2004200d360218200c21070b200b200641086a220c360200200d20066a2005370000200a200041286a2200470d000b0b200441206a2802002100200428021c2107024002400240024002400240024002400240024002400240024020024201520d0020072000470d01200041016a22062000490d0e20004101742207200620062007491b22074100480d0e2000450d03200428021820002007102722060d040c150b20072000470d01200041016a22062000490d0d20004101742207200620062007491b220d4100480d0d2000450d0520042802182000200d102722060d060c150b200428021821060c030b200428021821062007210d0c050b200710262206450d110b2004200736021c200420063602180b200441186a41086a220b200041016a220c360200200620006a41013a000002402007200c6b41074b0d00200c41086a220d200c490d092007410174220e200d200d200e491b220d4100480d092007450d0420062007200d102722060d050c120b2007210d0c050b200d10262206450d0f0b2004200d36021c200420063602180b200441206a200041016a2207360200200620006a41003a00000c030b200d10262206450d0d0b2004200d36021c200420063602180b200b200041096a22073602002006200c6a20033700000b200441086a41102006200710040240200d450d00200610230b2008450d00200910230b200441306a24000f0b101e000b200e4101102a000b200c4101102a000b41d4aac10041331021000b41d4aac10041331021000b41084101102a000b41104101102a000b20074101102a000b200d4101102a000b200d4101102a000b130020004102360204200041f0ccc3003602000b1300200041023602042000419cfcc4003602000b130020004101360204200041fc92c4003602000b130020004103360204200041d8b0c1003602000b130020004101360204200041c8fac4003602000b130020004103360204200041a0c3c0003602000b13002000410b360204200041bc80c0003602000b130020004104360204200041f4acc1003602000b130020004106360204200041908bc4003602000b130020004101360204200041c0f9c4003602000b13002000410536020420004180e9c3003602000b130020004106360204200041ecc5c2003602000bba2806027f027e037f017e0f7f047e230041e0056b220324000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001280200417f6a220441044b0d0002400240024002400240024002400240024002400240024002400240024020040e050004020301000b200141306a2903002105200141286a2903002106200341d4006a41026a200141076a2d00003a0000200341c0016a41086a200141186a290200370300200341c0016a410d6a2001411d6a290000370000200320012f00053b01542003200141106a2902003703c001200141086a28020021072001410c6a280200210820012d000421092002411a6a290100210a200241196a2d0000210b200241186a2d0000210c200241166a2f0100210d200241156a2d0000210e200241146a2d0000210f200241126a2f01002110200241116a2d00002111200241106a2d000021122002410e6a2f010021132002410d6a2d00002114200241046a2d00002115200241026a2f01002116412a210141db94c300210420022d0000450d054101211741002118410021190c060b41ef94c4002104410e211820022d0000450d1f200241086a2802004104490d1f200241046a28020041ff01710d1f20012802042101411210262202450d10200241106a41002f00c6ed433b0000200241086a41002900beed43370000200241002900b6ed4337000020024112412410272202450d112002200136001220034180046a41186a2204420037030020034180046a41106a2218420037030020034180046a41086a2207420037030020034200370380042002411620034180046a1002200341e0036a41186a2004290300370300200341e0036a41106a2018290300370300200341e0036a41086a200729030037030020032003290380043703e003200341e0036a412041a886c5004100410010012104200210232004417f460d0a20034180046a41086a22024200370300200342003703800441f487c400411220034180046a1000200341e0006a41086a2002290300370300200320032903800437036041002104200341e0006a411041a886c500410041001001417f460d0b200342103702f4042003200341e0006a3602f00420034180046a200341f0046a109202200328028004220b450d1520034188046a28020021042003290284042206422088a722022006a7460d0c200328028404210c0c170b20022d000120022d0000720d02200141186a2903002106200141106a290300210a200141086a2802002104200141206a29030021052001280204210120034180046a41086a22024200370300200342003703800441ee89c400411520034180046a1000200341e0006a41086a20022903003703002003200329038004370360410410262202450d0d20022001360000200341e0006a41102002410410042002102320034180046a41086a22024200370300200342003703800441d289c400411c20034180046a1000200341e0006a41086a22012002290300370300200320032903800437036020032006370388042003200a37038004200341e0006a411020034180046a4110100420024200370300200342003703800441c687c400411420034180046a10002001200229030037030020032003290380043703602003200537038004200341e0006a411020034180046a41081004200242003703002003420037038004418688c400410d20034180046a1000200120022903003703002003200329038004370360410410262202450d0e20022004360000200341e0006a411020024104100420021023410021040c1d0b41ef94c4002104410e211820022d0000450d1d200241086a2802004102490d1d200241046a28020041ff01710d1d20012802042101411210262202450d10200241106a41002f00c6ed433b0000200241086a41002900beed43370000200241002900b6ed4337000020024112412410272202450d112002200136001220034180046a41186a2201420037030020034180046a41106a2204420037030020034180046a41086a2218420037030020034200370380042002411620034180046a1002200341e0036a41186a2001290300370300200341e0036a41106a2004290300370300200341e0036a41086a201829030037030020032003290380043703e003200341e0036a412041a886c500410041001001417f460d07200342203702d4052003200341e0036a3602d00520034180046a200341d0056a10ab032003290380044201520d122003280288042101200341f0046a2003418c046a41dc001094041a200341e0036a4120100320034180036a200341f0046a41dc001094041a200341a0026a20034180036a41dc001094041a20021023200341c0016a200341a0026a41dc001094041a20032001360260200341e0006a410472200341c0016a41dc001094041a200341c0006a200341e0006a41206a2003290370200341f8006a290300109302200329034021062003200341c8006a290300370388042003200637038004200320034180046a3602f004200341f0046a10de01410021040c1c0b20022d000120022d000072450d030b41b394c3002104412821180c1b0b41012117410021184100211920022d00014101470d002002410c6a2d000021182002410a6a2f01002119200241096a2d00002101200241066a2f0100410874200241056a2d000072200241086a2d0000411874722104410021170b201941ffff0371410874201841187472200141ff017172211820170d192003200a370388052003200b3a0087052003200c3a0086052003200d3b0184052003200e3a0083052003200f3a008205200320103b018005200320113a00ff04200320123a00fe04200320133b01fc04200320143a00fb04200320183600f704200320043600f304200320153a00f204200320163b01f004200341d0056a41026a2202200341d4006a41026a2d00003a000020034180046a41086a2201200341c0016a41086a29030037030020034180046a410d6a2204200341c0016a410d6a290000370000200320032f01543b01d005200320032903c00137038004200941ff01714101470d01200341e0036a200741067610870120032802e003210120032802e8032007413f7122024d0d02200341dc036a41026a200120024105746a220241026a2d00003a000020034188036a200241136a2900003703002003418d036a200241186a290000370000200320022f00003b01dc032003200229000b3703800320022800072108200228000321074101210220032802e403450d150c140b200141086a2903002106200141106a290300210a20034180046a41086a22024200370300200342003703800441aaedc300410c20034180046a1000200341e0006a41086a200229030037030020032003290380043703602003200a370388042003200637038004200341e0006a411020034180046a41101004410021040c170b200341dc036a41026a20022d00003a000020034180036a41086a200129030037030020034180036a410d6a2004290000370000200320032f01d0053b01dc032003200329038004370380030c140b4100210220032802e4030d110c120b20034180036a200341f0046a41dc001094041a200210230b41998ac4002104411921180c140b4104210b410021020b200241016a22182002490d0b20024101742207201820182007491b220cad4202862206422088a70d0b2006a722184100480d0b024002402002450d00200b200241027420181027220b450d010c0b0b20181026220b0d0a0b20184104102a000b20034194046a4101360200200341013602642003418898c4003602602003420137028404200341d497c400360280042003200341e0006a3602900420034180046a41a4eec3001061000b41044101102a000b41044101102a000b41124101102a000b41244101102a000b41124101102a000b41244101102a000b41d4aac10041331021000b41d4aac10041331021000b200421020b200b20024102746a200136020020034180046a41086a22094200370300200342003703800441f487c400411220034180046a1000200341e0006a41086a20092903003703002003200329038004370360200341003602880420034201370380042003200441016a22023602f004200341f0046a20034180046a1041024002402002450d00200441027441046a21194100200928020022026b21012003280284042118200b21040340200428020021080240024002400240201820016a41044f0d00200241046a22072002490d0720184101742217200720072017491b22174100480d072018450d0120032802800420182017102722070d020c080b20032802800421070c020b201710262207450d060b20032017360284042003200736028004201721180b200441046a21042009200241046a2217360200200720026a20083600002001417c6a2101201721022019417c6a22190d000c020b0b20092802002117200328028404211820032802800421070b200341e0006a411020072017100402402018450d00200710230b41002104200c450d06200b10230c060b101e000b20174101102a000b200110230b20020d00410121024115210841d9cac40021070c010b200341e0036a41026a200341dc036a41026a2d00003a000020034180046a41086a20034180036a41086a29030037030020034180046a410d6a20034180036a410d6a290000370000200320032f01dc033b01e003200320032903800337038004410021020b200341dc006a41026a2218200341e0036a41026a2d00003a0000200341e0006a41086a220120034180046a41086a2204290300370300200341e0006a41106a20034180046a41106a290300370300200320032f01e0033b015c200320032903800437036002402002450d0020082118200721040c020b200341d8006a41026a20182d00003a0000200341a0026a41086a2001290300370300200341a0026a410d6a200341e0006a410d6a290000370000200320032f015c3b0158200320032903603703a00220044200370300200342003703800441d289c400411c20034180046a100020012004290300370300200320032903800437036002400240200341e0006a411041a886c500410041001001417f460d0020034200370388042003420037038004200341e0006a411020034180046a4110410010012202417f460d052002410f4d0d0520034188046a290300210a200329038004211a0c010b4200211a4200210a0b20034180046a41086a22024200370300200342003703800441ee89c400411520034180046a1000200341e0006a41086a2002290300370300200320032903800437036002400240200341e0006a411041a886c500410041001001417f460d002003410036028004200341e0006a411020034180046a41044100100141016a41044d0d0420032802800421020c010b410021020b200341286a2006200542c0843d4200109704200341186a2003290328221b200341286a41086a290300221c42c0fb42427f109804200341086a201b201c2002ad221d4200109804200341386a200341f0046a201a2003290308221c201d200620032903187c7e42c0843d8042ffffffff0f837c221b201b201a54200341086a41086a290300201b201c54ad7c221b200a54201b200a511b22021b221a200a201b20021b220a105b02402003280238450d0041b889c4002104411a21180c020b20034180046a41086a22024200370300200342003703800441838ac400411620034180046a1000200341e0006a41086a20022903003703002003200329038004370360410021010240200341e0006a411041a886c500410041001001417f460d002003410036028004200341e0006a411020034180046a41044100100141016a41044d0d0520032802800421010b20034180046a41086a22024200370300200342003703800441838ac400411620034180046a1000200341e0006a41086a2204200229030037030020032003290380043703602003200141016a36028004200341e0006a411020034180046a41041004200341e0006a41186a200341f0046a41186a290300370300200341e0006a41106a200341f0046a41106a2903003703002004200341f0046a41086a29030037030020034180036a41086a200341a0026a41086a29030037030020034180036a410d6a200341a0026a410d6a290000370000200320032903f004370360200320032f01583b01d0052003200341da006a2d00003a00d205200320032903a00237038003411210262202450d05200241106a41002f00c6ed433b0000200241086a41002900beed43370000200241002900b6ed4337000020024112412410272204450d062004200136001220034180046a41186a2202420037030020034180046a41106a2218420037030020034180046a41086a2217420037030020034200370380042004411620034180046a1002200341e0036a41186a2002290300370300200341e0036a41106a2018290300370300200341e0036a41086a201729030037030020032003290380043703e003412010262202450d0720022003290360370000200241186a200341e0006a41186a290300370000200241106a200341e0006a41106a290300370000200241086a200341e0006a41086a2903003700002002412041c00010272202450d0820022006370020200241286a2005370000200241c00041800110272202450d092002201a370050200220032f01d0053b00302002200836003720022007360033200220032903800337003b200241d8006a200a370000200241326a20032d00d2053a0000200241c3006a20034180036a41086a290300370000200241c8006a2003418d036a290000370000200341e0036a4120200241e000100420021023200410232003418c046a20013602004100210420034180046a41086a41003a0000200341093a00800441a886c500410020034180046a102c0b0b2000201836020420002004360200200341e0056a24000f0b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41124101102a000b41244101102a000b41204101102a000b41c0004101102a000b4180014101102a000bc15004047f017e117f027e230041d0046b22032400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d000022044101460d00024020044102460d0020044103470d0f200141216a2d00002105200141246a2802002106200341186a41186a200141196a290000370300200341186a41106a200141116a290000370300200341186a41086a200141096a290000370300200320012900013703182002411a6a2901002107200241196a2d00002108200241186a2d00002109200241166a2f0100210a200241156a2d0000210b200241146a2d0000210c200241126a2f0100210d200241116a2d0000210e200241106a2d0000210f2002410e6a2f010021102002410d6a2d00002111200241046a2d00002112200241026a2f0100211341db94c3002114412a211520022d0000450d024101211641002117410021180c030b200141086a2802002116200141046a28020021052002411a6a2901002107200241196a2d00002109200241186a2d0000210a200241166a2f0100210b200241156a2d0000210c200241146a2d0000210d200241126a2f0100210e200241116a2d0000210f200241106a2d000021102002410e6a2f010021112002410d6a2d00002112200241046a2d00002113200241026a2f01002106412a211541db94c300211420022d0000450d034101211741002118410021080c040b200141046a2802002117024020022d00000d0020022d00014101470d00200241196a2d00002114200241186a2d00002115200241166a2f01002116200241156a2d00002118200241146a2d00002108200241126a2f01002109200241116a2d0000210a200241106a2d0000210b2002410e6a2f0100210c2002410d6a2d0000210d2002410c6a2d0000210e2002410a6a2f0100210f200241096a2d00002110200241086a2d00002111200241066a2f01002112200241056a2d00002113200241046a2d00002106200241026a2f0100210520032002411a6a290100370370200320143a006f200320153a006e200320163b016c200320183a006b200320083a006a200320093b01682003200a3a00672003200b3a00662003200c3b01642003200d3a0063200320063a005a200320053b015820032010200f410874200e411874727236005f2003201320124108747220114118747236005b200341d8006a10b803450d0941002115200341003602e003200342013703d8032017200341d8036a103920032802dc03211420032802e003211620032802d8032102200341d8026a41186a22184200370300200341d8026a41106a22084200370300200341d8026a41086a22094200370300200342003703d80220022016200341d8026a1002200341c8016a41186a2018290300370300200341c8016a41106a22182008290300370300200341c8016a41086a2009290300370300200320032903d8023703c80102402014450d00200210230b200341d8036a201741f0001094041a200341d8026a410d6a200341d8006a41086a290300370000200341d8026a41156a200341d8006a41106a290300370000200341d8026a411d6a200341d8006a41186a29030037000041012116200341013a00dc02200341013a00d802200320032903583700dd022003200341d8036a200341d8026a10d202200341fd036a2003280200453a0000200341d8036a410d6a200341c8016a41086a290300370000200341d8036a41156a2018290300370000200341d8036a411d6a200341c8016a41186a290300370000200341053a00dc03200341073a00d803200320032903c8013700dd0341a886c5004100200341d8036a102c20171023410021140c2d0b41db94c3002114412a21020c2b0b41012116410021174100211820022d00014101470d002002410c6a2d000021182002410a6a2f01002117200241096a2d00002115200241066a2f0100410874200241056a2d000072200241086a2d0000411874722114410021160b201741ffff0371410874201541ff017172201841187472210220160d1420032007370350200320083a004f200320093a004e2003200a3b014c2003200b3a004b2003200c3a004a2003200d3b01482003200e3a00472003200f3a0046200320103b0144200320113a00432003200236003f2003201436003b200320123a003a200320133b0138200341386a10b803450d02200341d8036a200341186a10b60320032802e0032209450d05200341f0036a280200210b200341ec036a280200210a4110210220032802e40321184182aac4002114200620032802d803220f470d13200341f4036a280200210820032802dc03210e2009200341d8036a41106a280200220c4105746a211620092102410021150340201620026b41ff004d0d09200341386a2002460d0a20152002200341386a412010960422144100476a21152014450d0a200241206a2214200341386a460d0a20152014200341386a412010960422144100476a21152014450d0a200241c0006a2214200341386a460d0a20152014200341386a412010960422144100476a21152014450d0a200241e0006a2214200341386a460d0a20024180016a210220152014200341386a412010960422144100476a211520140d000c0a0b0b41012117410021184100210820022d00014101470d002002410c6a2d000021182002410a6a2f01002108200241096a2d00002115200241066a2f0100410874200241056a2d000072200241086a2d0000411874722114410021170b200841ffff0371410874201841187472201541ff017172210220170d0220032007370350200320093a004f2003200a3a004e2003200b3b014c2003200c3a004b2003200d3a004a2003200e3b01482003200f3a0047200320103a0046200320113b0144200320123a00432003200236003f2003201436003b200320133a003a200320063b0138200341386a10b803450d01200341003602e003200342013703d8032016200341d8036a103920032802dc03211420032802e003211520032802d8032102200341d8026a41186a22174200370300200341d8026a41106a22184200370300200341d8026a41086a22084200370300200342003703d80220022015200341d8026a1002200341d8006a41186a22152017290300370300200341d8006a41106a22172018290300370300200341d8006a41086a22182008290300370300200320032903d80237035802402014450d00200210230b200341d8036a41186a2015290300370300200341d8036a41106a2017290300370300200341d8036a41086a2018290300370300200320032903583703d803411910262202450d0a200241186a41002d00bea9443a0000200241106a41002900b6a944370000200241086a41002900aea944370000200241002900a6a94437000020024119413910272202450d0b200220032903d803370019200241316a200341d8036a41186a290300370000200241296a200341d8036a41106a290300370000200241216a200341d8036a41086a290300370000200341d8026a41186a22144200370300200341d8026a41106a22154200370300200341d8026a41086a22174200370300200342003703d80220024139200341d8026a1002200341b8026a41186a2014290300370300200341b8026a41106a2015290300370300200341b8026a41086a2017290300370300200320032903d8023703b802200341b8026a412041a886c5004100410010012114200210232014417f460d054187a9c4002114411f21020c020b41eea9c4002114411421020c110b41f0a8c4002114411721020b201610242016102341012115410021160c250b41dba9c4002114411321020c0e0b41f0a8c4002114411721020c220b200341d8036a41086a22024200370300200342003703d8030240200541014b0d004195b7c1004115200341d8036a1000200341d8026a41086a2002290300370300200320032903d8033703d802410021020240200341d8026a411041a886c500410041001001417f460d00200342103702cc012003200341d8026a3602c801200341d8036a200341c8016a10890220032802d8032214450d0a20032902dc032207422088a721022007a7450d00201410230b200341d8036a201641f0001094041a200341e4026a2002360200200341d8026a41086a4101360200200341003a00dc02200341013a00d802200341086a200341d8036a200341d8026a10d202200341fd036a2003280208453a0000200341e5036a200341d8006a41086a290300370000200341ed036a200341e8006a290300370000200341f5036a200341f0006a290300370000200341043a00dc03200341073a00d803200320032903583700dd0341a886c5004100200341d8036a102c0c1a0b41bfa9c400411c200341d8036a1000200341d8026a41086a2002290300370300200320032903d8033703d8024100210c0240200341d8026a411041a886c500410041001001417f460d00200341003602d803200341d8026a4110200341d8036a41044100100141016a41044d0d0720032802d803210c0b200341d8036a41086a22024200370300200342003703d80341bfa9c400411c200341d8036a1000200341d8026a41086a2002290300370300200320032903d8033703d80202400240200341d8026a411041a886c500410041001001417f460d00200341003602d803200341d8026a4110200341d8036a41044100100141016a41044d0d0920032802d80341016a21020c010b410121020b42002107200341d8036a41086a22144200370300200342003703d80341bfa9c400411c200341d8036a1000200341d8026a41086a22152014290300370300200320032903d8033703d802200320023602d803200341d8026a4110200341d8036a4104100420144200370300200342003703d8034188a8c4004118200341d8036a100020152014290300370300200320032903d8033703d8024100210202400240200341d8026a411041a886c500410041001001417f460d00200342103702cc012003200341d8026a3602c801200341d8036a200341c8016a102820032802d803220b450d0b20032902dc032107200341d8036a41186a200341d8006a41186a290300370300200341d8036a41106a200341d8006a41106a290300370300200341d8036a41086a200341d8006a41086a290300370300200320032903583703d803200341d8036a21142007422088a722022007a7460d010c1a0b200341d8036a41186a200341d8006a41186a290300370300200341d8036a41106a200341d8006a41106a2903003703002014200341d8006a41086a290300370300200320032903583703d8034101210b200341d8036a21140b200241016a22152002490d1a20024101742217201520152017491bad2219420586221a422088a70d1a201aa722154100480d1a024002402002450d00200b200241057420151027220b450d010c190b20151026220b0d180b20154101102a000b20022016460d012009200c4105746a21160340200341386a2002460d0120152002200341386a412010960422144100476a21152014450d014100210d2016200241206a2202470d000c0a0b0b4101210d0c080b4100210d0c070b200341ec036a4101360200200341013602dc022003418898c4003602d802200342013702dc03200341d497c4003602d8032003200341d8026a3602e803200341d8036a41c498c4001061000b41194101102a000b41394101102a000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b200a20084105746a2117200a21024100211402400240024002400240024002400340201720026b41ff004d0d01200341386a2002460d0220142002200341386a412010960422164100476a21142016450d02200241206a2216200341386a460d0220142016200341386a412010960422164100476a21142016450d02200241c0006a2216200341386a460d0220142016200341386a412010960422164100476a21142016450d02200241e0006a2216200341386a460d0220024180016a210220142016200341386a412010960422164100476a211420160d000c020b0b20022017460d020340200341386a2002460d0120142002200341386a412010960422164100476a21142016450d01410021162017200241206a2202470d000c020b0b410121160b200541ff0171450d010c020b41002116200541ff01710d010b20160d01200341d8036a41186a2214200341386a41186a290300370300200341d8036a41106a2216200341386a41106a290300370300200341d8036a41086a2217200341386a41086a290300370300200320032903383703d80302400240024002400240200b2008470d00200b41016a2202200b490d16200b4101742210200220022010491b2211ad4205862207422088a70d162007a722024100480d16200b450d01200a200b41057420021027220a0d020c030b200b21110c010b20021026220a450d010b200a20084105746a220220032903d803370000200241186a2014290300370000200241106a2016290300370000200241086a2017290300370000200841016a21080240200d450d00200c20154d0d022009200c417f6a220c4105746a22022900002107200229000821192002290010211a200920154105746a221441186a200241186a2900003700002014201a37001020142019370008201420073700000b201821102011210b0c060b20024101102a000b41a8aac4002015200c1029000b200d0d00200341d8036a41186a2215200341386a41186a290300370300200341d8036a41106a2217200341386a41106a290300370300200341d8036a41086a220d200341386a41086a290300370300200320032903383703d8030240024002402018200c470d00201841016a22022018490d1320184101742210200220022010491b2210ad4205862207422088a70d132007a722024100480d132018450d01200920184105742002102722090d020c070b201821100c010b200210262209450d050b2009200c4105746a220220032903d803370000200241186a2015290300370000200241106a2017290300370000200241086a200d290300370000200c41016a210c2016450d03200820144d0d05200a2008417f6a22084105746a22022900002107200229000821192002290010211a200a20144105746a221441186a200241186a2900003700002014201a37001020142019370008201420073700000c030b4192aac4002114411621020b02402018450d00200910230b200b450d00200a10230b41012116410121150c150b200341fd036a2003290318370000200341e5036a200341386a41086a290300370000200341d8036a41156a200341386a41106a290300370000200341f5036a200341386a41186a29030037000020034185046a200341186a41086a2903003700002003418d046a200341186a41106a29030037000020034195046a200341186a41186a290300370000200341013a00dc03200341073a00d803200320032903383700dd03200341a4046a2008360200200341a0046a200c3602002003419d046a20053a00004100210241a886c5004100200341d8036a102c200341d8036a41086a22144200370300200342003703d8034195b7c1004115200341d8036a1000200341d8026a41086a2014290300370300200320032903d8033703d8020240024002400240200341d8026a411041a886c500410041001001417f460d00200342103702cc012003200341d8026a3602c801200341d8036a200341c8016a10890220032802d8032214450d0120032902dc032207422088a721022007a7450d00201410230b0240200c200e4f0d004100200220086b2214201420024b1b200e490d00200341f4036a2008360200200341f0036a200b360200200341e8036a200c360200200341e4036a20103602002003200a3602ec03200320093602e0032003200e3602dc032003200f3602d803411510262202450d022002410d6a41002900ada844370000200241086a41002900a8a844370000200241002900a0a84437000020024115413510272202450d03200220032903183700152002412d6a200341186a41186a290300370000200241256a200341186a41106a2903003700002002411d6a200341186a41086a290300370000200341d8026a41186a22144200370300200341d8026a41106a22154200370300200341d8026a41086a22164200370300200342003703d80220024135200341d8026a1002200341b8026a41186a2014290300370300200341b8026a41106a2015290300370300200341b8026a41086a2016290300370300200320032903d8023703b802200341203602dc022003200341b8026a3602d802200341d8036a200341d8026a10ad03200210232010450d0c0c0b0b02400240200c200e490d00200341e5036a200341186a41086a290300370000200341ed036a200341186a41106a290300370000200341f5036a200341186a41186a290300370000200341023a00dc03200341073a00d803200320032903183700dd0341a886c5004100200341d8036a102c411910262214450d07201441186a41002d00bea9443a0000201441106a41002900b6a944370000201441086a41002900aea944370000201441002900a6a94437000020144119413910272214450d0820142003290318370019201441316a200341186a41186a290300370000201441296a200341186a41106a290300370000201441216a200341186a41086a290300370000200341d8026a41186a22154200370300200341d8026a41106a22164200370300200341d8026a41086a22174200370300200342003703d80220144139200341d8026a1002200341b8026a41186a2015290300370300200341b8026a41106a2016290300370300200341b8026a41086a2017290300370300200320032903d8023703b802410e21150240200341b8026a412041a886c500410041001001417f460d00200342203702cc032003200341b8026a3602c803200341d8036a200341c8036a102f20032802d8032215410e460d0a200341d8026a200341d8036a41047241ec001094041a200341b8026a412010030b200341c8016a200341d8026a41ec001094041a2015410e470d0120141023411521144115102622020d0a0c0b0b200341e5036a200341206a290300370000200341ed036a200341286a290300370000200341f5036a200341306a290300370000200341033a00dc03200341073a00d803200320032903183700dd0341a886c5004100200341d8036a102c41152114411510262202450d0a0c090b200341d8006a200341c8016a41ec001094041a20141023200320153602d803200341d8036a410472200341d8006a41ec001094041a200341e4026a2002360200200341d8026a41086a200e360200200341003a00dc02200341013a00d802200341106a200341d8036a200341d8026a10d202200341fd036a2003280210453a0000200341e5036a200341186a41086a290300370000200341ed036a200341286a290300370000200341f5036a200341306a290300370000200341043a00dc03200341073a00d803200320032903183700dd0341a886c5004100200341d8036a102c411521144115102622020d080c090b41d4aac10041331021000b41154101102a000b41354101102a000b20024101102a000b41a8aac400201420081029000b41194101102a000b41394101102a000b41d4aac10041331021000b2002410d6a41002900ada844370000200241086a41002900a8a844370000200241002900a0a8443700000240024020022014413510272202450d00200220032903183700152002412d6a200341186a41186a290300370000200241256a200341186a41106a2903003700002002411d6a200341186a41086a29030037000042002107200341d8026a41186a22154200370300200341d8026a41106a22164200370300200341d8026a41086a22144200370300200342003703d80220024135200341d8026a1002200341b8026a41186a2015290300370300200341b8026a41106a2016290300370300200341b8026a41086a2014290300370300200320032903d8023703b802200341b8026a4120100320021023200341d8036a41086a22024200370300200342003703d8034188a8c4004118200341d8036a100020142002290300370300200320032903d8033703d80202400240200341d8026a411041a886c500410041001001417f460d00200342103702cc012003200341d8026a3602c801200341d8036a200341c8016a102820032802d803220d450d0320032902dc0321070c010b4101210d0b4100210802400240024002402007422088a72216450d0041002117410021084100211402400340024002402008450d00200d20144105746a2102200d201420176a4105746a21150340201420164f0d06200341186a2002460d022002200341186a4120109604450d02201720146a221820164f0d0720152002290000370000201541186a200241186a290000370000201541106a200241106a290000370000201541086a200241086a290000370000200241206a2102201541206a21152016201441016a2214470d000c050b0b200d20144105746a21020340201420164f0d05200341186a2002460d012002200341186a4120109604450d01200241206a21022016201441016a2214470d000c030b0b2017417f6a2117200841016a2108201441016a22142016470d000c020b0b410021080b200341d8036a41086a22024200370300200342003703d8034188a8c4004118200341d8036a1000200341d8026a41086a2002290300370300200320032903d8033703d802200341003602e003200342013703d8032003201620086b22143602c801200341c8016a200341d8036a1041024002402014450d00201641057420084105746b21184100200228020022146b211620032802d803210820032802dc032117200d210203400240201720166a411f4b0d00201441206a22152014490d0f2017410174220c20152015200c491b22154100480d0f024002402017450d00200820172015102722080d010c080b201510262208450d070b201521170b200820146a22152002290000370000201541186a200241186a290000370000201541106a200241106a290000370000201541086a200241086a290000370000201641606a2116201441206a2114200241206a2102201841606a22180d000b200341e0036a2014360200200320173602dc03200320083602d8030c010b2002280200211420032802dc03211720032802d80321080b200341d8026a411020082014100402402017450d00200810230b02402007a7450d00200d10230b20100d060c070b41b4c4c200201420161029000b4194c5c200201820161029000b20154101102a000b41354101102a000b41d4aac10041331021000b20144101102a000b200910230b0240200b450d00200a10230b4100211441012116410121150c0b0b2007422088a72102201921070b200b200241057422176a22152014290000370000201541186a201441186a290000370000201541106a201441106a290000370000201541086a201441086a290000370000200341d8036a41086a22144200370300200342003703d8034188a8c4004118200341d8036a1000200341d8026a41086a2014290300370300200320032903d8033703d802200341003602e003200342013703d8032003200241016a22023602c801200341c8016a200341d8036a1041024002402002450d00201741206a21084100201428020022146b211720032802d803210920032802dc032118200b210203400240201820176a411f4b0d00201441206a22152014490d052018410174220a20152015200a491b22154100480d05024002402018450d00200920182015102722090d010c080b201510262209450d070b201521180b200920146a22152002290000370000201541186a200241186a290000370000201541106a200241106a290000370000201541086a200241086a290000370000201741606a2117201441206a2114200241206a2102200841606a22080d000b200341e0036a2014360200200320183602dc03200320093602d8030c010b2014280200211420032802dc03211820032802d80321090b200341d8026a411020092014100402402018450d00200910230b02402007a7450d00200b10230b200341c8016a41186a200341d8006a41186a290300370300200341c8016a41106a200341d8006a41106a290300370300200341c8016a41086a200341d8006a41086a290300370300200320032903583703c801200341d8036a201641f0001094041a411910262202450d03200241186a41002d00bea9443a0000200241106a41002900b6a944370000200241086a41002900aea944370000200241002900a6a94437000020024119413910272202450d04200220032903c801370019200241316a200341c8016a41186a290300370000200241296a200341c8016a41106a290300370000200241216a200341c8016a41086a290300370000200341d8026a41186a22144200370300200341d8026a41106a22154200370300200341d8026a41086a22174200370300200342003703d80220024139200341d8026a1002200341b8026a41186a2014290300370300200341b8026a41106a2015290300370300200341b8026a41086a2017290300370300200320032903d8023703b802200341003602e002200342013703d802200341d8036a200341d8026a103920032802dc022114200341b8026a412020032802d802221520032802e002100402402014450d00201510230b20021023200341d8036a1024412010262202450d0520022003290338370000200241186a200341386a41186a290300370000200241106a200341386a41106a290300370000200241086a200341386a41086a290300370000200341c8016a41186a200341d8006a41186a290300370300200341c8016a41106a200341d8006a41106a290300370300200341c8016a41086a200341d8006a41086a290300370300200320032903583703c801200341f4036a4100360200200341e4036a428180808010370200200342013702ec03200320023602e003200320053602dc032003200c3602d803411510262214450d062014410d6a41002900ada844370000201441086a41002900a8a844370000201441002900a0a84437000020144115413510272214450d07201420032903c8013700152014412d6a200341c8016a41186a290300370000201441256a200341c8016a41106a2903003700002014411d6a200341c8016a41086a290300370000200341d8026a41186a22154200370300200341d8026a41106a22174200370300200341d8026a41086a22184200370300200342003703d80220144135200341d8026a1002200341b8026a41186a2015290300370300200341b8026a41106a2017290300370300200341b8026a41086a2018290300370300200320032903d8023703b802200341203602dc022003200341b8026a3602d802200341d8036a200341d8026a10ad032014102320021023200341d8036a410d6a200341386a41086a290300370000200341ed036a200341386a41106a290300370000200341d8036a411d6a200341386a41186a290300370000200341d8036a41256a2003290358370000200341d8036a412d6a200341d8006a41086a290300370000200341d8036a41356a200341d8006a41106a29030037000020034195046a200341d8006a41186a290300370000200341003a00dc03200341073a00d803200320032903383700dd03200341a4046a2005360200200341a0046a200c36020041a886c5004100200341d8036a102c0b201610234100211641012115410021140c080b101e000b20154101102a000b41194101102a000b41394101102a000b41204101102a000b41154101102a000b41354101102a000b201710242017102341002115410121160b02400240200441037122044101460d0020044102470d012016450d01200141086a28020022011024200110230c010b2015450d00200141046a28020022011024200110230b2000200236020420002014360200200341d0046a24000bfc09010b7f230041a0026b2202240002400240411210262203450d00200341106a41002f00c4ad443b0000200341086a41002900bcad44370000200341002900b4ad4437000020034112413210272203450d01200320012900003700122003412a6a200141186a290000370000200341226a200141106a2900003700002003411a6a200141086a290000370000200241e0006a41186a22014200370300200241e0006a41106a22044200370300200241e0006a41086a220542003703002002420037036020034132200241e0006a1002200241c0006a41186a2001290300370300200241c0006a41106a2004290300370300200241c0006a41086a200529030037030020022002290360370340024002400240200241c0006a412041a886c500410041001001417f460d0020014200370300200241f0006a4200370300200241e8006a420037030020024200370360200241c0006a4120200241e0006a4120410010012201417f460d022001411f4d0d02200241186a2201200241e0006a41186a2204290300370300200241106a2205200241e0006a41106a2206290300370300200241086a2207200241e0006a41086a22082903003703002002200229036037030020024180026a41186a2209200129030037030020024180026a41106a2201200529030037030020024180026a41086a220520072903003703002002200229030037038002200241c0016a41186a2009290300370300200241c0016a41106a2001290300370300200241c0016a41086a200529030037030020022002290380023703c00120044200370300200642003703002008420037030020024200370360200241c0006a4120200241e0006a4120412010012201417f460d022001411f4d0d02200241186a2201200241e0006a41186a290300370300200241106a2204200241e0006a41106a290300370300200241086a2205200241e0006a41086a2903003703002002200229036037030020024180026a41186a2206200129030037030020024180026a41106a2207200429030037030020024180026a41086a220820052903003703002002200229030037038002200241e0016a41186a22092006290300370300200241e0016a41106a22062007290300370300200241e0016a41086a2207200829030037030020022002290380023703e00120024180016a41186a2208200241c0016a41186a29030037030020024180016a41106a220a200241c0016a41106a29030037030020024180016a41086a220b200241c0016a41086a29030037030020024180016a41286a220c200729030037030020024180016a41306a2207200629030037030020024180016a41386a22062009290300370300200220022903c00137038001200220022903e0013703a001200241386a22092006290300370300200241306a22062007290300370300200241286a2207200c290300370300200241206a220c20022903a001370300200120082903003703002004200a2903003703002005200b2903003703002002200229038001370300200041013a000020002002290300370001200041096a2005290300370000200041116a2004290300370000200041196a2001290300370000200041216a200c290300370000200041296a2007290300370000200041316a2006290300370000200041396a20092903003700000c010b200041003a00000b20031023200241a0026a24000f0b41d4aac10041331021000b41124101102a000b41324101102a000b4d01017f230041206b22002400200041146a41013602002000410136021c2000418898c40036021820004201370204200041d497c4003602002000200041186a360210200041b498c4001061000b130020004100360204200041a886c5003602000b13002000410f360204200041a7e4c3003602000b130020004104360204200041d4dec3003602000b130020004101360204200041d4ddc3003602000b130020004104360204200041cdddc3003602000b130020004101360204200041b8dcc3003602000b13002000410236020420004194d8c3003602000b970101057f230041206b22022400200241186a22034200370300200241106a22044200370300200241086a22054200370300200242003703000240412010262206450d0020062002290300370000200042a0808080800437020420002006360200200641186a2003290300370000200641106a2004290300370000200641086a2005290300370000200241206a24000f0b41204101102a000bb00901097f230041106b2202240020024100360208200242013703002002410436020c2002410c6a200210410240024002400240024002400240024020022802042203200228020822046b41044f0d00200441046a22052004490d0520034101742206200520052006491b22064100480d052003450d0120022802002003200610272203450d020c030b200441046a2105200228020021030c030b2006102622030d010b20064101102a000b20022006360204200220033602000b200241086a22062005360200200320046a41eede91ab063600002002410e36020c2002410c6a200210410240024002400240024020022802042203200628020022066b410e4f0d002006410e6a22052006490d0520034101742204200520052004491b22074100480d052003450d0120022802002003200710272204450d020c030b2006410e6a2105200228020021040c030b2007102622040d010b20074101102a000b2002200736020420022004360200200721030b200241086a22072005360200200420066a220641066a41002900bce543370000200641002900b6e5433700000240200320056b41034b0d00200541046a22062005490d0120034101742208200620062008491b22064100480d010240024002402003450d0020042003200610272204450d010c020b2006102622040d010b20064101102a000b20022006360204200220043602000b2007200541046a360200200420056a410a360000024020022802042203200728020022056b41034b0d00200541046a22062005490d0120034101742207200620062007491b22064100480d010240024002402003450d0020042003200610272204450d010c020b2006102622040d010b20064101102a000b20022006360204200220043602000b200241086a2203200541046a360200200420056a41df003600000240024002400240024020022802042205200328020022046b41044f0d00200441046a22032004490d0520054101742206200320032006491b22034100480d052005450d0120022802002005200310272205450d020c030b200228020021050c030b2003102622050d010b20034101102a000b20022003360204200220053602000b200241086a2208200441046a360200200520046a41df003600002002410736020c2002410c6a200210412008280200210641c4e5c30021072002280204210503400240024002400240200520066b41084f0d00200641086a22042006490d0520054101742203200420042003491b22094100480d052005450d01200228020020052009102722030d020c060b200641086a2104200228020021030c020b200910262203450d040b2002200936020420022003360200200921050b20082004360200200320066a2007290000370000200741086a28020021090240200520046b41034b0d00200441046a22062004490d022005410174220a20062006200a491b22064100480d02024002402005450d00200320052006102722030d010c060b200610262203450d050b2002200636020420022003360200200621050b2008200441046a2206360200200320046a20093600002007410c6a22074198e6c300470d000b200241106a24002006ad4220862003ad840f0b101e000b20094101102a000b20064101102a000bad1d03037f027e077f23004180096b22022400024002402001450d00200220003602080c010b200241a886c5003602080b2002200136020c20024188076a200241086a108f0120024198076a2802002101200228029407210320022802900721042002290388072105200241f8036a2002419c076a41e4001094041a0240024002400240024002400240024002400240024002400240024002402004450d00200241f8006a200241f8036a41e4001094041a20024188076a200241086a10aa0202402002280288072200450d00200229028c072106200241146a200241f8006a41e4001094041a20024188016a200136020020024184016a20033602002002200436028001200220053703782002418c016a200241146a41e4001094042101200241f4016a2006370200200220003602f001200241f8006a108a0320022903782205500d0620024188076a2005427f7c10970220024188076a200141201096040d06200241f0016a28020021004104210741002108410021090240200241f8016a280200220141f8016c41f801490d002001410c6c220a10262207450d0e200121090b02402001450d00200141f8016c210a200141037441786a2104200721010340200220003602f80320024188076a200241f8036a108b03200141086a20024188076a41086a28020036020020012002290388073702002001410c6a2101200041f8016a2100200a41887e6a220a0d000b200441037641016a21080b4104210b4100210a4100210c02402008410c6c2201410c490d002001410c6e220c41037422004100480d0f20001026220b450d100b0240200720016a22032007460d004100210a200b210120072100034020002802002104200141046a200041086a28020036020020012004360200200141086a2101200a41016a210a2000410c6a22002003470d000b0b20024188076a200b200a108c030240200c450d00200b10230b02402008450d002008410c6c21002007210103400240200141046a280200450d00200128020010230b2001410c6a2101200041746a22000d000b0b02402009450d00200710230b0240200241cc016a220120024188076a4120109604450d0041defdc400410e100f20014120101720024188076a412010170b200120024188076a41201096040d0a200241f4016a2802002108200241f8006a41f8006a2802002107200241f8006a4180016a280200210a20024180026a200241f8006a41f8001094041a2007200a41f8016c6a21002002290380022106200721010240200a450d00200241f8036a41f8006a210420024188076a41086a210320072101034020024198066a200141f0001094041a200141f0006a2903002105200241f8026a200141f8006a4180011094041a20054203510d04200241f8036a20024198066a41f0001094041a200241f8036a41f0006a20053703002004200241f8026a4180011094041a2002200241f8036a3602f00520024188076a200241f0056a108b032003280200210a0240200228028c07450d0020022802880710230b20024188076a200241f8036a41f8011094041a2002410036028006200241f0056a20024188076a200a20024180066a108d0320022802f0054101460d07024020022802f405220a450d00200a200241f0056a41086a280200100f0b200141f8016a22012000470d000b200021010b20012000470d030c040b02402001450d00200141246c21002004210103400240024020012d0000220a41034b0d00024002400240200a0e0404000102040b2001410c6a280200450d03200141086a2802001023200141246a21012000415c6a22000d040c050b2001410c6a280200450d02200141086a2802001023200141246a21012000415c6a22000d030c040b2001410c6a280200450d01200141086a2802001023200141246a21012000415c6a22000d020c030b200141086a280200450d00200141046a28020010230b200141246a21012000415c6a22000d000b0b2003450d00200410230b2002419c076a4101360200200241013602fc032002419ce6c3003602f8032002420137028c07200241a4e6c300360288072002200241f8036a3602980720024188076a41ace6c3001061000b200141f8016a22012000460d010b20024190086a210a20024188076a41f8006a21040340200241f8026a200141f0001094041a200141f0006a290300210520024188076a200141f8006a4180011094041a20054203510d0120024198066a200241f8026a41f0001094041a200241f8036a20024188076a4180011094041a20024188076a20024198066a41f0001094041a20024188076a41f0006a20053703002004200241f8036a4180011094041a200a1024200141f8016a22012000470d000b0b02402008450d00200710230b10e00220024188076a41086a22014200370300200242003703880741f5ccc200411120024188076a1000200241f8036a41086a200129030037030020022002290388073703f803200241f8036a411010032006108e03200610ed0210910110e50220024188076a10e402200220024180026a41106a2802002209360290062002280288022103200220024188076a41106a28020022013602940620092001470d06024002402009450d0020022802900721074100210a410021080340024002402003200a6a22012d000022042007200a6a22002d0000470d0002400240024002402004417f6a220b41034b0d000240200b0e0400040203000b024020032007460d00200141016a280000200041016a280000470d050b200141106a280200220b200041106a280200470d04200141086a280200220c200041086a280200220d460d05200c200d200b1096040d040c050b20032007460d04200141016a200041016a41201096040d030c040b024020032007460d00200141016a280000200041016a280000470d030b200141106a280200220b200041106a280200470d02200141086a280200220c200041086a280200220d460d03200c200d200b1096040d020c030b2001410c6a280200220b2000410c6a280200470d01200141046a280200220c200041046a280200220d460d02200c200d200b1096040d010c020b024020032007460d00200141016a280000200041016a280000470d010b200141106a280200220b200041106a280200470d00200141086a280200220c200041086a280200220d460d01200c200d200b109604450d010b41b4eec3004114100f200241f8036a2001108f0320022802f803220b200241f8036a41086a22042802001017024020022802fc03450d00200b10230b200241f8036a2000108f0320022802f803220b20042802001017024020022802fc03450d00200b10230b20012d000020002d00002204470d030b024002400240024002402004417f6a220441034b0d00024020040e0400040203000b024020032007460d00200141016a280000200041016a280000470d080b200141106a2802002204200041106a280200470d07200141086a2802002201200041086a2802002200460d04200120002004109604450d040c070b20032007460d03200141016a200041016a4120109604450d030c060b024020032007460d00200141016a280000200041016a280000470d060b200141106a2802002204200041106a280200470d05200141086a2802002201200041086a2802002200460d02200120002004109604450d020c050b2001410c6a28020022042000410c6a280200470d04200141046a2802002201200041046a2802002200460d01200120002004109604450d010c040b024020032007460d00200141016a280000200041016a280000470d040b200141106a2802002204200041106a280200470d03200141086a2802002201200041086a2802002200460d002001200020041096040d030b200a41246a210a200841016a22082009490d000b0b024020024180026a41346a220120024188076a41346a22004120109604450d0041defdc400410e100f2001412010172000412010170b2001200041201096040d08024020024198076a2802002200450d0020024188076a41086a2802002101200041246c210003400240024020012d0000220a41034b0d00024002400240200a0e0404000102040b2001410c6a280200450d03200141086a2802001023200141246a21012000415c6a22000d040c050b2001410c6a280200450d02200141086a2802001023200141246a21012000415c6a22000d030c040b2001410c6a280200450d01200141086a2802001023200141246a21012000415c6a22000d020c030b200141086a280200450d00200141046a28020010230b200141246a21012000415c6a22000d000b0b024020024194076a280200450d0020024190076a28020010230b024020024190026a2802002200450d0020024180026a41086a2802002101200041246c210003400240024020012d0000220a41034b0d00024002400240200a0e0404000102040b2001410c6a280200450d03200141086a2802001023200141246a21012000415c6a22000d040c050b2001410c6a280200450d02200141086a2802001023200141246a21012000415c6a22000d030c040b2001410c6a280200450d01200141086a2802001023200141246a21012000415c6a22000d020c030b200141086a280200450d00200141046a28020010230b200141246a21012000415c6a22000d000b0b02402002418c026a280200450d0020024188026a28020010230b20024180096a240042010f0b41dcc6c400104f000b20022802f4052201450d0120014103460d0220014104460d0341acc6c400104f000b41b4c5c400104f000b41fcc5c400104f000b41e4c5c400104f000b4194c6c400104f000b41ccc5c400104f000b200220024190066a36028006200220024194066a3602f005200241f8036a41146a4100360200200241f8026a41146a410336020020024184036a410436020020024198066a41146a4103360200200241a886c50036028804200242013702fc03200241c4c6c4003602f803200241043602fc022002420337029c06200241d480c500360298062002200241f8036a360288032002200241f0056a36028003200220024180066a3602f8022002200241f8026a3602a80620024198066a41ccc6c4001061000b41f4c6c400104f000b200a4104102a000b101e000b20004104102a000be3780b0c7f017e017f017e067f037e0b7f0b7e017f027e177f230041800a6b22012400200141003602c003200142043703b803024002400240024002400240024002400240024002400240024002400240024002400240024002400240200041106a28020041246c2202450d0020002802082103410421044100210541002106410021070340024020032d00004101470d00200341106a2802002208417f4c0d04200341016a2800002109024002402008450d00200341086a280200210a20081026220b450d07200b200a20081094041a0c010b4101210b0b200141f0086a41086a220c200141b0056a41086a290200370300200120012902b0053703f008024020072006470d0002400240024020052006470d00200541016a220a2005490d1120054101742206200a200a2006491b2206ad42247e220d422088a70d11200da7220a4100480d112005450d012004200541246c200a102722040d020c0a0b200521060c020b200a10262204450d080b200120063602bc03200120043602b803200621050b2004200741246c6a220a2008360210200a200836020c200a200b360208200a2009360001200a41013a0000200a20012903f008370214200a411c6a200c290300370200200141b8036a41086a200741016a22073602000b200341246a21032002415c6a22020d000c020b0b4104210441002105410021070b200141003602f008418595c3004110200141f0086a41041004200141e0066a41086a22034200370300200142003703e00641af98c300410d200141e0066a1000200141d0076a41086a220a2003290300370300200120012903e0063703d00720012000290300220d3703f008200141d0076a4110200141f0086a4108100420034200370300200142003703e00641fd98c300410d200141e0066a1000200a2003290300370300200120012903e0063703d007200141103602f4082001200141d0076a3602f008200141b8036a200141f0086a10d60220034200370300200142003703e00641fc9cc3004111200141e0066a1000200a2003290300370300200120012903e0063703d007200141d0076a4110200041146a220a41201004411010262203450d03200341086a410029009299433700002003410029008a994337000020034110412010272203450d042003200d427f7c370010200141f0086a41186a22084200370300200141f0086a41106a22024200370300200141f0086a41086a220b4200370300200142003703f00820034118200141f0086a1002200141e8036a41186a2008290300370300200141e8036a41106a2002290300370300200141e8036a41086a200b290300370300200120012903f0083703e803200141e8036a4120200a4120100420031023200141e0066a41086a22034200370300200142003703e00641bc98c3004115200141e0066a1000200141d0076a41086a2003290300370300200120012903e0063703d007200141d0076a4110200041d4006a41201004200141f0086a10d4020240024002400240024020012802f4082203450d00200120033602880420012c00f008210220012802f808210e200141fc086a280200220a41d0004b0d02200e21080c010b200141013602880441002108410021024100210a0b20014188096a2000412c6a29000037030020014180096a200041246a290000370300200141f8086a2000411c6a290000370300200120002900143703f0080240200a2008470d00200841016a22032008490d0d2008410174220a20032003200a491b220ead420586220d422088a70d0d200da7220a4100480d0d2008450d022001280288042008410574200a10272203450d030c0a0b20012802880421032008210e0c0a0b200141f0086a41186a220b2000412c6a290000370300200141f0086a41106a2206200041246a290000370300200141f0086a41086a22092000411c6a290000370300200120002900143703f008200a20024d0d07200320024105746a220820012903f008370000200841186a200b290300370000200841106a2006290300370000200841086a2009290300370000200241187441808080086a41187541d1006f21020c0a0b200a102622030d070b200a4101102a000b101d000b20084101102a000b200a4104102a000b41104101102a000b41204101102a000b41a49dc3002002200a1029000b20012003360288042008210a0b2003200a4105746a220820012903f008370000200841186a200141f0086a41186a290300370000200841106a200141f0086a41106a290300370000200841086a200141f0086a41086a290300370000200a41016a210a0b200141e0066a41086a22084200370300200142003703e006418d9dc3004115200141e0066a1000200141d0076a41086a2008290300370300200120012903e0063703d007200141003602f808200142013703f008024002400240024002400240024002400240024002400240410110262208450d00200820023a000020014281808080103702f408200120083602f0082001200a3602b005200141b0056a200141f0086a104102400240024002400240200a450d00200a41057421064100200141f0086a41086a280200220a6b210220012802f008210920012802f408210b03400240200b20026a411f4b0d00200a41206a2208200a490d13200b410174220c20082008200c491b22084100480d1302400240200b450d002009200b2008102722090d010c060b200810262209450d050b2008210b0b2009200a6a22082003290000370000200841186a200341186a290000370000200841106a200341106a290000370000200841086a200341086a290000370000200241606a2102200a41206a210a200341206a2103200641606a22060d000b200141f8086a200a3602002001200b3602f408200120093602f0080c010b200141f8086a280200210a20012802f408210b20012802f00821090b200141d0076a41102009200a10040240200b450d00200910230b0240200e450d0020012802880410230b200141e0066a41086a22034200370300200142003703e00641b49dc300410d200141e0066a1000200141d0076a41086a220a2003290300370300200120012903e0063703d007200141d0076a4110100320034200370300200142003703e00641c19dc3004111200141e0066a1000200a2003290300370300200120012903e0063703d007200141d0076a4110100341121026220a450d04200a41106a41002f00e29d433b0000200a41086a41002900da9d43370000200a41002900d29d43370000200141f0086a41186a22034200370300200141f0086a41106a22084200370300200141f0086a41086a22024200370300200142003703f008200a4112200141f0086a1002200141c8036a41186a220b2003290300370300200141c8036a41106a2008290300370300200141c8036a41086a2002290300370300200120012903f0083703c803412010262203450d05200320012903c803370000200341186a200b290300370000200341106a200141c8036a41106a290300370000200341086a200141c8036a41086a290300370000200a1023200341201018200310232000290300210f200141a8036a41d198c3004115109201024020012802a8034101470d0020012903b003210d200141e0066a41086a22034200370300200142003703e00641e698c3004117200141e0066a1000200141f0086a41086a2003290300370300200120012903e0063703f008200141f0086a411041a886c500410041001001417f470d00200141e0066a41086a22034200370300200142003703e00641e698c3004117200141e0066a1000200141f0086a41086a2003290300370300200120012903e0063703f0082001200d3703b005200141f0086a4110200141b0056a410810040b200f423c824200520d09200141e0066a41086a22034200370300200142003703e00641c5cac4004114200141e0066a1000200141f0086a41086a2003290300370300200120012903e0063703f008410021100240200141f0086a411041a886c500410041001001417f460d00200141003602b005200141f0086a4110200141b0056a41044100100141016a41044d0d0320012802b00521100b200141e0066a41086a22034200370300200142003703e00641dfbac400410f200141e0066a1000200141f0086a41086a2003290300370300200120012903e0063703f008410221030240200141f0086a411041a886c500410041001001417f460d00200141003a00b005200141f0086a4110200141b0056a41014100100141016a41014d0d0720012d00b0052103200141f0086a411010030b200141f0076a20101075024002400240024020012802f007220e450d00200141f0076a41086a280200210020012802f4072111200141e0066a41086a22034200370300200142003703e00641a2adc4004112200141e0066a1000200141f0086a41086a2003290300370300200120012903e0063703f008200141003602b805200142013703b005200120003602880420014188046a200141b0056a10412000450d01200041057421064100200141b0056a41086a280200220a6b210220012802b005210920012802b405210b200e210303400240200b20026a411f4b0d00200a41206a2208200a490d15200b410174220c20082008200c491b22084100480d1502400240200b450d002009200b2008102722090d010c090b200810262209450d080b2008210b0b2009200a6a22082003290000370000200841186a200341186a290000370000200841106a200341106a290000370000200841086a200341086a290000370000200241606a2102200a41206a210a200341206a2103200641606a22060d000b200141b8056a200a3602002001200b3602b405200120093602b0050c020b200341ff01714102472003712112200141e0066a41086a22034200370300200142003703e00641a2adc4004112200141e0066a1000200141f0086a41086a2003290300370300200120012903e0063703f00841002111200141f0086a411041a886c500410041001001417f460d022001421037028c042001200141f0086a36028804200141b0056a20014188046a102820012802b005220e450d0a200141b8056a280200210020012802b40521110c0b0b200141b0056a41086a280200210a20012802b405210b20012802b00521090b200141f0086a41102009200a10040240200b450d00200910230b410121120c090b4101210e410021000c080b20084101102a000b20084101102a000b41d4aac10041331021000b41014101102a000b41124101102a000b41204101102a000b41d4aac10041331021000b41d4aac10041331021000b200141e0066a41086a22034200370300200142003703e00641c5cac4004114200141e0066a1000200141f0086a41086a2003290300370300200120012903e0063703f008410121132001201041016a22033602b005200141f0086a4110200141b0056a41041004200120033602f408200141033a00f0084100210241a886c5004100200141f0086a102c0240024002400240024002400240024002400240024002400240024002400240024002400240024020004105742203450d0020034105752210ad42e0007e220d422088a70d1a200da7220a4100480d1a200a10262213450d03200e20036a200e470d010c020b41002110200e20036a200e460d010b2000410574210b200141f0086a41206a2103200141b0056a41017221084100210220132106200e210a0340200141f0076a41186a2209200a41186a290000370300200141f0076a41106a220c200a41106a290000370300200141f0076a41086a2200200a41086a2900003703002001200a2900003703f007200141b0056a200141f0076a10fe020240024020012d00b0054101470d0020014188046a41386a200841386a29000037030020014188046a41306a200841306a29000037030020014188046a41286a200841286a29000037030020014188046a41206a200841206a29000037030020014188046a41186a200841186a29000037030020014188046a41106a200841106a29000037030020014188046a41086a200841086a29000037030020012008290000370388040c010b20014188046a41386a420037030020014188046a41306a420037030020014188046a41286a420037030020014188046a41206a420037030020014188046a41186a420037030020014188046a41106a420037030020014188046a41086a420037030020014200370388040b200a41206a210a2003200129038804370000200141f0086a41186a2009290300370300200141f0086a41106a200c290300370300200141f0086a41086a2000290300370300200341086a20014188046a41086a290300370000200341106a20014188046a41106a290300370000200341186a20014188046a41186a290300370000200341206a20014188046a41206a290300370000200341286a20014188046a41286a290300370000200341306a20014188046a41306a290300370000200341386a20014188046a41386a290300370000200120012903f0073703f008200241016a21022006200141f0086a41e00010940441e0006a2106200b41606a220b0d000b0b02402011450d00200e10230b2012450d0f4108210e410021084100211102402013200241e0006c6a220320136b221441e000490d00201441e0006e221141286c220a4100480d18200a1026220e450d030b0240201320034622150d00200241e0006c210b201341206a210a41002108200e21030340200141f0086a41186a200a41186a2900002216370300200141f0086a41106a200a41106a2900002217370300200141f0086a41086a200a41086a2900002218370300200a290000210d200141e8036a41086a22062018370300200141e8036a41106a22092017370300200141e8036a41186a220c20163703002001200d3703e8032001200d3703f008200141c8036a41186a2200200c290300370300200141c8036a41106a220c2009290300370300200141c8036a41086a22092006290300370300200120012903e8033703c803200341186a2000290300370200200341106a200c290300370200200341086a2009290300370200200320012903c803370200200341206a4201370300200341286a2103200a41e0006a210a200841016a2108200b41a07f6a220b0d000b0b4108210c200141d0076a41086a22034200370300200142003703d00741dbcbc300411b200141d0076a100020014188046a41086a2003290300370300200120012903d0073703880441002100024020014188046a411041a886c500410041001001417f460d00200142103702b405200120014188046a3602b005200141f0086a200141b0056a10890220012802f008220c450d0220012802f40821002008200141f8086a280200470d050c040b20084100460d030c040b200a4101102a000b41d4aac10041331021000b200a4108102a000b200e200c460d01417f210b200e2103200c210a0340200b41016a220b20084f0d022003200a41201096040d01200a41206a2106200341206a2109200341286a2103200a41286a210a20092903002006290300510d000b0b200141d0076a41086a22034200370300200142003703d00741aec8c3004117200141d0076a100020014188046a41086a2003290300370300200120012903d0073703880420014188046a411041a886c500410041001001417f460d01200142003703f00820014188046a4110200141f0086a41084100100141016a41084d0d0520012903f008210d200142003703f00820014188046a4110200141f0086a41084108100141016a41084d0d0520012903f008211620014188046a41101003200120083602f808200120113602f4082001200e3602f008200141f0086a200d4201201610ef0220000d020c030b02402000450d00200c10230b2011450d02200e102320120d030c090b200120083602f808200120113602f4082001200e3602f008200141f0086a42004200200d10ef022000450d010b200c10230b2012450d060b4101210e41002108410021120240201441e000490d00201441e0006e221241057422031026220e450d030b024020150d00200241e0006c2102201341c0006a210341002108200e210a0340200141f0086a41186a200341186a2900002216370300200141f0086a41106a200341106a2900002217370300200141f0086a41086a200341086a29000022183703002003290000210d200141e8036a41086a220b2018370300200141e8036a41106a22062017370300200141e8036a41186a220920163703002001200d3703e8032001200d3703f008200141c8036a41186a220c2009290300370300200141c8036a41106a22092006290300370300200141c8036a41086a2206200b290300370300200120012903e8033703c803200a41186a200c290300370000200a41106a2009290300370000200a41086a2006290300370000200a20012903c803370000200341e0006a2103200841016a2108200a41206a210a200241a07f6a22020d000b0b200141d0076a41086a22034200370300200142003703d0074192adc4004110200141d0076a1000200141e0066a41086a2003290300370300200120012903d0073703e0060240200141e0066a411041a886c500410041001001417f460d00200142103702b4052001200141e0066a3602b005200141f0086a200141b0056a102820012802f0082211450d0220012802f40821142008200141f8086a280200470d050c040b410121114100211420084100460d030c040b41d4aac10041331021000b41d4aac10041331021000b20034101102a000b0240200e2011460d002008450d0041002102200e21032011210a03402003200a41201096040d02200341206a2103200a41206a210a200241016a22022008490d000b0b02402014450d00201110230b2012450d01200e102320100d020c030b200141d0076a41086a22034200370300200142003703d0074192adc4004110200141d0076a1000200141e0066a41086a2003290300370300200120012903d0073703e006200141003602f808200142013703f008200120083602b005200141b0056a200141f0086a1041024002402008450d00200841057421094100200141f0086a41086a280200220a6b210b20012802f008210c20012802f4082106200e2103034002402006200b6a411f4b0d00200a41206a2202200a490d0c20064101742200200220022000491b22024100480d0c024002402006450d00200c200620021027220c0d010c090b20021026220c450d080b200221060b200c200a6a22022003290000370000200241186a200341186a290000370000200241106a200341106a290000370000200241086a200341086a290000370000200b41606a210b200a41206a210a200341206a2103200941606a22090d000b200141f8086a200a360200200120063602f4082001200c3602f0080c010b200141f0086a41086a280200210a20012802f408210620012802f008210c0b200141e0066a4110200c200a100402402006450d00200c10230b200141003602f808200142013703f008410110262203450d06200341003a000020014281808080103702f408200120033602f008200120083602b005200141b0056a200141f0086a104102402008450d00200841057421064100200141f0086a41086a280200220a6b210220012802f008210920012802f408210b200e210303400240200b20026a411f4b0d00200a41206a2208200a490d0b200b410174220c20082008200c491b22084100480d0b02400240200b450d002009200b2008102722090d010c090b200810262209450d080b2008210b0b2009200a6a22082003290000370000200841186a200341186a290000370000200841106a200341106a290000370000200841086a200341086a290000370000200241606a2102200a41206a210a200341206a2103200641606a22060d000b200141f8086a200a3602002001200b3602f408200120093602f0080b20014188046a41086a2203200141f0086a41086a280200360200200120012903f00837038804200141bb056a200328020036000020012001290388043700b30502402012450d00200e10230b200141fc086a200141b7056a290000370000200141e1eac98b063600f108200141023a00f008200120012900b0053700f508200141f0086a10d5022014450d00201110230b2010450d010b201310230b0240200f4280e20e82500d00200141e0066a21190c050b200141d0076a41086a22034200370300200142003703d00741f186c000411f200141d0076a1000200141e0066a41086a2003290300370300200120012903d0073703e0060240200141e0066a411041a886c500410041001001417f460d00200141003a00f008200141e0066a4110200141f0086a41014100100141016a41014d0d0320012d00f0082103200141e0066a411010032003450d00200141e0066a2119200f101f450d05200f102e1a0c050b200141e0066a2119200f102e450d04200f101f1a0c040b20024101102a000b20084101102a000b41d4aac10041331021000b41014101102a000b200141d0076a41086a22034200370300200142003703d007419087c0004113200141d0076a1000200141e0066a41086a2003290300370300200120012903d0073703e006410021030240024002400240024002400240024002402019411041a886c500410041001001417f460d00200141003602f008200141e0066a4110200141f0086a41044100100141016a41044d0d0120012802f00821030b200141d0076a41086a220a4200370300200142003703d00741a387c0004119200141d0076a1000200141e0066a41086a200a290300370300200120012903d0073703e0064100210a02402019411041a886c500410041001001417f460d00200141003602f008200141e0066a4110200141f0086a41044100100141016a41044d0d0220012802f008210a0b02400240024002402003200a4f0d00200141fc086a210b200141f8086a210802400340200141f0086a2003103820082802002202410e470d01200341016a2203200a490d000c020b0b20012903f008210d20014188046a200b41fc001094041a200141f0076a20014188046a41fc001094041a20014180096a220820023602002001200d3703f808200120033602f00820014184096a200141f0076a41fc00109404210b0240200d200f520d00200141e0066a41086a2208200141f0086a41086a290300370300200120012903f0083703e006200141b0056a200b41fc001094041a20014188046a41086a220b2008290300370300200120012903e00637038804200141f0086a200141b0056a41fc001094041a4190011026221a450d07201a200129038804370300201a2002360210201a41086a200b290300370300201a41146a200141f0086a41fc001094041a200341016a2203200a4f0d03200141f0086a41106a2109200141f0086a41146a210c200141fc086a2100200141f0086a41086a21024101211b410121080340200141f0086a2003103802402002280200220b410e470d00200341016a2203200a490d010c040b20012903f008210d20014188046a200041fc001094041a200141f0076a20014188046a41fc001094041a2009200b3602002002200d370300200120033602f008200c200141f0076a41fc001094042106200d200f520d05200141e0066a41086a220e2002290300370300200120012903f0083703e006200141b0056a200641fc001094041a200141d0076a41086a2213200e290300370300200120012903e0063703d007200141f0086a200141b0056a41fc001094041a0240201b2008470d00201b41016a2206201b490d0f201b410174220e20062006200e491b2206ad4290017e220d422088a70d0f200da7220e4100480d0f02400240201b450d00201a201b4190016c200e1027221a0d010c0c0b200e1026221a450d0b0b2006211b0b201a20084190016c6a220620012903d007370300200641086a2013290300370300200641106a200b360200200641146a200141f0086a41fc001094041a200841016a2108200341016a2203200a490d000c030b0b200810240b4100211b4108211a410021080b419001211c201a20084190016c6a211d2008450d060c070b4101211b419001211c201a41014190016c6a211d41010d060c050b20091024419001211c201a20084190016c6a211d20080d050c040b41d4aac10041331021000b41d4aac10041331021000b4190014108102a000b200e4108102a000b201a2223201d460d020c010b20014188046a41086a211e200141f0086a41086a210e200141f0086a410472210320014188046a410c6a211f20014188046a41f8006a2120200141f9086a212120014188056a2122201a212302400340202341106a280200210a2023290208210d20232802002102200141f0086a202341146a41fc001094041a2023201c6a2123200a410e460d01200141f0076a200141f0086a41fc001094041a201e200a3602002001200d37038804201f200141f0076a41fc001094041a200141b0056a2002103020012802b0052109024002400240200141b0056a41086a2213280200220a450d00200a410574210b420021242009210a4200212542002126420021274200212842002129034020014198036a200a103420014198036a41086a2903002116200129039803210d2003200a290000370000200341086a200a41086a290000370000200341106a200a41106a290000370000200341186a200a41186a290000370000200120023602f00820014190036a200141f0086a103120012d00900341017121080240024020012d0091032206450d00200141f0026a201642002006ad2217420010980420014180036a200d420020174200109804200141e0026a42004200200d4200109804427f20014180036a41086a290300221720012903f00220012903e0027c7c221820012903f80220012903e8028442005220182017547222061b2117427f20012903800320061b21180c010b200141d0026a200d2016420a420010970420012903d0022218210d200141d0026a41086a290300221721160b200a41206a210a4200201720081b20277c4200201820081b222a20267c2226202a54ad7c21272017420020081b20297c2018420020081b221720287c2228201754ad7c2129201620257c200d20247c2224200d54ad7c2125200b41606a220b0d000b20012802b405450d020c010b42002128420021294200212642002127420021244200212520012802b405450d010b200910230b200141b0056a2002103020012802b00521100240024002402013280200220a450d00200a410574210b420021182010210a4200212b4200212a4200212c4200212d4200212e03402003200a290000370000200341086a200a41086a2208290000370000200341106a200a41106a2206290000370000200341186a200a41186a2209290000370000200120023602f008200141c8026a200141f0086a103120012d00c802210c20012d00c9022100200141f0086a41186a2009290000370300200141f0086a41106a2006290000370300200e20082900003703002001200a2900003703f008200141a8026a2002200141f0086a200041101032200141a8026a41186a290300202b7c20012903b802220d20187c2218200d54ad7c212b4200200141a8026a41086a290300220d200c41017122081b202c7c420020012903a802221620081b2217202a7c222a201754ad7c212c200d420020081b202e7c2016420020081b220d202d7c222d200d54ad7c212e200a41206a210a200b41606a220b0d000b20012802b405450d020c010b4200212d4200212e4200212a4200212c420021184200212b20012802b405450d010b201010230b42002116200141d0076a41086a222f4200370300200142003703d00741ecb5c1004116200141d0076a1000200141e0066a41086a2214202f290300370300200120012903d0073703e006024002402019411041a886c500410041001001417f460d00200142003703f808200142003703f008200141e0066a4110200141f0086a411041001001220a417f460d09200a410f4d0d09200e290300210d20012903f00821160c010b4200210d0b024002400240201820247c2217420288202b20257c2017201854ad7c2218423e868422242017852018420288222520188584500d002024202584500d004100210a0240034020014198026a20172018200a41046a41fe0071109a04200a41026a210a200129039802222420178520014198026a41086a290300222520188584500d0120242025844200520d000b0b20014188026a20172018200a41fe0071109a0420012903880220014188026a41086a29030084212442002125200a450d012024420052ad21240340200141e8016a201720184100200a417e6a22082008200a4b1b220a41ff0071109a04200141f8016a20244201862230420184222b20254201862024423f88842225202b20251098042030202b20012903f80120012903e80156200141f8016a41086a2903002224200141e8016a41086a29030022315620242031511b1b2124200a0d000c030b0b420021252017201884420052ad21240c010b2024420052ad21240b0240024002400240024002402016420288200d423e86842217201685200d4202882218200d8584500d002017201884500d004100210a02400340200141d8016a2016200d200a41046a41fe0071109a04200a41026a210a20012903d8012217201685200141d8016a41086a2903002218200d8584500d0120172018844200520d000b0b200141c8016a2016200d200a41fe0071109a0420012903c801200141c8016a41086a29030084211742002118200a450d012017420052ad21170340200141a8016a2016200d4100200a417e6a22082008200a4b1b220a41ff0071109a04200141b8016a20174201862230420184222b20184201862017423f88842218202b20181098042030202b20012903b80120012903a80156200141b8016a41086a2903002217200141a8016a41086a29030022315620172031511b1b2117200a0d000b202420258450450d020c030b420021182016200d84420052ad2117202420258450450d010c020b2017420052ad21172024202584500d010b202c20277c202a20267c2216202a54ad7c212b202e20297c202d20287c220d202d54ad7c212a20222d0000220a4102460d010240200a4101470d000340202521252024212620172018844200510d0a20014188016a200d202a2026202510970420014198016a2016202b2017201810970441012115200129039801222720012903880122285420014198016a41086a290300222420014188016a41086a290300222d542024202d51220a1b0d042028202754202d202454200a1b0d02200141f8006a2027202420172018109804200141e8006a2028202d20262025109804200d200129036822247d222d202a200141e8006a41086a2903007d200d202454ad7d222784500d02202b200141f8006a41086a2903007d212820162001290378220d54210a2016200d7d21242017210d2018212a202d211720272118202621162025212b20242028200aad7d22258450450d000c040b0b0340200141d8006a2016202b202420251097042017222620182227844200510d0a200141d8006a41086a290300211720012903582118200141c8006a200d202a2026202710970441012115201820012903482228542017200141c8006a41086a290300222d542017202d51220a1b0d032028201854202d201754200a1b0d01200141386a2018201720242025109804200141286a2028202d20262027109804200d200129032822177d2218202a200141286a41086a2903007d200d201754ad7d222d84500d01202b200141386a41086a2903007d212820162001290338220d54210a2016200d7d21172024210d2025212a20182124202d2125202621162027212b20172028200aad7d22188450450d000c030b0b410021150c010b200d201656202a202b56202a202b511b21150b200141f0086a2002103020012802f408213220012802f00821330240200e280200220a450d00200a41057421342033210a0340200141c8036a41186a2208200a41186a2209290000370300200141c8036a41106a220b200a41106a220c290000370300200141c8036a41086a2206200a41086a22002900003703002001200a2900003703c803200141d0076a41186a22352009290000370300200141d0076a41106a2236200c290000370300202f2000290000370300200a290000210d200141e8036a41086a22102006290300370300200141e8036a41106a2212200b290300370300200141e8036a41186a221120082903003703002001200d3703d007200120012903c8033703e803200a290000210d200341186a22372009290000370000200341106a2238200c290000370000200341086a223920002900003700002003200d370000200120023602f008200141206a200141f0086a1031410221090240201520012d0020410171220c45734101470d0020012d0021213a200141b0056a41186a2011290300370300200141b0056a41106a201229030037030020132010290300370300200120012903e8033703b005200c21090b200141e0066a41186a2200200141b0056a41186a223b290300370300200141e0066a41106a223c200141b0056a41106a223d29030037030020142013290300370300200120012903b0053703e006024020094102470d00200a41206a210a203441606a22340d010c020b0b200141c0066a41186a223e2000290300370300200141c0066a41106a223f203c290300370300200141c0066a41086a22402014290300370300200120012903e0063703c00620014190056a41186a2241203e29030037030020014190056a41106a2242203f29030037030020014190056a41086a22432040290300370300200120012903c00637039005200141f0086a41186a22442041290300370300200141f0086a41106a22452042290300370300200e2043290300370300200142e4cab5fbb6ccdcb0e3003703b80620012001290390053703f008200141b8066a200141f0086a203a41187441187541027441a8f9c4006a3502004280e90f7e200f7c106320344120460d00203441406a21464100210c03402008200a200c6a220941386a2234290000370300200b200941306a223a2900003703002006200941286a22472900003703002001200941206a22092900003703c803203520342900003703002036203a290000370300202f20472900003703002009290000210d201020062903003703002012200b290300370300201120082903003703002001200d3703d007200120012903c8033703e803200120023602f0082009290000210d20472900002116203a29000021172037203429000037000020382017370000203920163700002003200d370000200141186a200141f0086a1031410221090240201520012d0018410171223445734101470d0020012d00192148203b2011290300370300203d201229030037030020132010290300370300200120012903e8033703b005203421090b2000203b290300370300203c203d29030037030020142013290300370300200120012903b0053703e0060240024020094102470d002046200c470d010c030b203e2000290300370300203f203c29030037030020402014290300370300200120012903e0063703c0062041203e2903003703002042203f29030037030020432040290300370300200120012903c006370390052044204129030037030020452042290300370300200e2043290300370300200142e4cab5fbb6ccdcb0e3003703b80620012001290390053703f008200141b8066a200141f0086a204841187441187541027441a8f9c4006a3502004280e90f7e200f7c10632046200c460d020b200c41206a210c0c000b0b02402032450d00203310230b2002103502400240024002400240024002402015450d00200141f0086a410c6a220a2002360200200e41043a0000200141053a00f00841a886c5004100200141f0086a102c2020290300220d4200510d01200141b0056a20014188046a4188011094041a200141c0066a200d200f7c220d1036200141f0086a200141b0056a4188011094041a200141e0066a200e41f0001094041a20012802c4062206200141c0066a41086a2208280200220a470d02200a41016a220b200a490d0b200a4101742206200b200b2006491b2206ad42f8007e2216422088a70d0b2016a722094100480d0b200a450d0320012802c006200a41f8006c20091027220b0d040c110b200141f0086a410c6a2002360200200e41053a0000200141053a00f00841a886c5004100200141f0086a102c202f4200370300200142003703d007419087c0004113200141d0076a10002014202f290300370300200120012903d0073703e0062001200241016a3602f00820194110200141f0086a41041004201e10242023201d470d060c050b200141f0086a201e41f0001094041a200141003b01b005200141106a200141f0086a200141b0056a10d20220012802102108200a200236020020212008453a0000200e41073a0000200141053a00f00841a886c5004100200141f0086a102c202f4200370300200142003703d007419087c0004113200141d0076a10002014202f290300370300200120012903d0073703e0062001200241016a3602f00820194110200141f0086a410410042023201d470d050c040b20012802c006210b0c020b20091026220b450d0d0b200120063602c4062001200b3602c0060b200b200a41f8006c22006a200141e0066a41f00010940421092008200a41016a220c360200200941f0006a200236020041171026220a450d09200a410f6a41002900cb8740370000200a41086a41002900c48740370000200a41002900bc8740370000200a4117412e1027220a450d0a200a200d370017200141f0086a41186a22084200370300200141f0086a41106a22094200370300200e4200370300200142003703f008200a411f200141f0086a1002200141d0076a41186a2008290300370300200141d0076a41106a2009290300370300202f200e290300370300200120012903f0083703d007200141203602f4082001200141d0076a3602f008200141c0066a200141f0086a105c200a10230240200c450d00200041f8006a2108200b210a03400240200a280200410e460d00200a10240b200a41f8006a210a200841887f6a22080d000b0b02402006450d00200b10230b202f4200370300200142003703d007419087c0004113200141d0076a10002014202f290300370300200120012903d0073703e0062001200241016a3602f00820194110200141f0086a410410042023201d470d010b0b201d21230b2023201d460d010b200141f0086a41106a210a200141f0086a41146a210b0340200141e0066a41086a2208202341086a290300370300200120232903003703e006202341106a2802002103200141f0086a202341146a41fc001094041a2003410e460d0120014188046a41086a22022008290300370300200120012903e00637038804200141b0056a200141f0086a41fc001094041a200a2003360200200141f0086a41086a200229030037030020012001290388043703f008200b200141b0056a41fc001094041a200a102420234190016a2223201d470d000b0b0240201b450d00201a10230b411710262203450d072003410f6a41002900cb8740370000200341086a41002900c48740370000200341002900bc874037000020034117412e10272203450d082003200f370017200141f0086a41186a220a4200370300200141f0086a41106a22084200370300200141f0086a41086a22024200370300200142003703f0082003411f200141f0086a1002200141d0076a41186a200a290300370300200141d0076a41106a2008290300370300200141d0076a41086a2002290300370300200120012903f0083703d00702400240200141d0076a412041a886c500410041001001417f460d00200142203702b4052001200141d0076a3602b005200141f0086a200141b0056a103720012802f008220e450d0b20012902f408210d200141d0076a41201003200d422088a7210a200da721130c010b410021134108210e4100210a0b20031023200e200a41f8006c22036a210202400240024002402003450d00200341887f6a2108200141f0086a4104722106200141fc086a2109200141f9086a210c200141f8086a2100200e210303402003280200210a200141b0056a200341046a41ec001094041a200a410f460d02200141f0086a200141b0056a41ec001094041a024002400240200a410e470d0020080d010c020b200341f0006a280200210b20014188046a200141f0086a41ec001094041a2001200a3602f008200620014188046a41ec001094041a200141003b01b005200141086a200141f0086a200141b0056a10d2022001280208210a2009200b360200200c200a453a0000200041073a0000200141053a00f00841a886c5004100200141f0086a102c2008450d010b200341f8006a2103200841887f6a21080c010b0b200222032002470d020c030b200e22032002470d010c020b200341f8006a22032002460d010b200141f0086a410472210803402003280200210a200141f0086a200341046a41f4001094041a200a410f460d01200141b0056a200141f0086a41f4001094041a2001200a3602f0082008200141b0056a41f4001094041a0240200a410e460d00200141f0086a10240b200341f8006a22032002470d000b0b02402013450d00200e10230b200f10880202402007450d00200741246c210a2004210303400240024020032d0000220841034b0d0002400240024020080e0404000102040b2003410c6a280200450d03200341086a2802001023200341246a2103200a415c6a220a0d040c050b2003410c6a280200450d02200341086a2802001023200341246a2103200a415c6a220a0d030c040b2003410c6a280200450d01200341086a2802001023200341246a2103200a415c6a220a0d020c030b200341086a280200450d00200341046a28020010230b200341246a2103200a415c6a220a0d000b0b02402005450d00200410230b200141800a6a24000f0b101e000b418c95c400104f000b418c95c400104f000b41d4aac10041331021000b41174101102a000b412e4101102a000b20094108102a000b41174101102a000b412e4101102a000b41d4aac10041331021000bf31103057f027e087f230041206b22022400024002400240024002400240024002400240024002400240024041fa0110262203450d00200242fa0137020420022003360200200341003b0000410221042002410236020820022802002105200228020421060240200128020022032903704202520d0041022101024020064102470d0020054102410410272205450d032002410436020420022005360200200241086a28020021010b200520016a41013a0000200241086a2205200528020041016a3602000c060b024020064102470d0020054102410410272205450d032002410436020420022005360200200241086a28020021040b200520046a4181013a0000200241086a2205200528020041016a360200200341086a200210ec0202400240024020022802042201200528020022056b41c0004f0d00200541c0006a22062005490d0920014101742205200620062005491b22054100480d092001450d0120022802002001200510272201450d020c060b200228020021010c060b2005102622010d040b20054101102a000b41fa014101102a000b41044101102a000b41044101102a000b2002200536020420022001360200200241086a28020021050b200241086a2206200541c0006a360200200120056a220541086a200341346a290000370000200541106a2003413c6a290000370000200541186a200341c4006a290000370000200541206a200341cc006a290000370000200541286a200341d4006a290000370000200541306a200341dc006a290000370000200541386a200341e4006a2900003700002005200329002c3700002003200210980202400240024002400240024002400240024002400240200341f0006a2903004201520d0020032903782207420c882208420120084201561b22084200510d0620034180016a290300200880210820022802042201200241086a28020022056b41024f0d01200541026a22062005490d0c20014101742205200620062005491b22054100480d0c2001450d0420022802002001200510272201450d050c090b0240200228020420062802002205470d00200541016a22012005490d0c20054101742206200120012006491b22064100480d0c2005450d0220022802002005200610272201450d030c070b200228020021010c070b200228020021010c080b2006102622010d040b20064101102a000b2005102622010d040b20054101102a000b41b099c300104f000b2002200636020420022001360200200241086a28020021050b200241086a200541016a360200200120056a41003a00000c020b2002200536020420022001360200200241086a28020021050b200241086a200541026a360200200120056a2008a741047420077aa7417f6a22054101200541014b1b2205410f2005410f491b723b00000b20034188016a20021039200241086a22032802002105200241003602182002420137031020022005417e6a36021c2002411c6a200241106a1041024002400240024002402003280200220541014d0d002002280218210620022802102104200228021421092003410036020020022802002103024002400240024002400240024002402005417e6a220a450d004102210b2006450d12200320042d00003a00004101210c200241086a2201200128020041016a36020020064101460d12200420066a210d200320042d00013a00012001200128020041016a3602004102210b200441026a21014100210e2006417e6a2203450d052002280204220b20056b20034f0d01200520036a220c2005490d0d200b4101742205200c200c2005491b220c4100480d0d200b450d022002280200200b200c102722050d030c0a0b0240024002402002280204220520064f0d0020054101742201200620062001491b22014100480d0f2005450d0120032005200110272203450d020c110b4100210b2006450d120c110b2001102622030d0f0b20014101102a000b200228020021050c020b200c10262205450d070b2002200c360204200220053602000b200520066a200541026a200a1095041a02402006200241086a220b280200220c460d002002280200200c6a210520062103034020034102460d03200520012d00003a0000200b200b28020041016a360200200541016a2105200141016a2101200c2003417f6a2203470d000b200d20016b2203450d030b20034100480d0820031026220c450d042006210b2003210e0b200d2001460d060c050b2006210b200a0d0b0c0c0b4101210c2006210b200d2001470d030c040b41cce3c400104f000b20034101102a000b200c4101102a000b200c20012d00003a00004101210f0240200141016a2203200d460d00200c41016a2105200620016b21010340200520032d00003a0000200541016a2105200d200341016a2203470d000b200420016a220f450d010b200c200f6a210d024002400240024020022802042203200b200a6a22056b200f4f0d002005200f6a22012005490d0520034101742205200120012005491b22054100480d052003450d01200228020020032005102722030d020c060b200228020021030c020b200510262203450d040b20022005360204200220033602000b2003200f200b6a22106a2003200b6a200a1095041a02402010200241086a22012802002203460d00200228020020036a2105200f200b6a20036b2106200c21030340200d2003460d01200520032d00003a00002001200128020041016a360200200341016a2103200541016a21052006417f6a22060d000b0b2010210b0b0240200e450d00200c10230b200a450d060c050b101e000b20054101102a000b2002200136020420022003360200200241086a280200210b0b2003200b6a220520042d00003a0000024020064101470d00200b41016a210b0c010b2006417f6a2101200441016a2103200541016a21050340200520032d00003a0000200541016a2105200341016a21032001417f6a22010d000b200b20066a210b0b200241086a200b3602004102210b200a450d010b0240200b200241086a22052802002203460d002002280200220120036a2001200b6a200a1095041a0b20052003200a6a3602000b02402009450d00200410230b20002002290300370200200041086a200241086a280200360200200241206a24000bcb03010b7f230041206b22032400024002402002450d0020024102742204102622050d0120044104102a000b410421050b0240024002400240200120024103746a22062001460d0020024103742107200141046a210420052108034020082004280200360200200441086a2104200841046a2108200741786a22070d000b200641786a20016b41037641016a21094101210a4100210b4100210403402001280200210c0240024002400240200b20046b200141046a28020022084f0d00200420086a22072004490d07200b410174220d20072007200d491b220d4100480d07200b450d01200a200b200d1027220a0d020c080b200820046a21070c020b200d1026220a450d060b200d210b0b200a20046a200c20081094041a20072104200141086a22012006470d000c020b0b4101210a410021094100210b0b200341186a22044200370300200341106a22014200370300200341086a2208420037030020034200370300200a2005200920031019200041186a2004290300370000200041106a2001290300370000200041086a2008290300370000200020032903003700000240200b450d00200a10230b02402002450d00200510230b200341206a24000f0b101e000b200d4101102a000bd41805017f017e037f017e067f230041c0066b22042400200441e8036a200141f8011094041a200441c0026a200441e8036a10960202400240024020042802c0024101470d00200041086a20042902c4023702002000420137020020032802002200450d020c010b200441c0026a41086a2903002105200441a8016a200441d0026a4198011094041a20042005370308200441086a41086a200441a8016a419801109404210602400240024020042802382201410d460d0020014102460d010c020b2004413c6a2802000d01200441fc036a4101360200200441013602c4022004418898c4003602c002200442013702ec03200441d497c4003602e8032004200441c0026a3602f803200441e8036a41d0cec3001061000b10ff02000b200441a8016a41086a22014200370300200442003703a80141bd95c300411a200441a8016a1000200441e8036a41086a2001290300370300200420042903a8013703e80341002101024002400240024002400240024002400240024002400240024002400240200441e8036a411041a886c500410041001001417f460d00200441003602c002200441e8036a4110200441c0026a41044100100141016a41044d0d0120042802c00221010b41042107200120026a41818080024f0d0d410021080240200441106a410020042903084201511b2201450d002001450d00024002400240200110d702220520012903202209520d0041032107200120021086020d11411310262207450d0d2007410f6a41002800a99943360000200741086a41002900a299433700002007410029009a994337000020074113413310272207450d0e200720012900003700132007412b6a200141186a290000370000200741236a200141106a2900003700002007411b6a200141086a290000370000200441e8036a41186a220a4200370300200441e8036a41106a220b4200370300200441e8036a41086a220c4200370300200442003703e80320074133200441e8036a1002200441c0026a41186a200a290300370300200441c0026a41106a200b290300370300200441c0026a41086a200c290300370300200420042903e8033703c002200441c0026a412041a886c500410041001001417f460d01200442003703e803200441c0026a4120200441e8036a41084100100141016a41084d0d0820042903e80342017c2105200710234113210a4113102622070d020c0f0b4101410220092005541b21070c100b42012105200710234113210a411310262207450d0d0b2007410f6a41002800a99943360000200741086a41002900a299433700002007410029009a99433700002007200a413310272207450d0d200720012900003700132007412b6a200141186a290000370000200741236a200141106a2900003700002007411b6a200141086a290000370000200441e8036a41186a22014200370300200441e8036a41106a220a4200370300200441e8036a41086a220b4200370300200442003703e80320074133200441e8036a1002200441c0026a41186a2001290300370300200441c0026a41106a200a290300370300200441c0026a41086a200b290300370300200420042903e8033703c002200420053703e803200441c0026a4120200441e8036a41081004200710230b024020032802002207450d00200341086a28020021012003280204210d4100210b0240418595c300411041a886c500410041001001417f460d00200441003602e803418595c3004110200441e8036a41044100100141016a41044d0d0520042802e803210b0b411410262208450d06200841106a41002800ef9643360000200841086a41002900e79643370000200841002900df96433700002008411441281027220a450d07200a200b360014200441e8036a41186a22084200370300200441e8036a41106a220b4200370300200441e8036a41086a220c4200370300200442003703e803200a4118200441e8036a1002200441c0026a41186a2008290300370300200441c0026a41106a200b290300370300200441c0026a41086a200c290300370300200420042903e8033703c002200441003602f003200442013703e803200420013602a801200441a8016a200441e8036a1041024002400240024020042802ec03220c20042802f003220b6b20014f0d00200b20016a2208200b490d0c200c410174220e20082008200e491b220e4100480d0c200c450d0120042802e803200c200e102722080d020c0d0b20042802e80321080c020b200e10262208450d0b0b2004200e3602ec03200420083602e803200e210c0b2008200b6a200720011094041a200441c0026a41202008200b20016a10040240200c450d00200810230b200a102341012108200d450d00200710230b20042903082105200441e8036a200441306a41f8001094041a200441c0026a200441e8036a41086a41f0001094041a200441a8016a41186a220a200641186a290300370300200441a8016a41106a220b200641106a290300370300200441a8016a41086a220c200641086a290300370300200420062903003703a80141002101024020054201520d0020044180066a41186a200a29030037030020044180066a41106a200b29030037030020044180066a41086a200c290300370300200420042903a80137038006410121010b200441a8016a200441c0026a41f0001094041a200441a0066a41186a220620044180066a41186a220a290300370300200441a0066a41106a220b20044180066a41106a220c290300370300200441a0066a41086a220d20044180066a41086a220e29030037030020042004290380063703a006200441c0026a200441a8016a41f0001094041a200441e0056a41186a220f2006290300370300200441e0056a41106a2206200b290300370300200441e0056a41086a220b200d290300370300200420042903a0063703e005200441e8036a200441c0026a41f0001094041a200a200f290300370300200c2006290300370300200e200b290300370300200420042903e005370380064102210602402001450d00200441a0066a41186a20044180066a41186a290300370300200441a0066a41106a20044180066a41106a290300370300200441a0066a41086a20044180066a41086a29030037030020042004290380063703a006410121060b200441b2016a200441a0066a41086a290300370100200441ba016a200441a0066a41106a290300370100200441a8016a411a6a200441b8066a290300370100200420063a00a901200441003a00a801200420042903a0063701aa012004200441e8036a200441a8016a10d202200428020421062004200428020022014100473a00e903200441003a00e80341a886c5004100200441e8036a102c02400240418595c300411041a886c500410041001001417f460d00200441003602e803418595c3004110200441e8036a41044100100141016a41044d0d0320042802e80341016a210a0c010b4101210a0b200441a8016a41086a220b4200370300200442003703a80141bd95c300411a200441a8016a1000200441e8036a41086a200b290300370300200420042903a8013703e80302400240200441e8036a411041a886c500410041001001417f460d00200441003602a801200441e8036a4110200441a8016a41044100100141016a41044d0d0420042802a801210b0c010b4100210b0b2004200a3602e803418595c3004110200441e8036a41041004200441a8016a41086a220a4200370300200442003703a80141bd95c300411a200441a8016a1000200441e8036a41086a200a290300370300200420042903a8013703e8032004417f2002200b6a220a200a2002491b3602a801200441e8036a4110200441a8016a410410040240024002402001450d0002402006411b470d0020014188abc400460d0220014188abc400411b109604450d020b200041086a2006360200200041046a200136020020004100360200200745200872450d020c120b20004100360204200041086a200636020020004100360200200745200872450d010c110b200041046a4104360200200041013602002007452008720d100b200341046a280200450d0f200710230c0f0b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41144101102a000b41284101102a000b101e000b200e4101102a000b41134101102a000b41334101102a000b200a4101102a000b41334101102a000b2000410136020020002007360204200441386a102420032802002200450d010b200341046a280200450d0020001023200441c0066a24000f0b200441c0066a24000bda1508027f027e027f017e0c7f017e027f017e230041c0036b22012400200141b0026a41086a22024200370300200142003703b00241c687c4004114200141b0026a1000200141e8006a41086a2002290300370300200120012903b002370368024002400240024002400240024002400240024002400240200141e8006a411041a886c500410041001001417f460d00200142003703b002200141e8006a4110200141b0026a41084100100141016a41084d0d0220012903b00222034200510d054200210420002003824200510d010c0b0b4200210420004201824200520d0a0b200141b0026a41086a22022004370300200120043703b00241aaedc300410c200141b0026a1000200141e8006a41086a22052002290300370300200120012903b00237036802400240200141e8006a411041a886c500410041001001417f460d00200142003703b802200142003703b002200141e8006a4110200141b0026a4110410010012206417f460d062006410f4d0d06200141b8026a290300210020012903b00221040c010b420021000b2001200437034020012000370348200141c8026a2000370300200141b0026a41106a2004370300200241013a0000200141093a00b00241a886c5004100200141b0026a102c200141003a005742002107200142003703602001420037035820024200370300200142003703b00241f487c4004112200141b0026a100020052002290300370300200120012903b00237036802400240200141e8006a411041a886c500410041001001417f460d00200142103702d4012001200141e8006a3602d001200141b0026a200141d0016a10920220012802b0022208450d0820012902b40221070c010b410421080b410021090240024002402007422088a72205450d00200141b0026a41096a210a20014190026a210b200141d0016a41206a210c200141e8006a41086a210d200141e8026a210e200141e0026a210f200141dc026a2110410021114100210941002102024003400240024002402009450d00200820024102746a21062008200220116a4102746a21120340200220054f0d07200141e8006a2006280200221310aa0320012903684201520d02200141d0016a200d41e0001094041a2001290340221420012903d001220354200141c0006a41086a2903002200200141d0016a41086a29030022045420002004511b450d03200141013a0057201120026a221320054f0d0a20122006280200360200200641046a2106201241046a21122005200241016a2202470d000c060b0b200820024102746a21060340200220054f0d06200141e8006a2006280200221310aa0320012903684201520d01200141d0016a200d41e0001094041a2001290340221420012903d00122035a200141c0006a41086a2903002200200141d0016a41086a29030022045a20002004511b0d02200141013a0057200641046a21062005200241016a2202470d000c040b0b2011417f6a2111200941016a2109200241016a22022005470d010c030b200241016a21022001201420037d3703402001200020047d2014200354ad7d370348411210262206450d0c200641106a41002f00c6ed433b0000200641086a41002900beed43370000200641002900b6ed4337000020064112412410272206450d0d20062013360012200141b0026a41186a22154200370300200141b0026a41106a22164200370300200141b0026a41086a22124200370300200142003703b00220064116200141b0026a1002200141a0036a41186a2015290300370300200141a0036a41106a2016290300370300200141a0036a41086a2012290300370300200120012903b0023703a003200141a0036a4120100320061023200c200141d0016a41106a290300200141d0016a41186a290300102b200141306a200b20032004108202200141d8006a41086a2206427f20062903002200200141306a41086a2903007c2001290358221420012903307c22172014542206ad7c22142006201420005420142000511b22061b3703002001427f201720061b370358200e2004370300200f2003370300201241023a000020102013360200200a200b290000370000200a41086a200b41086a290000370000200a41106a200b41106a290000370000200a41186a200b41186a290000370000200141093a00b00241a886c5004100200141b0026a102c2011417f6a2111200941016a210920022005470d000c020b0b410021090b200141b0026a41086a220b4200370300200142003703b00241f487c4004112200141b0026a1000200141e8006a41086a200b290300370300200120012903b002370368200141003602b802200142013703b0022001200520096b22023602d001200141d0016a200141b0026a1041024002402002450d00200541027420094102746b210d200b280200210220012802b4022112200821060340200628020021110240024002400240201220026b41044f0d00200241046a22052002490d0820124101742213200520052013491b22094100480d082012450d0120012802b00220122009102722130d020c0b0b200241046a210520012802b00221130c020b200910262213450d090b200120093602b402200120133602b002200921120b200641046a2106200b2005360200201320026a201136000020052102200d417c6a220d0d000c020b0b200b280200210520012802b402211220012802b00221130b200141e8006a411020132005100402402012450d00201310230b02402007a7450d00200810230b200129035821042001200141d8006a41086a2903003703b802200120043703b0022001200141b0026a360268200141e8006a107b024020012d00570d00200141b0026a41086a22024200370300200142003703b002418688c400410d200141b0026a1000200141e8006a41086a2002290300370300200120012903b002370368410021020240200141e8006a411041a886c500410041001001417f460d00200141003602b002200141e8006a4110200141b0026a41044100100141016a41044d0d0920012802b00221020b200141206a20012903402204200141c0006a41086a2205290300220042c0843d4200109704200141106a20012903202203200141206a41086a290300221442c0fb42427f1098042001200320142002ad22074200109804200520002000200141086a29030020012903002214200420012903107c20077e42c0843d8042ffffffff0f837c2203201454ad7c22142003200456201420005620142000511b22021b22147d20042004200320021b220054ad7d3703002001200420007d370340200141c8026a2014370300200141c0026a2000370300200141b0026a41086a41033a0000200141093a00b00241a886c5004100200141b0026a102c0b20012903402104200141c8026a200141c0006a41086a2205290300370300200141b0026a41106a2004370300200141b0026a41086a220241043a0000200141093a00b00241a886c5004100200141b0026a102c200529030021042001290340210020024200370300200142003703b00241aaedc300410c200141b0026a1000200141e8006a41086a2002290300370300200120012903b002370368200120043703b802200120003703b002200141e8006a4110200141b0026a41101004200141c0036a24000f0b41b4c4c200200220051029000b101e000b41d4aac10041331021000b4194c5c200201320051029000b20094101102a000b41dc87c400104f000b41d4aac10041331021000b41d4aac10041331021000b41d4aac10041331021000b41124101102a000b41244101102a000b200141c0036a24000be20f01057f230041106b220224000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020012d0000417f6a220341034b0d00024020030e0400040203000b2002410036020820024201370300410110262203450d1320024101360204200241086a22042004280200220541016a36020020022003360200200320056a41063a000020022802042205200428020022036b41044f0d07200341046a22042003490d2220054101742203200420042003491b22034100480d222005450d0f20022802002005200310272204450d100c200b2002410036020820024201370300410110262203450d1320024101360204200241086a22042004280200220541016a36020020022003360200200320056a41023a000020022802042205200428020022036b41204f0d03200341206a22042003490d2120054101742203200420042003491b22034100480d212005450d0820022802002005200310272204450d090c1d0b2002410036020820024201370300410110262203450d1320024101360204200241086a22042004280200220541016a36020020022003360200200320056a41053a000020022802042205200428020022036b41044f0d03200341046a22042003490d2020054101742203200420042003491b22034100480d202005450d0920022802002005200310272204450d0a0c1a0b2002410036020820024201370300410110262203450d1320024101360204200241086a22042004280200220541016a36020020022003360200200320056a41003a0000200141046a280200210620022001410c6a280200220136020c2002410c6a2002104120022802042205200428020022036b20014f0d03200320016a22042003490d1f20054101742203200420042003491b22034100480d1f2005450d0a20022802002005200310272204450d0b0c170b2002410036020820024201370300410110262203450d1320024101360204200241086a22042004280200220541016a36020020022003360200200320056a41043a000020022802042205200428020022036b41044f0d04200341046a22042003490d1e20054101742203200420042003491b22034100480d1e2005450d0d20022802002005200310272204450d0e0c140b200228020021040c1a0b200228020021040c170b200228020021040c140b200228020021040c190b200228020021040c100b2003102622040d140b20034101102a000b2003102622040d100b20034101102a000b2003102622040d0c0b20034101102a000b2003102622040d100b20034101102a000b2003102622040d060b20034101102a000b41014101102a000b41014101102a000b41014101102a000b41014101102a000b41014101102a000b2002200336020420022004360200200241086a28020021030b200241086a2205200341046a360200200420036a200141016a280000360000200141086a28020021062002200141106a280200220136020c2002410c6a200210410240024002400240024020022802042204200528020022036b20014f0d00200320016a22052003490d0d20044101742203200520052003491b22034100480d0d2004450d0120022802002004200310272204450d020c030b200228020021040c030b2003102622040d010b20034101102a000b2002200336020420022004360200200241086a28020021030b200241086a200320016a360200200420036a200620011094041a0c0b0b2002200336020420022004360200200241086a28020021030b200241086a200320016a360200200420036a200620011094041a0c090b2002200336020420022004360200200241086a28020021030b200241086a2205200341046a360200200420036a200141016a280000360000200141086a28020021062002200141106a280200220136020c2002410c6a200210410240024002400240024020022802042204200528020022036b20014f0d00200320016a22052003490d0920044101742203200520052003491b22034100480d092004450d0120022802002004200310272204450d020c030b200228020021040c030b2003102622040d010b20034101102a000b2002200336020420022004360200200241086a28020021030b200241086a200320016a360200200420036a200620011094041a0c070b2002200336020420022004360200200241086a28020021030b200241086a200341206a360200200420036a220341086a200141096a290000370000200341106a200141116a290000370000200341186a200141196a290000370000200320012900013700000c050b2002200336020420022004360200200241086a28020021030b200241086a2205200341046a360200200420036a200141016a280000360000200141086a28020021062002200141106a280200220136020c2002410c6a2002104102400240024020022802042204200528020022036b20014f0d00200320016a22052003490d0320044101742203200520052003491b22034100480d032004450d0120022802002004200310272204450d020c040b200228020021040c040b2003102622040d020b20034101102a000b101e000b2002200336020420022004360200200241086a28020021030b200241086a200320016a360200200420036a200620011094041a0b200020022201290200370200200041086a200141086a280200360200200241106a24000bac0301027f23004180026b22022400024002402001450d00200220003602000c010b200241a886c5003602000b2002200136020420024180016a2002108f010240200228028801450d00200241086a20024180016a41f8001094041a200241086a108a030240200241186a2802002200450d0020022802102101200041246c210003400240024020012d0000220341034b0d0002400240024020030e0404000102040b2001410c6a280200450d03200141086a2802001023200141246a21012000415c6a22000d040c050b2001410c6a280200450d02200141086a2802001023200141246a21012000415c6a22000d030c040b2001410c6a280200450d01200141086a2802001023200141246a21012000415c6a22000d020c030b200141086a280200450d00200141046a28020010230b200141246a21012000415c6a22000d000b0b0240200241146a280200450d00200241106a28020010230b20024180026a240042010f0b2002411c6a4101360200200241013602fc01200241a8e7c3003602f8012002420137020c200241a4e6c3003602082002200241f8016a360218200241086a41ace6c3001061000bdc0d01087f230041206b22022400200241003602182002420137031002400240024002400240024002400240410410262203450d0020024104360214200241186a22042004280200220541046a36020020022003360210200320056a41edcad18b06360000024002400240200228021420042802002203470d00200341016a22042003490d0620034101742205200420042005491b22044100480d062003450d0120022802102003200410272205450d020c040b200228021021050c040b2004102622050d020b20044101102a000b41044101102a000b2002200436021420022005360210200241186a28020021030b200241186a2204200341016a360200200520036a41053a0000410f200241106a1092034100210302400340200341c0cfc3006a280200200341c4cfc3006a280200200241106a10930302400240024002400240024002400240024002400240024002400240024002400240200341c8cfc3006a2802004101470d00200341cccfc3006a280200200341d0cfc3006a280200200241106a109303200341d4cfc3006a22062802004102460d010c020b2002200341cccfc3006a28020011010020022802002002280204200241106a109303200341d4cfc3006a22062802004102470d010b02400240024002400240200228021420042802002205470d00200541016a22062005490d1620054101742207200620062007491b22074100480d162005450d01200228021020052007102722060d020c040b200228021021060c020b200710262206450d020b2002200736021420022006360210200428020021050b2004200541016a360200200620056a41003a0000200341e4cfc3006a22062802004102470d020c030b20074101102a000b0240024002400240200228021420042802002205470d00200541016a22072005490d1420054101742208200720072008491b22084100480d142005450d01200228021020052008102722070d020c0d0b200228021021070c020b200810262207450d0b0b2002200836021420022007360210200428020021050b2004200541016a360200200720056a41013a00002006200241106a109403200341e4cfc3006a22062802004102460d010b0240200228021420042802002205470d00200541016a22072005490d1020054101742208200720072008491b22084100480d102005450d02200228021020052008102722070d030c0a0b200228021021070c030b0240200228021420042802002205470d00200541016a22062005490d0f20054101742207200620062007491b22074100480d0f2005450d04200228021020052007102722060d050c0a0b200228021021060c050b200810262207450d070b2002200836021420022007360210200428020021050b2004200541016a360200200720056a41013a00002006200241106a109503200341f4cfc3006a22062802004102460d030c080b200710262206450d050b2002200736021420022006360210200428020021050b2004200541016a360200200620056a41003a0000200341f4cfc3006a22062802004102470d050b0240024002400240200228021420042802002205470d00200541016a22062005490d0b20054101742207200620062007491b22074100480d0b2005450d01200228021020052007102722060d020c070b200228021021060c020b200710262206450d050b2002200736021420022006360210200428020021050b2004200541016a360200200620056a41003a0000200341c8006a220341b808470d050c060b20084101102a000b20084101102a000b20074101102a000b20074101102a000b0240024002400240200228021420042802002205470d00200541016a22072005490d0620054101742208200720072008491b22084100480d062005450d01200228021020052008102722070d020c070b200228021021070c020b200810262207450d050b2002200836021420022007360210200428020021050b2004200541016a360200200720056a41013a00002006200241106a109603200341c8006a220341b808470d000b0b200241186a2802002103200228021421072002280210210620024100360218200242013703102002200336020c2002410c6a200241106a104102400240024020022802142205200228021822046b20034f0d00200420036a22082004490d0320054101742209200820082009491b22084100480d032005450d0120022802102005200810272205450d020c050b2002280210220520046a200620031094041a200420036a21032007450d060c050b2008102622050d030b20084101102a000b101e000b20084101102a000b2002200836021420022005360210200520046a200620031094041a200420036a21032007450d010b200610230b200241206a24002003ad4220862005ad840b910701037f02400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402000413f4b0d00200141046a280200200141086a2802002202470d01200241016a22032002490d1120024101742204200320032004491b22044100480d112002450d0520012802002002200410272203450d060c170b2000418080014f0d01200141046a2802002203200141086a28020022026b41024f0d02200241026a22042002490d1020034101742202200420042002491b22024100480d102003450d0820012802002003200210272203450d090c140b200128020021030c160b20004180808080044f0d01200141046a2802002203200141086a28020022026b41044f0d04200241046a22042002490d0e20034101742202200420042002491b22024100480d0e2003450d08200128020020032002102722030d090c0f0b200128020021030c120b200141046a280200200141086a2802002202470d03200241016a22032002490d0c20024101742204200320032004491b22044100480d0c2002450d09200128020020022004102722030d0a0c0e0b2004102622030d110b20044101102a000b200128020021030c050b200128020021030c070b2002102622030d0b0b20024101102a000b200210262203450d060b20012003360200200141046a2002360200200141086a28020021020b200141086a200241046a360200200320026a20004102744102723600000f0b200410262203450d040b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41033a00000240024002400240200141046a2802002203200428020022026b41044f0d00200241046a22042002490d0420034101742202200420042002491b22024100480d042003450d01200128020020032002102722030d020c070b200128020021030c020b200210262203450d050b20012003360200200141046a2002360200200141086a28020021020b200141086a200241046a360200200320026a20003600000f0b101e000b20024101102a000b20044101102a000b20024101102a000b20012003360200200141046a2002360200200141086a28020021020b200141086a200241026a360200200320026a20004102744101723b00000f0b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a20004102743a00000bc60801037f02400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001413f4b0d00200241046a280200200241086a2802002203470d01200341016a22042003490d1920034101742205200420042005491b22054100480d192003450d0520022802002003200510272204450d060c160b2001418080014f0d01200241046a2802002204200241086a28020022036b41024f0d02200341026a22052003490d1820044101742203200520052003491b22034100480d182004450d0820022802002004200310272204450d090c130b200228020021040c150b20014180808080044f0d01200241046a2802002204200241086a28020022036b41044f0d04200341046a22052003490d1620044101742203200520052003491b22034100480d162004450d08200228020020042003102722040d090c0e0b200228020021040c110b200241046a280200200241086a2802002203470d03200341016a22042003490d1420034101742205200420042005491b22054100480d142003450d09200228020020032005102722040d0a0c0d0b2005102622040d100b20054101102a000b200228020021040c050b200228020021040c070b2003102622040d0a0b20034101102a000b200310262204450d050b20022004360200200241046a2003360200200241086a28020021030b200241086a200341046a360200200420036a20014102744102723600000c0a0b200510262204450d030b20022004360200200241046a2005360200200241086a28020021030b200241086a2205200341016a360200200420036a41033a00000240024002400240200241046a2802002204200528020022036b41044f0d00200341046a22052003490d0c20044101742203200520052003491b22034100480d0c2004450d01200228020020042003102722040d020c060b200228020021040c020b200310262204450d040b20022004360200200241046a2003360200200241086a28020021030b200241086a200341046a360200200420036a20013600000c070b20034101102a000b20054101102a000b20034101102a000b20022004360200200241046a2003360200200241086a28020021030b200241086a200341026a360200200420036a20014102744101723b00000c020b20022004360200200241046a2005360200200241086a28020021030b200241086a200341016a360200200420036a20014102743a00000b024002400240200241046a2802002204200241086a28020022036b20014f0d00200320016a22052003490d0320044101742203200520052003491b22034100480d032004450d0120022802002004200310272204450d020c040b200228020021040c040b2003102622040d020b20034101102a000b101e000b20022004360200200241046a2003360200200241086a28020021030b200241086a200320016a360200200420036a200020011094041a0bf70901097f230041206b22022400024002400240024002400240024020002802004101470d00200041046a28020021032000410c6a280200220020011092032000450d01200041d8006c2104410021050340200320056a220041046a280200200041086a2802002001109303200141046a22062802002107200141086a220828020021090240024002400240024002400240024002400240200041d4006a2d00004101470d0020072009470d01200941016a22072009490d0d2009410174220a20072007200a491b220a4100480d0d2009450d0320012802002009200a102722070d040c0e0b20072009470d01200941016a22072009490d0c2009410174220a20072007200a491b220a4100480d0c2009450d0520012802002009200a102722070d060c0e0b200128020021070c030b200128020021070c050b200a10262207450d0a0b200120073602002006200a360200200828020021090b2008200941016a360200200720096a41013a00000c030b200a10262207450d080b200120073602002006200a360200200828020021090b2008200941016a360200200720096a41003a00000b2000410c6a200110f20302400240200041346a2802004101470d00200041386a280200200041c0006a28020020011093030c010b200241106a200041386a2802002000413c6a28020028020c11000020022802102209200241106a41086a28020020011093032002280214450d00200910230b200041c8006a28020021090240200041c4006a2802004101470d002009200041d0006a280200200110f3032004200541d8006a2205470d010c030b2009200041cc006a280200200110f3032004200541d8006a2205470d000c020b0b200241086a200041046a28020011010020022802082103200228020c220020011092032000450d00200041d8006c2104410021050340200320056a220041046a280200200041086a2802002001109303200141046a22062802002107200141086a220828020021090240024002400240024002400240024002400240200041d4006a2d00004101470d0020072009470d01200941016a22072009490d0c2009410174220a20072007200a491b220a4100480d0c2009450d0320012802002009200a102722070d040c0f0b20072009470d01200941016a22072009490d0b2009410174220a20072007200a491b220a4100480d0b2009450d0520012802002009200a102722070d060c0f0b200128020021070c030b200128020021070c050b200a10262207450d0b0b200120073602002006200a360200200828020021090b2008200941016a360200200720096a41013a00000c030b200a10262207450d090b200120073602002006200a360200200828020021090b2008200941016a360200200720096a41003a00000b2000410c6a200110f20302400240200041346a2802004101470d00200041386a280200200041c0006a28020020011093030c010b200241106a200041386a2802002000413c6a28020028020c11000020022802102209200241106a41086a28020020011093032002280214450d00200910230b200041c8006a28020021090240200041c4006a2802004101470d002009200041d0006a280200200110f3032004200541d8006a2205470d010c020b2009200041cc006a280200200110f3032004200541d8006a2205470d000b0b200241206a24000f0b101e000b200a4101102a000b200a4101102a000b200a4101102a000b200a4101102a000bf40201057f230041106b220224000240024020002802004101470d00200041046a28020021032000410c6a280200220020011092032000450d012000412c6c2104410021050340200320056a220041046a280200200041086a28020020011093032000410c6a200110f403200041206a280200210602402000411c6a2802004101470d002006200041286a280200200110f30320042005412c6a2205470d010c030b2006200041246a280200200110f30320042005412c6a2205470d000c020b0b200241086a200041046a28020011010020022802082103200228020c220020011092032000450d002000412c6c2104410021050340200320056a220041046a280200200041086a28020020011093032000410c6a200110f403200041206a280200210602402000411c6a2802004101470d002006200041286a280200200110f30320042005412c6a2205470d010c020b2006200041246a280200200110f30320042005412c6a2205470d000b0b200241106a24000bda0301057f230041106b220224000240024020002802004101470d00200041046a28020021032000410c6a280200220020011092032000450d012000412c6c2104410021050340200320056a220041046a280200200041086a2802002001109303200041106a2802002106024002402000410c6a2802004101470d002006200041186a280200200110f3030c010b2006200041146a280200200110f3030b200041206a280200210602402000411c6a2802004101470d002006200041286a280200200110f30320042005412c6a2205470d010c030b2006200041246a280200200110f30320042005412c6a2205470d000c020b0b200241086a200041046a28020011010020022802082103200228020c220020011092032000450d002000412c6c2104410021050340200320056a220041046a280200200041086a2802002001109303200041106a2802002106024002402000410c6a2802004101470d002006200041186a280200200110f3030c010b2006200041146a280200200110f3030b200041206a280200210602402000411c6a2802004101470d002006200041286a280200200110f30320042005412c6a2205470d010c020b2006200041246a280200200110f30320042005412c6a2205470d000b0b200241106a24000be00301017f230041a0066b22022400024002402001450d00200220003602000c010b200241a886c5003602000b2002200136020420024198046a20021094020240024002400240024002402002290388054203510d00200241086a20024198046a41f8011094041a20024180026a200241086a41f8011094041a200220024180026a36029804200241f8036a20024198046a108b03200228028004210120024198046a20024180026a41f8011094041a20024198066a200228028004360200200220022903f8033703900620024188046a20024198046a200120024190066a108d03024002402002280288044101470d004280828898f01f200228028c04410374ad88a7210041011026210141010d010c050b200228028c0441004721004101102621014100450d040b2001450d01200141013a000020014101410210272201450d020c040b20024194026a41013602002002410136020c200241c0e7c3003602082002420137028402200241a4e6c300360280022002200241086a3602900220024180026a41ace6c3001061000b41014101102a000b41024101102a000b2001450d01200141003a0000200141014102102722010d0041024101102a000b200120003a0001200241a0066a24002001ad428080808020840f0b41014101102a000b831403037f017e0a7f230041c0016b2202240010e00220024180016a41086a22034200370300200242003703800141af98c300410d20024180016a1000200241086a41086a2204200329030037030020022002290380013703084200210502400240024002400240024002400240200241086a411041a886c500410041001001417f460d00200242003703a001200241086a4110200241a0016a41084100100141016a41084d0d0120022903a00121050b20034200370300200242003703800141f5ccc200411120024180016a1000200420032903003703002002200229038001370308200241086a411010032005108e03200510ed0210910110e50220034200370300200242003703800141a895c300411520024180016a100020024190016a41086a200329030037030020022002290380013703900120024190016a411041a886c500410041001001417f460d0141002106200241003602084104210741012108024020024190016a4110200241086a41044100100141016a41044d0d0020022802082209450d032009ad420c7e2205422088a70d042005a722034100480d040240200310262207450d00200721044100210a03400240024002400240024002400240411410262203450d00200341106a41002800ef9643360000200341086a41002900e79643370000200341002900df96433700002003411441281027220b450d01200b200a360014200241086a41186a22034200370300200241086a41106a220c4200370300200241086a41086a2206420037030020024200370308200b4118200241086a1002200241a0016a41186a2003290300370300200241a0016a41106a200c290300370300200241a0016a41086a2006290300370300200220022903083703a001200241a0016a412041a886c500410041001001417f460d052002422037020c2002200241a0016a3602082002200241086a104a02402002280200450d0020022802042203417f4c0d03024002402003450d00200310ac01220c450d0620062006280200220d200341002002280208200228020c200c2003200d1001220d200d417f461b220d200d20034b1b220d6a360200200d2003470d010c070b4101210c2002280208200228020c41014100200628020010011a41002003460d060b2003450d00200c10230b41d4aac10041331021000b41144101102a000b41284101102a000b101d000b20034101102a000b200241a0016a41201003200c0d010b4101210c410021030b200b1023200441086a2003360200200441046a20033602002004200c3602002004410c6a21042009200a41016a220a470d000b41002108200921060c040b20034104102a000b41d4aac10041331021000b41d4aac10041331021000b4100210641012108410421070b410421094100210b4100210d02400240024002402006410c6c2203410c490d002003410c6e220d41037422044100480d04200410262209450d010b0240200720036a220a2007460d004100210b200921032007210403402004280200210c200341046a200441086a2802003602002003200c360200200341086a2103200b41016a210b2004410c6a2204200a470d000b0b200241a0016a2009200b108c030240200d450d00200910230b02402006450d002006410c6c21042007210303400240200341046a280200450d00200328020010230b2003410c6a2103200441746a22040d000b0b024020080d00200710230b200241086a41186a200241a0016a41186a290300370300200241086a41106a200241a0016a41106a290300370300200241086a41086a200241a0016a41086a290300370300200220022903a00137030820024180016a41086a22034200370300200242003703800141bc98c300411520024180016a100020024190016a41086a220b200329030037030020022002290380013703900120024190016a4110200241086a41201004200241086a10e402200241003602980120024201370390010240412010262203450d00200242a080808080043702940120022003360290012003200229021c370000200341086a200241246a290200370000200341106a2002412c6a290200370000200341186a200241346a290200370000200241086a20024190016a1098020240024002402002280294012204200b280200220c6b41204f0d00200c41206a2203200c490d072004410174220b20032003200b491b220a4100480d072004450d012002280290012004200a1027220b450d020c050b200c41206a2103200228029001210b0c050b200a1026220b0d030b200a4101102a000b41204101102a000b20044104102a000b2002200a360294012002200b36029001200a21040b20024190016a41086a220a2003360200200b200c6a220c41086a200241c4006a290200370000200c41106a200241cc006a290200370000200c41186a200241d4006a290200370000200c200229023c3700000240200420036b411f4b0d00200341206a220c2003490d0120044101742206200c200c2006491b220c4100480d010240024002402004450d00200b2004200c1027220b450d010c020b200c1026220b0d010b200c4101102a000b2002200c360294012002200b360290010b200a200341206a360200200b20036a220341186a200241f4006a290200370000200341106a200241ec006a290200370000200341086a200241e4006a2902003700002003200229025c3700002002280210210e2002200241086a41106a280200220f3602a001200241a0016a20024190016a10410240200f450d00200f41246c210d20024190016a41086a22082802002103200228029401210a200e210b0340200241a0016a200b108f0320022802a00121060240024002400240200a20036b200241a0016a41086a280200220c4f0d002003200c6a22042003490d06200a4101742209200420042009491b22074100480d06200a450d01200228029001200a2007102722090d020c070b2003200c6a210420022802900121090c020b200710262209450d050b200220073602940120022009360290012007210a0b20082004360200200920036a2006200c1094041a024020022802a401450d00200610230b200b41246a210b20042103200d415c6a220d0d000b0240200f450d00200f41246c210b200e210303400240024020032d0000220c41034b0d00024002400240200c0e0404000102040b2003410c6a280200450d03200341086a2802001023200341246a2103200b415c6a220b0d040c050b2003410c6a280200450d02200341086a2802001023200341246a2103200b415c6a220b0d030c040b2003410c6a280200450d01200341086a2802001023200341246a2103200b415c6a220b0d020c030b200341086a280200450d00200341046a28020010230b200341246a2103200b415c6a220b0d000b0b200241146a280200450d040c030b20024198016a28020021042002280290012109200241146a2802000d020c030b101e000b20074101102a000b200e10230b200241c0016a24002004ad4220862009ad840bba0d03017f037e0a7f23004180026b22022400024002402001450d00200220003602080c010b200241a886c5003602080b2002200136020c20024190016a200241086a10ab010240024002402002280290012201450d0020022002290294013702142002200136021020024190016a200241106a109a032002280290014101460d0120024190016a41086a2201290300210320014200370300200242003703900141a298c300410d20024190016a1000200241206a41086a22002001290300370300200220022903900137032042002104024002400240200241206a411041a886c500410041001001417f460d002002420037039001200241206a411020024190016a41084100100141016a41084d0d0120022903900121040b20014200370300200242003703900141e698c300411720024190016a100020002001290300370300200220022903900137032002400240200241206a411041a886c500410041001001417f460d002002420037039001200241206a411020024190016a41084100100141016a41084d0d03200229039001210541f801210141f80110262206450d010c060b4203210541f801210141f801102622060d050b20014108102a000b41d4aac10041331021000b41d4aac10041331021000b200241a4016a410136020020024101360224200241d8e7c3003602202002420137029401200241a4e6c300360290012002200241206a3602a00120024190016a41ace6c3001061000b41c99bc300412820022802940120024198016a28020010c902000b200620024190016a41f000109404220742023703702007410136028801200720022903800137037820074180016a20024180016a41086a29030037030020072003200520047c220420042003541b3703900120074198016a200241206a41e0001094041a200241106a210120022802142108024002400240024003402001280200220941086a210a20092f0106220b4103742100417f210102400240024003402000450d01200141016a2101417f410141fec7c300200a4108109604220c4100481b4100200c1b220c450d03200041786a2100200a41086a210a200c4101460d000b20080d010c040b200b21012008450d030b2008417f6a2108200920014102746a41e4016a21010c010b0b200941e0006a2001410c6c6a2200450d002000280208210120002802002100200242003703900120024190016a20002001410820014108491b1094041a200141074d0d01200229039001210320024190016a41086a2201420037030020024200370390014198a4c100411520024190016a1000200241206a41086a200129030037030020022002290390013703204100210102400240200241206a411041a886c500410041001001417f460d0020024210370284012002200241206a3602800120024190016a20024180016a109301200228029001220a450d0420024198016a280200210120022802940121090c010b4108210a410021090b4100210002402001417f6a220c20014b0d00200c20014f0d00200a200c4103746a2201450d00200129030020035221000b02402009450d00200a10230b024002402000450d00200741f80141f00310272206450d05200641f8016a20024190016a41f0001094041a200642023703e8022006200337038803200641093602800320062002290380013703f002200641f8026a20024188016a29030037030020064190036a200241206a41e0001094041a4102210d0c010b4101210d0b20022802102002280214200228021810ae0120024100360228200242013703202002200d36029001200d41f8016c210e20024190016a200241206a1041200228022421092002280228210120024190016a41086a210f4100210a02400240034020022006200a6a3602800120024190016a20024180016a108b03200228029001210c0240024002400240200920016b200f28020022074f0d00200120076a22002001490d0520094101742208200020002008491b220b4100480d052009450d0120022802202009200b102722080d020c060b200120076a2100200228022021080c020b200b10262208450d040b2002200b36022420022008360220200b21090b200241206a41086a2000360200200820016a200c20071094041a0240200228029401450d00200c10230b20002101200e200a41f8016a220a470d000b200d41f8016c210a410021010340200620016a4188016a1024200a200141f8016a2201470d000b2006102320024180026a24002000ad4220862008ad840f0b101e000b200b4101102a000b41c8a6c100412b4186c8c300412810c902000b41c8a6c100412b4188f8c400412910c902000b41d4aac10041331021000b41f0034108102a000bae0201077f230041106b2202240020012802042103024002400240024003402001280200220541086a210620052f010622044103742101410021070240024003402001450d0141cdf8c400200641081096042208450d02200141786a2101200741016a2107200641086a21062008417f4a0d000b2007417f6a21040b2003450d022003417f6a2103200520044102746a41e4016a21010c010b0b200541e0006a2007410c6c6a2206450d00200628020821012006280200210620024200370308200241086a20062001410820014108491b1094041a200141074d0d01200041086a2002290308370300410021010c030b200041fef8c400360204200041086a41283602000c010b200041d5f8c400360204200041086a41293602000b410121010b20002001360200200241106a24000bb42515057f017e087f017e077f017e0c7f017e027f027e017f017e017f037e037f037e077f027e027f037e157f230041b0026b22022400024002402001450d00200220003602080c010b200241a886c5003602080b2002200136020c200241c0006a200241086a108f0102400240024002400240024020022802482203450d00200241d0006a2802002104200228024c2105200241c0006a200241086a10aa02024020022802402206450d0020022902442107200241c0006a200241086a10ab0120022802402201450d03200220022902443702142002200136021041012108200241013b012c2002420037022441f098c4002109200241f098c4003602202007422088a7220a450d0241f801210b2006200a41f8016c6a210c4108210d200241206a41086a210e41f000210f42022110410121114117211241e698c30021134100211441a886c500211541102116417f2117427f2118410321194102211a41e401211b4180f8c400211c410c211d41e000211e4107211f418801212041782121410d2122200241206a410d6a212341f098c400212442f4d2b59bc7ae98b830212541dc012126200241d4006a21274201212842818080801021294109212a42898080809001212b41a298c300212c423c212d428080808070212e4225212f20062130410021310c050b02402004450d00200441246c21012003214903400240024020492d0000220041034b0d0002400240024020000e0404000102040b2049410c6a280200450d03204941086a2802001023204941246a21492001415c6a22010d040c050b2049410c6a280200450d02204941086a2802001023204941246a21492001415c6a22010d030c040b2049410c6a280200450d01204941086a2802001023204941246a21492001415c6a22010d020c030b204941086a280200450d00204941046a28020010230b204941246a21492001415c6a22010d000b0b2005450d00200310230b200241d4006a4101360200200241013602a402200241f4e7c3003602a00220024201370244200241a4e6c3003602402002200241a0026a360250200241c0006a41ace6c3001061000b4100214041002147410021480c010b200241d4006a4101360200200241013602a402200241f4e7c3003602a00220024201370244200241a4e6c3003602402002200241a0026a360250200241c0006a41ace6c3001061000b410021010c010b410121010b037e024002400240024002400240024002400240024002400240024002400240024020010e020001010b20022802102002280214200228021810ae0102402004450d00200441246c21012003214903400240024020492d0000220041034b0d0002400240024020000e0404000102040b2049410c6a280200450d03204941086a2802001023204941246a21492001415c6a22010d040c050b2049410c6a280200450d02204941086a2802001023204941246a21492001415c6a22010d030c040b2049410c6a280200450d01204941086a2802001023204941246a21492001415c6a22010d020c030b204941086a280200450d00204941046a28020010230b204941246a21492001415c6a22010d000b0b02402005450d00200310230b2007a721000240200a450d00200a41f8016c210120064188016a2149034020491024204941f8016a2149200141887e6a22010d000b0b02402000450d00200610230b2002410036024820024201370340024002400240410110262249450d00200242818080801037024420022049360240204920083a000020494101410210272249450d01200242828080802037024420022049360240204920403a00012049410241061027224a450d0220024286808080e0003702442002204a360240204a20473600022009214902402048450d002048210120092149034020492802e40121492001417f6a22010d000b0b02402047450d004100214b4106214c417f214d4101214e410c214f41e00021504103215141082152410721534102215441e8012155410621564100215720472158410121310c0b0b4280808080e00021070c040b41014101102a000b41024101102a000b41064101102a000b0240024020310e020001010b2030200f6a2903002010520d0e20302802880122322011470d0a2030290390012133200241c0006a200d6a220142003703002002420037034020132012200241c0006a1000200241a0026a200d6a2001290300370300200220022903403703a00202400240200241a0026a201620152014201410012017460d0020024200370340200241a0026a2016200241c0006a200d2014100120116a200d4d0d04200229034021340c010b420321340b2018203420347c223520352034541b22344200510d05200241106a2136200228021421370c090b024002400240205720492f01064f0d0020492057204f6c6a20506a2101204920572051746a20526a21002057204e6a2157204c20566b20534d0d010c020b41012101024020492f01042200204928020022492f0106490d004101210103402001204e6a210120492f01042200204928020022492f01064f0d000b0b20492000204f6c6a213c204920002051746a2131204920002054746a20556a280200214902402001204e460d00204e20016b2101034020492802e40121492001204e6a22010d000b0b203c20506a2101203120526a210041002157204c20566b20534b0d010b205620526a223c2056490d0d204c204e742231203c203c2031491b223c204b480d0d02400240204c450d00204a204c203c1027224a0d010c050b203c1026224a450d040b2002203c3602442002204a3602400b200241c0006a20526a223c205620526a360200204a20566a2000290000370000200128020021312002200128020822013602a002200241a0026a200241c0006a104102400240024002402002280244224c203c28020022006b20014f0d00200020016a224a2000490d10204c204e742256204a204a2056491b2256204b480d10204c450d012002280240204c20561027224a0d020c070b2002280240214a0c020b20561026224a450d050b200220563602442002204a3602402056214c0b203c200020016a2256360200204a20006a203120011094041a2058204d6a22580d052056ad42208621070b20092048204710ae01200241b0026a24002007204aad840f0b41d4aac10041331021000b203c4101102a000b20564101102a000b41c8adc400104f000b410121310c010b410121010c070b410121010c060b4100213a0c010b410121010c010b410221010b0340024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020010e03000108080b2039201e6a203b201d6c6a2200450d09200028020821012000280200210020024200370340200241c0006a20002001200d2001200d491b1094041a2001201f4d0d0120332034802002290340223d520d02203020206a2802002132410121010c210b20322011470d072030290390012135200241c0006a200241106a109a030240024020022802402011470d00200241c0006a200d6a350200213e2002280244213f4101214020232d00000d060c010b200241c0006a200d6a220129030021414200213e2001420037030020024200370340202c2022200241c0006a1000200241a0026a200d6a22002001290300370300200220022903403703a0020240200241a0026a201620152014201410012017460d0020024200370340200241a0026a2016200241c0006a200d2014100120116a200d4d0d042002290340213e0b200142003703002002420037034020132012200241c0006a100020002001290300370300200220022903403703a002024002400240200241a0026a201620152014201410012017460d0020024200370340200241a0026a2016200241c0006a200d2014100120116a200d4d0d072002290340214220352041202d7c580d020c010b4203214220352041202d7c580d010b2043202e83202f84213e41a49bc300213f4101214020232d0000450d010c060b4100214020352042203e7c223e5a0d0820232d00000d050b024002402040450d0020022802202002280224200e28020010ae012002420037022420022024360220200220253703a0020c010b20022802202144200220253703a00220442024460d00200228022421450c1b0b201b10262244450d0541002145204441003b0106204441003602002044200d6a200241c0006a20261094041a20024100360224200220443602200c190b203d4280808080708342298421354188f8c40021090c080b41c8aec4002109413121472002412d6a2d0000450d080c090b41d4aac10041331021000b41d4aac10041331021000b4194e5c300412241b6e4c300413110c902000b41e4014104102a000b02400240203a0e020001010b20362802002239200d6a210020392f0106223820197421014100213b024003402001450d01201c2000200d109604223c450d17200120216a2101203b20116a213b2000200d6a2100203c20174a0d000b203b20176a21380b2037450d02203720176a213720392038201a746a201b6a21364100213a0c160b2044200d6a210020442f010622462019742101417f213c02400240024003402001450d01200241a0026a2000200d1096042138200120216a2101203c20116a213c2000200d6a21002017201120382014481b201420381b22382011460d000b2038450d0d20450d010c020b2046213c2045450d010b204520176a21452044203c201a746a201b6a28020021444101213a0c170b20272025370200200241c0006a20166a200e360200200241c0006a201d6a203c360200200241c0006a200d6a200241206a3602002002204436024420022014360240200241a0026a200d6a22002014360200200220283703a0022011102621010240024002400240024002402040450d002001450d11200120113a0000200220293702a402200220013602a0022002203ea72201360230200241306a200241a0026a104120022802a40222382000280200223c6b20014f0d01203c20016a2232203c490d2020382011742246203220322046491b22322014480d202038450d0220022802a00220382032102722380d030c120b2001450d12200120143a0000200220293702a402200220013602a00220012011202a10272201450d132001203e3700012002202b3702a402200220013602a0020c040b20022802a00221380c020b203210262238450d0f0b200220323602a402200220383602a0020b2000203c20016a3602002038203c6a203f20011094041a0b200241306a200d6a2000280200360200200220022903a002370330200241c0006a200241306a10ad01202320403a0000200241206a201d6a20143a0000203e214320400d050b2030200b6a2230200c470d100c1a0b203d42808080807083421c84213541b1f8c40021090b2035a721472002412d6a2d00000d010b20022802202002280224200241206a41086a28020010ae0120024200370224200241f098c400360220200242e1eac98bb68edbb7f4003703a00241e40110262201450d0c200141003b010620014100360200200141086a200241c0006a41dc011094041a200241003602242002200136022020012f01062238410374214041002100417f213c034020402000460d03200120006a2148200041086a2100203c41016a213c417f4101200241a0026a204841086a410810960422484100481b410020481b22484101460d000b2048450d0b0c030b4194e5c300412241b6e4c300413110c902000b200241286a28020021470c020b2038213c0b200242e1eac98bb68edbb7f4003702542002200e3602502002203c36024c20022001360244200241003602402002200241206a360248200241003602a802200242013703a00220022047360230200241306a200241a0026a1041024002400240024020022802a402220020022802a80222016b20474f0d00200120476a223c2001490d1620004101742248203c203c2048491b223c4100480d162000450d0120022802a0022000203c10272200450d050c020b20022802a00221000c020b203c10262200450d030b2002203c3602a402200220003602a0020b200241a0026a41086a223c200120476a360200200020016a200920471094041a200241306a41086a203c280200360200200220022903a002370330200241c0006a200241306a10ad012002412c6a4180023b0100200241206a41086a2802002147410121400b200228022421482002280220210941002108410021010c130b203c4101102a000b4194e5c300412241e7e4c300412d10c902000b41014101102a000b20324101102a000b41014101102a000b41094101102a000b4194e5c300412241e7e4c300412d10c902000b41e4014104102a000b41002131410121010c0a0b4101213a0c040b4101213a0c040b410021010c040b410221010c030b410221010c020b410221010c010b410221010c000b0b101e000b2002412d6a2d000021402002412c6a2d00002108200241286a28020021472002280224214820022802202109410021010c000b0b7901027f230041206b22022400200241a886c500410010e3010240412010262203450d0020032002290300370000200341186a200241186a290300370000200341106a200241106a290300370000200341086a200241086a290300370000200241206a24002003ad42808080808004840f0b41204101102a000bbe1503057f027e077f230041c0086b22022400024002402001450d00200220003602080c010b200241a886c5003602080b2002200136020c200241c8066a200241086a1094020240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020022903b8074203510d00200241106a200241c8066a41f8011094041a20024188026a200241106a41f8011094041a200220024188026a3602a005200241c8066a200241a0056a108b0320022802d0062101024020022802cc06450d0020022802c80610230b200241c8066a20024188026a41f8011094041a200241a0056a200241c8066a1096020240024002400240024002400240024020022802a0054101470d0020022802a405210120022802a8052200411a460d0120004115470d024102210341f6012104200141d9cac400460d10200141d9cac40041151096040d020c100b20024180046a200241a0056a41086a41a0011094041a4100210320024180046a41086a2205410020022903800442015122061b210002402006450d002000450d03410321040240200520011086020d00200510d702210741012104200041206a290300220820075a0d080b200241b0046a1024200241003602d006200242013703c8060c120b2000450d0441ec0121040c030b41002104200141eecac400460d0441002103200141eecac400411a109604450d0e0b4100210341810121040c0d0b41f60121040b0c0a0b200241a0056a200241a8046a41f8001094041a200241c8066a200241a8056a41f0001094041a41002104200241003a00b807200241c8066a1024410021030c0b0b410021030c090b410c1026220f450d01412010262200450d0220002005290000370000200041186a200541186a290000370000200041106a200541106a290000370000200041086a200541086a2900003700002000412041c00010272200450d0320002008370020200f42c08080808005370204200f200036020002400240200720085a0d00410c1026220b450d06412010262200450d0720002005290000370000200041186a200541186a290000370000200041106a200541106a290000370000200041086a200541086a2900003700002000412041c00010272200450d0820002008427f7c370020200b42c08080808005370204200b2000360200410121090c010b410021094104210b0b2001ad210741012104410121030c070b2002419c026a4101360200200241013602142002418ce8c3003602102002420137028c02200241a4e6c300360288022002200241106a3602980220024188026a41ace6c3001061000b410c4104102a000b41204101102a000b41c0004101102a000b410c4104102a000b41204101102a000b41c0004101102a000b200241b0046a10240c010b0b200241003602d006200242013703c80620034101460d0120034102470d00410110262201450d0c200241013602cc06200241d0066a22002000280200220641016a360200200220013602c806200120066a41023a000020022802cc0620002802002201470d04200141016a22002001490d1020014101742206200020002006491b22064100480d102001450d0920022802c8062001200610272200450d0a0c150b410110262201450d0a200241013602cc06200241d0066a22002000280200220641016a360200200220013602c806200120066a41003a000020022802cc0620002802002201470d01200141016a22002001490d0f20014101742206200020002006491b22064100480d0f2001450d0420022802c8062001200610272200450d050c120b410110262201450d0b200241c8066a41086a22002000280200220641016a360200200241013602cc06200220013602c806200120066a41013a000020022802cc062206200028020022016b41084f0d01200141086a22002001490d0e20064101742201200020002001491b22014100480d0e2006450d0520022802c8062006200110272200450d060c0c0b20022802c80621000c110b20022802c80621000c0b0b20022802c80621000c110b2006102622000d0d0b20064101102a000b2001102622000d060b20014101102a000b2006102622000d0b0b20064101102a000b41014101102a000b41014101102a000b41014101102a000b200220013602cc06200220003602c806200241d0066a28020021010b200241c8066a41086a2205200141086a360200200020016a2007370000200220093602880220024188026a200241c8066a104102400240024002402009450d00200b2009410c6c6a210a200b210603402006280200210c2002200641086a28020022013602880220024188026a200241c8066a1041024002400240024020022802cc06220d200528020022006b20014f0d00200020016a220e2000490d09200d4101742200200e200e2000491b22004100480d09200d450d0120022802c806200d20001027220d0d020c060b20022802c806210d0c020b20001026220d450d040b200220003602cc062002200d3602c806200528020021000b2005200020016a360200200d20006a200c20011094041a2006410c6a2206200a470d000b0b200241013602880220024188026a200241c8066a1041200f280200210d2002200f28020822013602880220024188026a200241c8066a104102400240024020022802cc062206200528020022006b20014f0d00200020016a22052000490d0620064101742200200520052000491b22004100480d062006450d0120022802c8062006200010272206450d020c040b20022802c80621060c040b2000102622060d020b20004101102a000b20004101102a000b200220003602cc06200220063602c806200241d0066a28020021000b200241c8066a41086a2205200020016a360200200620006a200d20011094041a0240024002400240024020022802cc062200200528020022016b41084f0d00200141086a22062001490d0520004101742201200620062001491b22014100480d052000450d0120022802c8062000200110272200450d020c030b20022802c80621000c030b2001102622000d010b20014101102a000b200220013602cc06200220003602c806200241d0066a28020021010b200241c8066a41086a2206200141086a360200200020016a427f37000002400240024020022802cc0620062802002201470d00200141016a22002001490d0320014101742206200020002006491b22064100480d032001450d0120022802c8062001200610272200450d020c040b20022802c80621000c040b2006102622000d020b20064101102a000b101e000b200220063602cc06200220003602c806200241d0066a28020021010b200241d0066a2206200141016a360200200020016a20043a00002006280200210620022802c806210520034101470d0502402009450d002009410c6c2100200b210103400240200141046a280200450d00200128020010230b2001410c6a2101200041746a22000d000b2009450d00200b10230b0240200f41046a280200450d00200f28020010230b200f10230c050b200220063602cc06200220003602c806200241d0066a28020021010b200241d0066a200141016a360200200020016a20043a00000c020b200220063602cc06200220003602c806200241d0066a28020021010b200241d0066a200141016a360200200020016a20043a00000b200241d0066a280200210620022802c80621050b200241c0086a24002006ad4220862005ad840b6101017f230041206b220224000240200141074d0d00200241206a240042010f0b200241146a41013602002002410136021c200241a8e8c30036021820024201370204200241a4e6c3003602002002200241186a360210200241ace6c3001061000baa0a05027f027e027f017e067f230041d0006b22022400024002402001450d00200220003602080c010b200241a886c5003602080b2002200136020c200241206a200241086a1090010240024002400240024002400240024020022802202203450d00200220022902242204370214200220033602102002410136024820024198e6c30036024c200241206a200241106a200241c8006a10a0030240024002400240200229032022054202520d0041002100410021060c010b200241386a2802002101200241346a28020021072002290328210820054201520d010240200228023c450d00200110230b41002100410021060b0c010b200241306a280200220021060b2002410036022820024201370320410110262109024002400240024002402006450d002009450d06200242818080801037022420022009360220200941013a000020022001360248200241c8006a200241206a10412001450d012000200141286c6a210a200241206a41086a220b2802002100200228022421092006210103400240024002400240200920006b41204f0d00200041206a220c2000490d0e2009410174220d200c200c200d491b220e4100480d0e2009450d0120022802202009200e1027220d0d020c080b200041206a210c2002280220210d0c020b200e1026220d450d060b2002200e3602242002200d360220200e21090b200b200c360200200d20006a220041186a200141186a290000370000200041106a200141106a290000370000200041086a200141086a29000037000020002001290000370000200141206a290300210502400240024002402009200c6b41084f0d00200c41086a2200200c490d0e2009410174220e20002000200e491b220e4100480d0e2009450d01200d2009200e1027220d0d020c090b200c41086a21000c020b200e1026220d450d070b2002200e3602242002200d360220200e21090b200b2000360200200d200c6a2005370000200a200141286a2201470d000b41082101200920006b41084f0d020c080b2009450d06200242818080801037022420022009360220200941003a000042808080801021050c0b0b4108210120022802242209200241286a28020022006b4108490d060b200228022021090c080b200e4101102a000b200e4101102a000b200241346a410136020020024101360214200241c0e8c30036021020024201370224200241a4e6c3003602202002200241106a360230200241206a41ace6c3001061000b41014101102a000b41014101102a000b200020016a22012000490d002009410174220c20012001200c491b22014100480d00024002402009450d0020022802202009200110272209450d010c030b2001102622090d020b20014101102a000b101e000b20022001360224200220093602200b200241206a41086a200041086a2201360200200920006a20083700002001ad42208621052006450d002007450d00200610230b2004a7210d02402004422088a72201450d00200141246c21002003210103400240024020012d0000220c41034b0d00024002400240200c0e0404000102040b2001410c6a280200450d03200141086a2802001023200141246a21012000415c6a22000d040c050b2001410c6a280200450d02200141086a2802001023200141246a21012000415c6a22000d030c040b2001410c6a280200450d01200141086a2802001023200141246a21012000415c6a22000d020c030b200141086a280200450d00200141046a28020010230b200141246a21012000415c6a22000d000b0b0240200d450d00200310230b200241d0006a240020052009ad840be10803067f017e017f230041e0006b220324002003200236021020032001280200220236020820032002200128020841246c22016a220436020c2003200341086a41086a3602140240024002400240024002402001419001490d00200341386a41086a210103402003200241246a360208200341386a200341146a200210a503200341186a41086a2202200141086a2204290300370300200341186a41106a2205200141106a2206290300370300200341186a41186a2207200141186a220829030037030020032001290300370318200329033822094202520d0220032003280208220a41246a360208200341386a200341146a200a10a50320022004290300370300200520062903003703002007200829030037030020032001290300370318200329033822094202520d0320032003280208220a41246a360208200341386a200341146a200a10a50320022004290300370300200520062903003703002007200829030037030020032001290300370318200329033822094202520d0420032003280208220a41246a360208200341386a200341146a200a10a50320022004290300370300200520062903003703002007200829030037030020032001290300370318200329033822094202520d05200328020c2204200328020822026b418f014b0d000b0b0240024020022004460d00200341386a41086a210103402003200241246a360208200341386a200341146a200210a503200341186a41086a200141086a290300370300200341186a41106a200141106a290300370300200341186a41186a200141186a29030037030020032001290300370318200329033822094202520d0220032802082202200328020c470d000b0b20004202370300200341e0006a24000f0b200341386a41186a200341186a41186a290300370300200341386a41106a200341186a41106a290300370300200341386a41086a200341186a41086a290300370300200320032903183703380c040b200341386a41186a200341186a41186a290300370300200341386a41106a200341186a41106a290300370300200341386a41086a200341186a41086a290300370300200320032903183703380c030b200341386a41186a200341186a41186a290300370300200341386a41106a200341186a41106a290300370300200341386a41086a200341186a41086a290300370300200320032903183703380c020b200341386a41186a200341186a41186a290300370300200341386a41106a200341186a41106a290300370300200341386a41086a200341186a41086a290300370300200320032903183703380c010b200341386a41186a200341186a41186a290300370300200341386a41106a200341186a41106a290300370300200341386a41086a200341186a41086a290300370300200320032903183703380b2000200937030020002003290338370308200041106a200341c0006a290300370300200041186a200341386a41106a290300370300200041206a200341386a41186a290300370300200341e0006a24000bd50a05027f027e047f017e067f230041d0006b22022400024002402001450d00200220003602080c010b200241a886c5003602080b2002200136020c200241206a200241086a10900102400240024002400240024002400240024020022802202203450d00200220022902242204370214200220033602102002410136024820024198e6c30036024c200241206a200241106a200241c8006a10a00302400240200229032022054202520d0041002101410021060c010b200241c0006a2802002100200241386a2802002101200241306a2802002107200228023c2108200228023421092002290328210a024020054201520d00200121060c010b02402009450d002007102341002101410021060c010b4100210141002106410021090b200241003602282002420137032041011026210b024002400240024002402006450d00200b450d0620024281808080103702242002200b360220200b41013a0000200b410141091027220c450d072002428980808090013702242002200c360220200c200a37000120022000360248200241c8006a200241206a10412000450d012001200041286c6a210d200241206a41086a220e280200210f2002280224210c03400240024002400240200c200f6b41204f0d00200f41206a2200200f490d0f200c410174220b20002000200b491b22104100480d0f200c450d012002280220200c20101027220b0d020c080b200f41206a21002002280220210b0c020b20101026220b450d060b200220103602242002200b3602202010210c0b200e2000360200200b200f6a220f41186a200141186a290000370000200f41106a200141106a290000370000200f41086a200141086a290000370000200f2001290000370000200141206a290300210a0240200c20006b41074b0d00200041086a220f2000490d0c200c4101742210200f200f2010491b220f4100480d0c02400240200c450d00200b200c200f1027220b0d010c080b200f1026220b450d070b2002200f3602242002200b360220200f210c0b200e200041086a220f360200200b20006a200a370000200d200141286a2201470d000b41082101200c200f6b41084f0d020c090b200b450d074101210f200241013602242002200b360220200b41003a00000c0c0b410821012002280224220c200241286a280200220f6b4108490d070b2002280220210b0c090b20104101102a000b200f4101102a000b200241346a410136020020024101360214200241e0e8c30036021020024201370224200241a4e6c3003602202002200241106a360230200241206a41ace6c3001061000b41014101102a000b41094101102a000b41014101102a000b200f20016a2201200f490d00200c4101742200200120012000491b22014100480d0002400240200c450d002002280220200c20011027220b450d010c030b20011026220b0d020b20014101102a000b101e000b200220013602242002200b3602200b200b200f6a2009ad4220862007ad84370000200f41086a210f2008450d00200610230b2004a7210e02402004422088a72201450d00200141246c21002003210103400240024020012d0000220c41034b0d00024002400240200c0e0404000102040b2001410c6a280200450d03200141086a2802001023200141246a21012000415c6a22000d040c050b2001410c6a280200450d02200141086a2802001023200141246a21012000415c6a22000d030c040b2001410c6a280200450d01200141086a2802001023200141246a21012000415c6a22000d020c030b200141086a280200450d00200141046a28020010230b200141246a21012000415c6a22000d000b0b0240200e450d00200310230b200241d0006a2400200fad422086200bad840baa05020b7f017e230041306b2202240041082103200241206a41086a220442003703002002420037032041dbcbc300411b200241206a1000200241086a20042903003703002002200229032037030041002104024002400240024002402002411041a886c500410041001001417f460d002002421037021420022002360210200241206a200241106a10890220022802202203450d02200241286a2802002104200228022421050c010b410021050b2002410036022820024201370320200220043602002002200241206a104102400240024002402004450d002003200441286c6a2106200241206a41086a22072802002108200228022421092003210403400240024002400240200920086b41204f0d00200841206a220a2008490d062009410174220b200a200a200b491b220c4100480d062009450d0120022802202009200c1027220b0d020c070b200841206a210a2002280220210b0c020b200c1026220b450d050b2002200c3602242002200b360220200c21090b2007200a360200200b20086a220841186a200441186a290000370000200841106a200441106a290000370000200841086a200441086a29000037000020082004290000370000200441206a290300210d02400240024002402009200a6b41084f0d00200a41086a2208200a490d062009410174220c20082008200c491b220c4100480d062009450d01200b2009200c1027220b0d020c080b200a41086a21080c020b200c1026220b450d060b2002200c3602242002200b360220200c21090b20072008360200200b200a6a200d3700002006200441286a2204470d000b2005450d060c050b200241286a28020021082002280220210b20050d040c050b101e000b200c4101102a000b200c4101102a000b41d4aac10041331021000b200310230b200241306a24002008ad422086200bad840be90104027f017e017f017e230041206b22022400200241106a41086a220342003703002002420037031041e698c3004117200241106a1000200241086a20032903003703002002200229031037030002400240024002402002411041a886c500410041001001417f460d002002420037031020024110200241106a41084100100141016a41084d0d022002290310210441082105410810262203450d010c030b42032104410821054108102622030d020b20054101102a000b41d4aac10041331021000b2003427f200420047c220620062004541b370000200241206a24002003ad42808080808001840b940403017f017e087f230041306b2202240042002103200241206a41086a22044200370300200242003703204192adc4004110200241206a1000200241086a200429030037030020022002290320370300024002400240024002402002411041a886c500410041001001417f460d002002421037021420022002360210200241206a200241106a102820022802202205450d02200229022421030c010b410121050b200241003602282002420137032020022003422088a722043602002002200241206a10410240024002402004450d0020044105742106200241206a41086a280200210720022802202108200228022421092005210403400240024002400240200920076b41204f0d00200741206a220a2007490d062009410174220b200a200a200b491b220b4100480d062009450d0120082009200b102722080d020c070b200741206a210a0c020b200b10262208450d050b200b21090b200820076a22072004290000370000200741186a200441186a290000370000200741106a200441106a290000370000200741086a200441086a290000370000200a2107200441206a2104200641606a22060d000b200241286a200a36020020022009360224200220083602202003a7450d050c040b200241286a280200210a200228022021082003a70d030c040b101e000b200b4101102a000b41d4aac10041331021000b200510230b200241306a2400200aad4220862008ad840be20602047f027e230041206b220324002001280200280200220128020421042001280200210102400240024002400240024002400240024020022d0000417f6a220541034b0d00024020050e0400040203000b200241086a210641012105200241016a210220014101470d050c040b200241016a21024100210520014101460d030c040b200241086a2106200241016a21024103210520014101470d030c020b41042105200241046a210220014101470d020c010b200241086a2106200241016a21024102210520014101470d010b20054102470d0220022004460d0120022800002004280000470d020c010b0240024020014102460d0020014103470d012002210620054104460d020c030b20054103470d0220022004460d0120022800002004280000470d020c010b20054101470d0120022004460d0020022800002004280000470d010b2006280200210120032006280208220236020c20032001360208200341003a0010200341106a2001200241004722051094041a20022005490d012003200220056b220636020c2003200120056a22013602082002450d00024002400240024020032d001022024101460d0020020d04200341106a200341086a10a70220032802102205450d04200329021421074200210820034200370310200341106a20032802082206200328020c2202410820024108491b22011094041a2003200220016b36020c2003200620016a3602082007a72101200241074d0d022007422088a72102200329031021070c010b20034200370310200341106a20012006410820064108491b22021094041a2003200620026b36020c2003200120026a360208200641074d0d0320032903102107200341106a200341086a10a70220032802102202450d032003290214210820034200370310200341106a20032802082206200328020c2201410820014108491b22051094041a2003200120056b36020c2003200620056a3602082008a72106200141074d0d022008422088a721042003280214210120032802102105420121080b2000200636021c200020013602142000200737030820002008370300200041206a2004360200200041186a2002360200200041106a2005360200200341206a24000f0b2001450d01200510230c010b2006450d00200210230b20004202370300200341206a24000f0b200520021048000b130020004105360204200041c8f0c3003602000b130020004108360204200041c1fbc3003602000b130020004108360204200041ccfbc3003602000b3201017f0240410810262202450d0020004288808080800137020420002002360200200242013700000f0b41084101102a000b870301047f23004180026b22022400024002400240411210262203450d00200341106a41002f00c6ed433b0000200341086a41002900beed43370000200341002900b6ed4337000020034112412410272203450d012003200136001220024198016a41186a2201420037030020024198016a41106a2204420037030020024198016a41086a2205420037030020024200370398012003411620024198016a1002200241e8006a41186a2001290300370300200241e8006a41106a2004290300370300200241e8006a41086a2005290300370300200220022903980137036802400240200241e8006a412041a886c500410041001001417f460d002002422037028c012002200241e8006a3602880120024198016a20024188016a10ab032002290398014201520d04200241086a20024198016a41086a41e0001094041a20004201370300200041086a200241086a41e0001094041a0c010b200042003703000b2003102320024180026a24000f0b41124101102a000b41244101102a000b41d4aac10041331021000bf20904067f027e027f027e230041e0016b22022400200241c0016a41186a22034200370300200241c0016a41106a22044200370300200241c0016a41086a22054200370300200242003703c0012001410020012802002001280204200241c0016a41202001280208100122062006417f461b2206412020064120491b20012802086a220736020802400240024002402006411f4d0d00200241a0016a41186a22062003290300370300200241a0016a41106a22032004290300370300200241a0016a41086a22042005290300370300200220022903c0013703a00120024180016a41186a2205200629030037030020024180016a41106a2206200329030037030020024180016a41086a22032004290300370300200220022903a00137038001200241c0006a41186a2005290300370300200241c0006a41106a2006290300370300200241c0006a41086a20032903003703002002200229038001370340200242003703c801200242003703c001200141086a220341002001280200200141046a2204280200200241c0016a41102007100122062006417f461b2206411020064110491b20032802006a22033602002006410f4d0d01200241c0016a41086a2207290300210820022903c0012109200241c0016a41186a220a4200370300200241c0016a41106a220b420037030020074200370300200242003703c001200141086a2205410020012802002004280200200241c0016a41202003100122062006417f461b2206412020064120491b20052802006a22033602002006411f4d0d02200241a0016a41186a2206200a290300370300200241a0016a41106a2204200b290300370300200241a0016a41086a220a2007290300370300200220022903c0013703a00120024180016a41186a2207200629030037030020024180016a41106a2206200429030037030020024180016a41086a2204200a290300370300200220022903a00137038001200241e0006a41186a2007290300370300200241e0006a41106a2006290300370300200241e0006a41086a20042903003703002002200229038001370360200242003703c801200242003703c001200541002001280200200141046a280200200241c0016a41102003100122012001417f461b2201411020014110491b20052802006a3602002001410f4d0d03200241c0016a41086a290300210c20022903c001210d200241206a41186a2201200241c0006a41186a290300370300200241206a41106a2206200241c0006a41106a290300370300200241206a41086a2203200241c0006a41086a290300370300200241086a2204200241e0006a41086a290300370300200241106a2205200241e0006a41106a290300370300200241186a2207200241e0006a41186a2903003703002002200229034037032020022002290360370300200041206a200c370300200041186a200d370300200041106a200837030020002009370308200041286a2002290320370300200041306a2003290300370300200041386a2006290300370300200041c0006a2001290300370300200041c8006a2002290300370300200041d0006a2004290300370300200041d8006a2005290300370300200041e0006a200729030037030020004201370300200241e0016a24000f0b20004200370300200241e0016a24000f0b20004200370300200241e0016a24000f0b20004200370300200241e0016a24000f0b20004200370300200241e0016a24000bcf0202027f017e23004180016b22022400200028020021000240024002400240200128020022034110710d002000290300210420034120710d0120044101200110cc02210020024180016a240020000f0b200029030021044180012100024003402000450d01200220006a417f6a2004a7410f712203413072200341d7006a2003410a491b3a00002000417f6a2100200442048822044200520d000b0b20004181014f0d012001410141d889c5004102200220006a41800120006b109701210020024180016a240020000f0b4180012100024003402000450d01200220006a417f6a2004a7410f712203413072200341376a2003410a491b3a00002000417f6a2100200442048822044200520d000b0b20004181014f0d012001410141d889c5004102200220006a41800120006b109701210020024180016a240020000f0b20004180011048000b20004180011048000ba90601097f230041106b220224002002410036020820024201370300200028020021030240024002400240410410262204450d0020024284808080c00037020420022004360200200420033600002000280204210320044104410810272204450d012002428880808080013702042004200336000420022004360200200028020821042002200041106a280200220336020c2002410c6a2002104102400240024002402003450d0020034105742105200241086a220628020021032002280204210703400240024002400240200720036b41204f0d00200341206a22082003490d0620074101742209200820082009491b220a4100480d062007450d0120022802002007200a102722090d020c070b200341206a2108200228020021090c020b200a10262209450d050b2002200a36020420022009360200200a21070b20062008360200200920036a220341086a200441086a290000370000200341106a200441106a290000370000200341186a200441186a2900003700002003200429000037000020082103200441206a2104200541606a22050d000b0b2000280214210420022000411c6a280200220336020c2002410c6a2002104102402003450d00200341057421054100200241086a220628020022036b21082002280204210703400240024002400240200720086a41204f0d00200341206a22092003490d062007410174220a20092009200a491b220a4100480d062007450d0120022802002007200a102722090d020c080b200228020021090c020b200a10262209450d060b2002200a36020420022009360200200a21070b2006200341206a220a360200200920036a220341086a200441086a290000370000200341106a200441106a290000370000200341186a200441186a29000037000020032004290000370000200841606a2108200a2103200441206a2104200541606a22050d000b200128020020012802042009200a10042007450d070c060b200228020421042001280200200128020420022802002209200241086a280200100420040d050c060b101e000b200a4101102a000b200a4101102a000b41044101102a000b41084101102a000b200910230b200241106a24000b130020004103360204200041849ac4003602000b13002000410e36020420004198a0c4003602000b130020004104360204200041a8a0c4003602000b3101017f0240410110262202450d00200042818080801037020420002002360200200241003a00000f0b41014101102a000b130020004100360204200041a886c5003602000b130020004107360204200041b2a5c4003602000b130020004102360204200041bca5c4003602000bda0401097f230041d0006b2202240002400240410f10262203450d00200341076a41002900849544370000200341002900fd94443700002003410f411e10272204450d012004200036000f200241286a41186a22004200370300200241286a41106a22054200370300200241286a41086a220342003703002002420037032820044113200241286a1002200241086a41186a2000290300370300200241086a41106a2005290300370300200241086a41086a20032903003703002002200229032837030820024100360230200242013703282001280200210620022001280208220036024c200241cc006a200241286a104102400240024002402000450d00200041057421072003280200210020022802282108200228022c21092006210303400240024002400240200920006b41204f0d00200041206a22052000490d072009410174220a20052005200a491b220a4100480d072009450d0120082009200a102722080d020c080b200041206a21050c020b200a10262208450d060b200a21090b200820006a22002003290000370000200041186a200341186a290000370000200041106a200341106a290000370000200041086a200341086a29000037000020052100200341206a2103200741606a22070d000b200241306a20053602002002200936022c200220083602280c010b20032802002105200228022c2109200228022821080b200241086a412020082005100402402009450d00200810230b200410230240200141046a280200450d00200610230b200241d0006a24000f0b101e000b200a4101102a000b410f4101102a000b411e4101102a000bde0402047f037e230041d0006b220224000240024002400240411510262203450d002003410d6a41002900ada844370000200341086a41002900a8a844370000200341002900a0a84437000020034115413510272203450d01200320012900003700152003412d6a200141186a290000370000200341256a200141106a2900003700002003411d6a200141086a290000370000200241306a41186a22014200370300200241306a41106a22044200370300200241306a41086a220542003703002002420037033020034135200241306a1002200241186a2001290300370300200241106a2004290300370300200241086a200529030037030020022002290330370300024002402002412041a886c500410041001001417f460d002002200236022020024120360224200241003602302002410020024120200241306a41044100100122012001417f461b2201410420014104491b2204360228200141034d0d052002350230210620024100360230200241286a410020024120200241306a41042004100122012001417f461b2201410420014104491b20046a360200200141034d0d0520023502302107200241306a200241206a102820022802302201450d0520022902342108200241306a200241206a10282008a7210420022802302205450d04200041186a2002290234370200200041146a2005360200200041106a20084220883e02002000200436020c20002001360208200020074220862006843702000c010b200041003602080b20031023200241d0006a24000f0b41154101102a000b41354101102a000b2004450d00200110230b41d4aac10041331021000bc01904027f027e077f027e230041c0016b22022400024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001280200417f6a2203410c4b0d000240024020030e0d002205080c0b06070409030a01000b20004101360200200041086a200141086a290300370300200241c0016a24000f0b200128020422034102460d0b20034101470d2241f00010262203450d252003200141086a2802001050410121010c130b200241d0006a200141086a105120004100360200200041106a200241d0006a41086a290300370300200041086a2002290350370300200241c0016a24000f0b200141086a280200417f6a220341044b0d21024020030e05001b191a18000b200141386a2903002104200141306a2903002105410121032001410c6a2d00004101470d1b200141106a28020021010c1c0b20004109360200200041086a200141086a290300370300200241c0016a24000f0b200141086a28020022034102460d0820034101470d202001410c6a22032d00004101470d10200141106a2802002106410121030c110b200241d0006a200141086a105220004107360200200041c0006a200241d0006a41386a290300370300200041386a200241d0006a41306a290300370300200041306a200241d0006a41286a290300370300200041286a200241d0006a41206a290300370300200041206a200241d0006a41186a290300370300200041186a200241d0006a41106a290300370300200041106a200241d0006a41086a290300370300200041086a2002290350370300200241c0016a24000f0b200241d0006a200141046a105320004108360200200041246a200241f0006a2903003702002000411c6a200241e8006a290300370200200041146a200241e0006a2903003702002000410c6a200241d0006a41086a29030037020020002002290350370204200241c0016a24000f0b200241d0006a41186a200141286a290000370300200241d0006a41106a200141206a290000370300200241d8006a200141186a290000370300200241d0006a41286a200141386a290000370300200241d0006a41306a200141c0006a290000370300200241d0006a41386a200141c8006a2900003703002002200141106a2900003703502002200141306a2900003703702001410c6a2802002203417f4c0d1a200128020421012003450d062003102622060d0720034101102a000b2001410c6a2802002203417f4c0d19200128020421012003450d072003102622060d0820034101102a000b200241d0006a200141086a1054200041086a200241d0006a41e8001094041a2000410c360200200241c0016a24000f0b200241d0006a200141086a104d20004106360200200041286a200241d0006a41206a290300370300200041206a200241d0006a41186a290300370300200041186a200241d0006a41106a290300370300200041106a200241d0006a41086a290300370300200041086a2002290350370300200241c0016a24000f0b200241d0006a200141086a105520004105360200200041386a200241d0006a41306a290300370300200041306a200241d0006a41286a290300370300200041286a200241d0006a41206a290300370300200041206a200241d0006a41186a290300370300200041186a200241d0006a41106a290300370300200041106a200241d0006a41086a290300370300200041086a2002290350370300200241c0016a24000f0b41012103200141086a2d00004101470d052001410c6a28020021060c060b410121032001410c6a22062d00004101470d09200141106a28020021060c0a0b410121060b2006200120031094042101200241106a41386a2206200241d0006a41386a290300370300200241106a41306a2207200241d0006a41306a290300370300200241106a41286a2208200241d0006a41286a290300370300200241106a41206a2209200241d0006a41206a290300370300200241106a41186a220a200241d0006a41186a290300370300200241106a41106a220b200241d0006a41106a290300370300200241106a41086a220c200241d0006a41086a290300370300200220022903503703102000410c6a2003360200200041086a200336020020002001360204200041106a2002290310370200200041186a200c290300370200200041206a200b290300370200200041286a200a290300370200200041306a2009290300370200200041386a2008290300370200200041c0006a2007290300370200200041c8006a200629030037020020004104360200200241c0016a24000f0b410121060b20062001200310940421012000410c6a2003360200200041086a2003360200200020013602042000410a360200200241c0016a24000f0b200241106a41086a200141186a290200370300200241106a41106a200141206a2802003602002002200141106a290200370310200141246a350200200141286a310000422086842104200141096a2f00002001410b6a2d00004110747221072001410c6a2802002106410021030b200241d0006a41106a200241106a41106a280200360200200241d0006a41086a200241106a41086a2903003703002002200229031037035020032007410874722103410221010b200020013602042000410d3602002000410c6a2006360200200041086a2003360200200041106a2002290350370200200041246a2004370200200041186a200241d0006a41086a290300370200200041206a200241d0006a41106a280200360200200241c0016a24000f0b200241be016a200341036a2d00003a0000200241d8006a2001411c6a290200370300200241d0006a41106a200141246a290200370300200241e8006a2001412c6a2d00003a0000200220032f00013b01bc012002200141146a290200370350200141106a2802002106410021030b2002410c6a41026a200241bc016a41026a2d00003a0000200241106a41086a200241d0006a41086a290300370300200241106a41106a200241d0006a41106a290300370300200241106a41186a200241d0006a41186a280200360200200220022f01bc013b010c20022002290350370310200141386a2903002104200141306a2903002105410121070c020b200241be016a200641036a2d00003a0000200241d8006a2001411c6a290200370300200241d0006a41106a200141246a290200370300200241e8006a2001412c6a2d00003a0000200220062f00013b01bc012002200141146a290200370350200141106a2802002106410021030b410221072002410c6a41026a200241bc016a41026a2d00003a0000200241106a41086a200241d0006a41086a290300370300200241106a41106a200241d0006a41106a290300370300200241106a41186a200241d0006a41186a280200360200200220022f01bc013b010c20022002290350370310200141c8006a290300210d200141c0006a290300210e200141386a2903002104200141306a29030021050b200020022f010c3b000d20004103360200200041c8006a200d370300200041c0006a200e370300200041386a2004370300200041306a20053703002000410c6a20033a0000200041086a2007360200200041106a2006360200200041146a20022903103702002000410f6a2002410e6a2d00003a00002000411c6a200241106a41086a290300370200200041246a200241106a41106a2903003702002000412c6a200241286a280200360200200241c0016a24000f0b2001410c6a28020022034108762106410521010c050b200241d0006a41106a200141206a2903003703002002200141186a2903003703582002200141106a2802003602502001410c6a28020022034108762106200141286a290300210e410321010c040b2001410c6a28020022034108762106410421010c030b2002200141186a2903003703582002200141106a29030037035041022101410021030c020b200241186a2001411c6a290200370300200241106a41106a200141246a2802003602002002200141146a290200370310200141286a3502002001412c6a31000042208684210e2001410d6a2f00002001410f6a2d0000411074722106200141106a2802002101410021030b200241dc006a200241186a290300370200200241e4006a200241206a2802003602002002200229031037025420022001360250410121010b2000410b360200200041386a2004370300200041306a2005370300200041086a2001360200200041106a2002290350370300200041286a200e3703002000410c6a2006410874200341ff017172360200200041186a200241d0006a41086a290300370300200041206a200241d0006a41106a290300370300200241c0016a24000f0b1056000b101d000b41c8c8c300104f000b41c8edc300104f000b41c0b8c200104f000b41f0004108102a000b8b0303027f017e057f230041306b220124004108210242002103200141206a41086a22044200370300200142003703204195b7c1004115200141206a1000200141086a200429030037030020012001290320370300024002402001411041a886c500410041001001417f460d002001421037021420012001360210200141206a200141106a10890220012802202202450d01200129022421030b20022003422088a7220541286c6a210620022104024002400340200620046b419f014d0d014101210720042000460d02200420004120109604450d02200441286a22082000460d02200820004120109604450d02200441d0006a22082000460d02200820004120109604450d02200441f8006a22082000460d02200441a0016a21042008200041201096040d000c020b0b024020062004460d002002200541286c6a210803404101210720002004460d02200420004120109604450d022008200441286a2204470d000b0b410021070b02402003a7450d00200210230b200141306a240020070f0b41d4aac10041331021000b130020004101360204200041b8b0c4003602000b1300200041073602042000419fb4c4003602000b130020004105360204200041a8b4c4003602000b9e0e050c7f057e017f017e0a7f23004180016b22082400024002400240024002400240200728020c22094100480d00200941ffffffff07460d002007410c6a210a2007410c6a200941016a220b360200200741146a280200210c200741106a220d210e410021090340024002400240024002400240024020090e020001010b200e280200220f41086a2110200f2f010622114105742112417f21090240024002400240024003402012450d01200941016a2109417f410120042010412010960422134100481b410020131b2213450d03201241606a2112201041206a211020134101460d000b200c0d010c030b20112109200c450d020b200c417f6a210c200f20094102746a41880b6a210e410021090c090b200f41e8026a200941e0006c6a2209450d002009280200450d00200941106a2903002114200941086a29030021150c010b200841286a2007411c6a2802002004200741206a28020028021c110400200841306a2903002114200728020c210b200829032821150b2007410c6a200b417f6a360200200141186a29030021162007280240210920012903102117024041004101410220152014842218501b20021b22194101460d0020194102470d0220094190016a21094200211a20172016844200520d030c0d0b20094180016a21094200211a20172016844200510d0c0c020b200d280200220f201d6a2110200f2f0106220d201e742112417f210902400240024003402012450d01200920196a2109201f201920032010202210960422132023481b202320131b2213450d03201220246a2112201020226a211020132019460d000b201c0d010c050b200d2109201c450d040b201c201f6a211c200f20092020746a20216a210d410121090c060b200f41e8026a200941e0006c6a2209450d022009280200450d02200941106a2903002116200941086a29030021170c030b200941f0006a21094200211a20172016844200510d0a0b200841186a2009290300200941086a290300201720161097042001201a200129030822172008290318427f200841186a41086a290300501b7d221620162017562016507222091b37030802402009450d0041e0bbc4002109412221070c090b200a28020022094100480d04200941ffffffff07460d04410121192007410c6a200941016a221b360200200741146a280200211c4108211d4105211e417f211f4102212041880b21214120212241002123416021240c020b200841086a2007411c6a2802002003200741206a28020028021c110400200841106a2903002116200728020c211b200829030821170b200a201b417f6a3602000240201720057d221a201756201620067d2017200554ad7d221720165620172016511b450d004182bcc4002109411d21070c070b024020184200520d00200741c0006a2802002209290360200556200941e8006a290300221620065620162006511b450d00419fbcc4002109411f21070c070b200820034102201a2017108302024020082802002209450d00200828020421070c070b0240201520057c22182015542209201420067c2009ad7c221620145420162014511b450d0041bebcc4002109412d21070c070b4100210920032004460d05200320044120109604450d05200a2003201a2017108102200a200420182016108102200841e0006a41186a200341186a290000370300200841e0006a41106a200341106a290000370300200841e0006a41086a200341086a290000370300200841c0006a41086a200441086a290000370300200841c0006a41106a200441106a290000370300200841c0006a41186a200441186a29000037030020082003290000370360200820042900003703400240024002400240200741306a28020022092007412c6a280200470d00200941016a22192009490d0320094101742212201920192012491b2212ad42e8007e2216422088a70d032016a722104100480d032009450d01200741286a280200200941e8006c201010272219450d020c070b200741286a28020021190c070b2010102622190d050b20104108102a000b101e000b410121090c000b0b10e401000b2007412c6a2012360200200741286a2019360200200741306a28020021090b2019200941e8006c6a2219200829036037000141002109201941003a0000201941096a200841e0006a41086a290300370000201941116a200841e0006a41106a290300370000201941196a200841e0006a41186a290300370000201941216a2008290340370000201941296a200841c0006a41086a290300370000201941316a200841c0006a41106a290300370000201941396a200841c0006a41186a290300370000201941c1006a2008280039360000201941c4006a2008413c6a280000360000201941e0006a410036020020194201370358201941d0006a2006370300201941c8006a2005370300200741306a2207200728020041016a3602000b0b200020073602042000200936020020084180016a24000f0b41c8adc400104f000bc60101057f230041306b220124002000410c6a28020021022000280204210302400240200041086a2802002204450d002004210520032100034020002802880b21002005417f6a22050d000b0340200320032f01064102746a41880b6a28020021032004417f6a22040d000c020b0b200321000b200141246a20032f0106360200200141206a41003602002001411c6a20033602002001200236022820014100360218200142003703102001200036020c20014100360208200141086a10d401200141306a24000b160020002001280208360204200020012802003602000b0e0020003502004101200110cc020b8f0301037f230041c0006b22022400200141086a280200210320012802042104200220012802002201360210024002400240200141818004490d002002413c6a41013602002002410236021c200241f8d5c4003602182002420237022c200241fcd5c4003602282002200241186a3602382002200241286a10a2012002280200450d010c020b02402004450d00200220033602140240200120034d0d00200241246a41023602002002413c6a41023602002002410236021c2002420237022c2002418cd6c4003602282002200241106a3602202002200241146a3602182002200241186a3602382002200241286a10a20120022802000d030c020b200341818004490d002002413c6a41013602002002410236021c200241f8d5c4003602182002420237022c2002419cd6c4003602282002200241186a3602382002200241286a10a20120022802000d020c010b2002410036020020022802000d010b20004100360200200241c0006a24000f0b20002002290300370200200041086a200241086a280200360200200241c0006a24000bcf0601037f230041c0006b22042400024002400240024002400240024002400240024020012802084102470d00200128020022052d0000416e6a2201411e4b0d0141002106024020010e1f0002020202020202020202020202020202020202020202020202020a030405000b20042005280204220136020c200120034f0d05200220014101746a22012d0001450d06200441346a41013602002004410236023c2004420237022420044198d8c40036022020042004410c6a3602382004200441386a360230200441106a200441206a10a201200041013a00002000410c6a200441186a280200360200200041046a2004290310370200200441c0006a24000f0b412e10262201450d06200041013a0000200141266a4100290090d844370000200141206a410029008ad844370000200141186a4100290082d844370000200141106a41002900fad744370000200141086a41002900f2d744370000200141002900ead744370000200041086a42ae808080e005370200200041046a2001360200200441c0006a24000f0b412010262201450d06200041013a0000200141186a41002900d0d844370000200141106a41002900c8d844370000200141086a41002900c0d844370000200141002900b8d844370000200041086a42a08080808004370200200041046a2001360200200441c0006a24000f0b410121060c060b410221060c050b410321060c040b200441346a41013602002004410236023c20044202370224200441a8d8c40036022020042004410c6a3602382004200441386a360230200441106a200441206a10a201200041013a00002000410c6a200441186a280200360200200041046a2004290310370200200441c0006a24000f0b20012d000021060c020b412e4101102a000b41204101102a000b0240200541106a2d00004106470d00200041003a0000200020063a0001200441c0006a24000f0b0240412910262201450d00200041013a0000200141286a41002d0080d9443a0000200141206a41002900f8d844370000200141186a41002900f0d844370000200141106a41002900e8d844370000200141086a41002900e0d844370000200141002900d8d844370000200041086a42a98080809005370200200041046a2001360200200441c0006a24000f0b41294101102a000b90010002400240024020002d000022004101460d0020004102460d0120004103470d02200128021841b8f6c40041032001411c6a28020028020c1102000f0b200128021841b2f6c40041032001411c6a28020028020c1102000f0b200128021841b5f6c40041032001411c6a28020028020c1102000f0b200128021841aff6c40041032001411c6a28020028020c1102000b6501017f230041206b2202240020024128360204200220003602002001411c6a2802002100200128021821012002411c6a41013602002002420137020c200241ccb0c5003602082002200236021820012000200241086a10e2032101200241206a240020010ba1d10103037f037e067f230041f0006b220324000240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020022d0000417f6a220441aa014b0d00024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020040eab01f602001b0f01aa01a701a901a301230c13a80104141a9a01531d2454063507a101880172269101a001a60134090e8a01399d01a40105023a43744b73568d01030a4616797b4184017825287a8901080d272e1218940196012298019c01a5015da201179b01601e5c119e019f0120920177750b1044472a1597011c6231930190018b012b193699013c29664d5767644c8001427e308c0187012d8e0195011f48402f8f01713d217f614a7c85012c3332383f6f5e6e83018201378601505181017668637d6b5f3b553e694e456c4f6d596a654958525a5bf6020b200141306a2802002204200141346a22052802004f0dad0120023100012106200141206a350200210720042001412c6a280200470df402200441016a22022004490de60220044101742205200220022005491b2202ad4203862208422088a70de6022008a722054100480de6022004450de401200141286a2802002004410374200510272204450de5010cf3020b200141306a2802002202417f6a220420024f0d9f02200420024b0d9f02200141286a220228020020044103746a22042d00044101470da90120043100052106200341d8006a200141186a200210ce032003280258450dd00120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004101410110cf032003280258450df30220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200141206a2802002202200141246a22042802004f0da80120022001411c6a280200470def02200241016a22042002490de30220024101742205200420042005491b22044100480de3022002450ddf01200141186a2802002002200410272202450de0010cee020b200341d8006a200141186a2202200141286a2204410010d00320032d00584101470da801200341e0006a2903002106200328025c22010df0010cf1020b200341d8006a2001200241046a2802004102410010cf032003280258450df00220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004104410210d1032003280258450def0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004101410010d1032003280258450dee0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d2032003280258450ded0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004104410110d1032003280258450dec0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d3032003280258450deb0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d4032003280258450dea0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200128020021042003200241046a2802002202360248200441386a28020020024d0da2012003200428023020024102746a28020022023602282004412c6a28020020024d0db801200428022420024104746a22042d000d2109024020042802082202450d002004280200417f6a2104200141286a2105200141186a210a0340200341d8006a200a2005200420026a2d000010d00320032d00584101460de7012002417f6a22020d000b0b20094104460de902200141206a2802002202200141246a22042802004f0df30120022001411c6a280200470de402200241016a22042002490dda0220024101742205200420042005491b22044100480dda022002450d8702200141186a2802002002200410272202450d88020ce3020b200341d8006a2001410110d2032003280258450de80220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004104410010cf032003280258450de70220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b20023100012106200341d8006a200141186a200141286a2204410010d00320032d00584101470da0012000200329025c370200200041086a200341e4006a280200360200200341f0006a24000f0b200341d8006a2001410010d4032003280258450de50220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310d2032003280258450de40220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d2032003280258450de30220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200241046a280200210a2001280200210220034100360228200241146a280200450dac01200341d8006a200141186a2204200141286a2205410010d00320032d00584101470daf01200341e0006a2903002106200328025c22010df3010ce2020b200341d8006a200141046a200241046a28020010d50320032d00584101470d9c01200328025c2201450de102200341e0006a29030021060cb3010b200341d8006a2001410010d4032003280258450de00220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d2032003280258450ddf0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210d2032003280258450dde0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d2032003280258450ddd0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d6032003280258450ddc0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b2003200241046a2802002202360248200341d8006a200141046a200210d50320032d00584101470d9701200328025c21012003200341e0006a290300220637022c2003200136022820010daf010cdb020b200141306a2802002204200141346a22052802004f0d970120023100012106200141206a350200210720042001412c6a280200470dd302200441016a22022004490dcb0220044101742205200220022005491b2202ad4203862208422088a70dcb022008a722054100480dcb022004450dcb01200141286a2802002004410374200510272204450dcc010cd2020b200341d8006a2001410010d4032003280258450dd90220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b2003200241046a28020022023602202001280200210420032002360254200441206a28020020024d0d9601200428021820024101746a22022d0001450db501200320022d000022023a0027200341d8006a200141186a200141286a410410d00320032d00584101470db801200341306a200341e4006a2802003602002003200329025c370328200329022c2106200328022822010d9b020cd8020b200341d8006a2001410310d2032003280258450dd70220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210d6032003280258450dd60220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d6032003280258450dd50220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210d4032003280258450dd40220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d2032003280258450dd30220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b20012d003822024104470d91010cc2020b200341d8006a2001200241046a2802004104410010d1032003280258450dd10220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d2032003280258450dd00220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004101410110d1032003280258450dcf0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d2032003280258450dce0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d2032003280258450dcd0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d4032003280258450dcc0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d4032003280258450dcb0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d4032003280258450dca0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310d6032003280258450dc90220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d4032003280258450dc80220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d2032003280258450dc70220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210d6032003280258450dc60220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d4032003280258450dc50220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d4032003280258450dc40220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310d6032003280258450dc30220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310d6032003280258450dc20220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004104410110d1032003280258450dc10220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004108410310d1032003280258450dc00220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d6032003280258450dbf0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310d4032003280258450dbe0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310d6032003280258450dbd0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004104410210cf032003280258450dbc0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004102410110cf032003280258450dbb0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014102410110d7032003280258450dba0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d4032003280258450db90220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210d4032003280258450db80220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014103410110d7032003280258450db70220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310d6032003280258450db60220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210d6032003280258450db50220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d2032003280258450db40220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d4032003280258450db30220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004104410110cf032003280258450db20220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d4032003280258450db10220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014101410210d7032003280258450db00220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d2032003280258450daf0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d4032003280258450dae0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210d6032003280258450dad0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014102410310d7032003280258450dac0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210d4032003280258450dab0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b20012802002102200341003602282002280208450d750c94020b200341d8006a2001410110d4032003280258450da90220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d4032003280258450da80220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014100410210d7032003280258450da70220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014103410210d7032003280258450da60220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310d4032003280258450da50220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014101410010d7032003280258450da40220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014103410110d7032003280258450da30220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200128020021042003200241046a2802002202360228200441206a28020020024d0d62200141206a2802002205200141246a220a2802004f0d78200428021820024101746a2d0000210220052001411c6a280200470d8b02200541016a22042005490d93022005410174220a20042004200a491b22044100480d93022005450daa01200141186a2802002005200410272205450dab010c8a020b200341d8006a2001200241046a2802004108410110d1032003280258450da10220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014103410110d7032003280258450da00220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200141206a2802002202200141246a22042802004f0d6020022001411c6a280200470d8602200241016a22042002490d900220024101742205200420042005491b22044100480d90022002450d9201200141186a2802002002200410272202450d93010c85020b200341d8006a2001410110d4032003280258450d9e0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014102410010d7032003280258450d9d0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014100410310d7032003280258450d9c0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014100410210d7032003280258450d9b0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014101410310d7032003280258450d9a0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310d2032003280258450d990220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210d2032003280258450d980220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310d4032003280258450d970220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014102410110d7032003280258450d960220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310d2032003280258450d950220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210d4032003280258450d940220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d4032003280258450d930220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014103410010d7032003280258450d920220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d4032003280258450d910220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014101410310d7032003280258450d900220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d4032003280258450d8f0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d4032003280258450d8e0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014103410010d7032003280258450d8d0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014100410210d7032003280258450d8c0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014101410310d7032003280258450d8b0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014100410110d7032003280258450d8a0220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014101410210d7032003280258450d890220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014100410310d7032003280258450d880220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310d4032003280258450d870220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310d6032003280258450d860220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200141306a2802002202417f6a220420024f0db101200420024b0db101200128022820044103746a220a2802002205200141206a28020022024d0d482001411c6a280200220420026b200520026b22094f0d5d200220096a220b2002490df6012004410174220c200b200b200c491b220b4100480df6012004450d7c200141186a2802002004200b1027220c450d7d0ce6010b200341d8006a2001410210d4032003280258450d840220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004102410010d1032003280258450d830220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200141206a2802002202200141246a22042802004f0d4420022001411c6a280200470de201200241016a22042002490df30120024101742205200420042005491b22044100480df3012002450d77200141186a2802002002200410272202450d780ce1010b20012802002102200341003602282002280208450d4d0cda010b200341d8006a2001410010d4032003280258450d800220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014102410010d7032003280258450dff0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d6032003280258450dfe0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d2032003280258450dfd0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d2032003280258450dfc0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d2032003280258450dfb0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d2032003280258450dfa0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210d4032003280258450df90120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014100410110d7032003280258450df80120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d4032003280258450df70120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210d4032003280258450df60120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d4032003280258450df50120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a20014102410010d7032003280258450df40120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310d4032003280258450df30120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310d4032003280258450df20120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d2032003280258450df10120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310d6032003280258450df00120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310d4032003280258450def0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d4032003280258450dee0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004102410010d1032003280258450ded0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d3032003280258450dec0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004108410110cf032003280258450deb0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d4032003280258450dea0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d4032003280258450de90120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200141206a2802002202200141246a22042802004f0d2c20022001411c6a280200470dc001200241016a22042002490dd90120024101742205200420042005491b22044100480dd9012002450d61200141186a2802002002200410272202450d620cbf010b200341d8006a2001410210d6032003280258450de70120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210d6032003280258450de60120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d4032003280258450de50120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004101410110d1032003280258450de40120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d6032003280258450de30120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d4032003280258450de20120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d2032003280258450de10120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210d6032003280258450de00120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d2032003280258450ddf0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410010d4032003280258450dde0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d2032003280258450ddd0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410110d6032003280258450ddc0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a200141046a200241046a28020010d50320032d00584101470d20200328025c2201450ddb01200341e0006a29030021060c420b200341d8006a2001410210d2032003280258450dda0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210d2032003280258450dd90120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004108410310cf032003280258450dd80120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310d2032003280258450dd70120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410310d2032003280258450dd60120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004102410110d1032003280258450dd50120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004101410010d1032003280258450dd40120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210d2032003280258450dd30120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200241086a280200210a200241046a280200210420032002410c6a2802002205360240200141306a280200220220054d0d1820022005417f736a220520024f0d83014104210c0240200141286a220d280200220920054103746a22052d00044103460d0020052d0005210c0b2003200c3a0038200a450d34200c41ff0171220e4104470d33200a410274210a0340200320042802002205360240200220054d0d3e20022005417f736a220520024f0d7d0240200920054103746a22052d00044103460d0020052d00054104470d3e0b200441046a2104200a417c6a220a0d000b4104210c0c340b200341d8006a2001200241046a2802004101410010cf032003280258450dd10120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001410210d2032003280258450dd00120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200341d8006a2001200241046a2802004102410110d1032003280258450dcf0120002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b2003200241046a2802002202360240200141306a280200220420024d0d1520042002417f736a220220044f0d8001200141286a220428020020024103746a22022d00044103460d9f0120022d0005220241ff01714104460d9f01200341d8006a200141186a22052004200210d00320032d00584101470d36200328025c2202450d9f01200341e0006a29030021060c9e010b200341d8006a200141186a200141286a410410d00320032d00584101470dcd01200328025c2201450dcd012000200341e0006a29030037020420002001360200200341f0006a24000f0b200241046a2802002102200341d8006a200141186a220a200141286a2205410010d00320032d00584101470d14200341e0006a2903002106200328025c22010d92010ccc010b200141306a2802002202417f6a220420024f0d78200420024b0d78200141286a220a28020020044103746a22042d0005210520042d00044101470d14200541ff01714104460d14200341ec006a41013602002003412936022c2003200441056a3602282003420237025c200341d4d1c4003602582003200341286a360268200341086a200341d8006a10a201200041086a200341086a41086a28020036020020002003290308370200200341f0006a24000f0b411a10262201450d7d200141186a41002f00d0d1443b0000200141106a41002900c8d144370000200141086a41002900c0d144370000200141002900b8d1443700002000429a808080a00337020420002001360200200341f0006a24000f0b200341ec006a220141013602002003410236024c200320043602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082202450dc9012003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282201450dc9012000200329022c37020420002001360200200341f0006a24000f0b200341d8006a20022004410410d00320032d00584101470d16200341e0006a2903002106200328025c22010d470cc8010b200341ec006a220141013602002003410236024c200320053602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082202450dc7012003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282201450dc7012000200329022c37020420002001360200200341f0006a24000f0b200341ec006a41013602002003410236023c2003420237025c20034188dac4003602582003200341c8006a3602382003200341386a360268200341086a200341d8006a10a201200329020c2106200328020822010d510cc6010b200141306a2802002202200141346a22052802004f0d15200141206a350200210720022001412c6a280200470d9b01200241016a22052002490db6012002410174220a20052005200a491b2205ad4203862208422088a70db6012008a7220a4100480db6012002450d4920042802002002410374200a10272202450d4a0c9a010b200141206a2802002202200141246a22042802004f0d1520032d0059210420022001411c6a280200470d9801200241016a22052002490db5012002410174220a20052005200a491b22054100480db5012002450d4a200141186a2802002002200510272202450d4b0c97010b200320032d005922023a0038200341d8006a200141186a200141286a410410d00320032d00584101470d16200341306a200341e4006a2802003602002003200329025c370328200329022c2106200328022822010d170cc3010b200341ec006a220141013602002003410236024c200320053602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082202450dc2012003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282201450dc2012000200329022c37020420002001360200200341f0006a24000f0b200341ec006a4101360200200341023602442003420237025c200341b8dac4003602582003200341d4006a3602402003200341c0006a360268200341086a200341d8006a10a2010c1f0b200341d8006a200141186a2205200141286a200210d00320032d00584101470d15200328025c2202450db001200341e0006a29030021060c250b200341ec006a4101360200200341023602442003420237025c200341b8dac4003602582003200341286a3602402003200341c0006a360268200341086a200341d8006a10a20120032802082201450dbf01200329020c21060c160b200341ec006a220141013602002003410236024c200320043602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082202450dbe012003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282201450dbe012000200329022c37020420002001360200200341f0006a24000f0b200341ec006a220141013602002003410236024c200320043602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082202450dbd012003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282201450dbd012000200329022c37020420002001360200200341f0006a24000f0b2005200220052002491b21040ca1010b200341ec006a220141013602002003410236024c200320043602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082202450dbb012003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282201450dbb012000200329022c37020420002001360200200341f0006a24000f0b200341d8006a200141186a2205200141286a20032d0059220410d00320032d00584101470d13200328025c2201450dba01200341e0006a29030021060c210b200341086a410c6a4102360200200341ec006a220441023602002003410236020c200320023602482003420237025c200341c0dbc4003602582003200341c8006a3602102003200341c0006a3602082003200341086a360268200341286a200341d8006a10a201200328022821022003200329022c37020c20032002360208200441013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b200328022821022003200329022c37022c2003200236022820032802282202450d7b0c8b010b200341146a4102360200200341ec006a220241023602002003410236020c200320043602482003420237025c200341c0dbc4003602582003200341c8006a3602102003200341c0006a3602082003200341086a360268200341286a200341d8006a10a201200328022821042003200329022c37020c20032004360208200241013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a201200328020c450d8601200328020810230c86010b200141306a280200210420032002360240200420024d0d1120042002417f736a220220044f0d6b200528020020024103746a22022d00044103460db70120022d0005220241ff01714104460db701200341d8006a200a2005200210d00320032d00584101470d38200328025c2201450db701200341e0006a29030021060c7d0b20024101470d1120012d003822024104470d1f0c83010b200341d8006a41146a41013602002003410236024c2003420237025c200341e8d9c4003602582003200341286a3602482003200341c8006a360268200341086a200341d8006a10a201200329020c2106200328020822010d460cb5010b200341ec006a41013602002003410236024c2003420237025c200341b8d9c4003602582003200341286a3602482003200341c8006a360268200341086a200341d8006a10a20120032802082202450d9e01200329020c21060c9f010b200341ec006a41013602002003410236024c2003420237025c200341b8d9c4003602582003200341286a3602482003200341c8006a360268200341086a200341d8006a10a20120032802082202450d8c01200329020c21060c8d010b20012802002209412c6a28020021022003200a3602282002200a4d0d112009280224200a4104746a220a2d000d21090240200a2802082202450d00200a280200417f6a210a0340200341d8006a20042005200a20026a2d000010d00320032d00584101460d372002417f6a22020d000b0b200941ff01714104460db201200141206a2802002202200141246a22052802004f0d4220022001411c6a280200470d7e200241016a22052002490da3012002410174220a20052005200a491b22054100480da3012002450d5620042802002002200510272202450d570c7d0b200341d8006a2002200420032d0059220510d00320032d00584101470d14200341e0006a2903002106200328025c22010d300cb1010b200341ec006a4101360200200341023602442003420237025c20034198dac4003602582003200341286a3602402003200341c0006a360268200341086a200341d8006a10a201200329020c2106200328020822010d3b0cb0010b200341ec006a220141013602002003410236024c200320053602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082202450daf012003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282201450daf012000200329022c37020420002001360200200341f0006a24000f0b200341ec006a220141013602002003410236024c200320043602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082202450dae012003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282201450dae01200329022c21060b2000200637020420002001360200200341f0006a24000f0b200320032d005922013a004020014104460dac01200241ff01712001460dac01200341086a41146a412b360200200341146a4123360200200341d8006a41146a41033602002003410236020c2003420337025c200341f4d1c4003602582003200341c0006a3602182003200341386a3602102003200341c8006a3602082003200341086a360268200341286a200341d8006a10a201200329022c210620032802282201450dac010b2000200637020420002001360200200341f0006a24000f0b200141206a2802002204200141246a220a2802004f0d0e20042001411c6a280200470d74200441016a220a2004490d9b0120044101742209200a200a2009491b220a4100480d9b012004450d3c20052802002004200a10272204450d3d0c730b200341ec006a220141013602002003410236024c2003200a3602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082202450da9012003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282201450da901200329022c21060b2000200637020420002001360200200341f0006a24000f0b200141186a280200220c200222046a210b20094102490d89010c8a010b200141206a2802002202200141246a220a2802004f0d0c20022001411c6a280200470d6e200241016a220a2002490d970120024101742209200a200a2009491b220a4100480d97012002450d3a20052802002002200a10272202450d3b0c6d0b200341146a4102360200200341ec006a220141023602002003410236020c200320043602482003420237025c200341c0dbc4003602582003200341c8006a3602102003200341c0006a3602082003200341086a360268200341286a200341d8006a10a201200328022821022003200329022c37020c20032002360208200141013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b200329022c210620032802282201450da5010c6b0b200341d8006a200141186a2202200a10ce032003280258450d1f20002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b200141306a2802002204200141346a22052802004f0d0f200141206a350200210720042001412c6a280200470d68200441016a22052004490d94012004410174220a20052005200a491b2205ad4203862208422088a70d94012008a7220a4100480d94012004450d3b20022802002004410374200a10272202450d3c0c670b200341ec006a41013602002003410236024c2003420237025c200341c8dac4003602582003200341d4006a3602482003200341c8006a360268200341086a200341d8006a10a2010b200328020821012003200329020c220637022c200320013602282001450da1010c640b200341ec006a41013602002003410236024c2003420237025c20034198dac4003602582003200341286a3602482003200341c8006a360268200341086a200341d8006a10a201200329020c2106200328020822010d310ca0010b200320032d005922013a00482001200241ff0171460d9f0120014104460d9f01200341086a41146a412b360200200341146a412b360200200341d8006a41146a41033602002003410236020c2003420337025c2003418cd2c4003602582003200341c8006a3602182003200341276a3602102003200341206a3602082003200341086a360268200341286a200341d8006a10a201200329022c2106200328022822010d620c9f010b200a410274210a0340200320042802002205360240200220054d0d0a20022005417f736a220520024f0d49200920054103746a22052d00044103460d0920052d0005220b4104460d09200e200b470d09200441046a2104200a417c6a220a0d000b0b200341d8006a200141186a2202200d410010d003024020032d00584101470d00200341306a200341e4006a2802003602002003200329025c370328200328022822020d700c600b200c41ff01714104470d1a0c5e0b200141206a2802002204200141246a220a2802004f0d1a20042001411c6a280200470d5c200441016a220a2004490d8d0120044101742209200a200a2009491b220a4100480d8d012004450d3620022802002004200a10272202450d370c5b0b200341ec006a220241013602002003410236024c2003200a3602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082204450d8b012003200329020c37020c20032004360208200241013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282202450d8b01200329022c21060b2000200637020420002002360200200341f0006a24000f0b200341ec006a220141013602002003410236024c2003200a3602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082202450d99012003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282201450d9901200329022c21060b2000200637020420002001360200200341f0006a24000f0b200141206a2802002204200141246a220a2802004f0d1720042001411c6a280200470d55200441016a220a2004490d880120044101742209200a200a2009491b220a4100480d88012004450d3320052802002004200a10272204450d340c540b200341d8006a200141186a2205200a200210d00320032d00584101470d18200328025c2202450d63200341e0006a29030021060c250b200341146a4129360200200341ec006a41023602002003200541056a3602102003412936020c2003420237025c200341e4d1c4003602582003200341386a3602082003200341086a360268200341286a200341d8006a10a201200328022822020d670c570b200341146a4102360200200341ec006a220441023602002003410236020c200320023602482003420237025c200341c0dbc4003602582003200341c8006a3602102003200341c0006a3602082003200341086a360268200341286a200341d8006a10a201200328022821022003200329022c37020c20032002360208200441013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b200328022821022003200329022c37022c20032002360228200328022822020d660c560b200341ec006a220141013602002003410236024c200320053602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082202450d93012003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282201450d93012000200329022c37020420002001360200200341f0006a24000f0b2004102622020d8e010b20044101102a000b2005102622040d8e010b20054104102a000b2005102622040d86010b20054104102a000b2004102622020d720b20044101102a000b2004102622020d690b20044101102a000b200b1026220c0d690b200b4101102a000b2004102622020d5d0b20044101102a000b200541ff01714104460d8401200141206a2802002204200141246a220a2802004f0d1a20042001411c6a280200470d40200441016a220a2004490d7520044101742209200a200a2009491b220a4100480d752004450d2a20022802002004200a10272202450d2b0c3f0b200341e0006a2903002106200328025c22010d0e0c83010b200341d8006a2002200d200c10d00320032d00584101470d0e200328025c2202450d432003200341e0006a29030037022c20032002360228200328022822020d540c440b200341ec006a220141013602002003410236024c2003200a3602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082202450d81012003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282201450d8101200329022c21060b2000200637020420002001360200200341f0006a24000f0b200341ec006a220241013602002003410236024c2003200a3602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082204450d502003200329020c37020c20032004360208200241013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a201200328020c450d4d20032802081023200328022822020d4e0c500b200141206a2802002204200141246a22052802004f0d0b20042001411c6a280200470d38200441016a22052004490d6f20044101742209200520052009491b22054100480d6f2004450d1e200a2802002004200510272204450d1f0c370b200141206a2802002204200141246a22092802004f0d0b20042001411c6a280200470d35200441016a22092004490d6e2004410174220b20092009200b491b22094100480d6e2004450d1f20052802002004200910272204450d200c340b200341e0006a2903002106200328025c22010d0d0c7c0b200a102622020d500b200a4104102a000b2005102622020d4c0b20054101102a000b2004102622050d5f0b20044101102a000b200341ec006a220141013602002003410236024c200320043602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082202450d752003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282201450d75200329022c21060b2000200637020420002001360200200341f0006a24000f0b200141206a2802002204200141246a22052802004f0d0a20042001411c6a280200470d29200441016a22052004490d642004410174220a20052005200a491b22054100480d642004450d1b20022802002004200510272202450d1c0c280b200341ec006a220141013602002003410236024c200320053602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082202450d722003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282201450d72200329022c21060c380b200341ec006a220241013602002003410236024c200320093602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082204450d3e2003200329020c37020c20032004360208200241013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282202450d3e200329022c21060b2000200637020420002002360200200341f0006a24000f0b200341ec006a220141013602002003410236024c200320053602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082202450d6f2003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282201450d6f200329022c21060b2000200637020420002001360200200341f0006a24000f0b200a102622040d360b200a4101102a000b200a102622020d320b200a4101102a000b200341ec006a220141013602002003410236024c2003200a3602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082202450d692003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282201450d692000200329022c37020420002001360200200341f0006a24000f0b200341ec006a220241013602002003410236024c200320053602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082204450d292003200329020c37020c20032004360208200241013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282202450d292003200329022c37022c20032002360228200328022822020d3a0c2a0b200a102622020d2b0b200a4104102a000b200a102622020d240b200a4101102a000b200a102622040d200b200a4101102a000b2004102622020d5b0b20044101102a000b2005102622040d180b20054101102a000b2009102622040d140b20094101102a000b2005102622020d260b20054101102a000b200a102622020d140b200a4101102a000b2005102622020d0c0b20054101102a000b4182dcc400411d1021000b4118102622000d0241184101102a000b4118102622000d0241184101102a000b4118102622000d0241184101102a000b2003421837025c20032000360258200341d8006a4100411810db0320032003280260220041186a3602602000200328025822016a411841a6dbc400411810dc032003200329025c37025c200320013602584184d1c4004134200341d8006a10dd03000b2003421837025c20032000360258200341d8006a4100411810db0320032003280260220041186a3602602000200328025822016a411841a6dbc400411810dc032003200329025c37025c2003200136025841c9d0c400413b200341d8006a10dd03000b2003421837025c20032000360258200341d8006a4100411810db0320032003280260220041186a3602602000200328025822016a411841a6dbc400411810dc032003200329025c37025c200320013602584184d1c4004134200341d8006a10dd03000b4182dcc400411d1021000b4182dcc400411d1021000b411a4101102a000b4182dcc400411d1021000b2001411c6a2005360200200141186a2002360200200141206a28020021040b200141186a28020020046a200c3a0000200141206a2202200228020041016a3602000c0a0b2001411c6a2009360200200141186a2004360200200141206a28020021040b200141186a28020020046a20023a0000200141206a2202200228020041016a3602000c140b2001411c6a2005360200200141186a2004360200200141206a28020021040b200141186a28020020046a20023a0000200141206a2201200128020041016a3602000c450b2001411c6a200a360200200141186a2002360200200141206a28020021040b200141186a28020020046a20053a0000200141206a2201200128020041016a3602000c430b2001411c6a200a360200200141186a2004360200200141206a28020021040b200141186a28020020046a20023a0000200141206a2202200228020041016a3602000c120b2001411c6a200a360200200141186a2002360200200141206a28020021040b200141186a28020020046a20053a0000200141206a2201200128020041016a3602000c3f0b20034100360228200328022822020d100b024002400240024002400240200141306a2802002202417f6a220420024f0d00200420024b0d000240024002400240200141286a28020020044103746a220a2802002205200141206a28020022024d0d002001411c6a280200220420026b200520026b22094f0d01200220096a220b2002490d382004410174220c200b200b200c491b220b4100480d382004450d02200141186a2802002004200b1027220c450d030c050b2005200220052002491b21040c080b200141186a280200220c200222046a210b20094102490d040c050b200b1026220c0d020b200b4101102a000b02404118102622000d0041184101102a000b2003421837025c20032000360258200341d8006a4100411810db0320032003280260220041186a3602602000200328025822016a411841a6dbc400411810dc032003200329025c37025c2003200136025841c9d0c400413b200341d8006a10dd03000b2001411c6a200b360200200141186a200c360200200c200141206a28020022046a210b200941024f0d010b20090d010c020b200b410420052002417f736a22021093041a200c200220046a22046a210b0b200b41043a0000200441016a21040b200141206a2004360200200a41013a00060c3d0b2000200637020420002001360200200341f0006a24000f0b2001412c6a2005360200200141286a2002360200200141306a28020021040b200141286a28020020044103746a200642288620078442808080802084370200200141306a2201200128020041016a3602000c3a0b2000200637020420002001360200200341f0006a24000f0b2001411c6a200a360200200141186a2002360200200141206a28020021020b200141186a28020020026a20043a0000200141206a2201200128020041016a3602000c370b2001411c6a200a360200200141186a2004360200200141206a28020021040b200141186a28020020046a20023a0000200141206a2202200228020041016a3602000c250b2001411c6a2005360200200141186a2002360200200141206a28020021020b200141186a28020020026a20093a0000200141206a2201200128020041016a3602000c330b200341d8006a200141186a200a10ce032003280258450d3220002003290358370200200041086a200341d8006a41086a280200360200200341f0006a24000f0b20032802282202450d020b200329022c21060b2000200637020420002002360200200341f0006a24000f0b024002400240024002400240200141306a2802002202417f6a220420024f0d00200420024b0d000240024002400240200141286a28020020044103746a220a2802002205200141206a28020022024d0d002001411c6a280200220420026b200520026b22094f0d01200220096a220b2002490d292004410174220c200b200b200c491b220b4100480d292004450d02200141186a2802002004200b1027220c450d030c050b2005200220052002491b21040c080b200141186a280200220c200222046a210b20094102490d040c050b200b1026220c0d020b200b4101102a000b02404118102622000d0041184101102a000b2003421837025c20032000360258200341d8006a4100411810db0320032003280260220041186a3602602000200328025822016a411841a6dbc400411810dc032003200329025c37025c2003200136025841c9d0c400413b200341d8006a10dd03000b2001411c6a200b360200200141186a200c360200200c200141206a28020022046a210b200941024f0d010b20090d010c020b200b410420052002417f736a22021093041a200c200220046a22046a210b0b200b41043a0000200441016a21040b200141206a2004360200200a41013a00060c2e0b2000200329022c37020420002002360200200341f0006a24000f0b2001411c6a2005360200200141186a2002360200200141206a28020021020b200141186a28020020026a20043a0000200141206a2201200128020041016a3602000c2b0b2001412c6a2005360200200141286a2002360200200141306a28020021020b200141286a28020020024103746a200642288620078442808080801084370200200141306a2201200128020041016a3602000c290b2001411c6a2004360200200141186a2002360200200141206a28020021020b200141186a28020020026a41023a0000200141206a2201200128020041016a3602000c270b0240200141206a2802002202200141246a22042802004f0d0020022001411c6a280200470d05200241016a22042002490d1820024101742205200420042005491b22044100480d182002450d02200141186a2802002002200410272202450d030c040b200341ec006a220141013602002003410236024c200320043602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082202450d262003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282202450d26200329022c21060b2000200637020420002002360200200341f0006a24000f0b2004102622020d010b20044101102a000b2001411c6a2004360200200141186a2002360200200141206a28020021020b200141186a28020020026a41003a0000200141206a2201200128020041016a3602000c210b2001411c6a2004360200200141186a2002360200200141206a28020021020b200141186a28020020026a41003a0000200141206a2201200128020041016a3602000c1f0b2001411c6a200b360200200141186a200c360200200c200141206a28020022046a210b200941024f0d010b20090d010c020b200b410420052002417f736a22021093041a200c200220046a22046a210b0b200b41043a0000200441016a21040b200141206a2004360200200a41013a00060c1a0b2001411c6a2004360200200141186a2002360200200141206a28020021020b200141186a28020020026a41013a0000200141206a2201200128020041016a3602000c180b2001411c6a2004360200200141186a2005360200200141206a28020021050b200141186a28020020056a20023a0000200141206a2201200128020041016a3602000c160b200341d8006a200141186a2204200141286a410010d003024020032d00584101470d00200328025c2202450d16200341e0006a29030021060c010b0240200141206a2802002202200141246a22052802004f0d0020022001411c6a280200470d05200241016a22052002490d072002410174220a20052005200a491b22054100480d072002450d0220042802002002200510272202450d030c040b200341ec006a220141013602002003410236024c200320053602482003420137025c200341a0dcc4003602582003200341c8006a360268200341086a200341d8006a10a20120032802082202450d152003200329020c37020c20032002360208200141013602002003412a36024c2003420137025c200341e8d5c4003602582003200341086a3602482003200341c8006a360268200341286a200341d8006a10a2010240200328020c450d00200328020810230b20032802282202450d15200329022c21060b2000200637020420002002360200200341f0006a24000f0b2005102622020d010b20054101102a000b2001411c6a2005360200200141186a2002360200200141206a28020021020b200141186a28020020026a41003a0000200141206a2201200128020041016a3602000c100b200141306a2802002202417f6a220420024f0d01200420024b0d010240024002400240200128022820044103746a220a2802002205200141206a28020022024d0d002001411c6a280200220420026b200520026b22094f0d01200220096a220b2002490d042004410174220c200b200b200c491b220b4100480d042004450d02200141186a2802002004200b1027220c450d030c060b2005200220052002491b21040c090b200141186a280200220c200222046a210b20094102490d050c060b200b1026220c0d030b200b4101102a000b101e000b02404118102622000d0041184101102a000b2003421837025c20032000360258200341d8006a4100411810db0320032003280260220041186a3602602000200328025822016a411841a6dbc400411810dc032003200329025c37025c2003200136025841c9d0c400413b200341d8006a10dd03000b2001411c6a200b360200200141186a200c360200200c200141206a28020022046a210b200941024f0d010b20090d010c020b200b410420052002417f736a22021093041a200c200220046a22046a210b0b200b41043a0000200441016a21040b200141206a2004360200200a41013a00060c080b2001412c6a2002360200200141286a2004360200200141306a28020021040b200141286a28020020044103746a200642288620078442808080803084370200200141306a2201200128020041016a3602000c060b2001411c6a2004360200200141186a2002360200200141206a28020021020b200141186a28020020026a20093a0000200141206a2201200128020041016a3602000c040b2001411c6a2004360200200141186a2002360200200141206a28020021020b200141186a28020020026a41033a0000200141206a2201200128020041016a3602000c020b2001412c6a2002360200200141286a2004360200200141306a28020021040b200141286a28020020044103746a2006422886200784370200200141306a2201200128020041016a3602000b20004100360200200341f0006a24000b19002000200141186a280200360204200020012802103602000bb310012e7f230041a0016b2202240002400240024002402000280200220341f098c400460d00200028020421040c010b41ec0010262203450d0141002104200341003b010620034100360200200341086a200241086a41e4001094041a20004100360204200020033602000b200141ff017121050c010b41ec004104102a000b41002107024003400240024002400240024002400240024020070e020001010b200341086a210820032f0106210641002107024002400240034020062007460d014100417f4101200820076a2d0000220920054b1b20092005461b2209450d02200741016a210720094101460d000b2007417f6a21060b02402004450d002004417f6a2104200320064102746a41ec006a2802002103410021070c0a0b2000200028020841016a36020820032f01062207410b4f0d01200341086a2209200641016a220a6a200920066a2209200720066b1095041a200920013a0000200341146a2207200a4103746a200720064103746a2209200341066a22072f010020066b4103741095041a20094101360200200720072f010041016a3b0100200241a0016a24000f0b200320074103746a41146a42013702000c090b41ec001026220b450d04200b41003b0106200b4100360200200b41086a200241086a41e40010940421092003410e6a2d0000210c2003280248210d2003280244210e20092003410f6a200341066a220a2f010041796a22071094042109200b41146a200341cc006a2007410374109404210f200a41063b0100200b20073b010602400240200641064b0d00200341086a2207200641016a22096a200720066a220a200341066a22072f010020066b1095041a200a20013a0000200341146a220a20094103746a200a20064103746a220920072f010020066b4103741095041a200941013602000c010b20092006417a6a220a6a2009200641796a22066a2209200741ffff037120066b1095041a200920013a0000200f200a4103746a200f20064103746a2209200b41066a22072f010020066b4103741095041a200941013602000b4101210a200720072f010041016a3b010020032802002210450d014104210f410a2111419c0121124100211341082114419401211541c800211641c4002117410e2118410f21194106211a4179211b41cc00211c4114211d4103211e418801211f41ec002120417a21214102212241ffff03212341f0002124416c212541d4002126200341046a2f0100212720102f01062207410a4b0d060c020b201210262208450d02200820133b010620082013360200200820146a200241086a20151094042106201020166a280200212a201020176a2802002129201020186a2d000021282006201020196a2010201a6a222b2f01002209201b6a2207109404212c2008201d6a2010201c6a2007201e74109404212d200820206a2010201f6a200920216a222e202274109404212f202b201a3b0100200820073b01060240202e450d0041002107202f210603402006280200220920073b0104200920083602002006200f6a2106202e2007200a6a2207470d000b0b024002402027201a4b0d00201020146a22062027200a6a22076a200620276a2206202b2f0100220920276b222e1095041a2006200c3a00002010201d6a22062007201e746a20062027201e746a2206202e201e741095041a2006200e3602002006200d360204202b2009200a6a22063b0100201020206a22092027202274222b6a20146a200920072022746a222e2006202371220920076b2022741095041a202e200b360200202720094f0d012010202b6a20246a21070340200728020022062027200a6a22273b0104200620103602002007200f6a210720092027470d000c020b0b202c202720216a22066a202c2027201b6a22076a222e2008201a6a22092f010020076b1095041a202e200c3a0000202d2006201e746a202d2007201e746a222e20092f010020076b201e741095041a202e200e360200202e200d360204200920092f0100200a6a222e3b0100202f2027202274222b6a20256a202f20062022746a2209202e202371222720066b2022741095041a2009200b360200200620274b0d002008202b6a20266a21060340200628020022092007200a6a22073b0104200920083602002006200f6a210620272007470d000b0b024020102802002207450d002028210c2029210e202a210d2008210b2010200f6a2f01002127200722102f0106220720114d0d02410121070c070b2008210b202a210d2029210e2028210c0b419c0110262207450d03200741003b010620074100360200200741086a200241086a419401109404210920072000280200220636026c200020073602002000200028020441016a360204200641003b010420062007360200200720072f010622064103746a220a41186a200d360200200a41146a200e360200200920066a200c3a0000200741ec006a200641016a22064102746a200b360200200720063b0106200b20063b0104200b2007360200200241a0016a24000f0b201041086a2209202741016a22066a200920276a2209200720276b220a1095041a2009200c3a0000201041146a220920064103746a200920274103746a2209200a4103741095041a2009200e3602002009200d360204201041066a200741016a22073b0100201041ec006a220920274102746a41086a200920064102746a2209200741ffff0371220a20066b4102741095041a2009200b3602002027200a4f0d0520102006417f6a22074102746a41f0006a2106034020062802002209200741016a22073b010420092010360200200641046a2106200a2007470d000c060b0b419c014104102a000b41ec004104102a000b419c014104102a000b410121070c000b0b200241a0016a24000bbb3101a6017f23004190016b2202240020024184016a4200370200200241fc006a4280808080c000370200200241ec006a4200370200200241e4006a4280808080c000370200200241d0006a4200370300200241c0006a4200370300200241386a4280808080c000370300200241286a4200370300200241206a4280808080c000370300200241106a4200370300200242043702742002420437025c20024204370348200242043703302002420437031820024280808080c000370308200242043703002001410c6a280200210320012802082104024002400240200141106a2802002205450d0041002106417f2107412c2108417e2109410d210a4104210b4170210c4158210d4109210e4108210f41ffffffff03211041142111416c2112411c21134118211441ff012115410221164174211741012118410021194100211a4100211b4100211c4100211d4100211e4100211f410021204100212141002122410021230c010b4104215f410021604100216141002162410021634104216441002165410021664104216741002168410021694104216a4100216b4100216c4104216d41002105410021264104216e4100216f41002170410421714100217241002173410421744100217541002176410421774100217841002179410021010c010b410121010b034002400240024002400240024002400240024002400240024020010e020001010b4104210641002153410021500c010b024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020230e050001020304040b20252124202221262004200520076a220520086c6a2201280024212720012800202128200128001821292001280014212a2001280010212b200128000c212c2001280008212d2001280004212e4101212f0240024020012d0000223020096a2201200a4b0d0041012131410121324101213341012134410121354101213641012122202e2125024002400240024002400240024002400240024020010e0e000203040501062d07080927272f000b02402021450d0002402037450d002037200b74212520212101034002402001200b6a280200450d00200128020010230b200141106a21012025200c6a22250d000b0b2038450d00202110230b410121314100212f202c2137202d2138202e21210c0a0b201c450d1d2039450d1c201c2039200b746a213a201c213b4100213c0c260b02402020450d000240203e450d00203e41286c212520202101034002402001200b6a280200450d00200128020010230b0240200141106a280200450d002001410c6a28020010230b200141286a21012025200d6a22250d000b0b203f450d00202010230b410021314101212f202c213e202d213f202e21200c080b02402040450d00201f450d00201f10230b2026212220242125202e211f202d2140202c214120050d0e0c2a0b02402042450d00201e450d00201e10230b2026212220242125202e211e202d2142202c214320050d0c0c290b02402044450d00201d450d00201d10230b2026212220242125202e211d202d2144202c214520050d0a0c280b0240201b450d0002402046450d00204620116c2125201b2101034002402001200b6a280200450d00200128020010230b200120116a2101202520126a22250d000b0b2047450d00201b10230b410021334101212f202c2146202d2147202e211b41012131410121320c1f0b201a450d192048450d18201a204820136c6a2149201a214a4101213c0c210b2019450d1a204c450d192019204c20146c6a214d2019214e4102213c0c210b2006450d1b2050450d1a2006205020136c6a2151200621524103213c0c210b410121310b41012132410821010c200b02402082012802082223450d0020820128020021012023207b7421230340024020012d0000207e470d002001207f6a28020020800171450d002001207b6a28020010230b2001207d6a210120232081016a22230d000b0b208201207d6a21010240208201207b6a280200450d0020820128020010230b20012182012001207c470d060c240b0240208e012086016a2802002223450d00208e01280204210120232089017421230340024020012d0000208b01470d0020012087016a280200208c0171450d0020012089016a28020010230b2001208a016a21012023208d016a22230d000b0b0240208e012087016a280200450d00208e012089016a28020010230b208e012084016a21010240208e012088016a280200450d00208e0128021010230b2001218e012001208501470d060c240b0240209a012092016a280200450d00209a0128020010230b0240209a012093016a2802002223450d00209a0128020c210120232092017421230340024020012d0000209601470d0020012097016a28020020980171450d0020012092016a28020010230b20012094016a210120232099016a22230d000b0b209a012090016a21010240209a012094016a280200450d00209a012095016a28020010230b2001219a012001209101470d060c240b024020a701209f016a2802002223450d0020a7012802042101202320a2017421230340024020012d000020a401470d00200120a0016a28020020a50171450d00200120a2016a28020010230b200120a3016a2101202320a6016a22230d000b0b024020a70120a0016a280200450d0020a70120a2016a28020010230b20a701209d016a2101024020a70120a1016a280200450d0020a70128021010230b200121a7012001209e01470d060c240b410021230c060b410021230c060b410021230c060b410121230c060b410221230c060b410321230c060b410421230c060b410121010c220b410121010c210b410121010c200b410121010c1f0b410121010c1e0b410121010c1d0b410121010c1c0b410021010c0d0b410121010c0c0b410221010c0b0b410321010c0a0b410421010c090b410521010c080b410621010c070b410721010c060b410921010c050b410a21010c040b410b21010c030b410b21010c020b410b21010c010b410b21010b0240024002400340024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020010e0c000102030405060708090b0d0d0b203d450d17201c1023410121010c2a0b410021324101212f202c2139202d213d202e211c410121310c1a0b204b450d16201a1023410321010c280b410021344101212f202c2148202d214b202e211a4101213141012132410121330c060b204f450d1520191023410521010c260b410021354101212f202c214c202d214f202e211941012131410121324101213341012134410121362030200a4d0d060c270b2053450d1420061023410721010c240b410021364101212f202c2150202d2153202e210641012131410121324101213341012134410121352030200a4d0d040c250b41012133410921010c220b410121340b4101213541012136410a21010c200b2030200a4b0d210b202621222024212502400240024002400240024002400240024020300e0e2800010228282803042b05060708280b0240202d450d00202e10230b202a450d29202b10230c290b202f450d28202c450d26202c200b742125202e2101034002402001200b6a280200450d00200128020010230b200141106a21012025200c6a22250d000c270b0b2031450d27202c450d25202c41286c2125202e2101034002402001200b6a280200450d00200128020010230b0240200141106a280200450d002001410c6a28020010230b200141286a21012025200d6a22250d000c260b0b2032450d26202c450d24202e202c200b746a2154202e21554104213c0c190b2033450d25202c450d23202c20116c2125202e2101034002402001200b6a280200450d00200128020010230b200120116a2101202520126a22250d000c240b0b2034450d24202c450d22202e202c20136c6a2156202e21574105213c0c190b2035450d23202c450d21202e202c20146c6a2158202e21594106213c0c1a0b2036450d22202c450d20202e202c20136c6a215a202e215b4107213c0c1b0b02400240202e20157122012016460d0020012018460d01202c450d23202d10230c230b202a450d02202c202a200b746a215c202c215d4108213c0c1d0b202a450d01202a410c6c212e202c21010340024020012802002225450d002001200b6a280200450d00202510230b2001410c6a2101202e20176a222e0d000c020b0b024002400240024002400240024002400240203c0e09000102030405060708080b0240203b2802082225450d00203b28020021012025200b7421250340024020012d0000200e470d002001200f6a280200201071450d002001200b6a28020010230b200141106a21012025200c6a22250d000b0b203b41106a21010240203b200b6a280200450d00203b28020010230b2001213b2001203a470d09410021010c250b0240204a410c6a2802002225450d00204a28020421012025200b7421250340024020012d0000200e470d002001200f6a280200201071450d002001200b6a28020010230b200141106a21012025200c6a22250d000b0b0240204a200f6a280200450d00204a200b6a28020010230b204a20136a21010240204a20116a280200450d00204a28021010230b2001214a20012049470d09410221010c240b0240204e200b6a280200450d00204e28020010230b0240204e20116a2802002225450d00204e28020c21012025200b7421250340024020012d0000200e470d002001200f6a280200201071450d002001200b6a28020010230b200141106a21012025200c6a22250d000b0b204e20146a21010240204e41106a280200450d00204e410c6a28020010230b2001214e2001204d470d09410421010c230b02402052410c6a2802002225450d00205228020421012025200b7421250340024020012d0000200e470d002001200f6a280200201071450d002001200b6a28020010230b200141106a21012025200c6a22250d000b0b02402052200f6a280200450d002052200b6a28020010230b205220136a21010240205220116a280200450d00205228021010230b2001215220012051470d09410621010c220b024020552802082225450d00205528020021012025200b7421250340024020012d0000200e470d002001200f6a280200201071450d002001200b6a28020010230b200141106a21012025200c6a22250d000b0b205541106a210102402055200b6a280200450d00205528020010230b2001215520012054470d090c220b02402057410c6a2802002225450d00205728020421012025200b7421250340024020012d0000200e470d002001200f6a280200201071450d002001200b6a28020010230b200141106a21012025200c6a22250d000b0b02402057200f6a280200450d002057200b6a28020010230b205720136a21010240205720116a280200450d00205728021010230b2001215720012056470d090c210b02402059200b6a280200450d00205928020010230b0240205920116a2802002225450d00205928020c21012025200b7421250340024020012d0000200e470d002001200f6a280200201071450d002001200b6a28020010230b200141106a21012025200c6a22250d000b0b205920146a21010240205941106a280200450d002059410c6a28020010230b2001215920012058470d090c200b0240205b410c6a2802002225450d00205b28020421012025200b7421250340024020012d0000200e470d002001200f6a280200201071450d002001200b6a28020010230b200141106a21012025200c6a22250d000b0b0240205b200f6a280200450d00205b200b6a28020010230b205b20136a21010240205b20116a280200450d00205b28021010230b2001215b2001205a470d090c1f0b205d225e41106a215d0240205e2802042201450d000240205e410c6a2802002225450d002025410c6c21250340024020012802002222450d002001200b6a280200450d00202210230b2001410c6a2101202520176a22250d000b0b205e200f6a280200450d00205e200b6a28020010230b205d205c470d090b202b450d1f202c10230c1f0b4100213c0c0d0b4101213c0c0d0b4102213c0c0d0b4103213c0c0d0b4104213c0c0e0b4105213c0c0f0b4106213c0c100b4107213c0c110b4108213c0c120b410121010c120b410321010c110b410521010c100b410721010c0f0b410821010c0e0b410b21010c0d0b410b21010c0c0b410b21010c0b0b410b21010c0a0b410b21010c090b410b21010c080b410b21010c070b410b21010c060b410b21010c050b410b21010c040b410b21010c030b410b21010c020b410b21010c010b410b21010c000b0b202d450d01202e10230c010b0240202d450d00202e10230b0240202a450d002029450d00202a10230b2027450d00202810230b20262122202421250b20050d070b4100210520252124202221260b204c410020191b2160204f410020191b216120484100201a1b2179204b4100201a1b217820464100201b1b216220474100201b1b216320394100201c1b2176203d4100201c1b217520454100201d1b216520444100201d1b216620434100201e1b217320424100201e1b217220414100201f1b216820404100201f1b2169203e410020201b2170203f410020201b216f2037410020211b216b2038410020211b216c2019410420191b215f201a4104201a1b2177201b4104201b1b2164201c4104201c1b2174201d4104201d1b2167201e4104201e1b2171201f4104201f1b216a2020410420201b216e2021410420211b216d20060d00410021010c0a0b2002280200217a0240200241086a2802002201450d0020014104742123207a210103400240200141046a280200450d00200128020010230b200141106a2101202341706a22230d000b0b02402002280204450d00207a10230b2002410c6a280200217a0240200241146a2802002201450d00200141286c2123207a210103400240200141046a280200450d00200128020010230b0240200141106a280200450d002001410c6a28020010230b200141286a2101202341586a22230d000b0b0240200241106a280200450d00207a10230b02402002411c6a280200450d00200241186a28020010230b0240200241286a280200450d00200241246a28020010230b0240200241346a280200450d00200241306a28020010230b2002413c6a280200217a200241c4006a2802002201450d004104217b207a20014104746a217c4110217d4109217e4108217f41ffffffff032180014170218101207a218201410121230c050b0240200241c0006a280200450d00207a10230b200241c8006a2802002183010240200241d0006a2802002201450d00200141146c2123208301210103400240200141046a280200450d00200128020010230b200141146a21012023416c6a22230d000b0b0240200241cc006a280200450d0020830110230b200241dc006a280200218301200241e4006a2802002201450d00411c2184012083012001411c6c6a218501410c2186014108218701411421880141042189014110218a014109218b0141ffffffff03218c014170218d01208301218e01410221230c050b0240200241e0006a280200450d0020830110230b200241e8006a280200218f01200241f0006a2802002201450d004118219001208f01200141186c6a219101410421920141142193014110219401410c2195014109219601410821970141ffffffff032198014170219901208f01219a01410321230c050b0240200241ec006a280200450d00208f0110230b418001219b01200241f4006a280200219c01200241fc006a2802002201450d00411c219d01209c012001411c6c6a219e01410c219f01410821a001411421a101410421a201411021a301410921a40141ffffffff0321a501417021a601209c0121a701410421230c050b2002209b016a21010240200241f8006a280200450d00209c0110230b200110ef03024020024184016a2201280200450d0020024180016a28020010230b20024188016a20053602002001200336020020024180016a2004360200200241fc006a2050360200200241f8006a2053360200200241f4006a2006360200200241f0006a2060360200200241ec006a2061360200200241e8006a205f360200200241e4006a2079360200200241e0006a2078360200200241dc006a2077360200200241d8006a2024360200200241d4006a2026360200200241d0006a2062360200200241cc006a2063360200200241c8006a2064360200200241c4006a2076360200200241c0006a20753602002002413c6a2074360200200241386a2065360200200241346a2066360200200241306a20673602002002412c6a2073360200200241286a2072360200200241246a2071360200200241206a20683602002002411c6a2069360200200241186a206a360200200241146a2070360200200241106a206f3602002002410c6a206e360200200241086a206b3602002002206c3602042002206d36020020002002418c011094041a20024190016a24000f0b41002123410121010c040b410121010c030b410121010c020b410121010c010b410121010c000b0b9a0c02297f017e230041106b22022400024002400240024020012802004101470d00200141106a2d000021032001410c6a2802002104200141086a280200210520012f0112210620012d0011210720012802042101200241086a200010be0320022802082208200228020c22094104746a210a4100210b20094104490d0141ff01210c200341ff0171210d4101210e410d210f411c211041182111411d2112412c21134128211441202115412d2116413c211741c0002118413821194130211a413d211b413f211c4101211d0c020b20012802042104200241106a240020040f0b410021090c010b410121090b02400240024003400240024002400240024002400240024002400240024002400240024002400240024020090e020001010b2008200a460d01410421210240200741ff017122224104470d0041102123200341ff0171212441012125410d21264100211d0c0c0b41102127200341ff0171212841012129410d212a4102211d0c0f0b024002400240201d0e03010002020b024020082d000c200d470d0020082802082004470d002008280200211e4100210902400340200920044f0d01200120096a211f201e20096a21202009200e6a210920202d0000201f2d0000460d000c020b0b2007200c71220941044622202008200f6a2d0000221f410446221e470d00201f2009460d0720200d07201e0d070b0240200820106a2d0000200d470d00200820116a2802002004470d00200841106a280200211e4100210902400340200920044f0d01200120096a211f201e20096a21202009200e6a210920202d0000201f2d0000460d000c020b0b2007200c7122094104462220200820126a2d0000221f410446221e470d00201f2009460d0420200d04201e0d040b0240200820136a2d0000200d470d00200820146a2802002004470d00200820156a280200211e4100210902400340200920044f0d01200120096a211f201e20096a21202009200e6a210920202d0000201f2d0000460d000c020b0b2007200c7122094104462220200820166a2d0000221f410446221e470d00201f2009460d0520200d05201e0d050b0240200820176a2d0000200d470d00200820196a2802002004470d002008201a6a280200211e4100210902400340200920044f0d01200120096a211f201e20096a21202009200e6a210920202d0000201f2d0000460d000c020b0b2007200c71220941044622202008201b6a2d0000221f410446221e470d00201f2009460d0620200d06201e0d060b200b41046a210b200a200820186a22086b201c4b0d0a410021090c110b024020082d000c2024470d0020082802082004470d00200828020021204100210902400340200920044f0d01200120096a211d202020096a211f200920256a2109201f2d0000201d2d0000460d000c020b0b200820266a2d00002021460d060b200b20256a210b200820236a2208200a470d080c010b024020082d000c2028470d0020082802082004470d00200828020021204100210902400340200920044f0d01200120096a211d202020096a211f200920296a2109201f2d0000201d2d0000460d000c020b0b2008202a6a2d000022092022470d0020092021470d050b200b20296a210b200820276a2208200a470d090b024002400240200041046a28020020002802082208470d00200841016a22092008490d082008410174220e20092009200e491b220ead420486222b422088a70d08202ba7221d4100480d082008450d0120002802002008410474201d10272209450d020c120b200028020021090c120b201d102622090d100b201d4104102a000b200b410172210b20050d030c100b200b410272210b20050d020c0f0b200b410372210b0b2005450d0d0b20011023200241106a2400200b0f0b101e000b4100211d0c030b4101211d0c030b4102211d0c030b410121090c040b410121090c030b410121090c020b410121090c010b410121090c000b0b20002009360200200041046a200e360200200041086a28020021080b200920084104746a220820063b010e200820073a000d200820033a000c200820043602082008200536020420082001360200200041086a2204200428020041016a3602002002200010be032002280204417f6a210b0b200241106a2400200b0bac24032d7f017e2b7f230041306b220224002001280204210320012802002104410121050240024002400240024020012802082206450d00412c10262207450d02200720022f002d3b0001200741023a00002007200636000c200720033600082007200436000420072002290208370210200741036a2002412d6a41026a2d00003a0000200741186a200241106a290200370200200741206a200241186a290200370200200741286a200241086a41186a28020036020041002108410121090c010b4104210741002109410121080b200141106a280200210a200128020c210b024002400240200141146a280200220c450d002009410174220d200941016a220e200e200d491b220d412c6c210e2009450d0120072009412c6c200e10272207450d020c040b2009210d0c040b200e102622070d020b200e4104102a000b412c4104102a000b20072009412c6c6a220e20022f002d3b0001200e41033a0000200e200c36000c200e200a360008200e200b360004200e2002290208370210200e41036a2002412f6a2d00003a0000200e41186a200241106a290200370200200e41206a200241186a290200370200200e41286a200241086a41186a280200360200200941016a2109410021050b2001411c6a280200210f2001280218211041002111024002400240024002400240024002400240200141206a2802002212450d00200d2009470d0441000d0641000d06200d410174220e200d41016a22132013200e491b220ead422c7ea722134100480d06200d450d012007200d412c6c201310272207450d020c030b410021140c040b2013102622070d010b20134104102a000b200e210d0b20072009412c6c6a220e41043a0000200e201236000c200e200f360008200e2010360004200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41186a280200360200200e41206a200241186a290200370200200e41186a200241106a290200370200200e200229020837021041012114200941016a21090b200141286a28020021152001280224211602402001412c6a2802002212450d000240200d2009470d0041000d0241000d02200d410174220e200d41016a22132013200e491b220ead422c7ea722134100480d02024002400240200d450d002007200d412c6c201310272207450d010c020b2013102622070d010b20134104102a000b200e210d0b20072009412c6c6a220e41053a0000200e201236000c200e2015360008200e2016360004200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41186a280200360200200e41206a200241186a290200370200200e41186a200241106a290200370200200e200229020837021041012111200941016a21090b200141346a280200211720012802302118024002400240024002400240200141386a2802002212450d00200d2009470d0441000d0641000d06200d410174220e200d41016a22132013200e491b220ead422c7ea722134100480d06200d450d012007200d412c6c201310272207450d020c030b410021190c040b2013102622070d010b20134104102a000b200e210d0b20072009412c6c6a220e41063a0000200e201236000c200e2017360008200e2018360004200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41186a280200360200200e41206a200241186a290200370200200e41186a200241106a290200370200200e200229020837021041012119200941016a21090b200141c0006a280200211a200128023c211b4101211c024002400240024002400240200141c4006a280200221d450d00200d2009470d0441000d0641000d06200d410174220e200d41016a22122012200e491b220ead422c7ea722124100480d06200d450d012007200d412c6c201210272207450d020c030b4101211e0c040b2012102622070d010b20124104102a000b200e210d0b20072009412c6c6a220e41073a0000200e201d36000c200e201a360008200e201b360004200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41186a280200360200200e41206a200241186a290200370200200e41186a200241106a290200370200200e2002290208370210200941016a21094100211e0b200141cc006a280200211f200128024821200240200141d0006a2802002221450d000240200d2009470d0041000d0241000d02200d410174220e200d41016a22122012200e491b220ead422c7ea722124100480d02024002400240200d450d002007200d412c6c201210272207450d010c020b2012102622070d010b20124104102a000b200e210d0b20072009412c6c6a220e41083a0000200e202136000c200e201f360008200e2020360004200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41186a280200360200200e41206a200241186a290200370200200e41186a200241086a41086a290200370200200e2002290208370210200941016a21094100211c0b41012122024020012802544101470d00200141d8006a28020021120240200d2009470d0041000d0241000d02200d410174220e200d41016a22132013200e491b220ead422c7ea722134100480d02024002400240200d450d002007200d412c6c201310272207450d010c020b2013102622070d010b20134104102a000b200e210d0b20072009412c6c6a220e41093a0000200e2012360204200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41206a280200360200200e41206a200241086a41186a290200370200200e41186a200241086a41106a290200370200200e41106a200241106a290200370200200e2002290208370208200941016a21090b200141e0006a2802002123200128025c21240240200141e4006a2802002225450d000240200d2009470d0041000d0241000d02200d410174220e200d41016a22122012200e491b220ead422c7ea722124100480d02024002400240200d450d002007200d412c6c201210272207450d010c020b2012102622070d010b20124104102a000b200e210d0b20072009412c6c6a220e410a3a0000200e202536000c200e2023360008200e2024360004200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41186a280200360200200e41206a200241186a290200370200200e41186a200241106a290200370200200e2002290208370210200941016a2109410021220b200141ec006a28020021262001280268212741012128024002400240024002400240200141f0006a2802002229450d00200d2009470d0441000d0641000d06200d410174220e200d41016a22122012200e491b220ead422c7ea722124100480d06200d450d012007200d412c6c201210272207450d020c030b4101212a0c040b2012102622070d010b20124104102a000b200e210d0b20072009412c6c6a220e410b3a0000200e202936000c200e2026360008200e2027360004200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41186a280200360200200e41206a200241186a290200370200200e41186a200241106a290200370200200e2002290208370210200941016a21094100212a0b200141f8006a2802002112200128027421130240200141fc006a280200222b450d000240200d2009470d0041000d0241000d02200d410174220e200d41016a22282028200e491b220ead422c7ea722284100480d02024002400240200d450d002007200d412c6c202810272207450d010c020b2028102622070d010b20284104102a000b200e210d0b20072009412c6c6a220e410c3a0000200e202b36000c200e2012360008200e2013360004200e41036a2002412f6a2d00003a0000200e20022f002d3b0001200e41286a200241086a41186a280200360200200e41206a200241186a290200370200200e41186a200241106a290200370200200e2002290208370210200941016a2109410021280b20014184016a280200212c200128028001210e024002400240200d20096b20014188016a280200412c6c222d412c6d22014f0d00200920016a22012009490d03200d410174222e20012001202e491b222ead422c7e222f422088a70d03202fa722304100480d03200d450d012007200d412c6c203010272207450d020c040b200920016a21010c040b2030102622070d020b20304104102a000b101e000b202e210d0b20072009412c6c6a200e202d1094041a0240202c450d00200e10230b0240024002400240024041c00510262209450d002000200736020820004280c2cdeb16370200200241086a410c6a4210370200200041106a20013602002000410c6a200d3602002002200936021020024280c2cdeb16370308200241106a10ef03200910232028450d02202b450d01411c21312013202b411c6c6a2132410c2133410821344114213541042136411021374109213841ffffffff0321394170213a2013213b4100213c0c030b41c0054104102a000b410021010c020b410121010c010b410221010b03400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020010e03000102020b2012450d0e20131023410121010c160b202a450d022029450d014118213d2027202941186c6a213e4104213f4114214041102141410c2142410921434108214441ffffffff03214541702146202721474101213c0c0f0b02400240203c0e0400010407070b0240203b20336a2802002209450d00203b2802042101200920367421090340024020012d00002038470d00200120346a280200203971450d00200120366a28020010230b200120376a21012009203a6a22090d000b0b0240203b20346a280200450d00203b20366a28020010230b203b20316a21010240203b20356a280200450d00203b28021010230b2001213b20012032470d09410021010c150b02402047203f6a280200450d00204728020010230b0240204720406a2802002209450d00204728020c21012009203f7421090340024020012d00002043470d00200120446a280200204571450d002001203f6a28020010230b200120416a2101200920466a22090d000b0b2047203d6a21010240204720416a280200450d00204720426a28020010230b200121472001203e470d090b2026450d00202710230b2022450d022025450d01411c214820242025411c6c6a2149410c214a4108214b4114214c4104214d4110214e4109214f41ffffffff03215041702151202421524102213c0c0e0b02402052204a6a2802002209450d00205228020421012009204d7421090340024020012d0000204f470d002001204b6a280200205071450d002001204d6a28020010230b2001204e6a2101200920516a22090d000b0b02402052204b6a280200450d002052204d6a28020010230b205220486a210102402052204c6a280200450d00205228021010230b2001215220012049470d070b2023450d00202410230b0240201c450d0002402021450d00202141146c21092020210103400240200141046a280200450d00200128020010230b200141146a21012009416c6a22090d000b0b201f450d00202010230b201e450d02201d450d0141042153201b201d4104746a215441102155410921564108215741ffffffff03215841702159201b215a4103213c0c0d0b0240205a2802082209450d00205a2802002101200920537421090340024020012d00002056470d00200120576a280200205871450d00200120536a28020010230b200120556a2101200920596a22090d000b0b205a20556a21010240205a20536a280200450d00205a28020010230b2001215a20012054470d050b201a450d00201b10230b02402017410047201941017371450d00201810230b02402015410047201141017371450d00201610230b0240200f410047201441017371450d00201010230b02402005450d000240200c450d00200c41286c2109200b210103400240200141046a280200450d00200128020010230b0240200141106a280200450d002001410c6a28020010230b200141286a2101200941586a22090d000b0b200a450d00200b10230b02402008450d0002402006450d00200641047421092004210103400240200141046a280200450d00200128020010230b200141106a2101200941706a22090d000b0b2003450d00200410230b200241306a24000f0b4100213c0c040b4101213c0c050b4102213c0c060b4103213c0c070b410121010c070b410221010c060b410221010c050b410221010c040b410221010c030b410221010c020b410221010c010b410221010c000b0bb505000240024002400240024002400240024002400240200041ff0171417f6a220041aa014b0d00024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020000eab014a00000000000000000000000000010101010103030404050506060707080809094b0a0a0b0b0c0c0d0d4c4d0e0e0f0f10101111121213131414151516161717181819191a1a1b1b1c1c1d1d1e1e1f1f20204e212122224f2323242450252526262727282829292a2a512b2b2c2c2d2d2e2e2f2f30303131323233333434353536363737383839393a3a3b3b3c3c3d3d3e3e523f3f404041414242434344444545464647474848020202024a0b410a0f0b41080f0b41100f0b41040f0b41040f0b41040f0b41040f0b41040f0b41040f0b41040f0b41050f0b41050f0b41050f0b41050f0b41060f0b41070f0b410b0f0b410b0f0b410b0f0b410b0f0b410b0f0b410b0f0b410b0f0b410b0f0b410b0f0b410b0f0b410b0f0b410c0f0b410c0f0b410c0f0b410c0f0b410c0f0b410c0f0b41000f0b41010f0b41030f0b41030f0b41000f0b41000f0b41000f0b41000f0b41000f0b41010f0b41030f0b41030f0b41000f0b41000f0b41000f0b41000f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410d0f0b410f0f0b410f0f0b410e0f0b410f0f0b410f0f0b410f0f0b410f0f0b410f0f0b410f0f0b410f0f0b41110f0b41120f0b41050f0b41130f0b41140f0b41000f0b41020f0b41000f0b41020f0b410e0b800203047f017e017f024002400240200041086a28020022032001490d0002400240024002402003200041046a280200470d00200341016a22042003490d0320034101742205200420042005491b2206ad4204862207422088a70d032007a722084100480d032003450d0120002802002003410474200810272205450d020c050b200341016a2104200028020021050c050b2008102622050d030b20084108102a000b101e000b4180e4c400104f000b20002005360200200041046a20063602000b200520014104746a220541106a2005200320016b4104741095041a200541086a200241086a29030037030020052002290300370300200041086a20043602000b9e0503057f017e017f230041306b22022400200241106a200141246a290200370300200241086a2001411c6a29020037030020022001290214370300200241186a41106a200141106a280200360200200241186a41086a200141086a290200370300200220012902003703182000200241186a10c8032103024002400240024002400240024002402000411c6a280200200041206a2802002204470d00200441016a22052004490d0520044101742206200520052006491b2206ad4202862207422088a70d052007a722084100480d052004450d01200041186a2802002004410274200810272205450d020c030b200041186a28020021050c030b2008102622050d010b20084104102a000b2000411c6a2006360200200041186a2005360200200041206a28020021040b200520044102746a2003360200200041206a2204200428020041016a360200200241186a41106a200241106a290300370300200241186a41086a200241086a29030037030020022002290300370318024002400240200041ec006a280200200041f0006a2802002204470d00200441016a22052004490d0320044101742203200520052003491b2203ad42187e2207422088a70d032007a722064100480d032004450d01200041e8006a280200200441186c200610272205450d020c040b200041e8006a28020021050c040b2006102622050d020b20064104102a000b101e000b200041ec006a2003360200200041e8006a2005360200200041f0006a28020021040b2005200441186c6a22042002290318370200200441106a200241186a41106a290300370200200441086a200241186a41086a290300370200200041f0006a22042004280200220441016a360200024020012d002c450d0020004101360254200041d8006a20043602000b200241306a24000b929601150b7f017e587f037e047f017e387f027e1c7f027e137f037e3e7f027e017f017e047f047e277f017e227f23002203210420034180096b41607122032400024002400240024002400240024002400240411010262205450d00200541063a0000412010262206450d01200641063a00104100210720064100360204200620032f00c0053b00012006412d3a0000200641036a200341c2056a2d00003a0000024020052d00004109470d00200528020841ffffffff0371450d00200528020410230b20051023200141106a2802002208412c6c21092001280208210a024002400240024002400240034020092007460d01200a20076a21052007412c6a220b210720052d00004107470d000b200320032f01a0033b01c005200a200b6a220541586a210a2005415c6a2208280200200541606a22092802002207470d01200741016a220b2007490d0e2007410174220c200b200b200c491b220dad420486220e422088a70d0e200ea7220c4100480d0e2007450d04200541586a2802002007410474200c1027220b450d050c0b0b411010262205450d0720054180023b010c200542828080802037020420052006360200200520032f01a0033b010e2001410c6a2802002008470d09200841016a22072008490d0d20084101742209200720072009491b2207ad422c7e220e422088a70d0d200ea722094100480d0d2008450d01200a2008412c6c20091027220a450d020c080b200a280200210b0c0a0b20091026220a0d060b20094104102a000b200c1026220b0d060b200c4104102a000b41104108102a000b41204108102a000b41104104102a000b2001410c6a2007360200200141086a200a3602000b200141106a200841016a220c360200200a2008412c6c6a220720032f00b0043b0001200741073a0000200742818080801037000820072005360004200720032902c005370210200741036a200341b2046a2d00003a0000200741186a200341c8056a290200370200200741206a200341c0056a41106a290200370200200741286a200341c0056a41186a2802003602004100210f0c020b2008200d360200200541586a200b360200200928020021070b200b20074104746a22074180023b010c200742828080802037020420072006360200200720032f01c0053b010e2009200928020041016a360200200341c0006a200a10be032003280244417f6a210f200141106a280200210c200141086a280200210a0b200c412c6c2107200a41586a210502400340410021062007450d01200741546a2107200541286a21092005412c6a220b210520092d00004103470d000b200b41086a2802002207450d00200741286c2105200b28020041186a2107410021060340200620072d0000456a2106200741286a2107200541586a22050d000b0b200c412c6c2107200a41586a210502400340410021092007450d01200741546a2107200541286a210b2005412c6a22082105200b2d00004103470d000b200841086a2802002207450d00200741286c2105200828020041186a2107410021090340200920072d0000456a2109200741286a2107200541586a22050d000b0b200c412c6c2107200a41606a21050240024003402007450d01200741546a2107200541206a210b2005412c6a220a2105200b2d00004104470d000b200a28020021070c010b410021070b0240200720096a2210ad220e421e88a70d00200e420286a72207417f4c0d0002400240024002400240024002402007450d00200710ac01220a450d0220100d010c030b4104210a2010450d030b200a20104102746a2111410021124101211341042114200141106a2115412c211641082117200141086a2118415821194154211a4128211b410b211c4118211d4103211e200a211f410021200c030b20074104102a000b410021070c020b410021070c010b410121070b034002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020070e020001010b200141086a2802002121412c2123200141106a280200220d450d360c010b02400240024002400240024002400240024020200e050001030405050b024020122006490d002015280200220d20166c220921072018280200222120196a220b210502400340410021082007450d012007201a6a21072005201b6a210c200520166a22222105200c2d0000201e470d000b202220176a2802002207450d002007201b6c21052022280200201d6a2107410021080340200820072d0000456a21082007201b6a2107200520196a22050d000b0b201220086b220820124b0d0603402009450d032009201a6a2109200b201b6a2107200b20166a2205210b20072d0000201c470d000b200520176a28020020084d0d0720052802002008201d6c6a2802082105200341c0056a2008200110e30320032802c405210720032802c0052013460d08201f200720056a3602000b201220136a2112201f20146a221f2011470d0c410021070c420b20212d0000202a470d3b202128020c2207450d3b202128020422702007202b6c6a2171410021720c1f0b412c10262207450d07200741286a41002800e6de44360000200741206a41002900dede44370000200741186a41002900d6de44370000200741106a41002900cede44370000200741086a41002900c6de44370000200741002900bede443700000c350b0240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020ca01209a01712207209201460d002007209b01470d01208b0121d201410021070c4c0b20c901209a01712207209b01460d0102402007209201470d00034020990120900122076b209c014d0d05200728020c450d092007209e016a280200450d0d200720a1016a280200450d11200720a4016a219001200720a5016a2802000d000b200720a6016a21d4010c150b034020990120900122076b209c014d0d05200728020c450d092007209e016a280200450d0d200720a1016a280200450d11200720a4016a219001200720a5016a2802000d000b200720a6016a21d4010c190b20c901209a01712207209b01460d0102402007209201470d00034020990120900122076b209c014d0d06200728020c450d0a2007209e016a280200450d0e200720a1016a280200450d12200720a4016a219001200720a5016a2802000d000b200720a6016a21d4010c1b0b034020990120900122076b209c014d0d06200728020c450d0a2007209e016a280200450d0e200720a1016a280200450d12200720a4016a219001200720a5016a2802000d000b200720a6016a21d4010c1d0b024020c701209201470d00208b0120c801470d390b0340209101209701460d4d200341286a20910110c5032003280228228b01450d4d2091012096016a219101208b01208b01200328022c209b01746a22c801460d000b410321070c490b20c701209201470d28208b0120c801470d380c270b2007209901460d4a2007209d016a21d4010340200728020c450d1020d4012098016a21d40120072098016a2207209901470d000c4b0b0b2007209901460d102007209d016a21d4010340200728020c450d1420d4012098016a21d40120072098016a2207209901470d000b20990121900120c701209201460d2d0c2e0b410121c9012007209901460d102007209d016a21d4010340200728020c450d1520d4012098016a21d40120072098016a2207209901470d000b209901219001208b0121d2012094010d310c480b2007209901460d102007209d016a21d4010340200728020c450d1720d4012098016a21d40120072098016a2207209901470d000b20990121900120c701209201460d270c280b2007209d016a21d40120072098016a2190010c0c0b2007209d016a21d40120072098016a2190010c100b2007209d016a21d40120072098016a2190010c110b2007209d016a21d40120072098016a2190010c130b2007209f016a21d401200720a0016a2190010c080b2007209f016a21d401200720a0016a2190010c0c0b2007209f016a21d401200720a0016a2190010c0d0b2007209f016a21d401200720a0016a2190010c0f0b200720a2016a21d401200720a3016a2190010c040b200720a2016a21d401200720a3016a2190010c080b200720a2016a21d401200720a3016a2190010c090b200720a2016a21d401200720a3016a2190010c0b0b20d401208f016a2190010b410121c901208b0121d201410421070c360b200721900120c701209201470d1b0c1a0b2007219001208b0121d2012094010d1f0c370b200721900120c701209201470d150c140b20d401208f016a2190010b410121ca01410021c9010c020b20d401208f016a2190010b410021ca01410121c9010b208b0122d201218b01200320d40128020022d30136027c200a0d1c0c2f0b20d401208f016a2190010b410021c901410021ca01208b0122d201218b01200320d40128020022d30136027c200a0d190c2d0b20d001220720f4016a21d001200728020021c302200341e0006a21c402200328026421c5020c140b024020d1022d0000220720d302460d000240200720df02460d00200720d702470d2e20d10228020c2207450d2e20d10228020422e102200720e0026c6a21e202410b21720c290b20d10228020421e602200341e0006a21e702200328026421e8020c150b20d10228020c2207450d2c20d10228020422e902200720d4026c6a21ea02410d21720c290b412c10262207450d04200741286a41002800bade44360000200741206a41002900b2de44370000200741186a41002900aade44370000200741106a41002900a2de44370000200741086a410029009ade4437000020074100290092de443700000c310b411e10262207450d04200741166a4100290080df44370000200741106a41002900fade44370000200741086a41002900f2de44370000200741002900eade44370000429e808080e003210e0c310b200341c8056a290300210e200a102320070d314100210a412c2123200d450d350b2021200d20236c6a212441142125200341b0046a41146a2126200341b0076a212741012128200341c0056a4101722129410b212a4118212b410c212c4104212d4102212e200341a4076a212f200341a0076a21304113213120034190076a213241d700213320034184076a213420034180076a2135412d2136200341f4066a2137200341f0066a213841122139200341e4066a213a200341e0066a213b200341d0066a213c4106213d200341c0066a213e4100213f200341b0066a21404184082141200341a0066a21424137214320034194066a214420034190066a214520034184066a214620034180066a2147200341f4056a2148200341f0056a21494120214a200341c0056a41206a214b41d600214c4110214d200341c0056a41106a214e4108214f200341b0046a41086a215041ac0121514109215241ffffffff032153200341e8056a2154200341e4056a2155200341f8056a215620034188066a215720034198066a2158200341a8066a2159200341a4066a215a200341b8066a215b200341b4066a215c200341c8066a215d200341c4066a215e200341d8066a215f200341d4066a2160200341e8066a2161200341f8066a216220034188076a216320034198076a216420034194076a2165200341a8076a21664208216742042168422021694103216a4170216b41ff01216c412c216d4201216e4198dfc400216f410121200c040b412c4101102a000b412c4101102a000b411e4101102a000b41002120410121070c350b410121070c340b410321720c120b410421720c120b410521720c120b410621720c120b410521720c120b410621720c120b410721720c120b410821720c120b410721720c120b410821720c120b410921720c120b410c21720c130b410121070c140b410121070c130b410221070c120b410221070c110b410321070c100b410521070c0f0b410621070c0e0b410621070c0d0b410621070c0c0b410621070c0b0b410621070c0a0b410621070c090b410621070c080b410621070c070b410621070c060b410621070c050b410621070c040b410621070c030b410621070c020b410621070c010b410621070b0340024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020070e0700010203070811110b209401450d3c410121070c390b4100219401410221ca0120930121d301410021930120d201218b01200320d30136027c200a450d39410221070c380b201020d3014d0d07200a20d301209b01746a2802002205450d0d20cc0120cb01470d0320cb012092016a220720cb01490d4c20cb01209201742209200720072009491b22cc01ad20a70186220e20a80188a70d4c200ea72207208e01480d4c20cb01450d0120ce0120cb01209b01742007102722cd010d020c0b0b208b01450d39208b01208f016a21d201410121c701410221c901208b0121d4010c190b2007102622cd01450d090b20cd0121ce0120cd0121cf0120cd0121d0010b20d00120cb01209b01746a20d301360200200341c0056a200328027c22d501200341c8006a10e50320ab0128020021d60120032802c40521d10120032802c00522d701209201460d0420d101280208220720ac014c0d4720d101280200210920d1012d000c210b024002402007450d002007102622080d010c080b410121080b200820092007109404210920d10120ad016a2d000021082003200536029c012003200328027c360298012003208e0136029001200320083a008d012003200b3a008c0120032007360288012003200736028401200320093602800102400240200328027022d801209501460d00200328027421d9010c010b20ae01102622d801450d09410021d90120d80141003b010620d801410036020020d80120aa016a200341c0056a20af011094041a20034100360274200320d8013602700b20cb012092016a21cb010c0b0b410121ca010c010b208b01208f016a21d201410021ca01410221c901410121c701208b0121d401208b01450d100b20d201218b01200320d40128020022d30136027c200a0d110c310b200341d4056a4101360200200341023602a403200341d0056a200341a0036a360200200342023702c405200341b8e4c4003602c0052003200341fc006a3602a003200341b0046a200341c0056a10a20120032902b404220e422088a7210520032802b00421d101200ea721d6010c010b20a90128020021050b20032802702003280274200341f8006a28020010e603024020cc01450d0020cd0110230b0240208c01450d00208c01412c6c218b01208d01210703402007109f012007412c6a2107208b0141546a228b010d000b0b0240200341d4006a280200450d00208d0110230b200020d10136020420004101360200200041086a2005ad42208620d601ad84370200200a450d392010450d39200a1023200424000f0b20074101102a000b20074104102a000b4194034104102a000b41022120410121070c3c0b024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020720e0e000102060708090c0d0e0f101112120b207020256a22732802002274450d4e2070202c6a2175410021760c420b20d80120aa016a210920d8012f01062208209b01742105417f21070240024002400240024003402005450d0120072092016a2107208e0120ac012092012009280200220b20d5014b1b200b20d501461b220b450d04200520c4016a21052009208f016a2109200b209201460d000b20d9010d010c020b2008210720d901450d010b20d90120ac016a21d90120d8012007209b01746a20ae016a28020021d801410121720c370b200341f0006a20aa016a220520052802002092016a360200200329039801210e20032903900121da0120032903880121db0120032903800121dc0120d8012f0106220520b1014f0d0120d80120aa016a220920072092016a220b209b01746a20092007209b01746a2209200520076b209b01741095041a200920d50136020020d80120a1016a2205200b20b201746a2005200720b201746a220520d80120b0016a22092f010020076b20b201741095041a200520b3016a200e370200200520da01370210200520db01370208200520dc01370200200920092f01002092016a3b010020d701450d230c490b20d801200720b201746a220720a6016a200329039801370200200720bb016a220529020021da012005200329039001370200200720a3016a200329038801370200200720a1016a2207290200210e200720032903800137020020da0120c6018320a70185500d47200e20c50183500d47200ea710230c470b20ae0110262205450d1c2005208e013b01062005208e01360200200520aa016a200341c0056a20af01109404210b200341c0056a20b3016a22dd0120d80120b4016a290200370300200341c0056a209d016a22de0120d80120b5016a29020037030020ab0120d80120b6016a290200370300200320d8012902f4013703c00520d80128022021df01200b20d801209f016a20d80120b0016a22082f010020b7016a2209209b0174109404210b200520a1016a20d80120b8016a200920b20174109404210c200820b0013b0100200520093b0106200341b0046a20b3016a22e00120dd01290300370300200341b0046a209d016a22e10120de01290300370300200341b0046a20aa016a22e20120ab01290300370300200320032903c0053703b00402400240200720b0014b0d0020d80120aa016a220920072092016a220b209b01746a20092007209b01746a220820d80120b0016a22092f010020076b209b01741095041a200820d50136020020d80120a1016a2208200b20b201746a2008200720b201746a220b20092f010020076b20b201741095041a200b20b3016a200e370200200b20da01370210200b20db01370208200b20dc013702000c010b200b200720c1016a2220209b01746a200b200720b7016a2208209b01746a2207200920bc017120086b209b01741095041a200720d501360200200c202020b201746a200c200820b201746a2207200520b0016a22092f010020086b20b201741095041a200720b3016a200e370200200720da01370210200720db01370208200720dc013702000b200920092f01002092016a3b0100200341a0036a20b3016a22e30120e001290300370300200341a0036a209d016a22e40120e101290300370300200341a0036a20aa016a22e50120e201290300370300200320032903b0043703a00320034190026a20b3016a22e60120e30129030037030020034190026a209d016a22e70120e40129030037030020034190026a20aa016a22e80120e501290300370300200320032903a0033703900220d80128020022e901450d0120d8012f010421ea01200521eb010c270b20e30120e60129030037030020e40120e70129030037030020e50120e80129030037030020032003290390023703a00320ea0120bc0171210820e9012f0106220720bd014d0d0220b9011026220b450d1c200b208e013b0106200b208e01360200200b20aa016a200341c0056a20ba01109404210520e901209e016a280200212220dd0120e90120b4016a29020037030020de0120e90120b5016a29020037030020ab0120e90120b6016a290200370300200320e90120bf016a2902003703c005200520e901209f016a20e90120b0016a22202f0100220920b7016a2207209b0174109404218901200b20a1016a20e90120b8016a200720b20174109404218a01200b20ae016a20e90120c0016a200920c1016a220c209b0174109404210d202020b0013b0100200b20073b01060240200c450d0041002107200d210503402005280200220920073b01042009200b3602002005208f016a2105200c20072092016a2207470d000b0b20e00120dd0129030037030020e10120de0129030037030020e20120ab01290300370300200320032903c0053703b00420dd0120e00129030037030020de0120e10129030037030020ab0120e201290300370300200320032903b0043703c0050240024020ea0120bc0171220520b0014b0d0020e90120aa016a220720082092016a220c209b017422096a20072008209b0174220d6a220720202f010022890120086b228a01209b01741095041a200720df0136020020e90120a1016a2207200c20b201746a2007200820b201746a2207208a0120b201741095041a200720b3016a20e3012903003702002007209d016a20e401290300370200200720aa016a20e501290300370200200720032903a00337020020202089012092016a22073b010020e90120ae016a2220200d6a20aa016a202020096a2220200720bc01712209200c6b209b01741095041a202020eb01360200200520094f0d0120e901200d6a20be016a210703402007280200220520082092016a22083b0104200520e9013602002007208f016a210720092008470d000c020b0b208901200820c1016a2209209b017422206a208901200820b7016a2207209b01746a2205200b20b0016a220c2f010020076b209b01741095041a200520df01360200208a01200920b201746a208a01200720b201746a2205200c2f010020076b20b201741095041a200520b3016a20e3012903003702002005209d016a20e401290300370200200520aa016a20e501290300370200200520032903a003370200200c200c2f01002092016a22053b0100200d2008209b01742289016a20c2016a200d20206a220c200520bc0171220820096b209b01741095041a200c20eb01360200200920084b0d00200b2089016a20c3016a210503402005280200220920072092016a22073b01042009200b3602002005208f016a210520082007470d000b0b20e60120dd0129030037030020e70120de0129030037030020e80120ab01290300370300200320032903c00537039002024020e9012802002207450d0020e9012f010421ea01200721e901202221df01200b21eb01410221720c360b202221df0120b901102622070d010c1d0b2005210b20b90110262207450d1c0b2007208e013b01062007208e01360200200720aa016a200341c0056a20ba01109404210820072003280270220536029403200320032802742092016a3602742005208e013b01042003200736027020052007360200200720072f0106220920b201746a220520a6016a20e601290300370200200520bb016a20e701290300370200200520a3016a20e801290300370200200520a1016a20032903900237020020082009209b01746a20df01360200200720ae016a20092092016a2205209b01746a200b360200200720053b0106200b20053b0104200b200736020020d7010d440c1d0b20e90120aa016a220520082092016a2209209b0174220b6a20052008209b0174220c6a2205200720086b2220209b01741095041a200520df0136020020e90120a1016a2205200920b201746a2005200820b201746a2205202020b201741095041a200520b3016a20e3012903003702002005209d016a20e401290300370200200520aa016a20e501290300370200200520032903a00337020020e90120b0016a20072092016a22073b010020e90120ae016a2205200c6a20aa016a2005200b6a2205200720bc0171220b20096b209b01741095041a200520eb013602002008200b4f0d4220e901200920ac016a2207209b01746a20be016a210503402005280200220920072092016a22073b0104200920e9013602002005208f016a2105200b2007470d000c430b0b410121c701208b0121c801410421720c330b410221c901209101209701460d02200341186a20910110c5032091012096016a21910120032802182207450d032007228b012007200328021c209b01746a22c801460d22410521070c480b208b0120c801470d2b410121c701208b0121c801410621720c330b410221c901209101209701460d00200341106a20910110c5032091012096016a21910120032802102207450d0120072003280214209b01746a21c8012007218b010c210b2097012191010b208b0121d2012094010d240c470b208b0120c801470d25410821720c310b209101209701460d45200341206a20910110c5032003280220228b01450d452091012096016a219101208b012003280224209b01746a21c8010c1e0b20c402280200220b20ee016a2109200b2f0106220c20f001742105417f210702400240024003402005450d01200720f7016a210720f80120f50120f7012009280200220820c3024b1b200820c302461b2208450d03200520f9016a2105200920f4016a2109200820f701460d000b20c5020d010c090b200c210720c502450d080b20c50220f5016a21c502200b200720f001746a20f6016a21c402410921720c310b200b20fb016a200720fa01746a22c602450d0620c602280218210520c60228021c210720fc01200f36020020fd0120fe013a000020ff012080023a000020810220073602002082022083023a0000208402200f3602002085022086023a000020870220053602002088022089023a0000208a02208b023a0000208c0220f8013a0000208d02208e023b0100208f022090023a000020910220023602002092022083023a0000209302200f3602002094022086023a0000200341c0056a20fb016a22c702200f36020020950220fe013a00002097022098023a0000209a02200736020020ed012083023a00002003200f3602c40520032086023a00c00520c602280208220b20ec016a22c802ad220e209c0288a70d55200e209b0286a7220720f5014c0d5520c60220ee016a21c902024002400240024002402007450d002007102622ca02450d0f20c902280200220b450d020c010b410821ca02200b450d010b410021094100210703400240200720c802470d0020c80220f7016a220520c802490d5b20c80220f701742208200520052008491b2205ad209b0286220e209e0288a70d5b200ea7220820f801480d5b0240024020c802450d0020ca0220c80220f401742008102722ca020d010c0c0b2008102622ca02450d0b0b200521c8020b20ca0220096a2205209d023a0000200520f4016a2007360200200520c2026a200341a0036a20f0016a2d00003a0000200520f7016a20032f01a0033b0000200920ec016a2109200720f7016a22cb022107200b20cb02470d000b20c80220cb026b209d024f0d020c010b410021cb0220c80241006b209d024f0d010b20cb02209d026a220720cb02490d5720c80220f701742205200720072005491b2207ad209b0286220e209e0288a70d57200ea7220520f801480d570240024020c802450d0020ca0220c80220f401742005102722ca020d010c100b2005102622ca02450d0f0b200721c8020b20ca0220cb0220f401746a21cc02200341c0056a21cd020c1e0b20cb02210b024002400240024020cd022d00002205209f026a220820a0024b0d0002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020080e2f291c202d2d121d162d1b082d2d0b0a1a2417091319211f0f0e2526031807060d2214230211041e050100152827100c290b20cd022d00012109412b21050c2c0b20cd0241046a280200210720cd02350208210e412a21050c2a0b20cd0241046a280200210720cd02350208210e412521050c290b20cd0241046a280200210720cd02350208210e411d21050c280b20cd0241046a280200210720cd02350208210e412721050c270b20cd0241046a280200210720cd02350208210e412921050c260b20cd0241046a280200210720cd02350208210e412021050c250b20cd0241046a280200210720cd02350208210e411f21050c240b20cd0241046a280200210720cd022d00012109410c21050c240b20cd0241046a280200210720cd02350208210e411421050c220b20cd0241046a2802002107411021050c210b20cd0241046a2802002107410f21050c200b20cd02290308210e413021050c1e0b20cd0241046a280200210720cd02350208210e412121050c1e0b20cd0241046a280200210720cd02350208210e411a21050c1d0b20cd0241046a280200210720cd02350208210e411921050c1c0b20cd0241046a2802002107412f21050c1b0b20cd0241046a280200210720cd02350208210e412621050c1a0b20cd0241046a2802002107410721050c190b20cd0241046a280200210720cd02350208210e411521050c180b20cd0241046a280200210720cd02350208210e412321050c170b20cd022d00012109412c21050c170b20cd022802082209ad220e421e88a70d6b200e420286a72205417f4c0d6b4104210702402005450d00200510262207450d1e0b02402009450d0020cd0241046a28020021052009410274210820072109034020092005280200360200200941046a2109200541046a21052008417c6a22080d000b0b20cd02410c6a350200422086200e84210e410921050c150b20cd0241046a2802002107411321050c140b20cd0241046a280200210720cd02350208210e411e21050c130b20cd0241046a280200210720cd02350208210e411621050c120b20cd0241046a2802002107411121050c110b20cd0241046a2802002107410b21050c100b20cd022d00012109410321050c100b20cd0241046a2802002107410821050c0e0b20cd0241046a280200210720cd02350208210e412821050c0d0b20cd0241046a280200210720cd02350208210e411821050c0c0b20cd022d00012109410421050c0c0b20cd0241046a280200210720cd02350208210e411721050c0a0b20cd0241046a280200210720cd02350208210e412221050c090b20cd0241046a280200210720cd02350208210e412421050c080b20cd0241046a2802002107411221050c070b20cd0241046a280200210720cd02350208210e411b21050c060b20cd0241046a280200210720cd02350208210e411c21050c050b20cd02290308210e412e21050c030b20cd0241046a2802002107412d21050c030b20cd022d00012109410221050c030b0b0b0b20cc0220093a000120cc0220053a000020cc0220ee016a200e37030020cc0220f4016a2007360200200b20f7016a21cb0220cc0220ec016a21cc0220cd0220ec016a22cd0220f301470d1e024002400240024020c80220cb02470d0020c80220f7016a220720c802490d5920c80220f701742205200720072005491b220cad209b0286220e209e0288a70d59200ea7220720f801480d5920c802450d0120ca0220c80220f401742007102722ca020d020c110b20c802210c0c020b2007102622ca02450d0f0b20c80221cb020b20ca0220cb0220f401746a2207208b023a0000200720ee016a20a102290000370000200720032900b004370001200341b0046a20034180016a20a2021094041a20ec0110262205450d072005208b023a0000200341a0036a200341b0046a20a2021094041a20c902280200220720f5014c0d5420c6022802002120410121094101210802402007450d00200710262208450d0b0b200820202007109404210802400240024020070d00410021204101200820071094041a20070d010c020b200710262209450d0d200721202009200820071094041a2007450d010b200810230b200341b0046a200341a0036a20a2021094041a20c60231000d210e200341a0036a200341b0046a20a2021094041a200341b0046a200341a0036a20a2021094041a20034190026a200341b0046a20a2021094041a20ec0110262208450d08200b20f0016a210b20ce0220a3028322ce022007ad84200e20a502868420a60284210e2008208b023a000020081023200341a0036a20034190026a20a2021094041a200341b0046a200341a0036a20a2021094041a024020052d000020a702470d00200528020820a80271450d00200528020410230b2005102320034190026a200341b0046a20a2021094041a200341b0046a20034190026a20a2021094041a20a90220f80136020020ab02200b36020020ad02200c360200200341a0036a2096026a20ca0236020020ae0220f801360200200341a0036a2099026a209b0237020020af02200e370200200341a0036a20ee016a2020360200200320093602a403200320f7013602a003200341b0046a200341a0036a10cc0320034180016a200341b0046a20a2021094041a20c60220f70136021020c60220f201360214024020032d00c00520a702470d0020ef0128020020a80271450d0020032802c40510230b024020ed012d000020a702470d0020b00228020020a80271450d00209a0228020010230b02402097022d000020a702470d00200341c0056a20aa026a28020020a80271450d00200341c0056a20ac026a28020010230b02402095022d000020a702470d0020b10228020020a80271450d0020c70228020010230b02402094022d000020a702470d0020b20228020020a80271450d0020930228020010230b02402092022d000020a702470d0020b30228020020a80271450d0020910228020010230b0240208f022d000020a702470d0020b40228020020a80271450d0020b50228020010230b0240208d022d000020a702470d0020b60228020020a80271450d0020b70228020010230b0240208c022d000020a702470d0020b80228020020a80271450d0020b90228020010230b0240208a022d000020a702470d0020ba0228020020a80271450d0020bb0228020010230b02402088022d000020a702470d0020bc0228020020a80271450d0020870228020010230b02402085022d000020a702470d0020bd0228020020a80271450d0020840228020010230b02402082022d000020a702470d0020be0228020020a80271450d0020810228020010230b024020ff012d000020a702470d0020bf0228020020a80271450d0020c00228020010230b024020fd012d000020a702470d0020c10228020020a80271450d0020fc0128020010230b20ce0220a4028421ce0220f20120f7016a21f20120d00120f101470d140c440b20e10228020c0d3620e10228021021e302200341e0006a21e402200328026421e5020c330b20e702280200220b20d7026a2109200b2f0106220c20d502742105417f21070240024003402005450d01200720da026a210720db0220d80220da022009280200220820e6024b1b200820e602461b2208450d04200520dc026a2105200920d6026a2109200820da02460d000b20e8020d010c420b200c210720e802450d410b20e80220d8026a21e802200b200720d502746a20d9026a21e702410c21720c300b20e9022802182207450d3320e90228021022eb02200720d502746a21ec02410221070c320b200b20de026a200720dd02746a2207450d3e2007280210450d0d20d10220d6026a20072802143602000c3e0b20084108102a000b41c8e4c4004180011021000b20054104102a000b41104108102a000b41104108102a000b20074108102a000b20074101102a000b20074101102a000b20054108102a000b20074108102a000b4194034104102a000b41c4034104102a000b41c4034104102a000b41c8e5c40041351021000b410221200c020b410221200c020b410321200c020b410121070c3d0b410121070c3c0b410121070c3b0b410121720c0c0b410221720c0d0b410321720c0e0b410521720c0f0b410721720c100b410a21720c120b410a21720c120b410021070c200b410121070c1f0b410221070c1e0b410321070c1d0b410421070c1c0b410521070c1b0b410621070c1a0b410621070c190b410621070c180b410621070c170b410621070c160b410621070c150b410621070c140b410621070c130b410621070c120b410621070c110b410621070c100b410621070c0f0b410621070c0e0b410621070c0d0b410021070c010b410121070b0340024002400240024002400240024002400240024002400240024002400240024002400240024020070e03000102020b207620744f0d024101210720752802002076202d74220c6a22052d0000202a470d1120032005202d6a220536029002200a450d0302402010200528020022054d0d00200a2005202e746a2802002209450d12202f200f360200203020313a0000203220333a000020342009360200203520363a00002037200f360200203820393a0000203a2005360200203b202a3a0000203c203d3a0000203e203f3a0000204020413b0100204220433a000020442002360200204520363a00002046200f360200204720393a00002048200f360200204920313a0000204b204c3a0000200341c0056a20256a22772009360200204e20363a0000202920032f00b0043b00002029202e6a200341b0046a202e6a2d00003a0000200320393a00c0052003200f3602c40520732802002278207620286a2279490d052073207636020020752802002107200341b0046a202b6a227a2027360200200341b0046a204d6a227b207536020020502007200c6a2208204d6a220b360200200320793602b004200341b0046a202c6a227c20072079202d74227d6a22203602002026200341c0056a3602002003207820796b227e3602b404200b2107024002400240024020082d000022092051460d00410021070340200820076a210502402009206c712052470d002005204f6a280200205371450d002005202d6a28020010230b2007450d0220502005204a6a3602002007204d6a21072005204d6a2d000022092051470d000b200820076a204d6a21070b20072020470d010c020b2005204d6a22072020460d010b0340205020072205204d6a22073602000240024020052d000022092052460d0020092051470d010c030b2005204f6a280200205371450d002005202d6a28020010230b200b2007470d000b0b02400240207e450d00207920702802142207470d012027227f200341c0056a2280016b202d762281010d0b0c100b2075202610e70320502802002207207c280200220b470d110c120b200c2007202d7422076b218201207528020020076a218301200341c0056a2284012027460d0741002185010c0b0b200341c0056a20256a20283602002003206d3602a403204e200341a0036a3602002003206e3702c4052003206f3602c005200320034190026a3602a003200341b0046a200341c0056a10a20120032802b0042207450d1c20032902b404210e0c280b20e402280200220b20d7026a2109200b2f0106220c20d502742105417f210702400240024003402005450d01200720da026a210720db0220d80220da022009280200220820e3024b1b200820e302461b2208450d03200520dc026a2105200920d6026a2109200820da02460d000b20e5020d010c160b200c210720e502450d150b20e50220d8026a21e502200b200720d502746a20d9026a21e402410121070c120b200b20de026a200720dd02746a2207450d132007280210450d0420e10220cf026a20072802143602000c130b20eb0222ed0220d6026a21eb0220ed0228020021ee02200341e0006a21ef02200328026421f0020c050b4188dfc400207620741029000b41c6ddc40041cc001021000b41cce3c400104f000b41c8e5c40041351021000b41012185010c020b41042185010c030b410021070c030b410121070c020b410121070c010b410121070b034002400240024002400240024002400240024002400240024020070e020001010b02400240024002400240207b280200228601202d6a2205280200220720786b2081014f0d0020782081016a22092078490d362007202874220b20092009200b491b2209ad206886220e206988a70d36200ea7220b203f480d362007450d012086012802002007202d74200b102722070d020c040b20860128020021070c020b200b10262207450d020b2086012007360200200520093602000b200720792081016a2205202d746a2007207d6a207e202d741095041a200320053602b00420052086012802082207460d0d20762081016a202d742007202d7422076b21870120860128020020076a218801208001207f470d030c020b200b4108102a000b024002400240024002400240024002402085010e050001030406060b2026208401204d6a3602000c010b41002184010b200341a0036a20840110e80320032d00a0032051460d1120830120032903a003370300208301204f6a200341a0036a204f6a2903003703002073207328020020286a3602000240208201450d00208301204d6a218301208201206b6a2182012026280200228401207a280200470d0541012185010c090b207a280200227f20262802002280016b202d76228101450d10410021070c0f0b2026208001204d6a3602000c010b41002180010b200341a0036a20800110e80320032d00a0032051460d0e20880120032903a003370300208801204f6a200341a0036a204f6a290300370300208601204f6a2207200728020020286a360200208701450d0d208801204d6a218801208701206b6a2187012026280200228001207a280200227f460d0441022185010c0a0b20ef02280200220b20d7026a2109200b2f0106220c20d502742105417f210702400240024002400240024003402005450d01200720da026a210720db0220d80220da022009280200220820ee024b1b200820ee02461b2208450d03200520dc026a2105200920d6026a2109200820da02460d000b20f0020d010c030b200c210720f002450d020b20f00220d8026a21f002200b200720d502746a20d9026a21ef0241042185010c0e0b200b20de026a200720dd02746a2207450d002007280210450d0120ed0220072802143602000b20eb0220ec02470d010c140b41c8e5c40041351021000b410221070c110b41002185010c040b41032185010c040b41022185010c040b41032185010c040b410121070c060b410121070c050b410121070c040b410121070c030b410121070c020b410121070c010b410121070c000b0b200341a0036a204f6a2207203f360200200320673703a003200341a0036a202610e70320032802a003222220072802002205202d7422086a210b20032802a403218901202221070240024002400240024002402005450d000240024002400240207b280200220d202d6a2274280200220720032802b404220c20032802b00422056a22206b2008202d7522094f0d00202020096a228a012020490d2e20072028742220208a01208a012020491b2220ad206886220e206988a70d2e200ea7228a01203f480d2e2007450d01200d2802002007202d74208a01102722070d020c050b200d28020021070c020b208a0110262207450d030b200d2007360200207420203602000b2007200520096a2209202d7422206a20072005202d746a200c202d741095041a200320093602b004202221072009200d2802082205460d00200d280200220720206a217420072005202d746a21092022210503402008450d04200341a0036a202e6a22072005206a6a2d00003a0000200320052f00013b01a00320052d0000220c2051460d032005202d6a290200210e2005202c6a28020021202009200c3a00002009202c6a20203602002009202d6a200e37020020032f01a003210c2009206a6a20072d00003a0000200920286a200c3b0000200d204f6a2207200728020020286a3602002008206b6a21082005204d6a220721052009204d6a22092074470d000b0b2007200b460d040c030b208a014108102a000b2005204d6a2207200b470d010c020b200b2207200b460d010b03400240024020072d000022052052460d0020052051470d010c030b2007204f6a280200205371450d002007202d6a28020010230b2007204d6a2207200b470d000b0b208901450d00202210230b20502802002207207c280200220b460d010b0340205020072205204d6a22073602000240024020052d000022092052460d0020092051470d010c030b2005204f6a280200205371450d002005202d6a28020010230b200b2007470d000b0b024020032802b4042207450d00024020032802b004220b207b2802002208204f6a22092802002205460d00200828020022082005202d746a2008200b202d746a2007202d741095041a0b2009200720056a3602000b024020032d00c0052052470d00200341c0056a204f6a280200205371450d0020032802c40510230b0240204e2d00002052470d00200341c0056a202b6a280200205371450d00207728020010230b0240204b2d00002052470d002054280200205371450d00205528020010230b024020492d00002052470d002056280200205371450d00204828020010230b024020472d00002052470d002057280200205371450d00204628020010230b024020452d00002052470d002058280200205371450d00204428020010230b024020422d00002052470d002059280200205371450d00205a28020010230b024020402d00002052470d00205b280200205371450d00205c28020010230b0240203e2d00002052470d00205d280200205371450d00205e28020010230b0240203c2d00002052470d00205f280200205371450d00206028020010230b0240203b2d00002052470d002061280200205371450d00203a28020010230b024020382d00002052470d002062280200205371450d00203728020010230b024020352d00002052470d002063280200205371450d00203428020010230b024020322d00002052470d002064280200205371450d00206528020010230b024020302d00002052470d002066280200205371450d00202f28020010230b410f21070b200720766a2276207328020022744f0d0a410021070c000b0b20e90220d4026a22e90220ea02460d0b410d2172410621070c090b20e10220e0026a22e10220e202460d0a410b2172410621070c080b20d701450d010b20d601450d0120d1011023410221200c020b410221200c020b410221200c020b410121070c160b410121070c150b410121070c140b2070202b6a22702071460d0d41002172410621070c000b0b41c6ddc40041cc001021000b20d10220d0026a22d10220d202460d0241042120410121070c100b200341e0006a41086a200341f0006a41086a28020036020020032003290370370360208c01412c6c2107208d0141586a210502400340410021092007450d01200741546a2107200541286a210b2005412c6a22082105200b2d00004103470d000b200841086a2802002207450d00200741286c2105200828020041186a2107410021090340200920072d0000456a2109200741286a2107200541586a22050d000b0b208c01412c6c2107208d0141606a21050240024003402007450d01200741546a2107200541206a210b2005412c6a22082105200b2d00004104470d000b200828020021070c010b410021070b411021ec01200341c0056a41106a22ed01200341c8006a41106a280200360200410821ee01200341c0056a41086a22ef01200341c8006a41086a290300370300200320032903483703c00520034180016a200341c0056a10c70320cb01450d00410221f00120d00120cb014102746a21f101200720096a21f201200341b0076a21f301410421f401417f21f50141940321f601410121f701410021f801417c21f901410521fa01413421fb01200341a4076a21fc01200341a0076a21fd01411321fe0120034190076a21ff0141d70021800220034184076a21810220034180076a218202412d218302200341f4066a218402200341f0066a2185024112218602200341e4066a218702200341e0066a218802410b218902200341d0066a218a024106218b02200341c0066a218c02200341b0066a218d02418408218e02200341a0066a218f02413721900220034194066a21910220034190066a21920220034184066a21930220034180066a219402200341f0056a2195024120219602200341c0056a41206a21970241d6002198024114219902200341c0056a41146a219a024204219b02421c219c02410f219d024220219e02417e219f02412e21a002200341b7046a21a102418c0121a202428080808080804021a3024280808080808c0121a402422821a5024280808080800c21a602410921a70241ffffffff0321a802200341cc036a21a902412821aa02200341a0036a41286a21ab02412421ac02200341a0036a41246a21ad02200341bc036a21ae02200341ac036a21af02200341d8056a21b002200341f8056a21b10220034188066a21b20220034198066a21b302200341a8066a21b402200341a4066a21b502200341b8066a21b602200341b4066a21b702200341c8066a21b802200341c4066a21b902200341d8066a21ba02200341d4066a21bb02200341e8066a21bc02200341f8066a21bd0220034188076a21be0220034198076a21bf0220034194076a21c002200341a8076a21c102410321c2020c020b024020cc01450d0020cf0110230b200341c0056a20034180016a418c011094041a200341b0046a200341c0056a10c903411021cf02200341b0046a41106a2802002207450d00412c21d00220032802b80422d1022007412c6c6a21d202410a21d302411c21d402410221d502410421d602410821d702417f21d80241940321d902410121da02410021db02417c21dc02410521dd02413421de02410921df02411421e002410421200c020b200341bc046a290200210e20032802b004210720032902b404216920032802602003280264200328026810e603200020cf026a200e370200200041086a20693702002000200736020420004100360200200a450d062010450d06200a1023200424000f0b41032120410121070c0c0b410121070c0b0b42ac808080c005210e0b200a10230b4100210a0b2000200736020420004101360200200041086a200e3702000240200a450d002010450d00200a10230b200141086a280200218b010240200141106a2802002203450d002003412c6c2107208b01210303402003109f012003412c6a2103200741546a22070d000b0b2001410c6a280200450d00208b0110230b200424000f0b202120236a22212024470d010b200341c8006a41106a2207200141106a280200360200200341c8006a41086a228b01200141086a290200370300200320012902003703482007280200228c0120236c2107208b01280200228d0141586a218b010240024003402007450d01200741546a2107208b0141286a2105208b0120236a228e01218b0120052d00004108470d000b200341386a208e0110be0320032802382105200328023c21070c010b410021050b2007410020051b218f01208c01412c6c2107208d0141586a218b01200541a886c50020051b2190010240024003402007450d01200741546a2107208b0141286a2105208b01412c6a228e01218b0120052d0000410a470d000b200341306a208e0110be0320032802302105200328023421070c010b410021050b2007410020051b2109208c01412c6c2107208d0141586a218b01200541a886c50020051b2191010240024003404100218e012007450d01200741546a2107208b0141286a2105208b01412c6a229201218b0120052d00004109470d000b20920128020021930141012194010c010b41002194010b2003420037027441f098c400219501200341f098c400360270411c2196012091012009411c6c6a2197014114219801209001208f0141146c6a2199014104218f0141ff01219a0141012192014102219b0141cf00219c014110219d014120219e014124219f01412821a001413421a101413821a201413c21a30141d00021a40141c80021a50141cc0021a601420221a701422021a801200341cc056a21a901410821aa01200341c0056a41086a21ab01417f21ac01410d21ad0141940321ae01418c0321af01410621b001410b21b101410521b201411821b301418c0221b40141840221b50141fc0121b601417921b70141940221b80141c40321b90141bc0321ba0141c40021bb0141ffff0321bc01410a21bd0141980321be0141f40121bf0141b00321c001417a21c101416c21c20141fc0221c301417c21c40142808080807021c50142ffffffff0f21c601410021c701410021c801410021c901410021ca01410021cb01410021cc01410421cd01410421ce01410421cf01410421d0010c010b410121200c010b410221200c010b410121070c010b410121070c000b0b101d000b101e000bda0502047f017e230041d0006b2203240002400240024002400240024002400240200241086a2802002204417f6a220520044f0d00200520044b0d002002280200220620054103746a2d000522054104460d02200341386a20012002200510d00320032d00384101470d012000200329023c370200200041086a200341c4006a280200360200200341d0006a24000f0b411810262202450d05200241106a41002900b6db44370000200241086a41002900aedb44370000200241002900a6db4437000020034298808080800337022420032002360220200341cc006a41013602002003412a3602142003420137023c200341e8d5c4003602382003200341206a3602102003200341106a3602482000200341386a10a2012003280224450d0320032802201023200341d0006a24000f0b200241086a2802002204450d01200228020021060b200241086a2004417f6a2202360200200620024103746a290200220742808080808080c0ff0083428080808080808001520d020b411810262202450d03200241106a41002900b6db44370000200241086a41002900aedb44370000200241002900a6db4437000020034298808080800337022420032002360220200341cc006a41013602002003412a3602142003420137023c200341e8d5c4003602382003200341206a3602102003200341106a3602482000200341386a10a2012003280224450d00200328022010230b200341d0006a24000f0b200141086a280200210220032007370308024020022007a7470d0020004100360200200341d0006a24000f0b2003412c6a4102360200200341cc006a410236020020034102360224200320023602342003420237023c200341c8d4c4003602382003200341086a3602282003200341346a3602202003200341206a360248200341106a200341386a10a201200041086a200341106a41086a28020036020020002003290310370200200341d0006a24000f0b41184101102a000b41184101102a000bc90301017f230041d0006b22052400200520023602082005200336020c0240417f41012002411f71742002411f4b1b20034d0d002005412c6a4102360200200541cc006a4102360200200541023602242005420337023c200541a4d2c40036023820052005410c6a3602282005200541086a3602202005200541206a360248200541106a200541386a10a201200041086a200541106a41086a28020036020020002005290310370200200541d0006a24000f0b2001280200210220054100360234024020022802080d00200541cc006a4101360200200541023602142005420237023c200541b8d9c4003602382005200541346a3602102005200541106a360248200541206a200541386a10a20120052802202202450d002000200529022437020420002002360200200541d0006a24000f0b200541386a200141186a2202200141286a2203200410d003024020052d00384101470d002000200529023c370200200041086a200541c4006a280200360200200541d0006a24000f0b200541386a20022003410010d003024020052d00384101470d002000200529023c370200200041086a200541c4006a280200360200200541d0006a24000f0b20004100360200200541d0006a24000bc00601037f230041d0006b22042400200420033a000f024002400240024020022802082205417f6a220620054f0d00200620054b0d00200141086a2802002105200228020020064103746a22062802002102024020062d0006450d0020052002460d040b02400240200520024d0d00200141086a2005417f6a2202360200200128020020026a2d000022024104460d0520024105470d01411810262202450d04200241106a41002900b6db44370000200241086a41002900aedb44370000200241002900a6db4437000020044298808080800337022420042002360220200441c4006a41013602002004412a36024c20044201370234200441e8d5c4003602302004200441206a3602482004200441c8006a360240200441106a200441306a10a20102402004280224450d00200428022010230b200041013a0000200041046a20042903103702002000410c6a200441106a41086a280200360200200441d0006a24000f0b412b10262202450d02200041013a0000200241276a41002800a2d544360000200241206a410029009bd544370000200241186a4100290093d544370000200241106a410029008bd544370000200241086a4100290083d544370000200241002900fbd444370000200041086a42ab808080b005370200200041046a2002360200200441d0006a24000f0b0240200341ff017122054104460d0020022005460d00200420023a0048200441206a410c6a412b360200200441c4006a41023602002004412b36022420044202370234200441a8d5c4003602302004200441c8006a36022820042004410f6a3602202004200441206a360240200441106a200441306a10a201200041013a00002000410c6a200441186a280200360200200041046a2004290310370200200441d0006a24000f0b200041003a0000200020023a0001200441d0006a24000f0b02404118102622020d0041184101102a000b2004421837023420042002360230200441306a4100411810db0320042004280238220241186a3602382002200428023022056a411841a6dbc400411810dc0320042004290234370234200420053602304184d1c4004134200441306a10dd03000b412b4101102a000b41184101102a000b20004180083b0100200441d0006a24000ba10601037f230041d0006b22052400200520023602082005200336020c0240417f41012002411f71742002411f4b1b20034d0d002005411c6a4102360200200541cc006a4102360200200541023602142005420337023c200541a4d2c40036023820052005410c6a3602182005200541086a3602102005200541106a360248200541206a200541386a10a201200041086a200541206a41086a28020036020020002005290320370200200541d0006a24000f0b200541386a200141186a2203200141286a410010d003024020052d00384101470d002000200529023c370200200041086a200541c4006a280200360200200541d0006a24000f0b2001280200210220054100360220024020022802080d00200541cc006a4101360200200541023602342005420237023c200541b8d9c4003602382005200541206a3602302005200541306a360248200541106a200541386a10a20120052802102202450d002000200529021437020420002002360200200541d0006a24000f0b0240024002400240024002400240200141206a2802002202200141246a22062802004f0d0020022001411c6a280200470d03200241016a22062002490d0520024101742207200620062007491b22064100480d052002450d01200328020020022006102722020d020c060b200541cc006a2202410136020020054102360234200520063602302005420137023c200541a0dcc4003602382005200541306a360248200541106a200541386a10a20120052802102201450d032005200529021437021420052001360210200241013602002005412a3602342005420137023c200541e8d5c4003602382005200541106a3602302005200541306a360248200541206a200541386a10a20102402005280214450d00200528021010230b20052802202202450d032000200529022437020420002002360200200541d0006a24000f0b200610262202450d040b2001411c6a2006360200200141186a2002360200200141206a28020021020b200141186a28020020026a20043a0000200141206a2202200228020041016a3602000b20004100360200200541d0006a24000f0b101e000b20064101102a000bb80401047f230041c0006b22032400200341286a200141186a2204200141286a2205200210d003024020032d00284101470d002000200329022c370200200041086a200341346a280200360200200341c0006a24000f0b200341286a20042005200210d003024020032d00284101470d002000200329022c370200200041086a200341346a280200360200200341c0006a24000f0b0240024002400240024002400240200141206a2802002202200141246a22052802004f0d0020022001411c6a280200470d03200241016a22052002490d0520024101742206200520052006491b22054100480d052002450d01200428020020022005102722020d020c060b2003413c6a2201410136020020034102360214200320053602102003420137022c200341a0dcc4003602282003200341106a360238200341186a200341286a10a20120032802182202450d032003200329021c37021c20032002360218200141013602002003412a3602142003420137022c200341e8d5c4003602282003200341186a3602102003200341106a3602382003200341286a10a2010240200328021c450d00200328021810230b20032802002201450d032000200329020437020420002001360200200341c0006a24000f0b200510262202450d040b2001411c6a2005360200200141186a2002360200200141206a28020021020b200141186a28020020026a41003a0000200141206a2201200128020041016a3602000b20004100360200200341c0006a24000f0b101e000b20054101102a000bf70301047f230041c0006b22032400200341286a200141186a2204200141286a200210d003024020032d00284101470d002000200329022c370200200041086a200341346a280200360200200341c0006a24000f0b0240024002400240024002400240200141206a2802002202200141246a22052802004f0d0020022001411c6a280200470d05200241016a22052002490d0320024101742206200520052006491b22054100480d032002450d0120042802002002200510272202450d020c040b2003413c6a2201410136020020034102360214200320053602102003420137022c200341a0dcc4003602282003200341106a360238200341186a200341286a10a20120032802182202450d052003200329021c37021c20032002360218200141013602002003412a3602142003420137022c200341e8d5c4003602282003200341186a3602102003200341106a3602382003200341286a10a2010240200328021c450d00200328021810230b20032802002201450d052000200329020437020420002001360200200341c0006a24000f0b2005102622020d020b20054101102a000b101e000b2001411c6a2005360200200141186a2002360200200141206a28020021020b200141186a28020020026a41003a0000200141206a2201200128020041016a3602000b20004100360200200341c0006a24000bb80401057f230041c0006b22032400200341286a200141186a2204200141286a2205200210d003024020032d00284101470d002000200329022c370200200041086a200341346a280200360200200341c0006a24000f0b200341286a20042005200210d003024020032d00284101470d002000200329022c370200200041086a200341346a280200360200200341c0006a24000f0b0240024002400240024002400240200141206a2802002205200141246a22062802004f0d0020052001411c6a280200470d03200541016a22062005490d0520054101742207200620062007491b22064100480d052005450d01200428020020052006102722040d020c060b2003413c6a2201410136020020034102360214200320063602102003420137022c200341a0dcc4003602282003200341106a360238200341186a200341286a10a20120032802182202450d032003200329021c37021c20032002360218200141013602002003412a3602142003420137022c200341e8d5c4003602282003200341186a3602102003200341106a3602382003200341286a10a2010240200328021c450d00200328021810230b20032802002201450d032000200329020437020420002001360200200341c0006a24000f0b200610262204450d040b2001411c6a2006360200200141186a2004360200200141206a28020021050b200141186a28020020056a20023a0000200141206a2201200128020041016a3602000b20004100360200200341c0006a24000f0b101e000b20064101102a000bc10301057f230041c0006b220324002003200236020002402001280204220420024d0d00200041003a00002000200128020020026a2d00003a0001200341c0006a24000f0b2001280208417c6a21052001410c6a28020041037421010240024003402001450d012004200541046a2802006a22062004490d02200141786a2101200541086a2105200420024b21072006210420070d0020062104200620024d0d000b20052d00002104200041003a0000200020043a0001200341c0006a24000f0b20032004360204200341306a410c6a41023602002003412c6a4102360200200341023602342003420337021c200341f0dcc4003602182003200341046a360238200320033602302003200341306a360228200341086a200341186a10a201200041013a00002000410c6a200341106a280200360200200041046a2003290308370200200341c0006a24000f0b0240412010262204450d00200041013a0000200441186a41002900e8dc44370000200441106a41002900e0dc44370000200441086a41002900d8dc44370000200441002900d0dc44370000200041086a42a08080808004370200200041046a2004360200200341c0006a24000f0b41204101102a000bf70301057f230041c0006b22032400200341286a200141186a2204200141286a200210d003024020032d00284101470d002000200329022c370200200041086a200341346a280200360200200341c0006a24000f0b0240024002400240024002400240200141206a2802002205200141246a22062802004f0d0020052001411c6a280200470d05200541016a22062005490d0320054101742207200620062007491b22064100480d032005450d0120042802002005200610272205450d020c040b2003413c6a2201410136020020034102360214200320063602102003420137022c200341a0dcc4003602282003200341106a360238200341186a200341286a10a20120032802182202450d052003200329021c37021c20032002360218200141013602002003412a3602142003420137022c200341e8d5c4003602282003200341186a3602102003200341106a3602382003200341286a10a2010240200328021c450d00200328021810230b20032802002201450d052000200329020437020420002001360200200341c0006a24000f0b2006102622050d020b20064101102a000b101e000b2001411c6a2006360200200141186a2005360200200141206a28020021050b200141186a28020020056a20023a0000200141206a2201200128020041016a3602000b20004100360200200341c0006a24000bf70301047f230041c0006b22042400200441286a200141186a2205200141286a200210d003024020042d00284101470d002000200429022c370200200041086a200441346a280200360200200441c0006a24000f0b0240024002400240024002400240200141206a2802002202200141246a22062802004f0d0020022001411c6a280200470d05200241016a22062002490d0320024101742207200620062007491b22064100480d032002450d0120052802002002200610272202450d020c040b2004413c6a2201410136020020044102360214200420063602102004420137022c200441a0dcc4003602282004200441106a360238200441186a200441286a10a20120042802182202450d052004200429021c37021c20042002360218200141013602002004412a3602142004420137022c200441e8d5c4003602282004200441186a3602102004200441106a3602382004200441286a10a2010240200428021c450d00200428021810230b20042802002201450d052000200429020437020420002001360200200441c0006a24000f0b2006102622020d020b20064101102a000b101e000b2001411c6a2006360200200141186a2002360200200141206a28020021020b200141186a28020020026a20033a0000200141206a2201200128020041016a3602000b20004100360200200441c0006a24000bad0201027f230041106b220224000240024020002d00004104470d00200128021841d0f6c40041082001411c6a28020028020c11020021010c010b2002200128021841bbf6c40041052001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200036020c20022002410c6a41c0f6c40010de031a20022d0008210120022802042203450d00200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000b200241106a2400200141ff01714100470b6501017f230041206b2202240020024128360204200220003602002001411c6a2802002100200128021821012002411c6a41013602002002420137020c200241ccb0c5003602082002200236021820012000200241086a10e2032101200241206a240020010bad0201027f230041106b220224000240024020002d00004104470d00200128021841a4d3c40041032001411c6a28020028020c11020021010c010b2002200128021841a7d3c40041082001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200036020c20022002410c6a41b0d3c40010de031a20022d0008210120022802042203450d00200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000b200241106a2400200141ff01714100470b810101017f0240200041046a280200220320016b20024f0d0002400240200120026a22022001490d0020034101742201200220022001491b22014100480d00024002402003450d0020002802002003200110272202450d010c030b2001102622020d020b20014101102a000b101e000b20002002360200200041046a20013602000b0bea0101017f230041e0006b22042400200420013602082004200336020c024020012003470d002000200220011094041a200441e0006a24000f0b2004200441086a36024020042004410c6a360244200441c8006a41146a4100360200200441286a41146a4103360200200441346a4104360200200441106a41146a4103360200200441a886c5003602582004420137024c200441a881c5003602482004410436022c20044203370214200441d480c5003602102004200441c8006a3602382004200441c4006a3602302004200441c0006a3602282004200441286a360220200441106a41e481c5001061000b6c01017f230041306b2203240020032001360204200320003602002003412c6a412d3602002003411c6a410236020020032002360228200341013602242003420237020c2003419083c500360208200320033602202003200341206a360218200341086a41a083c5001061000bf10202047f057e230041d0006b2203240041012104024020002d00080d00200028020421050240200028020022062d00004104710d004101210420062802184184b1c50041a2b1c50020051b4102410120051b2006411c6a28020028020c1102000d0120012000280200200228020c11030021040c010b024020050d0041012104200628021841a0b1c50041022006411c6a28020028020c1102000d01200028020021060b41012104200341013a00102006290210210720062902082108200341346a220541e8b0c50036020020032006290218370308200629022021092006290228210a200320062d00303a00482006290200210b20032008370320200320073703282003200a370340200320093703382003200b3703182003200341086a3602302001200341186a200228020c1103000d00200341306a2802004182b1c5004102200528020028020c11020021040b200041086a20043a00002000200028020441016a360204200341d0006a240020000b820201027f230041106b220224002002200128021841a8b1c50041052001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200036020c20022002410c6a41c0dcc40010de031a20022d00082101024020022802042203450d00200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000b200241106a2400200141ff01714100470b160020002802002200280200200028020820011099010b110020012000280200200028020810b3010b9a09010a7f230041c0006b22032400200341246a2001360200200341346a200241146a2802002204360200200341033a00382003412c6a2002280210220520044103746a360200200342808080808004370308200320003602204100210620034100360218200341003602102003200536023020032005360228024002400240024020022802082207450d0020022802002108200228020422092002410c6a2802002205200520094b1b220a450d01200020082802002008280204200128020c1102000d02200841086a2105200341386a2101200341346a210b200341306a210c41012106024003402001200741206a2d00003a00002003200741086a28020036020c20032007410c6a2802003602084100210202400240024002400240200741186a28020022004101460d00024020004102460d0020004103460d052007411c6a28020021040c020b200341086a41206a22042802002200200341086a41246a280200460d022004200041086a3602002000280204412e470d04200028020028020021040c010b2007411c6a2802002200200b28020022044f0d02200c28020020004103746a2200280204412e470d03200028020028020021040b410121020c020b0c010b41e88bc500200020041029000b200341086a410c6a2004360200200341086a41086a20023602004100210202400240024002400240200741106a28020022004101460d00024020004102460d0020004103460d05200741146a28020021040c020b200341086a41206a22042802002200200341086a41246a280200460d022004200041086a3602002000280204412e470d04200028020028020021040c010b200741146a2802002200200b28020022044f0d02200c28020020004103746a2200280204412e470d03200028020028020021040b410121020c020b0c010b41e88bc500200020041029000b200341086a41146a2004360200200341086a41106a200236020002400240024020072802004101470d00200741046a2802002202200b28020022044f0d02200c28020020024103746a21020c010b200341086a41206a22042802002202200341086a41246a280200460d032004200241086a3602000b2002280200200341086a200241046a2802001103000d052006200a4f0d04200541046a210220052802002104200541086a2105200741246a2107200641016a2106200341086a41186a28020020042002280200200341086a411c6a28020028020c110200450d010c050b0b41f88bc500200220041029000b41b88ac500104f000b20022802002108200228020422092004200420094b1b220a450d00200020082802002008280204200128020c1102000d01200841086a2107200341206a2100200341246a21014101210603402005280200200341086a200541046a2802001103000d022006200a4f0d01200741046a210220072802002104200541086a2105200741086a2107200641016a2106200028020020042002280200200128020028020c110200450d000c020b0b200920064d0d01200341206a280200200820064103746a22072802002007280204200341246a28020028020c110200450d010b200341c0006a240041010f0b200341c0006a240041000bdb39030e7f017e017f230041c0006b220324002002280208220441586a2105200241106a2802002206412c6c210702400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024003402007450d01200741546a2107200541286a21082005412c6a2209210520082d00004104470d000b2006412c6c2107200441586a210503402007450d02200741546a2107200541286a21082005412c6a220a210520082d0000410b470d000b2006412c6c2107200441586a210503402007450d03200741546a2107200541286a21082005412c6a2204210520082d00004102470d000b200341106a200910be03200328021420014d0d03200328021020014102746a2207450d03200341086a200410be03200328020c200728020022074d0d04200328020820074104746a2207450d04200a41086a28020020014d0d05200a2802002109200341186a41086a420037030020034280808080c00037031820072d000d2108200341306a41026a220a2003412d6a41026a2d00003a0000200320032f002d3b0130411010262207450d3f200341206a220b4101360200200341186a410c6a220528020021062003200736021c200720064104746a220741003a000c2007410036020820072008410447220c3602042007200c360200200720032f01303b000d2007410f6a200a2d00003a00002005200528020041016a3602004100210802402009200141186c6a22072802142205450d002007410c6a2106200741146a210a200341306a410472210d4100210841002107034002402003280218220920084d0d00200341306a200341186a410010e90320032802304101460d0920082003280218220920032802342d000c1b2108200a28020021050b200720054f0d3e02400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402006280200220120074104746a2d0000220541ab014b0d00024020050eac01141e0707071e13120c181915110e0d0b17160f1004040404040404040404040404040505050505050505050a1a06060606080000000000000000000008000000000000000000000000000000000000000000000303030101010101010101010101010101010303030101010101010101010101010101010303030303030301010101010101030303030303030101010101010102020202020202020202020202020202020202020202020202140b200341306a200341186a410210ea0320032802300d2a2003280218220541016a22092005490d2b20032009360218200741016a2207200a2802002205490d1f0c200b200341306a200341186a410210ea0320032802300d272003280218220541016a22092005490d2820032009360218200741016a2207200a2802002205490d1e0c1f0b200341306a200341186a410110ea0320032802300d2a2003280218220541016a22092005490d2b20032009360218200741016a2207200a2802002205490d1d0c1e0b200341306a200341186a410110ea0320032802300d2b2003280218220541016a22092005490d2c20032009360218200741016a2207200a2802002205490d1c0c1d0b200341306a200341186a410110ea0320032802300d2c2003280218220541016a22092005490d2d20032009360218200741016a2207200a2802002205490d1b0c1c0b200341306a200341186a410210ea032003280230450d180c2f0b200941016a22052009490d2f20032005360218200741016a2207200a2802002205490d190c1a0b200120074104746a2d0001210e200341306a41026a2003412d6a41026a2d00003a0000200320032f002d3b0130200341246a2802002201200341206a280200470d01200141016a220f2001490d5b20014101742210200f200f2010491b2210ad4204862211422088a70d5b2011a722124100480d5b2001450d13200328021c200141047420121027220f0d140c5c0b200341306a200341186a410110ea0320032802300d2e2003280218220541016a22092005490d3020032009360218200741016a2207200a2802002205490d170c180b200328021c210f0c130b200941016a22052009490d3d20032005360218200741016a2207200a2802002205490d150c160b200941016a22052009490d3720032005360218200741016a2207200a2802002205490d140c150b200341306a200341186a200120074104746a41046a28020010e90320032802304101460d2f200341306a200341186a2003280234280204220510ea0320032802300d41200341306a200341186a410110ea0320032802300d4a2003280218220920056a22052009490d4b20032005360218200741016a2207200a2802002205490d130c140b200341306a200341186a410210ea0320032802300d34200341306a200341186a410110ea0320032802300d3e2003280218220541016a22092005490d4820032009360218200741016a2207200a2802002205490d120c130b200341306a200341186a410110ea032003280230450d0f0c300b200941016a22052009490d3720032005360218200741016a2207200a2802002205490d100c110b200341306a200341186a410110ea032003280230450d0d0c2f0b2003200410be032003280204200120074104746a41046a28020022054d0d2b2003280200220920054104746a2201450d2b200341306a200341186a200920054104746a28020810ea0320032802300d3b2003280218220520012d000d4104476a22092005490d4320032009360218200741016a2207200a2802002205490d0e0c0f0b200341306a200341186a200120074104746a41046a28020010e90320032802304101460d32200341306a200341186a200328023428020410ea0320032802300d38200341246a2802002205417f6a220920054f0d41200920054b0d41200328021c20094104746a41013a000c200741016a2207200a2802002205490d0d0c0e0b200341246a22052802002209450d2420052009417f6a2209360200200328021c20094104746a22052d000c4102460d2420052802002109200320052802082205360218200520096a22092005490d3f20032009360218200741016a2207200a2802002205490d0c0c0d0b200341246a2802002205417f6a220920054f0d31200920054b0d31200328021c20094104746a41013a000c200741016a2207200a2802002205490d0b0c0c0b200341306a200120074104746a41046a280200200210e50320032802304101460d25200341306a200341186a2003280234220528020810ea0320032802300d392003280218220920052d000d4104476a22052009490d3c20032005360218200741016a2207200a2802002205490d0a0c0b0b200341306a200341186a410110ea0320032802300d2d2003280218220541016a22092005490d3920032009360218200741016a2207200a2802002205490d090c0a0b200341306a200341186a410110ea032003280230450d060c290b200341306a200341186a200120074104746a2209410c6a28020010e90320032802304101460d2120032802342802042101200941086a2802004102742105200941046a280200210903402005450d07200341306a200341186a200928020010e90320032802304101460d1b2005417c6a2105200941046a210920032802342802042001460d000c1c0b0b200341306a200341186a200c10ea0320032802300d24200341246a2802002205417f6a220920054f0d30200920054b0d30200328021c20094104746a41013a000c200741016a2207200a2802002205490d060c070b200341306a200341186a410110ea0320032802300d2e2003280218220541016a22092005490d3620032009360218200741016a2207200a2802002205490d050c060b20121026220f450d480b200341206a20103602002003200f36021c200341246a28020021010b200f20014104746a220141003a000c2001200936020820012005410347200e41044722057136020420012005360200200120032f01303b000d2001410f6a200341326a2d00003a0000200341246a2205200528020041016a3602000b200741016a2207200a2802002205490d010c020b200341306a200341186a200110ea0320032802300d39200341246a2802002205417f6a220920054f0d3a200920054b0d3a200328021c20094104746a41013a000c200741016a2207200a2802002205490d000b0b2000410036020020002008360204200b280200450d5c200328021c1023200341c0006a24000f0b411310262207450d382007410f6a41002800aae644360000200741086a41002900a3e6443700002007410029009be644370000200041086a4293808080b0023702002000200736020420004101360200200341c0006a24000f0b410f10262207450d38200741076a41002900b5e644370000200741002900aee644370000200041086a428f808080f0013702002000200736020420004101360200200341c0006a24000f0b410f10262207450d38200741076a41002900c4e644370000200741002900bde644370000200041086a428f808080f0013702002000200736020420004101360200200341c0006a24000f0b412510262207450d392007411d6a41002900e9e644370000200741186a41002900e4e644370000200741106a41002900dce644370000200741086a41002900d4e644370000200741002900cce644370000200041086a42a5808080d0043702002000200736020420004101360200200341c0006a24000f0b412510262207450d392007411d6a41002900e9e644370000200741186a41002900e4e644370000200741106a41002900dce644370000200741086a41002900d4e644370000200741002900cce644370000200041086a42a5808080d0043702002000200736020420004101360200200341c0006a24000f0b412710262207450d3a2007411f6a4100290090e744370000200741186a4100290089e744370000200741106a4100290081e744370000200741086a41002900f9e644370000200741002900f1e644370000200041086a42a7808080f0043702002000200736020420004101360200200341c0006a24000f0b200041013602002000200d2902003702042000410c6a200d41086a280200360200200341206a280200450d550c540b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d530c540b410e10262207450d3a200741066a41002900b5e744370000200741002900afe744370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d520c530b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d510c520b410e10262207450d39200741066a41002900b5e744370000200741002900afe744370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d500c510b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d4f0c500b410e10262207450d38200741066a41002900b5e744370000200741002900afe744370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d4e0c4f0b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d4d0c4e0b410e10262207450d37200741066a41002900b5e744370000200741002900afe744370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d4c0c4d0b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d4b0c4c0b410e10262207450d36200741066a41002900b5e744370000200741002900afe744370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d4a0c4b0b200041013602002000200d2902003702042000410c6a200d41086a280200360200200341206a2802000d490c4a0b412710262207450d352007411f6a41002900dce744370000200741186a41002900d5e744370000200741106a41002900cde744370000200741086a41002900c5e744370000200741002900bde744370000200041086a42a7808080f0043702002000200736020420004101360200200341206a2802000d480c490b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d470c480b410e10262207450d34200741066a41002900b5e744370000200741002900afe744370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d460c470b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d450c460b411710262207450d332007410f6a41002900a7e744370000200741086a41002900a0e74437000020074100290098e744370000200041086a4297808080f0023702002000200736020420004101360200200341206a2802000d440c450b410e10262207450d33200741066a41002900b5e744370000200741002900afe744370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d430c440b200041013602002000200d2902003702042000410c6a200d41086a280200360200200341206a2802000d420c430b200041013602002000200d2902003702042000410c6a200d41086a280200360200200341206a2802000d410c420b200041013602002000200d2902003702042000410c6a200d41086a280200360200200341206a2802000d400c410b410e10262207450d30200741066a41002900eae744370000200741002900e4e744370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d3f0c400b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d3e0c3f0b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d3d0c3e0b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d3c0c3d0b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d3b0c3c0b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d3a0c3b0b410e10262207450d2b200741066a41002900b5e744370000200741002900afe744370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d390c3a0b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d380c390b200041013602002000200d2902003702042000410c6a200d41086a280200360200200341206a2802000d370c380b411710262207450d292007410f6a41002900a7e744370000200741086a41002900a0e74437000020074100290098e744370000200041086a4297808080f0023702002000200736020420004101360200200341206a2802000d360c370b410e10262207450d29200741066a41002900b5e744370000200741002900afe744370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d350c360b410e10262207450d29200741066a41002900b5e744370000200741002900afe744370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d340c350b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d330c340b411710262207450d282007410f6a41002900a7e744370000200741086a41002900a0e74437000020074100290098e744370000200041086a4297808080f0023702002000200736020420004101360200200341206a2802000d320c330b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d310c320b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d300c310b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d2f0c300b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d2e0c2f0b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d2d0c2e0b410e10262207450d23200741066a41002900b5e744370000200741002900afe744370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d2c0c2d0b410e10262207450d23200741066a41002900b5e744370000200741002900afe744370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d2b0c2c0b410e10262207450d23200741066a41002900b5e744370000200741002900afe744370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d2a0c2b0b410e10262207450d23200741066a41002900b5e744370000200741002900afe744370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d290c2a0b411710262207450d232007410f6a41002900a7e744370000200741086a41002900a0e74437000020074100290098e744370000200041086a4297808080f0023702002000200736020420004101360200200341206a2802000d280c290b410e10262207450d23200741066a41002900b5e744370000200741002900afe744370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d270c280b410e10262207450d23200741066a41002900b5e744370000200741002900afe744370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d260c270b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d250c260b410e10262207450d22200741066a41002900b5e744370000200741002900afe744370000200041086a428e808080e0013702002000200736020420004101360200200341206a2802000d240c250b20002003290330370204200041013602002000410c6a200341386a280200360200200341206a2802000d230c240b411710262207450d212007410f6a41002900a7e744370000200741086a41002900a0e74437000020074100290098e744370000200041086a4297808080f0023702002000200736020420004101360200200341206a2802000d220c230b41134101102a000b410f4101102a000b410f4101102a000b41f4e7c400200720051029000b41254101102a000b41254101102a000b41104104102a000b41274101102a000b101e000b20124104102a000b410e4101102a000b410e4101102a000b410e4101102a000b410e4101102a000b410e4101102a000b41274101102a000b410e4101102a000b41174101102a000b410e4101102a000b410e4101102a000b410e4101102a000b41174101102a000b410e4101102a000b410e4101102a000b41174101102a000b410e4101102a000b410e4101102a000b410e4101102a000b410e4101102a000b41174101102a000b410e4101102a000b410e4101102a000b410e4101102a000b41174101102a000b200328021c10230b200341c0006a24000b110020002802003502004101200110cc020bbf0a020b7f017e230041e0006b22032400200320013602202002280208220441586a2105200241106a2802002206412c6c21020240024003402002450d01200241546a2102200541286a21072005412c6a2208210520072d00004102470d000b200341186a200810be0320032802182107200328021c21020c010b410021070b2002410020071b21092006412c6c2102200441586a2105200741a886c50020071b210a0240024003402002450d01200241546a2102200541286a21072005412c6a2208210520072d00004104470d000b200341106a200810be032003280210210b2003280214210c0c010b4100210b0b2006412c6c2102200441586a2105200b41a886c500200b1b210d024002400240024002400240024002400240024002400240024003402002450d01200241546a2102200541286a21072005412c6a2208210520072d00004103470d000b200841086a2802002202450d00200241286c2107200828020041186a2102410021050340200520022d0000456a2105200241286a2102200741586a22070d000b200520014d0d012006412c6c2102200441586a210503402002450d09200241546a2102200541286a21072005412c6a2208210520072d00004103470d000b200341086a200810be0320032802082207200328020c41286c6a210803402008200722026b419f014d0d0320022d0018450d04200241c0006a2d0000450d05200241e8006a2d0000450d06200241a0016a210720024190016a2d00000d000b20024194016a210520010d060c090b410021050b0240200c4100200b1b200120056b22024d0d00200d20024102746a22050d080b200341cc006a41013602002003410236022c2003420237023c200341d4e1c4003602382003200341206a3602282003200341286a360248200341d0006a200341386a10a2012003290254210e200328025021020c0a0b20022008460d042002411c6a21050240034020022d0018450d01200541286a2105200241286a22022008470d000c060b0b2005410c6a210720010d030c060b2002411c6a2105200241286a210720010d020c050b200241c4006a2105200241d0006a210720010d010c040b200241ec006a2105200241f8006a21072001450d030b02400240024003402001417f6a2101024002400240024003402008200722026b419f014d0d0120022d0018450d02200241c0006a2d0000450d03200241e8006a2d0000450d04200241a0016a210720024190016a2d00000d000b20010d040c070b20022008460d072002411c6a21050240034020022d0018450d01200541286a2105200241286a22022008470d000c090b0b2005410c6a210720010d030c090b200241286a210720010d020c030b200241d0006a210720010d010c030b200241f8006a210720010d000b2003200241ec006a2802002202360224200920024b0d060c070b20032002411c6a2802002202360224200920024b0d050c060b2003200241c4006a2802002202360224200920024b0d040c050b200320024194016a2802002202360224200920024b0d030c040b41f7e0c40041dd001021000b41b5e0c40041c2001021000b200320052802002202360224200920024d0d010b200a20024104746a2202450d002000410036020020002002360204200341e0006a24000f0b200341dc006a4102360200200341cc006a4102360200200341023602542003420337023c200341e4e1c4003602382003200341206a3602582003200341246a3602502003200341d0006a360248200341286a200341386a10a201200329022c210e200328022821020b2000200236020420004101360200200041086a200e370200200341e0006a24000bf50303047f017e017f02402001450d00034020002802940321002001417f6a22010d000b0b02402002450d004100210341002101034002400240200120002f01064f0d00200020014105746a220441386a2802002105200441346a2802002106200141016a2101200441c4006a2802004102460d030c010b0240024020002802002201450d0020003301044220862003ad842107410121040c010b2003ad210741002104410021010b200010232007a72103024002402007422088a7220620012f01064f0d00200121050c010b03400240024020012802002205450d00200441016a210420013301044220862003ad8421070c010b2003ad2107410021050b200110232007a72103200521012007422088a7220620052f01064f0d000b0b200520064102746a4198036a2802002100200520064105746a220141c4006a2802002108200141386a2802002105200141346a2802002106024020044101460d00410120046b210103402000280294032100200141016a22010d000b0b4100210120084102460d020b2002417f6a210202402005450d00200610230b20020d000b0b0240200041f098c400460d0020002802002101200010232001450d0020012802002105200110232005450d00024020052802002201450d000340200510232001210520012802002200210120000d000b0b200510230b0b940302067f017e230041106b2202240002400240024002400240024002400240200041046a2802002203200041086a28020022046b20012802042205200128020022066b41047622074f0d00200420076a22062004490d0320034101742204200620062004491b2206ad4204862208422088a70d032008a722044100480d032003450d0120002802002003410474200410272203450d020c040b2000280200210320062005460d040c050b2004102622030d020b20044108102a000b101e000b20002003360200200041046a2006360200200041086a280200210420012802002206200141046a280200470d010b410021060c010b2001200641106a3602000b2002200610e803024020022d000041ac01460d00200320044104746a2106034020062002290300370300200641086a200241086a2903003703000240024020012802002203200141046a280200460d002001200341106a3602000c010b410021030b200441016a2104200641106a21062002200310e80320022d000041ac01470d000b0b200041086a2004360200200241106a24000bc80903037f017e017f0240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001450d0020012d00002202417e6a2203412e4b0d01024020030e2f001f233030152019301e0b30300e0d1d271a0c161c242212112829061b0a091025172605140721080403182b2a130f000b20012d00012104410221020c2f0b200041ac013a00000f0b0c2b0b20012d00012104412b21020c2c0b200141046a280200210620013502082105412a21020c2a0b200141046a280200210620013502082105412521020c290b200141046a280200210620013502082105411d21020c280b200141046a280200210620013502082105412721020c270b200141046a280200210620013502082105412921020c260b200141046a280200210620013502082105412021020c250b200141046a280200210620013502082105411f21020c240b200141046a280200210620012d00012104410c21020c240b200141046a280200210620013502082105411421020c220b200141046a2802002106411021020c210b200141046a2802002106410f21020c200b20012903082105413021020c1e0b200141046a280200210620013502082105412121020c1e0b200141046a280200210620013502082105411a21020c1d0b200141046a280200210620013502082105411921020c1c0b200141046a2802002106412f21020c1b0b200141046a280200210620013502082105412621020c1a0b200141046a2802002106410721020c190b200141046a280200210620013502082105411521020c180b200141046a280200210620013502082105412321020c170b20012d00012104412c21020c170b20012802082204ad2205421e88a70d122005420286a72202417f4c0d124104210602402002450d00200210262206450d140b02402004450d00200141046a28020021022004410274210320062104034020042002280200360200200441046a2104200241046a21022003417c6a22030d000b0b2001410c6a3502004220862005842105410921020c150b200141046a2802002106411321020c140b200141046a280200210620013502082105411e21020c130b200141046a280200210620013502082105411621020c120b200141046a2802002106411121020c110b200141046a2802002106410b21020c100b20012d00012104410321020c100b200141046a2802002106410821020c0e0b200141046a280200210620013502082105412821020c0d0b200141046a280200210620013502082105411821020c0c0b20012d00012104410421020c0c0b200141046a280200210620013502082105411721020c0a0b200141046a280200210620013502082105412221020c090b200141046a280200210620013502082105412421020c080b200141046a2802002106411221020c070b200141046a280200210620013502082105411b21020c060b200141046a280200210620013502082105411c21020c050b20012903082105412e21020c030b200141046a2802002106412d21020c030b101d000b20024104102a000b0b0b200020043a0001200020023a0000200041086a2005370300200041046a20063602000ba00201027f02400240024002402001410c6a2802002203417f6a220420034d0d00411610262201450d01200020013602042001410e6a41002900bee944370000200141086a41002900b8e944370000200141002900b0e944370000200041086a4296808080e002370200200041013602000f0b0240200420026b220220044d0d00411b10262201450d0220002001360204200141176a41002800dde944360000200141106a41002900d6e944370000200141086a41002900cee944370000200141002900c6e944370000200041086a429b808080b003370200200041013602000f0b200320024d0d022000200141046a28020020024104746a360204200041003602000f0b41164101102a000b411b4101102a000b41e4e9c400200220031029000bf60201037f230041106b22032400024002402002450d0020032001410010e90320032802004101470d01200020034104722202290200370200200041086a200241086a280200360200200341106a24000f0b20004100360200200341106a24000f0b02400240024002402001280200220420032802042205280208470d0020052d000c450d0120004100360200200341106a24000f0b0240200420026b220220044d0d00410f10262202450d022000428f808080f00137020420002002360200200241076a41002900a8e944370000200241002900a1e944370000200341106a24000f0b2000410036020020012002360200200341106a24000f0b412510262202450d01200042a5808080d004370204200020023602002002411d6a4100290099e944370000200241186a4100290094e944370000200241106a410029008ce944370000200241086a4100290084e944370000200241002900fce844370000200341106a24000f0b410f4101102a000b41254101102a000be40601087f230041d0006b220224002000280200220041046a28020021032000280200210041012104200128021841a7b1c50041012001411c6a28020028020c11020021050240024002402003450d002002200036020402400240024020050d00024020012d00004104710d00200241046a200110dc0221044101210620034101460d020c030b41012104200141186a220528020041a5b1c50041012001411c6a28020028020c1102000d002001280200210741012104200241086a41086a41013a0000200241186a411c6a41e8b0c500360200200241186a41306a200141306a2d00003a0000200241186a41086a200141086a290200370300200241186a41286a200141286a290200370300200241186a41206a200141206a290200370300200241186a41106a200141106a29020037030020022007360218200241186a41186a200241086a360200200220052902003703082002200141046a28020036021c200241046a200241186a10dc020d00200241306a2802004182b1c5004102200241346a28020028020c11020021040b4101210620034101470d010b4101210020040d020c030b200041046a21002003410274417c6a2103200141186a21072001411c6a210820042105034020022000360204200541ff0171210441012105024020040d000240200128020022044104710d0020072802004184b1c5004102200828020028020c1102000d01200241046a200110dc022105200041046a21002003417c6a22030d020c030b200241086a41086a20063a0000200241186a411c6a220941e8b0c500360200200241186a41306a200141306a2d00003a0000200241186a41086a200141086a290200370300200241186a41286a200141286a290200370300200241186a41206a200141206a290200370300200241186a41106a200141106a29020037030020022004360218200241186a41186a2204200241086a360200200220072902003703082002200141046a28020036021c200241046a200241186a10dc020d0020042802004182b1c5004102200928020028020c1102002105200041046a21002003417c6a22030d010c020b200041046a21002003417c6a22030d000b0b410121002005450d010b200241d0006a240020000f0b200141186a28020041a6b1c50041012001411c6a28020028020c1102002100200241d0006a240020000bdd0202027f027e23004180016b22022400200028020021000240024002400240200128020022034110710d002000290300210420034120710d0120042004423f8722057c2005852004427f55200110cc02210020024180016a240020000f0b200029030021044180012100024003402000450d01200220006a417f6a2004a7410f712203413072200341d7006a2003410a491b3a00002000417f6a2100200442048822044200520d000b0b20004181014f0d012001410141d889c5004102200220006a41800120006b109701210020024180016a240020000f0b4180012100024003402000450d01200220006a417f6a2004a7410f712203413072200341376a2003410a491b3a00002000417f6a2100200442048822044200520d000b0b20004181014f0d012001410141d889c5004102200220006a41800120006b109701210020024180016a240020000f0b20004180011048000b20004180011048000bdb0203027f017e017f23004180016b22022400200028020021000240024002400240200128020022034110710d002000280200210020034120710d012000ac2204420020047d2000417f4a22001b2000200110cc02210020024180016a240020000f0b20002802002103410021000340200220006a41ff006a2003410f712205413072200541d7006a2005410a491b3a00002000417f6a2100200341047622030d000b20004180016a22034181014f0d012001410141d889c5004102200220006a4180016a410020006b109701210020024180016a240020000f0b410021030340200220036a41ff006a2000410f712205413072200541376a2005410a491b3a00002003417f6a2103200041047622000d000b20034180016a22004181014f0d012001410141d889c5004102200220036a4180016a410020036b109701210020024180016a240020000f0b20034180011048000b20004180011048000bd20201037f23004180016b22022400200028020021000240024002400240200128020022034110710d0020002d0000210420034120710d012004ad42ff01834101200110cc02210020024180016a240020000f0b20002d00002104410021000340200220006a41ff006a2004410f712203413072200341d7006a2003410a491b3a00002000417f6a21002004410476410f7122040d000b20004180016a22044181014f0d012001410141d889c5004102200220006a4180016a410020006b109701210020024180016a240020000f0b410021000340200220006a41ff006a2004410f712203413072200341376a2003410a491b3a00002000417f6a21002004410476410f7122040d000b20004180016a22044181014f0d012001410141d889c5004102200220006a4180016a410020006b109701210020024180016a240020000f0b20044180011048000b20044180011048000b931001157f024020002802082201450d00200028020022022001412c6c6a2103034020022204412c6a21020240024002400240024002400240024002400240024002400240024002400240024002400240024020042d00002200410d4b0d00024020000e0e000203040506070809140a0b0c0d000b200441086a280200450d13200441046a280200102320022003470d140c150b0240200441086a280200450d00200441046a28020010230b0240200441146a2802002200450d00200441186a280200450d00200010230b200441246a280200450d12200441206a280200102320022003470d130c140b0240200441086a280200450d00200441046a28020010230b200441146a280200450d11200441106a280200102320022003470d120c130b200441046a210502402004410c6a2802002201450d00200528020021002001410474210103400240200041046a280200450d00200028020010230b200041106a2100200141706a22010d000b0b200441086a280200450d102005280200102320022003470d110c120b200441046a210502402004410c6a2802002201450d0020052802002100200141286c210103400240200041046a280200450d00200028020010230b0240200041106a280200450d002000410c6a28020010230b200041286a2100200141586a22010d000b0b200441086a280200450d0f2005280200102320022003470d100c110b200441086a280200450d0e200441046a280200102320022003470d0f0c100b200441086a280200450d0d200441046a280200102320022003470d0e0c0f0b200441086a280200450d0c200441046a280200102320022003470d0d0c0e0b200441046a21062004410c6a2802002200450d0a2006280200220720004104746a2108410021000c050b200441046a210502402004410c6a2802002201450d0020052802002100200141146c210103400240200041046a280200450d00200028020010230b200041146a21002001416c6a22010d000b0b200441086a280200450d0a2005280200102320022003470d0b0c0c0b200441046a21092004410c6a2802002200450d072009280200220a2000411c6c6a210b410121000c030b200441046a210c2004410c6a2802002200450d05200c280200220d200041186c6a210e410221000c020b200441046a210f2004410c6a2802002200450d03200f28020022102000411c6c6a2111410321000c010b024002400240200441046a2d000022004102460d0020004101460d0120000d022004410c6a280200450d09200441086a280200102320022003470d0a0c0b0b2004410c6a2112200441146a2802002200450d032012280200221320004104746a2114410421000c020b2004410c6a21150240200441146a2802002201450d00201528020021002001410c6c21010340024020002802002205450d00200041046a280200450d00200510230b2000410c6a2100200141746a22010d000b0b200441106a280200450d072015280200102320022003470d080c090b2004410c6a280200450d06200441086a28020010230c060b0340024002400240024002400240024002400240024020000e050001020304040b024020072802082201450d0020072802002100200141047421010340024020002d00004109470d00200041086a28020041ffffffff0371450d00200041046a28020010230b200041106a2100200141706a22010d000b0b200741106a21000240200741046a280200450d00200728020010230b2000210720002008470d040c0e0b0240200a410c6a2802002201450d00200a2802042100200141047421010340024020002d00004109470d00200041086a28020041ffffffff0371450d00200041046a28020010230b200041106a2100200141706a22010d000b0b0240200a41086a280200450d00200a41046a28020010230b200a411c6a21000240200a41146a280200450d00200a28021010230b2000210a2000200b470d040c0c0b0240200d41046a280200450d00200d28020010230b0240200d41146a2802002201450d00200d28020c2100200141047421010340024020002d00004109470d00200041086a28020041ffffffff0371450d00200041046a28020010230b200041106a2100200141706a22010d000b0b200d41186a21000240200d41106a280200450d00200d410c6a28020010230b2000210d2000200e470d040c0a0b02402010410c6a2802002201450d0020102802042100200141047421010340024020002d00004109470d00200041086a28020041ffffffff0371450d00200041046a28020010230b200041106a2100200141706a22010d000b0b0240201041086a280200450d00201041046a28020010230b2010411c6a21000240201041146a280200450d00201028021010230b2000211020002011470d040c080b2013221541106a2113024020152802042200450d0002402015410c6a2802002201450d002001410c6c21010340024020002802002205450d00200041046a280200450d00200510230b2000410c6a2100200141746a22010d000b0b201541086a280200450d00201541046a28020010230b20132014470d040c060b410021000c040b410121000c030b410221000c020b410321000c010b410421000c000b0b200441106a280200450d042012280200102320022003470d050c060b200441086a280200450d03200f280200102320022003470d040c050b200441086a280200450d02200c280200102320022003470d030c040b200441086a280200450d012009280200102320022003470d020c030b200441086a280200450d002006280200102320022003470d010c020b20022003470d000b0b0b0c002000280200200110c2030bb20201027f230041106b2202240002400240200028020022002d00004104470d00200128021841d0f6c40041082001411c6a28020028020c11020021010c010b2002200128021841bbf6c40041052001411c6a28020028020c1102003a000820022001360200200241003a0009200241003602042002200036020c20022002410c6a41c0f6c40010de031a20022d0008210120022802042203450d00200141ff0171210041012101024020000d00024020034101470d00200241096a2d000041ff0171450d00200228020022002d00004104710d0041012101200028021841a3b1c50041012000411c6a28020028020c1102000d010b2002280200220128021841a4b1c50041012001411c6a28020028020c11020021010b200241086a20013a00000b200241106a2400200141ff01714100470ba41b01037f024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024020002d000022024101460d0020024102470d01200141046a280200200141086a2802002202470d03200241016a22032002490d1120024101742204200320032004491b22044100480d112002450d0720012802002002200410272203450d080c0f0b200141046a280200200141086a2802002202470d01200241016a22032002490d1020024101742204200320032004491b22044100480d102002450d0420012802002002200410272203450d050c0c0b200141046a280200200141086a2802002202470d02200241016a22032002490d0f20024101742204200320032004491b22044100480d0f2002450d0720012802002002200410272203450d080c090b200128020021030c0b0b200128020021030c0c0b200128020021030c070b2004102622030d070b20044101102a000b2004102622030d070b20044101102a000b2004102622030d010b20044101102a000b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41003a0000200041086a2802002000410c6a28020020011093030f0b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41013a0000024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200041016a2d0000417f6a220241034b0d00024020020e0400040203000b200141046a280200200141086a2802002202470d07200241016a22032002490d2020024101742204200320032004491b22044100480d202002450d0f20012802002002200410272203450d100c1b0b200141046a28020020042802002202470d03200241016a22032002490d1f20024101742204200320032004491b22044100480d1f2002450d0820012802002002200410272203450d090c180b200141046a280200200141086a2802002202470d03200241016a22032002490d1e20024101742204200320032004491b22044100480d1e2002450d0920012802002002200410272203450d0a0c150b200141046a280200200141086a2802002202470d03200241016a22032002490d1d20024101742204200320032004491b22044100480d1d2002450d0a20012802002002200410272203450d0b0c120b200141046a280200200141086a2802002202470d04200241016a22032002490d1c20024101742204200320032004491b22044100480d1c2002450d0d20012802002002200410272203450d0e0c0f0b200128020021030c150b200128020021030c120b200128020021030c0f0b200128020021030c140b200128020021030c0b0b2004102622030d0f0b20044101102a000b2004102622030d0b0b20044101102a000b2004102622030d070b20044101102a000b2004102622030d0b0b20044101102a000b2004102622030d010b20044101102a000b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41023a00000c080b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41043a00000c060b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41033a00000c040b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41003a00000c020b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41013a00000b200041086a2802002000410c6a2802002001109303200041146a280200200041186a280200200110930302400240024002400240200141046a280200200141086a2802002202470d00200241016a22032002490d0720024101742204200320032004491b22044100480d072002450d0120012802002002200410272203450d020c030b200128020021030c030b2004102622030d010b20044101102a000b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a200041026a2d00003a00000f0b20012003360200200141046a2004360200200141086a28020021020b200141086a2204200241016a360200200320026a41023a0000024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240200041016a2d0000417f6a220241034b0d00024020020e0400040203000b200141046a280200200141086a2802002202470d07200241016a22032002490d1e20024101742204200320032004491b22044100480d1e2002450d0f20012802002002200410272203450d100c1b0b200141046a28020020042802002202470d03200241016a22032002490d1d20024101742204200320032004491b22044100480d1d2002450d0820012802002002200410272203450d090c180b200141046a280200200141086a2802002202470d03200241016a22032002490d1c20024101742204200320032004491b22044100480d1c2002450d0920012802002002200410272203450d0a0c150b200141046a280200200141086a2802002202470d03200241016a22032002490d1b20024101742204200320032004491b22044100480d1b2002450d0a20012802002002200410272203450d0b0c120b200141046a280200200141086a2802002202470d04200241016a22032002490d1a20024101742204200320032004491b22044100480d1a2002450d0d20012802002002200410272203450d0e0c0f0b200128020021030c150b200128020021030c120b200128020021030c0f0b200128020021030c140b200128020021030c0b0b2004102622030d0f0b20044101102a000b2004102622030d0b0b20044101102a000b2004102622030d070b20044101102a000b2004102622030d0b0b20044101102a000b2004102622030d010b20044101102a000b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41023a00000c080b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41043a00000c060b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41033a00000c040b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41003a00000c020b20012003360200200141046a2004360200200141086a28020021020b200141086a200241016a360200200320026a41013a00000b200041086a2802002000410c6a2802002001109303200041146a280200200041186a2802002001109303200041206a280200200041246a28020020011093030240024002400240024002400240024002400240024002400240024002400240024002400240200041026a2d0000417f6a220041034b0d00024020000e0400040203000b200141046a280200200141086a2802002200470d07200041016a22022000490d1320004101742203200220022003491b22034100480d132000450d0f20012802002000200310272202450d100c1c0b200141046a280200200141086a2802002200470d03200041016a22022000490d1220004101742203200220022003491b22034100480d122000450d0820012802002000200310272202450d090c190b200141046a280200200141086a2802002200470d03200041016a22022000490d1120004101742203200220022003491b22034100480d112000450d0920012802002000200310272202450d0a0c160b200141046a280200200141086a2802002200470d03200041016a22022000490d1020004101742203200220022003491b22034100480d102000450d0a20012802002000200310272202450d0b0c130b200141046a280200200141086a2802002200470d04200041016a22022000490d0f20004101742203200220022003491b22034100480d0f2000450d0d20012802002000200310272202450d0e0c100b200128020021020c160b200128020021020c130b200128020021020c100b200128020021020c150b200128020021020c0c0b2003102622020d100b20034101102a000b2003102622020d0c0b20034101102a000b2003102622020d080b20034101102a000b2003102622020d0c0b20034101102a000b2003102622020d020b20034101102a000b101e000b20012002360200200141046a2003360200200141086a28020021000b200141086a200041016a360200200220006a41023a00000f0b20012002360200200141046a2003360200200141086a28020021000b200141086a200041016a360200200220006a41043a00000f0b20012002360200200141046a2003360200200141086a28020021000b200141086a200041016a360200200220006a41033a00000f0b20012002360200200141046a2003360200200141086a28020021000b200141086a200041016a360200200220006a41003a00000f0b20012002360200200141046a2003360200200141086a28020021000b200141086a200041016a360200200220006a41013a00000be80701037f0240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002400240024002402001413f4b0d00200241046a280200200241086a2802002203470d01200341016a22042003490d1120034101742205200420042005491b22054100480d112003450d0520022802002003200510272204450d060c170b2001418080014f0d01200241046a2802002204200241086a28020022036b41024f0d02200341026a22052003490d1020044101742203200520052003491b22034100480d102004450d0820022802002004200310272204450d090c140b200228020021040c160b20014180808080044f0d01200241046a2802002204200241086a28020022036b41044f0d04200341046a22052003490d0e20044101742203200520052003491b22034100480d0e2004450d08200228020020042003102722040d090c0f0b200228020021040c120b200241046a280200200241086a2802002203470d03200341016a22042003490d0c20034101742205200420042005491b22054100480d0c2003450d09200228020020032005102722040d0a0c0e0b2005102622040d110b20054101102a000b200228020021040c050b200228020021040c070b2003102622040d0b0b20034101102a000b200310262204450d060b20022004360200200241046a2003360200200241086a28020021030b200241086a200341046a360200200420036a2001410274410272360000200141037422010d0b0c0c0b200510262204450d040b20022004360200200241046a2005360200200241086a28020021030b200241086a2205200341016a360200200420036a41033a00000240024002400240200241046a2802002204200528020022036b41044f0d00200341046a22052003490d0420044101742203200520052003491b22034100480d042004450d01200228020020042003102722040d020c070b200228020021040c020b200310262204450d050b20022004360200200241046a2003360200200241086a28020021030b200241086a200341046a360200200420036a200136000020014103742201450d090c080b101e000b20034101102a000b20054101102a000b20034101102a000b20022004360200200241046a2003360200200241086a28020021030b200241086a200341026a360200200420036a20014102744101723b0000200141037422010d020c030b20022004360200200241046a2005360200200241086a28020021030b200241086a200341016a360200200420036a20014102743a000020014103742201450d010b200020016a210103402000280200200041046a2802002002109303200041086a22002001470d000b0b0bd50101027f200028020421020240024020002802004101470d002000410c6a280200220020011092032000450d01200041186c2103200241146a21000340200041706a280200200041746a28020020011093032000417c6a28020020002802002001109303200041186a2100200341686a22030d000c020b0b200041086a280200220020011092032000450d00200041186c2103200241146a21000340200041706a280200200041746a28020020011093032000417c6a28020020002802002001109303200041186a2100200341686a22030d000b0b0b2700200028020c200041106a280200100f200041146a350200101a200041186a350200101a00000b080020002001100f0b06002000101b0b06002000101c0b2801017f02402002101b2203450d002003200020022001200120024b1b1094041a2000101c0b20030b1c01017f02402000101b2201450d002001410020001093041a0b20010b7601017f230041c0006b220024002000413336020c200041dc82c500360208200041346a412f360200200041246a41023602002000410136022c200042023702142000419083c5003602102000200041386a3602302000200041086a3602282000200041286a360220200041106a41a083c5001061000b1c00200128021841a8b1c50041052001411c6a28020028020c1102000bba0101037f024002400240024002400240200028020022002802042203200028020822046b20024f0d00200420026a22052004490d0320034101742204200520052004491b22044100480d032003450d0120002802002003200410272203450d020c040b200028020021030c040b2004102622030d020b20044101102a000b101e000b20002003360200200041046a2004360200200041086a28020021040b200041086a200420026a360200200320046a200120021094041a41000bba0401047f230041106b22022400200028020021000240024002400240024002400240024002400240024020014180014f0d00200028020822032000280204470d09200341016a22042003490d0520034101742205200420042005491b22044100480d052003450d0120002802002003200410272203450d020c080b2002410036020c0240024020014180104f0d0020022001413f71418001723a000d20022001410676411f7141c001723a000c410221010c010b0240200141ffff034b0d0020022001413f71418001723a000e20022001410676413f71418001723a000d20022001410c76410f7141e001723a000c410321010c010b20022001413f71418001723a000f2002200141127641f001723a000c20022001410676413f71418001723a000e20022001410c76413f71418001723a000d410421010b024020002802042204200028020822036b20014f0d00200320016a22052003490d0520044101742203200520052003491b22034100480d052004450d0320002802002004200310272204450d040c060b200028020021040c060b2004102622030d060b20044101102a000b2003102622040d020b20034101102a000b101e000b20002004360200200041046a2003360200200041086a28020021030b200041086a200320016a360200200420036a2002410c6a20011094041a0c020b20002003360200200041046a2004360200200041086a28020021030b200028020020036a20013a0000200041086a2200200028020041016a3602000b200241106a240041000b6401017f230041206b2202240020022000280200360204200241086a41106a200141106a290200370300200241086a41086a200141086a29020037030020022001290200370308200241046a41c482c500200241086a10e2032101200241206a240020010b02000b0c0042afd4e7bdc6bbf3dc230b5501017f0240024002402001418080c400460d0041012104200028021820012000411c6a2802002802101103000d010b2002450d012000280218200220032000411c6a28020028020c11020021040b20040f0b41000bd30801067f230041f0006b220424002004200336020c20042002360208410121052001210602402001418102490d00410020016b21074180022108024003400240200820014f0d00200020086a2c000041bf7f4a0d020b2008417f6a21064100210520084101460d02200720086a21092006210820094101470d000c020b0b41002105200821060b200420063602142004200036021020044100410520051b36021c200441a886c50041da89c50020051b360218024002400240200220014b22080d00200320014b0d00200220034b0d01024002402002450d0020012002460d00200120024d0d01200020026a2c00004140480d010b200321020b20042002360220024002402002450d0020022001460d00200141016a210903400240200220014f0d00200020026a2c000041404e0d020b2002417f6a210820024101460d0220092002462106200821022006450d000c020b0b200221080b20082001460d02410121064100210502400240200020086a22092c000022024100480d002004200241ff0171360224200441286a21020c010b200020016a220621010240200941016a2006460d00200941026a2101200941016a2d0000413f7121050b2002411f712109024002400240200241ff017141e001490d004100210020062107024020012006460d00200141016a210720012d0000413f7121000b20002005410674722101200241ff017141f001490d0141002102024020072006460d0020072d0000413f7121020b20014106742009411274418080f00071722002722201418080c400460d060c020b200520094106747221010c010b20012009410c747221010b2004200136022441012106200441286a21022001418001490d00410221062001418010490d0041034104200141808004491b21060b200420083602282004200620086a36022c200441ec006a4101360200200441e4006a4101360200200441c8006a41146a4130360200200441d4006a4131360200200441306a41146a4105360200200420023602582004410236024c20044205370234200441d08ac5003602302004200441186a3602682004200441106a3602602004200441246a3602502004200441206a3602482004200441c8006a360240200441306a41f88ac5001061000b20042002200320081b360228200441c8006a41146a4101360200200441d4006a4101360200200441306a41146a41033602002004410236024c20044203370234200441e089c5003602302004200441186a3602582004200441106a3602502004200441286a3602482004200441c8006a360240200441306a41f889c5001061000b200441e4006a4101360200200441c8006a41146a4101360200200441d4006a4102360200200441306a41146a41043602002004410236024c20044204370234200441888ac5003602302004200441186a3602602004200441106a36025820042004410c6a3602502004200441086a3602482004200441c8006a360240200441306a41a88ac5001061000b41b88ac500104f000b830101037f230041206b2202240002400240200028020020011087040d002001411c6a2802002103200128021821042002411c6a4100360200200241a886c5003602182002420137020c200241e08bc50036020820042003200241086a10e203450d010b200241206a240041010f0b200028020420011087042101200241206a240020010b860c03037f017e167f410121020240200128021841272001411c6a2802002802101103000d00410221020240024002400240024002400240024002402000280200220341776a2200411e4b0d0041f4002104024020000e1f09000202030202020202020202020202020202020202020202070202020207090b41ee0021040c030b200341dc00460d050b2003108604450d02200341017267410276410773ad4280808080d0008421050c030b41f20021040b0c040b024002400240200341ffff034b0d0020034180fe0371410876210641a098c5002107410021084102210941b002210a41f098c500210b41f098c500210c417f210d4101210e200341ff0171210f410021020c010b0240200341ffff074b0d0020034180fe0371410876211341db9dc50021144100211541022116419f012117419d9ec5002118419d9ec5002119417f211a4101211b200341ff01712112410121020c010b200341ef83384b0d01200341e28b746a41e28d2c490d012003419fa8746a419f18490d01200341dee2746a410e490d01200341feffff0071419ef00a460d01200341a9b2756a4129490d01200341cb91756a410a4d0d01410121020c030b034002400240024002400240024002400240024002400240024020020e020001010b200720096a2110200820072d000122026a211102400240024020072d000022002006470d0020112008490d042011200a4f0d052008200b6a210003402002450d022002200d6a210220002d000021042000200e6a21002004200f470d000c100b0b200020064b0d0120112108201021072010200c470d090c010b20112108201021072010200c470d090b200341ffff03712100419f9bc50021024101210f02400340200241016a210e0240024020022d0000220d4118744118752212417f4c0d00200e21022000200d6b220041004e0d010c030b200e41db9dc500460d08200241016a210e200241026a21022000201241ff0071410874200e2d0000726b22004100480d020b200f410173210f200241db9dc500470d000b0b41012102200f410171450d0c0c0e0b201420166a2110201520142d000122026a211102400240024020142d000022002013470d0020112015490d05201120174f0d06201520186a210003402002450d022002201a6a210220002d000021042000201b6a210020042012470d000c0f0b0b200020134b0d01201121152010211420102019470d0a0c010b201121152010211420102019470d0a0b200341ffff0371210041bb9fc50021024101210f02400340200241016a210e0240024020022d0000220d4118744118752212417f4c0d00200e21022000200d6b220041004e0d010c030b200e41b8a2c500460d08200241016a210e200241026a21022000201241ff0071410874200e2d0000726b22004100480d020b200f410173210f200241b8a2c500470d000b0b41012102200f410171450d0b0c0d0b200820111048000b201141af02108c01000b201520111048000b2011419e01108c01000b41b88ac500104f000b41b88ac500104f000b410021020c030b410021020c020b410121020c010b410121020c000b0b200341017267410276410773ad4280808080d0008421050b410321020c010b0b200321040b200141186a210f2001411c6a210e02400340024002400240024002400240024020024101460d0041dc002100024020024102460d0020024103470d092005422088a741ff0171417f6a220241044b0d09024020020e050006040503000b200542ffffffff8f6083210541fd0021000c060b410121020c060b41002102200421000c050b200542ffffffff8f60834280808080c0008421050c030b200542ffffffff8f608342808080802084210541fb0021000c020b200542ffffffff8f608342808080803084210541f50021000c010b20042005a7220d410274411c7176410f712202413072200241d7006a2002410a491b21000240200d450d002005427f7c42ffffffff0f832005428080808070838421050c010b200542ffffffff8f60834280808080108421050b410321020b200f2802002000200e280200280210110300450d000b41010f0b200141186a28020041272001411c6a28020028021011030021020b20020b960201017f0240024002400240024002400240200041ff0f4b0d00200041037641f8ffffff017141a88cc5006a21010c010b0240200041ffff034b0d00200041067641606a220141df074b0d02200141c08ec5006a2d0000220141c9004b0d03200141037441b0a3c5006a21010c010b2000410c7641706a220141ff014b0d03200141a096c5006a2d00004106742000410676413f7172220141ff034b0d0420014180a8c5006a2d0000220141364b0d0520014103744180acc5006a21010b200129030042012000413f71ad86834200520f0b41b8a2c500200141e0071029000b41c8a2c500200141ca001029000b41d8a2c50020014180021029000b41e8a2c50020014180041029000b41f8a2c500200141371029000bb30201037f23004180016b220224000240024002400240200128020022034110710d0020034120710d012000ad4101200110cc02210020024180016a240020000f0b410021030340200220036a41ff006a2000410f712204413072200441d7006a2004410a491b3a00002003417f6a2103200041047622000d000b20034180016a22004181014f0d012001410141d889c5004102200220036a4180016a410020036b109701210020024180016a240020000f0b410021030340200220036a41ff006a2000410f712204413072200441376a2004410a491b3a00002003417f6a2103200041047622000d000b20034180016a22004181014f0d012001410141d889c5004102200220036a4180016a410020036b109701210020024180016a240020000f0b20004180011048000b20004180011048000b0e0020003502004101200110cc020bc50501077f41002104024020024103712205450d00410420056b2205450d00200220032005200520034b1b22046a210641002105200141ff017121072004210820022109024002400340200620096b41034d0d01200520092d0000220a2007476a2105200a2007460d022005200941016a2d0000220a2007476a2105200a2007460d022005200941026a2d0000220a2007476a2105200a2007460d022005200941036a2d0000220a2007476a21052008417c6a2108200941046a2109200a2007470d000c020b0b41002107200141ff0171210603402008450d02200920076a210a2008417f6a2108200741016a2107200a2d0000220a2006470d000b200a200141ff01714641016a41017120056a20076a417f6a21050b20002005360204200041013602000f0b200141ff017121070240024020034108490d002004200341786a220a4b0d00200741818284086c210502400340200220046a220941046a2802002005732208417f73200841fffdfb776a7120092802002005732209417f73200941fffdfb776a7172418081828478710d01200441086a2204200a4d0d000b0b200420034b0d010b200220046a2109200220036a2102200320046b2108410021050240024002400340200220096b41034d0d01200520092d0000220a2007476a2105200a2007460d022005200941016a2d0000220a2007476a2105200a2007460d022005200941026a2d0000220a2007476a2105200a2007460d022005200941036a2d0000220a2007476a21052008417c6a2108200941046a2109200a2007470d000c020b0b41002107200141ff0171210203402008450d02200920076a210a2008417f6a2108200741016a2107200a2d0000220a2002470d000b200a200141ff01714641016a41017120056a20076a417f6a21050b2000200520046a360204200041013602000f0b2000200520076a20046a360204200041003602000f0b200420031048000b2701017f20002802002201280200200128020420002802042802002000280208280200108304000be104010d7f230041306b2203240002402002450d00200341286a2104200041086a2105200341206a21062003411c6a2107200341246a2108200041046a210902400240024002400340024020052d0000450d00200028020041e4b0c5004104200928020028020c1102000d020b2004410a3602002006428a8080801037030020072002360200200341106a41086a220a41003602002003200236021420032001360210200341086a410a200120021089040240024002400240024020032802084101470d00200328020c210b0340200a200b200a2802006a41016a220b36020002400240200b2008280200220c4f0d002003280214210d2007280200220e200b4f0d010c040b02402003280214220d200b490d00200c41054f0d062003280210200b200c6b220f6a220e2004460d05200e2004200c109604450d050b2007280200220e200b490d030b200d200e490d022003200341106a200c6a41176a2d00002003280210200b6a200e200b6b1089042003280204210b20032802004101460d000b0b200a20072802003602000b200541003a00002002210b0c020b200541013a0000200f41016a210b0c010b200c4104108c01000b2009280200210e2000280200210c0240200b452002200b4672220a0d002002200b4d0d042001200b6a2c000041bf7f4c0d040b200c2001200b200e28020c1102000d010240200a0d002002200b4d0d052001200b6a2c000041bf7f4c0d050b2001200b6a21012002200b6b22020d000c020b0b200341306a240041010f0b200341306a240041000f0b200120024100200b108304000b20012002200b2002108304000b200341306a240041000b02000bfa0101017f230041106b220224002002410036020c02400240200141ff004b0d00200220013a000c410121010c010b0240200141ff0f4b0d0020022001413f71418001723a000d20022001410676411f7141c001723a000c410221010c010b0240200141ffff034b0d0020022001413f71418001723a000e20022001410676413f71418001723a000d20022001410c76410f7141e001723a000c410321010c010b20022001413f71418001723a000f2002200141127641f001723a000c20022001410676413f71418001723a000e20022001410c76413f71418001723a000d410421010b20002002410c6a2001108b042101200241106a240020010b6101017f230041206b2202240020022000360204200241086a41106a200141106a290200370300200241086a41086a200141086a29020037030020022001290200370308200241046a4188b1c500200241086a10e2032101200241206a240020010b02000b0e00200028020020012002108b040b810201017f230041106b22022400200028020021002002410036020c02400240200141ff004b0d00200220013a000c410121010c010b0240200141ff0f4b0d0020022001413f71418001723a000d20022001410676411f7141c001723a000c410221010c010b0240200141ffff034b0d0020022001413f71418001723a000e20022001410676413f71418001723a000d20022001410c76410f7141e001723a000c410321010c010b20022001413f71418001723a000f2002200141127641f001723a000c20022001410676413f71418001723a000e20022001410c76413f71418001723a000d410421010b20002002410c6a2001108b042101200241106a240020010b6401017f230041206b2202240020022000280200360204200241086a41106a200141106a290200370300200241086a41086a200141086a29020037030020022001290200370308200241046a4188b1c500200241086a10e2032101200241206a240020010b2c01017f02402002450d00200021030340200320013a0000200341016a21032002417f6a22020d000b0b20000b3601017f02402002450d00200021030340200320012d00003a0000200341016a2103200141016a21012002417f6a22020d000b0b20000b7101017f02400240200120004f0d002002450d012001417f6a21012000417f6a21030340200320026a200120026a2d00003a00002002417f6a22020d000c020b0b2002450d00200021030340200320012d00003a0000200141016a2101200341016a21032002417f6a22020d000b0b20000b4401037f024002402002450d00410021030340200020036a2d00002204200120036a2d00002205470d02200341016a22032002490d000b41000f0b41000f0b200420056b0b3e01017f230041106b22052400200520012002200320044100109b04200529030021012000200541086a29030037030820002001370300200541106a24000b7501027e200020034220882205200142208822067e200320027e7c200420017e7c200342ffffffff0f832203200142ffffffff0f8322017e2204422088200320067e7c22034220887c200342ffffffff0f83200520017e7c22034220887c37030820002003422086200442ffffffff0f83843703000b5701017e02400240200341c000710d002003450d012001410020036b413f71ad8820022003413f71ad220486842102200120048621010c010b20012003413f71ad862102420021010b20002001370300200020023703080b5701017e02400240200341c000710d002003450d0120012003413f71ad2204882002410020036b413f71ad86842101200220048821020c010b20022003413f71ad882101420021020b20002001370300200020023703080bc30502037f057e230041306b2206240002400240024002400240024002400240024002400240024002400240024020024200510d0020034200510d0120044200510d03200479a7200279a76b220741c0004f0d0241ff0020076b2108200741016a21070c0c0b20044200520d012005450d0520034200510d0d20054200370308200520012003823703000c060b20044200510d0c20014200510d032004427f7c22092004834200510d07200479a7200279a76b2207413f490d090b2005450d012005200137030020052002370308420021010c070b2003427f7c22092003834200510d044100200379a741c1006a200279a76b22076b21080c080b420021010c050b02402005450d0020054200370300200520022004823703080b200220048021010c040b20034200510d070b200120038021010c020b02402005450d0020054200370308200520092001833703000b20034201510d04200641206a2001200220037aa7109a04200641286a2903002102200629032021010c040b02402005450d0020052001370300200520092002833703080b200220047a423f838821010b420021020c020b41ff0020076b2108200741016a21070b200620012002200841ff0071109904200641106a20012002200741ff0071109a04200641086a2903002102200641106a41086a290300210a20062903002101200629031021094200210b0340200a4201862009423f8884220c200c427f8520047c20094201862002423f88842209427f85220c20037c200c54ad7c423f87220c2004837d2009200c200383220d54ad7d210a2009200d7d2109420020024201862001423f8884842102200b2001420186842101200c420183220c210b2007417f6a22070d000b02402005450d00200520093703002005200a3703080b20024201862001423f88842102200c20014201868421010b2000200137030020002002370308200641306a24000f0b00000b0bb8b1050100418080c0000badb10518001000240000001d411100170000004002000009000000547269656420746f20736872696e6b20746f2061206c61726765722063617061636974790000000098061100080000000000000020021000020000000000000000000000284311000000000000000000000000003002100006000000000000003802100003000000000000000000000028431100000000000000000000000000500210000e0000000000000028431100000000000000000000000000284311000000000000000000000000005e021000070000000000000068021000020000000000000000000000284311000000000000000000000000007802100006000000000000008002100001000000000000000000000028431100000000000000000000000000880210000900000000000000800210000100000000000000000000002843110000000000000000000000000091021000090000000000000080021000010000000000000000000000284311000000000000000000000000003c07110008000000000000009c02100002000000000000000000000028431100000000000000000000000000ac021000090000000000000028a4100002000000000000000000000028431100000000000000000000000000b50210000b00000000000000ece6100001000000000000000000000028431100000000000000000000000000c00210000600000000000000c802100003000000000000000000000028431100000000000000000007031000090000005bf61000070000005461626c6564000007031000090000005bf6100007000000e65710000e00000045787465726e616c5461626c656453746172746564000000eb0210000f000000fa0210000d0000005061737365640000eb0210000f0000004e6f7450617373656443616e63656c6c65640000eb0210000f0000002f1c11000400000044656c656761746564556e64656c6567617465645665746f65640000f6081100090000000408110004000000e00210000b000000426c6f636b4e756d6265725265666572656e64756d496e646578566f74655468726573686f6c6450726f70496e64657844656d6f637261637920566f74654f6644656d6f63726163792050726f787944656d6f63726163792044656c65676174696f6e7344656d6f6372616379205265666572656e64756d496e666f4f6644656d6f6372616379204465706f7369744f6644656d6f6372616379204c6173745461626c656457617345787465726e616c44656d6f6372616379204e65787454616c6c7944656d6f6372616379205265666572656e64756d436f756e7444656d6f6372616379204469737061746368517565756544656d6f637261637920566f74657273466f7268656164206f662044656d6f63726163792044656c65676174696f6e7344656d6f6372616379204e65787445787465726e616c4e6f2065787465726e616c2070726f706f73616c2077616974696e6743616e6e6f7420696e6a6563742061207265666572656e64756d207468617420656e6473206561726c696572207468616e2070726563656564696e67207265666572656e64756d44656d6f6372616379205075626c696350726f7073000000c0041000480000008d0a00000e0000004e6f207075626c69632070726f706f73616c732077616974696e67002f72757374632f343030623430396566633439373561303832313835633561373434313235373265343964666439382f7372632f6c6962636f72652f736c6963652f6d6f642e727300000000c00d11000700000000000000c8071000020000000000000000000000f80710000600000000000000000000002808100006000000000000003008100001000000000000000000000048081000060000000000000000000000180e1100040000000000000078081000020000000000000000000000a8081000070000000000000000000000e00810000a0000000000000078081000020000000000000000000000ec0810000700000000000000000000002409100011000000000000003809100004000000000000000000000098091000060000000000000000000000c80910001000000000000000d8091000010000000000000000000000f0091000020000000000000000000000000a100010000000000000006cec1000010000000000000000000000100a1000020000000000000000000000200a100019000000000000006cec10000100000000000000000000003c0a10000200000000000000000000004c0a10000d000000000000005c0a1000010000000000000000000000740a10000100000000000000000000007c0a10001100000000000000900a1000010000000000000000000000a80a1000010000000000000000000000b00a10000d00000000000000c00a1000030000000000000000000000080b1000010000000000000000000000100b100009000000000000001c0b1000010000000000000000000000340b10000500000000000000000000005c0b10000c0000000000000028431100000000000000000000000000680b1000050000000000000000000000900b10000c000000000000001c0b10000100000000000000000000009c0b1000050000000000000000000000c40b10000800000000000000cc0b1000020000000000000000000000fc0b1000050000000000000000000000240c10000a0000000000000028431100000000000000000000000000300c1000050000000000000000000000fc0e1100080000000000000026ee100010000000000000008efd100005000000000000004cfc10001500000008111000280000002843110000000000d31911000b000000de191100080000004211100020000000fc1911000c0000007365636f6e64000000000000fc0e11000800000000000000301110001200000008111000280000002843110000000000d31911000b000000de19110008000000dc36100010000000fc1911000c00000000000000670d100009000000000000003a0d10001800000000000000180e110004000000000000000411100004000000881010004d000000d51010002f0000002843110000000000d31911000b000000de19110008000000691010001f000000fc1911000c00000070726f78795f766f74650000d70f1000540000002b1010003e0000002843110000000000d31911000b000000de19110008000000691010001f000000fc1911000c000000656d657267656e63795f70726f706f736500000000000000fc0e1100080000000000000026ee100010000000000000007f0f11000900000000000000fa0210000d00000000000000c50f10000d00000000000000e30011000e00000000000000d20f10000500000000000000e30011000e000000c60e1000220000002843110000000000e80e100058000000400f1000460000002843110000000000860f10003f000000656d657267656e63795f63616e63656c00000000670d10000900000000000000eb0210000f000000720e100054000000660e10000c00000065787465726e616c5f70726f706f73651a0e10004c000000660e10000c00000065787465726e616c5f70726f706f73655f6d616a6f72697479000000ac0d100056000000020e1000180000007665746f5f65787465726e616c000000000000009f0d10000d00000000000000040f110007000000700d10002f00000063616e63656c5f7265666572656e64756d00000000000000670d100009000000000000003a0d100018000000520d10001500000063616e63656c5f717565756564000000000000002d0d100004000000000000006dfc10001700000000000000310d10000500000000000000266810000c00000000000000360d100004000000000000003a0d100018000000050d1000280000007365745f70726f787900000000000000000d10000500000000000000561c11000c000000da0c1000260000002843110000000000d31911000b000000e619110016000000fc1911000c00000072657369676e5f70726f7879b40c1000260000002843110000000000d31911000b000000e3fb100010000000fc1911000c00000072656d6f76655f70726f78798e0c1000260000002843110000000000d31911000b000000e3fb100010000000fc1911000c00000064656c656761746500000000780c10000200000000000000561c11000c000000000000007a0c10000a00000000000000840c10000a000000690c10000f0000002843110000000000d31911000b000000e619110016000000fc1911000c000000756e64656c65676174650000580c1000110000002843110000000000d31911000b000000de19110008000000fc1911000c00000020556e64656c656761746520766f74652e2044656c656761746520766f74652e746f636f6e76696374696f6e436f6e76696374696f6e20436c656172207468652070726f78792e2043616c6c6564206279207468652073746173682e20436c656172207468652070726f78792e2043616c6c6564206279207468652070726f78792e205370656369667920612070726f78792e2043616c6c6564206279207468652073746173682e70726f78792043616e63656c20612070726f706f73616c2071756575656420666f7220656e6163746d656e742e7768656e776869636877686174436f6d706163743c5265666572656e64756d496e6465783e2052656d6f76652061207265666572656e64756d2e7265665f696e646578205665746f20616e6420626c61636b6c697374207468652065787465726e616c2070726f706f73616c20686173682e70726f706f73616c5f68617368205363686564756c652061206d616a6f726974792d63617272696573207265666572656e64756d20746f206265207461626c6564206e657874206f6e6365206974206973206c6567616c20746f207363686564756c6520616e2065787465726e616c207265666572656e64756d2e205363686564756c652061207265666572656e64756d20746f206265207461626c6564206f6e6365206974206973206c6567616c20746f207363686564756c6520616e2065787465726e616c207265666572656e64756d2e205363686564756c6520616e20656d657267656e63792063616e63656c6c6174696f6e206f662061207265666572656e64756d2e2043616e6e6f742068617070656e20747769636520746f207468652073616d65205363686564756c6520616e20656d657267656e6379207265666572656e64756d2e20546869732077696c6c206372656174652061206e6577207265666572656e64756d20666f7220746865206070726f706f73616c602c20617070726f766564206173206c6f6e6720617320636f756e74656420766f7465732065786365656420607468726573686f6c646020616e642c20696620617070726f7665642c20656e61637465642061667465722074686520676976656e206064656c6179602e204974206d61792062652063616c6c65642066726f6d206569746865722074686520526f6f74206f722074686520456d657267656e6379206f726967696e2e766f74696e675f706572696f6464656c617920566f746520696e2061207265666572656e64756d206f6e20626568616c66206f6620612073746173682e2049662060766f74652e69735f6179652829602c2074686520766f746520697320746f20656e616374207468652070726f706f73616c3b20206f7468657277697365206974206973206120766f746520746f206b65657020746865207374617475732071756f2e202d204f6e65204442206368616e67652c206f6e6520444220656e7472792e20566f746520696e2061207265666572656e64756d2e2049662060766f74652e69735f6179652829602c2074686520766f746520697320746f20656e616374207468652070726f706f73616c3b206f7468657277697365206974206973206120766f746520746f206b65657020746865207374617475732071756f2e566f74652050726f706f736520612073656e73697469766520616374696f6e20746f2062652074616b656e2e436f6d706163743c50726f70496e6465783e202d2054776f204442206368616e6765732c206f6e6520444220656e7472792e44656d6f63726163790000000000941610000f000000000000000000000007031000090000000000000000000000000000000000000000000000000000000000000028431100541710000000000000000000a416100001000000000000000100000000000000ac1610000b0000000000000000000000b71610002b0000000000000000000000000000000000000000000000000000000000000028431100101810000000000000000000e416100001000000000000000100000000000000ec161000090000000101000000000000070310000900000000000000f51610002100000000000000000000000000000000000000284311001817100000000000000000002817100001000000000000000000000000000000301710000f0000000000000000000000eb0210000f0000000000000000000000000000000000000000000000000000000000000028431100541710000000000000000000401710000100000000000000010000000000000048171000090000000000000000000000eb0210000f000000000000000000000000000000000000000000000000000000000000002843110054171000000000000000000064171000010000000000000001000000000000006c171000100000000101000000000000eb0210000f000000000000007c1710002d0000000000000000000000000000000000000028431100881810000000000000000000ac17100001000000000000000000000000000000b41710000d0000000101000000000000e30011000e00000000000000c11710002b0000000000000000000000000000000000000028431100ec1710000000000000000000fc1710000100000000000000010000000000000004181000090000000101000000000000eb0210000f00000000000000ea1b11001100000000000000000000000000000000000000284311001018100000000000000000002018100001000000000000000100000000000000281810000600000001010000000000002e1810001f0000000000000004111000040000000000000000000000000000000000000028431100501810000000000000000000601810000400000000000000010000000000000080181000050000000101000000000000561c11000c00000000000000561c11000c00000000000000000000000000000000000000284311008818100000000000000000009818100002000000000000000000000000000000a81810000b0000000101010000000000561c11000c00000000000000b31810001a0000000000000000000000000000000000000028431100d01810000000000000000000e018100001000000000000000100000000000000e81810001500000000000000000000002f1c1100040000000000000000000000000000000000000000000000000000000000000028431100c419100000000000000000000019100002000000000000000100000000000000101910000c00000000000000000000001c1910001c0000000000000000000000000000000000000000000000000000000000000028431100381910000000000000000000481910000400000000000000000000000000000068191000090000000101000000000000040f1100070000000000000071191000230000000000000000000000000000000000000028431100941910000000000000000000a419100002000000000000000000000000000000b41910000d0000000101000000000000040f110007000000000000002f1c1100040000000000000000000000000000000000000028431100c41910000000000000000000d41910000100000000000000010000005075626c696350726f70436f756e7400441f10003d0000005075626c696350726f70735665633c2850726f70496e6465782c20543a3a50726f706f73616c2c20543a3a4163636f756e744964293e0000241f1000200000004465706f7369744f662842616c616e63654f663c543e2c205665633c543a3a4163636f756e7449643e29000032000000000000000100000033000000031f1000210000005265666572656e64756d436f756e7400b71e10004c0000004e65787454616c6c7900000032000000000000000100000034000000851e1000320000005265666572656e64756d496e666f4f66285265666572656e64756d496e666f3c543a3a426c6f636b4e756d6265722c20543a3a50726f706f73616c3e29000000581e10002d000000446973706174636851756575655665633c4f7074696f6e3c28543a3a50726f706f73616c2c205265666572656e64756d496e646578293e3e32000000000000000100000035000000281e100030000000566f74657273466f7200000032000000000000000100000035000000ff1d100029000000566f74654f66285265666572656e64756d496e6465782c20543a3a4163636f756e7449642900000032000000000000000100000036000000c01c100058000000181d1000530000006b1d100057000000c21d10003d00000050726f787900000032000000000000000100000036000000521c10004c0000009e1c10002200000044656c65676174696f6e7328543a3a4163636f756e7449642c20436f6e76696374696f6e2900000032000000000000000100000037000000021c1000500000004c6173745461626c656457617345787465726e616c000000a21b100056000000f81b10000a0000004e65787445787465726e616c28543a3a50726f706f73616c2c20566f74655468726573686f6c642932000000000000000100000038000000b41a1000560000000a1b1000550000005f1b100029000000881b10001a000000426c61636b6c69737428543a3a426c6f636b4e756d6265722c205665633c543a3a4163636f756e7449643e2932000000000000000100000033000000261a1000540000007a1a10003a00000043616e63656c6c6174696f6e7300000032000000000000000100000036000000dc1910004a000000205265636f7264206f6620616c6c2070726f706f73616c7320746861742068617665206265656e207375626a65637420746f20656d657267656e63792063616e63656c6c6174696f6e2e2041207265636f7264206f662077686f207665746f656420776861742e204d6170732070726f706f73616c206861736820746f206120706f737369626c65206578697374656e7420626c6f636b206e756d6265722028756e74696c207768656e206974206d6179206e6f742062652072657375626d69747465642920616e642077686f207665746f65642069742e20546865207265666572656e64756d20746f206265207461626c6564207768656e6576657220697420776f756c642062652076616c696420746f207461626c6520616e2065787465726e616c2070726f706f73616c2e20546869732068617070656e73207768656e2061207265666572656e64756d206e6565647320746f206265207461626c656420616e64206f6e65206f662074776f20636f6e646974696f6e7320617265206d65743a202d20604c6173745461626c656457617345787465726e616c60206973206066616c7365603b206f72202d20605075626c696350726f70736020697320656d7074792e205472756520696620746865206c617374207265666572656e64756d207461626c656420776173207375626d69747465642065787465726e616c6c792e2046616c7365206966206974207761732061207075626c69632070726f706f73616c2e2047657420746865206163636f756e742028616e64206c6f636b20706572696f64732920746f20776869636820616e6f74686572206163636f756e742069732064656c65676174696e6720766f74652e2057686f2069732061626c6520746f20766f746520666f722077686f6d2e2056616c7565206973207468652066756e642d686f6c64696e67206163636f756e742c206b65792069732074686520766f74652d7472616e73616374696f6e2d73656e64696e67206163636f756e742e204765742074686520766f746520696e206120676976656e207265666572656e64756d206f66206120706172746963756c617220766f7465722e2054686520726573756c74206973206d65616e696e6766756c206f6e6c792069662060766f746572735f666f726020696e636c756465732074686520766f746572207768656e2063616c6c6564207769746820746865207265666572656e64756d2028796f75276c6c20676574207468652064656661756c742060566f7465602076616c7565206f7468657277697365292e20496620796f7520646f6e27742077616e7420746f20636865636b2060766f746572735f666f72602c207468656e20796f752063616e20616c736f20636865636b20666f722073696d706c65206578697374656e636520776974682060566f74654f663a3a657869737473602066697273742e204765742074686520766f7465727320666f72207468652063757272656e742070726f706f73616c2e205175657565206f66207375636365737366756c207265666572656e646120746f20626520646973706174636865642e20496e666f726d6174696f6e20636f6e6365726e696e6720616e7920676976656e207265666572656e64756d2e20546865206e657874207265666572656e64756d20696e64657820746861742073686f756c642062652074616c6c6965642e20546865206e6578742066726565207265666572656e64756d20696e6465782c20616b6120746865206e756d626572206f66207265666572656e6461207374617274656420736f206661722e2054686f73652077686f2068617665206c6f636b65642061206465706f7369742e20546865207075626c69632070726f706f73616c732e20556e736f727465642e20546865206e756d626572206f6620287075626c6963292070726f706f73616c7320746861742068617665206265656e206d61646520736f206661722e000000703b1100280000009c1f1000440000003f010000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f64656d6f63726163792f7372632f6c69622e72739c1f1000440000003f0100000100000076616c756520746f6f206c6f7770726f706f73657227732062616c616e636520746f6f206c6f7744656d6f6372616379205075626c696350726f70436f756e7463616e206f6e6c79207365636f6e6420616e206578697374696e672070726f706f73616c7365636f6e64657227732062616c616e636520746f6f206c6f7744656d6f63726163792043616e63656c6c6174696f6e7370726f706f73616c207374696c6c20626c61636b6c697374656470726f706f73616c20616c7265616479206d6164656964656e74697479206d6179206e6f74207665746f20612070726f706f73616c20747769636544656d6f637261637920426c61636b6c6973746e6f2065787465726e616c2070726f706f73616c756e6b6e6f776e2070726f706f73616c616c726561647920612070726f787977726f6e672070726f78796e6f742064656c65676174656470726f706f73616c206e6f7420666f756e64756e6b6e6f776e20696e64657863616e6e6f742063616e63656c207468652073616d652070726f706f73616c207477696365766f746520676976656e20666f7220696e76616c6964207265666572656e64756d2e00000000000024221000060000000000000074f510000100000000000000000000002c221000010000000000000000000000342210000e000000000000004422100002000000000000000000000054221000020000000000000000000000642210000c00000000000000e8581000020000000000000000000000702210000100000000000000526577617264000056231000380000004f66666c696e655761726e696e670000f608110009000000821c110003000000c12210005200000013231000430000004f66666c696e65536c6173687822100049000000204f6e652076616c696461746f722028616e6420697473206e6f6d696e61746f72732920686173206265656e20736c61736865642062792074686520676976656e20616d6f756e742e204f6e652076616c696461746f722028616e6420697473206e6f6d696e61746f72732920686173206265656e20676976656e20616e206f66666c696e652d7761726e696e6720286974206973207374696c6c2077697468696e20697473206772616365292e205468652061636372756564206e756d626572206f6620736c6173686573206973207265636f726465642c20746f6f2e20416c6c2076616c696461746f72732068617665206265656e2072657761726465642062792074686520676976656e2062616c616e63652e5374616b696e6720426f6e6465645374616b696e67204e6f6d696e61746f72735374616b696e672056616c696461746f72735374616b696e67204c65646765720000000000000c26100004000000000000001026100003000000000000000000000058261000110000000000000000000000e02610000a00000000000000ec261000010000000000000000000000042710000c00000000000000000000006427100006000000000000006c271000010000000000000000000000842710001700000000000000000000003c28100011000000000000002843110000000000000000000000000050281000100000000000000000000000d02810000800000000000000d8281000010000000000000000000000f02810000b000000000000000000000048291000080000000000000050291000010000000000000000000000682910000b0000000000000000000000c0291000050000000000000028431100000000000000000000000000c82910000b0000000000000000000000202a100009000000000000002c2a1000010000000000000000000000442a10000b00000000000000000000009c2a10000e00000000000000ac2a1000010000000000000000000000c42a10000b00000000000000000000001c2b10001300000000000000302b1000010000000000000000000000482b1000010000000000000000000000502b10000d0000000000000028431100000000000000000000000000602b1000080000000000000000000000a02b10001700000000000000302b1000010000000000000000000000b82b1000010000000000000000000000c02b10001100000000000000d42b1000010000000000000000000000ec2b10000100000000000000626f6e6400000000cf2e10000a000000000000009efd100023000000000000008efd100005000000000000004cfc100015000000000000002e2f10000500000000000000332f100011000000bf37100059000000183810002200000028431100000000003a381000490000002843110000000000d31911000b0000008338100035000000de19110008000000b83810001a0000002843110000000000d23810005b0000002d3910004900000028431100000000007639100041000000b739100069000000203a10005a000000fc1911000c000000626f6e645f6578747261000000000000b13710000e000000000000004cfc100015000000f6361000590000004f3710000e00000028431100000000005d371000540000002843110000000000e82d1000550000002843110000000000d31911000b0000003d2e10003a000000de19110008000000dc36100010000000fc1911000c000000756e626f6e640000000000008efd100005000000000000004cfc10001500000007331000550000005c331000400000009c3310004d0000002843110000000000e9331000520000003b3410003000000028431100000000006b3410004f000000ba3410004f000000093510003f0000002843110000000000d92e100055000000284311000000000048351000260000002843110000000000d31911000b0000006e35100050000000772e100026000000be35100059000000173610005c0000007336100069000000dc36100010000000ec3610000a00000077697468647261775f756e626f6e646564000000fe3010004b0000002843110000000000493110004d00000096311000130000002843110000000000d92e1000550000002843110000000000a93110001b0000002843110000000000d31911000b000000c43110006000000024321000520000007632100033000000a93210005e0000009d2e100032000000fc1911000c00000076616c696461746500000000dd3010000500000000000000e23010001c000000a33010003a0000002843110000000000b12d1000370000002843110000000000d92e1000550000002843110000000000d31911000b0000003d2e10003a000000772e1000260000009d2e100032000000fc1911000c0000006e6f6d696e617465000000007430100007000000000000007b301000280000008b2f1000440000002843110000000000b12d1000370000002843110000000000d92e1000550000002843110000000000d31911000b000000cf2f10004900000018301000260000003e30100036000000fc1911000c0000006368696c6c000000442f1000320000002843110000000000b12d1000370000002843110000000000d92e1000550000002843110000000000d31911000b0000003d2e10003a000000762f1000150000009d2e100032000000fc1911000c0000007365745f7061796565000000000000002e2f10000500000000000000332f100011000000832d10002e0000002843110000000000b12d1000370000002843110000000000d92e1000550000002843110000000000d31911000b0000003d2e10003a000000772e1000260000009d2e100032000000fc1911000c0000007365745f636f6e74726f6c6c6572000000000000cf2e10000a000000000000009efd100023000000832d10002e0000002843110000000000b12d1000370000002843110000000000e82d1000550000002843110000000000d31911000b0000003d2e10003a000000772e1000260000009d2e100032000000fc1911000c0000007365745f76616c696461746f725f636f756e740000000000c5ed10000300000000000000266810000c000000632d100020000000666f7263655f6e65775f657261000000552c10004f000000a42c1000490000002843110000000000d31911000b000000988a100020000000ed2c100045000000322d100031000000fc1911000c0000007365745f6f66666c696e655f736c6173685f677261636500312c1000240000007365745f696e76756c6e657261626c657300000000000000272c10000a00000000000000ea1b110011000000f42b10003300000020536574207468652076616c696461746f72732077686f2063616e6e6f7420626520736c61736865642028696620616e79292e76616c696461746f72732053657420746865206f66666c696e6520736c61736820677261636520706572696f642e20466f72636520746865726520746f2062652061206e6577206572612e205468697320616c736f20666f726365732061206e65772073657373696f6e20696d6d6564696174656c792061667465722e20606170706c795f72657761726473602073686f756c64206265207472756520666f722076616c696461746f727320746f20676574207468652073657373696f6e207265776172642e202d205472696767657273207468652050687261676d656e20656c656374696f6e2e20457870656e7369766520627574206e6f7420757365722d636f6e74726f6c6c65642e202d20446570656e6473206f6e2073746174653a20604f287c65646765737c202a207c76616c696461746f72737c29602e2054686520696465616c206e756d626572206f662076616c696461746f72732e202852652d2973657420746865207061796d656e742074617267657420666f72206120636f6e74726f6c6c65722e20456666656374732077696c6c2062652066656c742061742074686520626567696e6e696e67206f6620746865206e657874206572612e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f206279207468652073746173682c206e6f742074686520636f6e74726f6c6c65722e202d20496e646570656e64656e74206f662074686520617267756d656e74732e20496e7369676e69666963616e7420636f6d706c65786974792e202d20436f6e7461696e732061206c696d69746564206e756d626572206f662072656164732e202d2057726974657320617265206c696d6974656420746f2074686520606f726967696e60206163636f756e74206b65792e636f6e74726f6c6c657220546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2062792074686520636f6e74726f6c6c65722c206e6f74207468652073746173682e706179656552657761726444657374696e6174696f6e204465636c617265206e6f2064657369726520746f206569746865722076616c6964617465206f72206e6f6d696e6174652e202d20436f6e7461696e73206f6e6520726561642e204465636c617265207468652064657369726520746f206e6f6d696e6174652060746172676574736020666f7220746865206f726967696e20636f6e74726f6c6c65722e202d20546865207472616e73616374696f6e277320636f6d706c65786974792069732070726f706f7274696f6e616c20746f207468652073697a65206f66206074617267657473602c2077686963682069732063617070656420617420604d41585f4e4f4d494e4154494f4e53602e202d20426f74682074686520726561647320616e642077726974657320666f6c6c6f7720612073696d696c6172207061747465726e2e746172676574735665633c3c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263653e204465636c617265207468652064657369726520746f2076616c696461746520666f7220746865206f726967696e20636f6e74726f6c6c65722e707265667356616c696461746f7250726566733c42616c616e63654f663c543e3e2052656d6f766520616e7920756e6c6f636b6564206368756e6b732066726f6d207468652060756e6c6f636b696e67602071756575652066726f6d206f7572206d616e6167656d656e742e205468697320657373656e7469616c6c7920667265657320757020746861742062616c616e636520746f206265207573656420627920746865207374617368206163636f756e7420746f20646f2077686174657665722069742077616e74732e2053656520616c736f205b6043616c6c3a3a756e626f6e64605d2e202d20436f756c6420626520646570656e64656e74206f6e2074686520606f726967696e6020617267756d656e7420616e6420686f77206d7563682060756e6c6f636b696e6760206368756e6b732065786973742e20497420696d706c69657320202060636f6e736f6c69646174655f756e6c6f636b656460207768696368206c6f6f7073206f76657220604c65646765722e756e6c6f636b696e67602c20776869636820697320696e6469726563746c79202020757365722d636f6e74726f6c6c65642e20536565205b60756e626f6e64605d20666f72206d6f72652064657461696c2e202d20436f6e7461696e732061206c696d69746564206e756d626572206f662072656164732c20796574207468652073697a65206f6620776869636820636f756c64206265206c61726765206261736564206f6e20606c6564676572602e205363686564756c65206120706f7274696f6e206f662074686520737461736820746f20626520756e6c6f636b656420726561647920666f72207472616e73666572206f75742061667465722074686520626f6e6420706572696f6420656e64732e2049662074686973206c656176657320616e20616d6f756e74206163746976656c7920626f6e646564206c657373207468616e20543a3a43757272656e63793a3a6578697374656e7469616c5f6465706f73697428292c207468656e20697420697320696e6372656173656420746f207468652066756c6c20616d6f756e742e204f6e63652074686520756e6c6f636b20706572696f6420697320646f6e652c20796f752063616e2063616c6c206077697468647261775f756e626f6e6465646020746f2061637475616c6c79206d6f7665207468652066756e6473206f7574206f66206d616e6167656d656e7420726561647920666f72207472616e736665722e204e6f206d6f7265207468616e2061206c696d69746564206e756d626572206f6620756e6c6f636b696e67206368756e6b73202873656520604d41585f554e4c4f434b494e475f4348554e4b5360292063616e20636f2d657869737473206174207468652073616d652074696d652e20496e207468617420636173652c205b6043616c6c3a3a77697468647261775f756e626f6e646564605d206e65656420746f2062652063616c6c656420666972737420746f2072656d6f766520736f6d65206f6620746865206368756e6b732028696620706f737369626c65292e2053656520616c736f205b6043616c6c3a3a77697468647261775f756e626f6e646564605d2e202d20496e646570656e64656e74206f662074686520617267756d656e74732e204c696d697465642062757420706f74656e7469616c6c79206578706c6f697461626c6520636f6d706c65786974792e202d20456163682063616c6c20287265717569726573207468652072656d61696e646572206f662074686520626f6e6465642062616c616e636520746f2062652061626f766520606d696e696d756d5f62616c616e6365602920202077696c6c2063617573652061206e657720656e74727920746f20626520696e73657274656420696e746f206120766563746f722028604c65646765722e756e6c6f636b696e676029206b65707420696e2073746f726167652e202020546865206f6e6c792077617920746f20636c65616e207468652061666f72656d656e74696f6e65642073746f72616765206974656d20697320616c736f20757365722d636f6e74726f6c6c656420766961206077697468647261775f756e626f6e646564602e202d204f6e6520444220656e7472792e203c2f7765696768743e2041646420736f6d6520657874726120616d6f756e742074686174206861766520617070656172656420696e207468652073746173682060667265655f62616c616e63656020696e746f207468652062616c616e636520757020666f7220207374616b696e672e20557365207468697320696620746865726520617265206164646974696f6e616c2066756e647320696e20796f7572207374617368206163636f756e74207468617420796f75207769736820746f20626f6e642e6d61785f6164646974696f6e616c2054616b6520746865206f726967696e206163636f756e74206173206120737461736820616e64206c6f636b207570206076616c756560206f66206974732062616c616e63652e2060636f6e74726f6c6c6572602077696c6c2062652074686520206163636f756e74207468617420636f6e74726f6c732069742e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f20627920746865207374617368206163636f756e742e202d20496e646570656e64656e74206f662074686520617267756d656e74732e204d6f64657261746520636f6d706c65786974792e202d20546872656520657874726120444220656e74726965732e204e4f54453a2054776f206f66207468652073746f726167652077726974657320286053656c663a3a626f6e646564602c206053656c663a3a7061796565602920617265205f6e657665725f20636c65616e656420756e6c6573732074686520606f726967696e602066616c6c732062656c6f77205f6578697374656e7469616c206465706f7369745f20616e6420676574732072656d6f76656420617320647573742e204e4f54453a20417420746865206d6f6d656e742c20746865726520617265206e6f2066696e616e6369616c207265737472696374696f6e7320746f20626f6e6420287768696368206372656174657320612062756e6368206f662073746f72616765206974656d7320666f7220616e206163636f756e74292e20496e20657373656e63652c206e6f7468696e672070726576656e7473206d616e79206163636f756e74732066726f6d207370616d6d696e6720605374616b696e67602073746f7261676520627920626f6e64696e67203120554e49542e20536565207465737420636173653a2060626f6e645f776974685f6e6f5f7374616b65645f76616c7565602e5374616b696e675374616b696e6720496e76756c6e657261626c65735374616b696e6720536c617368436f756e745374616b696e67204f66666c696e65536c61736847726163655374616b696e6720526563656e746c794f66666c696e6576206973206e6f6e2d656d7074793b2071656400203b1000480000008d0a00000e0000005374616b696e67204f66666c696e65536c6173685374616b696e67205374616b657273002f72757374632f343030623430396566633439373561303832313835633561373434313235373265343964666439382f7372632f6c6962636f72652f736c6963652f6d6f642e727300000000484210000e0000000000000000000000821c1100030000000000000000000000000000000000000000000000000000000000000028431100c04410000000000000000000584210000100000000000000010000000000000060421000150000000000000000000000821c11000300000000000000000000000000000000000000000000000000000000000000284311007842100000000000000000008842100001000000000000000100000000000000904210000d00000000000000000000009d421000070000000000000000000000000000000000000000000000000000000000000028431100a44210000000000000000000b442100001000000000000000100000000000000642210000c00000000000000000000009d421000070000000000000000000000000000000000000000000000000000000000000028431100bc4210000000000000000000cc42100001000000000000000100000000000000d4421000110000000000000000000000821c1100030000000000000000000000000000000000000000000000000000000000000028431100c04410000000000000000000e842100001000000000000000100000000000000f04210000d0000000000000000000000ea1b1100110000000000000000000000000000000000000000000000000000000000000028431100184510000000000000000000004310000300000000000000010000000000000018431000060000000101000000000000561c11000c00000000000000561c11000c0000000000000000000000000000000000000028431100584310000000000000000000204310000100000000000000000000000000000028431000060000000101000000000000561c11000c000000000000002e431000290000000000000000000000000000000000000028431100584310000000000000000000684310000100000000000000000000000000000070431000050000000101000000000000561c11000c00000000000000332f10001100000000000000000000000000000000000000284311007843100000000000000000008843100001000000000000000100000000000000e01b11000a0000000101010000000000561c11000c00000000000000e23010001c0000000000000000000000000000000000000028431100904310000000000000000000a043100001000000000000000100000000000000a84310000a0000000101010000000000561c11000c00000000000000ea1b1100110000000000000000000000000000000000000028431100184510000000000000000000b443100001000000000000000100000000000000bc431000070000000101000000000000561c11000c00000000000000c3431000240000000000000000000000000000000000000028431100e84310000000000000000000f843100004000000000000000100000000000000184410000e0000000000000000000000ea1b11001100000000000000000000000000000000000000000000000000000000000000284311001845100000000000000000002844100001000000000000000100000000000000304410000a00000000000000000000003a441000080000000000000000000000000000000000000000000000000000000000000028431100c0441000000000000000000044441000010000000000000001000000000000004c441000140000000000000000000000c30011000c00000000000000000000000000000000000000000000000000000000000000284311008c4410000000000000000000b44210000100000000000000010000000000000060441000100000000000000000000000c30011000c00000000000000000000000000000000000000000000000000000000000000284311008c4410000000000000000000704410000200000000000000010000000000000080441000090000000000000000000000c30011000c00000000000000000000000000000000000000000000000000000000000000284311008c44100000000000000000009c44100003000000000000000100000000000000b44410000a0000000101000000000000561c11000c00000000000000821c1100030000000000000000000000000000000000000028431100c04410000000000000000000d044100002000000000000000100000000000000e04410000f0000000000000000000000ef4410002800000000000000000000000000000000000000000000000000000000000000284311001845100000000000000000002845100002000000000000000100000000000000384510000b00000000000000000000002f1c11000400000000000000000000000000000000000000000000000000000000000000284311004445100000000000000000005445100001000000000000000100000056616c696461746f72436f756e740000314c10002a0000004d696e696d756d56616c696461746f72436f756e7400000032000000000000000100000039000000e14b10005000000053657373696f6e52657761726450657262696c6c3200000000000000010000003a000000994b1000480000003200000000000000010000003b000000454b1000540000004f66666c696e65536c6173684772616365000000f74a10004e000000496e76756c6e657261626c6573000000234a100056000000794a100053000000cc4a10002b000000426f6e6465640000e3491000400000004c65646765725374616b696e674c65646765723c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e0032000000000000000100000036000000924910005100000050617965650000003200000000000000010000003600000059491000390000003200000000000000010000003c00000008491000510000004e6f6d696e61746f72730000af481000590000005374616b6572734578706f737572653c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e003200000000000000010000003d000000f247100053000000454810004600000028431100000000008b4810002400000043757272656e74456c65637465640000b34710003f00000043757272656e74457261457261496e64657800009c4710001700000043757272656e7453657373696f6e52657761726443757272656e744572615265776172640f471000560000006547100037000000536c6f745374616b650000003200000000000000010000003e000000934610004c0000002843110000000000df46100030000000536c617368436f756e740000320000000000000001000000340000001f46100057000000764610001d000000526563656e746c794f66666c696e655665633c28543a3a4163636f756e7449642c20543a3a426c6f636b4e756d6265722c20753332293e0032000000000000000100000035000000a345100055000000f845100027000000466f7263654e657745726100320000000000000001000000360000005c45100047000000205472756520696620746865206e6578742073657373696f6e206368616e67652077696c6c2062652061206e657720657261207265676172646c657373206f6620696e6465782e204d6f737420726563656e742060524543454e545f4f46464c494e455f434f554e546020696e7374616e6365732e202857686f206974207761732c207768656e20697420776173207265706f727465642c20686f77206d616e7920696e7374616e63657320746865792077657265206f66666c696e6520666f72292e20546865206e756d626572206f662074696d6573206120676976656e2076616c696461746f7220686173206265656e207265706f72746564206f66666c696e652e205468697320676574732064656372656d656e746564206279206f6e652065616368206572612074686174207061737365732e2054686520616d6f756e74206f662062616c616e6365206163746976656c79206174207374616b6520666f7220656163682076616c696461746f7220736c6f742c2063757272656e746c792e2054686973206973207573656420746f20646572697665207265776172647320616e642070756e6973686d656e74732e2054686520616363756d756c617465642072657761726420666f72207468652063757272656e74206572612e20526573657420746f207a65726f2061742074686520626567696e6e696e67206f66207468652065726120616e6420696e6372656173656420666f72206576657279207375636365737366756c6c792066696e69736865642073657373696f6e2e205468652063757272656e742065726120696e6465782e205468652063757272656e746c7920656c65637465642076616c696461746f7220736574206b65796564206279207374617368206163636f756e742049442e204e6f6d696e61746f727320666f72206120706172746963756c6172206163636f756e74207468617420697320696e20616374696f6e207269676874206e6f772e20596f752063616e27742069746572617465207468726f7567682076616c696461746f727320686572652c2062757420796f752063616e2066696e64207468656d20696e207468652053657373696f6e206d6f64756c652e2054686973206973206b6579656420627920746865207374617368206163636f756e742e20546865206d61702066726f6d206e6f6d696e61746f72207374617368206b657920746f2074686520736574206f66207374617368206b657973206f6620616c6c2076616c696461746f727320746f206e6f6d696e6174652e20546865206d61702066726f6d202877616e6e616265292076616c696461746f72207374617368206b657920746f2074686520707265666572656e636573206f6620746861742076616c696461746f722e2057686572652074686520726577617264207061796d656e742073686f756c64206265206d6164652e204b657965642062792073746173682e204d61702066726f6d20616c6c2028756e6c6f636b6564292022636f6e74726f6c6c657222206163636f756e747320746f2074686520696e666f20726567617264696e6720746865207374616b696e672e204d61702066726f6d20616c6c206c6f636b65642022737461736822206163636f756e747320746f2074686520636f6e74726f6c6c6572206163636f756e742e20416e792076616c696461746f72732074686174206d6179206e6576657220626520736c6173686564206f7220666f726369626c79206b69636b65642e20497427732061205665632073696e63652074686579277265206561737920746f20696e697469616c697a6520616e642074686520706572666f726d616e636520686974206973206d696e696d616c2028776520657870656374206e6f206d6f7265207468616e20666f757220696e76756c6e657261626c65732920616e64207265737472696374656420746f20746573746e6574732e204e756d626572206f6620696e7374616e636573206f66206f66666c696e65207265706f727473206265666f726520736c617368696e6720626567696e7320666f722076616c696461746f72732e20536c6173682c207065722076616c696461746f7220746861742069732074616b656e20666f72207468652066697273742074696d6520746865792061726520666f756e6420746f206265206f66666c696e652e204d6178696d756d207265776172642c207065722076616c696461746f722c20746861742069732070726f7669646564207065722061636365707461626c652073657373696f6e2e204d696e696d756d206e756d626572206f66207374616b696e67207061727469636970616e7473206265666f726520656d657267656e637920636f6e646974696f6e732061726520696d706f7365642e2054686520696465616c206e756d626572206f66207374616b696e67207061727469636970616e74732e5374616b696e672043757272656e7453657373696f6e5265776172645374616b696e672043757272656e744572615265776172645374616b696e6720466f7263654e65774572615374616b696e672043757272656e74456c6563746564804e100019000000a04e100048000000bb0100002d0000005374616b696e6720536c6f745374616b655374616b696e672043757272656e744572615374616b696e672056616c696461746f72436f756e745374616b696e67204d696e696d756d56616c696461746f72436f756e7468656164206f66205374616b696e672056616c696461746f727368656164206f66205374616b696e67204e6f6d696e61746f727300003f000000280000000400000040000000410000000000000000000000420000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005374616b696e672053657373696f6e5265776172645374616b696e6720506179656500000000000000000000617474656d707420746f20646976696465206279207a65726f000000000000002f72757374632f343030623430396566633439373561303832313835633561373434313235373265343964666439382f7372632f6c6962636f72652f6f70732f61726974682e7273703b110028000000004f10004200000060020000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f7374616b696e672f7372632f6c69622e72730000004f1000420000006002000001000000636f6e74726f6c6c657220616c726561647920706169726564737461736820616c726561647920626f6e6465646e6f74206120636f6e74726f6c6c65726e6f74206120737461736863616e206e6f74207363686564756c65206d6f726520756e6c6f636b206368756e6b73756e7374616b65207468726573686f6c6420746f6f206c617267650a09090909090909096865616420697320736574207768656e20666972737420656c656d656e7420697320696e73657274656420616e6420756e736574207768656e206c61737420656c656d656e742069732072656d6f7665643b0a09090909090909096966206865616420697320536f6d65207468656e20697420706f696e747320746f206578697374696e67206b65793b207165640a09090909090909746172676574732063616e6e6f7420626520656d7074794c696e6b616765206973207570646174656420696e206361736520656e7472792069732072656d6f7665643b20697420616c7761797320706f696e747320746f206578697374696e67206b6579733b2071656400a051100048000000b801000023000000a051100048000000b901000023000000795110001c0000005444110018000000ec0300000d0000003051100049000000870200001d000000000000002f72757374632f343030623430396566633439373561303832313835633561373434313235373265343964666439382f7372632f6c6962636f72652f736c6963652f736f72742e7273617373657274696f6e206661696c65643a206d6964203c3d206c656e00000000000000000000002f72757374632f343030623430396566633439373561303832313835633561373434313235373265343964666439382f7372632f6c6962636f72652f736c6963652f6d6f642e727330511000490000009d0000003a0000003051100049000000a40000003000000054696d657374616d702055706461746554696d657374616d7020526563656e7448696e74730000004852100031000000795210004b000000790000000400000046696e616c2068696e74206d7573742062652075706461746564206f6e6c79206f6e636520696e2074686520626c6f636b2f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f66696e616c6974792d747261636b65722f7372632f6c69622e7273dc52100023000000795210004b0000007a0000000400000046696e616c697a6564206865696768742061626f766520626c6f636b206e756d626572002f72757374632f343030623430396566633439373561303832313835633561373434313235373265343964666439382f7372632f6c6962636f72652f736c6963652f6d6f642e72734765747320616e64206465636f6465732066696e616c206e756d62657220696e686572656e74206461746154696d657374616d7020496e697469616c697a656454696d657374616d70204f72646572656448696e747354696d657374616d70204d656469616e54696d657374616d702057696e646f7753697a65616c77617973206174206c65617374206f6e6520726563656e742073616d706c653b20716564726563656e7420616e64206f72646572656420636f6e7461696e207468652073616d65206974656d733b2071656400005754100043000000795210004b000000b2000000040000000053100048000000870a00000a00000054696d657374616d70205265706f72744c6174656e63797072756e696e672064696374617465642062792077696e646f775f73697a6520776869636820697320616c776179732073617475726174656420617420313b20716564000000000000c85410000a00000000000000d4541000010000000000000000000000ec541000020000000000000066696e616c5f68696e740000000000005972100004000000000000006dfc100017000000fc5410003d000000395510001b0000002048696e7420746861742074686520617574686f72206f66207468697320626c6f636b207468696e6b732074686520626573742066696e616c697a656420626c6f636b2069732074686520676976656e206e756d6265722e73746f72616765206973206e6f74206e756c6c2c207468657265666f7265206d75737420626520612076616c6964207479706576616c69646174696f6e206572726f7200b05510007c0000002c561000480000007a00000006000000657865632e7072656661625f6d6f64756c652e696e697469616c2063616e27742062652067726561746572207468616e20657865632e7072656661625f6d6f64756c652e6d6178696d756d3b0a09090909090974687573204d656d6f72793a3a6e6577206d757374206e6f74206661696c3b0a0909090909097165642f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f636f6e74726163742f7372632f7761736d2f6d6f642e727300000000245710000b0000000000000028a4100002000000000000000000000030571000010000000000000000000000385710001000000000000000ece6100001000000000000000000000048571000010000000000000000000000505710000c0000000000000064a410000100000000000000000000005c571000010000000000000000000000645710000e0000000000000074571000020000000000000000000000845710000100000000000000566f746572526561706564004058100015000000426164526561706572536c6173686564315810000f00000054616c6c7953746172746564f45710003d00000054616c6c7946696e616c697a65640000e65710000e000000e65710000e0000008c5710005a00000020412074616c6c792028666f7220617070726f76616c20766f746573206f6620636f756e63696c2073656174287329292068617320656e646564202877697468206f6e65206f72206d6f7265206e6577206d656d62657273292e5665633c4163636f756e7449643e20412074616c6c792028666f7220617070726f76616c20766f746573206f6620636f756e63696c2073656174287329292068617320737461727465642e20736c6173686564207265617065722072656170656420766f7465722c2072656170657200000000000000dc5810000a00000000000000e8581000020000000000000000000000f8581000010000000000000000000000005910000d00000000000000ece6100001000000000000000000000010591000010000000000000000000000f4a310000800000000000000185910000400000000000000000000003859100001000000000000004e65774163636f756e740000f6081100090000005bf6100007000000835910001b0000005265617065644163636f756e740000006c59100017000000f608110009000000f6081100090000005bf61000070000005bf6100007000000405910002c000000205472616e7366657220737563636565646564202866726f6d2c20746f2c2076616c75652c2066656573292e20416e206163636f756e7420776173207265617065642e2041206e6577206163636f756e742077617320637265617465642e416c69766520636f6e7472616374206f7220746f6d6273746f6e6520616c726561647920657869737473647572696e6720657865637574696f6e703b110028000000f05910004c0000005f000000080000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f636f6e74726163742f7372632f7761736d2f72756e74696d652e727376657374696e672062616c616e636520746f6f206869676820746f2073656e642076616c75656163636f756e74206c6971756964697479207265737472696374696f6e732070726576656e74207769746864726177616c62656e6566696369617279206163636f756e74206d757374207072652d6578697374746f6f2066657720667265652066756e647320696e206163636f756e747061796d656e7420776f756c64206b696c6c206163636f756e7442616c616e63657320546f74616c49737375616e636542616c616e636573204578697374656e7469616c4465706f73697442616c616e636573205472616e73616374696f6e4261736546656542616c616e636573205472616e73616374696f6e42797465466565436f756e63696c205265676973746572496e666f4f6642616c616e636573204672656542616c616e636542616c616e63657320526573657276656442616c616e6365436f756e63696c20416374697665436f756e63696c42616c616e636573204c6f636b73616c726561647920626f72726f776564616c7265616479206d757461626c7920626f72726f776564f05b10004300000055010000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f62616c616e6365732f7372632f6c69622e7273004c5c1000330000007f5c10004a000000ad00000005000000636f6e74726163742073756273797374656d20726573756c74696e6720696e20706f73697469766520696d62616c616e6365212f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f636f6e74726163742f7372632f6163636f756e745f64622e7273707265636f6e646974696f6e3a20616c6c20696d706f7274732073686f756c6420626520636865636b656420616761696e737420746865207369676e617475726573206f6620636f72726573706f6e64696e670a09090909090966756e6374696f6e7320646566696e65642062792060646566696e655f656e762160206d6163726f206279207468652075736572206f6620746865206d6163726f3b0a0909090909097369676e617475726573206f662074686573652066756e6374696f6e7320646566696e6564206279206024706172616d73603b0a09090909090963616c6c7320616c77617973206d616465207769746820617267756d656e7473207479706573206f662077686963682061726520646566696e65642062792074686520636f72726573706f6e64696e6720696d706f7274733b0a09090909090974687573207479706573206f6620617267756d656e74732073686f756c6420626520657175616c20746f2074797065206c69737420696e206024706172616d736020616e640a0909090909096c656e677468206f6620617267756d656e74206c69737420616e642024706172616d732073686f756c6420626520657175616c3b0a0909090909097468757320746869732063616e206e6576657220626520604e6f6e65603b0a0909090909097165643b0a09090909090960656d7074795f6f75747075745f627566602069732074616b656e206f6e6c7920686572653b0a09090909606578745f72657475726e602074726170733b0a090909096052756e74696d65602063616e206f6e6c792062652075736564206f6e6c7920666f72206f6e6520657865637574696f6e3b0a09090909716564000000000000f46010000d00000000000000046110000300000000000000000000004c6110001800000000000000000000000c6210001300000000000000046110000300000000000000000000002062100006000000000000000000000050621000130000000000000064621000040000000000000000000000c46210000c0000000000000000000000246310000d00000000000000346310000100000000000000000000004c6310000a00000000000000000000009c6310001000000000000000ac631000010000000000000000000000c46310000d00000000000000000000002c6410000e000000000000003c64100003000000000000000000000084641000080000000000000000000000c46410001100000000000000d8641000010000000000000000000000f0641000030000000000000000000000086510000d0000000000000018651000010000000000000000000000306510000400000000000000000000005065100019000000000000006c651000010000000000000000000000846510000200000000000000000000009465100011000000000000006c651000010000000000000000000000a865100002000000000000007365745f617070726f76616c73000000000000004b72100005000000000000005072100009000000000000000b0f110005000000000000003469100012000000000000005972100004000000000000005d72100008000000196e100058000000cd6d1000100000002843110000000000716e100030000000a16e10004a0000002843110000000000eb6e100035000000206f100051000000716f10002c0000009d6f100053000000f06f1000620000005270100060000000b27010001d000000cf70100057000000267110003500000028431100000000005b7110006b000000c67110001d0000002843110000000000d31911000b000000de19110008000000e3711000270000000a72100041000000fc1911000c00000070726f78795f7365745f617070726f76616c7300686d100065000000cd6d1000100000002843110000000000d31911000b000000dd6d10003c000000fc1911000c000000726561705f696e6163746976655f766f74657200000000003f6d10000e00000000000000266810000c000000000000006367100003000000000000009efd100023000000000000004d6d10000900000000000000266810000c00000000000000566d100012000000000000003469100012000000de6b100058000000366c10005c000000926c1000280000002843110000000000ba6c1000450000002843110000000000ff6c1000400000002843110000000000d31911000b000000de19110008000000b76b100027000000fc1911000c000000726574726163745f766f746572000000000000000b0f11000500000000000000266810000c000000db6a10004b0000002843110000000000266b1000420000002843110000000000686b10004f0000002843110000000000d31911000b000000de19110008000000b76b100027000000fc1911000c0000007375626d69745f63616e64696461637900000000d76a10000400000000000000266810000c000000466910001e000000284311000000000064691000440000002843110000000000a869100048000000f069100051000000416a10004c0000008d6a10001e0000002843110000000000d31911000b000000ab6a100018000000c36a100014000000fc1911000c00000070726573656e745f77696e6e65720000000000002669100009000000000000009efd100023000000000000002f69100005000000000000004cfc100015000000000000000b0f11000500000000000000346910001200000032681000590000008b68100068000000f36810001e0000002843110000000000d31911000b000000116910001500000093fb100011000000fc1911000c0000007365745f646573697265645f7365617473000000000000007a6610000500000000000000266810000c0000006667100059000000bf67100052000000116810001500000072656d6f76655f6d656d626572000000000000006367100003000000000000009efd1000230000007f6610004c0000002843110000000000cb6610004800000013671000500000007365745f70726573656e746174696f6e5f6475726174696f6e000000000000007a66100005000000000000006dfc10001700000024661000560000000c661000180000007365745f7465726d5f6475726174696f6e000000b8651000540000000c6610001800000020536574207468652070726573656e746174696f6e206475726174696f6e2e2049662074686572652069732063757272656e74206120766f7465206265696e672070726573656e74656420666f722c2077696c6c20696e766f6b65206066696e616c697a655f766f7465602e20536574207468652070726573656e746174696f6e206475726174696f6e2e2049662074686572652069732063757272656e746c79206120766f7465206265696e672070726573656e74656420666f722c2077696c6c636f756e742052656d6f7665206120706172746963756c6172206d656d6265722066726f6d2074686520636f756e63696c2e20546869732069732065666665637469766520696d6d6564696174656c792e204e6f74653a20412074616c6c792073686f756c642068617070656e20696e7374616e746c7920286966206e6f7420616c726561647920696e20612070726573656e746174696f6e20706572696f642920746f2066696c6c2074686520736561742069662072656d6f76616c206d65616e732074686174207468652064657369726564206d656d6265727320617265206e6f74206d65742e77686f20536574207468652064657369726564206d656d62657220636f756e743b206966206c6f776572207468616e207468652063757272656e7420636f756e742c207468656e2073656174732077696c6c206e6f7420626520757020656c656374696f6e207768656e2074686579206578706972652e204966206d6f72652c207468656e2061206e657720766f74652077696c6c2062652073746172746564206966206f6e65206973206e6f7420616c726561647920696e2070726f67726573732e436f6d706163743c7533323e20436c61696d207468617420607369676e656460206973206f6e65206f662074686520746f702053656c663a3a63617272795f636f756e742829202b2063757272656e745f766f746528292e312063616e646964617465732e204f6e6c7920776f726b73206966207468652060626c6f636b5f6e756d626572203e3d2063757272656e745f766f746528292e306020616e6420603c2063757272656e745f766f746528292e30202b2070726573656e746174696f6e5f6475726174696f6e28296020607369676e6564602073686f756c642068617665206174206c65617374202d204f28766f746572732920636f6d707574652e63616e646964617465746f74616c436f6d706163743c566f7465496e6465783e205375626d6974206f6e6573656c6620666f722063616e6469646163792e204163636f756e74206d757374206861766520656e6f756768207472616e736665727261626c652066756e647320696e20697420746f207061792074686520626f6e642e204e4f54453a20696620606f726967696e602068617320616c72656164792061737369676e656420617070726f76616c7320766961205b607365745f617070726f76616c73605d2c2069742077696c6c204e4f54206861766520616e7920757361626c652066756e647320746f20706173732063616e64696461637920626f6e6420616e64206d75737420666972737420726574726163742e204e6f746520746861742073657474696e6720617070726f76616c732077696c6c206c6f636b2074686520656e746972652062616c616e6365206f662074686520766f74657220756e74696c2072657472616374696f6e206f72206265696e67207265706f727465642e202d20496e646570656e64656e74206f6620696e7075742e202d205468726565204442206368616e6765732e736c6f742052656d6f7665206120766f7465722e20416c6c20766f746573206172652063616e63656c6c656420616e642074686520766f746572206465706f7369742069732072657475726e65642e2054686520696e646578206d7573742062652070726f7669646564206173206578706c61696e656420696e205b60766f7465725f6174605d2066756e6374696f6e2e20416c736f2072656d6f76657320746865206c6f636b206f6e207468652062616c616e6365206f662074686520766f7465722e20536565205b60646f5f7365745f617070726f76616c732829605d2e202d2054776f20666577657220444220656e74726965732c206f6e65204442206368616e67652e2052656d6f7665206120766f7465722e20466f72206974206e6f7420746f206265206120626f6e642d636f6e73756d696e67206e6f2d6f702c20616c6c20617070726f7665642063616e64696461746520696e6469636573206d757374206e6f772062652065697468657220756e72656769737465726564206f72207265676973746572656420746f20612063616e646964617465207468617420726567697374657265642074686520736c6f742061667465722074686520766f7465722067617665207468656972206c61737420617070726f76616c207365742e20426f746820696e6469636573206d7573742062652070726f7669646564206173206578706c61696e656420696e205b60766f7465725f6174605d2066756e6374696f6e2e204d61792062652063616c6c656420627920616e796f6e652e2052657475726e732074686520766f746572206465706f73697420746f20607369676e6564602e7265706f727465725f696e64657877686f5f696e646578617373756d65645f766f74655f696e646578205365742063616e64696461746520617070726f76616c732066726f6d20612070726f78792e20417070726f76616c20736c6f747320737461792076616c6964206173206c6f6e672061732063616e6469646174657320696e2074686f736520736c6f74732061726520726567697374657265642e202d2053616d6520617320607365745f617070726f76616c73602077697468206f6e65206164646974696f6e616c2073746f7261676520726561642e205365742063616e64696461746520617070726f76616c732e20417070726f76616c20736c6f747320737461792076616c6964206173206c6f6e672061732063616e6469646174657320696e2074686f736520736c6f7473204c6f636b732074686520746f74616c2062616c616e6365206f662063616c6c657220696e646566696e6974656c792e204f6e6c79205b60726574726163745f766f746572605d206f72205b60726561705f696e6163746976655f766f746572605d2063616e20756e6c6f636b207468652062616c616e63652e206068696e746020617267756d656e7420697320696e74657270726574656420646966666572656e746c79206261736564206f6e3a202d20696620606f726967696e602069732073657474696e6720617070726f76616c7320666f72207468652066697273742074696d653a2054686520696e6465782077696c6c20626520636865636b656420666f72206265696e6720612076616c6964205f686f6c655f20696e2074686520766f746572206c6973742e2020202d206966207468652068696e7420697320636f72726563746c7920706f696e74696e6720746f206120686f6c652c206e6f206665652069732064656475637465642066726f6d20606f726967696e602e2020202d204f74686572776973652c207468652063616c6c2077696c6c2073756363656564206275742074686520696e6465782069732069676e6f72656420616e642073696d706c792061207075736820746f20746865206c617374206368756e6b2020207769746820667265652073706163652068617070656e732e20496620746865206e65772070757368206361757365732061206e6577206368756e6b20746f20626520637265617465642c20612066656520696e646963617465642062792020205b60566f74696e67466565605d2069732064656475637465642e202d20696620606f726967696e6020697320616c7265616479206120766f7465723a2074686520696e646578205f5f6d7573745f5f2062652076616c696420616e6420706f696e7420746f2074686520636f727265637420706f736974696f6e206f662074686520606f726967696e6020696e207468652063757272656e7420766f74657273206c6973742e204e6f7465207468617420616e7920747261696c696e67206066616c73656020766f74657320696e2060766f746573602069732069676e6f7265643b20496e20617070726f76616c20766f74696e672c206e6f7420766f74696e6720666f7220612063616e64696461746520616e6420766f74696e672066616c73652c2061726520657175616c2e202d2054776f20657874726120444220656e74726965732c206f6e65204442206368616e67652e202d20417267756d656e742060766f74657360206973206c696d6974656420696e206c656e67746820746f206e756d626572206f662063616e646964617465732e766f7465735665633c626f6f6c3e68696e74536574496e646578436f756e63696c00000000547a10000d0000000000000000000000c30011000c0000000000000000000000000000000000000000000000000000000000000028431100647a10000000000000000000747a1000010000000000000001000000000000007c7a10000a0000000000000000000000c30011000c00000000000000000000000000000000000000000000000000000000000000284311004c9310000000000000000000887a100001000000000000000100000000000000907a1000090000000000000000000000c30011000c00000000000000000000000000000000000000000000000000000000000000284311004c93100000000000000000009c7a100001000000000000000100000000000000a47a1000140000000000000000000000c30011000c0000000000000000000000000000000000000000000000000000000000000028431100b87a10000000000000000000c87a100001000000000000000100000000000000d07a10000a0000000000000000000000821c1100030000000000000000000000000000000000000000000000000000000000000028431100dc7a10000000000000000000ec7a100001000000000000000100000000000000f47a1000140000000000000000000000e30011000e0000000000000000000000000000000000000000000000000000000000000028431100587b10000000000000000000087b100001000000000000000100000000000000107b1000130000000000000000000000237b10000900000000000000000000000000000000000000000000000000000000000000284311002c7b100000000000000000003c7b1000020000000000000001000000000000004c7b10000c0000000000000000000000e30011000e0000000000000000000000000000000000000000000000000000000000000028431100587b10000000000000000000687b100001000000000000000100000000000000707b10000c0000000000000000000000e30011000e00000000000000000000000000000000000000000000000000000000000000284311007c7b100000000000000000008c7b100001000000000000000100000000000000947b10000c0000000000000000000000821c1100030000000000000000000000000000000000000000000000000000000000000028431100947d10000000000000000000a07b100001000000000000000100000000000000a87b10000a0000000000000000000000821c1100030000000000000000000000000000000000000000000000000000000000000028431100b47b10000000000000000000c47b100004000000000000000100000000000000e47b10000d0000000000000000000000f17b10002300000000000000000000000000000000000000000000000000000000000000284311006c7d10000000000000000000147c100004000000000000000100000000000000347c1000090000000000000000000000237b1000090000000000000000000000000000000000000000000000000000000000000028431100947d10000000000000000000407c100001000000000000000100000000000000487c10000b0000000101000000000000537c100018000000000000006b7c10001100000000000000000000000000000000000000284311006c7d100000000000000000007c7c100005000000000000000100000000000000a47c10000e0000000101000000000000561c11000c00000000000000b27c1000100000000000000000000000000000000000000028431100c09210000000000000000000c47c100002000000000000000000000000000000d47c10000b0000000101000000000000561c11000c00000000000000df7c1000170000000000000000000000000000000000000028431100f87c10000000000000000000087d100001000000000000000000000000000000107d10000600000001010000000000005d7210000800000000000000167d10001900000000000000000000000000000000000000284311006c7d10000000000000000000307d100001000000000000000100000000000000387d10000c00000000000000000000005d721000080000000000000000000000000000000000000000000000000000000000000028431100947d10000000000000000000447d1000010000000000000001000000000000004c7d10000a00000000000000000000005d721000080000000000000000000000000000000000000000000000000000000000000028431100947d10000000000000000000587d100001000000000000000100000000000000607d10000a0000000000000000000000ea1b11001100000000000000000000000000000000000000000000000000000000000000284311006c7d100000000000000000007c7d100001000000000000000100000000000000847d10000e0000000000000000000000821c1100030000000000000000000000000000000000000000000000000000000000000028431100947d10000000000000000000a47d100001000000000000000100000000000000ac7d10000c0000000000000000000000b87d1000280000000000000000000000000000000000000000000000000000000000000028431100e07d10000000000000000000f07d100001000000000000000000000000000000f87d10000b0000000000000000000000037e1000210000000000000000000000000000000000000000000000000000000000000028431100247e10000000000000000000347e100002000000000000000000000043616e646964616379426f6e6400000032000000000000000100000043000000f586100041000000566f74696e67426f6e640000b386100042000000566f74696e674665650000004c8610006700000050726573656e74536c617368506572566f7465723200000000000000010000004400000009861000430000004361727279436f756e74000032000000000000000100000045000000bc8510004d00000050726573656e746174696f6e4475726174696f6e6d8510004f000000496e6163746976654772616365506572696f64566f7465496e64657832000000000000000100000046000000f1841000680000005985100014000000566f74696e67506572696f6432000000000000000100000047000000c38410002e0000005465726d4475726174696f6e320000000000000001000000480000009d84100026000000446573697265645365617473638410003a0000004465636179526174696f000032000000000000000100000049000000388310004d000000858310003b000000c08310005b0000001b84100048000000416374697665436f756e63696c5665633c28543a3a4163636f756e7449642c20543a3a426c6f636b4e756d626572293e0b8210005b000000668210005c000000c28210005c0000001e8310001a000000566f7465436f756e74000000c481100047000000417070726f76616c734f6628543a3a4163636f756e7449642c20536574496e646578295665633c417070726f76616c466c61673eaf8010006800000028431100000000001781100059000000284311000000000070811000540000005265676973746572496e666f4f6628566f7465496e6465782c207533322900003a8010005f0000009980100016000000566f746572496e666f4f66566f746572496e666f3c42616c616e63654f663c543e3e0000320000000000000001000000360000001980100021000000566f746572735665633c4f7074696f6e3c543a3a4163636f756e7449643e3e00d67f1000430000004e657874566f746572536574977f10003f000000566f746572436f756e7400007d7f10001a00000043616e64696461746573000032000000000000000100000035000000617f10001c00000043616e646964617465436f756e740000320000000000000001000000340000003d7f1000240000004e65787446696e616c697a6528543a3a426c6f636b4e756d6265722c207533322c205665633c543a3a4163636f756e7449643e2932000000000000000100000033000000f57e1000480000004c6561646572626f6172645665633c2842616c616e63654f663c543e2c20543a3a4163636f756e744964293e32000000000000000100000033000000447e100067000000ab7e10004a0000002047657420746865206c6561646572626f61726420696620776527726520696e207468652070726573656e746174696f6e2070686173652e2054686520666972737420656c656d656e742069732074686520776569676874206f66206561636820656e7472793b204974206d617920626520746865206469726563742073756d6d656420617070726f76616c207374616b65732c206f7220612077656967687465642076657273696f6e206f662069742e20546865206163636f756e747320686f6c64696e672074686520736561747320746861742077696c6c206265636f6d652066726565206f6e20746865206e6578742074616c6c792e2043757272656e74206e756d626572206f66206163746976652063616e64696461746573205468652070726573656e742063616e646964617465206c6973742e2043757272656e74206e756d626572206f6620566f746572732e20746865206e65787420667265652073657420746f2073746f7265206120766f74657220696e2e20546869732077696c6c206b6565702067726f77696e672e205468652070726573656e7420766f746572206c69737420286368756e6b656420616e6420636170706564206174205b60564f5445525f5345545f53495a45605d292e20426173696320696e666f726d6174696f6e2061626f7574206120766f7465722e2054686520766f746520696e64657820616e64206c69737420736c6f742074686174207468652063616e646964617465206077686f60207761732072656769737465726564206f7220604e6f6e6560206966207468657920617265206e6f742063757272656e746c7920726567697374657265642e2041206c697374206f6620766f74657320666f72206561636820766f7465722e2054686520766f746573206172652073746f726564206173206e756d657269632076616c75657320616e642070617273656420696e2061206269742d77697365206d616e6e65722e20496e206f7264657220746f2067657420612068756d616e2d7265616461626c6520726570726573656e746174696f6e2028605665633c626f6f6c3e60292c20757365205b60616c6c5f617070726f76616c735f6f66605d2e20467572746865726d6f72652c206561636820766563746f72206f66207363616c617273206973206368756e6b656420776974682074686520636170206f662060415050524f56414c5f5345545f53495a45602e2054686520746f74616c206e756d626572206f6620766f746520726f756e6473207468617420686176652068617070656e6564206f722061726520696e2070726f67726573732e205468652063757272656e7420636f756e63696c2e205768656e2074686572652773206120766f746520676f696e67206f6e2c20746869732073686f756c64207374696c6c206265207573656420666f7220657865637574697665206d6174746572732e2054686520626c6f636b206e756d62657220287365636f6e6420656c656d656e7420696e20746865207475706c65292069732074686520626c6f636b207468617420746865697220706f736974696f6e2069732061637469766520756e74696c202863616c63756c61746564206279207468652073756d206f662074686520626c6f636b206e756d626572207768656e2074686520636f756e63696c206d656d6265722077617320656c656374656420616e64207468656972207465726d206475726174696f6e292e20446563617920666163746f72206f6620776569676874207768656e206265696e6720616363756d756c617465642e2049742073686f756c64207479706963616c6c792062652073657420746f205f5f6174206c656173745f5f2060636f756e63696c5f73697a65202d316020746f206b6565702074686520636f756e63696c207365637572652e205768656e2073657420746f20604e602c20697420696e64696361746573206028312f4e295e7460206f66207374616b656420697320646563617965642061742077656967687420696e6372656d656e742073746570206074602e20302077696c6c20726573756c7420696e206e6f20776569676874206265696e6720616464656420617420616c6c20286e6f726d616c20617070726f76616c20766f74696e67292e204e756d626572206f66206163636f756e747320746861742073686f756c642062652073697474696e67206f6e2074686520636f756e63696c2e20486f77206c6f6e67206561636820706f736974696f6e2069732061637469766520666f722e20486f77206f6674656e2028696e20626c6f636b732920746f20636865636b20666f72206e657720766f7465732e20486f77206d616e7920766f746520696e6469636573206e65656420746f20676f20627920616674657220612074617267657420766f7465722773206c61737420766f7465206265666f726520746865792063616e2062652072656170656420696620746865697220617070726f76616c7320617265206d6f6f742e20486f77206c6f6e6720746f2067697665206561636820746f702063616e64696461746520746f2070726573656e74207468656d73656c7665732061667465722074686520766f746520656e64732e20486f77206d616e792072756e6e6572732d75702073686f756c64206861766520746865697220617070726f76616c73207065727369737420756e74696c20746865206e65787420766f74652e205468652070756e6973686d656e742c2070657220766f7465722c20696620796f752070726f7669646520616e20696e76616c69642070726573656e746174696f6e2e2054686520616d6f756e74206f662066656520706169642075706f6e206561636820766f7465207375626d697373696f6e2c20756e6c6573732069662074686579207375626d69742061205f686f6c655f20696e64657820616e64207265706c6163652069742e20486f77206d7563682073686f756c64206265206c6f636b656420757020696e206f7264657220746f2062652061626c6520746f207375626d697420766f7465732e20486f77206d7563682073686f756c64206265206c6f636b656420757020696e206f7264657220746f207375626d6974206f6e6527732063616e6469646163792e00000000000090871000080000000000000098871000020000000000000000000000c8871000170000000000000000000000808810000b000000000000008c881000030000000000000000000000d48810000d000000000000007472616e736665720000000025ad100004000000000000009efd100023000000000000008efd10000500000000000000f18a100013000000108b1000360000002843110000000000468b100042000000888b100048000000d08b100045000000158c10002d0000002843110000000000428c1000460000002843110000000000d31911000b000000888c10004c000000d48c100033000000078d10005a0000002843110000000000618d1000130000002843110000000000748d100054000000c88d10004b000000138e100035000000488e1000370000007f8e1000560000002843110000000000fc1911000c0000007365745f62616c616e636500000000006367100003000000000000009efd10002300000000000000e98a10000800000000000000f18a10001300000000000000048b10000c00000000000000f18a1000130000003c8910002500000028431100000000006189100048000000a989100042000000eb89100046000000318a10003a00000028431100000000006b8a10002d0000002843110000000000d31911000b000000988a100020000000b88a100031000000fc1911000c00000020536574207468652062616c616e636573206f66206120676976656e206163636f756e742e20546869732077696c6c20616c74657220604672656542616c616e63656020616e642060526573657276656442616c616e63656020696e2073746f726167652e2069742077696c6c20616c736f2064656372656173652074686520746f74616c2069737375616e6365206f66207468652073797374656d202860546f74616c49737375616e636560292e20496620746865206e65772066726565206f722072657365727665642062616c616e63652069732062656c6f7720746865206578697374656e7469616c206465706f7369742c2069742077696c6c20726573657420746865206163636f756e74206e6f6e636520286073797374656d3a3a4163636f756e744e6f6e636560292e20546865206469737061746368206f726967696e20666f7220746869732063616c6c2069732060726f6f74602e202d20496e646570656e64656e74206f662074686520617267756d656e74732e202d20436f6e7461696e732061206c696d69746564206e756d626572206f6620726561647320616e64207772697465732e6e65775f66726565436f6d706163743c543a3a42616c616e63653e6e65775f7265736572766564205472616e7366657220736f6d65206c697175696420667265652062616c616e636520746f20616e6f74686572206163636f756e742e20607472616e73666572602077696c6c207365742074686520604672656542616c616e636560206f66207468652073656e64657220616e642072656365697665722e2049742077696c6c2064656372656173652074686520746f74616c2069737375616e6365206f66207468652073797374656d2062792074686520605472616e73666572466565602e204966207468652073656e6465722773206163636f756e742069732062656c6f7720746865206578697374656e7469616c206465706f736974206173206120726573756c74206f6620746865207472616e736665722c20746865206163636f756e742077696c6c206265207265617065642e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d75737420626520605369676e65646020627920746865207472616e736163746f722e202d20446570656e64656e74206f6e20617267756d656e747320627574206e6f7420637269746963616c2c20676976656e2070726f70657220696d706c656d656e746174696f6e7320666f72202020696e70757420636f6e6669672074797065732e205365652072656c617465642066756e6374696f6e732062656c6f772e202d20497420636f6e7461696e732061206c696d69746564206e756d626572206f6620726561647320616e642077726974657320696e7465726e616c6c7920616e64206e6f20636f6d706c657820636f6d7075746174696f6e2e2052656c617465642066756e6374696f6e733a2020202d2060656e737572655f63616e5f77697468647261776020697320616c776179732063616c6c656420696e7465726e616c6c792062757420686173206120626f756e64656420636f6d706c65786974792e2020202d205472616e7366657272696e672062616c616e63657320746f206163636f756e7473207468617420646964206e6f74206578697374206265666f72652077696c6c20636175736520202020202060543a3a4f6e4e65774163636f756e743a3a6f6e5f6e65775f6163636f756e746020746f2062652063616c6c65642e2020202d2052656d6f76696e6720656e6f7567682066756e64732066726f6d20616e206163636f756e742077696c6c2074726967676572202020202060543a3a4475737452656d6f76616c3a3a6f6e5f756e62616c616e6365646020616e642060543a3a4f6e4672656542616c616e63655a65726f3a3a6f6e5f667265655f62616c616e63655f7a65726f602e42616c616e6365732056657374696e6742616c616e63657300000000000000609210000d00000000000000000000006d9210000a00000000000000000000000000000000000000000000000000000000000000284311004c93100000000000000000007892100001000000000000000100000000000000809210001200000000000000000000006d9210000a00000000000000000000000000000000000000000000000000000000000000284311004c9310000000000000000000949210000100000000000000010000000000000018bc10000b00000000000000000000006d9210000a00000000000000000000000000000000000000000000000000000000000000284311004c931000000000000000000024bc1000010000000000000001000000000000002cbc10000b00000000000000000000006d9210000a00000000000000000000000000000000000000000000000000000000000000284311004c931000000000000000000038bc10000100000000000000010000000000000040bc10001200000000000000000000006d9210000a00000000000000000000000000000000000000000000000000000000000000284311004c931000000000000000000054bc1000010000000000000001000000000000005cbc10001200000000000000000000006d9210000a00000000000000000000000000000000000000000000000000000000000000284311004c931000000000000000000080bc1000010000000000000001000000000000009c921000070000000101000000000000561c11000c00000000000000a39210001b0000000000000000000000000000000000000028431100c09210000000000000000000d092100001000000000000000000000000000000d89210000b0000000101000000000000561c11000c000000000000006d9210000a00000000000000000000000000000000000000284311004c9310000000000000000000e49210000b0000000000000001000000000000003c9310000f0000000101000000000000561c11000c000000000000006d9210000a00000000000000000000000000000000000000284311004c93100000000000000000005c9310000b000000000000000100000000000000b4931000050000000101000000000000561c11000c00000000000000b99310002c0000000000000000000000000000000000000028431100e89310000000000000000000f8931000010000000000000001000000546f74616c49737375616e6365543a3a42616c616e6365005e991000260000004578697374656e7469616c4465706f7369740000299910003500000056657374696e6756657374696e675363686564756c653c543a3a42616c616e63653e000032000000000000000100000036000000f3981000360000004672656542616c616e63650079961000270000002843110000000000a096100050000000f09610005d0000004d97100055000000a29710004f000000f197100051000000429810001500000028431100000000005798100057000000ae98100045000000526573657276656442616c616e6365003200000000000000010000003e0000002e9410005d0000008b941000270000002843110000000000b29410005b0000000d951000490000002843110000000000569510005d000000b39510002d0000002843110000000000e09510005300000033961000460000004c6f636b735665633c42616c616e63654c6f636b3c543a3a42616c616e63652c20543a3a426c6f636b4e756d6265723e3e00000032000000000000000100000035000000009410002e00000020416e79206c6971756964697479206c6f636b73206f6e20736f6d65206163636f756e742062616c616e6365732e2054686520616d6f756e74206f66207468652062616c616e6365206f66206120676976656e206163636f756e7420746861742069732065787465726e616c6c792072657365727665643b20746869732063616e207374696c6c2067657420736c61736865642c20627574206765747320736c6173686564206c617374206f6620616c6c2e20546869732062616c616e63652069732061202772657365727665272062616c616e63652074686174206f746865722073756273797374656d732075736520696e206f7264657220746f2073657420617369646520746f6b656e73207468617420617265207374696c6c20276f776e65642720627920746865206163636f756e7420686f6c6465722c20627574207768696368206172652073757370656e6461626c652e205768656e20746869732062616c616e63652066616c6c732062656c6f77207468652076616c7565206f6620604578697374656e7469616c4465706f736974602c207468656e2074686973202772657365727665206163636f756e74272069732064656c657465643a207370656369666963616c6c792c2060526573657276656442616c616e6365602e206073797374656d3a3a4163636f756e744e6f6e63656020697320616c736f2064656c6574656420696620604672656542616c616e63656020697320616c736f207a65726f2028697420616c736f206765747320636f6c6c617073656420746f207a65726f2069662069742065766572206265636f6d6573206c657373207468616e20604578697374656e7469616c4465706f736974602e2920546865202766726565272062616c616e6365206f66206120676976656e206163636f756e742e205468697320697320746865206f6e6c792062616c616e63652074686174206d61747465727320696e207465726d73206f66206d6f7374206f7065726174696f6e73206f6e20746f6b656e732e20497420616c6f6e65206973207573656420746f2064657465726d696e65207468652062616c616e6365207768656e20696e2074686520636f6e747261637420657865637574696f6e20656e7669726f6e6d656e742e205768656e20746869732062616c616e63652066616c6c732062656c6f77207468652076616c7565206f6620604578697374656e7469616c4465706f736974602c207468656e20746865202763757272656e74206163636f756e74272069732064656c657465643a207370656369666963616c6c7920604672656542616c616e6365602e20467572746865722c2074686520604f6e4672656542616c616e63655a65726f602063616c6c6261636b20697320696e766f6b65642c20676976696e672061206368616e636520746f2065787465726e616c206d6f64756c657320746f20636c65616e2075702064617461206173736f6369617465642077697468207468652064656c65746564206163636f756e742e206073797374656d3a3a4163636f756e744e6f6e63656020697320616c736f2064656c657465642069662060526573657276656442616c616e63656020697320616c736f207a65726f2028697420616c736f206765747320636f6c6c617073656420746f207a65726f2069662069742065766572206265636f6d6573206c657373207468616e20604578697374656e7469616c4465706f736974602e20496e666f726d6174696f6e20726567617264696e67207468652076657374696e67206f66206120676976656e206163636f756e742e20546865206d696e696d756d20616d6f756e7420726571756972656420746f206b65657020616e206163636f756e74206f70656e2e2054686520746f74616c20756e6974732069737375656420696e207468652073797374656d2e436f756e63696c20566f74696e67506572696f64f09b100039000000a09b100048000000100200002d000000436f756e63696c20446573697265645365617473436f756e63696c204e65787446696e616c697a65436f756e63696c205465726d4475726174696f6e309b100048000000870a00000a000000809b100019000000a09b100048000000bb0100002d000000436f756e63696c2050726573656e746174696f6e4475726174696f6e436f756e63696c204361727279436f756e74436f756e63696c204c6561646572626f617264000000309b1000480000008d0a00000e000000436f756e63696c2043616e64696461746573436f756e63696c2043616e646964617465436f756e74436f756e63696c20566f7465436f756e74436f756e63696c2043616e646964616379426f6e64436f756e63696c20566f746572496e666f4f6647757275206d656469746174696f6e66696e616c697a652063616e206f6e6c792062652063616c6c656420616674657220612074616c6c7920697320737461727465642e436f756e63696c20417070726f76616c734f66436f756e63696c20566f7465727300002f72757374632f343030623430396566633439373561303832313835633561373434313235373265343964666439382f7372632f6c6962636f72652f736c6963652f6d6f642e72730000000000000000617474656d707420746f20646976696465206279207a65726f000000000000002f72757374632f343030623430396566633439373561303832313835633561373434313235373265343964666439382f7372632f6c6962636f72652f6f70732f61726974682e72730000000000000000617474656d707420746f2063616c63756c617465207468652072656d61696e646572207769746820612064697669736f72206f66207a65726f6e6f7420656e6f75676820667265652066756e64730000703b110028000000f05b1000430000005501000001000000703b110028000000709c10004400000098000000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f636f756e63696c2f7372632f73656174732e7273709c100044000000980000000100000042616c616e636573204372656174696f6e46656542616c616e636573205472616e73666572466565676f74206f766572666c6f7720616674657220616464696e6720612066656520746f2076616c75656e6f7420612070726f787963616e6e6f74207265617020647572696e672070726573656e746174696f6e20706572696f647265706f72746572206d757374206265206120766f746572696e76616c6964207265706f7274657220696e646578766f746520696e646578206e6f742063757272656e7463616e6e6f74207265617020647572696e6720677261636520706572696f6474617267657420666f7220696e616374697669747920636c65616e7570206d75737420626520616374697665436f756e63696c20496e6163746976654772616365506572696f64696e76616c69642074617267657420696e646578626164207265706f7274657220696e6465786261642074617267657420696e646578436f756e63696c20566f74696e67426f6e6472657472616374696f6e20696e646578206d69736d6174636872657472616374696f6e20696e64657820696e76616c696463616e6e6f742072657472616374207768656e2070726573656e74696e6763616e6e6f742072657472616374206e6f6e2d766f7465726475706c69636174652063616e646964617465207375626d697373696f6e696e76616c69642063616e64696461746520736c6f7463616e64696461746520686173206e6f7420656e6f7567682066756e64737374616b65206465706f736974656420746f2070726573656e742077696e6e657220616e6420626520616464656420746f206c6561646572626f6172642073686f756c64206265206e6f6e2d7a65726f63616e6e6f742070726573656e74206f757473696465206f662070726573656e746174696f6e20706572696f64696e646578206e6f742063757272656e746c6561646572626f617264206d757374206578697374207768696c652070726573656e742070686173652061637469766570726573656e746572206d75737420686176652073756666696369656e7420736c61736861626c652066756e647370726573656e7465642063616e646964617465206d7573742062652063757272656e7463616e646964617465206e6f7420776f72746879206f66206c6561646572626f61726463616e646964617465206d757374206e6f7420666f726d2061206475706c696361746564206d656d62657220696620656c6563746564436f756e63696c204465636179526174696f6475706c69636174652070726573656e746174696f6e696e636f727265637420746f74616c436f756e63696c2050726573656e74536c617368506572566f746572436f756e63696c20566f746572436f756e746e6f20617070726f76616c206368616e67657320647572696e672070726573656e746174696f6e20706572696f64696e636f727265637420766f746520696e646578616d6f756e74206f662063616e6469646174657320746f207265636569766520617070726f76616c20766f7465732073686f756c64206265206e6f6e2d7a65726f616d6f756e74206f662063616e64696461746520766f7465732063616e6e6f742065786365656420616d6f756e74206f662063616e64696461746573696e76616c696420766f74657220696e64657877726f6e6720766f74657220696e6465786e657720766f746572206d75737420686176652073756666696369656e742066756e647320746f207061792074686520626f6e64436f756e63696c204e657874566f746572536574436f756e63696c20566f74696e67466565000014a210001d000000b831110013000000db03000009000000617373657274696f6e206661696c65643a20696e646578203c206c656e00000050a2100043000000ce0a0000250000000000000000000000000000002f72757374632f343030623430396566633439373561303832313835633561373434313235373265343964666439382f7372632f6c6962616c6c6f632f7665632e72730050a2100043000000d40a00002c000000746f6f206d616e7920696e737472756374696f6e73436f6e7472616374204163636f756e74436f756e746572436f6e74726163742053746f7261676553697a654f6666736574000000000000f4a310000800000000000000fca3100003000000000000000000000014a410000100000000000000000000001ca410000c0000000000000028a4100002000000000000000000000038a4100001000000000000000000000040a410000a00000000000000180711000100000000000000000000004ca4100001000000000000000000000054a410000f0000000000000064a410000100000000000000000000006ca4100001000000000000000000000074a410000a0000000000000080a4100002000000000000000000000090a41000020000000000000000000000a0a410000800000000000000a8a41000020000000000000000000000b8a4100001000000000000005472616e73666572f608110009000000f6081100090000005bf6100007000000e3a5100055000000496e7374616e746961746564f608110009000000f608110009000000aca5100037000000436f646553746f72656400007ea510002e0000005363686564756c655570646174656400821c1100030000004ea5100030000000446973706174636865640000f6081100090000002f1c110004000000e3a410004e00000031a510001d000000436f6e7472616374f608110009000000181a110007000000c0a410002300000020416e206576656e742066726f6d20636f6e7472616374206f66206163636f756e742e20412063616c6c2077617320646973706174636865642066726f6d2074686520676976656e206163636f756e742e2054686520626f6f6c207369676e616c73207768657468657220697420776173207375636365737366756c20657865637574696f6e206f72206e6f742e20547269676765726564207768656e207468652063757272656e74207363686564756c6520697320757064617465642e20436f646520776974682074686520737065636966696564206861736820686173206265656e2073746f7265642e20436f6e7472616374206465706c6f7965642062792061646472657373206174207468652073706563696669656420616464726573732e205472616e736665722068617070656e6564206066726f6d6020746f2060746f60207769746820676976656e206076616c7565602061732070617274206f662061206063616c6c60206f722060637265617465602e44656164206f7220696e6578697374656e74206163636f756e7420686173206265656e206578656d70742061626f76653b2071656464656661756c743a436f6e7472616374204761735370656e74436f6e747261637420426c6f636b4761734c696d6974436f6e747261637420436f6e7472616374496e666f4f66436f6e7472616374204761735072696365436f6e74726163742052656e7442797465466565436f6e747261637420546f6d6273746f6e654465706f736974436f6e74726163742052656e744465706f7369744f6666736574436f6e7472616374205472616e73616374696f6e42617365466565436f6e7472616374205472616e73616374696f6e4279746546656500000054a710004300000058010000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f636f6e74726163742f7372632f6c69622e72730000000000a0a810000f00000000000000b0a81000010000000000000000000000c8a81000030000000000000000000000e0a810000800000000000000e8a8100002000000000000000000000018a9100002000000000000000000000027221100040000000000000028a9100004000000000000000000000088a91000070000000000000000000000c0a910000600000000000000c8a9100004000000000000000000000028aa10000a000000000000000000000078aa10000f0000000000000088aa1000020000000000000000000000b8aa1000050000000000000000000000e0aa10000a00000000000000ecaa10000400000000000000000000004cab100006000000000000007570646174655f7363686564756c6500000000006eb31000080000000000000076b3100010000000feb210002d00000028431100000000002bb31000430000007075745f636f646500000000bdb010000900000000000000c6b010000f00000000000000fab210000400000000000000181a1100070000006eb2100057000000c5b21000350000000000000025ad100004000000000000009efd100023000000000000008efd100005000000000000004cfc10001500000000000000bdb010000900000000000000c6b010000f00000000000000d5b010000400000000000000181a110007000000d9b010004200000028431100000000001bb110004a00000065b110002c00000091b1100046000000d7b110005200000029b2100045000000637265617465000000000000b4b0100009000000000000004cfc10001500000000000000bdb010000900000000000000c6b010000f0000000000000029ad1000090000000000000032ad10000b00000000000000d5b010000400000000000000181a1100070000009dae10006a000000284311000000000007af100021000000284311000000000028af10005000000078af100041000000b9af10005b00000014b01000570000006bb010002a00000095b010001f000000636c61696d5f737572636861726765000000000025ad10000400000000000000561c11000c000000000000007fae10000a0000000000000089ae10001400000065ad10005c000000c1ad100045000000284311000000000006ae10004e00000054ae10002b000000726573746f72655f746f00000000000025ad10000400000000000000561c11000c0000000000000029ad1000090000000000000032ad10000b000000000000003dad10000e00000000000000c30011000c000000000000004bad1000050000000000000050ad1000150000007cab1000400000002843110000000000bcab10006f0000002bac10004e00000079ac100064000000ddac10004800000020416c6c6f7773206120636f6e747261637420746f20726573746f7265206120746f6d6273746f6e6520627920676976696e67206974732073746f726167652e2054686520636f6e747261637420746861742077616e747320746f20726573746f72652028692e652e206f726967696e206f66207468652063616c6c2c206f7220606d73672e73656e6465726020696e20536f6c6964697479207465726d73292077696c6c20636f6d70757465206120746f6d6273746f6e652077697468206974732073746f7261676520616e642074686520676976656e20636f64655f686173682e2049662074686520636f6d707574656420746f6d6273746f6e65206d61746368207468652064657374696e6174696f6e206f6e652c207468652064657374696e6174696f6e20636f6e747261637420697320726573746f7265642077697468207468652072656e745f616c6c6f77616e636560207370656369666965642c207768696c6520746865206f726967696e2073656e647320616c6c206974732066756e647320746f207468652064657374696e6174696f6e20616e642069732072656d6f7665642e64657374636f64655f68617368436f6465486173683c543e72656e745f616c6c6f77616e636564656c74615665633c657865633a3a53746f726167654b65793e20416c6c6f777320626c6f636b2070726f64756365727320746f20636c61696d206120736d616c6c2072657761726420666f72206576696374696e67206120636f6e74726163742e204966206120626c6f636b2070726f6475636572206661696c7320746f20646f20736f2c206120726567756c61722075736572732077696c6c20626520616c6c6f77656420746f20636c61696d20746865207265776172642e20496620636f6e7472616374206973206e6f742065766963746564206173206120726573756c74206f6620746869732063616c6c2c206e6f20616374696f6e73206172652074616b656e20616e64207468652073656e646572206973206e6f7420656c696769626c6520666f7220746865207265776172642e6175785f73656e6465724f7074696f6e3c543a3a4163636f756e7449643e20437265617465732061206e657720636f6e74726163742066726f6d207468652060636f646568617368602067656e65726174656420627920607075745f636f6465602c206f7074696f6e616c6c79207472616e7366657272696e6720736f6d652062616c616e63652e204372656174696f6e20697320657865637574656420617320666f6c6c6f77733a202d205468652064657374696e6174696f6e206164647265737320697320636f6d7075746564206261736564206f6e207468652073656e64657220616e642068617368206f662074686520636f64652e202d2054686520736d6172742d636f6e7472616374206163636f756e7420697320637265617465642061742074686520636f6d707574656420616464726573732e202d20546865206063746f725f636f64656020697320657865637574656420696e2074686520636f6e74657874206f6620746865206e65776c792d63726561746564206163636f756e742e204275666665722072657475726e656420202061667465722074686520657865637574696f6e206973207361766564206173207468652060636f646560206f6620746865206163636f756e742e205468617420636f64652077696c6c20626520696e766f6b656420202075706f6e20616e792063616c6c2072656365697665642062792074686973206163636f756e742e202d2054686520636f6e747261637420697320696e697469616c697a65642e656e646f776d656e746761735f6c696d6974436f6d706163743c543a3a4761733e64617461204d616b657320612063616c6c20746f20616e206163636f756e742c206f7074696f6e616c6c79207472616e7366657272696e6720736f6d652062616c616e63652e202a20496620746865206163636f756e74206973206120736d6172742d636f6e7472616374206163636f756e742c20746865206173736f63696174656420636f64652077696c6c20626520657865637574656420616e6420616e792076616c75652077696c6c206265207472616e736665727265642e202a20496620746865206163636f756e74206973206120726567756c6172206163636f756e742c20616e792076616c75652077696c6c206265207472616e736665727265642e202a204966206e6f206163636f756e742065786973747320616e64207468652063616c6c2076616c7565206973206e6f74206c657373207468616e20606578697374656e7469616c5f6465706f736974602c206120726567756c6172206163636f756e742077696c6c206265206372656174656420616e6420616e792076616c75652077696c6c206265207472616e736665727265642e2053746f7265732074686520676976656e2062696e617279205761736d20636f646520696e746f2074686520636861696e27732073746f7261676520616e642072657475726e73206974732060636f646568617368602e20596f752063616e20696e7374616e746961746520636f6e747261637473206f6e6c7920776974682073746f72656420636f64652e636f6465205570646174657320746865207363686564756c6520666f72206d65746572696e6720636f6e7472616374732e20546865207363686564756c65206d7573742068617665206120677265617465722076657273696f6e207468616e207468652073746f726564207363686564756c652e7363686564756c655363686564756c653c543a3a4761733e00000000000018bb1000130000000000000000000000e30011000e000000000000000000000000000000000000000000000000000000000000002843110000be100000000000000000002cbb1000040000000000000001000000000000004cbb1000100000000000000000000000c30011000c000000000000000000000000000000000000000000000000000000000000002843110070bc100000000000000000005cbb10000100000000000000010000000000000064bb1000110000000000000000000000821c110003000000000000000000000000000000000000000000000000000000000000002843110078bb1000000000000000000088bb10000200000000000000010000000000000098bb10000b0000000000000000000000c30011000c000000000000000000000000000000000000000000000000000000000000002843110070bc10000000000000000000a4bb100001000000000000000100000000000000acbb1000110000000000000000000000c30011000c000000000000000000000000000000000000000000000000000000000000002843110070bc10000000000000000000c0bb100007000000000000000100000000000000f8bb10000f0000000000000000000000c30011000c000000000000000000000000000000000000000000000000000000000000002843110070bc1000000000000000000008bc10000200000000000000010000000000000018bc10000b0000000000000000000000c30011000c000000000000000000000000000000000000000000000000000000000000002843110070bc1000000000000000000024bc1000010000000000000001000000000000002cbc10000b0000000000000000000000c30011000c000000000000000000000000000000000000000000000000000000000000002843110070bc1000000000000000000038bc10000100000000000000010000000000000040bc1000120000000000000000000000c30011000c000000000000000000000000000000000000000000000000000000000000002843110070bc1000000000000000000054bc1000010000000000000001000000000000005cbc1000120000000000000000000000c30011000c000000000000000000000000000000000000000000000000000000000000002843110070bc1000000000000000000080bc10000100000000000000010000000000000088bc10000b0000000000000000000000c30011000c000000000000000000000000000000000000000000000000000000000000002843110094bc10000000000000000000a4bc100001000000000000000100000000000000acbc10000b0000000000000000000000b7bc1000060000000000000000000000000000000000000000000000000000000000000028431100c0bc10000000000000000000d0bc100001000000000000000100000000000000d8bc10000d0000000000000000000000b7bc1000060000000000000000000000000000000000000000000000000000000000000028431100e8bc10000000000000000000f8bc10000100000000000000010000000000000000bd1000080000000000000000000000c30011000c000000000000000000000000000000000000000000000000000000000000002843110008bd1000000000000000000018bd10000100000000000000010000000000000020bd1000080000000000000000000000821c110003000000000000000000000000000000000000000000000000000000000000002843110028bd1000000000000000000038bd10000100000000000000010000000000000040bd10000d0000000000000000000000b7bc100006000000000000000000000000000000000000000000000000000000000000002843110050bd1000000000000000000060bd10000100000000000000010000000000000068bd1000080000000000000000000000b7bc100006000000000000000000000000000000000000000000000000000000000000002843110000be1000000000000000000070bd10000100000000000000010000000000000078bd10000f000000000000000000000076b3100010000000000000000000000000000000000000000000000000000000000000002843110088bd1000000000000000000098bd100001000000000000000100000000000000a0bd10000c000000010100000000000032ad10000b00000000000000181a1100070000000000000000000000000000000000000028431100d8bd10000000000000000000acbd100001000000000000000000000000000000b4bd10000b000000010100000000000032ad10000b00000000000000bfbd1000160000000000000000000000000000000000000028431100d8bd10000000000000000000e8bd100001000000000000000000000000000000f0bd10000e000000000000000000000095d1100003000000000000000000000000000000000000000000000000000000000000002843110000be1000000000000000000010be10000100000000000000010000000000000018be10000e0000000101000000000000561c11000c0000000000000026be10000f000000000000000000000000000000000000002843110038be1000000000000000000048be10000100000000000000000000005369676e6564436c61696d48616e6469636170002ec4100038000000284311000000000066c4100042000000a8c410001a000000546f6d6273746f6e654465706f736974f9c310003500000053746f7261676553697a654f66667365740000003200000000000000010000003400000080c310004b000000cbc310002e00000052656e74427974654665650033c310004d00000052656e744465706f7369744f6666736574000000bbc1100041000000fcc1100016000000284311000000000012c210005a0000006cc2100056000000c2c210005300000015c310001e0000005375726368617267655265776172640068c1100039000000a1c110001a0000005472616e736665724665650043c11000250000004372656174696f6e466565001cc11000270000005472616e73616374696f6e426173654665650000e5c01000370000005472616e73616374696f6e4279746546656500003200000000000000010000003e000000a2c0100043000000436f6e7472616374466565003200000000000000010000004a00000072c010003000000043616c6c42617365466565543a3a4761730000003200000000000000010000004b00000040c0100032000000437265617465426173654665650000003200000000000000010000004c00000012c010002e000000476173507269636532000000000000000100000044000000f4bf10001e0000004d617844657074683200000000000000010000004d000000c2bf100032000000426c6f636b4761734c696d69740000003200000000000000010000004e00000086bf10003c0000004761735370656e7466bf10002000000043757272656e745363686564756c65003200000000000000010000004f00000041bf1000250000005072697374696e65436f6465e8be100059000000436f646553746f726167657761736d3a3a5072656661625761736d4d6f64756c65000000320000000000000001000000360000008fbe1000590000004163636f756e74436f756e7465720000320000000000000001000000500000007abe100015000000436f6e7472616374496e666f4f66436f6e7472616374496e666f3c543e0000003200000000000000010000003300000050be10002a0000002054686520636f6465206173736f6369617465642077697468206120676976656e206163636f756e742e20546865207375627472696520636f756e7465722e2041206d617070696e67206265747765656e20616e206f726967696e616c20636f6465206861736820616e6420696e737472756d656e746564207761736d20636f64652c20726561647920666f7220657865637574696f6e2e2041206d617070696e672066726f6d20616e206f726967696e616c20636f6465206861736820746f20746865206f726967696e616c20636f64652c20756e746f756368656420627920696e737472756d656e746174696f6e2e2043757272656e7420636f7374207363686564756c6520666f7220636f6e7472616374732e20476173207370656e7420736f2066617220696e207468697320626c6f636b2e20546865206d6178696d756d20616d6f756e74206f6620676173207468617420636f756c6420626520657870656e6465642070657220626c6f636b2e20546865206d6178696d756d206e657374696e67206c6576656c206f6620612063616c6c2f63726561746520737461636b2e20546865207072696365206f66206f6e6520756e6974206f66206761732e20546865206261736520666565206368617267656420666f72206372656174696e67206120636f6e74726163742e20546865206261736520666565206368617267656420666f722063616c6c696e6720696e746f206120636f6e74726163742e205468652066656520726571756972656420746f20637265617465206120636f6e747261637420696e7374616e63652e205468652066656520746f206265207061696420666f72206d616b696e672061207472616e73616374696f6e3b20746865207065722d6279746520706f7274696f6e2e205468652066656520746f206265207061696420666f72206d616b696e672061207472616e73616374696f6e3b2074686520626173652e205468652066656520726571756972656420746f2063726561746520616e206163636f756e742e205468652066656520726571756972656420746f206d616b652061207472616e736665722e205265776172642074686174206973207265636569766564206279207468652070617274792077686f736520746f75636820686173206c656420746f2072656d6f76616c206f66206120636f6e74726163742e2054686520616d6f756e74206f662066756e6473206120636f6e74726163742073686f756c64206465706f73697420696e206f7264657220746f206f66667365742074686520636f7374206f66206f6e6520627974652e204c6574277320737570706f736520746865206465706f73697420697320312c303030204255202862616c616e636520756e697473292f6279746520616e64207468652072656e7420697320312042552f627974652f6461792c207468656e206120636f6e7472616374207769746820312c3030302c3030302042552074686174207573657320312c303030206279746573206f662073746f7261676520776f756c6420706179206e6f2072656e742e20427574206966207468652062616c616e6365207265647563656420746f203530302c30303020425520616e64207468652073746f7261676520737461796564207468652073616d6520617420312c3030302c207468656e20697420776f756c6420706179203530302042552f6461792e205072696365206f6620612062797465206f662073746f7261676520706572206f6e6520626c6f636b20696e74657276616c2e2053686f756c642062652067726561746572207468616e20302e2053697a65206f66206120636f6e7472616374206174207468652074696d65206f66206372656174696f6e2e205468697320697320612073696d706c652077617920746f20656e73757265207468617420656d70747920636f6e747261637473206576656e7475616c6c7920676574732064656c657465642e20546865206d696e696d756d20616d6f756e7420726571756972656420746f2067656e6572617465206120746f6d6273746f6e652e204e756d626572206f6620626c6f636b2064656c617920616e2065787472696e73696320636c61696d20737572636861726765206861732e205768656e20636c61696d2073757263686167652069732063616c6c656420627920616e2065787472696e736963207468652072656e7420697320636865636b656420666f722063757272656e745f626c6f636b202d2064656c6179436f6e747261637420436f646553746f72616765636f6465206973206e6f7420666f756e64436f6e7472616374205072697374696e65436f64657072697374696e6520636f6465206973206e6f7420666f756e64000067c710001e00000085c710001f00000066756e6374696f6e5f73656374696f6e5f6c656e20213d20303b2071656466756e6374696f6e5f73656374696f6e5f6c656e20213d20303b2066756e6374696f6e5f73656374696f6e5f6c656e203d3d20636f64655f73656374696f6e5f6c656e3b2071656400004dc710001a00000028c710000a00000032c710001b00000073746172742066756e6374696f6e20657870656374656420746f20686176652074797065205b5d202d3e205b5d00000080c610001100000060c610002000000040c610002000000018c61000280000007365676d656e74206f66667365742073686f756c642072657475726e20493332746f6f206d616e79206d656d6f727920726567696f6e7320696e20696e6465782073706163653a20746f6f206d616e79207461626c657320696e20696e6465782073706163653a20747279696e6720746f20696d706f7274206d757461626c6520676c6f62616c206475706c6963617465206578706f727420000000acc610001c000000c8c610005a0000004d0000002800000048617368207461626c65206361706163697479206f766572666c6f772f686f6d652f616e6472652f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f6861736862726f776e2d302e312e382f7372632f7261772f6d6f642e72730000ffffffff46756e6374696f6e20232072656164696e672f76616c69646174696f6e206572726f723a204d697373696e6720626f647920666f722066756e6374696f6e206c656e677468206f662066756e6374696f6e2073656374696f6e206973202c207768696c65206c656e206f6620636f64652073656374696f6e20697320703b11002800000054a71000430000005801000001000000436f6e74726163742043757272656e745363686564756c656e6577207363686564756c65206d7573742068617665206120677265617465722076657273696f6e207468616e2063757272656e747468657265206973206e6f7420656e6f7567682067617320666f722073746f72696e672074686520636f6465436f6e7472616374205369676e6564436c61696d48616e6469636170436f6e747261637420537572636861726765526577617264496e76616c69642073757263686172676520636c61696d3a206f726967696e206d757374206265207369676e6564206f7220696e686572656e7420616e6420617578696c696172792073656e646572206f6e6c792070726f7669646564206f6e20696e686572656e7443616e6e6f7420726573746f72652066726f6d20696e6578697374696e67206f7220746f6d6273746f6e6520636f6e74726163744f726967696e20547269654964207772697474656e20696e207468652063757272656e7420626c6f636b546f6d6273746f6e657320646f6e2774206d6174636843616e6e6f7420726573746f726520746f20696e6578697374696e67206f7220616c69766520636f6e7472616374436f6e7472616374204d61784465707468436f6e747261637420436f6e7472616374466565436f6e7472616374204372656174696f6e466565436f6e7472616374205472616e73666572466565436f6e74726163742043616c6c42617365466565436f6e7472616374204372656174654261736546656552657475726e207479706573206c656e6774682073686f756c642062652030206f722031626164206f726967696e3a20657870656374656420746f206265206e6f206f726967696e626164206f726967696e3a20657870656374656420746f206265206120726f6f74206f726967696e626164206f726967696e3a20657870656374656420746f2062652061207369676e6564206f726967696e3a65787472696e7369635f696e64657854696d657374616d702044696455706461746553797374656d2045787472696e736963436f756e7453797374656d20416c6c45787472696e7369637357656967687400f0ca10002b0000001bcb100044000000f70000000400000054696d657374616d70206d7573742062652075706461746564206f6e636520696e2074686520626c6f636b2f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f74696d657374616d702f7372632f6c69622e727353797374656d2045787472696e73696344617461008ccb1000300000001bcb100044000000e10000000400000054696d657374616d70206d7573742062652075706461746564206f6e6c79206f6e636520696e2074686520626c6f636bd4cb10004e0000001bcb100044000000e20000000400000054696d657374616d70206d75737420696e6372656d656e74206279206174206c65617374203c4d696e696d756d506572696f643e206265747765656e2073657175656e7469616c20626c6f636b7354696d657374616d70204e6f7753797374656d204e756d62657253797374656d2045787472696e73696373526f6f7454696d657374616d7020426c6f636b506572696f6454696d657374616d70204d696e696d756d506572696f6453797374656d2044696765737453797374656d20426c6f636b4861736853797374656d204163636f756e744e6f6e6365000000d0cc100019000000f0cc100048000000bb0100002d0000000000000000000000617474656d707420746f20646976696465206279207a65726f000000000000002f72757374632f343030623430396566633439373561303832313835633561373434313235373265343964666439382f7372632f6c6962636f72652f6f70732f61726974682e7273703b11002800000050cd100041000000c3000000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f73797374656d2f7372632f6c69622e727300000050cd100041000000c30000000100000054696d657374616d7020746f6f2066617220696e2066757475726520746f206163636570744765747320616e64206465636f6465732074696d657374616d7020696e686572656e74206461746173657269616c697a656420617267732073686f756c642062652070726f7669646564206279207468652072756e74696d653b0a090909636f72726563746c792073657269616c697a656420646174612073686f756c6420626520646573657269616c697a61626c653b0a090909716564000000703b110028000000983b110050000000370100000900000053797374656d20506172656e744861736853797374656d2052616e646f6d4d6174657269616c0000f0ce1000480000008d0a00000e00000053797374656d204576656e747353797374656d204576656e74436f756e7453797374656d204576656e74546f706963730000000000000000000000002f72757374632f343030623430396566633439373561303832313835633561373434313235373265343964666439382f7372632f6c6962636f72652f736c6963652f6d6f642e72730000000014d0100006000000000000001cd0100001000000000000000000000034d010000100000000000000000000003cd010000e000000000000004cd0100001000000000000000000000064d010000100000000000000000000006cd01000080000000000000074d010000100000000000000000000008cd0100001000000000000000000000094d010000b00000000000000a0d01000010000000000000000000000b8d01000010000000000000000000000c0d010000c00000000000000ccd01000010000000000000000000000e4d01000010000000000000072656d61726b000000000000b3d110000700000000000000181a11000700000098d110001b0000007365745f686561705f706167657300000000000090d11000050000000000000095d110000300000051d110003f0000007365745f636f646500000000c5ed10000300000000000000181a1100070000003fd11000120000007365745f73746f7261676500000000002dd11000050000000000000032d110000d00000012d110001b0000006b696c6c5f73746f7261676500000000081a110004000000000000000ad1100008000000ecd010001e000000204b696c6c20736f6d65206974656d732066726f6d2073746f726167652e5665633c4b65793e2053657420736f6d65206974656d73206f662073746f726167652e6974656d735665633c4b657956616c75653e2053657420746865206e657720636f64652e2053657420746865206e756d626572206f6620706167657320696e2074686520576562417373656d626c7920656e7669726f6e6d656e74277320686561702e7061676573753634204d616b6520736f6d65206f6e2d636861696e2072656d61726b2e5f72656d61726b53797374656d0000000038d610000c0000000101000000000000561c11000c0000000000000044d6100008000000000000000000000000000000000000002843110084e1100000000000000000004cd610000100000000000000010000000000000054d610000e0000000000000000000000821c1100030000000000000000000000000000000000000000000000000000000000000028431100a8e11000000000000000000064d61000010000000000000000000000000000006cd61000130000000000000000000000821c1100030000000000000000000000000000000000000000000000000000000000000028431100a8e11000000000000000000080d610000100000000000000000000000000000088d61000090000000101000000000000e30011000e00000000000000040f110007000000000000000000000000000000000000002843110038d71000000000000000000094d61000010000000000000001000000000000009cd610000d0000000101000000000000821c11000300000000000000181a1100070000000000000000000000000000000000000028431100acd610000000000000000000bcd6100001000000000000000100000000000000c4d610000e0000000000000000000000d2d61000120000000000000000000000000000000000000000000000000000000000000028431100e4d610000000000000000000f4d610000200000000000000010000000000000004d71000060000000000000000000000e30011000e000000000000000000000000000000000000000000000000000000000000002843110084e1100000000000000000000cd710000100000000000000010000000000000014d710000a0000000000000000000000040f110007000000000000000000000000000000000000000000000000000000000000002843110038d71000000000000000000020d710000100000000000000010000000000000028d710000e0000000000000000000000040f110007000000000000000000000000000000000000000000000000000000000000002843110038d71000000000000000000048d710000100000000000000010000000000000050d7100006000000000000000000000056d710000b000000000000000000000000000000000000000000000000000000000000002843110064d71000000000000000000074d71000010000000000000001000000000000007cd7100006000000000000000000000082d71000230000000000000000000000000000000000000000000000000000000000000028431100a8d710000000000000000000b8d7100001000000000000000100000000000000c0d710000a0000000000000000000000cad710000a0000000000000000000000000000000000000000000000000000000000000028431100d4d710000000000000000000e4d7100001000000000000000100000000000000ecd710000b0000000201010000000000f7d710000200000000000000040f11000700000000000000f9d710002100000000000000284311001cd8100000000000000000002cd810000d00000000000000010000004163636f756e744e6f6e6365543a3a496e64657815de10001f00000045787472696e736963436f756e740000e7dd10002e000000416c6c45787472696e7369637357656967687400a2dd100045000000426c6f636b486173680000007cdd10002600000045787472696e73696344617461000000320000000000000001000000350000002ddd10004f00000052616e646f6d4d6174657269616c2869382c205665633c543a3a486173683e293200000000000000010000005100000070dc100069000000d9dc1000540000004e756d62657200002edc100042000000506172656e7448617368000012dc10001c00000045787472696e73696373526f6f74000032000000000000000100000052000000cddb1000450000004469676573744469676573744f663c543e0000003200000000000000010000003500000091db10003c0000004576656e74735665633c4576656e745265636f72643c543a3a4576656e742c20543a3a486173683e3e0000003200000000000000010000003500000069db1000280000004576656e74436f756e744576656e74496e646578320000000000000001000000340000003bdb10002e0000004576656e74546f7069637328295665633c28543a3a426c6f636b4e756d6265722c204576656e74496e646578293e00003200000000000000010000003500000094d8100049000000ddd8100025000000284311000000000002d910004b0000004dd910002a000000284311000000000077d9100054000000cbd91000510000001cda100039000000284311000000000055da100053000000a8da100053000000fbda100040000000204d617070696e67206265747765656e206120746f7069632028726570726573656e74656420627920543a3a486173682920616e64206120766563746f72206f6620696e6465786573206f66206576656e747320696e2074686520603c4576656e74733c543e3e60206c6973742e20546865206669727374206b657920736572766573206e6f20707572706f73652e2054686973206669656c64206973206465636c6172656420617320646f75626c655f6d6170206a75737420666f7220636f6e76656e69656e6365206f66207573696e67206072656d6f76655f707265666978602e20416c6c20746f70696320766563746f727320686176652064657465726d696e69737469632073746f72616765206c6f636174696f6e7320646570656e64696e67206f6e2074686520746f7069632e205468697320616c6c6f7773206c696768742d636c69656e747320746f206c6576657261676520746865206368616e67657320747269652073746f7261676520747261636b696e67206d656368616e69736d20616e6420696e2063617365206f66206368616e67657320666574636820746865206c697374206f66206576656e7473206f6620696e7465726573742e205468652076616c756520686173207468652074797065206028543a3a426c6f636b4e756d6265722c204576656e74496e646578296020626563617573652069662077652075736564206f6e6c79206a7573742074686520604576656e74496e64657860207468656e20696e20636173652069662074686520746f70696320686173207468652073616d6520636f6e74656e7473206f6e20746865206e65787420626c6f636b206e6f206e6f74696669636174696f6e2077696c6c20626520747269676765726564207468757320746865206576656e74206d69676874206265206c6f73742e20546865206e756d626572206f66206576656e747320696e2074686520604576656e74733c543e60206c6973742e204576656e7473206465706f736974656420666f72207468652063757272656e7420626c6f636b2e20446967657374206f66207468652063757272656e7420626c6f636b2c20616c736f2070617274206f662074686520626c6f636b206865616465722e2045787472696e7369637320726f6f74206f66207468652063757272656e7420626c6f636b2c20616c736f2070617274206f662074686520626c6f636b206865616465722e2048617368206f66207468652070726576696f757320626c6f636b2e205468652063757272656e7420626c6f636b206e756d626572206265696e672070726f6365737365642e205365742062792060657865637574655f626c6f636b602e20536572696573206f6620626c6f636b20686561646572732066726f6d20746865206c61737420383120626c6f636b73207468617420616374732061732072616e646f6d2073656564206d6174657269616c2e205468697320697320617272616e67656420617320612072696e6720627566666572207769746820746865206069386020707265666978206265696e672074686520696e64657820696e746f20746865206056656360206f6620746865206f6c6465737420686173682e2045787472696e73696373206461746120666f72207468652063757272656e7420626c6f636b20286d61707320616e2065787472696e736963277320696e64657820746f206974732064617461292e204d6170206f6620626c6f636b206e756d6265727320746f20626c6f636b206861736865732e20546f74616c2077656967687420666f7220616c6c2065787472696e736963732070757420746f6765746865722c20666f72207468652063757272656e7420626c6f636b2e20546f74616c2065787472696e7369637320636f756e7420666f72207468652063757272656e7420626c6f636b2e2045787472696e73696373206e6f6e636520666f72206163636f756e74732e0000000060de1000030000000000000064de10000100000000000000000000007cde100008000000000000007365740000000000f7df10000300000000000000fadf100012000000bcde1000160000002843110000000000d2de10005d0000002fdf10002f00000028431100000000005edf1000630000002843110000000000c1df10003600000020536574207468652063757272656e742074696d652e20546869732063616c6c2073686f756c6420626520696e766f6b65642065786163746c79206f6e63652070657220626c6f636b2e2049742077696c6c2070616e6963206174207468652066696e616c697a6174696f6e2070686173652c20696620746869732063616c6c206861736e2774206265656e20696e766f6b656420627920746861742074696d652e205468652074696d657374616d702073686f756c642062652067726561746572207468616e207468652070726576696f7573206f6e652062792074686520616d6f756e742073706563696669656420627920606d696e696d756d5f706572696f64602e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d7573742062652060496e686572656e74602e6e6f77436f6d706163743c543a3a4d6f6d656e743e54696d657374616d700000000000000078e110000300000000000000000000007be1100009000000000000000000000000000000000000000000000000000000000000002843110084e11000000000000000000094e11000010000000000000001000000000000009ce110000b00000000000000000000007be11000090000000000000000000000000000000000000000000000000000000000000028431100a8e110000000000000000000b8e1100001000000000000000000000000000000c0e110000d00000000000000000000007be11000090000000000000000000000000000000000000000000000000000000000000028431100d0e110000000000000000000e0e110000400000000000000010000000000000000e210000900000000000000000000002f1c11000400000000000000000000000000000000000000000000000000000000000000284311000ce2100000000000000000001ce210000100000000000000010000004e6f77543a3a4d6f6d656e7432000000000000000100000050000000cbe3100024000000426c6f636b506572696f6400320000000000000001000000360000007ae31000510000004d696e696d756d506572696f640000003200000000000000010000005300000051e210005a000000abe210005a00000005e31000590000005ee310001c0000004469645570646174650000003200000000000000010000003600000024e210002d00000020446964207468652074696d657374616d7020676574207570646174656420696e207468697320626c6f636b3f20546865206d696e696d756d20706572696f64206265747765656e20626c6f636b732e204265776172652074686174207468697320697320646966666572656e7420746f20746865202a65787065637465642a20706572696f6420746861742074686520626c6f636b2070726f64756374696f6e206170706172617475732070726f76696465732e20596f75722063686f73656e20636f6e73656e7375732073797374656d2077696c6c2067656e6572616c6c7920776f726b2077697468207468697320746f2064657465726d696e6520612073656e7369626c6520626c6f636b2074696d652e20652e672e20466f7220417572612c2069742077696c6c20626520646f75626c65207468697320706572696f64206f6e2064656661756c742073657474696e67732e204f6c642073746f72616765206974656d2070726f766964656420666f7220636f6d7061746962696c6974792e2052656d6f766520616674657220616c6c206e6574776f726b732075706772616465642e2043757272656e742074696d6520666f72207468652063757272656e7420626c6f636b2e3a6865617070616765733a636f646566696e616c6e756d46696e616c697a6564206e756d62657220696e686572656e742064617461206e6f7420666f756e644772616e64706146696e616c697479205374616c6c6564000000703b11002800000060e410003f00000069000000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f7375646f2f7372632f6c69622e727300c0e4100019000000e0e4100042000000520000001f0000000000000000000000617474656d707420746f20646976696465206279207a65726f000000000000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f6e6f64652f72756e74696d652f7372632f6c69622e7273576974686472617720686173206265656e20636865636b65642061626f76653b0a09090909676f5f62656c6f775f73756273697374656e63652069732066616c736520616e642073756273697374656e6365203e206578697374656e6369616c5f6465706f7369743b0a0909090971656443616e20776974686472617720616e6420646f6e277420676f2062656c6f772073756273697374656e63654772616e64706146696e616c6974792050656e64696e674368616e67654772616e64706146696e616c69747920417574686f7269746965734772616e64706146696e616c697479204e657874466f7263656473797374656d696e646963657362616c616e63657373657373696f6e7374616b696e6764656d6f6372616379636f756e63696c636f756e63696c5f6d6f74696f6e736772616e6470617472656173757279636f6e74726163747375646f00000000000000c8e610000500000000000000d0e61000010000000000000000000000d8e61000010000000000000000000000e0e610000a00000000000000ece61000010000000000000000000000f4e61000010000000000000053756469640000002f1c11000400000038e71000180000004b65794368616e6765640000f608110009000000fce610003c00000020546865207375646f6572206a757374207377697463686564206964656e746974793b20746865206f6c64206b657920697320737570706c6965642e2041207375646f206a75737420746f6f6b20706c6163652e60e410003f00000069000000010000005375646f204b65796f6e6c79207468652063757272656e74207375646f206b65792063616e206368616e676520746865207375646f206b65796f6e6c79207468652063757272656e74207375646f206b65792063616e207375646f000000000010e610000600000000000000540000000000000000000000550000000000000000000000000000005600000000000000000000000000000057000000000000000000000000000000f4eb10000400000000000000580000000000000002000000000000000000000000000000020000000000000000000000000000000200000000000000000000000000000000000000f8eb100009000000000000005900000000000000000000005a0000000000000000000000000000005b0000000000000000000000020000000000000000000000000000000000000016e6100007000000000000005c00000000000000000000005d0000000000000000000000000000005e0000000000000000000000000000005f0000000000000000000000000000001de61000080000000000000060000000000000000000000061000000000000000000000000000000620000000000000000000000000000006300000000000000000000000000000025e6100007000000000000006400000000000000000000006500000000000000000000000000000066000000000000000000000000000000670000000000000000000000000000002ce610000700000000000000680000000000000000000000690000000000000000000000000000006a0000000000000000000000000000006b00000000000000000000000000000033e6100009000000000000006c00000000000000000000006d0000000000000000000000000000006e0000000000000000000000000000006f0000000000000000000000000000003ce61000070000000000000070000000000000000000000071000000000000000000000000000000720000000000000000000000000000007300000000000000000000000000000043e610000f0000000000000074000000000000000000000075000000000000000000000000000000760000000000000000000000000000007700000000000000000000000000000001ec1000100000000000000058000000000000000200000000000000000000000000000000000000780000000000000000000000020000000000000000000000000000000000000052e6100007000000000000007900000000000000000000007a0000000000000000000000000000007b0000000000000000000000000000007c00000000000000000000000000000059e6100008000000000000007d00000000000000000000007e0000000000000000000000000000007f0000000000000000000000000000008000000000000000000000000000000061e61000080000000000000081000000000000000000000082000000000000000000000000000000830000000000000000000000000000008400000000000000000000000000000069e61000040000000000000085000000000000000000000086000000000000000000000000000000870000000000000000000000000000008800000000000000000000006175726174696d657374616d7066696e616c6974795f747261636b65720000000000000069e6100004000000000000006cec100001000000000000000000000084ec1000090000000000000000000000ccec10000700000000000000d4ec1000010000000000000000000000ecec1000090000000000000000000000fc0e1100080000000000000026ee100010000000c8ed10004e000000284311000000000091ed1000340000002843110000000000d31911000b000000de191100080000007afb10001900000016ee100010000000fc1911000c0000007365745f6b65790000000000c5ed100003000000000000009efd10002300000034ed10005d000000284311000000000091ed1000340000002843110000000000d31911000b000000de191100080000007afb10001900000093fb100011000000fc1911000c0000002041757468656e74696361746573207468652063757272656e74207375646f206b657920616e6420736574732074686520676976656e204163636f756e7449642028606e6577602920617320746865206e6577207375646f206b65792e20546865206469737061746368206f726967696e20666f7220746869732063616c6c206d757374206265205f5369676e65645f2e6e65772041757468656e7469636174657320746865207375646f206b657920616e64206469737061746368657320612066756e6374696f6e2063616c6c20776974682060526f6f7460206f726967696e2e202d204e6f204442207772697465732e426f783c543a3a50726f706f73616c3e00000000000090ee1000030000000000000000000000561c11000c000000000000000000000000000000000000000000000000000000000000002843110094ee10000000000000000000a4ee10000100000000000000010000004b65790032000000000000000100000089000000acee1000210000002054686520604163636f756e74496460206f6620746865207375646f206b65792e5375646f0000000000000000ef1000120000000000000014ef10000100000000000000000000002cef100001000000000000007265706f72745f6d69736265686176696f720000000000004def10000700000000000000181a11000700000034ef100019000000205265706f727420736f6d65206d69736265686176696f722e5f7265706f727400000000b4f010000b0000000000000000000000bff01000230000000000000000000000000000000000000000000000000000000000000028431100e4f010000000000000000000f4f0100001000000000000000100000000000000fcf010000d000000000000000000000009f1100023000000000000000000000000000000000000000000000000000000000000002843110070f1100000000000000000002cf110000100000000000000000000000000000034f110000a0000000000000000000000e30011000e000000000000000000000000000000000000000000000000000000000000002843110070f11000000000000000000040f110000100000000000000000000000000000048f110000700000000000000000000004ff1100020000000000000000000000000000000000000000000000000000000000000002843110070f11000000000000000000080f11000010000000000000000000000417574686f7269746965735665633c28417574686f7269747949642c20417574686f72697479576569676874293e0000320000000000000001000000350000000cf210001b00000050656e64696e674368616e676553746f72656450656e64696e674368616e67653c543a3a426c6f636b4e756d6265723edbf11000310000004e657874466f726365640000acf110002f0000005374616c6c656428543a3a426c6f636b4e756d6265722c20543a3a426c6f636b4e756d62657229003200000000000000010000003600000088f110002400000020607472756560206966207765206172652063757272656e746c79207374616c6c65642e206e65787420626c6f636b206e756d6265722077686572652077652063616e20666f7263652061206368616e67652e2050656e64696e67206368616e67653a20287369676e616c65642061742c207363686564756c6564206368616e6765292e205468652063757272656e7420617574686f72697479207365742e4772616e64706146696e616c6974794e6f206f74686572206572726f72732061726520616363657074656420616674657220616e2068617264206572726f7221496e686572656e7420776974682073616d65206964656e74696669657220616c726561647920657869737473215468657265206973206f6e6c79206f6e6520666174616c206572726f723b207165647375627374726174652d6e6f6465df6acb689907609b0200000037e397fc7c91f5e40100000040fe3ad401f8959a03000000d2bc9897eed08f1501000000f78b278be53f454c01000000ed99c5acb25eedf502000000dd718d5cc53262d40100000046524e4b99f310000d0000007ef310001b0000003cf31000420000001e010000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f6e6f64652f72756e74696d652f7372632f6c69622e727342616420696e70757420646174612070726f766964656420746f20657865637574655f626c6f636b0000b0f3100010000000696e697469616c697a655f626c6f636bc8f310000f0000006170706c795f65787472696e73696300e0f3100013000000696e686572656e745f65787472696e7369637300fcf310000f000000636865636b5f696e686572656e74730014f410001400000076616c69646174655f7472616e73616374696f6e30f410000f0000006f6666636861696e5f776f726b65720048f41000160000006772616e6470615f70656e64696e675f6368616e6765000068f41000150000006772616e6470615f666f726365645f6368616e6765000000000000009806110008000000000000005cf5100001000000000000000000000064f510000100000000000000000000006cf51000080000000000000074f510000100000000000000000000007cf5100001000000000000000000000084f5100007000000000000008cf51000030000000000000000000000a4f51000010000000000000000000000acf51000050000000000000074f51000010000000000000000000000b4f51000010000000000000000000000bcf51000080000000000000074f51000010000000000000000000000c4f5100001000000000000006d0911000d0000009cf610000e0000005370656e64696e675bf610000700000062f610003a00000041776172646564006d0911000d0000005bf6100007000000f6081100090000003bf61000200000004275726e7400000018f6100023000000526f6c6c6f766572ccf510004c000000205370656e64696e67206861732066696e69736865643b20746869732069732074686520616d6f756e74207468617420726f6c6c73206f76657220756e74696c206e657874207370656e642e20536f6d65206f66206f75722066756e64732068617665206265656e206275726e742e20536f6d652066756e64732068617665206265656e20616c6c6f63617465642e42616c616e6365205765206861766520656e6465642061207370656e6420706572696f6420616e642077696c6c206e6f7720616c6c6f636174652066756e64732e204e65772070726f706f73616c2e547265617375727920506f7454726561737572792050726f706f73616c73703b110028000000e0f61000430000006b000000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f74726561737572792f7372632f6c69622e727300e0f61000430000006b000000010000004469676573744974656d206e6f7420657175616c00f81000480000008d0a00000e00000090f7100019000000b0f7100047000000e20000000a00000090f7100019000000b0f7100047000000df0000000a0000000000000000000000617474656d707420746f20646976696465206279207a65726f000000000000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f7374616b696e672f7372632f70687261676d656e2e72730000000000000000002f72757374632f343030623430396566633439373561303832313835633561373434313235373265343964666439382f7372632f6c6962636f72652f736c6963652f6d6f642e72730000000024f910000d0000000000000034f9100002000000000000000000000064f91000090000000000000000000000acf910000700000000000000b4f91000010000000000000000000000ccf91000010000000000000000000000d4f910000900000000000000e0f9100004000000000000000000000040fa100001000000000000000000000048fa10000f0000000000000058fa100001000000000000000000000070fa1000070000000000000000000000a8fa1000100000000000000058fa1000010000000000000000000000b8fa1000080000000000000070726f706f73655f7370656e64000000000000008efd100005000000000000004cfc1000150000000000000093fd10000b000000000000009efd100023000000bcfc10004b00000007fd10004d00000054fd1000150000002843110000000000d31911000b000000de191100080000007afb10001900000069fd100025000000fc1911000c0000007365745f706f740000000000b5fc100007000000000000004cfc10001500000088fc10002d000000636f6e666967757265000000000000001afc10000d0000000000000027fc1000100000000000000037fc100015000000000000004cfc1000150000000000000061fc10000c000000000000006dfc1000170000000000000084fc1000040000000000000027fc100010000000fefb10001c00000072656a6563745f70726f706f73616c0000000000f3fb10000b00000000000000100f110016000000a4fb10003f0000002843110000000000d31911000b000000de191100080000007afb100019000000e3fb100010000000fc1911000c000000617070726f76655f70726f706f73616cf8fa1000570000004ffb10002b0000002843110000000000d31911000b000000de191100080000007afb10001900000093fb100011000000fc1911000c00000020417070726f766520612070726f706f73616c2e2041742061206c617465722074696d652c207468652070726f706f73616c2077696c6c20626520616c6c6f636174656420746f207468652062656e656669636961727920616e6420746865206f726967696e616c206465706f7369742077696c6c2062652072657475726e65642e202d204c696d697465642073746f726167652072656164732e202d204f6e65204442206368616e67652e2052656a65637420612070726f706f736564207370656e642e20546865206f726967696e616c206465706f7369742077696c6c20626520736c61736865642e202d204f6e6520444220636c6561722e70726f706f73616c5f6964202852652d29636f6e6669677572652074686973206d6f64756c652e70726f706f73616c5f626f6e64436f6d706163743c5065726d696c6c3e70726f706f73616c5f626f6e645f6d696e696d756d436f6d706163743c42616c616e63654f663c543e3e7370656e645f706572696f64436f6d706163743c543a3a426c6f636b4e756d6265723e6275726e20536574207468652062616c616e6365206f662066756e647320617661696c61626c6520746f207370656e642e6e65775f706f742050757420666f727761726420612073756767657374696f6e20666f72207370656e64696e672e2041206465706f7369742070726f706f7274696f6e616c20746f207468652076616c756520697320726573657276656420616e6420736c6173686564206966207468652070726f706f73616c2069732072656a65637465642e2049742069732072657475726e6564206f6e6365207468652070726f706f73616c20697320617761726465642e202d204f6e65204442206368616e67652c206f6e6520657874726120444220656e7472792e76616c756562656e65666963696172793c543a3a4c6f6f6b7570206173205374617469634c6f6f6b75703e3a3a536f757263655472656173757279000000000000008c0011000c000000000000000000000098001100070000000000000000000000000000000000000000000000000000000000000028431100340111000000000000000000a000110002000000000000000100000000000000b0001100130000000000000000000000c30011000c00000000000000000000000000000000000000000000000000000000000000284311001c0111000000000000000000d000110001000000000000000100000000000000d80011000b0000000000000000000000e30011000e0000000000000000000000000000000000000000000000000000000000000028431100f4001100000000000000000004011100010000000000000001000000000000000c01110004000000000000000000000098001100070000000000000000000000000000000000000000000000000000000000000028431100340111000000000000000000100111000100000000000000010000000000000018011100030000000000000000000000c30011000c00000000000000000000000000000000000000000000000000000000000000284311001c01110000000000000000002c01110001000000000000000100000000000000041211000d00000000000000000000006d0911000d00000000000000000000000000000000000000000000000000000000000000284311003401110000000000000000004401110001000000000000000100000000000000881111000900000001010000000000006d0911000d000000000000004c01110024000000000000000000000000000000000000002843110070011100000000000000000080011100010000000000000000000000000000008801110009000000000000000000000091011100120000000000000000000000000000000000000000000000000000000000000028431100a40111000000000000000000b401110001000000000000000100000050726f706f73616c426f6e645065726d696c6c002d03110055000000820311004400000050726f706f73616c426f6e644d696e696d756d42616c616e63654f663c543e00db021100520000005370656e64506572696f64543a3a426c6f636b4e756d6265720000003200000000000000010000008a000000b9021100220000004275726e7502110044000000506f74003200000000000000010000003e000000420211003300000032000000000000000100000034000000190211002900000050726f706f73616c3c543a3a4163636f756e7449642c2042616c616e63654f663c543e3e32000000000000000100000036000000fa0111001f000000417070726f76616c735665633c50726f706f73616c496e6465783e0032000000000000000100000035000000bc0111003e0000002050726f706f73616c20696e646963657320746861742068617665206265656e20617070726f76656420627574206e6f742079657420617761726465642e2050726f706f73616c7320746861742068617665206265656e206d6164652e204e756d626572206f662070726f706f73616c7320746861742068617665206265656e206d6164652e20546f74616c2066756e647320617661696c61626c6520746f2074686973206d6f64756c6520666f72207370656e64696e672e2050657263656e74616765206f662073706172652066756e64732028696620616e7929207468617420617265206275726e7420706572207370656e6420706572696f642e20506572696f64206265747765656e2073756363657373697665207370656e64732e204d696e696d756d20616d6f756e74206f662066756e647320746861742073686f756c6420626520706c6163656420696e2061206465706f73697420666f72206d616b696e6720612070726f706f73616c2e204672616374696f6e206f6620612070726f706f73616c27732076616c756520746861742073686f756c6420626520626f6e64656420696e206f7264657220746f20706c616365207468652070726f706f73616c2e20416e2061636365707465642070726f706f73616c2067657473207468657365206261636b2e20412072656a65637465642070726f706f73616c20646f6573206e6f742e5472656173757279205370656e64506572696f64000020041100390000006004110048000000100200002d000000547265617375727920417070726f76616c735472656173757279204275726e00000000000000000000000000617474656d707420746f2063616c63756c617465207468652072656d61696e646572207769746820612064697669736f72206f66207a65726f000000000000002f72757374632f343030623430396566633439373561303832313835633561373434313235373265343964666439382f7372632f6c6962636f72652f6f70732f61726974682e727300f8100048000000870a00000a00000050726f706f73657227732062616c616e636520746f6f206c6f7754726561737572792050726f706f73616c426f6e644d696e696d756d54726561737572792050726f706f73616c426f6e6454726561737572792050726f706f73616c436f756e744e6f2070726f706f73616c206174207468617420696e6465782f686f6d652f616e6472652f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f7061726974792d636f6465632d332e352e312f7372632f636f6465632e727300000000000000980611000800000000000000a0061100040000000000000000000000c0061100020000000000000000000000d00611000500000000000000d8061100050000000000000000000000000711000200000000000000000000001007110008000000000000001807110001000000000000000000000020071100010000000000000000000000280711000b0000000000000018071100010000000000000000000000340711000100000000000000000000003c071100080000000000000044071100020000000000000000000000540711000100000000000000000000005c0711000e00000000000000440711000200000000000000000000006c071100010000000000000050726f706f736564f6081100090000006d0911000d0000000408110004000000ff0811000b0000000a091100530000005d09110010000000566f746564000000f60811000900000004081100040000002f1c110004000000ff0811000b000000ff0811000b0000006e08110042000000b008110046000000417070726f76656404081100040000003d08110031000000446973617070726f766564000808110035000000457865637574656404081100040000002f1c110004000000c3071100410000004d656d62657245786563757465640000740711004f00000020412073696e676c6520636f756e63696c6c6f722064696420736f6d6520616374696f6e3b2060626f6f6c6020697320747275652069662072657475726e656420776974686f7574206572726f722e2041206d6f74696f6e207761732065786563757465643b2060626f6f6c6020697320747275652069662072657475726e656420776974686f7574206572726f722e486173682041206d6f74696f6e20776173206e6f7420617070726f76656420627920746865207265717569726564207468726573686f6c642e2041206d6f74696f6e2077617320617070726f76656420627920746865207265717569726564207468726573686f6c642e2041206d6f74696f6e2028676976656e20686173682920686173206265656e20766f746564206f6e20627920676976656e206163636f756e742c206c656176696e6720612074616c6c79202879657320766f74657320616e64206e6f20766f74657320676976656e20726573706563746976656c7920617320604d656d626572436f756e7460292e4163636f756e7449644d656d626572436f756e742041206d6f74696f6e2028676976656e20686173682920686173206265656e2070726f706f7365642028627920676976656e206163636f756e742920776974682061207468726573686f6c642028676976656e20604d656d626572436f756e7460292e50726f706f73616c496e646578000000000000a80911000f00000000000000b8091100020000000000000000000000c809110004000000000000004e65774163636f756e74496e64657800f608110009000000630a11000c000000e80911002200000028431100000000000a0a1100410000004b0a1100180000002041206e6577206163636f756e7420696e646578207761732061737369676e65642e2054686973206576656e74206973206e6f7420747269676765726564207768656e20616e206578697374696e6720696e64657820697320726561737369676e656420746f20616e6f7468657220604163636f756e744964602e4163636f756e74496e646578496e76616c6964206f726967696e496e646963657320456e756d536574b00a110019000000d00a110048000000bb0100002d000000000000000000000000000000617474656d707420746f20646976696465206279207a65726f000000000000002f72757374632f343030623430396566633439373561303832313835633561373434313235373265343964666439382f7372632f6c6962636f72652f6f70732f61726974682e7273703b110028000000300b1100420000004a000000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f696e64696365732f7372632f6c69622e72730000703b1100280000008c0b1100460000006b000000010000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f636f756e63696c2f7372632f6d6f74696f6e732e72730000dc0b11002a000000696e7465726e616c206572726f723a20656e746572656420756e726561636861626c6520636f64653a200000100c1100230000005f5f5068616e746f6d4974656d2073686f756c64206e6576657220626520757365642e00300b1100420000004a000000010000008c0b1100460000006b00000001000000cd0c110036000000320511005b000000bc01000005000000000000000000000000000000900c11003d000000320511005b000000c301000005000000736869667465642073756666696369656e74206269747320726967687420746f206c656164206f6e6c79206c656164696e67207a65726f733b2071656450726576696f7573206d617463682061726d206d61746368657320616e7974696e67206c657373207468616e20325e33303b207165640000000000880d11000700000000000000900d1100010000000000000000000000a80d1100030000000000000000000000c00d11000700000000000000c80d1100020000000000000000000000f80d1100040000000000000000000000180e110004000000000000001c0e1100030000000000000000000000640e11000400000000000000657865637574650000000000fc0e110008000000000000009c0f11001b000000b70f1100400000002843110000000000f70f11002100000070726f706f736500000000007f0f11000900000000000000880f11001400000000000000fc0e110008000000000000009c0f11001b000000d31911000b0000002d0f110024000000510f11002e000000fc1911000c000000766f746500000000fc0e11000800000000000000040f110007000000000000000b0f11000500000000000000100f11001600000000000000260f110007000000000000002f1c110004000000d31911000b000000840e110023000000a70e110055000000fc1911000c000000202d20426f756e6465642073746f72616765207265616420616e64207772697465732e202d2057696c6c20626520736c696768746c792068656176696572206966207468652070726f706f73616c20697320617070726f766564202f20646973617070726f7665642061667465722074686520766f74652e70726f706f73616c543a3a48617368696e646578436f6d706163743c50726f706f73616c496e6465783e617070726f7665202d20426f756e6465642073746f7261676520726561647320616e64207772697465732e202d20417267756d656e7420607468726573686f6c6460206861732062656172696e67206f6e207765696768742e7468726573686f6c64436f6d706163743c4d656d626572436f756e743e426f783c3c542061732054726169743e3a3a50726f706f73616c3e20446973706174636820612070726f706f73616c2066726f6d206120636f756e63696c6f72207573696e672074686520604d656d62657260206f726967696e2e204f726967696e206d757374206265206120636f756e63696c206d656d6265722e436f756e63696c4d6f74696f6e7300000000000088111100090000000000000000000000911111000c0000000000000000000000000000000000000000000000000000000000000028431100a81311000000000000000000a011110001000000000000000100000000000000a81111000a0000000101000000000000040f11000700000000000000b2111100160000000000000000000000000000000000000028431100ec1111000000000000000000c811110001000000000000000000000000000000d0111100060000000101000000000000040f11000700000000000000d6111100130000000000000000000000000000000000000028431100ec1111000000000000000000fc11110001000000000000000000000000000000041211000d0000000000000000000000821c11000300000000000000000000000000000000000000000000000000000000000000284311008813110000000000000000001412110001000000000000000100000050726f706f73616c735665633c543a3a486173683e0000008e1211002400000050726f706f73616c4f663c542061732054726169743e3a3a50726f706f73616c5b12110033000000566f74696e67566f7465733c543a3a4163636f756e7449643e000000320000000000000001000000360000002e1211002d00000050726f706f73616c436f756e740000001c121100120000002050726f706f73616c7320736f206661722e20566f746573206f6e206120676976656e2070726f706f73616c2c206966206974206973206f6e676f696e672e2041637475616c2070726f706f73616c20666f72206120676976656e20686173682c20696620697427732063757272656e742e2054686520686173686573206f6620746865206163746976652070726f706f73616c732e496e6469636573000000000000006c1311000b0000000000000000000000771311000f00000000000000000000000000000000000000000000000000000000000000284311008813110000000000000000009813110001000000000000000100000000000000a0131100070000000101000000000000771311000f00000000000000ea1b1100110000000000000000000000000000000000000028431100a81311000000000000000000b81311000100000000000000010000004e657874456e756d536574543a3a4163636f756e74496e646578000032000000000000000100000034000000d61311001f000000456e756d5365740032000000000000000100000035000000c0131100160000002054686520656e756d65726174696f6e20736574732e20546865206e657874206672656520656e756d65726174696f6e207365742e496e6469636573204e657874456e756d536574436f756e63696c4d6f74696f6e732050726f706f73616c73436f756e63696c4d6f74696f6e7320566f74696e67000000cd0c110036000000320511005b000000f00100000500000000000000000000000000000000000000320511005b000000f70100000500000070726f706f736572206e6f74206f6e20636f756e63696c6475706c69636174652070726f706f73616c73206e6f7420616c6c6f776564436f756e63696c4d6f74696f6e732050726f706f73616c4f66436f756e63696c4d6f74696f6e732050726f706f73616c436f756e7470726f706f73616c206d757374206578697374766f746572206e6f74206f6e20636f756e63696c6d69736d61746368656420696e6465786475706c696361746520766f74652069676e6f72656440151100480000008d0a00000e00000000000000000000002f72757374632f343030623430396566633439373561303832313835633561373434313235373265343964666439382f7372632f6c6962636f72652f736c6963652f6d6f642e7273626c6f636b2073697a65206c696d697420697320726561636865646f766572666c6f77206d756c7469706c79696e6720676173206c696d69742062792070726963650000e4151100340000001816110044000000a50000000300000074686520766563746f7220697320616c7761797320636c65617265643b2069742773207772697474656e206f6e6c79206f6e63652f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f636f6e74726163742f7372632f657865632e72733200000000000000010000008b0000008c0000008d0000008e0000008f0000009000000041757261204c61737454696d657374616d704175726120417574686f72697469657353657373696f6e2056616c696461746f727353657373696f6e204e6578744b6579466f720000e0161100190000000017110048000000bb0100002d000000617474656d707420746f20646976696465206279207a65726f000000000000002f72757374632f343030623430396566633439373561303832313835633561373434313235373265343964666439382f7372632f6c6962636f72652f6f70732f61726974682e727374696d657374616d702073657420696e20626c6f636b20646f65736e2774206d6174636820736c6f7420696e207365616c0000009417110022000000b61711003f000000f8000000030000004175726120736c6f74206475726174696f6e2063616e6e6f74206265207a65726f2e2f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f617572612f7372632f6c69622e72730000001018110028000000b61711003f000000fe000000030000004f6e6c79206f6e6520626c6f636b206d617920626520617574686f7265642070657220736c6f742e000000006418110008000000000000006c1811000200000000000000000000009c1811000a000000000000007365745f6b65797300000000081a110004000000000000000c1a11000700000000000000131a11000500000000000000181a110007000000ec1811003900000025191100480000006d1911003100000028431100000000009e191100350000002843110000000000d31911000b000000de19110008000000e619110016000000fc1911000c0000002053657473207468652073657373696f6e206b6579287329206f66207468652066756e6374696f6e2063616c6c657220746f20606b6579602e20416c6c6f777320616e206163636f756e7420746f20736574206974732073657373696f6e206b6579207072696f7220746f206265636f6d696e6720612076616c696461746f722e205468697320646f65736e27742074616b652065666665637420756e74696c20746865206e6578742073657373696f6e2e20546865206469737061746368206f726967696e206f6620746869732066756e6374696f6e206d757374206265207369676e65642e2023203c7765696768743e202d204f2831292e202d204f6e6520657874726120444220656e7472792e2023203c2f7765696768743e6b657973543a3a4b65797370726f6f665665633c75383e53657373696f6e000000000000e01b11000a0000000000000000000000ea1b1100110000000000000000000000000000000000000000000000000000000000000028431100941c11000000000000000000fc1b110001000000000000000100000000000000041c11000c00000000000000000000000f3e11000c0000000000000000000000000000000000000000000000000000000000000028431100101c11000000000000000000201c110001000000000000000100000000000000281c11000700000000000000000000002f1c1100040000000000000000000000000000000000000000000000000000000000000028431100341c11000000000000000000441c1100010000000000000001000000000000004c1c11000a0000000101000000000000561c11000c000000000000000c1a1100070000000000000000000000000000000000000028431100641c11000000000000000000741c1100010000000000000000000000000000007c1c1100060000000101000000000000821c11000300000000000000851c11000e0000000000000000000000000000000000000028431100941c11000000000000000000a41c110001000000000000000100000056616c696461746f72735665633c543a3a4163636f756e7449643e00401d11001f00000043757272656e74496e64657832000000000000000100000034000000221d11001e0000004368616e676564626f6f6c0032000000000000000100000036000000f41c11002e0000004e6578744b6579466f72543a3a4163636f756e744964000032000000000000000100000036000000d01c1100240000004163746976657533325665633c4f70617175654b65793e0032000000000000000100000035000000ac1c11002400000020546865206b6579732074686174206172652063757272656e746c79206163746976652e20546865206e657874206b657920666f72206120676976656e2076616c696461746f722e205472756520696620616e797468696e6720686173206368616e67656420696e20746869732073657373696f6e2e2043757272656e7420696e646578206f66207468652073657373696f6e2e205468652063757272656e7420736574206f662076616c696461746f72732e53657373696f6e204368616e67656472656163686564206d6178696d756d2064657074682c2063616e6e6f74206d616b6520612063616c6c6e6f7420656e6f7567682067617320746f2070617920626173652063616c6c2066656500009100000018000000040000009200000093000000940000009500000096000000970000006e6f7420656e6f7567682067617320746f20706179207472616e736665722066656562616c616e636520746f6f206c6f7720746f2073656e642076616c756576616c756520746f6f206c6f7720746f20637265617465206163636f756e7464657374696e6174696f6e2062616c616e636520746f6f206869676820746f20726563656976652076616c756572656163686564206d6178696d756d2064657074682c2063616e6e6f74206372656174656e6f7420656e6f7567682067617320746f20706179206261736520696e7374616e7469617465206665654d6f64756c65206973206e6f742076616c696443616e2774206465636f6465207761736d20636f6465756e6b6e6f776e206578706f72743a20657870656374696e67206f6e6c79206465706c6f7920616e642063616c6c2066756e6374696f6e73657870656374656420612066756e6374696f6e656e74727920706f696e7420706f696e747320746f20616e20696d706f727465642066756e6374696f6e656e74727920706f696e74206861732077726f6e67207369676e61747572656d6f64756c65206465636c6172657320696e7465726e616c206d656d6f72794f6e20656e74727920746f207468652066756e6374696f6e20606d6f64756c65602063616e277420626520604e6f6e65603b207165646d656d6f727976616c69646174696f6e3a20696d706f727420656e74727920706f696e747320746f2061206e6f6e2d6578697374656e74207479706543616e6e6f7420696d706f727420676c6f62616c736d6f64756c6520696d706f7274732061206e6f6e2d6578697374656e742066756e6374696f6e6d6f64756c6520696d706f72747320606578745f7072696e746c6e60206275742064656275672066656174757265732064697361626c656443616e6e6f7420696d706f7274207461626c65736d6f64756c652068617320696d706f7274732066726f6d2061206e6f6e2d27656e7627206e616d6573706163654d656d6f727920696d706f7274206d757374206861766520746865206669656c64206e616d6520276d656d6f7279274d756c7469706c65206d656d6f727920696d706f72747320646566696e656452657175657374656420696e697469616c206e756d626572206f662070616765732073686f756c64206e6f74206578636565642074686520726571756573746564206d6178696d756d4d6178696d756d206e756d626572206f662070616765732073686f756c64206e6f74206578636565642074686520636f6e66696775726564206d6178696d756d2e4d6178696d756d206e756d626572206f662070616765732073686f756c6420626520616c77617973206465636c617265642e67617320696e737472756d656e746174696f6e206661696c6564737461636b2068656967687420696e737472756d656e746174696f6e206661696c65646572726f722073657269616c697a696e6720696e737472756d656e746564206d6f64756c6563616c6c63616c6c2066756e6374696f6e2069736e2774206578706f727465646465706c6f792066756e6374696f6e2069736e2774206578706f727465646465706c6f796578706f72742072656665727320746f206e6f6e2d6578697374656e742066756e6374696f6e66756e6374696f6e206861732061206e6f6e2d6578697374656e742074797065000000292511001c000000b423110044000000b4000000030000000525110024000000b423110044000000bd00000003000000cd24110038000000b423110044000000fb0000002a000000a524110028000000b423110044000000fc000000320000007d24110028000000b423110044000000fe0000002c000000512411002c000000b423110044000000fd0000004c0000001f24110032000000b4231100440000003701000003000000f823110027000000b4231100440000003f010000040000008c23110028000000b423110044000000450100000300000053746f7261676520726f6f74206d757374206d6174636820746861742063616c63756c617465642e2f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f73726d6c2f6578656375746976652f7372632f6c69622e7273446967657374206974656d206d757374206d6174636820746861742063616c63756c617465642e4e756d626572206f6620646967657374206974656d73206d757374206d6174636820746861742063616c63756c617465642e416c6c2065787472696e736963732073686f756c6420686176652074686520636f7272656374206e6f6e636545787472696e736963732073686f756c64206e6f742065786365656420626c6f636b206c696d6974416c6c2065787472696e736963732073686f756c642062652070726f7065726c79207369676e6564416c6c2065787472696e736963732073686f756c6420686176652073656e6465722061626c6520746f2070617920746865697220666565735472616e73616374696f6e207472696520726f6f74206d7573742062652076616c69642e506172656e7420686173682073686f756c642062652076616c69642e53657373696f6e2043757272656e74496e646578696e76616c6964206163636f756e7420696e646578626164207369676e617475726520696e2065787472696e7369634e6f6e2d656d7074792066756e6374696f6e20626f6479206578706563746564662611000f00000075261100020000007726110003000000d825110030000000082611005e0000007d00000005000000617373657274696f6e206661696c65643a20636f6e746578742e6672616d655f737461636b2e69735f656d70747928292f686f6d652f616e6472652f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f7761736d692d76616c69646174696f6e2d302e312e302f7372632f66756e632e7273417420696e737472756374696f6e202840293a2070726576696f75732f6e657874206f6e6c7920636f6e7461696e206578697374696e6720656e74697265733b20776520656e756d6572617465207573696e67206e6578743b20656e747279206578697374733b207165646475706c6963617465206b65792070726f766964656453657373696f6e204163746976654552524f523a2061637469766520646f65736e277420636f6e7461696e206f7574676f696e67206b65796578745f7365745f73746f726167656578745f6765745f73746f726167656578745f63616c6c6578745f6372656174656578745f72657475726e6578745f63616c6c65726578745f616464726573736578745f6761735f70726963656578745f6761735f6c6566746578745f62616c616e63656578745f76616c75655f7472616e736665727265646578745f72616e646f6d6578745f6e6f776578745f64697370617463685f63616c6c6578745f696e7075745f73697a656578745f696e7075745f636f70796578745f736372617463685f73697a656578745f736372617463685f636f70796578745f6465706f7369745f6576656e746578745f7365745f72656e745f616c6c6f77616e63656578745f72656e745f616c6c6f77616e63656578745f7072696e746c6e6d616b655f746f705f6672616d655f706f6c796d6f72706869632069732063616c6c6564207769746820656d707479206672616d6520737461636b746869732066756e6374696f6e2063616e27742062652063616c6c6564207769746820656d707479206672616d6520737461636b4d6973706c6163656420656c736520696e737472756374696f6e0000fc29110047000000432a110005000000c029110037000000f7291100050000008d291100170000008429110009000000d62b1100140000006c291100180000008429110009000000d62b1100140000003c2911001d0000005929110013000000a458110001000000546f6f206c61726765206d656d6f727920616c69676e6d656e7420325e20286578706563746564206174206d6f737420547279696e6720746f2075706461746520676c6f62616c20206f66207479706520547279696e6720746f20757064617465206c6f63616c20416e79537065636966696300980000000400000004000000990000004c6162656c7320696e2062725f7461626c6520706f696e747320746f20626c6f636b206f6620646966666572656e742074797065733a2020616e6420496620626c6f636b20776974686f757420656c736520726571756972656420746f2068617665204e6f526573756c7420626c6f636b20747970652e2042757420697420686173202074797065582a110018000000702a11000b000000556e657870656374656420737461636b20686569676874202c20657870656374656420547279696e6720746f2061636365737320706172656e74206672616d6520737461636b2076616c7565732e0000b82a110017000000cf2a11001600000045787065637465642076616c7565206f66207479706520206f6e20746f70206f6620737461636b2e20476f7420000000f02a110007000000537461636b3a2000000001007a2b110024000000502b110006000000562b11000e000000642b1100160000002c2b110024000000502b1100060000006d6178696d756d206d656d6f72792073697a65206d757374206265206174206d6f7374202070616765736d6178696d756d206c696d697420206973206c657373207468616e206d696e696d756d20696e697469616c206d656d6f72792073697a65206d757374206265206174206d6f7374200000b02b110026000000d62b110014000000547279696e6720746f20696e697469616c697a65207661726961626c65206f6620747970652020776974682076616c7565206f66207479706520496e69742065787072657373696f6e2073686f756c6420616c776179732062652077697468206c656e6774682032812c110007000000aa2c11000b000000812c110007000000882c1100220000004e6f6e20636f6e7374616e74206f70636f646520696e20696e6974206578707245787072657373696f6e20646f65736e277420656e647320776974682060656e6460206f70636f6465476c6f62616c2020646f65736e277420657869737473206f72206e6f742079657420646566696e6564206973206d757461626c65000000c82c110010000000d82c11000f0000004d656d6f727920617420696e6465782020646f65736e27742065786973747300f82c11000f000000d82c11000f0000005461626c6520617420696e64657820002931110012000000d82c11000f000000282d11000e000000d82c11000f0000005479706520617420696e646578200000962d110010000000d82c11000f000000682d110010000000882d11000e000000682d110010000000782d110010000000457870656374656420676c6f62616c2020746f20626520696d6d757461626c6520746f206265206d757461626c65476c6f62616c20617420696e646578206e6f6e2d656d70747920737461636b2065787065637465640000d02d110020000000f02d110012000000747279696e6720746f206765742076616c756520617420706f736974696f6e20206f6e20737461636b206f662073697a6520636865636b656420636f75706c65206f66206c696e65732061626f766500282e110015000000657863656564656420737461636b206c696d6974200000009800000004000000040000009a0000004c6f63616c732072616e6765206e6f7420696e2033322d6269742072616e6765882e110022000000aa2e110015000000bf2e110007000000547279696e6720746f20616363657373206c6f63616c207769746820696e64657820207768656e20746865726520617265206f6e6c7920206c6f63616c7366756e635f737461636b5f636f7374732069736e27742079657420636f6d70757465643b0a0909090944696420796f752063616c6c2060636f6d707574655f737461636b5f636f737473603f546869732073686f756c64206265206120696e646578206f66206120646566696e65642066756e6374696f6e44756520746f2076616c69646174696f6e20636f64652073656374696f6e2073686f756c642065786973747346756e6374696f6e20626f6479206973206f7574206f6620626f756e6473d02f1100650000002301000017000000a02f11002500000043616c6c20746f2066756e6374696f6e2074686174206f75742d6f662d626f756e64733a2000000000000000000000002f686f6d652f616e6472652f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f707761736d2d7574696c732d302e362e322f7372632f737461636b5f6865696768742f6d6f642e727366756e6374696f6e20696d706f727420636f756e74206973206e6f74207a65726f3b20696d706f72742073656374696f6e206d757374206578697374733b2071656466756e635f696478206973206c657373207468616e2066756e6374696f6e20696d706f72747320636f756e743b0a090909096e74682066756e6374696f6e20696d706f7274206d7573742062652060536f6d65603b0a0909090971656429311100120000003b3111000f000000fc3011000a00000006311100140000001a3111000f0000005369676e61747572652020287370656369666965642062792066756e6320292069736e277420646566696e656446756e6374696f6e20617420696e64657820206973206e6f7420646566696e6564656e76676173603111005800000088000000160000002f686f6d652f616e6472652f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f707761736d2d7574696c732d302e362e322f7372632f6761732e72737372632f6c6962616c6c6f632f7665632e727300e43111001c000000b831110013000000c604000009000000617373657274696f6e206661696c65643a20656e64203c3d206c656e183211001e000000b831110013000000b303000009000000617373657274696f6e206661696c65643a20696e646578203c3d206c656e0000fd321100120000000f3311000c0000006066756e635f696478602073686f756c6420636f6d652066726f6d20606e6565645f7468756e6b73603b0a09090909606e6565645f7468756e6b736020697320706f70756c617465642077697468207468652073616d65206974656d73207468617420696e20607265706c6163656d656e745f6d6170603b0a090909097165644174207468697320706f696e7420616e20696e646578206d7573742062652061737369676e656420746f2065616368207468756e6b66756e6374696f6e207769746820696478202069736e277420666f756e644e6f2066756e6374696f6e2073656374696f6e4e6f20636f64652073656374696f6e4e6f20747970652073656374696f6e46756e6374696f6e206973206e6f7420666f756e6420696e2066756e632073656374696f6e46756e6374696f6e20626f647920666f722074686520696e6465782069736e277420666f756e64737461636b206d757374206265206e6f6e2d656d707479737461636b206f766572666c6f774172697479206f6620616c6c206a756d702d74617267657473206d75737420626520657175616c54797065206e6f7420666f756e640000103411006c000000c8000000110000000000000000000000000000002f686f6d652f616e6472652f2e636172676f2f72656769737472792f7372632f6769746875622e636f6d2d316563633632393964623965633832332f707761736d2d7574696c732d302e362e322f7372632f737461636b5f6865696768742f6d61785f6865696768742e7273747279696e6720746f20706f70206d6f72652076616c756573207468616e20707573686564737461636b20756e646572666c6f77636f6e74726f6c20737461636b20697320656d707479636f6e74726f6c20737461636b206f75742d6f662d626f756e64730000000035110048000000870a00000a0000000000000000000000000000002f72757374632f343030623430396566633439373561303832313835633561373434313235373265343964666439382f7372632f6c6962636f72652f736c6963652f6d6f642e7273556e726561636861626c654e6f70426c6f636b009800000004000000040000009b0000004c6f6f704966456c7365456e64427200980000000400000004000000040000004272496642725461626c65009800000004000000040000009c00000052657475726e43616c6c43616c6c496e64697265637400009800000004000000040000009d00000044726f7053656c6563744765744c6f63616c5365744c6f63616c5465654c6f63616c476574476c6f62616c536574476c6f62616c4933324c6f61644936344c6f61644633324c6f61644636344c6f61644933324c6f616438534933324c6f616438554933324c6f61643136534933324c6f61643136554936344c6f616438534936344c6f616438554936344c6f61643136534936344c6f61643136554936344c6f61643332534936344c6f616433325549333253746f726549363453746f726546333253746f726546363453746f726549333253746f72653849333253746f7265313649363453746f72653849363453746f7265313649363453746f7265333243757272656e744d656d6f727947726f774d656d6f7279493332436f6e7374009800000004000000040000009e000000493634436f6e73749800000004000000040000009f000000463332436f6e7374463634436f6e73749800000004000000040000002200000049333245717a49333245714933324e654933324c74534933324c74554933324774534933324774554933324c65534933324c655549333247655349333247655549363445717a49363445714936344e654936344c74534936344c74554936344774534936344774554936344c65534936344c655549363447655349363447655546333245714633324e654633324c7446333247744633324c65463332476546363445714636344e654636344c7446363447744636344c654636344765493332436c7a49333243747a493332506f70636e744933324164644933325375624933324d756c493332446976534933324469765549333252656d5349333252656d55493332416e644933324f72493332586f7249333253686c4933325368725349333253687255493332526f746c493332526f7472493634436c7a49363443747a493634506f70636e744936344164644936345375624936344d756c493634446976534936344469765549363452656d5349363452656d55493634416e644936344f72493634586f7249363453686c4936345368725349363453687255493634526f746c493634526f74724633324162734633324e65674633324365696c463332466c6f6f724633325472756e634633324e656172657374463332537172744633324164644633325375624633324d756c4633324469764633324d696e4633324d6178463332436f70797369676e4636344162734636344e65674636344365696c463634466c6f6f724636345472756e634636344e656172657374463634537172744636344164644636345375624636344d756c4636344469764636344d696e4636344d6178463634436f70797369676e493332577261704936344933325472756e63534633324933325472756e63554633324933325472756e63534636344933325472756e6355463634493634457874656e6453493332493634457874656e64554933324936345472756e63534633324936345472756e63554633324936345472756e63534636344936345472756e6355463634463332436f6e7665727453493332463332436f6e7665727455493332463332436f6e7665727453493634463332436f6e766572745549363446333244656d6f7465463634463634436f6e7665727453493332463634436f6e7665727455493332463634436f6e7665727453493634463634436f6e766572745549363446363450726f6d6f74654633324933325265696e746572707265744633324936345265696e746572707265744636344633325265696e746572707265744933324636345265696e74657270726574493634547261696c696e6744617461556e6578706563746564456f66496e76616c69644461746100243b11000b000000492f4f204572726f723a2049333249363446333246363456616c7565980000000400000004000000990000004e6f526573756c74703b110028000000983b1100500000008700000009000000696e7465726e616c206572726f723a20656e746572656420756e726561636861626c6520636f64652f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f636f72652f73722d73616e64626f782f7372632f2e2e2f776974686f75745f7374642e7273703b110028000000983b110050000000900000000900000061757261736c6f74436f756c64206e6f74206465636f64652072657175657374656420696e686572656e742074797065214175726120696e686572656e742064617461206e6f7420666f756e6474696d7374617030496e76616c69642074696d657374616d7020696e686572656e74206461746120656e636f64696e672e54696d657374616d7020696e686572656e742064617461206973206e6f742070726f76696465642e000000000000010000000200000004000000080000001000000000000000ec3c11000e00000000000000fc3c1100010000000000000000000000043d110001000000000000004e6577417574686f7269746965730000303d1100170000000c3d110024000000204e657720617574686f726974792073657420686173206265656e206170706c6965642e5665633c28417574686f7269747949642c20753634293e0000000000743d11000a00000000000000803d1100010000000000000000000000883d110002000000000000004e657753657373696f6e00000f3e11000c000000983d110055000000ed3d110022000000204e65772073657373696f6e206861732068617070656e65642e204e6f746520746861742074686520617267756d656e74206973207468652073657373696f6e20696e6465782c206e6f742074686520626c6f636b206e756d626572206173207468652074797065206d6967687420737567676573742e53657373696f6e496e6465780000000000743e1100100000000000000028431100000000000000000000000000843e11000100000000000000000000008c3e11000f00000000000000284311000000000000000000000000009c3e1100010000000000000045787472696e73696353756363657373b93e11002500000045787472696e7369634661696c656400a43e11001500000020416e2065787472696e736963206661696c65642e20416e2065787472696e73696320636f6d706c65746564207375636365737366756c6c792e48617368206e6f7420657175616c00000000617474656d707420746f20646976696465206279207a65726f000000000000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f636f72652f73722d7072696d6974697665732f7372632f67656e657269632f6572612e7273f03e110019000000103f1100500000005800000022000000903f110019000000b03f110048000000570100002a000000617474656d707420746f20646976696465206279207a65726f000000000000002f686f6d652f616e6472652f576f726b62656e63682f706172697479746563682f7375627374726174652f636f72652f73722d7072696d6974697665732f7372632f6c69622e72736578745f6368696c645f73746f726167655f726f6f74206e657665722072657475726e73207533323a3a6d61785f76616c75653b2071656452756e74696d65206d656d6f7279206578686175737465642e2041626f7274696e6700006c4011002d000000994011000c000000a540110003000000617373657274696f6e206661696c65643a2060286c656674203d3d20726967687429600a20206c6566743a2060602c0a2072696768743a2060603a20b04011003400000064657374696e6174696f6e20616e6420736f7572636520736c69636573206861766520646966666572656e74206c656e6774687354441100180000004b080000090000000c411100110000001d41110017000000ec020000050000006361706163697479206f766572666c6f777372632f6c6962616c6c6f632f7261775f7665632e7273d0411100460000006301000013000000980000000400000004000000a0000000a1000000a20000006120666f726d617474696e6720747261697420696d706c656d656e746174696f6e2072657475726e656420616e206572726f720028431100000000008058110002000000b041110015000000e7030000050000007372632f6c6962636f72652f726573756c742e727300000000000000000000002f72757374632f343030623430396566633439373561303832313835633561373434313235373265343964666439382f7372632f6c6962636f72652f666d742f6d6f642e727301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000202020202020202020202020202020202020202020202020202020202020303030303030303030303030303030304040404040000000000000000000000000038431100200000005843110012000000320000000000000001000000a3000000696e646578206f7574206f6620626f756e64733a20746865206c656e20697320206275742074686520696e64657820697320303030313032303330343035303630373038303931303131313231333134313531363137313831393230323132323233323432353236323732383239333033313332333333343335333633373338333934303431343234333434343534363437343834393530353135323533353435353536353735383539363036313632363336343635363636373638363937303731373237333734373537363737373837393830383138323833383438353836383738383839393039313932393339343935393639373938393900006c4411000600000072441100220000005444110018000000090a0000050000007372632f6c6962636f72652f736c6963652f6d6f642e7273696e64657820206f7574206f662072616e676520666f7220736c696365206f66206c656e67746820b444110016000000ca4411000d00000054441100180000000f0a000005000000736c69636520696e64657820737461727473206174202062757420656e6473206174206030785b2e2e2e5d009e4511000b0000001a58110016000000d7441100010000008845110016000000e107000009000000f85711000e00000006581100040000000a58110010000000d7441100010000008845110016000000e507000005000000b85711002b000000e3571100150000005b010000150000009e4511000b000000a945110026000000cf45110008000000d745110006000000d7441100010000008845110016000000f2070000050000007372632f6c6962636f72652f7374722f6d6f642e72736279746520696e64657820206973206e6f742061206368617220626f756e646172793b20697420697320696e7369646520202862797465732029206f6620600000002646110002000000104611001600000054040000110000001046110016000000480400002800000000000000000000007372632f6c6962636f72652f666d742f6d6f642e72732e2e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000f8030000000000000000000000000000000000000000000000000000000000000000feffffffffbfb6000000000000000000ff070000000000f8ffff0000010000000000000000000000c09f9f3d0000000002000000ffffff0700000000000000000000c0ff01000000000000f80f20b05111004a0000000054110000020000005611003700000000010203040506070809080a0b0c0d0e0f10111213140215161718191a1b1c1d1e1f2002020202020202020202210202020202020202020202020202222324252602270228020202292a2b022c2d2e2f300202310202023202020202020202023302023402020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202023502360237020202020202020238023902020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202023a3b3c020202023d02023e3f4041424344454602020247020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202024802020202020202020202024902020202023b020001020202020302020202040205060202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020207020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200010305050606030706080809110a1c0b190c140d120e160f0410031212130916011705180219031a071c021d011f1620032b062c022d0b2e01300331023202a902aa04ab08fa02fb05fd04fe03ff09ad78798b8da23057588b8c901c1ddd0e0f4b4cfbfc2e2f3f5c5d5fb5e2848d8e9192a9b1babbc5c6c9cadee4e5ff00041112293134373a3b3d494a5d848e92a9b1b4babbc6cacecfe4e500040d0e11122931343a3b4546494a5e646584919b9dc9cecf0d112945495764658d91a9b4babbc5c9dfe4e5f0040d1145496465808184b2bcbebfd5d7f0f1838586898b8c98a0a4a6a8a9acbabebfc5c7cecfdadb4898bdcdc6cecf494e4f57595e5f898e8fb1b6b7bfc1c6c7d71116175b5cf6f7feff800d6d71dedf0e0f1f6e6f1c1d5f7d7eaeafbbbcfa16171e1f46474e4f585a5c5e7e7fb5c5d4d5dcf0f1f572738f74759697c9ff2f5f262e2fa7afb7bfc7cfd7df9a409798308f1fffceff4e4f5a5b07080f10272feeef6e6f373d3f42459091feff536775c8c9d0d1d8d9e7feff00205f2282df048244081b04061181ac0e80ab351e1580e003190801042f043404070301070607110a500f1207550802041c0a090308030703020303030c0405030b06010e15053a0311070605100856070207150d500443032d03010411060f0c3a041d250d064c206d046a2580c80582b0031a0682fd035907150b1709140c140c6a060a061a0659072b05460a2c040c040103310b2c041a060b0380ac060a061f414c042d0374083c030f033c0738082a0682ff1118082f112d032010210f808c048297190b158894052f053b07020e180980af31740c80d61a0c0580ff0580b605240c9bc60ad23010848d033709815c1480b80880ba3d35040a06380846080c06740b1e035a0459098083181c0a1609460a808a06aba40c170431a10481da26070c050580a511816d1078282a064c04808d0480be031b030f0d0006010103010402080809020a050b0210011104120513111402150217021a021c051d0824016a036b02bc02d102d40cd509d602d702da01e005e802ee20f004f9040c273b3e4e4f8f9e9e9f060709363d3e56f3d0d104141836375657bd35cecfe01287898e9e040d0e11122931343a4546494a4e4f64655a5cb6b71b1c848509379091a8070a3b3e66698f926f5feeef5a629a9b2728559da0a1a3a4a7a8adbabcc4060b0c151d3a3f4551a6a7cccda007191a2225c5c604202325262833383a484a4c50535556585a5c5e606365666b73787d7f8aa4aaafb0c0d03f71727b5e227b0503042d036504012f2e80821d03310f1c0424091e052b0544040e2a80aa06240424042808340b018090813709160a088098390363080930160521031b05014038044b052f040a070907402027040c0936033a051a07040c07504937330d33072e080a81261f808128082a80a64e041e0f430e19070a0647092709750b3f412a063b050a0651060105100305808b5f2148080a80a65e22450b0a060d1338080a362c041080c03c64530c0181004808531d398107460a1d03474937030e080a0639070a8136198107839a66750b80c48abc842f8fd18247a1b98239072a040260260a460a28051382b05b65450b2f101140021e97f20e82f3a50d811f51818c89046b050d03090710936080f60a73086e1746809a140c570919808781470385420f1585502b87d580d7294b050a0402831144814b3c06010455051b3402810e2c04640c560a0d035c043d391d0d2c040907020e06809a83d50b0d030a06740c59270c0438080a0628081e520c046703290d0a06030d30600e8592905111002000000027000000190000009051110020000000280000002000000090511100200000002a0000001900000090511100200000002b0000001800000090511100200000002c0000002000000000000000000000007372632f6c6962636f72652f756e69636f64652f626f6f6c5f747269652e72730000c0fbef3e00000000000e0000000000000000000000000000f8fffbffffff0700000000000014fe21fe000c00000002000000000000501e2080000c00004006000000000000108639020000002300be2100000c0000fc02000000000000d01e20c0000c0000000400000000000040012080000000000011000000000000c0c13d60000c0000000200000000000090443060000c00000003000000000000581e2080000c00000000845c8000000000000000000000f207807f000000000000000000000000f21b003f000000000000000000030000a002000000000000fe7fdfe0fffeffffff1f40000000000000000000000000e0fd66000000c301001e006420002000000000000000e00000000000001c0000001c0000000c0000000c00000000000000b03f40fe0f200000000000380000000000006000000000020000000000008701040e00008009000000000000407fe51ff89f000000000000ff7f0f0000000000d0170400000000f80f00030000003c3b00000000000040a303000000000000f0cf000000f7fffd211003fffffffffffffffb00100000000000000000ffffffff01000000000000800300000000000000008000000000ffffffff0000000000fc00000000000600000000000000000080f73f000000c0000000000000000000000300440800006000000030000000ffff038000000000c03f000080ff030000000000070000000000c813000000002000000000000000007e660008100000000000100000000000009dc1020000000030400000000000202100000000004000000000ffff0000ffff00000000000000000001000000020003000000000000000000000000000000000000000000000000000004000005000000000000000006000000000000000007000008090a000b0c0d0e0f000010111200001314151600001718191a1b001c0000001d000000000000001e1f20000000000021002200232425000000002600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000027280000000000000000000000000000000000290000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000002b2c00002d0000000000000000000000000000000000000000000000000000000000002e2f300000000000000000000000000000000000000000003100000000000000000000000000000000000000000000000000000000000000000000320033000000000000000000000000000000000000000000000000000034350000353535360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000001000000000000000000c0076ef0000000000087000000006000000000000000f0000000c0ff01000000000002000000000000ff7f0000000000008003000000000078060700000080ef1f000000000000000800030000000000c07f001e000000000000000000000080d34000000080f8070000030000000000005801008000c01f1f0000000000000000ff5c00004000000000000000000000f9a50d000000000000000000000000803cb00100003000000000000000000000f8a70100000000000000000000000028bf00000000e0bc0f0000000000000080ff06fe0700000000f87980007e0e0000000000fc7f03000000000000000000007fbf0000fcfffffc6d000000000000007eb4bf000000000000000000a3000000000000000000000018000000000000001f000000000000007f000080070000000000000000600000000000000000a0c307f8e70f0000003c00001c00000000000000ffffffffffff7ff8ffffffffff1f2000100000f8feff00007ffffff9db07000000007f0000000000f00700000000000000000000ffffffffffffffffffffffffffffffffffff000063616c6c656420604f7074696f6e3a3a756e77726170282960206f6e206120604e6f6e65602076616c75657372632f6c6962636f72652f6f7074696f6e2e7273626567696e203c3d20656e642028203c3d2029207768656e20736c6963696e672060206973206f7574206f6620626f756e6473206f662060426f72726f774572726f72426f72726f774d75744572726f720000002843110000000000e3571100150000000c0400000500000020202020a40000000c00000004000000a5000000a6000000a70000003a202c0a2c200000980000000400000004000000a8000000a9000000aa000000280a282c290a5d5b4572726f72008ae202046e616d650181e2029c04000c6578745f74776f785f31323801146578745f6765745f73746f726167655f696e746f020e6578745f626c616b65325f32353603116578745f636c6561725f73746f72616765040f6578745f7365745f73746f7261676505166578745f73616e64626f785f6d656d6f72795f6e6577061b6578745f73616e64626f785f6d656d6f72795f74656172646f776e07176578745f73616e64626f785f696e7374616e746961746508126578745f73616e64626f785f696e766f6b65091d6578745f73616e64626f785f696e7374616e63655f74656172646f776e0a1f6578745f6765745f616c6c6f63617465645f6368696c645f73746f726167650b156578745f7365745f6368696c645f73746f726167650c176578745f636c6561725f6368696c645f73746f726167650d166578745f6b696c6c5f6368696c645f73746f726167650e166578745f73616e64626f785f6d656d6f72795f6765740f0e6578745f7072696e745f7574663810166578745f73616e64626f785f6d656d6f72795f73657411126578745f737232353531395f76657269667912126578745f656432353531395f76657269667913166578745f6368696c645f73746f726167655f726f6f7414196578745f6765745f616c6c6f63617465645f73746f7261676515106578745f73746f726167655f726f6f7416186578745f73746f726167655f6368616e6765735f726f6f74170d6578745f7072696e745f68657818106578745f636c6561725f70726566697819236578745f626c616b65325f3235365f656e756d6572617465645f747269655f726f6f741a0d6578745f7072696e745f6e756d1b0a6578745f6d616c6c6f631c086578745f667265651d48616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a616c6c6f636174655f696e3a3a7b7b636c6f737572657d7d3a3a68303066616135336238376530653661621e34616c6c6f633a3a7261775f7665633a3a63617061636974795f6f766572666c6f773a3a68363534333630666363653539333038361f3b73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a6c61756e63685f7075626c69633a3a6866623261623538306438366130353931204e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6864336433333837396635363662373062212e636f72653a3a6f7074696f6e3a3a6578706563745f6661696c65643a3a6866343337386339613663343034313036223873726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a6465706f7369745f6f663a3a6862366265373730623536363037303262230e5f5f727573745f6465616c6c6f632430636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a6832373532316332623635333961663462253d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6835323730333337313965616561396439260c5f5f727573745f616c6c6f63270e5f5f727573745f7265616c6c6f63284e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68333162333430633638356463353561372936636f72653a3a70616e69636b696e673a3a70616e69635f626f756e64735f636865636b3a3a68346631303163306137313663303262662a08727573745f6f6f6d2b8c013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a52657365727661626c6543757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a756e726573657276653a3a68653338646664303539333431636136652c4073726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a6465706f7369745f6576656e745f696e64657865643a3a68633431353362653330353734666463382d3f73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a696e6a6563745f7265666572656e64756d3a3a68333833386466623938633032323536302e3d73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a6c61756e63685f65787465726e616c3a3a68353766336365383464336137636238302f796e6f64655f72756e74696d653a3a5f494d504c5f4445434f44455f464f525f43616c6c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f72206e6f64655f72756e74696d653a3a43616c6c3e3a3a6465636f64653a3a683433396135666231626132393631376230a9013c73726d6c5f64656d6f63726163793a3a566f74657273466f723c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a67656e657261746f723a3a53746f726167654d61703c7533322c616c6c6f633a3a7665633a3a5665633c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3e3a3a6765743a3a6864316238313536383831333534326562313573726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a766f74655f6f663a3a6834643363623566353064323239656164323d73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a64656c6567617465645f766f7465733a3a68653062633364306533383933643731643380023c73726d6c5f64656d6f63726163793a3a5f5f6c696e6b65645f6d61705f64657461696c735f666f725f64656c65676174696f6e735f646f5f6e6f745f7573653a3a456e756d657261746f723c532c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c28283c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c2073726d6c5f64656d6f63726163793a3a436f6e76696374696f6e292c2054293e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a68353930353032663038313161616131613486013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a746f74616c5f62616c616e63653a3a6862633164313832343832613636613633353e73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a636c6561725f7265666572656e64756d3a3a686261613031663936316563346463613036ef013c73726d6c5f64656d6f63726163793a3a446973706174636851756575653c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a67656e657261746f723a3a53746f726167654d61703c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a426c6f636b4e756d6265722c616c6c6f633a3a7665633a3a5665633c636f72653a3a6f7074696f6e3a3a4f7074696f6e3c283c542061732073726d6c5f64656d6f63726163793a3a54726169743e3a3a50726f706f73616c2c20753332293e3e3e3e3a3a6765743a3a6834666234646432626135653563343161374e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6866366335393132386261393533653036383d73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a7265666572656e64756d5f696e666f3a3a6863333463353730393734326433353766397c6e6f64655f72756e74696d653a3a5f494d504c5f454e434f44455f464f525f43616c6c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f72206e6f64655f72756e74696d653a3a43616c6c3e3a3a656e636f64655f746f3a3a68353336663137633665353765313237373a3c73726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a68316663386164393065613531346234343b4173726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a68343934616563663265376262353363663c4673726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a68666161383338663661316237343063323d6f3c73726d6c5f64656d6f63726163793a3a5f5f476574427974655374727563744e65787445787465726e616c3c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68666437363537366638326239333736663e6e3c73726d6c5f64656d6f63726163793a3a5f5f4765744279746553747275637444656c65676174696f6e733c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68396439323936363335643430313436363f8c0173726d6c5f64656d6f63726163793a3a5f494d504c5f454e434f44455f464f525f436f6e76696374696f6e3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f722073726d6c5f64656d6f63726163793a3a436f6e76696374696f6e3e3a3a656e636f64655f746f3a3a683864643663653333376432343436653140703c73726d6c5f64656d6f63726163793a3a5f5f47657442797465537472756374446973706174636851756575653c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a683038376634656163303033396364303241633c7061726974795f636f6465633a3a636f6465633a3a436f6d706163745265663c7533323e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a683433303838336563313633396132396142b5013c73726d6c5f64656d6f63726163793a3a50726f78793c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a67656e657261746f723a3a53746f726167654d61703c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6765743a3a683030373732303864306663333335623343800173726d6c5f64656d6f63726163793a3a5f494d504c5f4445434f44455f464f525f43616c6c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f722073726d6c5f64656d6f63726163793a3a43616c6c3c543e3e3a3a6465636f64653a3a683431656466376434313732336531313744796e6f64655f72756e74696d653a3a5f494d504c5f4445434f44455f464f525f43616c6c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f72206e6f64655f72756e74696d653a3a43616c6c3e3a3a6465636f64653a3a6866326464383363666439383038363036455d3c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c7533323e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6832646431383630646366363235346630465d3c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c7536343e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6833326631626466383562373532623062475e3c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c753132383e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68323565303232396230663361386137394836636f72653a3a736c6963653a3a736c6963655f696e6465785f6f726465725f6661696c3a3a683736396238303062623465336330323349800173726d6c5f64656d6f63726163793a3a5f494d504c5f4445434f44455f464f525f43616c6c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f722073726d6c5f64656d6f63726163793a3a43616c6c3c543e3e3a3a6465636f64653a3a68366330363165343466643531633534324a5d3c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c7533323e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68383033383965346537373737383439334b5d3c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c7536343e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68316462643964653166316533363161384c5e3c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c753132383e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68326335326466333664353632656536374d493c73726d6c5f64656d6f63726163793a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a68623939383539636362323533323036384e443c6e6f64655f72756e74696d653a3a43616c6c20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a68656366343530313532633963373339394f29636f72653a3a70616e69636b696e673a3a70616e69633a3a683930306462653831356663633632336250443c6e6f64655f72756e74696d653a3a43616c6c20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a686563663435303135326339633733393951463c73726d6c5f73797374656d3a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6837326239303930303932623764316664524e3c73726d6c5f636f756e63696c3a3a73656174733a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a683137393532326533376265306633366453503c73726d6c5f636f756e63696c3a3a6d6f74696f6e733a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a683036643461313538626363343934393054483c73726d6c5f636f6e74726163743a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a683339326361316463623530653934313655473c73726d6c5f7374616b696e673a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a683636626363613030646664346261373056473c73726d6c5f696e64696365733a3a43616c6c3c543e20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6830643631356565623361626262396137575e3c73726d6c5f64656d6f63726163793a3a43616c6c3c543e2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a686664343433636362383337633437373358ef013c73726d6c5f64656d6f63726163793a3a426c61636b6c6973743c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a67656e657261746f723a3a53746f726167654d61703c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a486173682c283c542061732073726d6c5f73797374656d3a3a54726169743e3a3a426c6f636b4e756d6265722c20616c6c6f633a3a7665633a3a5665633c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e293e3e3a3a6765743a3a6836613764356235663139653863376665596f7061726974795f636f6465633a3a636f6465633a3a696e6e65725f7475706c655f696d706c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f7220284a2c204b293e3a3a6465636f64653a3a68636361343332336438616136626264385a3573726d6c5f64656d6f63726163793a3a4d6f64756c653c543e3a3a646f5f766f74653a3a68366438303866636531366531616539345b8a013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a52657365727661626c6543757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a726573657276653a3a68373264633635373838616237653435385c3d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a68316334623366356537353961306662325db50173726d6c5f7374616b696e673a3a5f494d504c5f454e434f44455f464f525f5f5f4c696e6b616765466f724e6f6d696e61746f7273446f4e6f745573653a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f722073726d6c5f7374616b696e673a3a5f5f4c696e6b616765466f724e6f6d696e61746f7273446f4e6f745573653c4b65793e3e3a3a656e636f64655f746f3a3a68653734386162343266306433366464315e483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a696e736572743a3a68396637356363353361663162363438375f3d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a686135626464656330353832393464663960323c265420617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a6832346231323866373631326130323533612d636f72653a3a70616e69636b696e673a3a70616e69635f666d743a3a68393563313864623831313666633930666289013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a4c6f636b61626c6543757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a7365745f6c6f636b3a3a6866643364363035613962363562326163638c013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a4c6f636b61626c6543757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a657874656e645f6c6f636b3a3a6835653463336266613636376433333061646f7061726974795f636f6465633a3a636f6465633a3a696e6e65725f7475706c655f696d706c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f7220284a2c204b293e3a3a6465636f64653a3a6866633134656636336262303965356532653d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a683766313063393363376136383765333366643c7061726974795f636f6465633a3a636f6465633a3a436f6d706163745265663c753132383e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6839646533666434666432303039313861673d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6862343132623566326132333534663734683d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6862623562313130626465623239363433693a73726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a68633739326333373764643635653436336a3f73726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a68376139663564323161663138626333316bc9023c73726d6c5f7374616b696e673a3a4c65646765723c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a67656e657261746f723a3a53746f726167654d61703c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c73726d6c5f7374616b696e673a3a5374616b696e674c65646765723c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c3c3c542061732073726d6c5f7374616b696e673a3a54726169743e3a3a43757272656e63792061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a42616c616e63653e3e3e3a3a6765743a3a68356134613565333938653162353335646c9e0173726d6c5f7374616b696e673a3a5f494d504c5f4445434f44455f464f525f5374616b696e674c65646765723a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f722073726d6c5f7374616b696e673a3a5374616b696e674c65646765723c4163636f756e7449642c42616c616e63653e3e3a3a6465636f64653a3a68386535616136323961383538396464666d3373726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a7374616b6572733a3a68393535643464306633666437383264336eb4013c73726d6c5f7374616b696e673a3a426f6e6465643c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a67656e657261746f723a3a53746f726167654d61703c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6765743a3a68356435656265333066373637333939646f4473726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a686165656266636464346532626634303570683c73726d6c5f7374616b696e673a3a5f5f476574427974655374727563745374616b6572733c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6838383633396439623963363830333564716b3c73726d6c5f7374616b696e673a3a5f5f4765744279746553747275637456616c696461746f72733c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6835373232343437623438373336343566726d3c73726d6c5f7374616b696e673a3a5f5f476574427974655374727563744f66666c696e65536c6173683c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6866386232316161323838326335376533736e3c73726d6c5f7374616b696e673a3a5f5f4765744279746553747275637453657373696f6e5265776172643c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a683735336538386436396637306631383574763c73726d6c5f7374616b696e673a3a5f5f476574427974655374727563744d696e696d756d56616c696461746f72436f756e743c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a68353639323166626330353134366232397586013c73726d6c5f7374616b696e673a3a4d6f64756c653c543e2061732073726d6c5f73657373696f6e3a3a4f6e53657373696f6e456e64696e673c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6f6e5f73657373696f6e5f656e64696e673a3a686535313633306636363638636361363176673c636f72653a3a697465723a3a61646170746572733a3a4d61703c492c463e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a7472795f666f6c643a3a6866326439313535326334303637623864776a636f72653a3a6f70733a3a66756e6374696f6e3a3a696d706c733a3a3c696d706c20636f72653a3a6f70733a3a66756e6374696f6e3a3a466e4f6e63653c413e20666f7220266d757420463e3a3a63616c6c5f6f6e63653a3a68626635393135363135343133393639667844636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723a3a73697a655f68696e743a3a683932653839393334616233333963393779f0013c73726d6c5f7374616b696e673a3a5f5f6c696e6b65645f6d61705f64657461696c735f666f725f6e6f6d696e61746f72735f646f5f6e6f745f7573653a3a456e756d657261746f723c532c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c28616c6c6f633a3a7665633a3a5665633c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e2c2054293e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a68333733366566623434363166356632627a3773726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a6d616b655f7061796f75743a3a68633337363639633262643933303135317b483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f7261676556616c75653c543e3e3a3a6d75746174653a3a68336239653437613061613366663166667c6d3c6e6f64655f72756e74696d653a3a43757272656e6379546f566f746548616e646c65722061732073725f7072696d6974697665733a3a7472616974733a3a436f6e766572743c753132382c7536343e3e3a3a636f6e766572743a3a68353637666237386237323465313434367d613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a68363831316136353639356566373033667e8e013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6465706f7369745f696e746f5f6578697374696e673a3a68396435343430393131383236656437317f3973726d6c5f7374616b696e673a3a4d6f64756c653c543e3a3a7570646174655f6c65646765723a3a6834393035336663653939393664353862800130636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a683237386236313539333331396136636281013e636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723a3a6e74683a3a68323662636361343964663735316562388201d0023c73726d6c5f7374616b696e673a3a5f5f6c696e6b65645f6d61705f64657461696c735f666f725f76616c696461746f72735f646f5f6e6f745f7573653a3a456e756d657261746f723c532c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c2873726d6c5f7374616b696e673a3a56616c696461746f7250726566733c3c3c542061732073726d6c5f7374616b696e673a3a54726169743e3a3a43757272656e63792061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a42616c616e63653e2c2054293e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a683436633539386334323439626161393383015c3c73726d6c5f7374616b696e673a3a43616c6c3c543e2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a6838366432623236333166646333346264840185013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a667265655f62616c616e63653a3a68646562353262626431313032366638658501483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a72656d6f76653a3a68373662376631353363626165383533328601483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a72656d6f76653a3a683837316531646162333963366664653287013473726d6c5f696e64696365733a3a4d6f64756c653c543e3a3a656e756d5f7365743a3a683863616333643766656561643836333088016f7061726974795f636f6465633a3a636f6465633a3a696e6e65725f7475706c655f696d706c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f7220284a2c204b293e3a3a6465636f64653a3a683866636637393031303130323364383589012d636f72653a3a736c6963653a3a736f72743a3a726563757273653a3a68636430313236643637393166366466338a0134636f72653a3a736c6963653a3a736f72743a3a627265616b5f7061747465726e733a3a68373930316437393431343736333863338b013c636f72653a3a736c6963653a3a736f72743a3a7061727469616c5f696e73657274696f6e5f736f72743a3a68613236643732366361313234646137358c0134636f72653a3a736c6963653a3a736c6963655f696e6465785f6c656e5f6661696c3a3a68396133653135623333653732623336358d012e636f72653a3a736c6963653a3a736f72743a3a68656170736f72743a3a68396134613139636665393430326233398e012d636f72653a3a736c6963653a3a736f72743a3a726563757273653a3a68643032636466333230343961613863358f016f3c73725f7072696d6974697665733a3a67656e657269633a3a6865616465723a3a4865616465723c4e756d6265722c486173683e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a683239313630343165646363333739323690014e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a686334393265383265343832393137646491018f013c73726d6c5f66696e616c6974795f747261636b65723a3a4d6f64756c653c543e2061732073725f7072696d6974697665733a3a7472616974733a3a4f6e46696e616c697a653c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a426c6f636b4e756d6265723e3e3a3a6f6e5f66696e616c697a653a3a683432363237643732313730333731653092013673726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a74616b653a3a683038393461396331626164353230643093014e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a683737366564343637623834353637323794012e636f72653a3a726573756c743a3a756e777261705f6661696c65643a3a683631343137393464626265336134666495014373726d6c5f66696e616c6974795f747261636b65723a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a68323631646237643031626138343532379601303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6835333964383965373864336432386636970135636f72653a3a666d743a3a466f726d61747465723a3a7061645f696e74656772616c3a3a68626232333962346333656230313863619801303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68663966343739623738313364643766329901313c73747220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68653961663431646462346636653666319a016b3c7061726974795f7761736d3a3a656c656d656e74733a3a73656374696f6e3a3a53656374696f6e206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a68356462343963643635646562396561369b01713c7061726974795f7761736d3a3a656c656d656e74733a3a696e6465785f6d61703a3a496e6465784d61703c543e206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a68343432336537396237666136333364639c01713c7061726974795f7761736d3a3a656c656d656e74733a3a73656374696f6e3a3a437573746f6d53656374696f6e206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a68373535376161643232383364663738389d01683c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e697445787072206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a68653333393636303464383766313162329e016b3c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e737472756374696f6e206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a68336533366161393132333730623438649f0130636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a6838623865663864653663643565663130a0016f3c7061726974795f7761736d3a3a656c656d656e74733a3a73656374696f6e3a3a53656374696f6e206173207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a653e3a3a646573657269616c697a653a3a6839656432363761666263376163303338a101443c7061726974795f7761736d3a3a696f3a3a4572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6864643538643239613837336539366430a20125616c6c6f633a3a666d743a3a666f726d61743a3a6836363238323931366635643839636166a301743c7061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a56617255696e743332206173207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a653e3a3a646573657269616c697a653a3a6835333337616335653133303232393336a401457061726974795f7761736d3a3a656c656d656e74733a3a73656374696f6e3a3a53656374696f6e5265616465723a3a6e65773a3a6863343039653861623936343865363938a50127636f72653a3a7374723a3a66726f6d5f757466383a3a6861303162383536303462626661643632a6017c3c7061726974795f7761736d3a3a656c656d656e74733a3a696d706f72745f656e7472793a3a526573697a61626c654c696d697473206173207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a653e3a3a646573657269616c697a653a3a6832396434356534336335396636373566a7016c3c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e697445787072206173207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a653e3a3a646573657269616c697a653a3a6835656534336634343261306436306335a801793c7061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a436f756e7465644c6973743c543e206173207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a653e3a3a646573657269616c697a653a3a6835636361393566393536386433663966a90186017061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a3c696d706c207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a6520666f7220616c6c6f633a3a737472696e673a3a537472696e673e3a3a646573657269616c697a653a3a6863373130393263326433353730393230aa016f3c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e737472756374696f6e206173207061726974795f7761736d3a3a656c656d656e74733a3a446573657269616c697a653e3a3a646573657269616c697a653a3a6838363932336464383833646464333432ab01693c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6830373635356166323066616638633434ac01135f5f727573745f616c6c6f635f7a65726f6564ad014b616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a566163616e74456e7472793c4b2c563e3a3a696e736572743a3a6832386631653666366637316263366436ae01613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6861313534656437353133373565343033af01723c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a496e746f497465723c4b2c563e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6834326161333662363739326430643866b001723c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a496e746f497465723c4b2c563e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6864323035306537666665386430383164b1013773726d6c5f737570706f72743a3a73746f726167653a3a756e6861736865643a3a7075743a3a6834373937653534376136323663326430b201323c265420617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a6838316135313335323361343266643731b3012c636f72653a3a666d743a3a466f726d61747465723a3a7061643a3a6862323466623938633663613936336537b4014b616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a566163616e74456e7472793c4b2c563e3a3a696e736572743a3a6833633137313734326664343464363431b501613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a496e746f497465723c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6866396465623032633130313431363831b60148616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e3a3a696e736572743a3a6836613231616631656164313134353561b7015a3c73726d6c5f636f6e74726163743a3a7761736d3a3a5761736d566d3c543e2061732073726d6c5f636f6e74726163743a3a657865633a3a566d3c543e3e3a3a657865637574653a3a6866613236356165323336393333666263b8017b3c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6761733a3a6861393434356539656631666338613634b90187013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f7365745f73746f726167653a3a6862336666633035383733356436363334ba0187013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6765745f73746f726167653a3a6831653439303531353836633433633137bb0180013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f63616c6c3a3a6831396333313936396362613630646262bc0182013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6372656174653a3a6862613566353261373763386565613862bd0182013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f72657475726e3a3a6832333831646137343636336138303363be0182013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f63616c6c65723a3a6835656233323666313336306535663566bf0183013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f616464726573733a3a6838306163646635383464356163343739c00185013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6761735f70726963653a3a6837313736326661336363396635383131c10184013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6761735f6c6566743a3a6838666138346134313862303336643766c20183013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f62616c616e63653a3a6836343433386230306632303431663766c3018d013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f76616c75655f7472616e736665727265643a3a6834383165313066303230396462623061c40182013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f72616e646f6d3a3a6830646231363535363634323230353335c5017f3c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6e6f773a3a6839393863386639323461343030373766c60189013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f64697370617463685f63616c6c3a3a6835653930636536356562616661666239c70186013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f696e7075745f73697a653a3a6836393432666133373539633532363561c80186013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f696e7075745f636f70793a3a6865613864363566623932646262663032c90188013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f736372617463685f73697a653a3a6862333638653731633732333932623934ca0188013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f736372617463685f636f70793a3a6861356238363437613064633065323037cb0189013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f6465706f7369745f6576656e743a3a6835663639653663613338666431653232cc018e013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f7365745f72656e745f616c6c6f77616e63653a3a6863306261363734316164623665343462cd018a013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f72656e745f616c6c6f77616e63653a3a6832366637353133323438386361626366ce0183013c73726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a456e762061732073726d6c5f636f6e74726163743a3a7761736d3a3a656e765f6465663a3a46756e6374696f6e496d706c50726f76696465723c453e3e3a3a696d706c733a3a6578745f7072696e746c6e3a3a6831303139323034333536653238623532cf013273725f73616e64626f783a3a696d703a3a64697370617463685f7468756e6b3a3a6863333265616162336663633834663734d001a7017375627374726174655f7072696d6974697665733a3a73616e64626f783a3a5f494d504c5f4445434f44455f464f525f547970656456616c75653a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f72207375627374726174655f7072696d6974697665733a3a73616e64626f783a3a547970656456616c75653e3a3a6465636f64653a3a6830333332613261323966396434666363d1014473726d6c5f636f6e74726163743a3a7761736d3a3a72756e74696d653a3a746f5f657865637574696f6e5f726573756c743a3a6865393064306631643436366138613330d201673c73726d6c5f636f6e74726163743a3a7761736d3a3a5761736d566d3c543e2061732073726d6c5f636f6e74726163743a3a657865633a3a566d3c543e3e3a3a657865637574653a3a7b7b636c6f737572657d7d3a3a6836613662316266663034383730643065d301613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6831636561376633356531383534376639d401613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a496e746f497465723c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6834643765343630363733636637623463d501773c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4469726563744163636f756e7444622061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f62616c616e63653a3a6864613538363437373364393161633062d601773c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4469726563744163636f756e7444622061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f73746f726167653a3a6863633237633664653363643436303964d701793c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4469726563744163636f756e7444622061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f636f64655f686173683a3a6830616538343035383365663932653431d801b7013c73726d6c5f636f6e74726163743a3a436f6e7472616374496e666f4f663c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a67656e657261746f723a3a53746f726167654d61703c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c73726d6c5f636f6e74726163743a3a436f6e7472616374496e666f3c543e3e3e3a3a6765743a3a6834656437633633653831363131623530d9017b3c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4469726563744163636f756e7444622061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a636f6e74726163745f6578697374733a3a6835303333313332653233393234313938da017e3c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4469726563744163636f756e7444622061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f72656e745f616c6c6f77616e63653a3a6836383237393262643365346631376362db01723c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4469726563744163636f756e7444622061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a636f6d6d69743a3a6831656665633264656436313436383737dc018d013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6d616b655f667265655f62616c616e63655f62653a3a6865353131643163343631323236326636dd01483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a696e736572743a3a6831383934623633353565653739633265de01483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f7261676556616c75653c543e3e3a3a6d75746174653a3a6839323033653539333130616162373435df013f73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a7365745f667265655f62616c616e63653a3a6833396665333063616239643263336134e0017f3c73726d6c5f696e64696365733a3a4d6f64756c653c543e2061732073726d6c5f73797374656d3a3a4f6e4e65774163636f756e743c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6f6e5f6e65775f6163636f756e743a3a6834306266313536333830363533643562e1013673726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a74616b653a3a6831396138616331613331343433303262e2014c73726d6c5f636f6e74726163743a3a657865633a3a457865637574696f6e436f6e746578743c542c562c4c3e3a3a696e7374616e74696174653a3a6832386330326662363135343738393533e3013173726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a72616e646f6d3a3a6836653661373533396336333832346535e4012e636f72653a3a726573756c743a3a756e777261705f6661696c65643a3a6835323963333139393332366435346334e5017b3c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e2061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f73746f726167653a3a6833636431376332336265613732616238e6012e636f72653a3a726573756c743a3a756e777261705f6661696c65643a3a6832323538333565333135383964613337e7014573726d6c5f636f6e74726163743a3a657865633a3a457865637574696f6e436f6e746578743c542c562c4c3e3a3a63616c6c3a3a6831643433663038326464303036646130e8017b3c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e2061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f62616c616e63653a3a6861303534656163333938613038326137e9017d3c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e2061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f636f64655f686173683a3a6836356334643665616263623034616561ea017f3c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e2061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a636f6e74726163745f6578697374733a3a6864393232353437646465646135656565eb0182013c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e2061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a6765745f72656e745f616c6c6f77616e63653a3a6862363037336636626665396661363266ec01763c73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e2061732073726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4163636f756e7444623c543e3e3a3a636f6d6d69743a3a6831633439366566636164346364626663ed013d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6830333363396462666564626136316537ee014173726d6c5f636f756e63696c3a3a73656174733a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6862626532316466343639636135663839ef014573726d6c5f636f756e63696c3a3a73656174733a3a4d6f64756c653c543e3a3a63616e6469646174655f7265675f696e666f3a3a6836663332383366323231386434633839f0014673726d6c5f636f756e63696c3a3a73656174733a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6838633363643830353162373562323835f1014b73726d6c5f636f756e63696c3a3a73656174733a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6862396631373532643866633062313738f201713c73726d6c5f636f756e63696c3a3a73656174733a3a5f5f47657442797465537472756374566f7465436f756e743c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6862383334386332323031333439346662f301723c73726d6c5f636f756e63696c3a3a73656174733a3a5f5f476574427974655374727563744465636179526174696f3c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6861326133313034363234303765303530f401743c73726d6c5f636f756e63696c3a3a73656174733a3a5f5f476574427974655374727563745465726d4475726174696f6e3c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6831353665656134653234393865343464f501743c73726d6c5f636f756e63696c3a3a73656174733a3a5f5f47657442797465537472756374566f74696e67506572696f643c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6838346662313465646262326639386134f6017b3c73726d6c5f636f756e63696c3a3a73656174733a3a5f5f47657442797465537472756374496e6163746976654772616365506572696f643c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6862383635353034333836316635346530f701723c73726d6c5f636f756e63696c3a3a73656174733a3a5f5f476574427974655374727563744361727279436f756e743c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6865653634366138333735353061656132f8017c3c73726d6c5f636f756e63696c3a3a73656174733a3a5f5f4765744279746553747275637450726573656e74536c617368506572566f7465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6833613531376362613564626131653435f9016f3c73726d6c5f62616c616e6365733a3a5f5f476574427974655374727563744372656174696f6e4665653c542c493e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6830303932656436636465313735316632fa01753c73726d6c5f636f756e63696c3a3a73656174733a3a5f5f4765744279746553747275637443616e646964616379426f6e643c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6833636562636665643539663638636338fb013d73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a63616c6c5f66756e6374696f6e733a3a6864396430353365663436653261316535fc013e73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a76657374696e675f62616c616e63653a3a6831323531373431656231613331333261fd014273726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a73746f72655f6d657461646174615f6e616d653a3a6863393235393565363038306138336533fe014373726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a7365745f72657365727665645f62616c616e63653a3a6866356237356638623531313835323531ff014773726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a683561323363366238356235373263666280023473726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e3a3a6c6f636b733a3a683066646566366166633961653262366381024e73726d6c5f636f6e74726163743a3a6163636f756e745f64623a3a4f7665726c61794163636f756e7444623c543e3a3a7365745f62616c616e63653a3a6836356234396161336263356434393136820289013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6465706f7369745f6372656174696e673a3a686265643565656631393135333063633383028c013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a656e737572655f63616e5f77697468647261773a3a683733343431616137643561616338363184027e3c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a736c6173683a3a6866313031323732386365373032323764850281013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a77697468647261773a3a6830316333386330613937386565316132860288013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a4d616b655061796d656e743c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6d616b655f7061796d656e743a3a68363139313938343438626364636535398702483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a696e736572743a3a6835643061373731396530373135343637880291013c73726d6c5f636f756e63696c3a3a73656174733a3a4d6f64756c653c543e2061732073725f7072696d6974697665733a3a7472616974733a3a4f6e496e697469616c697a653c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a426c6f636b4e756d6265723e3e3a3a6f6e5f696e697469616c697a653a3a686263653862373630336434383762613089024e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68363162653461373530356262373662658a023d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a68306433363162653734663931396633618b024e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68656566623665313461326533326666328c023d73726d6c5f636f756e63696c3a3a73656174733a3a4d6f64756c653c543e3a3a616c6c5f766f746572733a3a68353262343038613865363763376630358d023f73726d6c5f636f756e63696c3a3a73656174733a3a4d6f64756c653c543e3a3a617070726f76616c735f6f663a3a68613261336630666435656465303333358e02b5023c73726d6c5f636f756e63696c3a3a73656174733a3a566f746572496e666f4f663c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a67656e657261746f723a3a53746f726167654d61703c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449642c73726d6c5f636f756e63696c3a3a73656174733a3a566f746572496e666f3c3c3c542061732073726d6c5f64656d6f63726163793a3a54726169743e3a3a43757272656e63792061732073726d6c5f737570706f72743a3a7472616974733a3a43757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a42616c616e63653e3e3e3a3a6765743a3a68346365623639653138663131333339338f023d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6839393964396238646138633331613839900291013c73726d6c5f636f756e63696c3a3a6d6f74696f6e733a3a4d6f64756c653c543e2061732073726d6c5f636f756e63696c3a3a4f6e4d656d626572734368616e6765643c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a6f6e5f6d656d626572735f6368616e6765643a3a68626165626438616330656462313561629102c1013c73726d6c5f636f756e63696c3a3a73656174733a3a566f746572733c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a67656e657261746f723a3a53746f726167654d61703c7533322c616c6c6f633a3a7665633a3a5665633c636f72653a3a6f7074696f6e3a3a4f7074696f6e3c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3e3e3a3a6765743a3a686636306262343236303735353134643892024e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6831343736336633383532313236366166930291013c73726d6c5f62616c616e6365733a3a4d6f64756c653c542c493e2061732073726d6c5f737570706f72743a3a7472616974733a3a52657365727661626c6543757272656e63793c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3a3a736c6173685f72657365727665643a3a68343732376664363632623638383933619402b5013c73725f7072696d6974697665733a3a67656e657269633a3a756e636865636b65645f6d6f7274616c5f636f6d706163745f65787472696e7369633a3a556e636865636b65644d6f7274616c436f6d7061637445787472696e7369633c416464726573732c496e6465782c43616c6c2c5369676e61747572653e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68646130316166643635373932373538329502723c73726d6c5f696e64696365733a3a616464726573733a3a416464726573733c4163636f756e7449642c4163636f756e74496e6465783e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a68383862356433623533356662643738379602c2013c73725f7072696d6974697665733a3a67656e657269633a3a756e636865636b65645f6d6f7274616c5f636f6d706163745f65787472696e7369633a3a556e636865636b65644d6f7274616c436f6d7061637445787472696e7369633c416464726573732c496e6465782c43616c6c2c5369676e61747572653e2061732073725f7072696d6974697665733a3a7472616974733a3a436865636b61626c653c436f6e746578743e3e3a3a636865636b3a3a683036653564313134313734396336623097023573726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a626c6f636b5f686173683a3a68636461343636313732363935303962329802633c7061726974795f636f6465633a3a636f6465633a3a436f6d706163745265663c7536343e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a686431646632373534313466366664326599025f3c73726d6c5f62616c616e6365733a3a43616c6c3c542c493e2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a68346362313634363335393462393532389a02633c73726d6c5f636f756e63696c3a3a73656174733a3a43616c6c3c543e2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a68396631643662393862653761643263339b024373726d6c5f636f756e63696c3a3a73656174733a3a4d6f64756c653c543e3a3a646f5f7365745f617070726f76616c733a3a68363937366237623035303866623533349c023f73726d6c5f636f756e63696c3a3a73656174733a3a4d6f64756c653c543e3a3a72656d6f76655f766f7465723a3a68613562363662306433323539366664649d02513c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a53706563457874656e643c542c493e3e3a3a66726f6d5f697465723a3a68343632616537383636383366626532669e023d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a68346430633965333565643661663364329f02483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a696e736572743a3a6833313735373132313132333835633233a002693c636f72653a3a697465723a3a61646170746572733a3a46696c7465724d61703c492c463e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a6e6578743a3a6830316338343363633632306238666165a102693c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a53706563457874656e643c542c616c6c6f633a3a7665633a3a496e746f497465723c543e3e3e3a3a737065635f657874656e643a3a6831333461663738653338346137626365a202693c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a53706563457874656e643c542c616c6c6f633a3a7665633a3a496e746f497465723c543e3e3e3a3a737065635f657874656e643a3a6862343163666461376564303937303036a3026f7061726974795f636f6465633a3a636f6465633a3a696e6e65725f7475706c655f696d706c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f7220284a2c204b293e3a3a6465636f64653a3a6866623838366462613837613133666162a4026f7061726974795f636f6465633a3a636f6465633a3a696e6e65725f7475706c655f696d706c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f7220284a2c204b293e3a3a6465636f64653a3a6866666636363639376566353239376636a5024e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6835363536323866646432306635316437a6024e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6836363833346364613430356432633764a7024e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6838316166663434383562396538663962a8024e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6838336238616335356434653661346232a9024e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6861623830383237656337626438656130aa024e3c616c6c6f633a3a7665633a3a5665633c543e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6862656565623131663538616539396239ab02513c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a53706563457874656e643c542c493e3e3a3a66726f6d5f697465723a3a6835353465656535616338353764643066ac02303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6835363839613464326237393731653532ad02553c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e737472756374696f6e20617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6838373631313638303936383131366166ae026b3c7061726974795f7761736d3a3a656c656d656e74733a3a6f70733a3a496e737472756374696f6e206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a6865323933633735663634643061626636af027d3c7061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a436f756e7465644c6973745772697465723c492c543e206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a6831666330386437643034626634383931b0026f3c7061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a566172496e743332206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a6836326264653134663536643062353962b1026f3c7061726974795f7761736d3a3a656c656d656e74733a3a7072696d6974697665733a3a566172496e743634206173207061726974795f7761736d3a3a656c656d656e74733a3a53657269616c697a653e3a3a73657269616c697a653a3a6864616238623536303035613534306666b2028b0173726d6c5f636f6e74726163743a3a5f494d504c5f454e434f44455f464f525f5363686564756c653a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f722073726d6c5f636f6e74726163743a3a5363686564756c653c4761733e3e3a3a656e636f64655f746f3a3a6861383261333733366437633236323266b3023d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6862626464383561363032643039373134b402bc0173726d6c5f636f6e74726163743a3a5f494d504c5f454e434f44455f464f525f526177416c697665436f6e7472616374496e666f3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f722073726d6c5f636f6e74726163743a3a526177416c697665436f6e7472616374496e666f3c436f6465486173682c42616c616e63652c426c6f636b4e756d6265723e3e3a3a656e636f64655f746f3a3a6830303736613438386139383963656165b5023b73726d6c5f636f6e74726163743a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6863393730616532633038646531383034b6024073726d6c5f636f6e74726163743a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6836623664333738393861383966646630b7024573726d6c5f636f6e74726163743a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6831356530653963346437396161323135b802703c73726d6c5f636f6e74726163743a3a5f5f47657442797465537472756374436f6e7472616374496e666f4f663c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6839333866393561376661383066386139b902703c73726d6c5f636f6e74726163743a3a5f5f476574427974655374727563744163636f756e74436f756e7465723c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6833323031343334336266306266323434ba02713c73726d6c5f636f6e74726163743a3a5f5f4765744279746553747275637443757272656e745363686564756c653c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6835623437343165616434316365623934bb026f3c73726d6c5f636f6e74726163743a3a5f5f47657442797465537472756374426c6f636b4761734c696d69743c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6837653532336438306337633333343732bc026a3c73726d6c5f636f6e74726163743a3a5f5f476574427974655374727563744d617844657074683c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6864666161616234353338353461353233bd026f3c73726d6c5f636f6e74726163743a3a5f5f47657442797465537472756374437265617465426173654665653c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6836636530396362373239356265656564be026d3c73726d6c5f636f6e74726163743a3a5f5f4765744279746553747275637443616c6c426173654665653c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6861653663643564663437623563663936bf026d3c73726d6c5f636f6e74726163743a3a5f5f47657442797465537472756374436f6e74726163744665653c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6830383538386639643632306338306166c0027e73726d6c5f636f6e74726163743a3a5f494d504c5f4445434f44455f464f525f43616c6c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f722073726d6c5f636f6e74726163743a3a43616c6c3c543e3e3a3a6465636f64653a3a6830643962346233303935336164666131c102880173726d6c5f636f6e74726163743a3a5f494d504c5f4445434f44455f464f525f5363686564756c653a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f722073726d6c5f636f6e74726163743a3a5363686564756c653c4761733e3e3a3a6465636f64653a3a6837623265656434386238383563613031c202723c73726d6c5f696e64696365733a3a616464726573733a3a416464726573733c4163636f756e7449642c4163636f756e74496e6465783e206173207061726974795f636f6465633a3a636f6465633a3a4465636f64653e3a3a6465636f64653a3a6837643536313431386431386263333665c3027e73726d6c5f636f6e74726163743a3a5f494d504c5f4445434f44455f464f525f43616c6c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f722073726d6c5f636f6e74726163743a3a43616c6c3c543e3e3a3a6465636f64653a3a6837393835653335613037616339616431c4023873726d6c5f636f6e74726163743a3a7761736d3a3a636f64655f63616368653a3a6c6f61643a3a6830613834363432353534326634363832c5024173726d6c5f636f6e74726163743a3a7761736d3a3a707265706172653a3a707265706172655f636f6e74726163743a3a6861656436383936333733373961393039c602416861736862726f776e3a3a7261773a3a5261775461626c653c543e3a3a7472795f776974685f63617061636974793a3a6831656136316166333338653832306261c7023e6861736862726f776e3a3a7261773a3a5261775461626c653c543e3a3a726573657276655f7265686173683a3a6831373535373533376236336263656262c802483c636f72653a3a63656c6c3a3a426f72726f774d75744572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6831333831393434366437653064303262c9022e636f72653a3a726573756c743a3a756e777261705f6661696c65643a3a6833393364613938653639323439383564ca02453c636f72653a3a63656c6c3a3a426f72726f774572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6838363734326534666666666630303164cb0249636f72653a3a666d743a3a6e756d3a3a3c696d706c20636f72653a3a666d743a3a446562756720666f72207573697a653e3a3a666d743a3a6831666562313135616361656230666432cc022f636f72653a3a666d743a3a6e756d3a3a696d703a3a666d745f7536343a3a6836333234636430343836666166656636cd02483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f7261676556616c75653c543e3e3a3a6d75746174653a3a6833333437623132303630363137626532ce025d3c73726d6c5f636f6e74726163743a3a43616c6c3c543e2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a6830353135393834636235663036343465cf022e73726d6c5f636f6e74726163743a3a6761733a3a6275795f6761733a3a6836363661333430633161383932303333d0023473726d6c5f636f6e74726163743a3a436f6e6669673c543e3a3a7072656c6f61643a3a6834316164653736613335306633316235d1024173726d6c5f636f6e74726163743a3a72656e743a3a7472795f65766963745f6f725f616e645f7061795f72656e743a3a6834323138616332613764663135623736d202593c6e6f64655f72756e74696d653a3a43616c6c2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a6862626638633431636165653434313765d302aa017375627374726174655f7072696d6974697665733a3a73616e64626f783a3a5f494d504c5f454e434f44455f464f525f547970656456616c75653a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f72207375627374726174655f7072696d6974697665733a3a73616e64626f783a3a547970656456616c75653e3a3a656e636f64655f746f3a3a6861663162323439316632316436306638d4023573726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a6765743a3a6835366637353766356337656262646466d5023673726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a6465706f7369745f6c6f673a3a6833343638386266303463643066363137d6023d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6831653535316635373736306166383030d7023873726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a6163636f756e745f6e6f6e63653a3a6835616137393765343961623139373366d80230636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a6864383935313939363031376332386466d902643c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c7533323e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a7573696e675f656e636f6465643a3a6837326364353931616639636132323162da028d0173726d6c5f73797374656d3a3a5f494d504c5f454e434f44455f464f525f4576656e745265636f72643a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f722073726d6c5f73797374656d3a3a4576656e745265636f72643c452c543e3e3a3a656e636f64655f746f3a3a6838323837396666306663333164326230db02443c636f72653a3a666d743a3a417267756d656e747320617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a6863333464643934323638613031353930dc02303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6830393762623431386138383864633836dd027e6e6f64655f72756e74696d653a3a5f494d504c5f454e434f44455f464f525f4576656e743a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f72206e6f64655f72756e74696d653a3a4576656e743e3a3a656e636f64655f746f3a3a6831306637373263333663646337343331de023973726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6838666439616539396365306433653365df023e73726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6833376561333837666563663834386238e0024373726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a6e6f74655f66696e69736865645f65787472696e736963733a3a6831376563653461336162623566643336e1024373726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6836393735623434353263653664613731e202693c73726d6c5f73797374656d3a3a5f5f47657442797465537472756374426c6f636b486173683c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6866363537326462303239613532303539e3026e3c73726d6c5f73797374656d3a3a5f5f4765744279746553747275637452616e646f6d4d6174657269616c3c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6865396561333661373034663364333732e4023373726d6c5f73797374656d3a3a4d6f64756c653c543e3a3a66696e616c697a653a3a6832333262613534633836316662643139e50288013c73726d6c5f74696d657374616d703a3a4d6f64756c653c543e2061732073725f7072696d6974697665733a3a7472616974733a3a4f6e46696e616c697a653c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a426c6f636b4e756d6265723e3e3a3a6f6e5f66696e616c697a653a3a6865613363376233363363383231313966e6023c73726d6c5f74696d657374616d703a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6865633138323463353265366161373461e7024173726d6c5f74696d657374616d703a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6861376537396265333130613633373935e8024673726d6c5f74696d657374616d703a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6863316561623737313962613238396561e902703c73726d6c5f74696d657374616d703a3a5f5f476574427974655374727563744d696e696d756d506572696f643c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6832643835666531326337646634366261ea025e3c73726d6c5f74696d657374616d703a3a43616c6c3c543e2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a6864626661323637383662393436396336eb0234636f72653a3a736c6963653a3a3c696d706c205b545d3e3a3a636f6e7461696e733a3a6836396461666637393039373061313131ec02753c73726d6c5f696e64696365733a3a616464726573733a3a416464726573733c4163636f756e7449642c4163636f756e74496e6465783e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6862386336353535306336313834396538ed0286013c73726d6c5f6772616e6470613a3a4d6f64756c653c543e2061732073725f7072696d6974697665733a3a7472616974733a3a4f6e46696e616c697a653c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a426c6f636b4e756d6265723e3e3a3a6f6e5f66696e616c697a653a3a6861333436363963343964393361643239ee023773726d6c5f6772616e6470613a3a4d6f64756c653c543e3a3a6465706f7369745f6c6f673a3a6863656665626663343965636232336532ef023b73726d6c5f6772616e6470613a3a4d6f64756c653c543e3a3a7363686564756c655f6368616e67653a3a6830646337636465646430343838646565f0023e6e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f7375646f3a3a6830353763643235373336633566323161f102406e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f73797374656d3a3a6833303966626664316235383230343331f202416e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f696e64696365733a3a6835313638376461316431373635363336f302426e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f62616c616e6365733a3a6830313034353861633265346163316633f402416e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f73657373696f6e3a3a6837306531373138353463393136636462f502416e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f7374616b696e673a3a6831616430376264623933343831383832f602436e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f64656d6f63726163793a3a6835336535366433356462663934383238f702416e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f636f756e63696c3a3a6864663564313939396433366136323231f802496e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f636f756e63696c5f6d6f74696f6e733a3a6864613933353738393165313134333763f902416e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f6772616e6470613a3a6833353338356331323036326335363830fa02426e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f74726561737572793a3a6864346339636463356334633366393333fb02426e6f64655f72756e74696d653a3a52756e74696d653a3a5f5f6d6f64756c655f6576656e74735f636f6e74726163743a3a6839613734613861663361393964663838fc025d3c73726d6c5f74726561737572793a3a43616c6c3c543e2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a6831363430633263376565613064643238fd02653c73726d6c5f636f756e63696c3a3a6d6f74696f6e733a3a43616c6c3c543e2061732073726d6c5f737570706f72743a3a64697370617463683a3a446973706174636861626c653e3a3a64697370617463683a3a6862363465326662356639636662646265fe02453c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a6765743a3a6831306235373565303766633764306438ff02573c73726d6c5f696e64696365733a3a43616c6c3c543e2061732073725f7072696d6974697665733a3a776569676874733a3a576569676861626c653e3a3a7765696768743a3a6861393836303337636335303561333732800339636f72653a3a6f70733a3a66756e6374696f6e3a3a466e4f6e63653a3a63616c6c5f6f6e63653a3a686237636163326533636430336665653681033f73726d6c5f6772616e6470613a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a683333633630393633646361383235656482034473726d6c5f6772616e6470613a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a683563633437316233666233343232366283033a73726d6c5f6772616e6470613a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a686361353835346539613437333536373684033c73726d6c5f7375646f3a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a686333633031393532613965623234653485034173726d6c5f7375646f3a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a683966373733386635663264626264616386033773726d6c5f7375646f3a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a68643361353435376133303436313365348703613c73726d6c5f7375646f3a3a5f5f476574427974655374727563744b65793c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a683862633436363235383930393364366188030c436f72655f76657273696f6e890312436f72655f657865637574655f626c6f636b8a037973726d6c5f6578656375746976653a3a4578656375746976653c53797374656d2c426c6f636b2c436f6e746578742c5061796d656e742c556e7369676e656456616c696461746f722c416c6c4d6f64756c65733e3a3a696e697469616c697a655f626c6f636b3a3a68376233366163313939613337393135378b034173725f7072696d6974697665733a3a67656e657269633a3a656e636f64655f776974685f7665635f7072656669783a3a68613533393833653538653062636430648c036c3c73725f7072696d6974697665733a3a7472616974733a3a426c616b6554776f3235362061732073725f7072696d6974697665733a3a7472616974733a3a486173683e3a3a656e756d6572617465645f747269655f726f6f743a3a68363130383336343662393432383739388d03810173726d6c5f6578656375746976653a3a4578656375746976653c53797374656d2c426c6f636b2c436f6e746578742c5061796d656e742c556e7369676e656456616c696461746f722c416c6c4d6f64756c65733e3a3a6170706c795f65787472696e7369635f776974685f6c656e3a3a68303635373131643530343264336366398e0387013c73726d6c5f74726561737572793a3a4d6f64756c653c543e2061732073725f7072696d6974697665733a3a7472616974733a3a4f6e46696e616c697a653c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a426c6f636b4e756d6265723e3e3a3a6f6e5f66696e616c697a653a3a68643434613665343736396233643037348f036c3c73725f7072696d6974697665733a3a67656e657269633a3a6469676573743a3a4469676573744974656d3c486173683e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64653a3a6834366464366662356238333562393731900315436f72655f696e697469616c697a655f626c6f636b9103114d657461646174615f6d657461646174619203603c7061726974795f636f6465633a3a636f6465633a3a436f6d706163743c7533323e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a68613366393836333937346566363933659303433c5b75385d206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a68356261663237376630323439353930399403623c73726d6c5f6d657461646174613a3a4465636f6465446966666572656e743c422c4f3e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a68633139393633623465353564366132629503623c73726d6c5f6d657461646174613a3a4465636f6465446966666572656e743c422c4f3e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a68636130653235643436326465303339619603623c73726d6c5f6d657461646174613a3a4465636f6465446966666572656e743c422c4f3e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a683434666466653133623032306564633697031c426c6f636b4275696c6465725f6170706c795f65787472696e73696398031b426c6f636b4275696c6465725f66696e616c697a655f626c6f636b990320426c6f636b4275696c6465725f696e686572656e745f65787472696e736963739a033873726d6c5f74696d657374616d703a3a657874726163745f696e686572656e745f646174613a3a68633264616634656231393762336433329b031c426c6f636b4275696c6465725f636865636b5f696e686572656e74739c0318426c6f636b4275696c6465725f72616e646f6d5f736565649d032b5461676765645472616e73616374696f6e51756575655f76616c69646174655f7472616e73616374696f6e9e03214f6666636861696e576f726b65724170695f6f6666636861696e5f776f726b65729f03214772616e6470614170695f6772616e6470615f70656e64696e675f6368616e6765a0034e73725f7072696d6974697665733a3a67656e657269633a3a6469676573743a3a4469676573743c486173683e3a3a636f6e766572745f66697273743a3a6836366333363234366332653461666564a103204772616e6470614170695f6772616e6470615f666f726365645f6368616e6765a2031e4772616e6470614170695f6772616e6470615f617574686f726974696573a30315417572614170695f736c6f745f6475726174696f6ea40313417572614170695f617574686f726974696573a5037a3c636f72653a3a697465723a3a61646170746572733a3a46696c7465724d61703c492c463e20617320636f72653a3a697465723a3a7472616974733a3a6974657261746f723a3a4974657261746f723e3a3a7472795f666f6c643a3a7b7b636c6f737572657d7d3a3a6830633830656137323332346530373965a6033b73726d6c5f74726561737572793a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6832366562646163613532656363613561a7034073726d6c5f74726561737572793a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6835393339323736626561306163656166a8034573726d6c5f74726561737572793a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6839663139653639643062656237313738a9036d3c73726d6c5f74726561737572793a3a5f5f476574427974655374727563745370656e64506572696f643c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6836306239646532646139656632343639aa033673726d6c5f74726561737572793a3a4d6f64756c653c543e3a3a70726f706f73616c733a3a6865666535383230393831636338313263ab03960173726d6c5f74726561737572793a3a5f494d504c5f4445434f44455f464f525f50726f706f73616c3a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a4465636f646520666f722073726d6c5f74726561737572793a3a50726f706f73616c3c4163636f756e7449642c42616c616e63653e3e3a3a6465636f64653a3a6861396236356662323336616562633266ac03303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6835373062333834306365353164316338ad033d7061726974795f636f6465633a3a636f6465633a3a456e636f64653a3a7573696e675f656e636f6465643a3a6861646235326434323663363837373737ae034373726d6c5f636f756e63696c3a3a6d6f74696f6e733a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6833366464326631646134636339643265af034873726d6c5f636f756e63696c3a3a6d6f74696f6e733a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6838383137333832346434613662363731b0034d73726d6c5f636f756e63696c3a3a6d6f74696f6e733a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6861646238366366633866623461333036b103703c73726d6c5f636f756e63696c3a3a6d6f74696f6e733a3a5f5f47657442797465537472756374566f74696e673c543e2061732073726d6c5f6d657461646174613a3a44656661756c74427974653e3a3a64656661756c745f627974653a3a6862366262393764653065346336306438b2033a73726d6c5f696e64696365733a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6837616532366131643234643932326237b3033f73726d6c5f696e64696365733a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6831306132303733303438396137353732b4034473726d6c5f696e64696365733a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6866363865306666626566326438646465b503483c552061732073726d6c5f737570706f72743a3a73746f726167653a3a53746f726167654d61703c4b2c563e3e3a3a696e736572743a3a6832363635303738306162303339663662b603d6013c73726d6c5f636f756e63696c3a3a6d6f74696f6e733a3a566f74696e673c543e2061732073726d6c5f737570706f72743a3a73746f726167653a3a6861736865643a3a67656e657261746f723a3a53746f726167654d61703c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a486173682c73726d6c5f636f756e63696c3a3a6d6f74696f6e733a3a566f7465733c3c542061732073726d6c5f73797374656d3a3a54726169743e3a3a4163636f756e7449643e3e3e3a3a6765743a3a6864363432643232336231656163383566b703443c6e6f64655f72756e74696d653a3a43616c6c20617320636f72653a3a636c6f6e653a3a436c6f6e653e3a3a636c6f6e653a3a6865636634353031353263396337333939b8034273726d6c5f636f756e63696c3a3a6d6f74696f6e733a3a4d6f64756c653c543e3a3a69735f636f756e63696c6c6f723a3a6832383539316166633763383138613038b9033a73726d6c5f73657373696f6e3a3a4d6f64756c653c543e3a3a63616c6c5f66756e6374696f6e733a3a6835613734376161303337613130323730ba033f73726d6c5f73657373696f6e3a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f6e616d653a3a6865663337623938613262616336636165bb034473726d6c5f73657373696f6e3a3a4d6f64756c653c543e3a3a73746f72655f6d657461646174615f66756e6374696f6e733a3a6833646333393663383139373062623730bc033073726d6c5f636f6e74726163743a3a657865633a3a7472616e736665723a3a6836623662363532303861393239356436bd0330636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a6866656635303035393964613961653264be03467061726974795f7761736d3a3a656c656d656e74733a3a73656374696f6e3a3a436f646553656374696f6e3a3a626f646965733a3a6834633238383839393133366536353162bf034e636f72653a3a666d743a3a6e756d3a3a696d703a3a3c696d706c20636f72653a3a666d743a3a446973706c617920666f72207533323e3a3a666d743a3a6835313966313864636237326261336539c003397761736d695f76616c69646174696f6e3a3a76616c69646174655f6d656d6f72795f747970653a3a6865366631393266326664613039643832c103347761736d695f76616c69646174696f6e3a3a657870725f636f6e73745f747970653a3a6861656163356431346336623830396639c203553c7061726974795f7761736d3a3a656c656d656e74733a3a74797065733a3a56616c75655479706520617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6863326134356666353061376161396539c303473c7761736d695f76616c69646174696f6e3a3a4572726f7220617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a6866353933393766323137613636373964c4034a7761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a737465703a3a6832666537613565366332363331356661c503457061726974795f7761736d3a3a656c656d656e74733a3a7365676d656e743a3a446174615365676d656e743a3a76616c75653a3a6837623865636664383363666165356131c60348616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e3a3a696e736572743a3a6830656462363861303163356265306337c7033c7061726974795f7761736d3a3a6275696c6465723a3a6d6f64756c653a3a66726f6d5f6d6f64756c653a3a6834323534626164656230616363376166c803537061726974795f7761736d3a3a6275696c6465723a3a6d6f64756c653a3a4d6f64756c654275696c6465723c463e3a3a7265736f6c76655f747970655f7265663a3a6863663565633265313765663537323035c903a9017061726974795f7761736d3a3a6275696c6465723a3a6d6f64756c653a3a3c696d706c20636f72653a3a636f6e766572743a3a46726f6d3c7061726974795f7761736d3a3a6275696c6465723a3a6d6f64756c653a3a4d6f64756c6553636166666f6c643e20666f72207061726974795f7761736d3a3a656c656d656e74733a3a6d6f64756c653a3a4d6f64756c653e3a3a66726f6d3a3a6830353536356238326665343262306538ca033a707761736d5f7574696c733a3a72756c65733a3a496e737472756374696f6e547970653a3a6f703a3a6830316332396565616463663335313062cb032d616c6c6f633a3a7665633a3a5665633c543e3a3a696e736572743a3a6830393332363436363438313361366335cc03507061726974795f7761736d3a3a6275696c6465723a3a6d6f64756c653a3a4d6f64756c654275696c6465723c463e3a3a707573685f66756e6374696f6e3a3a6838643061356230363637363139613838cd033c707761736d5f7574696c733a3a737461636b5f6865696768743a3a696e6a6563745f6c696d697465723a3a6831636436386663336433373839336439ce03347761736d695f76616c69646174696f6e3a3a66756e633a3a706f705f6c6162656c3a3a6863626562643038326466356364303865cf03547761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a76616c69646174655f73746f72653a3a6862643739363133313339343332383965d003347761736d695f76616c69646174696f6e3a3a66756e633a3a706f705f76616c75653a3a6833313763366332356339306365653430d103537761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a76616c69646174655f6c6f61643a3a6834393035633532663833363531346161d203547761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a76616c69646174655f72656c6f703a3a6837353761346463393739376562316230d303557761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a76616c69646174655f746573746f703a3a6864346366646335333561663030633362d403547761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a76616c69646174655f62696e6f703a3a6838633331313330663565623336316632d503407761736d695f76616c69646174696f6e3a3a7574696c3a3a4c6f63616c733a3a747970655f6f665f6c6f63616c3a3a6831386566303365653833303566666561d603537761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a76616c69646174655f756e6f703a3a6838353331303135666166633861336431d703547761736d695f76616c69646174696f6e3a3a66756e633a3a46756e6374696f6e56616c69646174696f6e436f6e746578743a3a76616c69646174655f6376746f703a3a6833613733343330326264616561376664d803553c7061726974795f7761736d3a3a656c656d656e74733a3a74797065733a3a426c6f636b5479706520617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6839346532626165616538343162313330d9034e3c7761736d695f76616c69646174696f6e3a3a737461636b3a3a4572726f7220617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a6835613733643831626162386430626264da03543c7761736d695f76616c69646174696f6e3a3a66756e633a3a537461636b56616c75655479706520617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6862373235313739336638363630383535db0337616c6c6f633a3a7261775f7665633a3a5261775665633c542c413e3a3a726573657276653a3a6836613038356231346265396435633734dc033b636f72653a3a736c6963653a3a3c696d706c205b545d3e3a3a636f70795f66726f6d5f736c6963653a3a6836303961663164643666613232333735dd032e636f72653a3a726573756c743a3a756e777261705f6661696c65643a3a6865363865663431386238643863316331de0339636f72653a3a666d743a3a6275696c646572733a3a44656275675475706c653a3a6669656c643a3a6835313334393661303431643563636232df034c3c7761736d695f76616c69646174696f6e3a3a737461636b3a3a4572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6832666536663963363630326265346663e003303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6837326234353830626637326537303332e103453c616c6c6f633a3a737472696e673a3a537472696e6720617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a6863663738346335653363613266373731e20323636f72653a3a666d743a3a77726974653a3a6836646264346536386638373035323231e30341707761736d5f7574696c733a3a737461636b5f6865696768743a3a6d61785f6865696768743a3a636f6d707574653a3a6864366233373132356536666366663333e403323c265420617320636f72653a3a666d743a3a446973706c61793e3a3a666d743a3a6835653966383665363861346464343266e5033f707761736d5f7574696c733a3a737461636b5f6865696768743a3a7265736f6c76655f66756e635f747970653a3a6835396131346330396137303930383238e603613c616c6c6f633a3a636f6c6c656374696f6e733a3a62747265653a3a6d61703a3a42547265654d61703c4b2c563e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6865316438363535626666663531343030e703533c616c6c6f633a3a7665633a3a5665633c543e20617320616c6c6f633a3a7665633a3a53706563457874656e643c542c493e3e3a3a737065635f657874656e643a3a6839626638343738306239303233323334e80333636f72653a3a6f7074696f6e3a3a4f7074696f6e3c26543e3a3a636c6f6e65643a3a6861333566626630386639653461636131e90346707761736d5f7574696c733a3a737461636b5f6865696768743a3a6d61785f6865696768743a3a537461636b3a3a6672616d653a3a6865663534363634346336306434623135ea034b707761736d5f7574696c733a3a737461636b5f6865696768743a3a6d61785f6865696768743a3a537461636b3a3a706f705f76616c7565733a3a6865646435396332323933383537653261eb03303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6831643539383166653938316462313737ec03303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6834626661363434626431393266666236ed03303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6837613536343663303430373264333733ee03303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6837646638663737353332306532373734ef03463c616c6c6f633a3a7665633a3a5665633c543e20617320636f72653a3a6f70733a3a64726f703a3a44726f703e3a3a64726f703a3a6861363537336135373632656161343632f003303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6832633037393736363432656561653630f103303c265420617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6864323138616636666239353832313839f2039c0173726d6c5f6d657461646174613a3a5f494d504c5f454e434f44455f464f525f53746f7261676546756e6374696f6e547970653a3a3c696d706c207061726974795f636f6465633a3a636f6465633a3a456e636f646520666f722073726d6c5f6d657461646174613a3a53746f7261676546756e6374696f6e547970653e3a3a656e636f64655f746f3a3a6836653731323166623136653532633661f303423c5b545d206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6836323336336636653364383535303264f403623c73726d6c5f6d657461646174613a3a4465636f6465446966666572656e743c422c4f3e206173207061726974795f636f6465633a3a636f6465633a3a456e636f64653e3a3a656e636f64655f746f3a3a6830613634326534663332376539616135f50311727573745f626567696e5f756e77696e64f6034e73725f696f3a3a696d703a3a6578743a3a65787465726e5f66756e6374696f6e735f686f73745f696d706c3a3a6578745f7072696e745f757466383a3a6832333837396334613931313463373565f7030a5f5f72675f616c6c6f63f8030c5f5f72675f6465616c6c6f63f9030c5f5f72675f7265616c6c6f63fa03115f5f72675f616c6c6f635f7a65726f6564fb032e636f72653a3a726573756c743a3a756e777261705f6661696c65643a3a6864653239343433393239313531623639fc033e3c636f72653a3a666d743a3a4572726f7220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a6835313235643164306563633239393130fd033a3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f7374723a3a6839353965666131623335626366643438fe033b3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f636861723a3a6835343638363039306564663265396539ff033a3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f666d743a3a6833636663653965373133323661336239800430636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a68303031396461623065383937633336378104313c5420617320636f72653a3a616e793a3a416e793e3a3a747970655f69643a3a6834613532623136633830303234616261820443636f72653a3a666d743a3a466f726d61747465723a3a7061645f696e74656772616c3a3a77726974655f7072656669783a3a683432386265353039346339343164336383042e636f72653a3a7374723a3a736c6963655f6572726f725f6661696c3a3a683164313363613733343265626666353384044a3c636f72653a3a6f70733a3a72616e67653a3a52616e67653c4964783e20617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a68316436363734336535623538343039638504323c6368617220617320636f72653a3a666d743a3a44656275673e3a3a666d743a3a686431393739333162373737643337336386043d636f72653a3a756e69636f64653a3a626f6f6c5f747269653a3a426f6f6c547269653a3a6c6f6f6b75703a3a683531623662343337336438653836356287044e636f72653a3a666d743a3a6e756d3a3a3c696d706c20636f72653a3a666d743a3a446562756720666f72207573697a653e3a3a666d743a3a68316665623131356163616562306664322e31393039880434636f72653a3a666d743a3a417267756d656e7456313a3a73686f775f7573697a653a3a686364353964306437623539306436323289042e636f72653a3a736c6963653a3a6d656d6368723a3a6d656d6368723a3a68363461663862323537393838646230348a048001636f72653a3a7374723a3a7472616974733a3a3c696d706c20636f72653a3a736c6963653a3a536c696365496e6465783c7374723e20666f7220636f72653a3a6f70733a3a72616e67653a3a52616e67653c7573697a653e3e3a3a696e6465783a3a7b7b636c6f737572657d7d3a3a68656163303763393531626335663764648b04533c636f72653a3a666d743a3a6275696c646572733a3a5061644164617074657220617320636f72653a3a666d743a3a57726974653e3a3a77726974655f7374723a3a68366538633033663965636631646139308c0430636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a68333430303565383966626464336335388d042f636f72653a3a666d743a3a57726974653a3a77726974655f636861723a3a68313532633662643433626438333336308e042e636f72653a3a666d743a3a57726974653a3a77726974655f666d743a3a68623730623339363562646162393237308f0430636f72653a3a7074723a3a7265616c5f64726f705f696e5f706c6163653a3a683031343735323165623962333830323190043a3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f7374723a3a686366366133663535383139656366646491043b3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f636861723a3a683138313637396666343166303265313792043a3c266d7574205720617320636f72653a3a666d743a3a57726974653e3a3a77726974655f666d743a3a68623438316365373666653862323234389304066d656d7365749404066d656d6370799504076d656d6d6f76659604066d656d636d709704095f5f756469767469339804085f5f6d756c7469339904095f5f6173686c7469339a04095f5f6c7368727469339b040c5f5f756469766d6f6474693400590970726f64756365727302086c616e677561676501045275737404323031380c70726f6365737365642d62790105727573746325312e33372e302d6e696768746c79202834303062343039656620323031392d30362d303929", + "0x5286264f4d2ddb5a0d2950bf3bcfb9f6": "0x10000000000000000000000000000000", + "0x6d5b60e78cadb1cc37887b7ee4a5ab10": "0x00000000", + "0x24586f4898a5a637b755b658ec163d00": "0x00407a10f35a00000000000000000000", + "0xabe32953315ab8fe7b2b925eba5f4c80": "0x00e40b54020000000000000000000000", + "0x52c9048efbfc40fd1e312b7bed451dee": "0x06000000", + "0x90d5871cf3f4d0a3642cf2043a7d8eda": "0x0010a5d4e80000000000000000000000", + "0x6e45a8645fa8f905c49fecfef3d06c67": "0x01000000", + "0x4e62513de81454ce76df887573f7f98b101eb4585b1485a222b7db599f4e93e2": "0x047374616b696e67200000c16ff28623000000000000000000ffffffffffffffff0f", + "0x3ae31af9a378162eb2736f26855c9ad8": "0x4545454545454545454545454545454545454545454545454545454545454545", + "0xbc3717660105a864bd63dcd430de64128d58bd0917fa8dd75aee827cf086e19c": "0x0000c16ff28623000000000000000000", + "0x68c8d2f39c4605e65218c22c5664917047e4900c797b7dd33999d94213c75049": "0x047374616b696e67200000c16ff28623000000000000000000ffffffffffffffff0f", + "0x53d1471b684c8a776c80353e5981c960": "0x00407a10f35a00000000000000000000", + "0x1ba14d232d3c301a93e35f55e3d7aef2d98dbb9cc0ce48f457b81b421e0f704d": "0x0000c16ff28623000000000000000000", + "0xa5e869ecc1b914a6b0cf5f02b874f5eb90f1739fbd3edd01e5835d1517fd9f72": "0x781ead1e2fa9ccb74b44c19d29cb2a7a4b5be3972927ae98cd3877523976a276", + "0x717a2ee9c64ad3424e10e4461ec08296": "0x000000000100000000000000010000000000000001000000000000000100000000000000010000000000000001000000000000000100000000000000010000000000000001000000000000000400000000000100100000000020000000", + "0x26ac4a74e1ba94e0e7dbfc3b2aea083cf3c0f0d80eb999c7cebb340ee8934da9": "0x68655684472b743e456907b398d3a44c113f189e56d1bbfd55e889e295dfde780f0000c16ff286230f0000c16ff2862300", + "0xf4039aa8ae697861be900c58239e96f7": "0x0010a5d4e80000000000000000000000", + "0x3229a363ad5159bc2c48c9558128f00d2646f3a058cadf32077e9c9d9cca483f": "0x7932cff431e748892fa48e10c63c17d30f80ca42e4de3921e641249cd7fa3c2f7932cff431e748892fa48e10c63c17d30f80ca42e4de3921e641249cd7fa3c2f", + "0xdd9b01f8462dc19488279cb351a6d861": "0x20a10700", + "0xd8bc278604e9f924a948f47f58be8f89": "0x04000000000000000000000000000000", + "0x62f532424b7b1c52f522857315040f27": "0x00407a10f35a00000000000000000000", + "0xfa8e9950d581fc080f26110dde7c7fd8": "0x109becad03e6dcac03cee07edebca5475314861492cdfc96a2144a67bbe96993327932cff431e748892fa48e10c63c17d30f80ca42e4de3921e641249cd7fa3c2f5633b70b80a6c8bb16270f82cca6d56b27ed7b76c8fd5af2986a25a4788ce4403919132b851ef0fd2dae42a7e734fe547af5a6b809006100f48944d7fae8e8ef", + "0xb9b861cab4bbce870c811515bd5f33d7": "0x00", + "0xc63b8a0db7e72fd87c88d8dcf4777b883f86728613c57148c4e5cdceb05b7a1a": "0x0c0001f26cdb14b5aec7b2789fd5ca80f979cef3761897ae1f37ffb3e154cbcc1c26630168655684472b743e456907b398d3a44c113f189e56d1bbfd55e889e295dfde78", + "0x5e0766c2f9e49ff3d748bdbde578a8fd": "0x0080f420e6b500000000000000000000", + "0x633daafcb669e97549c1b9d65660881016f969040bc16171709159437c31294a": "0x0f0000c16ff286230f0000c16ff2862300", + "0x4664fb5d4e16f894df23cadb3faaa9a6": "0x04000000", + "0xdfaac108e0d4bc78fc9419a7fcfa84dc": "0x1066bc1e5d275da50b72b15de072a2468a5ad414919ca9054d2695767cf650012f9e42241d7cd91d001773b0b616d523dd80e13c6c2cab860b1234ef1b9ffc1526c8dc79e36b29395413399edaec3e20fcca7205fb19776ed8ddb25d6f427ec40e781ead1e2fa9ccb74b44c19d29cb2a7a4b5be3972927ae98cd3877523976a276", + "0x9651d20f401bfac47731a01d6eba33b4": "0x00000000", + "0x71020fee971bd00e8248d1830b8cffbe5b9cf4de1ea2911a1665c44fd70ab6f3": "0xf26cdb14b5aec7b2789fd5ca80f979cef3761897ae1f37ffb3e154cbcc1c26630f0000c16ff286230f0000c16ff2862300", + "0x2b334d6ac6698775ed17edf8cd3cbd9dae56cead0d69cb54f6af6aaecba544d8": "0x0f0000c16ff286230f0000c16ff2862300", + "0xe7ea0ae62a742dc4e1a569cdb99af499": "0x0200000000000000", + "0x1b4b2c8255b431edbbb5a4f5c7dcde69": "0x0010a5d4e80000000000000000000000", + "0xf718f07ec955fb94f1b3069713461089": "0x0010a5d4e80000000000000000000000", + "0x3b7d32346a3315a351084927a27d06a7": "0x0010a5d4e80000000000000000000000", + "0xbde3e43a2a348359d103d64bc95928146bdd9ae3490e26da38d2e4d19c137507": "0x0000a0dec5adc9353600000000000000", + "0x2b89d3b6f46fc8a3aee48c9cb06d7670": "0x0010a5d4e80000000000000000000000", + "0x78f4ad73d6b7279f8d06f359e363c829": "0x0000a49d8fc957363600000000000000", + "0xcf9a75deea0508104cd993c82daf57d3": "0x8096980000000000", + "0xfbb77d814ac81cfe0ef7030e8bd686f0": "0xe803000000000000", + "0xca0bd0e7fdd2e3998e5245f7c228191c": "0x96000000000000000000000000000000", + "0x579ab55d37b1220812be3c3df29d4858": "0x00000000", + "0xf14d23a9d4492a1efc9194e257b3c3d9": "0x00000000", + "0x040ff70c23416b89ce6afb75ee0d362e": "0x00000000", + "0x27b3872d47181b4a2dc15f0da43e7026": "0xe803000000000000", + "0xe026dd082e3158e72eb7c985fc8bac4f": "0x4038000000000000", + "0xc98362e2ca21b342cc749022ed9b560e4d29ec9862a960c2538c314f1d279635": "0x149ee5e5bdc0ec239eb164f865ecc345ce4c88e76ee002e0f7e3180973474718099c7a2ee14e565db0c69f78c7b4cd839fbf52b607d867e9e9c5a79042898a0d1268655684472b743e456907b398d3a44c113f189e56d1bbfd55e889e295dfde78547ff0ab649283a7ae01dbc2eb73932eba2fb09075e9485ff369082a2ff38d65f26cdb14b5aec7b2789fd5ca80f979cef3761897ae1f37ffb3e154cbcc1c2663", + "0x92f53c21a80e624b3c606bc8ec0ce2a3003c4fe385bed33998bf4dc79b8970f2": "0x547ff0ab649283a7ae01dbc2eb73932eba2fb09075e9485ff369082a2ff38d650f0000c16ff286230f0000c16ff2862300", + "0x7eb7a404bf7e3466c3f6c5914e25edfaab48b1e24fd29ea5a94deaaa1aba80e6": "0x0c0001547ff0ab649283a7ae01dbc2eb73932eba2fb09075e9485ff369082a2ff38d65019c7a2ee14e565db0c69f78c7b4cd839fbf52b607d867e9e9c5a79042898a0d12", + "0x6c7945a333fd28e51af43324746da2a45fd6a74613dcd61c6430fee856b550f8": "0x10809becad03e6dcac03cee07edebca5475314861492cdfc96a2144a67bbe9699332807932cff431e748892fa48e10c63c17d30f80ca42e4de3921e641249cd7fa3c2f805633b70b80a6c8bb16270f82cca6d56b27ed7b76c8fd5af2986a25a4788ce440803919132b851ef0fd2dae42a7e734fe547af5a6b809006100f48944d7fae8e8ef", + "0x934302c5ec4cb4f73a395e2184ab0aa6": "0x00e40b54020000000000000000000000", + "0xfd0cbba69a04d769ddcdbb15f5123c98041978f5241f33f78f62b48e3a02b740": "0x047374616b696e67200000c16ff28623000000000000000000ffffffffffffffff0f", + "0x8b4621d5f16433d6024b5a31547c59ee24e749e051dbb4bc7e64502f2a4f62fb": "0x66bc1e5d275da50b72b15de072a2468a5ad414919ca9054d2695767cf650012f", + "0x799192c17c5cc562d709af11ace92e6a": "0x00040000", + "0x2d5205eddfc20f1a616c0391abb78a3920e823abe7ed33cfd7945dd1a1bf8651": "0x047374616b696e67200000c16ff28623000000000000000000ffffffffffffffff0f", + "0xbf18c0c65fb39f32ee7c8016685c0a6056f8f924192efb2655be9a692d0b03b6": "0x00", + "0x637414312dac3b280120bf15b4f66cee": "0x00000000", + "0x2dce29f1a768624dc5343063cb77f77d": "0x07000000", + "0xa36baa0f89eff09b2facf282f27a11ba": "0x50c30000", + "0x51322b89410377cf0f1bdeeafd212f07": "0xe8030000000000000000000000000000", + "0x4517a8f9aafb0668d19c3cef51a8367afeda7eb83c7edcc4752585e5a496935e": "0x10809becad03e6dcac03cee07edebca5475314861492cdfc96a2144a67bbe9699332807932cff431e748892fa48e10c63c17d30f80ca42e4de3921e641249cd7fa3c2f805633b70b80a6c8bb16270f82cca6d56b27ed7b76c8fd5af2986a25a4788ce440803919132b851ef0fd2dae42a7e734fe547af5a6b809006100f48944d7fae8e8ef", + "0x50a63a871aced22e88ee6466fe5aa5d9": "0x9ee5e5bdc0ec239eb164f865ecc345ce4c88e76ee002e0f7e318097347471809", + "0x0c5cbeca89340ea96c6f8fe1442df463": "0x0010a5d4e80000000000000000000000", + "0x0e4944cfd98d6f4cc374d16f5a4e3f9c": "0x0000000000000000", + "0xc1fdc3d212357bc2fa98f2a77b941f0c": "0x10f26cdb14b5aec7b2789fd5ca80f979cef3761897ae1f37ffb3e154cbcc1c2663547ff0ab649283a7ae01dbc2eb73932eba2fb09075e9485ff369082a2ff38d6568655684472b743e456907b398d3a44c113f189e56d1bbfd55e889e295dfde789c7a2ee14e565db0c69f78c7b4cd839fbf52b607d867e9e9c5a79042898a0d12", + "0xe18ad90fcd74459141a97efeed86f463": "0x08000000", + "0xfff675c76ad8a5dfbd7db9a4e80f7c0ece595ad1878d2b6fca6086b2483a055b": "0x0000c16ff28623000000000000000000", + "0xa8e78ad25e03ac0281ec709fd3f128efb7e112239d0a7c3e1c86375109bff334": "0x4545454545454545454545454545454545454545454545454545454545454545", + "0x7935e46f94f24b82716c0142e2271de9": "0x8070000000000000", + "0x7e6064dc0e78ffebb59b3053826a9467": "0x10781ead1e2fa9ccb74b44c19d29cb2a7a4b5be3972927ae98cd3877523976a276c8dc79e36b29395413399edaec3e20fcca7205fb19776ed8ddb25d6f427ec40e9e42241d7cd91d001773b0b616d523dd80e13c6c2cab860b1234ef1b9ffc152666bc1e5d275da50b72b15de072a2468a5ad414919ca9054d2695767cf650012f", + "0x8cb577756012d928f17362e0741f9f2c": "0x0100000000000000", + "0x154ebcb2c318b2e1c23e43e65aea27cd1348c4c5157502d7669a31c7635019cc": "0x9e42241d7cd91d001773b0b616d523dd80e13c6c2cab860b1234ef1b9ffc1526", + "0x96f2cbaf8156f12db4af0b59d3e56f8f": "0x0010a5d4e80000000000000000000000", + "0x24b2518f9a9ee24ab0b62346d83d90b0": "0x11080000", + "0xbd393c7a86c2574659297d84a8c369613134cd3b80b8b92f816e3ff845991bf4": "0x9becad03e6dcac03cee07edebca5475314861492cdfc96a2144a67bbe96993329becad03e6dcac03cee07edebca5475314861492cdfc96a2144a67bbe9699332", + "0x8366297e853b97a38cca0f62019a717b": "0x00000000000000000000000000000000", + "0x90e2849b965314409e8bc00011f3004f": "0x04000000", + "0x46cef122497fefa60faf6c66d3ef05caf9870446796ae11f0a4f734fee993d8b": "0x00", + "0x3a65787472696e7369635f696e646578": "0x00000000", + "0xccea67b51b4fa33ecbff70a8977ad91d9c60d620f3ab5ac9626dea15cde023b7": "0x0f0000c16ff286230f0000c16ff2862300" + } + } +} diff --git a/node/cli/src/chain_spec.rs b/node/cli/src/chain_spec.rs index f376db13c467bce8334cb1504847996f959be96f..672c75b1a94c6b0438784a06be83fdb6b7c59a72 100644 --- a/node/cli/src/chain_spec.rs +++ b/node/cli/src/chain_spec.rs @@ -16,55 +16,78 @@ //! Substrate chain configurations. -use primitives::{ed25519::Public as AuthorityId, ed25519, sr25519, Pair, crypto::UncheckedInto}; -use node_primitives::AccountId; -use node_runtime::{ConsensusConfig, CouncilSeatsConfig, CouncilVotingConfig, DemocracyConfig, +use primitives::{ed25519, sr25519, Pair, crypto::UncheckedInto}; +use node_primitives::{AccountId, AuraId}; +use node_runtime::{CouncilSeatsConfig, AuraConfig, DemocracyConfig, SystemConfig, SessionConfig, StakingConfig, StakerStatus, TimestampConfig, BalancesConfig, TreasuryConfig, - SudoConfig, ContractConfig, GrandpaConfig, IndicesConfig, Permill, Perbill}; + SudoConfig, ContractsConfig, GrandpaConfig, IndicesConfig, Permill, Perbill, SessionKeys}; pub use node_runtime::GenesisConfig; use substrate_service; use hex_literal::hex; use substrate_telemetry::TelemetryEndpoints; +use grandpa::AuthorityId as GrandpaId; const STAGING_TELEMETRY_URL: &str = "wss://telemetry.polkadot.io/submit/"; /// Specialized `ChainSpec`. pub type ChainSpec = substrate_service::ChainSpec; -/// Emberic Elm testnet generator -pub fn emberic_elm_config() -> Result { - ChainSpec::from_embedded(include_bytes!("../res/emberic-elm.json")) +/// Flaming Fir testnet generator +pub fn flaming_fir_config() -> Result { + ChainSpec::from_embedded(include_bytes!("../res/flaming-fir.json")) } fn staging_testnet_config_genesis() -> GenesisConfig { // stash, controller, session-key // generated with secret: - // for i in 1 2 3 4 ; do for j in stash controller; do subkey inspect "$secret"/elm/$j/$i; done; done + // for i in 1 2 3 4 ; do for j in stash controller; do subkey inspect "$secret"/fir/$j/$i; done; done // and - // for i in 1 2 3 4 ; do for j in session; do subkey --ed25519 inspect "$secret"//elm//$j//$i; done; done + // for i in 1 2 3 4 ; do for j in session; do subkey --ed25519 inspect "$secret"//fir//$j//$i; done; done - - let initial_authorities: Vec<(AccountId, AccountId, AuthorityId)> = vec![( - hex!["72b52eb36f57b4bae756e4f064cf2e97df80d5f9c2f06ff31206a9be8c7b371c"].unchecked_into(), // 5Ef78yxqfaxVzrFCemYcSgwVtMV85ywykhLNm5WKTsZV22HZ - hex!["f0fae46aeb1a7ce8ca65f2bf885d09cd7f525bc00e9f6e73b5ea74402a2c4c19"].unchecked_into(), // 5HWfszmRMbzcjGmumYkkHtNJbi9y428JHgPeftVenvDgVUjh - hex!["e29624233b2cba342750217aa1883f6ec624134dd306efd230a988e5cb37d9ed"].unchecked_into(), // 5HBoHDLMR4jPwB6BCLyd2qfYBHytFhGs8fsa1h5PzhYd3WBq + let initial_authorities: Vec<(AccountId, AccountId, AuraId, GrandpaId)> = vec![( + // 5Fbsd6WXDGiLTxunqeK5BATNiocfCqu9bS1yArVjCgeBLkVy + hex!["9c7a2ee14e565db0c69f78c7b4cd839fbf52b607d867e9e9c5a79042898a0d12"].unchecked_into(), + // 5EnCiV7wSHeNhjW3FSUwiJNkcc2SBkPLn5Nj93FmbLtBjQUq + hex!["781ead1e2fa9ccb74b44c19d29cb2a7a4b5be3972927ae98cd3877523976a276"].unchecked_into(), + // 5Fb9ayurnxnaXj56CjmyQLBiadfRCqUbL2VWNbbe1nZU6wiC + hex!["9becad03e6dcac03cee07edebca5475314861492cdfc96a2144a67bbe9699332"].unchecked_into(), + // 5Fb9ayurnxnaXj56CjmyQLBiadfRCqUbL2VWNbbe1nZU6wiC + hex!["9becad03e6dcac03cee07edebca5475314861492cdfc96a2144a67bbe9699332"].unchecked_into(), ),( - hex!["2254035a15597c1c19968be71593d2d0131e18ae90049e49178970f583ac3e17"].unchecked_into(), // 5CqiScHtxUatcQpck1tUks51o3pSjKsdCi2CLEHvMM7tc4Qi - hex!["eacb8edf6b05cb909a3d2bd8c6bffb13be3069ec6a69f1fa25e46103c5190267"].unchecked_into(), // 5HNZXnSgw21idbuegTC1J8Txkja97RPnnWkX68ewnrJDec2Z - hex!["e19b6b89729a41638e57dead9c993425287d386fa4963306b63f018732843495"].unchecked_into(), // 5HAWoPYfyYFHjacy8H2MDmHra7jVrPtBfFMPgd8CadpSqotL + // 5ERawXCzCWkjVq3xz1W5KGNtVx2VdefvZ62Bw1FEuZW4Vny2 + hex!["68655684472b743e456907b398d3a44c113f189e56d1bbfd55e889e295dfde78"].unchecked_into(), + // 5Gc4vr42hH1uDZc93Nayk5G7i687bAQdHHc9unLuyeawHipF + hex!["c8dc79e36b29395413399edaec3e20fcca7205fb19776ed8ddb25d6f427ec40e"].unchecked_into(), + // 5EockCXN6YkiNCDjpqqnbcqd4ad35nU4RmA1ikM4YeRN4WcE + hex!["7932cff431e748892fa48e10c63c17d30f80ca42e4de3921e641249cd7fa3c2f"].unchecked_into(), + // 5EockCXN6YkiNCDjpqqnbcqd4ad35nU4RmA1ikM4YeRN4WcE + hex!["7932cff431e748892fa48e10c63c17d30f80ca42e4de3921e641249cd7fa3c2f"].unchecked_into(), ),( - hex!["fe6211db8bd436e0d1cf37398eac655833fb47497e0f72ec00ab160c88966b7e"].unchecked_into(), // 5HpF9orzkmJ9ga3yrzNS9ckifxF3tbQjadEmCEiZJQ2fPgun - hex!["f06dd616c75cc4b2b01f325accf79b4f66a525ede0a59f48dcce2322b8798f5c"].unchecked_into(), // 5HVwyfB3LRsFXm7frEHDYyhwdpTYDRWxEqDKBYVyLi6DsPXq - hex!["1be80f2d4513a1fbe0e5163874f729baa5498486ac3914ac3fe2e1817d7b3f44"].unchecked_into(), // 5ChJ5wjqy2HY1LZw1EuQPGQEHgaS9sFu9yDD6KRX7CzwidTN + // 5DyVtKWPidondEu8iHZgi6Ffv9yrJJ1NDNLom3X9cTDi98qp + hex!["547ff0ab649283a7ae01dbc2eb73932eba2fb09075e9485ff369082a2ff38d65"].unchecked_into(), + // 5FeD54vGVNpFX3PndHPXJ2MDakc462vBCD5mgtWRnWYCpZU9 + hex!["9e42241d7cd91d001773b0b616d523dd80e13c6c2cab860b1234ef1b9ffc1526"].unchecked_into(), + // 5E1jLYfLdUQKrFrtqoKgFrRvxM3oQPMbf6DfcsrugZZ5Bn8d + hex!["5633b70b80a6c8bb16270f82cca6d56b27ed7b76c8fd5af2986a25a4788ce440"].unchecked_into(), + // 5E1jLYfLdUQKrFrtqoKgFrRvxM3oQPMbf6DfcsrugZZ5Bn8d + hex!["5633b70b80a6c8bb16270f82cca6d56b27ed7b76c8fd5af2986a25a4788ce440"].unchecked_into(), ),( - hex!["60779817899466dbd476a0bc3a38cc64b7774d5fb646c3d291684171e67a0743"].unchecked_into(), // 5EFByrDMMa2m9hv4jrpykXaUyqjJ9XZH81kJE4JBa1Sz2psT - hex!["2a32622a5da54a80dc704a05f2d761c96d4748beedd83f61ca20a90f4a257678"].unchecked_into(), // 5D22qQJsLm2JUh8pEfrKahbkW21QQrHTkm4vUteei67fadLd - hex!["f54d9f5ed217ce07c0c5faa5277a0356f8bfd884d201f9d2c9e171568e1bf077"].unchecked_into(), // 5HcLeWrsfL9RuGp94pn1PeFxP7D1587TTEZzFYgFhKCPZLYh + // 5HYZnKWe5FVZQ33ZRJK1rG3WaLMztxWrrNDb1JRwaHHVWyP9 + hex!["f26cdb14b5aec7b2789fd5ca80f979cef3761897ae1f37ffb3e154cbcc1c2663"].unchecked_into(), + // 5EPQdAQ39WQNLCRjWsCk5jErsCitHiY5ZmjfWzzbXDoAoYbn + hex!["66bc1e5d275da50b72b15de072a2468a5ad414919ca9054d2695767cf650012f"].unchecked_into(), + // 5DMa31Hd5u1dwoRKgC4uvqyrdK45RHv3CpwvpUC1EzuwDit4 + hex!["3919132b851ef0fd2dae42a7e734fe547af5a6b809006100f48944d7fae8e8ef"].unchecked_into(), + // 5DMa31Hd5u1dwoRKgC4uvqyrdK45RHv3CpwvpUC1EzuwDit4 + hex!["3919132b851ef0fd2dae42a7e734fe547af5a6b809006100f48944d7fae8e8ef"].unchecked_into(), )]; - // generated with secret: subkey inspect "$secret"/elm + + // generated with secret: subkey inspect "$secret"/fir let endowed_accounts: Vec = vec![ - hex!["c224ccba63292331623bbf06a55f46607824c2580071a80a17c53cab2f999e2f"].unchecked_into(), //5GTG5We6twtoF6S4kUXJ77rWBsHBoHLS3JVf5KvvnxKdGQZr + // 5Ff3iXP75ruzroPWRP2FYBHWnmGGBSb63857BgnzCoXNxfPo + hex!["9ee5e5bdc0ec239eb164f865ecc345ce4c88e76ee002e0f7e318097347471809"].unchecked_into(), ]; + const MILLICENTS: u128 = 1_000_000_000; const CENTS: u128 = 1_000 * MILLICENTS; // assume this is worth about a cent. const DOLLARS: u128 = 100 * CENTS; @@ -78,11 +101,11 @@ fn staging_testnet_config_genesis() -> GenesisConfig { const STASH: u128 = 100 * DOLLARS; GenesisConfig { - consensus: Some(ConsensusConfig { + system: Some(SystemConfig { code: include_bytes!("../../runtime/wasm/target/wasm32-unknown-unknown/release/node_runtime.compact.wasm").to_vec(), // FIXME change once we have #1252 - authorities: initial_authorities.iter().map(|x| x.2.clone()).collect(), + _genesis_phantom_data: Default::default(), + changes_trie_config: Default::default(), }), - system: None, balances: Some(BalancesConfig { transaction_base_fee: 1 * CENTS, transaction_byte_fee: 10 * MILLICENTS, @@ -102,46 +125,34 @@ fn staging_testnet_config_genesis() -> GenesisConfig { }), session: Some(SessionConfig { validators: initial_authorities.iter().map(|x| x.1.clone()).collect(), - session_length: 5 * MINUTES, - keys: initial_authorities.iter().map(|x| (x.1.clone(), x.2.clone())).collect::>(), + keys: initial_authorities.iter().map(|x| (x.1.clone(), SessionKeys(x.2.clone(),x.2.clone()))).collect::>(), }), staking: Some(StakingConfig { current_era: 0, - offline_slash: Perbill::from_billionths(1_000_000), - session_reward: Perbill::from_billionths(2_065), + offline_slash: Perbill::from_parts(1_000_000), + session_reward: Perbill::from_parts(2_065), current_session_reward: 0, validator_count: 7, - sessions_per_era: 12, - bonding_duration: 12, offline_slash_grace: 4, minimum_validator_count: 4, stakers: initial_authorities.iter().map(|x| (x.0.clone(), x.1.clone(), STASH, StakerStatus::Validator)).collect(), invulnerables: initial_authorities.iter().map(|x| x.1.clone()).collect(), }), - democracy: Some(DemocracyConfig { - launch_period: 10 * MINUTES, // 1 day per public referendum - voting_period: 10 * MINUTES, // 3 days to discuss & vote on an active referendum - minimum_deposit: 50 * DOLLARS, // 12000 as the minimum deposit for a referendum - public_delay: 10 * MINUTES, - max_lock_periods: 6, - }), + democracy: Some(DemocracyConfig::default()), council_seats: Some(CouncilSeatsConfig { active_council: vec![], candidacy_bond: 10 * DOLLARS, voter_bond: 1 * DOLLARS, + voting_fee: 2 * DOLLARS, present_slash_per_voter: 1 * CENTS, carry_count: 6, presentation_duration: 1 * DAYS, approval_voting_period: 2 * DAYS, term_duration: 28 * DAYS, desired_seats: 0, + decay_ratio: 0, inactive_grace_period: 1, // one additional vote should go by before an inactive voter can be reaped. }), - council_voting: Some(CouncilVotingConfig { - cooloff_period: 4 * DAYS, - voting_period: 1 * DAYS, - enact_delay_period: 0, - }), timestamp: Some(TimestampConfig { minimum_period: SECS_PER_BLOCK / 2, // due to the nature of aura the slots are 2*period }), @@ -151,7 +162,7 @@ fn staging_testnet_config_genesis() -> GenesisConfig { spend_period: 1 * DAYS, burn: Permill::from_percent(50), }), - contract: Some(ContractConfig { + contracts: Some(ContractsConfig { signed_claim_handicap: 2, rent_byte_price: 4, rent_deposit_offset: 1000, @@ -173,8 +184,12 @@ fn staging_testnet_config_genesis() -> GenesisConfig { sudo: Some(SudoConfig { key: endowed_accounts[0].clone(), }), + aura: Some(AuraConfig { + authorities: initial_authorities.iter().map(|x| x.2.clone()).collect(), + }), grandpa: Some(GrandpaConfig { - authorities: initial_authorities.iter().map(|x| (x.2.clone(), 1)).collect(), + authorities: initial_authorities.iter().map(|x| (x.3.clone(), 1)).collect(), + _genesis_phantom_data: Default::default(), }), } } @@ -201,25 +216,33 @@ pub fn get_account_id_from_seed(seed: &str) -> AccountId { .public() } -/// Helper function to generate AuthorityId from seed -pub fn get_session_key_from_seed(seed: &str) -> AuthorityId { +/// Helper function to generate AuraId from seed +pub fn get_aura_id_from_seed(seed: &str) -> AuraId { + ed25519::Pair::from_string(&format!("//{}", seed), None) + .expect("static values are valid; qed") + .public() +} + +/// Helper function to generate GrandpaId from seed +pub fn get_grandpa_id_from_seed(seed: &str) -> GrandpaId { ed25519::Pair::from_string(&format!("//{}", seed), None) .expect("static values are valid; qed") .public() } /// Helper function to generate stash, controller and session key from seed -pub fn get_authority_keys_from_seed(seed: &str) -> (AccountId, AccountId, AuthorityId) { +pub fn get_authority_keys_from_seed(seed: &str) -> (AccountId, AccountId, AuraId, GrandpaId) { ( get_account_id_from_seed(&format!("{}//stash", seed)), get_account_id_from_seed(seed), - get_session_key_from_seed(seed) + get_aura_id_from_seed(seed), + get_grandpa_id_from_seed(seed) ) } /// Helper function to create GenesisConfig for testing pub fn testnet_genesis( - initial_authorities: Vec<(AccountId, AccountId, AuthorityId)>, + initial_authorities: Vec<(AccountId, AccountId, AuraId, GrandpaId)>, root_key: AccountId, endowed_accounts: Option>, enable_println: bool, @@ -244,7 +267,8 @@ pub fn testnet_genesis( const STASH: u128 = 1 << 20; const ENDOWMENT: u128 = 1 << 20; - let mut contract_config = ContractConfig { + let council_desired_seats = (endowed_accounts.len() / 2 - initial_authorities.len()) as u32; + let mut contracts_config = ContractsConfig { signed_claim_handicap: 2, rent_byte_price: 4, rent_deposit_offset: 1000, @@ -264,14 +288,14 @@ pub fn testnet_genesis( current_schedule: Default::default(), }; // this should only be enabled on development chains - contract_config.current_schedule.enable_println = enable_println; + contracts_config.current_schedule.enable_println = enable_println; GenesisConfig { - consensus: Some(ConsensusConfig { + system: Some(SystemConfig { code: include_bytes!("../../runtime/wasm/target/wasm32-unknown-unknown/release/node_runtime.compact.wasm").to_vec(), - authorities: initial_authorities.iter().map(|x| x.2.clone()).collect(), + _genesis_phantom_data: Default::default(), + changes_trie_config: Default::default(), }), - system: None, indices: Some(IndicesConfig { ids: endowed_accounts.clone(), }), @@ -286,15 +310,12 @@ pub fn testnet_genesis( }), session: Some(SessionConfig { validators: initial_authorities.iter().map(|x| x.1.clone()).collect(), - session_length: 10, - keys: initial_authorities.iter().map(|x| (x.1.clone(), x.2.clone())).collect::>(), + keys: initial_authorities.iter().map(|x| (x.1.clone(), SessionKeys(x.2.clone(), x.2.clone()))).collect::>(), }), staking: Some(StakingConfig { current_era: 0, minimum_validator_count: 1, validator_count: 2, - sessions_per_era: 5, - bonding_duration: 12, offline_slash: Perbill::zero(), session_reward: Perbill::zero(), current_session_reward: 0, @@ -302,32 +323,23 @@ pub fn testnet_genesis( stakers: initial_authorities.iter().map(|x| (x.0.clone(), x.1.clone(), STASH, StakerStatus::Validator)).collect(), invulnerables: initial_authorities.iter().map(|x| x.1.clone()).collect(), }), - democracy: Some(DemocracyConfig { - launch_period: 9, - voting_period: 18, - minimum_deposit: 10, - public_delay: 0, - max_lock_periods: 6, - }), + democracy: Some(DemocracyConfig::default()), council_seats: Some(CouncilSeatsConfig { active_council: endowed_accounts.iter() - .filter(|&endowed| initial_authorities.iter().find(|&(_, controller, _)| controller == endowed).is_none()) + .filter(|&endowed| initial_authorities.iter().find(|&(_, controller, ..)| controller == endowed).is_none()) .map(|a| (a.clone(), 1000000)).collect(), candidacy_bond: 10, voter_bond: 2, + voting_fee: 5, present_slash_per_voter: 1, carry_count: 4, presentation_duration: 10, approval_voting_period: 20, term_duration: 1000000, - desired_seats: (endowed_accounts.len() / 2 - initial_authorities.len()) as u32, + desired_seats: council_desired_seats, + decay_ratio: council_desired_seats / 3, inactive_grace_period: 1, }), - council_voting: Some(CouncilVotingConfig { - cooloff_period: 75, - voting_period: 20, - enact_delay_period: 0, - }), timestamp: Some(TimestampConfig { minimum_period: 2, // 2*2=4 second block time. }), @@ -337,12 +349,16 @@ pub fn testnet_genesis( spend_period: 12 * 60 * 24, burn: Permill::from_percent(50), }), - contract: Some(contract_config), + contracts: Some(contracts_config), sudo: Some(SudoConfig { key: root_key, }), + aura: Some(AuraConfig { + authorities: initial_authorities.iter().map(|x| x.2.clone()).collect(), + }), grandpa: Some(GrandpaConfig { - authorities: initial_authorities.iter().map(|x| (x.2.clone(), 1)).collect(), + authorities: initial_authorities.iter().map(|x| (x.3.clone(), 1)).collect(), + _genesis_phantom_data: Default::default(), }), } } @@ -381,7 +397,7 @@ pub fn local_testnet_config() -> ChainSpec { } #[cfg(test)] -mod tests { +pub(crate) mod tests { use super::*; use service_test; use crate::service::Factory; @@ -392,13 +408,41 @@ mod tests { genesis } + fn local_testnet_genesis_instant_single() -> GenesisConfig { + let mut genesis = testnet_genesis( + vec![ + get_authority_keys_from_seed("Alice"), + ], + get_account_id_from_seed("Alice"), + None, + false, + ); + genesis.timestamp = Some(TimestampConfig { minimum_period: 1 }); + genesis + } + + /// Local testnet config (single validator - Alice) + pub fn integration_test_config_with_single_authority() -> ChainSpec { + ChainSpec::from_genesis( + "Integration Test", + "test", + local_testnet_genesis_instant_single, + vec![], + None, + None, + None, + None, + ) + } + /// Local testnet config (multivalidator Alice + Bob) - pub fn integration_test_config() -> ChainSpec { + pub fn integration_test_config_with_two_authorities() -> ChainSpec { ChainSpec::from_genesis("Integration Test", "test", local_testnet_genesis_instant, vec![], None, None, None, None) } #[test] + #[ignore] fn test_connectivity() { - service_test::connectivity::(integration_test_config()); + service_test::connectivity::(integration_test_config_with_two_authorities()); } } diff --git a/node/cli/src/factory_impl.rs b/node/cli/src/factory_impl.rs new file mode 100644 index 0000000000000000000000000000000000000000..0d94610362fdc84b3d9f1e2aa81ba477bc312f25 --- /dev/null +++ b/node/cli/src/factory_impl.rs @@ -0,0 +1,259 @@ +// Copyright 2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +//! Implementation of the transaction factory trait, which enables +//! using the cli to manufacture transactions and distribute them +//! to accounts. + +use rand::{Rng, SeedableRng}; +use rand::rngs::StdRng; + +use parity_codec::Decode; +use keyring::sr25519::Keyring; +use node_primitives::Hash; +use node_runtime::{Call, CheckedExtrinsic, UncheckedExtrinsic, BalancesCall}; +use primitives::sr25519; +use primitives::crypto::Pair; +use parity_codec::Encode; +use sr_primitives::generic::Era; +use sr_primitives::traits::{Block as BlockT, Header as HeaderT}; +use substrate_service::ServiceFactory; +use transaction_factory::RuntimeAdapter; +use transaction_factory::modes::Mode; +use crate::service; +use inherents::InherentData; +use timestamp; +use finality_tracker; + +// TODO get via api: >::minimum_period(). See #2587. +const MINIMUM_PERIOD: u64 = 99; + +pub struct FactoryState { + block_no: N, + + mode: Mode, + start_number: u64, + rounds: u64, + round: u64, + block_in_round: u64, + num: u64, +} + +type Number = <::Header as HeaderT>::Number; + +impl RuntimeAdapter for FactoryState { + type AccountId = node_primitives::AccountId; + type Balance = node_primitives::Balance; + type Block = node_primitives::Block; + type Phase = sr_primitives::generic::Phase; + type Secret = sr25519::Pair; + type Index = node_primitives::Index; + + type Number = Number; + + fn new( + mode: Mode, + num: u64, + rounds: u64, + ) -> FactoryState { + FactoryState { + mode, + num: num, + round: 0, + rounds, + block_in_round: 0, + block_no: 0, + start_number: 0, + } + } + + fn block_no(&self) -> Self::Number { + self.block_no + } + + fn block_in_round(&self) -> Self::Number { + self.block_in_round + } + + fn rounds(&self) -> Self::Number { + self.rounds + } + + fn num(&self) -> Self::Number { + self.num + } + + fn round(&self) -> Self::Number { + self.round + } + + fn start_number(&self) -> Self::Number { + self.start_number + } + + fn mode(&self) -> &Mode { + &self.mode + } + + fn set_block_no(&mut self, val: Self::Number) { + self.block_no = val; + } + + fn set_block_in_round(&mut self, val: Self::Number) { + self.block_in_round = val; + } + + fn set_round(&mut self, val: Self::Number) { + self.round = val; + } + + fn transfer_extrinsic( + &self, + sender: &Self::AccountId, + key: &Self::Secret, + destination: &Self::AccountId, + amount: &Self::Number, + prior_block_hash: &::Hash, + ) -> ::Extrinsic { + let index = self.extract_index(&sender, prior_block_hash); + let phase = self.extract_phase(*prior_block_hash); + + sign::(CheckedExtrinsic { + signed: Some((sender.clone(), index)), + function: Call::Balances( + BalancesCall::transfer( + indices::address::Address::Id( + destination.clone().into() + ), + (*amount).into() + ) + ) + }, key, &prior_block_hash, phase) + } + + fn inherent_extrinsics(&self) -> InherentData { + let timestamp = self.block_no * MINIMUM_PERIOD; + + let mut inherent = InherentData::new(); + inherent.put_data(timestamp::INHERENT_IDENTIFIER, ×tamp) + .expect("Failed putting timestamp inherent"); + inherent.put_data(finality_tracker::INHERENT_IDENTIFIER, &self.block_no) + .expect("Failed putting finalized number inherent"); + inherent + } + + fn minimum_balance() -> Self::Number { + // TODO get correct amount via api. See #2587. + 1337 + } + + fn master_account_id() -> Self::AccountId { + Keyring::Alice.pair().public() + } + + fn master_account_secret() -> Self::Secret { + Keyring::Alice.pair() + } + + /// Generates a random `AccountId` from `seed`. + fn gen_random_account_id(seed: &Self::Number) -> Self::AccountId { + let pair: sr25519::Pair = sr25519::Pair::from_seed(&gen_seed_bytes(*seed)); + pair.public().into() + } + + /// Generates a random `Secret` from `seed`. + fn gen_random_account_secret(seed: &Self::Number) -> Self::Secret { + let pair: sr25519::Pair = sr25519::Pair::from_seed(&gen_seed_bytes(*seed)); + pair + } + + fn extract_index( + &self, + _account_id: &Self::AccountId, + _block_hash: &::Hash, + ) -> Self::Index { + // TODO get correct index for account via api. See #2587. + // This currently prevents the factory from being used + // without a preceding purge of the database. + if self.mode == Mode::MasterToN || self.mode == Mode::MasterTo1 { + self.block_no() + } else { + match self.round() { + 0 => + // if round is 0 all transactions will be done with master as a sender + self.block_no(), + _ => + // if round is e.g. 1 every sender account will be new and not yet have + // any transactions done + 0 + } + } + } + + fn extract_phase( + &self, + _block_hash: ::Hash + ) -> Self::Phase { + // TODO get correct phase via api. See #2587. + // This currently prevents the factory from being used + // without a preceding purge of the database. + self.block_no + } +} + +fn gen_seed_bytes(seed: u64) -> [u8; 32] { + let mut rng: StdRng = SeedableRng::seed_from_u64(seed); + + let mut seed_bytes = [0u8; 32]; + for i in 0..32 { + seed_bytes[i] = rng.gen::(); + } + seed_bytes +} + +/// Creates an `UncheckedExtrinsic` containing the appropriate signature for +/// a `CheckedExtrinsics`. +fn sign( + xt: CheckedExtrinsic, + key: &sr25519::Pair, + prior_block_hash: &Hash, + phase: u64, +) -> ::Extrinsic { + let s = match xt.signed { + Some((signed, index)) => { + let era = Era::mortal(256, phase); + let payload = (index.into(), xt.function, era, prior_block_hash); + let signature = payload.using_encoded(|b| { + if b.len() > 256 { + key.sign(&sr_io::blake2_256(b)) + } else { + key.sign(b) + } + }).into(); + UncheckedExtrinsic { + signature: Some((indices::address::Address::Id(signed), signature, payload.0, era)), + function: payload.1, + } + } + None => UncheckedExtrinsic { + signature: None, + function: xt.function, + }, + }; + + let e = Encode::encode(&s); + Decode::decode(&mut &e[..]).expect("Failed to decode signed unchecked extrinsic") +} diff --git a/node/cli/src/lib.rs b/node/cli/src/lib.rs index f9adeba9b7ba15355f65f9bed33540484462d2c8..ab1fd03ae7b24eb7afc4a4ba44a710f143bc09c9 100644 --- a/node/cli/src/lib.rs +++ b/node/cli/src/lib.rs @@ -22,32 +22,99 @@ pub use cli::error; pub mod chain_spec; mod service; +mod factory_impl; use tokio::prelude::Future; use tokio::runtime::{Builder as RuntimeBuilder, Runtime}; -pub use cli::{VersionInfo, IntoExit, NoCustom}; +pub use cli::{VersionInfo, IntoExit, NoCustom, SharedParams}; use substrate_service::{ServiceFactory, Roles as ServiceRoles}; use std::ops::Deref; use log::info; +use structopt::{StructOpt, clap::App}; +use cli::{AugmentClap, GetLogFilter}; +use crate::factory_impl::FactoryState; +use transaction_factory::RuntimeAdapter; /// The chain specification option. -#[derive(Clone, Debug)] +#[derive(Clone, Debug, PartialEq)] pub enum ChainSpec { /// Whatever the current runtime is, with just Alice as an auth. Development, /// Whatever the current runtime is, with simple Alice/Bob auths. LocalTestnet, - /// The Emberic Elm testnet. - EmbericElm, + /// The Flaming Fir testnet. + FlamingFir, /// Whatever the current runtime is with the "global testnet" defaults. StagingTestnet, } +/// Custom subcommands. +#[derive(Clone, Debug, StructOpt)] +pub enum CustomSubcommands { + /// The custom factory subcommmand for manufacturing transactions. + #[structopt( + name = "factory", + about = "Manufactures num transactions from Alice to random accounts. \ + Only supported for development or local testnet." + )] + Factory(FactoryCmd), +} + +impl GetLogFilter for CustomSubcommands { + fn get_log_filter(&self) -> Option { + None + } +} + +/// The `factory` command used to generate transactions. +/// Please note: this command currently only works on an empty database! +#[derive(Debug, StructOpt, Clone)] +pub struct FactoryCmd { + /// How often to repeat. This option only has an effect in mode `MasterToNToM`. + #[structopt(long="rounds", default_value = "1")] + pub rounds: u64, + + /// MasterToN: Manufacture `num` transactions from the master account + /// to `num` randomly created accounts, one each. + /// + /// MasterTo1: Manufacture `num` transactions from the master account + /// to exactly one other randomly created account. + /// + /// MasterToNToM: Manufacture `num` transactions from the master account + /// to `num` randomly created accounts. + /// From each of these randomly created accounts manufacture + /// a transaction to another randomly created account. + /// Repeat this `rounds` times. If `rounds` = 1 the behavior + /// is the same as `MasterToN`.{n} + /// A -> B, A -> C, A -> D, ... x `num`{n} + /// B -> E, C -> F, D -> G, ...{n} + /// ... x `rounds` + /// + /// These three modes control manufacturing. + #[structopt(long="mode", default_value = "MasterToN")] + pub mode: transaction_factory::Mode, + + /// Number of transactions to generate. In mode `MasterNToNToM` this is + /// the number of transactions per round. + #[structopt(long="num", default_value = "8")] + pub num: u64, + + #[allow(missing_docs)] + #[structopt(flatten)] + pub shared_params: SharedParams, +} + +impl AugmentClap for FactoryCmd { + fn augment_clap<'a, 'b>(app: App<'a, 'b>) -> App<'a, 'b> { + FactoryCmd::augment_clap(app) + } +} + /// Get a chain config from a spec setting. impl ChainSpec { pub(crate) fn load(self) -> Result { Ok(match self { - ChainSpec::EmbericElm => chain_spec::emberic_elm_config()?, + ChainSpec::FlamingFir => chain_spec::flaming_fir_config()?, ChainSpec::Development => chain_spec::development_config(), ChainSpec::LocalTestnet => chain_spec::local_testnet_config(), ChainSpec::StagingTestnet => chain_spec::staging_testnet_config(), @@ -58,7 +125,7 @@ impl ChainSpec { match s { "dev" => Some(ChainSpec::Development), "local" => Some(ChainSpec::LocalTestnet), - "" | "elm" | "emberic-elm" => Some(ChainSpec::EmbericElm), + "" | "fir" | "flaming-fir" => Some(ChainSpec::FlamingFir), "staging" => Some(ChainSpec::StagingTestnet), _ => None, } @@ -78,7 +145,7 @@ pub fn run(args: I, exit: E, version: cli::VersionInfo) -> error::Resul T: Into + Clone, E: IntoExit, { - cli::parse_and_execute::( + let ret = cli::parse_and_execute::( load_spec, &version, "substrate-node", args, exit, |exit, _cli_args, _custom_args, config| { info!("{}", version.name); @@ -103,7 +170,35 @@ pub fn run(args: I, exit: E, version: cli::VersionInfo) -> error::Resul ), }.map_err(|e| format!("{:?}", e)) } - ).map_err(Into::into).map(|_| ()) + ); + + match &ret { + Ok(Some(CustomSubcommands::Factory(cli_args))) => { + let config = cli::create_config_with_db_path::( + load_spec, + &cli_args.shared_params, + &version, + )?; + + match ChainSpec::from(config.chain_spec.id()) { + Some(ref c) if c == &ChainSpec::Development || c == &ChainSpec::LocalTestnet => {}, + _ => panic!("Factory is only supported for development and local testnet."), + } + + let factory_state = FactoryState::new( + cli_args.mode.clone(), + cli_args.num, + cli_args.rounds, + ); + transaction_factory::factory::>( + factory_state, + config, + ).map_err(|e| format!("Error in transaction factory: {}", e))?; + + Ok(()) + }, + _ => ret.map_err(Into::into).map(|_| ()) + } } fn run_until_exit( @@ -118,8 +213,8 @@ fn run_until_exit( { let (exit_send, exit) = exit_future::signal(); - let executor = runtime.executor(); - cli::informant::start(&service, exit.clone(), executor.clone()); + let informant = cli::informant::build(&service); + runtime.executor().spawn(exit.until(informant).map(|_| ())); let _ = runtime.block_on(e.into_exit()); exit_send.fire(); diff --git a/node/cli/src/service.rs b/node/cli/src/service.rs index 47bdb24122309cd09670e915329b5ef3d62b670d..058f58c9c2c7e1c8b9d631934e20dde1c77f53e7 100644 --- a/node/cli/src/service.rs +++ b/node/cli/src/service.rs @@ -22,17 +22,17 @@ use std::sync::Arc; use std::time::Duration; use client::{self, LongestChain}; -use consensus::{import_queue, start_aura, AuraImportQueue, - SlotDuration, NothingExtra -}; -use grandpa; +use consensus::{import_queue, start_aura, AuraImportQueue, SlotDuration}; +use grandpa::{self, FinalityProofProvider as GrandpaFinalityProofProvider}; use node_executor; use primitives::{Pair as PairT, ed25519}; +use futures::prelude::*; use node_primitives::Block; use node_runtime::{GenesisConfig, RuntimeApi}; use substrate_service::{ FactoryFullConfiguration, LightComponents, FullComponents, FullBackend, FullClient, LightClient, LightBackend, FullExecutor, LightExecutor, TaskExecutor, + error::{Error as ServiceError}, }; use transaction_pool::{self, txpool::{Pool as TransactionPool}}; use inherents::InherentDataProviders; @@ -88,22 +88,23 @@ construct_service_factory! { let proposer = Arc::new(substrate_basic_authorship::ProposerFactory { client: service.client(), transaction_pool: service.transaction_pool(), - inherents_pool: service.inherents_pool(), }); let client = service.client(); - executor.spawn(start_aura( + let select_chain = service.select_chain() + .ok_or(ServiceError::SelectChainRequired)?; + let aura = start_aura( SlotDuration::get_or_compute(&*client)?, key.clone(), client, - service.select_chain(), + select_chain, block_import.clone(), proposer, service.network(), - service.on_exit(), service.config.custom.inherent_data_providers.clone(), service.config.force_authoring, - )?); + )?; + executor.spawn(aura.select(service.on_exit()).then(|_| Ok(()))); info!("Running Grandpa session as Authority {}", key.public()); } @@ -133,17 +134,17 @@ construct_service_factory! { }, Some(_) => { let telemetry_on_connect = TelemetryOnConnect { - on_exit: Box::new(service.on_exit()), - telemetry_connection_sinks: service.telemetry_on_connect_stream(), - executor: &executor, + on_exit: Box::new(service.on_exit()), + telemetry_connection_sinks: service.telemetry_on_connect_stream(), + executor: &executor, }; let grandpa_config = grandpa::GrandpaParams { - config: config, - link: link_half, - network: service.network(), - inherent_data_providers: service.config.custom.inherent_data_providers.clone(), - on_exit: service.on_exit(), - telemetry_on_connect: Some(telemetry_on_connect), + config: config, + link: link_half, + network: service.network(), + inherent_data_providers: service.config.custom.inherent_data_providers.clone(), + on_exit: service.on_exit(), + telemetry_on_connect: Some(telemetry_on_connect), }; executor.spawn(grandpa::run_grandpa_voter(grandpa_config)?); }, @@ -166,41 +167,72 @@ construct_service_factory! { config.custom.grandpa_import_setup = Some((block_import.clone(), link_half)); - import_queue::<_, _, _, ed25519::Pair>( + import_queue::<_, _, ed25519::Pair>( slot_duration, block_import, Some(justification_import), + None, + None, client, - NothingExtra, config.custom.inherent_data_providers.clone(), ).map_err(Into::into) }}, LightImportQueue = AuraImportQueue { |config: &FactoryFullConfiguration, client: Arc>| { - import_queue::<_, _, _, ed25519::Pair>( + #[allow(deprecated)] + let fetch_checker = client.backend().blockchain().fetcher() + .upgrade() + .map(|fetcher| fetcher.checker().clone()) + .ok_or_else(|| "Trying to start light import queue without active fetch checker")?; + let block_import = grandpa::light_block_import::<_, _, _, RuntimeApi, LightClient>( + client.clone(), Arc::new(fetch_checker), client.clone() + )?; + let block_import = Arc::new(block_import); + let finality_proof_import = block_import.clone(); + let finality_proof_request_builder = finality_proof_import.create_finality_proof_request_builder(); + + import_queue::<_, _, ed25519::Pair>( SlotDuration::get_or_compute(&*client)?, - client.clone(), + block_import, None, + Some(finality_proof_import), + Some(finality_proof_request_builder), client, - NothingExtra, config.custom.inherent_data_providers.clone(), ).map_err(Into::into) - } - }, + }}, SelectChain = LongestChain, Self::Block> { |config: &FactoryFullConfiguration, client: Arc>| { - Ok(LongestChain::new( - client.backend().clone(), - client.import_lock() - )) + #[allow(deprecated)] + Ok(LongestChain::new(client.backend().clone())) } }, + FinalityProofProvider = { |client: Arc>| { + Ok(Some(Arc::new(GrandpaFinalityProofProvider::new(client.clone(), client)) as _)) + }}, } } #[cfg(test)] mod tests { + use std::sync::Arc; + use consensus::CompatibleDigestItem; + use consensus_common::{Environment, Proposer, ImportBlock, BlockOrigin, ForkChoiceStrategy}; + use node_primitives::DigestItem; + use node_runtime::{Call, BalancesCall, UncheckedExtrinsic}; + use parity_codec::{Compact, Encode, Decode}; + use primitives::{ + crypto::Pair as CryptoPair, ed25519::Pair, blake2_256, + sr25519::Public as AddressPublic, H256, + }; + use sr_primitives::{generic::{BlockId, Era, Digest}, traits::Block, OpaqueExtrinsic}; + use timestamp; + use finality_tracker; + use keyring::{ed25519::Keyring as AuthorityKeyring, sr25519::Keyring as AccountKeyring}; + use substrate_service::ServiceFactory; + use crate::service::Factory; + #[cfg(feature = "rhd")] fn test_sync() { use {service_test, Factory}; @@ -212,7 +244,7 @@ mod tests { let keys: Vec<&ed25519::Pair> = vec![&*alice, &*bob]; let dummy_runtime = ::tokio::runtime::Runtime::new().unwrap(); let block_factory = |service: &::FullService| { - let block_id = BlockId::number(service.client().info().unwrap().chain.best_number); + let block_id = BlockId::number(service.client().info().chain.best_number); let parent_header = service.client().header(&block_id).unwrap().unwrap(); let consensus_net = ConsensusNetwork::new(service.network(), service.client().clone()); let proposer_factory = consensus::ProposerFactory { @@ -248,4 +280,107 @@ mod tests { service_test::sync::(chain_spec::integration_test_config(), block_factory, extrinsic_factory); } + #[test] + #[ignore] + fn test_sync() { + let chain_spec = crate::chain_spec::tests::integration_test_config_with_single_authority(); + + let alice = Arc::new(AuthorityKeyring::Alice.pair()); + let mut slot_num = 1u64; + let block_factory = |service: &::FullService| { + let mut inherent_data = service.config.custom.inherent_data_providers + .create_inherent_data().unwrap(); + inherent_data.replace_data(finality_tracker::INHERENT_IDENTIFIER, &1u64); + inherent_data.replace_data(timestamp::INHERENT_IDENTIFIER, &(slot_num * 10)); + + let parent_id = BlockId::number(service.client().info().chain.best_number); + let parent_header = service.client().header(&parent_id).unwrap().unwrap(); + let proposer_factory = Arc::new(substrate_basic_authorship::ProposerFactory { + client: service.client(), + transaction_pool: service.transaction_pool(), + }); + let mut digest = Digest::::default(); + digest.push(>::aura_pre_digest(slot_num * 10 / 2)); + let proposer = proposer_factory.init(&parent_header).unwrap(); + let new_block = proposer.propose( + inherent_data, + digest, + ::std::time::Duration::from_secs(1), + ).expect("Error making test block"); + + let (new_header, new_body) = new_block.deconstruct(); + let pre_hash = new_header.hash(); + // sign the pre-sealed hash of the block and then + // add it to a digest item. + let to_sign = pre_hash.encode(); + let signature = alice.sign(&to_sign[..]); + let item = >::aura_seal( + signature, + ); + slot_num += 1; + + ImportBlock { + origin: BlockOrigin::File, + header: new_header, + justification: None, + post_digests: vec![item], + body: Some(new_body), + finalized: true, + auxiliary: Vec::new(), + fork_choice: ForkChoiceStrategy::LongestChain, + } + }; + + let bob = Arc::new(AccountKeyring::Bob.pair()); + let charlie = Arc::new(AccountKeyring::Charlie.pair()); + + let mut index = 0; + let extrinsic_factory = |service: &::FullService| { + let amount = 1000; + let to = AddressPublic::from_raw(bob.public().0); + let from = AddressPublic::from_raw(charlie.public().0); + let genesis_hash = service.client().block_hash(0).unwrap().unwrap(); + let signer = charlie.clone(); + + let function = Call::Balances(BalancesCall::transfer(to.into(), amount)); + let era = Era::immortal(); + let raw_payload = (Compact(index), function, era, genesis_hash); + let signature = raw_payload.using_encoded(|payload| if payload.len() > 256 { + signer.sign(&blake2_256(payload)[..]) + } else { + signer.sign(payload) + }); + let xt = UncheckedExtrinsic::new_signed( + index, + raw_payload.1, + from.into(), + signature.into(), + era, + ).encode(); + let v: Vec = Decode::decode(&mut xt.as_slice()).unwrap(); + + index += 1; + OpaqueExtrinsic(v) + }; + + service_test::sync::( + chain_spec, + block_factory, + extrinsic_factory, + ); + } + + #[test] + #[ignore] + fn test_consensus() { + use super::Factory; + + service_test::consensus::( + crate::chain_spec::tests::integration_test_config_with_two_authorities(), + vec![ + "//Alice".into(), + "//Bob".into(), + ], + ) + } } diff --git a/node/executor/Cargo.toml b/node/executor/Cargo.toml index 89b448ec90141481644a2dd7faa7df59031e0567..a5e5958f6a67ec3490109ebee243acd0639d0167 100644 --- a/node/executor/Cargo.toml +++ b/node/executor/Cargo.toml @@ -17,6 +17,7 @@ node-primitives = { path = "../primitives" } node-runtime = { path = "../runtime" } [dev-dependencies] +test-client = { package = "substrate-test-client", path = "../../core/test-client" } keyring = { package = "substrate-keyring", path = "../../core/keyring" } runtime_primitives = { package = "sr-primitives", path = "../../core/sr-primitives" } runtime_support = { package = "srml-support", path = "../../srml/support" } @@ -24,10 +25,9 @@ balances = { package = "srml-balances", path = "../../srml/balances" } session = { package = "srml-session", path = "../../srml/session" } staking = { package = "srml-staking", path = "../../srml/staking" } system = { package = "srml-system", path = "../../srml/system" } -consensus = { package = "srml-consensus", path = "../../srml/consensus" } timestamp = { package = "srml-timestamp", path = "../../srml/timestamp" } treasury = { package = "srml-treasury", path = "../../srml/treasury" } -contract = { package = "srml-contract", path = "../../srml/contract" } +contracts = { package = "srml-contracts", path = "../../srml/contracts" } grandpa = { package = "srml-grandpa", path = "../../srml/grandpa" } indices = { package = "srml-indices", path = "../../srml/indices" } wabt = "~0.7.4" diff --git a/node/executor/src/lib.rs b/node/executor/src/lib.rs index fac04de6e7f913431d6abd1fbe1a4a29b421f937..5f84085749d208771274aba4c3f45e4aebac8084 100644 --- a/node/executor/src/lib.rs +++ b/node/executor/src/lib.rs @@ -23,7 +23,17 @@ pub use substrate_executor::NativeExecutor; use substrate_executor::native_executor_instance; -native_executor_instance!(pub Executor, node_runtime::api::dispatch, node_runtime::native_version, include_bytes!("../../runtime/wasm/target/wasm32-unknown-unknown/release/node_runtime.compact.wasm")); + +// Declare an instance of the native executor named `Executor`. Include the wasm binary as the +// equivalent wasm code. +native_executor_instance!( + pub Executor, + node_runtime::api::dispatch, + node_runtime::native_version, + include_bytes!( + "../../runtime/wasm/target/wasm32-unknown-unknown/release/node_runtime.compact.wasm" + ) +); #[cfg(test)] mod tests { @@ -33,25 +43,42 @@ mod tests { use parity_codec::{Encode, Decode, Joiner}; use keyring::{AuthorityKeyring, AccountKeyring}; use runtime_support::{Hashable, StorageValue, StorageMap, traits::Currency}; - use state_machine::{CodeExecutor, Externalities, TestExternalities}; + use state_machine::{CodeExecutor, Externalities, TestExternalities as CoreTestExternalities}; use primitives::{twox_128, blake2_256, Blake2Hasher, ChangesTrieConfiguration, NeverNativeValue, NativeOrEncoded}; use node_primitives::{Hash, BlockNumber, AccountId}; - use runtime_primitives::traits::{Header as HeaderT, Hash as HashT, Digest, DigestItem}; + use runtime_primitives::traits::{Header as HeaderT, Hash as HashT}; use runtime_primitives::{generic::Era, ApplyOutcome, ApplyError, ApplyResult, Perbill}; - use {balances, indices, session, system, staking, consensus, timestamp, treasury, contract}; - use contract::ContractAddressFor; + use {balances, indices, system, staking, timestamp, treasury, contracts}; + use contracts::ContractAddressFor; use system::{EventRecord, Phase}; use node_runtime::{Header, Block, UncheckedExtrinsic, CheckedExtrinsic, Call, Runtime, Balances, BuildStorage, GenesisConfig, BalancesConfig, SessionConfig, StakingConfig, System, - SystemConfig, GrandpaConfig, IndicesConfig, Event}; + SystemConfig, GrandpaConfig, IndicesConfig, Event, SessionKeys}; use wabt; use primitives::map; - const BLOATY_CODE: &[u8] = include_bytes!("../../runtime/wasm/target/wasm32-unknown-unknown/release/node_runtime.wasm"); - const COMPACT_CODE: &[u8] = include_bytes!("../../runtime/wasm/target/wasm32-unknown-unknown/release/node_runtime.compact.wasm"); + /// The wasm runtime code. + /// + /// `compact` since it is after post-processing with wasm-gc which performs tree-shaking thus + /// making the binary slimmer. There is a convention to use compact version of the runtime + /// as canonical. This is why `native_executor_instance` also uses the compact version of the + /// runtime. + const COMPACT_CODE: &[u8] = + include_bytes!("../../runtime/wasm/target/wasm32-unknown-unknown/release/node_runtime.compact.wasm"); + + /// The wasm runtime binary which hasn't undergone the compacting process. + /// + /// The idea here is to pass it as the current runtime code to the executor so the executor will + /// have to execute provided wasm code instead of the native equivalent. This trick is used to + /// test code paths that differ between native and wasm versions. + const BLOATY_CODE: &[u8] = + include_bytes!("../../runtime/wasm/target/wasm32-unknown-unknown/release/node_runtime.wasm"); + const GENESIS_HASH: [u8; 32] = [69u8; 32]; + type TestExternalities = CoreTestExternalities; + fn alice() -> AccountId { AccountKeyring::Alice.into() } @@ -119,15 +146,33 @@ mod tests { #[test] fn panic_execution_with_foreign_code_gives_error() { let mut t = TestExternalities::::new_with_code(BLOATY_CODE, map![ - blake2_256(&>::key_for(alice())).to_vec() => vec![69u8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - twox_128(>::key()).to_vec() => vec![69u8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - twox_128(>::key()).to_vec() => vec![0u8; 16], - twox_128(>::key()).to_vec() => vec![0u8; 16], - twox_128(>::key()).to_vec() => vec![0u8; 16], - twox_128(>::key()).to_vec() => vec![0u8; 16], - blake2_256(&>::key_for(0)).to_vec() => vec![0u8; 32], - twox_128(>::key()).to_vec() => vec![70u8; 16], - twox_128(>::key()).to_vec() => vec![0u8; 16] + blake2_256(&>::key_for(alice())).to_vec() => { + vec![69u8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + }, + twox_128(>::key()).to_vec() => { + vec![69u8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + }, + twox_128(>::key()).to_vec() => { + vec![0u8; 16] + }, + twox_128(>::key()).to_vec() => { + vec![0u8; 16] + }, + twox_128(>::key()).to_vec() => { + vec![0u8; 16] + }, + twox_128(>::key()).to_vec() => { + vec![0u8; 16] + }, + blake2_256(&>::key_for(0)).to_vec() => { + vec![0u8; 32] + }, + twox_128(>::key()).to_vec() => { + vec![70u8; 16] + }, + twox_128(>::key()).to_vec() => { + vec![0u8; 16] + } ]); let r = executor().call::<_, NeverNativeValue, fn() -> _>( @@ -152,15 +197,33 @@ mod tests { #[test] fn bad_extrinsic_with_native_equivalent_code_gives_error() { let mut t = TestExternalities::::new_with_code(COMPACT_CODE, map![ - blake2_256(&>::key_for(alice())).to_vec() => vec![69u8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - twox_128(>::key()).to_vec() => vec![69u8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - twox_128(>::key()).to_vec() => vec![0u8; 16], - twox_128(>::key()).to_vec() => vec![0u8; 16], - twox_128(>::key()).to_vec() => vec![0u8; 16], - twox_128(>::key()).to_vec() => vec![0u8; 16], - blake2_256(&>::key_for(0)).to_vec() => vec![0u8; 32], - twox_128(>::key()).to_vec() => vec![70u8; 16], - twox_128(>::key()).to_vec() => vec![0u8; 16] + blake2_256(&>::key_for(alice())).to_vec() => { + vec![69u8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + }, + twox_128(>::key()).to_vec() => { + vec![69u8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + }, + twox_128(>::key()).to_vec() => { + vec![0u8; 16] + }, + twox_128(>::key()).to_vec() => { + vec![0u8; 16] + }, + twox_128(>::key()).to_vec() => { + vec![0u8; 16] + }, + twox_128(>::key()).to_vec() => { + vec![0u8; 16] + }, + blake2_256(&>::key_for(0)).to_vec() => { + vec![0u8; 32] + }, + twox_128(>::key()).to_vec() => { + vec![70u8; 16] + }, + twox_128(>::key()).to_vec() => { + vec![0u8; 16] + } ]); let r = executor().call::<_, NeverNativeValue, fn() -> _>( @@ -185,8 +248,12 @@ mod tests { #[test] fn successful_execution_with_native_equivalent_code_gives_ok() { let mut t = TestExternalities::::new_with_code(COMPACT_CODE, map![ - blake2_256(&>::key_for(alice())).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - twox_128(>::key()).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + blake2_256(&>::key_for(alice())).to_vec() => { + vec![111u8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + }, + twox_128(>::key()).to_vec() => { + vec![111u8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + }, twox_128(>::key()).to_vec() => vec![0u8; 16], twox_128(>::key()).to_vec() => vec![0u8; 16], twox_128(>::key()).to_vec() => vec![0u8; 16], @@ -222,8 +289,12 @@ mod tests { #[test] fn successful_execution_with_foreign_code_gives_ok() { let mut t = TestExternalities::::new_with_code(BLOATY_CODE, map![ - blake2_256(&>::key_for(alice())).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - twox_128(>::key()).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + blake2_256(&>::key_for(alice())).to_vec() => { + vec![111u8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + }, + twox_128(>::key()).to_vec() => { + vec![111u8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + }, twox_128(>::key()).to_vec() => vec![0u8; 16], twox_128(>::key()).to_vec() => vec![0u8; 16], twox_128(>::key()).to_vec() => vec![0u8; 16], @@ -256,10 +327,14 @@ mod tests { }); } + fn to_session_keys(ring: &AuthorityKeyring) -> SessionKeys { + SessionKeys(ring.to_owned().into(), ring.to_owned().into()) + } + fn new_test_ext(code: &[u8], support_changes_trie: bool) -> TestExternalities { let three = AccountId::from_raw([3u8; 32]); - TestExternalities::new_with_code(code, GenesisConfig { - consensus: Some(Default::default()), + let mut ext = TestExternalities::new_with_code(code, GenesisConfig { + aura: Some(Default::default()), system: Some(SystemConfig { changes_trie_config: if support_changes_trie { Some(ChangesTrieConfiguration { digest_interval: 2, @@ -287,16 +362,14 @@ mod tests { vesting: vec![], }), session: Some(SessionConfig { - session_length: 2, validators: vec![AccountKeyring::One.into(), AccountKeyring::Two.into(), three], keys: vec![ - (alice(), AuthorityKeyring::Alice.into()), - (bob(), AuthorityKeyring::Bob.into()), - (charlie(), AuthorityKeyring::Charlie.into()) + (alice(), to_session_keys(&AuthorityKeyring::Alice)), + (bob(), to_session_keys(&AuthorityKeyring::Bob)), + (charlie(), to_session_keys(&AuthorityKeyring::Charlie)), ] }), staking: Some(StakingConfig { - sessions_per_era: 2, current_era: 0, stakers: vec![ (dave(), alice(), 111, staking::StakerStatus::Validator), @@ -305,7 +378,6 @@ mod tests { ], validator_count: 3, minimum_validator_count: 0, - bonding_duration: 0, offline_slash: Perbill::zero(), session_reward: Perbill::zero(), current_session_reward: 0, @@ -314,15 +386,17 @@ mod tests { }), democracy: Some(Default::default()), council_seats: Some(Default::default()), - council_voting: Some(Default::default()), timestamp: Some(Default::default()), treasury: Some(Default::default()), - contract: Some(Default::default()), + contracts: Some(Default::default()), sudo: Some(Default::default()), grandpa: Some(GrandpaConfig { + _genesis_phantom_data: Default::default(), authorities: vec![], }), - }.build_storage().unwrap().0) + }.build_storage().unwrap().0); + ext.changes_trie_storage().insert(0, GENESIS_HASH.into(), Default::default()); + ext } fn construct_block( @@ -444,8 +518,8 @@ mod tests { // session change => consensus authorities change => authorities change digest item appears let digest = Header::decode(&mut &block2.0[..]).unwrap().digest; - assert_eq!(digest.logs().len(), 1); - assert!(digest.logs()[0].as_authorities_change().is_some()); + assert_eq!(digest.logs().len(), 0); +// assert!(digest.logs()[0].as_consensus().is_some()); (block1, block2) } @@ -462,7 +536,7 @@ mod tests { }, CheckedExtrinsic { signed: Some((alice(), 0)), - function: Call::Consensus(consensus::Call::remark(vec![0; 120000])), + function: Call::System(system::Call::remark(vec![0; 120000])), } ] ) @@ -490,7 +564,8 @@ mod tests { assert_eq!(System::events(), vec![ EventRecord { phase: Phase::ApplyExtrinsic(0), - event: Event::system(system::Event::ExtrinsicSuccess) + event: Event::system(system::Event::ExtrinsicSuccess), + topics: vec![], }, EventRecord { phase: Phase::ApplyExtrinsic(1), @@ -499,23 +574,28 @@ mod tests { bob().into(), 69, 0 - )) + )), + topics: vec![], }, EventRecord { phase: Phase::ApplyExtrinsic(1), - event: Event::system(system::Event::ExtrinsicSuccess) + event: Event::system(system::Event::ExtrinsicSuccess), + topics: vec![], }, EventRecord { phase: Phase::Finalization, - event: Event::treasury(treasury::RawEvent::Spending(0)) + event: Event::treasury(treasury::RawEvent::Spending(0)), + topics: vec![], }, EventRecord { phase: Phase::Finalization, - event: Event::treasury(treasury::RawEvent::Burnt(0)) + event: Event::treasury(treasury::RawEvent::Burnt(0)), + topics: vec![], }, EventRecord { phase: Phase::Finalization, - event: Event::treasury(treasury::RawEvent::Rollover(0)) + event: Event::treasury(treasury::RawEvent::Rollover(0)), + topics: vec![], }, ]); }); @@ -537,7 +617,8 @@ mod tests { assert_eq!(System::events(), vec![ EventRecord { phase: Phase::ApplyExtrinsic(0), - event: Event::system(system::Event::ExtrinsicSuccess) + event: Event::system(system::Event::ExtrinsicSuccess), + topics: vec![], }, EventRecord { phase: Phase::ApplyExtrinsic(1), @@ -548,11 +629,13 @@ mod tests { 5, 0 ) - ) + ), + topics: vec![], }, EventRecord { phase: Phase::ApplyExtrinsic(1), - event: Event::system(system::Event::ExtrinsicSuccess) + event: Event::system(system::Event::ExtrinsicSuccess), + topics: vec![], }, EventRecord { phase: Phase::ApplyExtrinsic(2), @@ -563,27 +646,28 @@ mod tests { 15, 0 ) - ) + ), + topics: vec![], }, EventRecord { phase: Phase::ApplyExtrinsic(2), - event: Event::system(system::Event::ExtrinsicSuccess) - }, - EventRecord { - phase: Phase::Finalization, - event: Event::treasury(treasury::RawEvent::Spending(0)) + event: Event::system(system::Event::ExtrinsicSuccess), + topics: vec![], }, EventRecord { phase: Phase::Finalization, - event: Event::treasury(treasury::RawEvent::Burnt(0)) + event: Event::treasury(treasury::RawEvent::Spending(0)), + topics: vec![], }, EventRecord { phase: Phase::Finalization, - event: Event::treasury(treasury::RawEvent::Rollover(0)) + event: Event::treasury(treasury::RawEvent::Burnt(0)), + topics: vec![], }, EventRecord { phase: Phase::Finalization, - event: Event::session(session::RawEvent::NewSession(1)) + event: Event::treasury(treasury::RawEvent::Rollover(0)), + topics: vec![], }, ]); }); @@ -627,22 +711,23 @@ mod tests { ;; input_data_len: u32 ;; ) -> u32 (import "env" "ext_call" (func $ext_call (param i32 i32 i64 i32 i32 i32 i32) (result i32))) - (import "env" "ext_input_size" (func $ext_input_size (result i32))) - (import "env" "ext_input_copy" (func $ext_input_copy (param i32 i32 i32))) + (import "env" "ext_scratch_size" (func $ext_scratch_size (result i32))) + (import "env" "ext_scratch_copy" (func $ext_scratch_copy (param i32 i32 i32))) (import "env" "memory" (memory 1 1)) (func (export "deploy") ) (func (export "call") (block $fail - ;; fail if ext_input_size != 4 + ;; load and check the input data (which is stored in the scratch buffer). + ;; fail if the input size is not != 4 (br_if $fail (i32.ne (i32.const 4) - (call $ext_input_size) + (call $ext_scratch_size) ) ) - (call $ext_input_copy + (call $ext_scratch_copy (i32.const 0) (i32.const 0) (i32.const 4) @@ -692,10 +777,17 @@ mod tests { ) ;; Destination AccountId to transfer the funds. ;; Represented by H256 (32 bytes long) in little endian. - (data (i32.const 4) "\09\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 4) + "\09\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00" + "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00" + "\00\00\00\00" + ) ;; Amount of value to transfer. ;; Represented by u128 (16 bytes long) in little endian. - (data (i32.const 36) "\06\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 36) + "\06\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00" + "\00\00" + ) ) "#; @@ -705,7 +797,7 @@ mod tests { let transfer_code = wabt::wat2wasm(CODE_TRANSFER).unwrap(); let transfer_ch = ::Hashing::hash(&transfer_code); - let addr = ::DetermineContractAddress::contract_address_for( + let addr = ::DetermineContractAddress::contract_address_for( &transfer_ch, &[], &charlie(), @@ -722,20 +814,25 @@ mod tests { }, CheckedExtrinsic { signed: Some((charlie(), 0)), - function: Call::Contract( - contract::Call::put_code::(10_000, transfer_code) + function: Call::Contracts( + contracts::Call::put_code::(10_000, transfer_code) ), }, CheckedExtrinsic { signed: Some((charlie(), 1)), - function: Call::Contract( - contract::Call::create::(10, 10_000, transfer_ch, Vec::new()) + function: Call::Contracts( + contracts::Call::create::(10, 10_000, transfer_ch, Vec::new()) ), }, CheckedExtrinsic { signed: Some((charlie(), 2)), - function: Call::Contract( - contract::Call::call::(indices::address::Address::Id(addr.clone()), 10, 10_000, vec![0x00, 0x01, 0x02, 0x03]) + function: Call::Contracts( + contracts::Call::call::( + indices::address::Address::Id(addr.clone()), + 10, + 10_000, + vec![0x00, 0x01, 0x02, 0x03] + ) ), }, ] @@ -748,7 +845,7 @@ mod tests { runtime_io::with_externalities(&mut t, || { // Verify that the contract constructor worked well and code of TRANSFER contract is actually deployed. assert_eq!( - &contract::ContractInfoOf::::get(addr) + &contracts::ContractInfoOf::::get(addr) .and_then(|c| c.get_alive()) .unwrap() .code_hash, @@ -764,7 +861,7 @@ mod tests { assert!( WasmExecutor::new().call( &mut t, - 8, + 4, COMPACT_CODE, "Core_execute_block", &big_block().0 @@ -802,10 +899,13 @@ mod tests { #[test] fn panic_execution_gives_error() { - let foreign_code = include_bytes!("../../runtime/wasm/target/wasm32-unknown-unknown/release/node_runtime.wasm"); - let mut t = TestExternalities::::new_with_code(foreign_code, map![ - blake2_256(&>::key_for(alice())).to_vec() => vec![69u8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - twox_128(>::key()).to_vec() => vec![69u8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + let mut t = TestExternalities::::new_with_code(BLOATY_CODE, map![ + blake2_256(&>::key_for(alice())).to_vec() => { + vec![69u8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + }, + twox_128(>::key()).to_vec() => { + vec![69u8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + }, twox_128(>::key()).to_vec() => vec![0u8; 16], twox_128(>::key()).to_vec() => vec![0u8; 16], twox_128(>::key()).to_vec() => vec![0u8; 16], @@ -815,19 +915,24 @@ mod tests { twox_128(>::key()).to_vec() => vec![0u8; 16] ]); - let r = WasmExecutor::new().call(&mut t, 8, COMPACT_CODE, "Core_initialize_block", &vec![].and(&from_block_number(1u64))); + let r = WasmExecutor::new() + .call(&mut t, 8, COMPACT_CODE, "Core_initialize_block", &vec![].and(&from_block_number(1u64))); assert!(r.is_ok()); - let r = WasmExecutor::new().call(&mut t, 8, COMPACT_CODE, "BlockBuilder_apply_extrinsic", &vec![].and(&xt())).unwrap(); + let r = WasmExecutor::new() + .call(&mut t, 8, COMPACT_CODE, "BlockBuilder_apply_extrinsic", &vec![].and(&xt())).unwrap(); let r = ApplyResult::decode(&mut &r[..]).unwrap(); assert_eq!(r, Err(ApplyError::CantPay)); } #[test] fn successful_execution_gives_ok() { - let foreign_code = include_bytes!("../../runtime/wasm/target/wasm32-unknown-unknown/release/node_runtime.compact.wasm"); - let mut t = TestExternalities::::new_with_code(foreign_code, map![ - blake2_256(&>::key_for(alice())).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - twox_128(>::key()).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + let mut t = TestExternalities::::new_with_code(COMPACT_CODE, map![ + blake2_256(&>::key_for(alice())).to_vec() => { + vec![111u8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + }, + twox_128(>::key()).to_vec() => { + vec![111u8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + }, twox_128(>::key()).to_vec() => vec![0u8; 16], twox_128(>::key()).to_vec() => vec![0u8; 16], twox_128(>::key()).to_vec() => vec![0u8; 16], @@ -837,9 +942,11 @@ mod tests { twox_128(>::key()).to_vec() => vec![0u8; 16] ]); - let r = WasmExecutor::new().call(&mut t, 8, COMPACT_CODE, "Core_initialize_block", &vec![].and(&from_block_number(1u64))); + let r = WasmExecutor::new() + .call(&mut t, 8, COMPACT_CODE, "Core_initialize_block", &vec![].and(&from_block_number(1u64))); assert!(r.is_ok()); - let r = WasmExecutor::new().call(&mut t, 8, COMPACT_CODE, "BlockBuilder_apply_extrinsic", &vec![].and(&xt())).unwrap(); + let r = WasmExecutor::new() + .call(&mut t, 8, COMPACT_CODE, "BlockBuilder_apply_extrinsic", &vec![].and(&xt())).unwrap(); let r = ApplyResult::decode(&mut &r[..]).unwrap(); assert_eq!(r, Ok(ApplyOutcome::Success)); @@ -864,7 +971,7 @@ mod tests { None, ).0.unwrap(); - assert!(t.storage_changes_root(Default::default(), 0).is_some()); + assert!(t.storage_changes_root(GENESIS_HASH.into()).unwrap().is_some()); } #[test] @@ -872,9 +979,25 @@ mod tests { let block1 = changes_trie_block(); let mut t = new_test_ext(COMPACT_CODE, true); - WasmExecutor::new().call(&mut t, 8, COMPACT_CODE, "Core_execute_block", &block1.0).unwrap(); + WasmExecutor::new() + .call(&mut t, 8, COMPACT_CODE, "Core_execute_block", &block1.0).unwrap(); + + assert!(t.storage_changes_root(GENESIS_HASH.into()).unwrap().is_some()); + } + + #[test] + fn should_import_block_with_test_client() { + use test_client::{ClientExt, TestClientBuilder, consensus::BlockOrigin}; + + let client = TestClientBuilder::default() + .build_with_native_executor::(executor()) + .0; + + let block1 = changes_trie_block(); + let block_data = block1.0; + let block = Block::decode(&mut &block_data[..]).unwrap(); - assert!(t.storage_changes_root(Default::default(), 0).is_some()); + client.import(BlockOrigin::Own, block).unwrap(); } #[cfg(feature = "benchmarks")] diff --git a/node/primitives/src/lib.rs b/node/primitives/src/lib.rs index 4dde59296f4980c6ec4a0b3bf6734609de6405bf..8b7b2521e4000fc4c912023026dcc86d7f9b49e3 100644 --- a/node/primitives/src/lib.rs +++ b/node/primitives/src/lib.rs @@ -41,12 +41,11 @@ pub type AccountIndex = u32; /// Balance of an account. pub type Balance = u128; -/// The Ed25519 pub key of an session that belongs to an authority of the chain. This is -/// exactly equivalent to what the substrate calls an "authority". -pub type AuthorityId = ::Signer; +/// Alias to the signature scheme used for Aura authority signatures. +pub type AuraSignature = primitives::ed25519::Signature; -/// Alias to 512-bit hash when used in the context of a session signature on the chain. -pub type AuthoritySignature = primitives::ed25519::Signature; +/// The Ed25519 pub key of an session that belongs to an Aura authority of the chain. +pub type AuraId = primitives::ed25519::Public; /// Index of a transaction in the chain. pub type Index = u64; @@ -57,9 +56,10 @@ pub type Hash = primitives::H256; /// A timestamp: seconds since the unix epoch. pub type Timestamp = u64; +/// Digest item type. +pub type DigestItem = generic::DigestItem; /// Header type. -/// -pub type Header = generic::Header>; +pub type Header = generic::Header; /// Block type. pub type Block = generic::Block; /// Block ID. diff --git a/node/rpc-client/Cargo.toml b/node/rpc-client/Cargo.toml new file mode 100644 index 0000000000000000000000000000000000000000..ea255808e463e47d2f6c0d3bdf15044b0b827815 --- /dev/null +++ b/node/rpc-client/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "node-rpc-client" +version = "2.0.0" +authors = ["Parity Technologies "] +edition = "2018" + +[dependencies] +env_logger = "0.6" +futures = "0.1.26" +hyper = "0.12" +jsonrpc-core-client = { version = "12.0.0", features = ["http", "ws"] } +log = "0.4" +node-primitives = { path = "../primitives" } +substrate-rpc = { path = "../../core/rpc", version = "2.0.0" } diff --git a/node/rpc-client/src/main.rs b/node/rpc-client/src/main.rs new file mode 100644 index 0000000000000000000000000000000000000000..fe057bcbeaf4236661d5109513138a93a7e894f7 --- /dev/null +++ b/node/rpc-client/src/main.rs @@ -0,0 +1,70 @@ +// Copyright 2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +#![warn(missing_docs)] + +//! Example substrate RPC client code. +//! +//! This module shows how you can write a Rust RPC client that connects to a running +//! substrate node and use staticly typed RPC wrappers. + +use futures::Future; +use hyper::rt; +use node_primitives::Hash; +use substrate_rpc::author::{ + AuthorClient, + hash::ExtrinsicOrHash, +}; +use jsonrpc_core_client::{ + transports::http, + RpcError, +}; + +fn main() { + env_logger::init(); + + rt::run(rt::lazy(|| { + let uri = "http://localhost:9933"; + + http::connect(uri) + .and_then(|client: AuthorClient| { + remove_all_extrinsics(client) + }) + .map_err(|e| { + println!("Error: {:?}", e); + }) + })) +} + +/// Remove all pending extrinsics from the node. +/// +/// The example code takes `AuthorClient` and first: +/// 1. Calls the `pending_extrinsics` method to get all extrinsics in the pool. +/// 2. Then calls `remove_extrinsic` passing the obtained raw extrinsics. +/// +/// As the resul of running the code the entire content of the transaction pool is going +/// to be removed and the extrinsics are going to be temporarily banned. +fn remove_all_extrinsics(client: AuthorClient) -> impl Future { + client.pending_extrinsics() + .and_then(move |pending| { + client.remove_extrinsic( + pending.into_iter().map(|tx| ExtrinsicOrHash::Extrinsic(tx.into())).collect() + ) + }) + .map(|removed| { + println!("Removed extrinsics: {:?}", removed); + }) +} diff --git a/node/runtime/Cargo.toml b/node/runtime/Cargo.toml index 486a5b80a01bfc5095cae70366d0daf7f1518545..f1981a585221eee50bc1f8e03e9551deade49546 100644 --- a/node/runtime/Cargo.toml +++ b/node/runtime/Cargo.toml @@ -7,7 +7,7 @@ edition = "2018" [dependencies] integer-sqrt = { version = "0.1.2" } safe-mix = { version = "1.0", default-features = false } -parity-codec = { version = "3.3", default-features = false, features = ["derive"] } +parity-codec = { version = "3.5.1", default-features = false, features = ["derive"] } substrate-primitives = { path = "../../core/primitives", default-features = false } client = { package = "substrate-client", path = "../../core/client", default-features = false } rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } @@ -17,8 +17,7 @@ version = { package = "sr-version", path = "../../core/sr-version", default-feat support = { package = "srml-support", path = "../../srml/support", default-features = false } aura = { package = "srml-aura", path = "../../srml/aura", default-features = false } balances = { package = "srml-balances", path = "../../srml/balances", default-features = false } -consensus = { package = "srml-consensus", path = "../../srml/consensus", default-features = false } -contract = { package = "srml-contract", path = "../../srml/contract", default-features = false } +contracts = { package = "srml-contracts", path = "../../srml/contracts", default-features = false } council = { package = "srml-council", path = "../../srml/council", default-features = false } democracy = { package = "srml-democracy", path = "../../srml/democracy", default-features = false } executive = { package = "srml-executive", path = "../../srml/executive", default-features = false } @@ -36,12 +35,11 @@ consensus_aura = { package = "substrate-consensus-aura-primitives", path = "../. rustc-hex = { version = "2.0", optional = true } serde = { version = "1.0", optional = true } substrate-keyring = { path = "../../core/keyring", optional = true } -consensus_authorities = { package = "substrate-consensus-authorities", path = "../../core/consensus/authorities", default-features = false } [features] default = ["std"] core = [ - "contract/core", + "contracts/core", ] std = [ "parity-codec/std", @@ -51,8 +49,7 @@ std = [ "support/std", "aura/std", "balances/std", - "consensus/std", - "contract/std", + "contracts/std", "council/std", "democracy/std", "executive/std", @@ -74,5 +71,4 @@ std = [ "rustc-hex", "substrate-keyring", "offchain-primitives/std", - "consensus_authorities/std", ] diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs index d584fb8250f255dfe24640eea5bb89e47c274a82..cff2e39b4cd7eb9c1272ba9f8f1d862bbb4dafeb 100644 --- a/node/runtime/src/lib.rs +++ b/node/runtime/src/lib.rs @@ -21,10 +21,10 @@ #![recursion_limit="256"] use rstd::prelude::*; -use support::construct_runtime; -use substrate_primitives::u32_trait::{_2, _4}; +use support::{construct_runtime, parameter_types}; +use substrate_primitives::u32_trait::{_1, _2, _3, _4}; use node_primitives::{ - AccountId, AccountIndex, Balance, BlockNumber, Hash, Index, AuthorityId, Signature, AuthoritySignature + AccountId, AccountIndex, Balance, BlockNumber, Hash, Index, Signature, AuraId }; use grandpa::fg_primitives::{self, ScheduledChange}; use client::{ @@ -34,22 +34,22 @@ use client::{ use runtime_primitives::{ApplyResult, generic, create_runtime_str}; use runtime_primitives::transaction_validity::TransactionValidity; use runtime_primitives::traits::{ - BlakeTwo256, Block as BlockT, DigestFor, NumberFor, StaticLookup, AuthorityIdFor, Convert, + BlakeTwo256, Block as BlockT, DigestFor, NumberFor, StaticLookup, Convert, }; use version::RuntimeVersion; -use council::{motions as council_motions, voting as council_voting}; +use council::{motions as council_motions}; #[cfg(feature = "std")] use council::seats as council_seats; #[cfg(any(feature = "std", test))] use version::NativeVersion; use substrate_primitives::OpaqueMetadata; +use grandpa::{AuthorityId as GrandpaId, AuthorityWeight as GrandpaWeight}; #[cfg(any(feature = "std", test))] pub use runtime_primitives::BuildStorage; -pub use consensus::Call as ConsensusCall; pub use timestamp::Call as TimestampCall; pub use balances::Call as BalancesCall; -pub use runtime_primitives::{Permill, Perbill}; +pub use runtime_primitives::{Permill, Perbill, impl_opaque_keys}; pub use support::StorageValue; pub use staking::StakerStatus; @@ -58,8 +58,8 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("node"), impl_name: create_runtime_str!("substrate-node"), authoring_version: 10, - spec_version: 77, - impl_version: 77, + spec_version: 97, + impl_version: 99, apis: RUNTIME_API_VERSIONS, }; @@ -92,16 +92,15 @@ impl system::Trait for Runtime { type BlockNumber = BlockNumber; type Hash = Hash; type Hashing = BlakeTwo256; - type Digest = generic::Digest; type AccountId = AccountId; type Lookup = Indices; - type Header = generic::Header; + type Header = generic::Header; type Event = Event; - type Log = Log; } impl aura::Trait for Runtime { type HandleReport = aura::StakingSlasher; + type AuthorityId = AuraId; } impl indices::Trait for Runtime { @@ -113,7 +112,7 @@ impl indices::Trait for Runtime { impl balances::Trait for Runtime { type Balance = Balance; - type OnFreeBalanceZero = ((Staking, Contract), Session); + type OnFreeBalanceZero = ((Staking, Contracts), Session); type OnNewAccount = Indices; type Event = Event; type TransactionPayment = (); @@ -121,24 +120,38 @@ impl balances::Trait for Runtime { type TransferPayment = (); } -impl consensus::Trait for Runtime { - type Log = Log; - type SessionKey = AuthorityId; - - // The Aura module handles offline-reports internally - // rather than using an explicit report system. - type InherentOfflineReport = (); -} - impl timestamp::Trait for Runtime { type Moment = u64; type OnTimestampSet = Aura; } +parameter_types! { + pub const Period: BlockNumber = 10 * MINUTES; + pub const Offset: BlockNumber = 0; +} + +type SessionHandlers = (Grandpa, Aura); +impl_opaque_keys! { + pub struct SessionKeys(grandpa::AuthorityId, AuraId); +} + +// NOTE: `SessionHandler` and `SessionKeys` are co-dependent: One key will be used for each handler. +// The number and order of items in `SessionHandler` *MUST* be the same number and order of keys in +// `SessionKeys`. +// TODO: Introduce some structure to tie these together to make it a bit less of a footgun. This +// should be easy, since OneSessionHandler trait provides the `Key` as an associated type. #2858 + impl session::Trait for Runtime { - type ConvertAccountIdToSessionKey = (); - type OnSessionChange = (Staking, grandpa::SyncedAuthorities); + type OnSessionEnding = Staking; + type SessionHandler = SessionHandlers; + type ShouldEndSession = session::PeriodicSessions; type Event = Event; + type Keys = SessionKeys; +} + +parameter_types! { + pub const SessionsPerEra: session::SessionIndex = 6; + pub const BondingDuration: staking::EraIndex = 24 * 28; } impl staking::Trait for Runtime { @@ -148,22 +161,45 @@ impl staking::Trait for Runtime { type Event = Event; type Slash = (); type Reward = (); + type SessionsPerEra = SessionsPerEra; + type BondingDuration = BondingDuration; } +const MINUTES: BlockNumber = 6; +const BUCKS: Balance = 1_000_000_000_000; + +parameter_types! { + pub const LaunchPeriod: BlockNumber = 28 * 24 * 60 * MINUTES; + pub const VotingPeriod: BlockNumber = 28 * 24 * 60 * MINUTES; + pub const EmergencyVotingPeriod: BlockNumber = 3 * 24 * 60 * MINUTES; + pub const MinimumDeposit: Balance = 100 * BUCKS; + pub const EnactmentPeriod: BlockNumber = 30 * 24 * 60 * MINUTES; + pub const CooloffPeriod: BlockNumber = 30 * 24 * 60 * MINUTES; +} impl democracy::Trait for Runtime { - type Currency = Balances; type Proposal = Call; type Event = Event; + type Currency = Balances; + type EnactmentPeriod = EnactmentPeriod; + type LaunchPeriod = LaunchPeriod; + type VotingPeriod = VotingPeriod; + type EmergencyVotingPeriod = EmergencyVotingPeriod; + type MinimumDeposit = MinimumDeposit; + type ExternalOrigin = council_motions::EnsureProportionAtLeast<_1, _2, AccountId>; + type ExternalMajorityOrigin = council_motions::EnsureProportionAtLeast<_2, _3, AccountId>; + type EmergencyOrigin = council_motions::EnsureProportionAtLeast<_1, _1, AccountId>; + type CancellationOrigin = council_motions::EnsureProportionAtLeast<_2, _3, AccountId>; + type VetoOrigin = council_motions::EnsureMember; + type CooloffPeriod = CooloffPeriod; } impl council::Trait for Runtime { type Event = Event; type BadPresentation = (); type BadReaper = (); -} - -impl council::voting::Trait for Runtime { - type Event = Event; + type BadVoterIndex = (); + type LoserCandidate = (); + type OnMembersChanged = CouncilMotions; } impl council::motions::Trait for Runtime { @@ -174,21 +210,21 @@ impl council::motions::Trait for Runtime { impl treasury::Trait for Runtime { type Currency = Balances; - type ApproveOrigin = council_motions::EnsureMembers<_4>; - type RejectOrigin = council_motions::EnsureMembers<_2>; + type ApproveOrigin = council_motions::EnsureMembers<_4, AccountId>; + type RejectOrigin = council_motions::EnsureMembers<_2, AccountId>; type Event = Event; type MintedForSpending = (); type ProposalRejection = (); } -impl contract::Trait for Runtime { +impl contracts::Trait for Runtime { type Currency = Balances; type Call = Call; type Event = Event; type Gas = u64; - type DetermineContractAddress = contract::SimpleAddressDeterminator; - type ComputeDispatchFee = contract::DefaultDispatchFeeComputor; - type TrieIdGenerator = contract::TrieIdFromParentCounter; + type DetermineContractAddress = contracts::SimpleAddressDeterminator; + type ComputeDispatchFee = contracts::DefaultDispatchFeeComputor; + type TrieIdGenerator = contracts::TrieIdFromParentCounter; type GasPayment = (); } @@ -198,38 +234,34 @@ impl sudo::Trait for Runtime { } impl grandpa::Trait for Runtime { - type SessionKey = AuthorityId; - type Log = Log; type Event = Event; } impl finality_tracker::Trait for Runtime { - type OnFinalizationStalled = grandpa::SyncedAuthorities; + type OnFinalizationStalled = Grandpa; } construct_runtime!( - pub enum Runtime with Log(InternalLog: DigestItem) where + pub enum Runtime where Block = Block, NodeBlock = node_primitives::Block, UncheckedExtrinsic = UncheckedExtrinsic { - System: system::{default, Log(ChangesTrieRoot)}, - Aura: aura::{Module, Inherent(Timestamp)}, + System: system, + Aura: aura::{Module, Config, Inherent(Timestamp)}, Timestamp: timestamp::{Module, Call, Storage, Config, Inherent}, - Consensus: consensus::{Module, Call, Storage, Config, Log(AuthoritiesChange), Inherent}, Indices: indices, Balances: balances, - Session: session, + Session: session::{Module, Call, Storage, Event, Config}, Staking: staking::{default, OfflineWorker}, Democracy: democracy, Council: council::{Module, Call, Storage, Event}, - CouncilVoting: council_voting, - CouncilMotions: council_motions::{Module, Call, Storage, Event, Origin}, + CouncilMotions: council_motions::{Module, Call, Storage, Event, Origin}, CouncilSeats: council_seats::{Config}, FinalityTracker: finality_tracker::{Module, Call, Inherent}, - Grandpa: grandpa::{Module, Call, Storage, Config, Log(), Event}, + Grandpa: grandpa::{Module, Call, Storage, Config, Event}, Treasury: treasury, - Contract: contract::{Module, Call, Storage, Config, Event}, + Contracts: contracts, Sudo: sudo, } ); @@ -237,7 +269,7 @@ construct_runtime!( /// The address format for describing accounts. pub type Address = ::Source; /// Block header type as expected by this runtime. -pub type Header = generic::Header; +pub type Header = generic::Header; /// Block type as expected by this runtime. pub type Block = generic::Block; /// A Block signed with a Justification @@ -264,10 +296,6 @@ impl_runtime_apis! { fn initialize_block(header: &::Header) { Executive::initialize_block(header) } - - fn authorities() -> Vec> { - panic!("Deprecated, please use `AuthoritiesApi`.") - } } impl client_api::Metadata for Runtime { @@ -314,45 +342,26 @@ impl_runtime_apis! { fn grandpa_pending_change(digest: &DigestFor) -> Option>> { - for log in digest.logs.iter().filter_map(|l| match l { - Log(InternalLog::grandpa(grandpa_signal)) => Some(grandpa_signal), - _ => None - }) { - if let Some(change) = Grandpa::scrape_digest_change(log) { - return Some(change); - } - } - None + Grandpa::pending_change(digest) } fn grandpa_forced_change(digest: &DigestFor) -> Option<(NumberFor, ScheduledChange>)> { - for log in digest.logs.iter().filter_map(|l| match l { - Log(InternalLog::grandpa(grandpa_signal)) => Some(grandpa_signal), - _ => None - }) { - if let Some(change) = Grandpa::scrape_digest_forced_change(log) { - return Some(change); - } - } - None + Grandpa::forced_change(digest) } - fn grandpa_authorities() -> Vec<(AuthorityId, u64)> { + fn grandpa_authorities() -> Vec<(GrandpaId, GrandpaWeight)> { Grandpa::grandpa_authorities() } } - impl consensus_aura::AuraApi for Runtime { + impl consensus_aura::AuraApi for Runtime { fn slot_duration() -> u64 { Aura::slot_duration() } - } - - impl consensus_authorities::AuthoritiesApi for Runtime { - fn authorities() -> Vec> { - Consensus::authorities() + fn authorities() -> Vec { + Aura::authorities() } } } diff --git a/node/runtime/wasm/Cargo.lock b/node/runtime/wasm/Cargo.lock index eacbe250c4723bb40240c144009d6718e28ac379..0d94d65476a5de491096e11ae71e96c52e997ab4 100644 --- a/node/runtime/wasm/Cargo.lock +++ b/node/runtime/wasm/Cargo.lock @@ -1,5 +1,10 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +[[package]] +name = "adler32" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "aes-ctr" version = "0.3.0" @@ -33,7 +38,7 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "0.6.10" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -44,12 +49,12 @@ name = "aio-limited" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -79,7 +84,7 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -87,27 +92,26 @@ name = "atty" version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "termion 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "autocfg" -version = "0.1.2" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "backtrace" -version = "0.3.14" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "backtrace-sys 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-demangle 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-demangle 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -115,19 +119,22 @@ name = "backtrace-sys" version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.30 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] -name = "base-x" -version = "0.2.4" +name = "base58" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] -name = "base58" -version = "0.1.0" +name = "base64" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] name = "bigint" @@ -179,10 +186,10 @@ dependencies = [ [[package]] name = "block-buffer" -version = "0.7.0" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "block-padding 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "block-padding 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "generic-array 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -198,7 +205,7 @@ dependencies = [ [[package]] name = "block-padding" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -209,9 +216,14 @@ name = "bs58" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "build_const" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "bumpalo" -version = "2.4.1" +version = "2.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -250,12 +262,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "cc" -version = "1.0.30" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "cfg-if" -version = "0.1.7" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -263,8 +275,8 @@ name = "chrono" version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "num-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -273,7 +285,7 @@ name = "clear_on_drop" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.30 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -289,12 +301,28 @@ name = "constant_time_eq" version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "crc" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "build_const 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "crc32fast" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "crossbeam" version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-channel 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-deque 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-epoch 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -346,7 +374,7 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-utils 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -360,7 +388,7 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -380,7 +408,7 @@ name = "crossbeam-utils" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -388,7 +416,7 @@ name = "crossbeam-utils" version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -399,7 +427,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "crunchy" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -440,14 +468,14 @@ dependencies = [ [[package]] name = "curve25519-dalek" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "digest 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "subtle 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "subtle 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -457,13 +485,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "derive_more" -version = "0.14.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -482,11 +510,6 @@ dependencies = [ "generic-array 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "discard" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "dns-parser" version = "0.8.0" @@ -502,7 +525,7 @@ version = "1.0.0-pre.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "curve25519-dalek 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "curve25519-dalek 1.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -510,7 +533,7 @@ dependencies = [ [[package]] name = "either" -version = "1.5.1" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -529,7 +552,7 @@ dependencies = [ "atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "humantime 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "termcolor 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -543,15 +566,7 @@ name = "erased-serde" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "error-chain" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "backtrace 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -559,7 +574,7 @@ name = "failure" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "backtrace 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", + "backtrace 0.3.26 (registry+https://github.com/rust-lang/crates.io-index)", "failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -568,10 +583,10 @@ name = "failure_derive" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", - "synstructure 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", + "synstructure 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -581,33 +596,33 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "fixed-hash" -version = "0.3.0" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "static_assertions 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] -name = "fnv" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "foreign-types" -version = "0.3.2" +name = "flate2" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "miniz-sys 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "miniz_oxide_c_api 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] -name = "foreign-types-shared" -version = "0.1.1" +name = "fnv" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -631,7 +646,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "futures" -version = "0.1.25" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -639,7 +654,7 @@ name = "futures-cpupool" version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -672,7 +687,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "c_linked_list 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "get_if_addrs-sys 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -682,7 +697,7 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "gcc 0.3.55 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -692,10 +707,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "hash256-std-hasher" -version = "0.12.0" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "crunchy 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "crunchy 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -717,7 +732,7 @@ name = "heapsize" version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -725,7 +740,7 @@ name = "heck" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "unicode-segmentation 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-segmentation 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -735,16 +750,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "hex-literal" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "hex-literal-impl 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal-impl 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro-hack 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "hex-literal-impl" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro-hack 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -779,6 +794,16 @@ dependencies = [ "hmac 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "http" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "httparse" version = "1.3.3" @@ -816,7 +841,15 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "impl-serde" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -829,21 +862,26 @@ name = "iovec" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "ipnet" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "itoa" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "js-sys" -version = "0.3.19" +version = "0.3.22" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -874,53 +912,51 @@ name = "lazy_static" version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "lazycell" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "libc" -version = "0.2.50" +version = "0.2.55" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "libp2p" -version = "0.7.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core-derive 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-dns 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-floodsub 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-identify 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-kad 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-mdns 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-mplex 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-noise 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-ping 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-plaintext 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-ratelimit 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-secio 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-tcp 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-uds 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-yamux 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multihash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core-derive 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-deflate 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-dns 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-floodsub 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-identify 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-kad 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-mdns 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-mplex 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-noise 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-ping 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-plaintext 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-ratelimit 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-secio 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-tcp 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-uds 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-wasm-ext 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-websocket 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-yamux 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multihash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", - "stdweb 0.4.15 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-core" -version = "0.7.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "asn1_der 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -929,64 +965,74 @@ dependencies = [ "ed25519-dalek 1.0.0-pre.1 (registry+https://github.com/rust-lang/crates.io-index)", "failure 0.1.5 (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)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libsecp256k1 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "multistream-select 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multihash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multihash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", - "rw-stream-sink 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "secp256k1 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rw-stream-sink 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "zeroize 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-core-derive" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "libp2p-deflate" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "flate2 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-dns" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-dns-unofficial 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-floodsub" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bs58 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "cuckoofilter 0.3.2 (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)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -996,28 +1042,28 @@ dependencies = [ [[package]] name = "libp2p-identify" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (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)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-kad" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1026,54 +1072,55 @@ dependencies = [ "bs58 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.12 (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)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multihash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multihash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-mdns" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "data-encoding 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "dns-parser 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-udp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-mplex" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (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)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1081,103 +1128,107 @@ dependencies = [ [[package]] name = "libp2p-noise" -version = "0.5.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "curve25519-dalek 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "curve25519-dalek 1.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", "snow 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "x25519-dalek 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "zeroize 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", + "x25519-dalek 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", + "zeroize 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-ping" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-plaintext" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-ratelimit" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "aio-limited 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-secio" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "aes-ctr 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "asn1_der 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "ctr 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "hmac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "js-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-send-wrapper 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "protobuf 2.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", - "rw-stream-sink 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "send_wrapper 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rw-stream-sink 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "twofish 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-futures 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", - "web-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-futures 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", + "web-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-tcp" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "get_if_addrs 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ipnet 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "tk-listen 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1185,26 +1236,57 @@ dependencies = [ [[package]] name = "libp2p-uds" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-uds 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "libp2p-wasm-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-send-wrapper 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-futures 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "libp2p-websocket" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "rw-stream-sink 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "soketto 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-rustls 0.10.0-alpha.3 (registry+https://github.com/rust-lang/crates.io-index)", + "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "webpki-roots 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "libp2p-yamux" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "yamux 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "yamux 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1229,12 +1311,20 @@ dependencies = [ "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "lock_api" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "log" version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1269,7 +1359,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "merlin" -version = "1.0.3" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1278,17 +1368,44 @@ dependencies = [ "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "miniz-sys" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "miniz_oxide" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "adler32 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "miniz_oxide_c_api" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", + "crc 1.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "miniz_oxide 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "mio" -version = "0.6.16" +version = "0.6.19" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1296,25 +1413,14 @@ dependencies = [ "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "mio-extras" -version = "2.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", - "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "mio-uds" version = "0.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1334,7 +1440,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1347,9 +1453,9 @@ name = "net2" version = "0.2.33" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1357,7 +1463,7 @@ name = "node-primitives" version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", "substrate-primitives 2.0.0", @@ -1372,14 +1478,13 @@ dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", "sr-version 2.0.0", "srml-aura 2.0.0", "srml-balances 2.0.0", - "srml-consensus 2.0.0", - "srml-contract 2.0.0", + "srml-contracts 2.0.0", "srml-council 2.0.0", "srml-democracy 2.0.0", "srml-executive 2.0.0", @@ -1395,7 +1500,6 @@ dependencies = [ "srml-treasury 2.0.0", "substrate-client 2.0.0", "substrate-consensus-aura-primitives 2.0.0", - "substrate-consensus-authorities 2.0.0", "substrate-keyring 2.0.0", "substrate-offchain-primitives 2.0.0", "substrate-primitives 2.0.0", @@ -1429,23 +1533,27 @@ dependencies = [ [[package]] name = "num-integer" -version = "0.1.39" +version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "num-traits" -version = "0.2.6" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] name = "num_cpus" version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1466,31 +1574,6 @@ name = "opaque-debug" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "openssl" -version = "0.10.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl-sys 0.9.42 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "openssl-sys" -version = "0.9.42" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cc 1.0.30 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", - "pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "vcpkg 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "owning_ref" version = "0.3.3" @@ -1519,7 +1602,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec-derive 3.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1527,15 +1610,15 @@ name = "parity-codec-derive" version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro-crate 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "parity-multiaddr" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1543,24 +1626,31 @@ dependencies = [ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "data-encoding 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-multihash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-multihash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "parity-multihash" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "blake2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "sha-1 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "sha3 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "parity-send-wrapper" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "parity-wasm" version = "0.31.3" @@ -1596,15 +1686,25 @@ dependencies = [ "parking_lot_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "parking_lot" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "lock_api 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot_core 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "parking_lot_core" version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1612,11 +1712,11 @@ name = "parking_lot_core" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1624,31 +1724,46 @@ name = "parking_lot_core" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "parking_lot_core" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.54 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "paste" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "paste-impl 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro-hack 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", + "paste-impl 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-hack 0.5.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "paste-impl" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro-hack 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-hack 0.5.7 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1666,28 +1781,23 @@ name = "percent-encoding" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "pkg-config" -version = "0.3.14" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "primitive-types" -version = "0.2.1" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "fixed-hash 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "fixed-hash 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "impl-codec 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "impl-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "uint 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "impl-serde 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "uint 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "proc-macro-crate" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "toml 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "toml 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1700,12 +1810,12 @@ dependencies = [ [[package]] name = "proc-macro-hack" -version = "0.5.4" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1715,7 +1825,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "proc-macro2" -version = "0.4.27" +version = "0.4.30" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1723,7 +1833,7 @@ dependencies = [ [[package]] name = "protobuf" -version = "2.4.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -1751,7 +1861,7 @@ name = "quote" version = "0.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1759,7 +1869,7 @@ name = "rand" version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1769,10 +1879,10 @@ version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1782,9 +1892,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1792,17 +1902,17 @@ name = "rand" version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand_isaac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_jitter 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_jitter 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "rand_pcg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "rand_xorshift 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1810,7 +1920,7 @@ name = "rand_chacha" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1845,12 +1955,12 @@ dependencies = [ [[package]] name = "rand_jitter" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1860,10 +1970,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1871,7 +1981,7 @@ name = "rand_pcg" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1889,7 +1999,7 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crossbeam-deque 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "either 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "either 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "rayon-core 1.4.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1900,7 +2010,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crossbeam-deque 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1914,7 +2024,7 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.1.51" +version = "0.1.54" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -1922,24 +2032,24 @@ name = "redox_termios" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.54 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "regex" -version = "1.1.2" +version = "1.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "aho-corasick 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", + "aho-corasick 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "regex-syntax 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "regex-syntax 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", "thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", "utf8-ranges 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "regex-syntax" -version = "0.6.5" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "ucd-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1950,17 +2060,17 @@ name = "ring" version = "0.14.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.30 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "spin 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "rustc-demangle" -version = "0.1.13" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -1976,19 +2086,32 @@ dependencies = [ "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "rustls" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", + "sct 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "webpki 0.19.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "rw-stream-sink" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "ryu" -version = "0.2.7" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -2001,51 +2124,38 @@ dependencies = [ [[package]] name = "schnorrkel" -version = "0.0.0" -source = "git+https://github.com/w3f/schnorrkel#3179838da9dd4896c12bb910e7c42477a3250641" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "curve25519-dalek 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "curve25519-dalek 1.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "ed25519-dalek 1.0.0-pre.1 (registry+https://github.com/rust-lang/crates.io-index)", "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "merlin 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "merlin 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sha3 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", - "subtle 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "sha3 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", + "subtle 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] -name = "schnorrkel" -version = "0.1.0" +name = "scopeguard" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "curve25519-dalek 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "ed25519-dalek 1.0.0-pre.1 (registry+https://github.com/rust-lang/crates.io-index)", - "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "merlin 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sha3 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", - "subtle 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", -] [[package]] name = "scopeguard" -version = "0.3.3" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] -name = "secp256k1" -version = "0.12.0" +name = "sct" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.30 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", + "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2068,20 +2178,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "serde" -version = "1.0.89" +version = "1.0.91" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "serde_derive" -version = "1.0.89" +version = "1.0.91" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2089,9 +2199,20 @@ name = "serde_json" version = "1.0.39" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", - "ryu 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", + "ryu 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "sha-1" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", + "digest 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "opaque-debug 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2116,7 +2237,7 @@ name = "sha2" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "block-buffer 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "digest 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "opaque-debug 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2124,10 +2245,10 @@ dependencies = [ [[package]] name = "sha3" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "block-buffer 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "digest 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "keccak 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2147,16 +2268,6 @@ dependencies = [ "erased-serde 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "slog-async" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "take_mut 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "slog-json" version = "2.3.0" @@ -2164,7 +2275,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "erased-serde 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", "slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2198,7 +2309,25 @@ dependencies = [ "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", "static_slice 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "subtle 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "subtle 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "soketto" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "http 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", + "httparse 1.3.3 (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)", + "sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2216,10 +2345,10 @@ name = "sr-api-macros" version = "2.0.0" dependencies = [ "blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro-crate 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2244,9 +2373,9 @@ version = "2.0.0" dependencies = [ "integer-sqrt 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)", - "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-std 2.0.0", "substrate-primitives 2.0.0", @@ -2260,7 +2389,7 @@ dependencies = [ "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "sr-std 2.0.0", "substrate-primitives 2.0.0", - "wasmi 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmi 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2276,7 +2405,7 @@ version = "2.0.0" dependencies = [ "impl-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", ] @@ -2286,7 +2415,7 @@ name = "srml-aura" version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", "srml-session 2.0.0", @@ -2294,7 +2423,9 @@ dependencies = [ "srml-support 2.0.0", "srml-system 2.0.0", "srml-timestamp 2.0.0", + "substrate-consensus-aura-primitives 2.0.0", "substrate-inherents 2.0.0", + "substrate-primitives 2.0.0", ] [[package]] @@ -2303,7 +2434,7 @@ version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", "srml-support 2.0.0", @@ -2312,27 +2443,13 @@ dependencies = [ ] [[package]] -name = "srml-consensus" -version = "2.0.0" -dependencies = [ - "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 2.0.0", - "sr-std 2.0.0", - "srml-support 2.0.0", - "srml-system 2.0.0", - "substrate-inherents 2.0.0", - "substrate-primitives 2.0.0", -] - -[[package]] -name = "srml-contract" +name = "srml-contracts" version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "parity-wasm 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)", "pwasm-utils 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-sandbox 2.0.0", @@ -2350,7 +2467,7 @@ version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -2366,7 +2483,7 @@ version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -2379,7 +2496,7 @@ name = "srml-executive" version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -2392,7 +2509,7 @@ name = "srml-finality-tracker" version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", "srml-support 2.0.0", @@ -2405,10 +2522,9 @@ name = "srml-grandpa" version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", - "srml-consensus 2.0.0", "srml-finality-tracker 2.0.0", "srml-session 2.0.0", "srml-support 2.0.0", @@ -2423,7 +2539,7 @@ version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -2438,7 +2554,7 @@ name = "srml-metadata" version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-std 2.0.0", "substrate-primitives 2.0.0", ] @@ -2449,10 +2565,9 @@ version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", - "srml-consensus 2.0.0", "srml-support 2.0.0", "srml-system 2.0.0", "srml-timestamp 2.0.0", @@ -2464,11 +2579,10 @@ version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", - "srml-consensus 2.0.0", "srml-session 2.0.0", "srml-support 2.0.0", "srml-system 2.0.0", @@ -2480,7 +2594,8 @@ name = "srml-sudo" version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", "srml-support 2.0.0", @@ -2495,8 +2610,8 @@ dependencies = [ "bitmask 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "once_cell 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "paste 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "paste 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -2509,31 +2624,31 @@ dependencies = [ name = "srml-support-procedural" version = "2.0.0" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", "sr-api-macros 2.0.0", "srml-support-procedural-tools 2.0.0", - "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "srml-support-procedural-tools" version = "2.0.0" dependencies = [ - "proc-macro-crate 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", "srml-support-procedural-tools-derive 2.0.0", - "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "srml-support-procedural-tools-derive" version = "2.0.0" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2542,7 +2657,7 @@ version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -2555,7 +2670,7 @@ name = "srml-timestamp" version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", "srml-support 2.0.0", @@ -2568,7 +2683,7 @@ name = "srml-treasury" version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", "srml-balances 2.0.0", @@ -2591,50 +2706,6 @@ name = "static_slice" version = "0.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "stdweb" -version = "0.4.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "discard 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "stdweb-derive 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "stdweb-internal-macros 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", - "stdweb-internal-runtime 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "stdweb-derive" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "stdweb-internal-macros" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "base-x 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", - "sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "stdweb-internal-runtime" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "stream-cipher" version = "0.3.0" @@ -2654,19 +2725,19 @@ version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-bip39" -version = "0.2.0" -source = "git+https://github.com/paritytech/substrate-bip39#a28806512c977992af8d6740d45352f5a1c832a0" +version = "0.2.1" +source = "git+https://github.com/paritytech/substrate-bip39#44307fda4ea17fe97aeb93af317fbc8f6ed34193" dependencies = [ "hmac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "pbkdf2 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "schnorrkel 0.0.0 (git+https://github.com/w3f/schnorrkel)", + "schnorrkel 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2674,15 +2745,15 @@ dependencies = [ name = "substrate-client" version = "2.0.0" dependencies = [ - "derive_more 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.14.1 (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)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", - "hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-api-macros 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", @@ -2700,21 +2771,10 @@ dependencies = [ [[package]] name = "substrate-consensus-aura-primitives" version = "2.0.0" -dependencies = [ - "sr-primitives 2.0.0", - "substrate-client 2.0.0", -] - -[[package]] -name = "substrate-consensus-authorities" -version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-io 2.0.0", "sr-primitives 2.0.0", "sr-std 2.0.0", - "sr-version 2.0.0", - "srml-support 2.0.0", "substrate-client 2.0.0", "substrate-primitives 2.0.0", ] @@ -2723,17 +2783,19 @@ dependencies = [ name = "substrate-consensus-common" version = "2.0.0" dependencies = [ - "crossbeam-channel 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", + "sr-std 2.0.0", "sr-version 2.0.0", "substrate-inherents 2.0.0", "substrate-primitives 2.0.0", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2741,12 +2803,12 @@ name = "substrate-executor" version = "2.0.0" dependencies = [ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "libsecp256k1 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 2.0.0", "sr-version 2.0.0", "substrate-panic-handler 2.0.0", @@ -2755,7 +2817,7 @@ dependencies = [ "substrate-state-machine 2.0.0", "substrate-trie 2.0.0", "tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "wasmi 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmi 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2763,6 +2825,7 @@ name = "substrate-finality-grandpa-primitives" version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", "substrate-client 2.0.0", @@ -2774,7 +2837,7 @@ name = "substrate-inherents" version = "2.0.0" dependencies = [ "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 2.0.0", "sr-std 2.0.0", ] @@ -2802,7 +2865,7 @@ dependencies = [ name = "substrate-panic-handler" version = "2.0.0" dependencies = [ - "backtrace 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", + "backtrace 0.3.26 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2815,29 +2878,30 @@ dependencies = [ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "ed25519-dalek 1.0.0-pre.1 (registry+https://github.com/rust-lang/crates.io-index)", "hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", - "hash256-std-hasher 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hash256-std-hasher 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "impl-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "primitive-types 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "primitive-types 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "schnorrkel 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "schnorrkel 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-std 2.0.0", - "substrate-bip39 0.2.0 (git+https://github.com/paritytech/substrate-bip39)", - "tiny-bip39 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "twox-hash 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "wasmi 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "substrate-bip39 0.2.1 (git+https://github.com/paritytech/substrate-bip39)", + "tiny-bip39 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "twox-hash 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmi 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-serializer" version = "2.0.0" dependencies = [ - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2847,8 +2911,9 @@ version = "2.0.0" dependencies = [ "hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-panic-handler 2.0.0", "substrate-primitives 2.0.0", "substrate-trie 2.0.0", @@ -2860,17 +2925,19 @@ dependencies = [ name = "substrate-telemetry" version = "2.0.0" dependencies = [ - "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", "slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "slog-async 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "slog-json 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "slog-scope 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "ws 0.7.9 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2893,35 +2960,30 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "subtle" -version = "2.0.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "syn" -version = "0.15.33" +version = "0.15.34" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "synstructure" -version = "0.10.1" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "take_mut" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "termcolor" version = "1.0.4" @@ -2935,9 +2997,9 @@ name = "termion" version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "numtoa 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.54 (registry+https://github.com/rust-lang/crates.io-index)", "redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2954,14 +3016,14 @@ name = "time" version = "0.1.42" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.54 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tiny-bip39" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2986,31 +3048,32 @@ name = "tk-listen" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tokio" -version = "0.1.16" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-current-thread 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-current-thread 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-fs 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-sync 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-sync 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-threadpool 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-threadpool 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-trace-core 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-udp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-uds 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3021,17 +3084,17 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tokio-current-thread" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3039,19 +3102,19 @@ name = "tokio-dns-unofficial" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tokio-executor" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3059,9 +3122,9 @@ name = "tokio-fs" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-threadpool 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-threadpool 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3070,7 +3133,7 @@ version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3080,25 +3143,38 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-sync 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-sync 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-rustls" +version = "0.10.0-alpha.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rustls 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "webpki 0.19.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tokio-sync" -version = "0.1.3" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "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)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3107,38 +3183,46 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tokio-threadpool" -version = "0.1.12" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crossbeam-deque 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-queue 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tokio-timer" -version = "0.2.10" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-trace-core" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3147,9 +3231,9 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3161,11 +3245,11 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", "mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3174,10 +3258,10 @@ dependencies = [ [[package]] name = "toml" -version = "0.4.10" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3212,7 +3296,7 @@ dependencies = [ [[package]] name = "twox-hash" -version = "1.2.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3230,11 +3314,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "uint" -version = "0.6.1" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "crunchy 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "crunchy 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3257,7 +3341,7 @@ dependencies = [ [[package]] name = "unicode-segmentation" -version = "1.2.1" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -3294,11 +3378,6 @@ name = "utf8-ranges" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "vcpkg" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "version_check" version = "0.1.5" @@ -3311,85 +3390,97 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "wasm-bindgen" -version = "0.2.42" +version = "0.2.45" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "wasm-bindgen-macro 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-macro 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.42" +version = "0.2.45" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bumpalo 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bumpalo 2.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-shared 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-shared 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-futures" -version = "0.3.19" +version = "0.3.22" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "js-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.42" +version = "0.2.45" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-macro-support 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-macro-support 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.42" +version = "0.2.45" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-backend 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-shared 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-backend 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-shared 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.42" +version = "0.2.45" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "wasm-bindgen-webidl" -version = "0.2.42" +version = "0.2.45" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-backend 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", - "weedle 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-backend 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", + "weedle 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "wasm-timer" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", + "send_wrapper 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", + "web-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasmi" -version = "0.4.3" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "memory_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-wasm 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmi-validation 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3403,20 +3494,38 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.19" +version = "0.3.22" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "env_logger 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "js-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", "sourcefile 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-webidl 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-webidl 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "webpki" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", + "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "webpki-roots" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "webpki 0.19.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "weedle" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "nom 4.2.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3429,7 +3538,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "winapi" -version = "0.3.6" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3451,7 +3560,7 @@ name = "winapi-util" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3464,28 +3573,10 @@ name = "wincolor" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", "winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "ws" -version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "httparse 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", - "mio-extras 2.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl 0.10.19 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "ws2_32-sys" version = "0.2.1" @@ -3497,21 +3588,21 @@ dependencies = [ [[package]] name = "x25519-dalek" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "curve25519-dalek 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "curve25519-dalek 1.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "yamux" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "nohash-hasher 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3526,45 +3617,68 @@ name = "zeroize" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "zeroize" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "zeroize_derive 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "zeroize_derive" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)", + "synstructure 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + [metadata] +"checksum adler32 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7e522997b529f05601e05166c07ed17789691f562762c7f3b987263d2dedee5c" "checksum aes-ctr 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d2e5b0458ea3beae0d1d8c0f3946564f8e10f90646cf78c06b4351052058d1ee" "checksum aes-soft 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cfd7e7ae3f9a1fb5c03b389fc6bb9a51400d0c13053f0dca698c832bfd893a0d" "checksum aesni 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2f70a6b5f971e473091ab7cfb5ffac6cde81666c4556751d8d5620ead8abf100" -"checksum aho-corasick 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)" = "81ce3d38065e618af2d7b77e10c5ad9a069859b4be3c2250f674af3840d9c8a5" +"checksum aho-corasick 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e6f484ae0c99fec2e858eb6134949117399f222608d84cadb3f58c1f97c2364c" "checksum aio-limited 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7f10b352bc3fc08ae24dc5d2d3ddcac153678533986122dc283d747b12071000" "checksum arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "0d382e583f07208808f6b1249e60848879ba3543f57c32277bf52d69c2f0f0ee" "checksum arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "92c7fb76bc8826a8b33b4ee5bb07a247a81e76764ab4d55e8f73e3a4d8808c71" "checksum asn1_der 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9893d63fc3b1c44231e667da6836a33f27d8b6b3bdc82f83da5dfd579d1b6528" "checksum asn1_der_derive 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9e7f92edafad155aff997fa5b727c6429b91e996b5a5d62a2b0adbae1306b5fe" "checksum atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "9a7d5b8723950951411ee34d271d99dddcc2035a16ab25310ea2c8cfd4369652" -"checksum autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a6d640bee2da49f60a4068a7fae53acde8982514ab7bae8b8cea9e88cbcfd799" -"checksum backtrace 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)" = "cd5a90e2b463010cd0e0ce9a11d4a9d5d58d9f41d4a6ba3dcaf9e68b466e88b4" +"checksum autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "0e49efa51329a5fd37e7c79db4621af617cd4e3e5bc224939808d076077077bf" +"checksum backtrace 0.3.26 (registry+https://github.com/rust-lang/crates.io-index)" = "1a13fc43f04daf08ab4f71e3d27e1fc27fc437d3e95ac0063a796d92fb40f39b" "checksum backtrace-sys 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)" = "797c830ac25ccc92a7f8a7b9862bde440715531514594a6154e3d4a54dd769b6" -"checksum base-x 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "d55aa264e822dbafa12db4d54767aff17c6ba55ea2d8559b3e17392c7d000e5d" "checksum base58 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5024ee8015f02155eee35c711107ddd9a9bf3cb689cf2a9089c97e79b6e1ae83" +"checksum base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b25d992356d2eb0ed82172f5248873db5560c4721f564b13cb5193bda5e668e" "checksum bigint 4.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ebecac13b3c745150d7b6c3ea7572d372f09d627c2077e893bf26c5c7f70d282" "checksum bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "228047a76f468627ca71776ecdebd732a3423081fcf5125585bcd7c49886ce12" "checksum bitmask 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5da9b3d9f6f585199287a473f4f8dfab6566cf827d15c00c219f53c645687ead" "checksum blake2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "91721a6330935673395a0607df4d49a9cb90ae12d259f1b3e0a3f6e1d486872e" "checksum blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "5d6d530bdd2d52966a6d03b7a964add7ae1a288d25214066fd4b600f0f796400" "checksum block-buffer 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1339a1042f5d9f295737ad4d9a6ab6bf81c84a933dba110b9200cd6d1448b814" -"checksum block-buffer 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "49665c62e0e700857531fa5d3763e91b539ff1abeebd56808d378b495870d60d" +"checksum block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" "checksum block-cipher-trait 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1c924d49bd09e7c06003acda26cd9742e796e34282ec6c1189404dee0c1f4774" -"checksum block-padding 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d75255892aeb580d3c566f213a2b6fdc1c66667839f45719ee1d30ebf2aea591" +"checksum block-padding 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "6d4dc3af3ee2e12f3e5d224e5e1e3d73668abbeb69e566d361f7d5563a4fdf09" "checksum bs58 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0de79cfb98e7aa9988188784d8664b4b5dad6eaaa0863b91d9a4ed871d4f7a42" -"checksum bumpalo 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4639720be048090544634e0402490838995ccdc9d2fe648f528f30d3c33ae71f" +"checksum build_const 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "39092a32794787acd8525ee150305ff051b0aa6cc2abaf193924f5ab05425f39" +"checksum bumpalo 2.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "84dca3afd8e01b9526818b7963e5b4916063b3cdf9f10cf6b73ef0bd0ec37aa5" "checksum byte-tools 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "560c32574a12a89ecd91f5e742165893f86e3ab98d21f8ea548658eb9eef5f40" "checksum byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" "checksum byteorder 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "0fc10e8cc6b2580fda3f36eb6dc5316657f812a3df879a44a66fc9f0fdbc4855" "checksum byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a019b10a2a7cdeb292db131fc8113e57ea2a908f6e7894b0c3c671893b65dbeb" "checksum bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)" = "206fdffcfa2df7cbe15601ef46c813fce0965eb3286db6b56c583b814b51c81c" "checksum c_linked_list 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4964518bd3b4a8190e832886cdc0da9794f12e8e6c1613a9e90ff331c4c8724b" -"checksum cc 1.0.30 (registry+https://github.com/rust-lang/crates.io-index)" = "d01c69d08ff207f231f07196e30f84c70f1c815b04f980f8b7b01ff01f05eb92" -"checksum cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "11d43355396e872eefb45ce6342e4374ed7bc2b3a502d1b28e36d6e23c05d1f4" +"checksum cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)" = "39f75544d7bbaf57560d2168f28fd649ff9c76153874db88bdbdfd839b1a7e7d" +"checksum cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "b486ce3ccf7ffd79fdeb678eac06a9e6c09fc88d33836340becb8fffe87c5e33" "checksum chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "45912881121cb26fad7c38c17ba7daa18764771836b34fab7d3fbd93ed633878" "checksum clear_on_drop 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "97276801e127ffb46b66ce23f35cc96bd454fa311294bced4bbace7baa8b1d17" "checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" "checksum constant_time_eq 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8ff012e225ce166d4422e0e78419d901719760f62ae2b7969ca6b564d1b54a9e" +"checksum crc 1.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d663548de7f5cca343f1e0a48d14dcfb0e9eb4e079ec58883b7251539fa10aeb" +"checksum crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ba125de2af0df55319f41944744ad91c71113bf74a4646efff39afe1f6842db1" "checksum crossbeam 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ad4c7ea749d9fb09e23c5cb17e3b70650860553a0e2744e38446b1803bf7db94" "checksum crossbeam-channel 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "0f0ed1a4de2235cabda8558ff5840bffb97fcb64c97827f354a451307df5f72b" "checksum crossbeam-deque 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f739f8c5363aca78cfb059edf753d8f0d36908c348f3d8d1503f03d8b75d9cf3" @@ -3576,36 +3690,33 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum crossbeam-utils 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2760899e32a1d58d5abb31129f8fae5de75220bc2176e77ff7c627ae45c918d9" "checksum crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "f8306fcef4a7b563b76b7dd949ca48f52bc1141aa067d2ea09565f3e2652aa5c" "checksum crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "a2f4a431c5c9f662e1200b7c7f02c34e91361150e382089a8f2dec3ba680cbda" -"checksum crunchy 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c240f247c278fa08a6d4820a6a222bfc6e0d999e51ba67be94f44c905b2161f2" +"checksum crunchy 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" "checksum crypto-mac 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "779015233ac67d65098614aec748ac1c756ab6677fa2e14cf8b37c08dfed1198" "checksum crypto-mac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4434400df11d95d556bac068ddfedd482915eb18fe8bea89bc80b6e4b1c179e5" "checksum ctr 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "022cd691704491df67d25d006fe8eca083098253c4d43516c2206479c58c6736" "checksum cuckoofilter 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8dd43f7cfaffe0a386636a10baea2ee05cc50df3b77bea4a456c9572a939bf1f" -"checksum curve25519-dalek 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e1f8a6fc0376eb52dc18af94915cc04dfdf8353746c0e8c550ae683a0815e5c1" +"checksum curve25519-dalek 1.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "750226d75fc2f5a8daec6e7477624e258674023eb73d8d647f63b943ca182a4a" "checksum data-encoding 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f4f47ca1860a761136924ddd2422ba77b2ea54fe8cc75b9040804a0d9d32ad97" -"checksum derive_more 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fbe9f11be34f800b3ecaaed0ec9ec2e015d1d0ba0c8644c1310f73d6e8994615" +"checksum derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6d944ac6003ed268757ef1ee686753b57efc5fcf0ebe7b64c9fc81e7e32ff839" "checksum digest 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e5b29bf156f3f4b3c4f610a25ff69370616ae6e0657d416de22645483e72af0a" "checksum digest 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "05f47366984d3ad862010e22c7ce81a7dbcaebbdfb37241a620f8b6596ee135c" -"checksum discard 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "212d0f5754cb6769937f4501cc0e67f4f4483c8d2c3e1e922ee9edbe4ab4c7c0" "checksum dns-parser 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c4d33be9473d06f75f58220f71f7a9317aca647dc061dbd3c361b0bef505fbea" "checksum ed25519-dalek 1.0.0-pre.1 (registry+https://github.com/rust-lang/crates.io-index)" = "81956bcf7ef761fb4e1d88de3fa181358a0d26cbcb9755b587a08f9119824b86" -"checksum either 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c67353c641dc847124ea1902d69bd753dee9bb3beff9aa3662ecf86c971d1fac" +"checksum either 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5527cfe0d098f36e3f8839852688e63c8fff1c90b2b405aef730615f9a7bcf7b" "checksum elastic-array 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)" = "073be79b6538296faf81c631872676600616073817dd9a440c477ad09b408983" "checksum env_logger 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b61fa891024a945da30a9581546e8cfaf5602c7b3f4c137a2805cf388f92075a" "checksum environmental 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5c7464757b80de8930c91c9afe77ddce501826bf9d134a87db2c67d9dc177e2c" "checksum erased-serde 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "3beee4bc16478a1b26f2e80ad819a52d24745e292f521a63c16eea5f74b7eb60" -"checksum error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "07e791d3be96241c77c43846b665ef1384606da2cd2a48730abe606a12906e02" "checksum failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "795bd83d3abeb9220f257e597aa0080a508b27533824adf336529648f6abf7e2" "checksum failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "ea1063915fd7ef4309e222a5a07cf9c319fb9c7836b1f89b85458672dbb127e1" "checksum fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" -"checksum fixed-hash 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a557e80084b05c32b455963ff565a9de6f2866da023d6671705c6aff6f65e01c" +"checksum fixed-hash 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d1a683d1234507e4f3bf2736eeddf0de1dc65996dc0164d57eba0a74bcf29489" +"checksum flate2 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)" = "f87e68aa82b2de08a6e037f1385455759df6e445a8df5e005b4297191dbf18aa" "checksum fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2fad85553e09a6f881f739c29f0b00b0f01357c743266d478b68951ce23285f3" -"checksum foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -"checksum foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" "checksum fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" "checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" "checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" -"checksum futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)" = "49e7653e374fe0d0c12de4250f0bdb60680b8c80eed558c5c7538eec9c89e21b" +"checksum futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)" = "a2037ec1c6c1c4f79557762eab1f7eae1f64f6cb418ace90fae88f0942b60139" "checksum futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "ab90cde24b3319636588d0c35fe03b1333857621051837ed769faefb4c2162e4" "checksum gcc 0.3.55 (registry+https://github.com/rust-lang/crates.io-index)" = "8f5f3913fa0bfe7ee1fd8248b6b9f42a5af4b9d65ec2dd2c3c26132b950ecfc2" "checksum generic-array 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3c0f28c2f5bfb5960175af447a2da7c18900693738343dc896ffbcabd9839592" @@ -3613,60 +3724,68 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum get_if_addrs 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "abddb55a898d32925f3148bd281174a68eeb68bbfd9a5938a57b18f506ee4ef7" "checksum get_if_addrs-sys 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0d04f9fb746cf36b191c00f3ede8bde9c8e64f9f4b05ae2694a9ccf5e3f5ab48" "checksum hash-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ba7fb417e5c470acdd61068c79767d0e65962e70836cf6c9dfd2409f06345ce0" -"checksum hash256-std-hasher 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1224388a21c88a80ae7087a2a245ca6d80acc97a9186b75789fb3eeefd0609af" +"checksum hash256-std-hasher 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f8b2027c19ec91eb304999abae7307d225cf93be42af53b0039f76e98ed5af86" "checksum hashbrown 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3bae29b6653b3412c2e71e9d486db9f9df5d701941d86683005efb9f2d28e3da" "checksum hashmap_core 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "8e04cb7a5051270ef3fa79f8c7604d581ecfa73d520e74f554e45541c4b5881a" "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" "checksum hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "805026a5d0141ffc30abb3be3173848ad46a1b1664fe632428479619a3644d77" -"checksum hex-literal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "27455ce8b4a6666c87220e4b59c9a83995476bdadc10197905e61dbe906e36fa" -"checksum hex-literal-impl 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1d340b6514f232f6db1bd16db65302a5278a04fef9ce867cb932e7e5fa21130a" +"checksum hex-literal 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "ddc2928beef125e519d69ae1baa8c37ea2e0d3848545217f6db0179c5eb1d639" +"checksum hex-literal-impl 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "520870c3213943eb8d7803e80180d12a6c7ceb4ae74602544529d1643dc4ddda" "checksum hmac 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7a13f4163aa0c5ca1be584aace0e2212b2e41be5478218d4f657f5f778b2ae2a" "checksum hmac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f127a908633569f208325f86f71255d3363c79721d7f9fe31cd5569908819771" "checksum hmac-drbg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4fe727d41d2eec0a6574d887914347e5ff96a3b87177817e2a9820c5c87fecc2" +"checksum http 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)" = "eed324f0f0daf6ec10c474f150505af2c143f251722bf9dbd1261bd1f2ee2c1a" "checksum httparse 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e8734b0cfd3bc3e101ec59100e101c2eecd19282202e87808b3037b442777a83" "checksum humantime 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3ca7e5f2e110db35f93b837c81797f3714500b81d517bf20c431b16d3ca4f114" "checksum idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e" "checksum impl-codec 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d2050d823639fbeae26b2b5ba09aca8907793117324858070ade0673c49f793b" "checksum impl-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5158079de9d4158e0ce1de3ae0bd7be03904efc40b3d7dd8b8c301cbf6b52b56" +"checksum impl-serde 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7d26be4b97d738552ea423f76c4f681012ff06c3fa36fa968656b3679f60b4a1" "checksum integer-sqrt 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ea155abb3ba6f382a75f1418988c05fe82959ed9ce727de427f9cfd425b0c903" "checksum iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dbe6e417e7d0975db6512b90796e8ce223145ac4e33c377e4a42882a0e88bb08" -"checksum itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1306f3464951f30e30d12373d31c79fbd52d236e5e896fd92f96ec7babbbe60b" -"checksum js-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)" = "3c994fd445b81741d77f6bcd227d6ed645b95b35a2ecfd2050767450ff1c0b6d" +"checksum ipnet 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e61c2da0d0f700c77d2d313dbf4f93e41d235fa12c6681fee06621036df4c2af" +"checksum itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "501266b7edd0174f8530248f87f99c88fbe60ca4ef3dd486835b8d8d53136f7f" +"checksum js-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "9987e7c13a91d9cf0efe59cca48a3a7a70e2b11695d5a4640f85ae71e28f5e73" "checksum keccak 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" "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 lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bc5729f27f159ddd61f4df6228e827e86643d4d3e7c32183cb30a1c08f604a14" -"checksum lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b294d6fa9ee409a054354afc4352b0b9ef7ca222c69b8812cbea9e7d2bf3783f" -"checksum libc 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)" = "aab692d7759f5cd8c859e169db98ae5b52c924add2af5fbbca11d12fefb567c1" -"checksum libp2p 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0231edab431064b30b7749484a39735eb36492cef4658c372c9059e58c3003aa" -"checksum libp2p-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d1a3bad2ed26297112847678683dd221473a0d44297250b61f004e1b35e72493" -"checksum libp2p-core-derive 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3f765f103b680cbed910b02bfdbdcfce5b1142899c93e51acb960bf59b6f81b1" -"checksum libp2p-dns 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4b129d20cc8cbb6ce5da8361045649c024659173e246c5dfbf20ae06071c046a" -"checksum libp2p-floodsub 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "70d68816b8435d6788399416eb2f0a6974fb1d15c4be5c30141f87c8e81746df" -"checksum libp2p-identify 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "718ca645a065fd70855ca6042a7df686c24cd21add750c37a82c811fbd1e5c43" -"checksum libp2p-kad 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bbe27c623a6a720efd5d704347838972062f89149a9c3cd149748da60bdcd3e0" -"checksum libp2p-mdns 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c9bc1a5d85f4812cae6367b49a432763fe28997bac7c530dc55b70ec18a78aa7" -"checksum libp2p-mplex 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fe5a858342a1cc89464474f7edc4bae1da649b9c823a3e04d9fb494493601746" -"checksum libp2p-noise 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc6b5185c50a52a12e7bbe2ee7799059e24de4e52ab25edbfd26c8ab8515d317" -"checksum libp2p-ping 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7905c1431ad115bee83405770629a27d6f17153ad02ec9670a7347998ef20e22" -"checksum libp2p-plaintext 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cc17626763ded57da8fed73187c2d9f6ebb89d30838673c430315bf560c7e4db" -"checksum libp2p-ratelimit 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2409d08b809ab1a74269597f7da2829d117cc11b9ed3343af33fc20831619726" -"checksum libp2p-secio 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "258cdc6742945c8f6402997bbbf36733588e2db18e5a0014da6d46e3ccfb92cf" -"checksum libp2p-tcp 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1b5691e2ba2720d42bd1e93d6b90239fa9235c1956ef6a5f1dd499a7ae2767be" -"checksum libp2p-uds 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c9ab0b9ca050105fd94229c48911c0c84aef4d6b86a53d1b6df81d938354e47e" -"checksum libp2p-yamux 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5e6ff51a5b2056bacee1c9f2ed8455cdf3c5c619261ddb4efc783119130aaf52" +"checksum libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)" = "42914d39aad277d9e176efbdad68acb1d5443ab65afe0e0e4f0d49352a950880" +"checksum libp2p 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6abde4e6fc777dc06ae2a15202ddedb1a38d7c71ed16bc10fa704b03f73aec37" +"checksum libp2p-core 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b4ceb4791289534d4c1ad8e4bd3c6f06d3670efa55ce71482951a287df93ddd1" +"checksum libp2p-core-derive 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "851a59dcaab66c96777ae0cace96de88a700243c3b8360ab51c7e093f3727066" +"checksum libp2p-deflate 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "902b44e92e1f8b7e697b3a186d15c841e0e38037f14286513207a5407650a635" +"checksum libp2p-dns 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "71a6630a84552b39e5f752e1f6a951d31f3211079465d2e7af73491b6f48fc3f" +"checksum libp2p-floodsub 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9fced4da0c31e0dc8a759472c65fab41db40c01de2d93bc45e1431c13f0564f0" +"checksum libp2p-identify 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1ba5e882d72c71cdf77f45ab68dd715451d3b78a23085f8d385c7a31ec1b4272" +"checksum libp2p-kad 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d71966dbbb4cedcfcdb1d4c87d5dbb6f3f07b465d1ca74f2624256669997d1f2" +"checksum libp2p-mdns 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cdbdaea6f0049cc09ba5db00308f5b93105a8a33b65ba2e36bd35da707850ea2" +"checksum libp2p-mplex 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b351bfd67e97154e7b60f62402237671486c8a89f83eabdb6838f37d4d5f006" +"checksum libp2p-noise 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "44324032b2f9260d2b862c741d79d250dc02298dbba56354a992528a826ee2d5" +"checksum libp2p-ping 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e1ac43ffd01de4210cf1b969bbb55a008c77f9ec22b74df26a6590bb6bd4c93f" +"checksum libp2p-plaintext 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0506e10770bcbcb59f2a6154ce93c8fd5cb9730b6ceb5aa1463164af1fd0b9c6" +"checksum libp2p-ratelimit 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3886b79a35c0348497bab763517a9a2b4965173f4b4c7438d59f1e4dcf5122ff" +"checksum libp2p-secio 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b811272e5cd86d39bd71fb94687025d9802b13daf0998ebe0d3f2885c636c51a" +"checksum libp2p-tcp 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b2c54cb75f17557de6ce0149aa03e729455e2d240f84d854272bc4b11012a324" +"checksum libp2p-uds 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fbedf4a1e72a5f67523915414e9e12d71d128731873f0f24d8b878398fb47aa4" +"checksum libp2p-wasm-ext 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d0c1f615b56aa2a6f4ec07bf9667be9fff8877b9c5bd5335601af47490eda341" +"checksum libp2p-websocket 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a0d1bfe60577558f48a9fdf9f35c0ee2dc5baa01f685ff847d3b5cf4f12ee135" +"checksum libp2p-yamux 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bf4bfc7ff127cd622502dbe56f10513dd6776b970e33d8ebb6e367f0752324f6" "checksum libsecp256k1 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "688e8d65e495567c2c35ea0001b26b9debf0b4ea11f8cccc954233b75fc3428a" "checksum lock_api 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "62ebf1391f6acad60e5c8b43706dde4582df75c06698ab44511d15016bc2442c" +"checksum lock_api 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ed946d4529956a20f2d63ebe1b69996d5a2137c91913fe3ebbeff957f5bca7ff" "checksum log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c84ec4b527950aa83a329754b01dbe3f58361d1c5efacd1f6d68c494d08a17c6" "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.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7623b01a4f1b7acb7cf8e3f678f05e15e6ae26cb0b738dfeb5cc186fd6b82ef4" "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" -"checksum mio-extras 2.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "46e73a04c2fa6250b8d802134d56d554a9ec2922bf977777c805ea5def61ce40" +"checksum merlin 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8c39467de91b004f5b9c06fac5bbc8e7d28309a205ee66905166b70804a71fea" +"checksum miniz-sys 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "1e9e3ae51cea1576ceba0dde3d484d30e6e5b86dee0b2d412fe3a16a15c98202" +"checksum miniz_oxide 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c468f2369f07d651a5d0bb2c9079f8488a66d5466efe42d0c5c6466edcb7f71e" +"checksum miniz_oxide_c_api 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b7fe927a42e3807ef71defb191dc87d4e24479b221e67015fe38ae2b7b447bab" +"checksum mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)" = "83f51996a3ed004ef184e16818edc51fadffe8e7ca68be67f9dee67d84d0ff23" "checksum mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)" = "966257a94e196b11bb43aca423754d87429960a768de9414f3691d6957abf125" "checksum miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919" "checksum multistream-select 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f989d40aab0ed0d83c1cdb4856b5790e980b96548d1a921f280e985eb049f38d" @@ -3674,40 +3793,40 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum nodrop 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "2f9667ddcc6cc8a43afc9b7917599d7216aa09c463919ea32c59ed6cac8bc945" "checksum nohash-hasher 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0d138afcce92d219ccb6eb53d9b1e8a96ac0d633cfd3c53cd9856d96d1741bb8" "checksum nom 4.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2ad2a91a8e869eeb30b9cb3119ae87773a8f4ae617f41b1eb9c154b2905f7bd6" -"checksum num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)" = "e83d528d2677f0518c570baf2b7abdcf0cd2d248860b68507bdcb3e91d4c0cea" -"checksum num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0b3a5d7cc97d6d30d8b9bc8fa19bf45349ffe46241e8816f50f62f6d6aaabee1" +"checksum num-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)" = "b85e541ef8255f6cf42bbfe4ef361305c6c135d10919ecc26126c4e5ae94bc09" +"checksum num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "6ba9a427cfca2be13aa6f6403b0b7e7368fe982bfa16fccc450ce74c46cd9b32" "checksum num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1a23f0ed30a54abaa0c7e83b1d2d87ada7c3c23078d1d87815af3e3b6385fbba" "checksum numtoa 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b8f8bdf33df195859076e54ab11ee78a1b208382d3a26ec40d142ffc1ecc49ef" "checksum once_cell 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "532c29a261168a45ce28948f9537ddd7a5dd272cc513b3017b1e82a88f962c37" "checksum opaque-debug 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "93f5bb2e8e8dec81642920ccff6b61f1eb94fa3020c5a325c9851ff604152409" -"checksum openssl 0.10.19 (registry+https://github.com/rust-lang/crates.io-index)" = "84321fb9004c3bce5611188a644d6171f895fa2889d155927d528782edb21c5d" -"checksum openssl-sys 0.9.42 (registry+https://github.com/rust-lang/crates.io-index)" = "cb534d752bf98cf363b473950659ac2546517f9c6be9723771614ab3f03bbc9e" "checksum owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cdf84f41639e037b484f93433aa3897863b561ed65c6e59c7073d7c561710f37" "checksum owning_ref 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "49a4b8ea2179e6a2e27411d3bca09ca6dd630821cf6894c6c7c8467a8ee7ef13" "checksum parity-bytes 0.1.0 (git+https://github.com/paritytech/parity-common?rev=b0317f649ab2c665b7987b8475878fc4d2e1f81d)" = "" "checksum parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dcb43c05fb71c03b4ea7327bf15694da1e0f23f19d5b1e95bab6c6d74097e336" "checksum parity-codec-derive 3.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "00a486fd383382ddcb2de928364b1f82571c1e48274fc43b7667a4738ee4056c" -"checksum parity-multiaddr 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "18a130a727008cfcd1068a28439fe939897ccad28664422aeca65b384d6de6d0" -"checksum parity-multihash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3e8eab0287ccde7821e337a124dc5a4f1d6e4c25d10cc91e3f9361615dd95076" +"checksum parity-multiaddr 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "045b3c7af871285146300da35b1932bb6e4639b66c7c98e85d06a32cbc4e8fa7" +"checksum parity-multihash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05d6a68e07ab34a9e87bd8dd4936f6bb5be21e4f6dbcdbaf04d8e854eba0af01" +"checksum parity-send-wrapper 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aa9777aa91b8ad9dd5aaa04a9b6bcb02c7f1deb952fca5a66034d5e63afc5c6f" "checksum parity-wasm 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)" = "511379a8194230c2395d2f5fa627a5a7e108a9f976656ce723ae68fca4097bfc" "checksum parking_lot 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d4d05f1349491390b1730afba60bb20d55761bef489a954546b58b4b34e1e2ac" "checksum parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f0802bff09003b291ba756dc7e79313e51cc31667e94afbe847def490424cde5" "checksum parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ab41b4aed082705d1056416ae4468b6ea99d52599ecf3169b00088d43113e337" +"checksum parking_lot 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fa7767817701cce701d5585b9c4db3cdd02086398322c1d7e8bf5094a96a2ce7" "checksum parking_lot_core 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "4db1a8ccf734a7bce794cc19b3df06ed87ab2f3907036b693c68f56b4d4537fa" "checksum parking_lot_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ad7f7e6ebdc79edff6fdcb87a55b620174f7a989e3eb31b65231f4af57f00b8c" "checksum parking_lot_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "94c8c7923936b28d546dfd14d4472eaf34c99b14e1c973a32b3e6d4eb04298c9" -"checksum paste 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f50392d1265092fbee9273414cc40eb6d47d307bd66222c477bb8450c8504f9d" -"checksum paste-impl 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "a3cd512fe3a55e8933b2dcad913e365639db86d512e4004c3084b86864d9467a" +"checksum parking_lot_core 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cb88cb1cb3790baa6776844f968fea3be44956cf184fa1be5a03341f5491278c" +"checksum paste 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "1f4a4a1c555c6505821f9d58b8779d0f630a6b7e4e1be24ba718610acf01fa79" +"checksum paste-impl 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "26e796e623b8b257215f27e6c80a5478856cae305f5b59810ff9acdaa34570e6" "checksum pbkdf2 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "006c038a43a45995a9670da19e67600114740e8511d4333bf97a56e66a7542d9" "checksum percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" -"checksum pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)" = "676e8eb2b1b4c9043511a9b7bea0915320d7e502b0a079fb03f9635a5252b18c" -"checksum primitive-types 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "edb92f1ebfc177432c03287b15d48c202e6e2c95993a7af3ba039abb43b1492e" -"checksum proc-macro-crate 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4c6cf4e5b00300d151dfffae39f529dfa5188f42eeb14201229aa420d6aad10c" +"checksum primitive-types 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "6e8612a8dc70f26276fed6131c153ca277cf275ee0a5e2a50cd8a69c697beb8f" +"checksum proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "e10d4b51f154c8a7fb96fd6dad097cb74b863943ec010ac94b9fd1be8861fe1e" "checksum proc-macro-hack 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2c725b36c99df7af7bf9324e9c999b9e37d92c8f8caf106d82e1d7953218d2d8" -"checksum proc-macro-hack 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "3e90aa19cd73dedc2d0e1e8407473f073d735fef0ab521438de6da8ee449ab66" +"checksum proc-macro-hack 0.5.7 (registry+https://github.com/rust-lang/crates.io-index)" = "0c1dd4172a1e1f96f709341418f49b11ea6c2d95d53dca08c0f74cbd332d9cf3" "checksum proc-macro-hack-impl 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2b753ad9ed99dd8efeaa7d2fb8453c8f6bc3e54b97966d35f1bc77ca6865254a" -"checksum proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)" = "4d317f9caece796be1980837fd5cb3dfec5613ebdb04ad0956deea83ce168915" -"checksum protobuf 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "24d5d73d2b88fddb8b8141f2730d950d88772c940ac4f8f3e93230b9a99d92df" +"checksum proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)" = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" +"checksum protobuf 2.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a151c11a92df0059d6ab446fafa3b21a1210aad4bc2293e1c946e8132b10db01" "checksum pwasm-utils 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "efb0dcbddbb600f47a7098d33762a00552c671992171637f5bb310b37fe1f0e4" "checksum quick-error 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "5fb6ccf8db7bbcb9c2eae558db5ab4f3da1c2a87e4e597ed394726bc8ea6ca1d" "checksum quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9274b940887ce9addde99c4eee6b5c44cc494b182b97e73dc8ffdcb3397fd3f0" @@ -3721,123 +3840,125 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d0e7a549d590831370895ab7ba4ea0c1b6b011d106b5ff2da6eee112615e6dc0" "checksum rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4" "checksum rand_isaac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08" -"checksum rand_jitter 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7b9ea758282efe12823e0d952ddb269d2e1897227e464919a554f2a03ef1b832" +"checksum rand_jitter 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "1166d5c91dc97b88d1decc3285bb0a99ed84b05cfd0bc2341bdf2d43fc41e39b" "checksum rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7b75f676a1e053fc562eafbb47838d67c84801e38fc1ba459e8f180deabd5071" "checksum rand_pcg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "abf9b09b01790cfe0364f52bf32995ea3c39f4d2dd011eac241d2914146d0b44" "checksum rand_xorshift 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cbf7e9e623549b0e21f6e97cf8ecf247c1a8fd2e8a992ae265314300b2455d5c" "checksum rayon 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "373814f27745b2686b350dd261bfd24576a6fb0e2c5919b3a2b6005f820b0473" "checksum rayon-core 1.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b055d1e92aba6877574d8fe604a63c8b5df60f60e5982bf7ccbb1338ea527356" "checksum rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" -"checksum redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)" = "423e376fffca3dfa06c9e9790a9ccd282fafb3cc6e6397d01dbf64f9bacc6b85" +"checksum redox_syscall 0.1.54 (registry+https://github.com/rust-lang/crates.io-index)" = "12229c14a0f65c4f1cb046a3b52047cdd9da1f4b30f8a39c5063c8bae515e252" "checksum redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76" -"checksum regex 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "53ee8cfdddb2e0291adfb9f13d31d3bbe0a03c9a402c01b1e24188d86c35b24f" -"checksum regex-syntax 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "8c2f35eedad5295fdf00a63d7d4b238135723f92b434ec06774dad15c7ab0861" +"checksum regex 1.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "8f0a0bcab2fd7d1d7c54fa9eae6f43eddeb9ce2e7352f8518a814a4f65d60c58" +"checksum regex-syntax 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)" = "dcfd8681eebe297b81d98498869d4aae052137651ad7b96822f09ceb690d0a96" "checksum ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)" = "426bc186e3e95cac1e4a4be125a4aca7e84c2d616ffc02244eef36e2a60a093c" -"checksum rustc-demangle 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "adacaae16d02b6ec37fdc7acfcddf365978de76d1983d3ee22afc260e1ca9619" +"checksum rustc-demangle 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)" = "a7f4dccf6f4891ebcc0c39f9b6eb1a83b9bf5d747cb439ec6fba4f3b977038af" "checksum rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "403bb3a286107a04825a5f82e1270acc1e14028d3d554d7a1e08914549575ab8" "checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" -"checksum rw-stream-sink 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d548a40fe17c3a77d54b82457b79fcc9b8a288d509ca20fbf5aa1dac386d22d6" -"checksum ryu 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "eb9e9b8cde282a9fe6a42dd4681319bfb63f121b8a8ee9439c6f4107e58a46f7" +"checksum rustls 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f271e3552cd835fa28c541c34a7e8fdd8cdff09d77fe4eb8f6c42e87a11b096e" +"checksum rw-stream-sink 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2f9cbe61c20455d3015b2bb7be39e1872310283b8e5a52f5b242b0ac7581fe78" +"checksum ryu 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "b96a9549dc8d48f2c283938303c4b5a77aa29bfbc5b54b084fb1630408899a8f" "checksum safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7f7bf422d23a88c16d5090d455f182bc99c60af4df6a345c63428acf5129e347" -"checksum schnorrkel 0.0.0 (git+https://github.com/w3f/schnorrkel)" = "" -"checksum schnorrkel 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a700659388785588c75b197cecda0f23c7112a9281ef703e8ffc651061ce014c" +"checksum schnorrkel 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b5eff518f9bed3d803a0d002af0ab96339b0ebbedde3bec98a684986134b7a39" "checksum scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "94258f53601af11e6a49f722422f6e3425c52b06245a5cf9bc09908b174f5e27" -"checksum secp256k1 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4070f3906e65249228094cf97b04a90799fba04468190bbbcfa812309cf86e32" +"checksum scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b42e15e59b18a828bbf5c58ea01debb36b9b096346de35d941dcb89009f24a0d" +"checksum sct 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2f5adf8fbd58e1b1b52699dc8bed2630faecb6d8c7bee77d009d6bbe4af569b9" "checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" "checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" "checksum send_wrapper 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a0eddf2e8f50ced781f288c19f18621fa72a3779e3cb58dbf23b07469b0abeb4" -"checksum serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)" = "92514fb95f900c9b5126e32d020f5c6d40564c27a5ea6d1d7d9f157a96623560" -"checksum serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)" = "bb6eabf4b5914e88e24eea240bb7c9f9a2cbc1bbbe8d961d381975ec3c6b806c" +"checksum serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)" = "a72e9b96fa45ce22a4bc23da3858dfccfd60acd28a25bcd328a98fdd6bea43fd" +"checksum serde_derive 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)" = "101b495b109a3e3ca8c4cbe44cf62391527cdfb6ba15821c5ce80bcd5ea23f9f" "checksum serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)" = "5a23aa71d4a4d43fdbfaac00eff68ba8a06a51759a89ac3304323e800c4dd40d" +"checksum sha-1 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "23962131a91661d643c98940b20fcaffe62d776a823247be80a48fcb8b6fce68" "checksum sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d" "checksum sha2 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7d963c78ce367df26d7ea8b8cc655c651b42e8a1e584e869c1e17dae3ccb116a" "checksum sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b4d8bfd0e469f417657573d8451fb33d16cfe0989359b93baf3a1ffc639543d" -"checksum sha3 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "34a5e54083ce2b934bf059fdf38e7330a154177e029ab6c4e18638f2f624053a" +"checksum sha3 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dd26bc0e7a2e3a7c959bc494caf58b72ee0c71d67704e9520f736ca7e4853ecf" "checksum slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" "checksum slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1e1a2eec401952cd7b12a84ea120e2d57281329940c3f93c2bf04f462539508e" -"checksum slog-async 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e544d16c6b230d84c866662fe55e31aacfca6ae71e6fc49ae9a311cb379bfc2f" "checksum slog-json 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ddc0d2aff1f8f325ef660d9a0eb6e6dcd20b30b3f581a5897f58bf42d061c37a" "checksum slog-scope 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "60c04b4726fa04595ccf2c2dad7bcd15474242c4c5e109a8a376e8a2c9b1539a" "checksum smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)" = "c4488ae950c49d403731982257768f48fada354a5203fe81f9bb6f43ca9002be" "checksum snow 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5a64f02fd208ef15bd2d1a65861df4707e416151e1272d02c8faafad1c138100" +"checksum soketto 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8cf3ae22c0bce5437c7dce6a2b00e492c19da1feb21ad64a7b6fd7058438c3f2" "checksum sourcefile 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4bf77cb82ba8453b42b6ae1d692e4cdc92f9a47beaf89a847c8be83f4e328ad3" "checksum spin 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "44363f6f51401c34e7be73db0db371c04705d35efbe9f7d6082e03a921a32c55" "checksum stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dba1a27d3efae4351c8051072d619e3ade2820635c3958d826bfea39d59b54c8" "checksum static_assertions 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "c19be23126415861cb3a23e501d34a708f7f9b2183c5252d690941c2e69199d5" "checksum static_slice 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "92a7e0c5e3dfb52e8fbe0e63a1b947bbb17b4036408b151353c4491374931362" -"checksum stdweb 0.4.15 (registry+https://github.com/rust-lang/crates.io-index)" = "a3edad410e603184d656e2abded5fd4d3d6e93d5763d21130dbaf99795db74eb" -"checksum stdweb-derive 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0e21ebd9179de08f2300a65454268a17ea3de204627458588c84319c4def3930" -"checksum stdweb-internal-macros 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "1635afd059cbfac7d5b1274f0c44cec110c1e013c48e8bbc22e07e52696cf887" -"checksum stdweb-internal-runtime 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a2a2f4a2eb556337b2d1a302630bbddf989ae383c70393e89b48152b9896cbda" "checksum stream-cipher 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8861bc80f649f5b4c9bd38b696ae9af74499d479dbfb327f0607de6b326a36bc" "checksum strum 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1810e25f576e7ffce1ff5243b37066da5ded0310b3274c20baaeccb1145b2806" "checksum strum_macros 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "572a2f4e53dd4c3483fd79e5cc10ddd773a3acb1169bbfe8762365e107110579" -"checksum substrate-bip39 0.2.0 (git+https://github.com/paritytech/substrate-bip39)" = "" +"checksum substrate-bip39 0.2.1 (git+https://github.com/paritytech/substrate-bip39)" = "" "checksum subtle 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2d67a5a62ba6e01cb2192ff309324cb4875d0c451d55fe2319433abe7a05a8ee" -"checksum subtle 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "702662512f3ddeb74a64ce2fbbf3707ee1b6bb663d28bb054e0779bbc720d926" -"checksum syn 0.15.33 (registry+https://github.com/rust-lang/crates.io-index)" = "ec52cd796e5f01d0067225a5392e70084acc4c0013fa71d55166d38a8b307836" -"checksum synstructure 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "73687139bf99285483c96ac0add482c3776528beac1d97d444f6e91f203a2015" -"checksum take_mut 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f764005d11ee5f36500a149ace24e00e3da98b0158b3e2d53a7495660d3f4d60" +"checksum subtle 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "01dca13cf6c3b179864ab3292bd794e757618d35a7766b7c46050c614ba00829" +"checksum syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)" = "a1393e4a97a19c01e900df2aec855a29f71cf02c402e2f443b8d2747c25c5dbe" +"checksum synstructure 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)" = "02353edf96d6e4dc81aea2d8490a7e9db177bf8acb0e951c24940bf866cb313f" "checksum termcolor 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4096add70612622289f2fdcdbd5086dc81c1e2675e6ae58d6c4f62a16c6d7f2f" "checksum termion 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dde0593aeb8d47accea5392b39350015b5eccb12c0d98044d856983d89548dea" "checksum thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b" "checksum time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "db8dcfca086c1143c9270ac42a2bbd8a7ee477b78ac8e45b19abfb0cbede4b6f" -"checksum tiny-bip39 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f5388a470627f97a01a6e13389ced797a42b1611f9de7e0f6ca705675ac55297" +"checksum tiny-bip39 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c1c5676413eaeb1ea35300a0224416f57abc3bd251657e0fafc12c47ff98c060" "checksum tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e9175261fbdb60781fcd388a4d6cc7e14764a2b629a7ad94abb439aed223a44f" "checksum tk-listen 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5462b0f968c0457efe38fcd2df7e487096b992419e4f5337b06775a614bbda4b" -"checksum tokio 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "fcaabb3cec70485d0df6e9454fe514393ad1c4070dee8915f11041e95630b230" +"checksum tokio 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)" = "94a1f9396aec29d31bb16c24d155cfa144d1af91c40740125db3131bdaf76da8" "checksum tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5c501eceaf96f0e1793cf26beb63da3d11c738c4a943fdf3746d81d64684c39f" -"checksum tokio-current-thread 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "c756b04680eea21902a46fca4e9f410a2332c04995af590e07ff262e2193a9a3" +"checksum tokio-current-thread 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "d16217cad7f1b840c5a97dfb3c43b0c871fef423a6e8d2118c604e843662a443" "checksum tokio-dns-unofficial 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "82c65483db54eb91b4ef3a9389a3364558590faf30ce473141707c0e16fda975" -"checksum tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "30c6dbf2d1ad1de300b393910e8a3aa272b724a400b6531da03eed99e329fbf0" +"checksum tokio-executor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "83ea44c6c0773cc034771693711c35c677b4b5a4b21b9e7071704c54de7d555e" "checksum tokio-fs 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "3fe6dc22b08d6993916647d108a1a7d15b9cd29c4f4496c62b92c45b5041b7af" "checksum tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "5090db468dad16e1a7a54c8c67280c5e4b544f3d3e018f0b913b400261f85926" "checksum tokio-reactor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "6af16bfac7e112bea8b0442542161bfc41cbfa4466b580bdda7d18cb88b911ce" -"checksum tokio-sync 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1bf2b9dac2a0509b5cfd1df5aa25eafacb616a42a491a13604d6bbeab4486363" +"checksum tokio-rustls 0.10.0-alpha.3 (registry+https://github.com/rust-lang/crates.io-index)" = "316fdbc899efec48b3b492bd0f339e6d81c4ee96a409257572147ec341943452" +"checksum tokio-sync 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "5b2f843ffdf8d6e1f90bddd48da43f99ab071660cd92b7ec560ef3cdfd7a409a" "checksum tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1d14b10654be682ac43efee27401d792507e30fd8d26389e1da3b185de2e4119" -"checksum tokio-threadpool 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "742e511f6ce2298aeb86fc9ea0d8df81c2388c6ebae3dc8a7316e8c9df0df801" -"checksum tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)" = "2910970404ba6fa78c5539126a9ae2045d62e3713041e447f695f41405a120c6" +"checksum tokio-threadpool 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "72558af20be886ea124595ea0f806dd5703b8958e4705429dd58b3d8231f72f2" +"checksum tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "f2106812d500ed25a4f38235b9cae8f78a09edf43203e16e59c3b769a342a60e" +"checksum tokio-trace-core 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "350c9edade9830dc185ae48ba45667a445ab59f6167ef6d0254ec9d2430d9dd3" "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 toml 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b8c96d7873fa7ef8bdeb3a9cda3ac48389b4154f32b9803b4bc26220b677b039" "checksum trie-db 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1ba73747fd3a64ab531274c04cb588dfa9d30d972d62990831e63fbce2cfec59" "checksum trie-root 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "cfa2e20c4f1418ac2e71ddc418e35e1b56e34022e2146209ffdbf1b2de8b1bd9" "checksum twofish 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712d261e83e727c8e2dbb75dacac67c36e35db36a958ee504f2164fc052434e1" -"checksum twox-hash 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "09871da9f15424236082e0b220fd404a4eb6bebc7205c67653701229234ac64c" +"checksum twox-hash 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6c7bcecad121018bdcd6b709fa2325b004878fcb3d3067934ce90749f0faff9a" "checksum typenum 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "612d636f949607bdf9b123b4a6f6d966dedf3ff669f7f045890d3a4a73948169" "checksum ucd-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "535c204ee4d8434478593480b8f86ab45ec9aae0e83c568ca81abf0fd0e88f86" -"checksum uint 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e7780bb27fd8a22295e0d9d53ae3be253f715a0dccb1808527f478f1c2603708" +"checksum uint 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2143cded94692b156c356508d92888acc824db5bffc0b4089732264c6fcf86d4" "checksum unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" "checksum unicode-normalization 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "141339a08b982d942be2ca06ff8b076563cbe223d1befd5450716790d44e2426" -"checksum unicode-segmentation 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "aa6024fc12ddfd1c6dbc14a80fa2324d4568849869b779f6bd37e5e4c03344d1" +"checksum unicode-segmentation 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1967f4cdfc355b37fd76d2a954fb2ed3871034eb4f26d60537d88795cfc332a9" "checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" "checksum unsigned-varint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2c64cdf40b4a9645534a943668681bcb219faf51874d4b65d2e0abda1b10a2ab" "checksum untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "55cd1f4b4e96b46aeb8d4855db4a7a9bd96eeeb5c6a1ab54593328761642ce2f" "checksum url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a" "checksum utf8-ranges 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "796f7e48bef87609f7ade7e06495a87d5cd06c7866e6a5cbfceffc558a243737" -"checksum vcpkg 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "def296d3eb3b12371b2c7d0e83bfe1403e4db2d7a0bba324a12b21c4ee13143d" "checksum version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd" "checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" -"checksum wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "ffde3534e5fa6fd936e3260cd62cd644b8656320e369388f9303c955895e35d4" -"checksum wasm-bindgen-backend 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "40c0543374a7ae881cdc5d32d19de28d1d1929e92263ffa7e31712cc2d53f9f1" -"checksum wasm-bindgen-futures 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)" = "0ad171fc1f6e43f97d155d27f4ee5657bd8aa5cce7c497ef3a0a0c5b44618b2d" -"checksum wasm-bindgen-macro 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "f914c94c2c5f4c9364510ca2429e59c92157ec89429243bcc245e983db990a71" -"checksum wasm-bindgen-macro-support 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "9168c413491e4233db7b6884f09a43beb00c14d11d947ffd165242daa48a2385" -"checksum wasm-bindgen-shared 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "326c32126e1a157b6ced7400061a84ac5b11182b2cda6edad7314eb3ae9ac9fe" -"checksum wasm-bindgen-webidl 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "613dbf4d7d3bf10aeb212b35de14a8ef07222c26526d4f931061a83fc9e2a851" -"checksum wasmi 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "21ef487a11df1ed468cf613c78798c26282da5c30e9d49f824872d4c77b47d1d" +"checksum wasm-bindgen 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)" = "b7ccc7b93cfd13e26700a9e2e41e6305f1951b87e166599069f77d10358100e6" +"checksum wasm-bindgen-backend 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)" = "1953f91b1608eb1522513623c7739f047bb0fed4128ce51a93f08e12cc314645" +"checksum wasm-bindgen-futures 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "fa1af11c73eca3dc8c51c76ea475a4416e912da6402064a49fc6c0214701866d" +"checksum wasm-bindgen-macro 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)" = "0f69da5696545d7ca6607a2e4b1a0edf5a6b36b2c49dbb0f1df6ad1d92884047" +"checksum wasm-bindgen-macro-support 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)" = "2d4246f3bc73223bbb846f4f2430a60725826a96c9389adf715ed1d5af46dec6" +"checksum wasm-bindgen-shared 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)" = "c08381e07e7a79e5e229ad7c60d15833d19033542cc5dd91d085df59d235f4a6" +"checksum wasm-bindgen-webidl 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)" = "1f42ff7adb8102bf5ad8adbc45b1635c520c8175f9fdf6eb2c54479d485d435a" +"checksum wasm-timer 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ad9ac33c834103916e373d648adf65f58c83fb3d8a0f3e6b9a64bca7253a4dca" +"checksum wasmi 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "aebbaef470840d157a5c47c8c49f024da7b1b80e90ff729ca982b2b80447e78b" "checksum wasmi-validation 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ab380192444b3e8522ae79c0a1976e42a82920916ccdfbce3def89f456ea33f3" -"checksum web-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)" = "24129e4be2281109b3e15a328d3d7f233ee232a5405f75ba1e9bb59a25ebc4d4" -"checksum weedle 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "26a4c67f132386d965390b8a734d5d10adbcd30eb5cc74bd9229af8b83f10044" +"checksum web-sys 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "540b8259eb242ff3a566fa0140bda03a4ece4e5c226e1284b5c95dddcd4341f6" +"checksum webpki 0.19.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4f7e1cd7900a3a6b65a3e8780c51a3e6b59c0e2c55c6dc69578c288d69f7d082" +"checksum webpki-roots 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c10fa4212003ba19a564f25cd8ab572c6791f99a03cc219c13ed35ccab00de0e" +"checksum weedle 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bcc44aa200daee8b1f3a004beaf16554369746f1b4486f0cf93b0caf8a3c2d1e" "checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" -"checksum winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "92c1eb33641e276cfa214a0522acad57be5c56b10cb348b3c5117db75f3ac4b0" +"checksum winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "f10e386af2b13e47c89e7236a7a14a086791a2b88ebad6df9bf42040195cf770" "checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" "checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" "checksum winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7168bab6e1daee33b4557efd0e95d5ca70a03706d39fa5f3fe7a236f584b03c9" "checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" "checksum wincolor 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "561ed901ae465d6185fa7864d63fbd5720d0ef718366c9a4dc83cf6170d7e9ba" -"checksum ws 0.7.9 (registry+https://github.com/rust-lang/crates.io-index)" = "329d3e6dd450a9c5c73024e1047f0be7e24121a68484eb0b5368977bee3cf8c3" "checksum ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" -"checksum x25519-dalek 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4aca1ba6bec2719576bd20dfe5b24d9359552e616d10bff257e50cd85f745d17" -"checksum yamux 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ae9073f5dbc901abb0b2ec4f866e726fed2f54953bdf81f8a5fde7762b7cc3b3" +"checksum x25519-dalek 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7ee1585dc1484373cbc1cee7aafda26634665cf449436fd6e24bfd1fad230538" +"checksum yamux 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "01bd67889938c48f0049fc60a77341039e6c3eaf16cb7693e6ead7c0ba701295" "checksum zeroize 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8ddfeb6eee2fb3b262ef6e0898a52b7563bb8e0d5955a313b3cf2f808246ea14" +"checksum zeroize 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b60a6c572b91d8ecb0a460950d84fe5b40699edd07d65f73789b31237afc8f66" +"checksum zeroize_derive 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9dac4b660d969bff9c3fe1847a891cacaa8b21dd5f2aae6e0a3e0975aea96431" diff --git a/node/runtime/wasm/build.sh b/node/runtime/wasm/build.sh index f0b7c961bda7b9253fb8054ba01059afa1c04e9c..4a81e47f9ee843943de032c4177c8b693f6e92d5 100755 --- a/node/runtime/wasm/build.sh +++ b/node/runtime/wasm/build.sh @@ -6,7 +6,7 @@ if cargo --version | grep -q "nightly"; then else CARGO_CMD="cargo +nightly" fi -CARGO_INCREMENTAL=0 RUSTFLAGS="-C link-arg=--export-table" $CARGO_CMD build --target=wasm32-unknown-unknown --release +CARGO_INCREMENTAL=0 RUSTFLAGS="-C link-arg=--export-table" $CARGO_CMD build --target=wasm32-unknown-unknown --release "$@" for i in node_runtime do wasm-gc target/wasm32-unknown-unknown/release/$i.wasm target/wasm32-unknown-unknown/release/$i.compact.wasm diff --git a/node/src/main.rs b/node/src/main.rs index 5ff0d7ff3b0e68fae90eca12154bd1409d866d80..15b603e7a2706abe220785213169ea02273520f6 100644 --- a/node/src/main.rs +++ b/node/src/main.rs @@ -43,9 +43,7 @@ impl cli::IntoExit for Exit { } } -error_chain::quick_main!(run); - -fn run() -> cli::error::Result<()> { +fn main() { let version = VersionInfo { name: "Substrate Node", commit: env!("VERGEN_SHA_SHORT"), @@ -55,5 +53,9 @@ fn run() -> cli::error::Result<()> { description: "Generic substrate node", support_url: "https://github.com/paritytech/substrate/issues/new", }; - cli::run(::std::env::args(), Exit, version) + + if let Err(e) = cli::run(::std::env::args(), Exit, version) { + eprintln!("Error starting the node: {}\n\n{:?}", e, e); + std::process::exit(1) + } } diff --git a/scripts/build.sh b/scripts/build.sh index 46bc74b7a94f6bd2159c8dee3fcd40f72e935eef..d79ebe52301e5e0d764eff3203a0feda2b09c771 100755 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -19,7 +19,7 @@ do echo "*** Building wasm binaries in $SRC" cd "$PROJECT_ROOT/$SRC" - ./build.sh + ./build.sh "$@" cd - >> /dev/null done diff --git a/scripts/docker/Dockerfile b/scripts/docker/Dockerfile index 6ad477664441705ed7a6c716eda40fb28263524e..2bdf49e2fcec22240420837b001018bdb9ffe79d 100644 --- a/scripts/docker/Dockerfile +++ b/scripts/docker/Dockerfile @@ -1,24 +1,39 @@ FROM debian:stretch-slim -LABEL maintainer "devops-team@parity.io" -LABEL description="Substrate: The platform for blockchain innovators" -RUN apt-get update && \ - DEBIAN_FRONTEND=noninteractive apt-get upgrade -y && \ - DEBIAN_FRONTEND=noninteractive apt-get install -y \ - libssl1.1 \ - ca-certificates \ - curl && \ - apt-get autoremove -y && \ - apt-get clean && \ - find /var/lib/apt/lists/ -type f -not -name lock -delete +# metadata +ARG VCS_REF +ARG BUILD_DATE -COPY ./substrate /usr/local/bin +LABEL io.parity.image.authors="devops-team@parity.io" \ + io.parity.image.vendor="Parity Technologies" \ + io.parity.image.title="parity/substrate" \ + io.parity.image.description="Substrate: The platform for blockchain innovators." \ + io.parity.image.source="https://github.com/paritytech/substrate/blob/${VCS_REF}/scripts/docker/Dockerfile" \ + io.parity.image.revision="${VCS_REF}" \ + io.parity.image.created="${BUILD_DATE}" \ + io.parity.image.documentation="https://wiki.parity.io/Parity-Substrate" +# show backtraces +ENV RUST_BACKTRACE 1 -RUN useradd -m -u 1000 -U -s /bin/sh -d /substrate substrate -USER substrate +# install tools and dependencies +RUN apt-get update && \ + DEBIAN_FRONTEND=noninteractive apt-get upgrade -y && \ + DEBIAN_FRONTEND=noninteractive apt-get install -y \ + libssl1.1 \ + ca-certificates \ + curl && \ +# apt cleanup + apt-get autoremove -y && \ + apt-get clean && \ + find /var/lib/apt/lists/ -type f -not -name lock -delete; \ +# add user + useradd -m -u 1000 -U -s /bin/sh -d /substrate substrate + +# add substrate binary to docker image +COPY ./substrate /usr/local/bin -ENV RUST_BACKTRACE 1 +USER substrate # check if executable works in this container RUN /usr/local/bin/substrate --version diff --git a/scripts/flamingfir-deploy.sh b/scripts/flamingfir-deploy.sh new file mode 100755 index 0000000000000000000000000000000000000000..13be56dfbd2f5bb77143ee2df1a71cb55819d30b --- /dev/null +++ b/scripts/flamingfir-deploy.sh @@ -0,0 +1,35 @@ +#!/bin/bash + +RETRY_COUNT=10 +RETRY_ATTEMPT=0 +SLEEP_TIME=15 +TARGET_HOST="$1" +COMMIT=$(cat artifacts/VERSION) +DOWNLOAD_URL="https://releases.parity.io/substrate/x86_64-debian:stretch/${COMMIT}/substrate" +POST_DATA='{"extra_vars":{"artifact_path":"'${DOWNLOAD_URL}'","target_host":"'${TARGET_HOST}'"}}' + +JOB_ID=$(wget -O - --header "Authorization: Bearer ${AWX_TOKEN}" --header "Content-type: application/json" --post-data "${POST_DATA}" https://ansible-awx.parity.io/api/v2/job_templates/32/launch/ | jq .job) + +echo "Launched job: $JOB_ID" + + +while [ ${RETRY_ATTEMPT} -le ${RETRY_COUNT} ] ; do + export RETRY_RESULT=$(wget -O - --header "Authorization: Bearer ${AWX_TOKEN}" https://ansible-awx.parity.io/api/v2/jobs/${JOB_ID}/ | jq .status) + RETRY_ATTEMPT=$(( $RETRY_ATTEMPT +1 )) + sleep $SLEEP_TIME + if [ $(echo $RETRY_RESULT | egrep -e successful -e failed) ] ; then + break + fi +done + +AWX_OUTPUT=$(wget -O - --header "Authorization: Bearer ${AWX_TOKEN}" https://ansible-awx.parity.io/api/v2/jobs/${JOB_ID}/stdout?format=txt_download) + +echo "AWX job log:" +echo "${AWX_OUTPUT}" + + +JOB_STATUS=$(wget -O - --header "Authorization: Bearer ${AWX_TOKEN}" https://ansible-awx.parity.io/api/v2/jobs/${JOB_ID}/ | jq .status ) + +echo "===================================" +echo -e "Ansible AWX Remote Job: ${JOB_ID} \x1B[31mStatus: ${JOB_STATUS}\x1B[0m" +echo "===================================" diff --git a/scripts/gitlab/check_line_width.sh b/scripts/gitlab/check_line_width.sh new file mode 100755 index 0000000000000000000000000000000000000000..f382d630b183c6396115cc1e76e77dfab4c20047 --- /dev/null +++ b/scripts/gitlab/check_line_width.sh @@ -0,0 +1,52 @@ +#!/bin/sh +# +# check if line width of rust source files is not beyond x characters +# + + +BASE_BRANCH="origin/master" +LINE_WIDTH="121" +GOOD_LINE_WIDTH="101" + + +git diff --name-only ${BASE_BRANCH}...${CI_COMMIT_SHA} \*.rs | ( while read file +do + if [ ! -f ${file} ]; + then + echo "Skipping removed file." + elif git diff ${BASE_BRANCH}...${CI_COMMIT_SHA} ${file} | grep -q "^+.\{${LINE_WIDTH}\}" + then + if [ -z "${FAIL}" ] + then + echo "| warning!" + echo "| Lines should not be longer than 120 characters." + echo "| " + echo "| see more https://wiki.parity.io/Substrate-Style-Guide" + echo "|" + FAIL="true" + fi + echo "| file: ${file}" + git diff ${BASE_BRANCH}...${CI_COMMIT_SHA} ${file} \ + | grep -n "^+.\{${LINE_WIDTH}\}" + echo "|" + else + if git diff ${BASE_BRANCH}...${CI_COMMIT_SHA} ${file} | grep -q "^+.\{${GOOD_LINE_WIDTH}\}" + then + if [ -z "${FAIL}" ] + then + echo "| warning!" + echo "| Lines should be longer than 100 characters only in exceptional circumstances!" + echo "| " + echo "| see more https://wiki.parity.io/Substrate-Style-Guide" + echo "|" + fi + echo "| file: ${file}" + git diff ${BASE_BRANCH}...${CI_COMMIT_SHA} ${file} \ + | grep -n "^+.\{${LINE_WIDTH}\}" + echo "|" + fi + fi +done + +test -z "${FAIL}" +) diff --git a/scripts/update-deps.sh b/scripts/update-deps.sh new file mode 100755 index 0000000000000000000000000000000000000000..cd6b7c853825ed42a0b55d32018b81207a3d1642 --- /dev/null +++ b/scripts/update-deps.sh @@ -0,0 +1,9 @@ +#!/bin/sh -- +set -eu +case $0 in + (/*) dir=${0%/*}/;; + (*/*) dir=./${0%/*};; + (*) dir=.;; +esac + +find "$dir/.." -name Cargo.lock -execdir cargo update \; diff --git a/scripts/update.sh b/scripts/update.sh index cbf81b57cd5c6c255189fc7b541b43ffb3ca8316..a264fab43df306a2384aa15ae8e3a41faf7e33b0 100755 --- a/scripts/update.sh +++ b/scripts/update.sh @@ -20,7 +20,7 @@ do cd "$PROJECT_ROOT/$SRC" cargo update - ./build.sh + ./build.sh "$@" cd - >> /dev/null done diff --git a/srml/assets/src/lib.rs b/srml/assets/src/lib.rs index 3f7c1b3efc15310aefb1a53a60d49b532846337f..d563db3b14146eb01bd22a937e10867a03c17ee2 100644 --- a/srml/assets/src/lib.rs +++ b/srml/assets/src/lib.rs @@ -33,7 +33,8 @@ //! //! ### Terminology //! -//! * **Asset issuance:** The creation of a new asset, whose total supply will belong to the account that issues the asset. +//! * **Asset issuance:** The creation of a new asset, whose total supply will belong to the +//! account that issues the asset. //! * **Asset transfer:** The action of transferring assets from one account to another. //! * **Asset destruction:** The process of an account removing its entire holding of an asset. //! * **Fungible asset:** An asset whose units are interchangeable. @@ -45,7 +46,8 @@ //! //! * Issue a unique asset to its creator's account. //! * Move assets between accounts. -//! * Remove an account's balance of an asset when requested by that account's owner and update the asset's total supply. +//! * Remove an account's balance of an asset when requested by that account's owner and update +//! the asset's total supply. //! //! ## Interface //! @@ -112,6 +114,14 @@ //! } //! ``` //! +//! ## Assumptions +//! +//! Below are assumptions that must be held when using this module. If any of +//! them are violated, the behavior of this module is undefined. +//! +//! * The total count of assets should be less than +//! `Trait::AssetId::max_value()`. +//! //! ## Related Modules //! //! * [`System`](../srml_system/index.html) @@ -123,6 +133,7 @@ use srml_support::{StorageValue, StorageMap, Parameter, decl_module, decl_event, decl_storage, ensure}; use primitives::traits::{Member, SimpleArithmetic, Zero, StaticLookup}; use system::ensure_signed; +use primitives::traits::One; /// The module configuration trait. pub trait Trait: system::Trait { @@ -131,9 +142,10 @@ pub trait Trait: system::Trait { /// The units in which we record balances. type Balance: Member + Parameter + SimpleArithmetic + Default + Copy; -} -type AssetId = u32; + /// The arithmetic type of asset identifier. + type AssetId: Parameter + SimpleArithmetic + Default + Copy; +} decl_module! { pub struct Module for enum Call where origin: T::Origin { @@ -145,7 +157,7 @@ decl_module! { let origin = ensure_signed(origin)?; let id = Self::next_asset_id(); - >::mutate(|id| *id += 1); + >::mutate(|id| *id += One::one()); >::insert((id, origin.clone()), total); >::insert(id, total); @@ -155,7 +167,7 @@ decl_module! { /// Move some assets from one holder to another. fn transfer(origin, - #[compact] id: AssetId, + #[compact] id: T::AssetId, target: ::Source, #[compact] amount: T::Balance ) { @@ -172,7 +184,7 @@ decl_module! { } /// Destroy any assets of `id` owned by `origin`. - fn destroy(origin, #[compact] id: AssetId) { + fn destroy(origin, #[compact] id: T::AssetId) { let origin = ensure_signed(origin)?; let balance = >::take((id, origin.clone())); ensure!(!balance.is_zero(), "origin balance should be non-zero"); @@ -184,7 +196,10 @@ decl_module! { } decl_event!( - pub enum Event where ::AccountId, ::Balance { + pub enum Event + where ::AccountId, + ::Balance, + ::AssetId { /// Some assets were issued. Issued(AssetId, AccountId, Balance), /// Some assets were transferred. @@ -197,11 +212,11 @@ decl_event!( decl_storage! { trait Store for Module as Assets { /// The number of units of assets held by any given account. - Balances: map (AssetId, T::AccountId) => T::Balance; + Balances: map (T::AssetId, T::AccountId) => T::Balance; /// The next asset identifier up for grabs. - NextAssetId get(next_asset_id): AssetId; + NextAssetId get(next_asset_id): T::AssetId; /// The total unit supply of an asset. - TotalSupply: map AssetId => T::Balance; + TotalSupply: map T::AssetId => T::Balance; } } @@ -210,12 +225,12 @@ impl Module { // Public immutables /// Get the asset `id` balance of `who`. - pub fn balance(id: AssetId, who: T::AccountId) -> T::Balance { + pub fn balance(id: T::AssetId, who: T::AccountId) -> T::Balance { >::get((id, who)) } /// Get the total supply of an asset `id`. - pub fn total_supply(id: AssetId) -> T::Balance { + pub fn total_supply(id: T::AssetId) -> T::Balance { >::get(id) } } @@ -232,7 +247,7 @@ mod tests { use primitives::{ BuildStorage, traits::{BlakeTwo256, IdentityLookup}, - testing::{Digest, DigestItem, Header} + testing::Header }; impl_outer_origin! { @@ -250,16 +265,15 @@ mod tests { type BlockNumber = u64; type Hash = H256; type Hashing = BlakeTwo256; - type Digest = Digest; type AccountId = u64; type Lookup = IdentityLookup; type Header = Header; type Event = (); - type Log = DigestItem; } impl Trait for Test { type Event = (); type Balance = u64; + type AssetId = u32; } type Assets = Module; diff --git a/srml/aura/Cargo.toml b/srml/aura/Cargo.toml index 6a437ce71acaedc41173fa4eafdc7ef94cea2c2f..5624df7be6c54f6b90effeb4b2f7ea10b375c90f 100644 --- a/srml/aura/Cargo.toml +++ b/srml/aura/Cargo.toml @@ -10,18 +10,18 @@ serde = { version = "1.0", optional = true } inherents = { package = "substrate-inherents", path = "../../core/inherents", default-features = false } rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } primitives = { package = "sr-primitives", path = "../../core/sr-primitives", default-features = false } +substrate-primitives = { path = "../../core/primitives", default-features = false } srml-support = { path = "../support", default-features = false } system = { package = "srml-system", path = "../system", default-features = false } timestamp = { package = "srml-timestamp", path = "../timestamp", default-features = false } staking = { package = "srml-staking", path = "../staking", default-features = false } session = { package = "srml-session", path = "../session", default-features = false } +substrate-consensus-aura-primitives = { path = "../../core/consensus/aura/primitives", default-features = false} [dev-dependencies] lazy_static = "1.0" -parking_lot = "0.7.1" -substrate-primitives = { path = "../../core/primitives" } +parking_lot = "0.8.0" runtime_io = { package = "sr-io", path = "../../core/sr-io" } -consensus = { package = "srml-consensus", path = "../consensus" } [features] default = ["std"] @@ -31,8 +31,10 @@ std = [ "rstd/std", "srml-support/std", "primitives/std", + "substrate-primitives/std", "system/std", "timestamp/std", "staking/std", "inherents/std", + "substrate-consensus-aura-primitives/std", ] diff --git a/srml/aura/src/lib.rs b/srml/aura/src/lib.rs index e5eb3674cdf6b2e09783cbe97c3ad3c6c7551b3b..43f2da88af8000571631d501b6e3a41a52e928ab 100644 --- a/srml/aura/src/lib.rs +++ b/srml/aura/src/lib.rs @@ -51,16 +51,18 @@ pub use timestamp; use rstd::{result, prelude::*}; -use srml_support::storage::StorageValue; -use srml_support::{decl_storage, decl_module}; -use primitives::traits::{As, Zero}; +use parity_codec::Encode; +use srml_support::{decl_storage, decl_module, Parameter, storage::StorageValue}; +use primitives::{traits::{SaturatedConversion, Saturating, Zero, One, Member}, generic::DigestItem}; use timestamp::OnTimestampSet; #[cfg(feature = "std")] use timestamp::TimestampInherentData; -use parity_codec::{Encode, Decode}; use inherents::{RuntimeString, InherentIdentifier, InherentData, ProvideInherent, MakeFatalError}; #[cfg(feature = "std")] use inherents::{InherentDataProviders, ProvideInherentData}; +use substrate_consensus_aura_primitives::{AURA_ENGINE_ID, ConsensusLog}; +#[cfg(feature = "std")] +use parity_codec::Decode; mod mock; mod tests; @@ -149,12 +151,18 @@ impl HandleReport for () { pub trait Trait: timestamp::Trait { /// The logic for handling reports. type HandleReport: HandleReport; + + /// The identifier type for an authority. + type AuthorityId: Member + Parameter + Default; } decl_storage! { trait Store for Module as Aura { /// The last timestamp. - LastTimestamp get(last) build(|_| T::Moment::sa(0)): T::Moment; + LastTimestamp get(last) build(|_| 0.into()): T::Moment; + + /// The current authorities + pub Authorities get(authorities) config(): Vec; } } @@ -162,8 +170,39 @@ decl_module! { pub struct Module for enum Call where origin: T::Origin { } } +impl Module { + fn change_authorities(new: Vec) { + >::put(&new); + + let log: DigestItem = DigestItem::Consensus( + AURA_ENGINE_ID, + ConsensusLog::AuthoritiesChange(new).encode() + ); + >::deposit_log(log.into()); + } +} + +impl session::OneSessionHandler for Module { + type Key = T::AuthorityId; + fn on_new_session<'a, I: 'a>(changed: bool, validators: I) + where I: Iterator + { + // instant changes + if changed { + let next_authorities = validators.map(|(_, k)| k).collect::>(); + let last_authorities = >::authorities(); + if next_authorities != last_authorities { + Self::change_authorities(next_authorities); + } + } + } + fn on_disabled(_i: usize) { + // ignore? + } +} + /// A report of skipped authorities in Aura. -#[derive(Clone, Encode, Decode, PartialEq, Eq)] +#[derive(Clone, PartialEq, Eq)] #[cfg_attr(feature = "std", derive(Debug))] pub struct AuraReport { // The first skipped slot. @@ -192,43 +231,41 @@ impl AuraReport { impl Module { /// Determine the Aura slot-duration based on the Timestamp module configuration. - pub fn slot_duration() -> u64 { + pub fn slot_duration() -> T::Moment { // we double the minimum block-period so each author can always propose within // the majority of its slot. - >::minimum_period().as_().saturating_mul(2) + >::minimum_period().saturating_mul(2.into()) } fn on_timestamp_set(now: T::Moment, slot_duration: T::Moment) { let last = Self::last(); ::LastTimestamp::put(now.clone()); - if last == T::Moment::zero() { + if last.is_zero() { return; } - assert!(slot_duration > T::Moment::zero(), "Aura slot duration cannot be zero."); + assert!(!slot_duration.is_zero(), "Aura slot duration cannot be zero."); let last_slot = last / slot_duration.clone(); - let first_skipped = last_slot.clone() + T::Moment::sa(1); + let first_skipped = last_slot.clone() + One::one(); let cur_slot = now / slot_duration; assert!(last_slot < cur_slot, "Only one block may be authored per slot."); if cur_slot == first_skipped { return } - let slot_to_usize = |slot: T::Moment| { slot.as_() as usize }; - - let skipped_slots = cur_slot - last_slot - T::Moment::sa(1); + let skipped_slots = cur_slot - last_slot - One::one(); H::handle_report(AuraReport { - start_slot: slot_to_usize(first_skipped), - skipped: slot_to_usize(skipped_slots), + start_slot: first_skipped.saturated_into::(), + skipped: skipped_slots.saturated_into::(), }) } } impl OnTimestampSet for Module { fn on_timestamp_set(moment: T::Moment) { - Self::on_timestamp_set::(moment, T::Moment::sa(Self::slot_duration())) + Self::on_timestamp_set::(moment, Self::slot_duration()) } } @@ -265,9 +302,9 @@ impl ProvideInherent for Module { _ => return Ok(()), }; - let timestamp_based_slot = timestamp.as_() / Self::slot_duration(); + let timestamp_based_slot = timestamp / Self::slot_duration(); - let seal_slot = data.aura_inherent_data()?; + let seal_slot = data.aura_inherent_data()?.saturated_into(); if timestamp_based_slot == seal_slot { Ok(()) diff --git a/srml/aura/src/mock.rs b/srml/aura/src/mock.rs index e72e25ef94080f84f1aa2d883695da56bd459a2b..e9c43850f6e01648c99809be89dc18a701abaa32 100644 --- a/srml/aura/src/mock.rs +++ b/srml/aura/src/mock.rs @@ -18,11 +18,11 @@ #![cfg(test)] -use primitives::{BuildStorage, traits::IdentityLookup, testing::{Digest, DigestItem, Header, UintAuthorityId}}; +use primitives::{BuildStorage, traits::IdentityLookup, testing::{Header, UintAuthorityId}}; use srml_support::impl_outer_origin; use runtime_io; use substrate_primitives::{H256, Blake2Hasher}; -use crate::{Trait, Module}; +use crate::{Trait, Module, GenesisConfig}; impl_outer_origin!{ pub enum Origin for Test {} @@ -32,24 +32,16 @@ impl_outer_origin!{ #[derive(Clone, PartialEq, Eq, Debug)] pub struct Test; -impl consensus::Trait for Test { - type Log = DigestItem; - type SessionKey = UintAuthorityId; - type InherentOfflineReport = (); -} - impl system::Trait for Test { type Origin = Origin; type Index = u64; type BlockNumber = u64; type Hash = H256; type Hashing = ::primitives::traits::BlakeTwo256; - type Digest = Digest; type AccountId = u64; type Lookup = IdentityLookup; type Header = Header; type Event = (); - type Log = DigestItem; } impl timestamp::Trait for Test { @@ -59,17 +51,17 @@ impl timestamp::Trait for Test { impl Trait for Test { type HandleReport = (); + type AuthorityId = UintAuthorityId; } pub fn new_test_ext(authorities: Vec) -> runtime_io::TestExternalities { let mut t = system::GenesisConfig::::default().build_storage().unwrap().0; - t.extend(consensus::GenesisConfig::{ - code: vec![], - authorities: authorities.into_iter().map(|a| UintAuthorityId(a)).collect(), - }.build_storage().unwrap().0); t.extend(timestamp::GenesisConfig::{ minimum_period: 1, }.build_storage().unwrap().0); + t.extend(GenesisConfig::{ + authorities: authorities.into_iter().map(|a| UintAuthorityId(a)).collect(), + }.build_storage().unwrap().0); t.into() } diff --git a/srml/aura/src/tests.rs b/srml/aura/src/tests.rs index e74c7dace2ff3fd6179f755e05add387f1bc7f92..3e20613c48f6119befbd3a1cede6004fedb5f5bc 100644 --- a/srml/aura/src/tests.rs +++ b/srml/aura/src/tests.rs @@ -73,7 +73,7 @@ fn aura_reports_offline() { } with_externalities(&mut new_test_ext(vec![0, 1, 2, 3]), || { - System::initialize(&1, &Default::default(), &Default::default()); + System::initialize(&1, &Default::default(), &Default::default(), &Default::default()); let slot_duration = Aura::slot_duration(); Aura::on_timestamp_set::(5 * slot_duration, slot_duration); @@ -82,7 +82,7 @@ fn aura_reports_offline() { // no slashing when last step was 0. assert_eq!(SLASH_COUNTS.lock().as_slice(), &[0, 0, 0, 0]); - System::initialize(&2, &header.hash(), &Default::default()); + System::initialize(&2, &header.hash(), &Default::default(), &Default::default()); Aura::on_timestamp_set::(8 * slot_duration, slot_duration); let _header = System::finalize(); diff --git a/srml/babe/Cargo.toml b/srml/babe/Cargo.toml index 0c25a98948baf801b2457e4e6f68f4e1dac77390..4b82a6c6bc7b8e9c867eca4101b0c4510f744af4 100644 --- a/srml/babe/Cargo.toml +++ b/srml/babe/Cargo.toml @@ -14,16 +14,14 @@ primitives = { package = "sr-primitives", path = "../../core/sr-primitives", def srml-support = { path = "../support", default-features = false } system = { package = "srml-system", path = "../system", default-features = false } timestamp = { package = "srml-timestamp", path = "../timestamp", default-features = false } -staking = { package = "srml-staking", path = "../staking", default-features = false } session = { package = "srml-session", path = "../session", default-features = false } babe-primitives = { package = "substrate-consensus-babe-primitives", path = "../../core/consensus/babe/primitives", default-features = false } [dev-dependencies] lazy_static = "1.3.0" -parking_lot = "0.7.1" +parking_lot = "0.8.0" substrate-primitives = { path = "../../core/primitives" } runtime_io = { package = "sr-io", path = "../../core/sr-io" } -consensus = { package = "srml-consensus", path = "../consensus" } [features] default = ["std"] @@ -35,7 +33,7 @@ std = [ "primitives/std", "system/std", "timestamp/std", - "staking/std", "inherents/std", "babe-primitives/std", + "session/std", ] diff --git a/srml/babe/src/lib.rs b/srml/babe/src/lib.rs index e9b5426221c69cac904e458026888d67e98a1c50..0cfc0fb8d059dee5bb077715f425cab1f2293cec 100644 --- a/srml/babe/src/lib.rs +++ b/srml/babe/src/lib.rs @@ -17,19 +17,22 @@ //! Consensus extension module for BABE consensus. #![cfg_attr(not(feature = "std"), no_std)] -#![forbid(unsafe_code, warnings)] +#![forbid(unsafe_code)] pub use timestamp; use rstd::{result, prelude::*}; -use srml_support::{decl_storage, decl_module}; -use primitives::traits::As; +use srml_support::{decl_storage, decl_module, StorageValue}; use timestamp::{OnTimestampSet, Trait}; +use primitives::{generic::DigestItem, traits::{SaturatedConversion, Saturating}}; #[cfg(feature = "std")] use timestamp::TimestampInherentData; -use parity_codec::Decode; +use parity_codec::{Encode, Decode}; use inherents::{RuntimeString, InherentIdentifier, InherentData, ProvideInherent, MakeFatalError}; #[cfg(feature = "std")] use inherents::{InherentDataProviders, ProvideInherentData}; +use babe_primitives::BABE_ENGINE_ID; + +pub use babe_primitives::AuthorityId; /// The BABE inherent identifier. pub const INHERENT_IDENTIFIER: InherentIdentifier = *b"babeslot"; @@ -105,8 +108,11 @@ impl ProvideInherentData for InherentDataProvider { decl_storage! { trait Store for Module as Babe { - // The last timestamp. + /// The last timestamp. LastTimestamp get(last): T::Moment; + + /// The current authorities set. + Authorities get(authorities): Vec; } } @@ -116,10 +122,10 @@ decl_module! { impl Module { /// Determine the BABE slot duration based on the Timestamp module configuration. - pub fn slot_duration() -> u64 { + pub fn slot_duration() -> T::Moment { // we double the minimum block-period so each author can always propose within // the majority of their slot. - >::minimum_period().as_().saturating_mul(2) + >::minimum_period().saturating_mul(2.into()) } } @@ -127,6 +133,34 @@ impl OnTimestampSet for Module { fn on_timestamp_set(_moment: T::Moment) { } } +impl Module { + fn change_authorities(new: Vec) { + >::put(&new); + + let log: DigestItem = DigestItem::Consensus(BABE_ENGINE_ID, new.encode()); + >::deposit_log(log.into()); + } +} + +impl session::OneSessionHandler for Module { + type Key = AuthorityId; + fn on_new_session<'a, I: 'a>(changed: bool, validators: I) + where I: Iterator + { + // instant changes + if changed { + let next_authorities = validators.map(|(_, k)| k).collect::>(); + let last_authorities = >::authorities(); + if next_authorities != last_authorities { + Self::change_authorities(next_authorities); + } + } + } + fn on_disabled(_i: usize) { + // ignore? + } +} + impl ProvideInherent for Module { type Call = timestamp::Call; type Error = MakeFatalError; @@ -142,10 +176,8 @@ impl ProvideInherent for Module { _ => return Ok(()), }; - let timestamp_based_slot = timestamp.as_() / Self::slot_duration(); - + let timestamp_based_slot = (timestamp / Self::slot_duration()).saturated_into::(); let seal_slot = data.babe_inherent_data()?; - if timestamp_based_slot == seal_slot { Ok(()) } else { diff --git a/srml/balances/src/lib.rs b/srml/balances/src/lib.rs index 90f774dbf38f60a320feccc2b28334b56307179a..72ec997206550bc0c6b48933c188fa7d246778d5 100644 --- a/srml/balances/src/lib.rs +++ b/srml/balances/src/lib.rs @@ -51,7 +51,8 @@ //! deleted, then the account is said to be dead. //! - **Imbalance:** A condition when some funds were credited or debited without equal and opposite accounting //! (i.e. a difference between total issuance and account balances). Functions that result in an imbalance will -//! return an object of the `Imbalance` trait that must be handled. +//! return an object of the `Imbalance` trait that can be managed within your runtime logic. (If an imbalance is +//! simply dropped, it should automatically maintain any book-keeping such as total issuance.) //! - **Lock:** A freeze on a specified amount of an account's free balance until a specified block number. Multiple //! locks always operate over the same funds, so they "overlay" rather than "stack". //! - **Vesting:** Similar to a lock, this is another, but independent, liquidity restriction that reduces linearly @@ -141,11 +142,15 @@ //! ## Genesis config //! //! The Balances module depends on the [`GenesisConfig`](./struct.GenesisConfig.html). +//! +//! ## Assumptions +//! +//! * Total issued balanced of all accounts should be less than `Trait::Balance::max_value()`. #![cfg_attr(not(feature = "std"), no_std)] use rstd::prelude::*; -use rstd::{cmp, result}; +use rstd::{cmp, result, mem}; use parity_codec::{Codec, Encode, Decode}; use srml_support::{StorageValue, StorageMap, Parameter, decl_event, decl_storage, decl_module}; use srml_support::traits::{ @@ -155,7 +160,7 @@ use srml_support::traits::{ }; use srml_support::dispatch::Result; use primitives::traits::{ - Zero, SimpleArithmetic, As, StaticLookup, Member, CheckedAdd, CheckedSub, + Zero, SimpleArithmetic, StaticLookup, Member, CheckedAdd, CheckedSub, MaybeSerializeDebug, Saturating }; use system::{IsDeadAccount, OnNewAccount, ensure_signed}; @@ -167,7 +172,8 @@ pub use self::imbalances::{PositiveImbalance, NegativeImbalance}; pub trait Subtrait: system::Trait { /// The balance of an account. - type Balance: Parameter + Member + SimpleArithmetic + Codec + Default + Copy + MaybeSerializeDebug; + type Balance: Parameter + Member + SimpleArithmetic + Codec + Default + Copy + + MaybeSerializeDebug + From; /// A function that is invoked when the free-balance has fallen below the existential deposit and /// has been reduced to zero. @@ -181,7 +187,8 @@ pub trait Subtrait: system::Trait { pub trait Trait: system::Trait { /// The balance of an account. - type Balance: Parameter + Member + SimpleArithmetic + Codec + Default + Copy + MaybeSerializeDebug; + type Balance: Parameter + Member + SimpleArithmetic + Codec + Default + Copy + + MaybeSerializeDebug + From; /// A function that is invoked when the free-balance has fallen below the existential deposit and /// has been reduced to zero. @@ -236,10 +243,12 @@ pub struct VestingSchedule { pub per_block: Balance, } -impl> VestingSchedule { +impl VestingSchedule { /// Amount locked at block `n`. - pub fn locked_at>(&self, n: BlockNumber) -> Balance { - if let Some(x) = Balance::sa(n.as_()).checked_mul(&self.per_block) { + pub fn locked_at(&self, n: BlockNumber) -> Balance + where Balance: From + { + if let Some(x) = Balance::from(n).checked_mul(&self.per_block) { self.offset.max(x) - x } else { Zero::zero() @@ -276,10 +285,8 @@ decl_storage! { /// Information regarding the vesting of a given account. pub Vesting get(vesting) build(|config: &GenesisConfig| { config.vesting.iter().filter_map(|&(ref who, begin, length)| { - let begin: u64 = begin.as_(); - let length: u64 = length.as_(); - let begin: T::Balance = As::sa(begin); - let length: T::Balance = As::sa(length); + let begin = >::from(begin); + let length = >::from(length); config.balances.iter() .find(|&&(ref w, _)| w == who) @@ -343,6 +350,21 @@ decl_module! { /// of the transfer, the account will be reaped. /// /// The dispatch origin for this call must be `Signed` by the transactor. + /// + /// # + /// - Dependent on arguments but not critical, given proper implementations for + /// input config types. See related functions below. + /// - It contains a limited number of reads and writes internally and no complex computation. + /// + /// Related functions: + /// + /// - `ensure_can_withdraw` is always called internally but has a bounded complexity. + /// - Transferring balances to accounts that did not exist before will cause + /// `T::OnNewAccount::on_new_account` to be called. + /// - Removing enough funds from an account will trigger + /// `T::DustRemoval::on_unbalanced` and `T::OnFreeBalanceZero::on_free_balance_zero`. + /// + /// # pub fn transfer( origin, dest: ::Source, @@ -355,20 +377,39 @@ decl_module! { /// Set the balances of a given account. /// - /// This will alter `FreeBalance` and `ReservedBalance` in storage. + /// This will alter `FreeBalance` and `ReservedBalance` in storage. it will + /// also decrease the total issuance of the system (`TotalIssuance`). /// If the new free or reserved balance is below the existential deposit, - /// it will also decrease the total issuance of the system (`TotalIssuance`) - /// and reset the account nonce (`system::AccountNonce`). + /// it will reset the account nonce (`system::AccountNonce`). /// /// The dispatch origin for this call is `root`. + /// + /// # + /// - Independent of the arguments. + /// - Contains a limited number of reads and writes. + /// # fn set_balance( who: ::Source, - #[compact] free: T::Balance, - #[compact] reserved: T::Balance + #[compact] new_free: T::Balance, + #[compact] new_reserved: T::Balance ) { let who = T::Lookup::lookup(who)?; - Self::set_free_balance(&who, free); - Self::set_reserved_balance(&who, reserved); + + let current_free = >::get(&who); + if new_free > current_free { + mem::drop(PositiveImbalance::::new(new_free - current_free)); + } else if new_free < current_free { + mem::drop(NegativeImbalance::::new(current_free - new_free)); + } + Self::set_free_balance(&who, new_free); + + let current_reserved = >::get(&who); + if new_reserved > current_reserved { + mem::drop(PositiveImbalance::::new(new_reserved - current_reserved)); + } else if new_reserved < current_reserved { + mem::drop(NegativeImbalance::::new(current_reserved - new_reserved)); + } + Self::set_reserved_balance(&who, new_reserved); } } } @@ -380,7 +421,8 @@ impl, I: Instance> Module { /// Get the amount that is currently being vested and cannot be transferred out of this account. pub fn vesting_balance(who: &T::AccountId) -> T::Balance { if let Some(v) = Self::vesting(who) { - Self::free_balance(who).min(v.locked_at(>::block_number())) + Self::free_balance(who) + .min(v.locked_at::(>::block_number())) } else { Zero::zero() } @@ -651,12 +693,10 @@ impl, I: Instance> system::Trait for ElevatedTrait { type BlockNumber = T::BlockNumber; type Hash = T::Hash; type Hashing = T::Hashing; - type Digest = T::Digest; type AccountId = T::AccountId; type Lookup = T::Lookup; type Header = T::Header; type Event = (); - type Log = T::Log; } impl, I: Instance> Trait for ElevatedTrait { type Balance = T::Balance; @@ -696,6 +736,10 @@ where >::get(who) } + // # + // Despite iterating over a list of locks, they are limited by the number of + // lock IDs, which means the number of runtime modules that intend to use and create locks. + // # fn ensure_can_withdraw( who: &T::AccountId, _amount: T::Balance, @@ -1013,7 +1057,7 @@ where impl, I: Instance> MakePayment for Module { fn make_payment(transactor: &T::AccountId, encoded_len: usize) -> Result { - let encoded_len = >::sa(encoded_len as u64); + let encoded_len = T::Balance::from(encoded_len as u32); let transaction_fee = Self::transaction_base_fee() + Self::transaction_byte_fee() * encoded_len; let imbalance = Self::withdraw( transactor, diff --git a/srml/balances/src/mock.rs b/srml/balances/src/mock.rs index db20efc47566aec3e05e4e9e34b74627f8b30ae4..ac5208ab90c2a3c1e7367f706eecfa708118508a 100644 --- a/srml/balances/src/mock.rs +++ b/srml/balances/src/mock.rs @@ -19,7 +19,7 @@ #![cfg(test)] use primitives::BuildStorage; -use primitives::{traits::{IdentityLookup}, testing::{Digest, DigestItem, Header}}; +use primitives::{traits::{IdentityLookup}, testing::Header}; use substrate_primitives::{H256, Blake2Hasher}; use runtime_io; use srml_support::impl_outer_origin; @@ -38,12 +38,10 @@ impl system::Trait for Runtime { type BlockNumber = u64; type Hash = H256; type Hashing = ::primitives::traits::BlakeTwo256; - type Digest = Digest; type AccountId = u64; type Lookup = IdentityLookup; type Header = Header; type Event = (); - type Log = DigestItem; } impl Trait for Runtime { type Balance = u64; diff --git a/srml/balances/src/tests.rs b/srml/balances/src/tests.rs index 89491fe5f80fc99b673d2c0643c355a03ca61d5f..0a5a4b5bb70a69478ae19beddb3940e211b58495 100644 --- a/srml/balances/src/tests.rs +++ b/srml/balances/src/tests.rs @@ -36,7 +36,10 @@ fn basic_locking_should_work() { with_externalities(&mut ExtBuilder::default().existential_deposit(1).monied(true).build(), || { assert_eq!(Balances::free_balance(&1), 10); Balances::set_lock(ID_1, &1, 9, u64::max_value(), WithdrawReasons::all()); - assert_noop!(>::transfer(&1, &2, 5), "account liquidity restrictions prevent withdrawal"); + assert_noop!( + >::transfer(&1, &2, 5), + "account liquidity restrictions prevent withdrawal" + ); }); } @@ -89,11 +92,20 @@ fn combination_locking_should_work() { fn lock_value_extension_should_work() { with_externalities(&mut ExtBuilder::default().existential_deposit(1).monied(true).build(), || { Balances::set_lock(ID_1, &1, 5, u64::max_value(), WithdrawReasons::all()); - assert_noop!(>::transfer(&1, &2, 6), "account liquidity restrictions prevent withdrawal"); + assert_noop!( + >::transfer(&1, &2, 6), + "account liquidity restrictions prevent withdrawal" + ); Balances::extend_lock(ID_1, &1, 2, u64::max_value(), WithdrawReasons::all()); - assert_noop!(>::transfer(&1, &2, 6), "account liquidity restrictions prevent withdrawal"); + assert_noop!( + >::transfer(&1, &2, 6), + "account liquidity restrictions prevent withdrawal" + ); Balances::extend_lock(ID_1, &1, 8, u64::max_value(), WithdrawReasons::all()); - assert_noop!(>::transfer(&1, &2, 3), "account liquidity restrictions prevent withdrawal"); + assert_noop!( + >::transfer(&1, &2, 3), + "account liquidity restrictions prevent withdrawal" + ); }); } @@ -101,19 +113,28 @@ fn lock_value_extension_should_work() { fn lock_reasons_should_work() { with_externalities(&mut ExtBuilder::default().existential_deposit(1).monied(true).transaction_fees(0, 1).build(), || { Balances::set_lock(ID_1, &1, 10, u64::max_value(), WithdrawReason::Transfer.into()); - assert_noop!(>::transfer(&1, &2, 1), "account liquidity restrictions prevent withdrawal"); + assert_noop!( + >::transfer(&1, &2, 1), + "account liquidity restrictions prevent withdrawal" + ); assert_ok!(>::reserve(&1, 1)); assert_ok!(>::make_payment(&1, 1)); Balances::set_lock(ID_1, &1, 10, u64::max_value(), WithdrawReason::Reserve.into()); assert_ok!(>::transfer(&1, &2, 1)); - assert_noop!(>::reserve(&1, 1), "account liquidity restrictions prevent withdrawal"); + assert_noop!( + >::reserve(&1, 1), + "account liquidity restrictions prevent withdrawal" + ); assert_ok!(>::make_payment(&1, 1)); Balances::set_lock(ID_1, &1, 10, u64::max_value(), WithdrawReason::TransactionPayment.into()); assert_ok!(>::transfer(&1, &2, 1)); assert_ok!(>::reserve(&1, 1)); - assert_noop!(>::make_payment(&1, 1), "account liquidity restrictions prevent withdrawal"); + assert_noop!( + >::make_payment(&1, 1), + "account liquidity restrictions prevent withdrawal" + ); }); } @@ -121,7 +142,10 @@ fn lock_reasons_should_work() { fn lock_block_number_should_work() { with_externalities(&mut ExtBuilder::default().existential_deposit(1).monied(true).build(), || { Balances::set_lock(ID_1, &1, 10, 2, WithdrawReasons::all()); - assert_noop!(>::transfer(&1, &2, 1), "account liquidity restrictions prevent withdrawal"); + assert_noop!( + >::transfer(&1, &2, 1), + "account liquidity restrictions prevent withdrawal" + ); System::set_block_number(2); assert_ok!(>::transfer(&1, &2, 1)); @@ -132,12 +156,21 @@ fn lock_block_number_should_work() { fn lock_block_number_extension_should_work() { with_externalities(&mut ExtBuilder::default().existential_deposit(1).monied(true).build(), || { Balances::set_lock(ID_1, &1, 10, 2, WithdrawReasons::all()); - assert_noop!(>::transfer(&1, &2, 6), "account liquidity restrictions prevent withdrawal"); + assert_noop!( + >::transfer(&1, &2, 6), + "account liquidity restrictions prevent withdrawal" + ); Balances::extend_lock(ID_1, &1, 10, 1, WithdrawReasons::all()); - assert_noop!(>::transfer(&1, &2, 6), "account liquidity restrictions prevent withdrawal"); + assert_noop!( + >::transfer(&1, &2, 6), + "account liquidity restrictions prevent withdrawal" + ); System::set_block_number(2); Balances::extend_lock(ID_1, &1, 10, 8, WithdrawReasons::all()); - assert_noop!(>::transfer(&1, &2, 3), "account liquidity restrictions prevent withdrawal"); + assert_noop!( + >::transfer(&1, &2, 3), + "account liquidity restrictions prevent withdrawal" + ); }); } @@ -145,11 +178,20 @@ fn lock_block_number_extension_should_work() { fn lock_reasons_extension_should_work() { with_externalities(&mut ExtBuilder::default().existential_deposit(1).monied(true).build(), || { Balances::set_lock(ID_1, &1, 10, 10, WithdrawReason::Transfer.into()); - assert_noop!(>::transfer(&1, &2, 6), "account liquidity restrictions prevent withdrawal"); + assert_noop!( + >::transfer(&1, &2, 6), + "account liquidity restrictions prevent withdrawal" + ); Balances::extend_lock(ID_1, &1, 10, 10, WithdrawReasons::none()); - assert_noop!(>::transfer(&1, &2, 6), "account liquidity restrictions prevent withdrawal"); + assert_noop!( + >::transfer(&1, &2, 6), + "account liquidity restrictions prevent withdrawal" + ); Balances::extend_lock(ID_1, &1, 10, 10, WithdrawReason::Reserve.into()); - assert_noop!(>::transfer(&1, &2, 6), "account liquidity restrictions prevent withdrawal"); + assert_noop!( + >::transfer(&1, &2, 6), + "account liquidity restrictions prevent withdrawal" + ); }); } diff --git a/srml/consensus/Cargo.toml b/srml/consensus/Cargo.toml deleted file mode 100644 index bcb16a825a963f03adc31c453d8f7a40e571d776..0000000000000000000000000000000000000000 --- a/srml/consensus/Cargo.toml +++ /dev/null @@ -1,31 +0,0 @@ -[package] -name = "srml-consensus" -version = "2.0.0" -authors = ["Parity Technologies "] -edition = "2018" - -[dependencies] -serde = { version = "1.0", optional = true, features = ["derive"] } -parity-codec = { version = "3.3", default-features = false, features = ["derive"] } -substrate-primitives = { path = "../../core/primitives", default-features = false } -inherents = { package = "substrate-inherents", path = "../../core/inherents", default-features = false } -rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false } -primitives = { package = "sr-primitives", path = "../../core/sr-primitives", default-features = false } -srml-support = { path = "../support", default-features = false } -system = { package = "srml-system", path = "../system", default-features = false } - -[dev-dependencies] -runtime_io = { package = "sr-io", path = "../../core/sr-io" } - -[features] -default = ["std"] -std = [ - "serde", - "parity-codec/std", - "substrate-primitives/std", - "rstd/std", - "srml-support/std", - "primitives/std", - "system/std", - "inherents/std", -] diff --git a/srml/consensus/src/lib.rs b/srml/consensus/src/lib.rs deleted file mode 100644 index 696b9d75f4d9732830ddd0154d40203ad64b1bf5..0000000000000000000000000000000000000000 --- a/srml/consensus/src/lib.rs +++ /dev/null @@ -1,437 +0,0 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. -// This file is part of Substrate. - -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - -//! # Consensus Module -//! -//! - [`consensus::Trait`](./trait.Trait.html) -//! - [`Call`](./enum.Call.html) -//! - [`Module`](./struct.Module.html) -//! -//! ## Overview -//! -//! The consensus module manages the authority set for the native code. It provides support for reporting offline -//! behavior among validators and logging changes in the validator authority set. -//! -//! ## Interface -//! -//! ### Dispatchable Functions -//! -//! - `report_misbehavior` - Report some misbehavior. The origin of this call must be signed. -//! - `note_offline` - Note that the previous block's validator missed its opportunity to propose a block. -//! The origin of this call must be an inherent. -//! - `remark` - Make some on-chain remark. The origin of this call must be signed. -//! - `set_heap_pages` - Set the number of pages in the WebAssembly environment's heap. -//! - `set_code` - Set the new code. -//! - `set_storage` - Set some items of storage. -//! -//! ### Public Functions -//! -//! - `authorities` - Get the current set of authorities. These are the session keys. -//! - `set_authorities` - Set the current set of authorities' session keys. -//! - `set_authority_count` - Set the total number of authorities. -//! - `set_authority` - Set a single authority by index. -//! -//! ## Usage -//! -//! ### Simple Code Snippet -//! -//! Set authorities: -//! -//! ``` -//! # use srml_consensus as consensus; -//! # fn not_executed() { -//! # let authority1 = T::SessionKey::default(); -//! # let authority2 = T::SessionKey::default(); -//! >::set_authorities(&[authority1, authority2]) -//! # } -//! ``` -//! -//! Log changes in the authorities set: -//! -//! ``` -//! # use srml_consensus as consensus; -//! # use primitives::traits::Zero; -//! # use primitives::traits::OnFinalize; -//! # fn not_executed() { -//! >::on_finalize(T::BlockNumber::zero()); -//! # } -//! ``` -//! -//! ### Example from SRML -//! -//! In the staking module, the `consensus::OnOfflineReport` is implemented to monitor offline -//! reporting among validators: -//! -//! ``` -//! # use srml_consensus as consensus; -//! # trait Trait: consensus::Trait { -//! # } -//! # -//! # srml_support::decl_module! { -//! # pub struct Module for enum Call where origin: T::Origin { -//! # } -//! # } -//! # -//! impl consensus::OnOfflineReport> for Module { -//! fn handle_report(reported_indices: Vec) { -//! for validator_index in reported_indices { -//! // Get validator from session module -//! // Process validator -//! } -//! } -//! } -//! ``` -//! -//! In the GRANDPA module, we use `srml-consensus` to get the set of `next_authorities` before changing -//! this set according to the consensus algorithm (which does not rotate sessions in the *normal* way): -//! -//! ``` -//! # use srml_consensus as consensus; -//! # use consensus::Trait; -//! # fn not_executed() { -//! let next_authorities = >::authorities() -//! .into_iter() -//! .map(|key| (key, 1)) // evenly-weighted. -//! .collect::::SessionKey, u64)>>(); -//! # } -//! ``` -//! -//! ## Related Modules -//! -//! - [Staking](../srml_staking/index.html): This module uses `srml-consensus` to monitor offline -//! reporting among validators. -//! - [Aura](../srml_aura/index.html): This module does not relate directly to `srml-consensus`, -//! but serves to manage offline reporting for the Aura consensus algorithm with its own `handle_report` method. -//! - [Grandpa](../srml_grandpa/index.html): Although GRANDPA does its own voter-set management, -//! it has a mode where it can track `consensus`, if desired. -//! -//! ## References -//! -//! If you're interested in hacking on this module, it is useful to understand the interaction with -//! `substrate/core/inherents/src/lib.rs` and, specifically, the required implementation of `ProvideInherent` -//! to create and check inherents. - -#![cfg_attr(not(feature = "std"), no_std)] - -#[cfg(feature = "std")] -use serde::Serialize; -use rstd::prelude::*; -use parity_codec as codec; -use codec::{Encode, Decode}; -use srml_support::{storage, Parameter, decl_storage, decl_module}; -use srml_support::storage::StorageValue; -use srml_support::storage::unhashed::StorageVec; -use primitives::traits::{MaybeSerializeDebug, Member}; -use substrate_primitives::storage::well_known_keys; -use system::{ensure_signed, ensure_none}; -use inherents::{ - ProvideInherent, InherentData, InherentIdentifier, RuntimeString, MakeFatalError -}; - -#[cfg(any(feature = "std", test))] -use substrate_primitives::sr25519::Public as AuthorityId; - -mod mock; -mod tests; - -/// The identifier for consensus inherents. -pub const INHERENT_IDENTIFIER: InherentIdentifier = *b"offlrep0"; - -/// The error type used by this inherent. -pub type InherentError = RuntimeString; - -struct AuthorityStorageVec(rstd::marker::PhantomData); -impl StorageVec for AuthorityStorageVec { - type Item = S; - const PREFIX: &'static [u8] = well_known_keys::AUTHORITY_PREFIX; -} - -pub type Key = Vec; -pub type KeyValue = (Vec, Vec); - -/// Handling offline validator reports in a generic way. -pub trait OnOfflineReport { - fn handle_report(offline: Offline); -} - -impl OnOfflineReport for () { - fn handle_report(_: T) {} -} - -/// Describes the offline-reporting extrinsic. -pub trait InherentOfflineReport { - /// The report data type passed to the runtime during block authorship. - type Inherent: codec::Codec + Parameter; - - /// Whether an inherent is empty and doesn't need to be included. - fn is_empty(inherent: &Self::Inherent) -> bool; - - /// Handle the report. - fn handle_report(report: Self::Inherent); - - /// Whether two reports are compatible. - fn check_inherent(contained: &Self::Inherent, expected: &Self::Inherent) -> Result<(), &'static str>; -} - -impl InherentOfflineReport for () { - type Inherent = (); - - fn is_empty(_inherent: &()) -> bool { true } - fn handle_report(_: ()) { } - fn check_inherent(_: &(), _: &()) -> Result<(), &'static str> { - Err("Explicit reporting not allowed") - } -} - -/// A variant of the `OfflineReport` that is useful for instant-finality blocks. -/// -/// This assumes blocks are only finalized. -pub struct InstantFinalityReportVec(::rstd::marker::PhantomData); - -impl>> InherentOfflineReport for InstantFinalityReportVec { - type Inherent = Vec; - - fn is_empty(inherent: &Self::Inherent) -> bool { inherent.is_empty() } - - fn handle_report(report: Vec) { - T::handle_report(report) - } - - fn check_inherent(contained: &Self::Inherent, expected: &Self::Inherent) -> Result<(), &'static str> { - contained.iter().try_for_each(|n| - if !expected.contains(n) { - Err("Node we believe online marked offline") - } else { - Ok(()) - } - ) - } -} - -pub type Log = RawLog< - ::SessionKey, ->; - -/// Logs in this module. -#[cfg_attr(feature = "std", derive(Serialize, Debug))] -#[derive(Encode, Decode, PartialEq, Eq, Clone)] -pub enum RawLog { - /// Authorities set has been changed. Contains the new set of authorities. - AuthoritiesChange(Vec), -} - -impl RawLog { - /// Try to cast the log entry as AuthoritiesChange log entry. - pub fn as_authorities_change(&self) -> Option<&[SessionKey]> { - match *self { - RawLog::AuthoritiesChange(ref item) => Some(item), - } - } -} - -// Implementation for tests outside of this crate. -#[cfg(any(feature = "std", test))] -impl From> for primitives::testing::DigestItem where N: Into { - fn from(log: RawLog) -> primitives::testing::DigestItem { - match log { - RawLog::AuthoritiesChange(authorities) => - primitives::generic::DigestItem::AuthoritiesChange( - authorities.into_iter() - .map(Into::into).collect()), - } - } -} - -pub trait Trait: system::Trait { - /// Type for all log entries of this module. - type Log: From> + Into>; - - type SessionKey: Parameter + Default + MaybeSerializeDebug; - /// Defines the offline-report type of the trait. - /// Set to `()` if offline-reports aren't needed for this runtime. - type InherentOfflineReport: InherentOfflineReport; -} - -decl_storage! { - trait Store for Module as Consensus { - // Actual authorities set at the block execution start. Is `Some` iff - // the set has been changed. - OriginalAuthorities: Option>; - } - add_extra_genesis { - config(authorities): Vec; - #[serde(with = "substrate_primitives::bytes")] - config(code): Vec; - - build(|storage: &mut primitives::StorageOverlay, _: &mut primitives::ChildrenStorageOverlay, config: &GenesisConfig| { - use codec::{Encode, KeyedVec}; - - let auth_count = config.authorities.len() as u32; - config.authorities.iter().enumerate().for_each(|(i, v)| { - storage.insert((i as u32).to_keyed_vec(well_known_keys::AUTHORITY_PREFIX), v.encode()); - }); - storage.insert(well_known_keys::AUTHORITY_COUNT.to_vec(), auth_count.encode()); - storage.insert(well_known_keys::CODE.to_vec(), config.code.clone()); - }); - } -} - -decl_module! { - pub struct Module for enum Call where origin: T::Origin { - /// Report some misbehavior. - fn report_misbehavior(origin, _report: Vec) { - ensure_signed(origin)?; - } - - /// Note that the previous block's validator missed its opportunity to propose a block. - fn note_offline(origin, offline: ::Inherent) { - ensure_none(origin)?; - - T::InherentOfflineReport::handle_report(offline); - } - - /// Make some on-chain remark. - fn remark(origin, _remark: Vec) { - ensure_signed(origin)?; - } - - /// Set the number of pages in the WebAssembly environment's heap. - fn set_heap_pages(pages: u64) { - storage::unhashed::put_raw(well_known_keys::HEAP_PAGES, &pages.encode()); - } - - /// Set the new code. - pub fn set_code(new: Vec) { - storage::unhashed::put_raw(well_known_keys::CODE, &new); - } - - /// Set some items of storage. - fn set_storage(items: Vec) { - for i in &items { - storage::unhashed::put_raw(&i.0, &i.1); - } - } - - /// Kill some items from storage. - fn kill_storage(keys: Vec) { - for key in &keys { - storage::unhashed::kill(&key); - } - } - - fn on_finalize() { - if let Some(original_authorities) = >::take() { - let current_authorities = AuthorityStorageVec::::items(); - if current_authorities != original_authorities { - Self::deposit_log(RawLog::AuthoritiesChange(current_authorities)); - } - } - } - } -} - -impl Module { - /// Get the current set of authorities. These are the session keys. - pub fn authorities() -> Vec { - AuthorityStorageVec::::items() - } - - /// Set the current set of authorities' session keys. Will not exceed the current - /// authorities count, even if the given `authorities` is longer. - /// - /// Called by `rotate_session` only. - pub fn set_authorities(authorities: &[T::SessionKey]) { - let current_authorities = AuthorityStorageVec::::items(); - if current_authorities != authorities { - Self::save_original_authorities(Some(current_authorities)); - AuthorityStorageVec::::set_items(authorities); - } - } - - /// Set the total number of authorities. - pub fn set_authority_count(count: u32) { - Self::save_original_authorities(None); - AuthorityStorageVec::::set_count(count); - } - - /// Set a single authority by index. - pub fn set_authority(index: u32, key: &T::SessionKey) { - let current_authority = AuthorityStorageVec::::item(index); - if current_authority != *key { - Self::save_original_authorities(None); - AuthorityStorageVec::::set_item(index, key); - } - } - - /// Save original authorities set. - fn save_original_authorities(current_authorities: Option>) { - if OriginalAuthorities::::get().is_some() { - // if we have already saved original set before, do not overwrite - return; - } - - >::put(current_authorities.unwrap_or_else(|| - AuthorityStorageVec::::items())); - } - - /// Deposit one of this module's logs. - fn deposit_log(log: Log) { - >::deposit_log(::Log::from(log).into()); - } -} - -/// Implementing `ProvideInherent` enables this module to create and check inherents. -impl ProvideInherent for Module { - /// The call type of the module. - type Call = Call; - /// The error returned by `check_inherent`. - type Error = MakeFatalError; - /// The inherent identifier used by this inherent. - const INHERENT_IDENTIFIER: InherentIdentifier = INHERENT_IDENTIFIER; - - /// Creates an inherent from the `InherentData`. - fn create_inherent(data: &InherentData) -> Option { - if let Ok(Some(data)) = - data.get_data::<::Inherent>( - &INHERENT_IDENTIFIER - ) - { - if ::is_empty(&data) { - None - } else { - Some(Call::note_offline(data)) - } - } else { - None - } - } - - /// Verify the validity of the given inherent. - fn check_inherent(call: &Self::Call, data: &InherentData) -> Result<(), Self::Error> { - let offline = match call { - Call::note_offline(ref offline) => offline, - _ => return Ok(()), - }; - - let expected = data - .get_data::<::Inherent>(&INHERENT_IDENTIFIER)? - .ok_or(RuntimeString::from("No `offline_report` found in the inherent data!"))?; - - ::check_inherent( - &offline, &expected - ).map_err(|e| RuntimeString::from(e).into()) - } -} diff --git a/srml/consensus/src/mock.rs b/srml/consensus/src/mock.rs deleted file mode 100644 index 85e6dc365411608c348732950756d77626d165d3..0000000000000000000000000000000000000000 --- a/srml/consensus/src/mock.rs +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright 2018-2019 Parity Technologies (UK) Ltd. -// This file is part of Substrate. - -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - -//! Test utilities - -#![cfg(test)] - -use primitives::{BuildStorage, traits::IdentityLookup, testing::{Digest, DigestItem, Header, UintAuthorityId}}; -use srml_support::impl_outer_origin; -use runtime_io; -use substrate_primitives::{H256, Blake2Hasher}; -use crate::{GenesisConfig, Trait, Module}; - -impl_outer_origin!{ - pub enum Origin for Test {} -} - -// Workaround for https://github.com/rust-lang/rust/issues/26925 . Remove when sorted. -#[derive(Clone, PartialEq, Eq, Debug)] -pub struct Test; -impl Trait for Test { - type Log = DigestItem; - type SessionKey = UintAuthorityId; - type InherentOfflineReport = crate::InstantFinalityReportVec<()>; -} -impl system::Trait for Test { - type Origin = Origin; - type Index = u64; - type BlockNumber = u64; - type Hash = H256; - type Hashing = ::primitives::traits::BlakeTwo256; - type Digest = Digest; - type AccountId = u64; - type Lookup = IdentityLookup; - type Header = Header; - type Event = (); - type Log = DigestItem; -} - -pub fn new_test_ext(authorities: Vec) -> runtime_io::TestExternalities { - let mut t = system::GenesisConfig::::default().build_storage().unwrap().0; - t.extend(GenesisConfig::{ - code: vec![], - authorities: authorities.into_iter().map(|a| UintAuthorityId(a)).collect(), - }.build_storage().unwrap().0); - t.into() -} - -pub type System = system::Module; -pub type Consensus = Module; diff --git a/srml/consensus/src/tests.rs b/srml/consensus/src/tests.rs deleted file mode 100644 index bf8b3a09f37686ba3b47979cdb45e8bd1b589486..0000000000000000000000000000000000000000 --- a/srml/consensus/src/tests.rs +++ /dev/null @@ -1,131 +0,0 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. -// This file is part of Substrate. - -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - -//! Tests for the module. - -#![cfg(test)] - -use primitives::{generic, testing::{self, UintAuthorityId}, traits::OnFinalize}; -use runtime_io::with_externalities; -use crate::mock::{Consensus, System, new_test_ext}; -use inherents::{InherentData, ProvideInherent}; - -#[test] -fn authorities_change_logged() { - with_externalities(&mut new_test_ext(vec![1, 2, 3]), || { - System::initialize(&1, &Default::default(), &Default::default()); - Consensus::set_authorities(&[UintAuthorityId(4), UintAuthorityId(5), UintAuthorityId(6)]); - Consensus::on_finalize(1); - let header = System::finalize(); - assert_eq!(header.digest, testing::Digest { - logs: vec![ - generic::DigestItem::AuthoritiesChange( - vec![ - UintAuthorityId(4).into(), - UintAuthorityId(5).into(), - UintAuthorityId(6).into() - ] - ), - ], - }); - }); -} - -#[test] -fn partial_authorities_change_logged() { - with_externalities(&mut new_test_ext(vec![1, 2, 3]), || { - System::initialize(&2, &Default::default(), &Default::default()); - Consensus::set_authorities(&[UintAuthorityId(2), UintAuthorityId(4), UintAuthorityId(5)]); - Consensus::on_finalize(2); - let header = System::finalize(); - assert_eq!(header.digest, testing::Digest { - logs: vec![ - generic::DigestItem::AuthoritiesChange( - vec![ - UintAuthorityId(2).into(), - UintAuthorityId(4).into(), - UintAuthorityId(5).into() - ] - ), - ], - }); - }); -} - -#[test] -fn authorities_change_is_not_logged_when_not_changed() { - with_externalities(&mut new_test_ext(vec![1, 2, 3]), || { - System::initialize(&1, &Default::default(), &Default::default()); - Consensus::on_finalize(1); - let header = System::finalize(); - assert_eq!(header.digest, testing::Digest { - logs: vec![], - }); - }); -} - -#[test] -fn authorities_change_is_not_logged_when_changed_back_to_original() { - with_externalities(&mut new_test_ext(vec![1, 2, 3]), || { - System::initialize(&1, &Default::default(), &Default::default()); - Consensus::set_authorities(&[UintAuthorityId(4), UintAuthorityId(5), UintAuthorityId(6)]); - Consensus::set_authorities(&[UintAuthorityId(1), UintAuthorityId(2), UintAuthorityId(3)]); - Consensus::on_finalize(1); - let header = System::finalize(); - assert_eq!(header.digest, testing::Digest { - logs: vec![], - }); - }); -} - -#[test] -fn offline_report_can_be_excluded() { - with_externalities(&mut new_test_ext(vec![1, 2, 3]), || { - System::initialize(&1, &Default::default(), &Default::default()); - assert!(Consensus::create_inherent(&InherentData::new()).is_none()); - - let offline_report: Vec = vec![0]; - let mut data = InherentData::new(); - data.put_data(super::INHERENT_IDENTIFIER, &offline_report).unwrap(); - - assert!(Consensus::create_inherent(&data).is_some()); - }); -} - -#[test] -fn set_and_kill_storage_work() { - use srml_support::storage; - - with_externalities(&mut new_test_ext(vec![1, 2, 3]), || { - System::initialize(&1, &Default::default(), &Default::default()); - - let item = (vec![42u8], vec![42u8]); - - Consensus::set_storage(vec![item.clone()]).unwrap(); - - assert_eq!( - storage::unhashed::get_raw(&item.0), - Some(item.1), - ); - - Consensus::kill_storage(vec![item.0.clone()]).unwrap(); - - assert_eq!( - storage::unhashed::get_raw(&item.0), - None, - ); - }); -} diff --git a/srml/contract/COMPLEXITY.md b/srml/contracts/COMPLEXITY.md similarity index 84% rename from srml/contract/COMPLEXITY.md rename to srml/contracts/COMPLEXITY.md index 3cd7fee448204849edb14c7ca7e9207458990a47..319707021dba3ce4ded57e53717aba0e1d4b4b59 100644 --- a/srml/contract/COMPLEXITY.md +++ b/srml/contracts/COMPLEXITY.md @@ -83,7 +83,25 @@ The size of the arguments and the return value depends on the exact function in `AccountDb` is an abstraction that supports collecting changes to accounts with the ability to efficiently reverting them. Contract execution contexts operate on the AccountDb. All changes are flushed into underlying storage only after origin transaction succeeds. -Today `AccountDb` is implemented as a cascade of overlays with the direct storage at the bottom. Each overlay is represented by a `Map`. On a commit from an overlay to an overlay, maps are merged. On commit from an overlay to the bottommost `AccountDb` all changes are flushed to the storage. On revert, the overlay is just discarded. +## Relation to the underlying storage + +At present, `AccountDb` is implemented as a cascade of overlays with the direct storage at the bottom. The direct +storage `AccountDb` leverages child tries. Each overlay is represented by a `Map`. On a commit from an overlay to an +overlay, maps are merged. On commit from an overlay to the bottommost `AccountDb` all changes are flushed to the storage +and on revert, the overlay is just discarded. + +> ℹ️ The underlying storage has a overlay layer implemented as a `Map`. If the runtime reads a storage location and the +> respective key doesn't exist in the overlay, then the underlying storage performs a DB access, but the value won't be +> placed into the overlay. The overlay is only filled with writes. +> +> This means that the overlay can be abused in the following ways: +> +> - The overlay can be inflated by issuing a lot of writes to unique locations, +> - Deliberate cache misses can be induced by reading non-modified storage locations, + +It also worth noting that the performance degrades with more state stored in the trie. Due to this +there is not negligible chance that gas schedule will be updated for all operations that involve +storage access. ## get_storage, get_code_hash, get_rent_allowance, get_balance, contract_exists @@ -158,20 +176,36 @@ Assuming marshaled size of a balance value is of the constant size we can neglec This function receives input data for the contract execution. The execution consists of the following steps: -1. Loading code from the DB. -2. `transfer`-ing funds between the caller and the destination account. -3. Executing the code of the destination account. -4. Committing overlayed changed to the underlying `AccountDb`. +1. Checking rent payment. +2. Loading code from the DB. +3. `transfer`-ing funds between the caller and the destination account. +4. Executing the code of the destination account. +5. Committing overlayed changed to the underlying `AccountDb`. **Note** that the complexity of executing the contract code should be considered separately. -Loading code most probably will trigger a DB read, since the code is immutable and therefore will not get into the cache (unless a suicide removes it). +Checking for rent involves 2 unconditional DB reads: `ContractInfoOf` and `block_number` +and on top of that at most once per block: + +- DB read to `free_balance` and +- `rent_deposit_offset` and +- `rent_byte_price` and +- `Currency::minimum_balance` and +- `tombstone_deposit`. +- Calls to `ensure_can_withdraw`, `withdraw`, `make_free_balance_be` can perform arbitrary logic and should be considered separately, +- `child_storage_root` +- `kill_child_storage` +- mutation of `ContractInfoOf` + +Loading code most likely will trigger a DB read, since the code is immutable and therefore will not get into the cache (unless a suicide removes it, or it has been created in the same call chain). Also, `transfer` can make up to 2 DB reads and up to 2 DB writes (if flushed to the storage) in the standard case. If removal of the source account takes place then it will additionally perform a DB write per one storage entry that the account has. Finally, all changes are `commit`-ted into the underlying overlay. The complexity of this depends on the number of changes performed by the code. Thus, the pricing of storage modification should account for that. -**complexity**: Up to 3 DB reads. DB read of the code is of dynamic size. There can also be up to 2 DB writes (if flushed to the storage). Additionally, if the source account removal takes place a DB write will be performed per one storage entry that the account has. +**complexity**: +- Only for the first invocation of the contract: up to 5 DB reads and one DB write as well as logic executed by `ensure_can_withdraw`, `withdraw`, `make_free_balance_be`. +- On top of that for every invocation: Up to 5 DB reads. DB read of the code is of dynamic size. There can also be up to 2 DB writes (if flushed to the storage). Additionally, if the source account removal takes place a DB write will be performed per one storage entry that the account has. ## Create @@ -185,7 +219,7 @@ This function takes the code of the constructor and input data. Creation of a co **Note** that the complexity of executing the constructor code should be considered separately. -**Note** that the complexity of `DetermineContractAddress` hook should be considered separately as well. Most probably it will use some kind of hashing over the code of the constructor and input data. The default `SimpleAddressDeterminator` does precisely that. +**Note** that the complexity of `DetermineContractAddress` hook should be considered separately as well. Most likely it will use some kind of hashing over the code of the constructor and input data. The default `SimpleAddressDeterminator` does precisely that. **Note** that the constructor returns code in the owned form and it's obtained via return facilities, which should have take fee for the return value. @@ -224,9 +258,11 @@ This function receives a `key` as an argument. It consists of the following step Key is of a constant size. Therefore, the sandbox memory load can be considered to be of constant complexity. -However, a read from the contract's storage can hit the DB, and the size of this read is dynamical. +Unless the value is cached, a DB read will be performed. The size of the value is not known until the read is +performed. Moreover, the DB read has to be synchronous and no progress can be made until the value is fetched. -**complexity**: The memory and computing complexity is proportional to the size of the fetched value. +**complexity**: The memory and computing complexity is proportional to the size of the fetched value. This function performs a +DB read. ## ext_call @@ -242,7 +278,7 @@ It consists of the following steps: 1. Loading `callee` buffer from the sandbox memory (see sandboxing memory get) and then decoding it. 2. Loading `value` buffer from the sandbox memory and then decoding it. 3. Loading `input_data` buffer from the sandbox memory. -4. Invoking `call` executive function. +4. Invoking the executive function `call`. Loading of `callee` and `value` buffers should be charged. This is because the sizes of buffers are specified by the calling code, even though marshaled representations are, essentially, of constant size. This can be fixed by assigning an upper bound for sizes of `AccountId` and `Balance`. @@ -298,11 +334,13 @@ This function serializes the address of the caller into the scratch buffer. **complexity**: Assuming that the address is of constant size, this function has constant complexity. -## ext_random_seed +## ext_random -This function serializes the current block's random seed into the scratch buffer. +This function serializes a random number generated by the given subject into the scratch buffer. +The complexity of this function highly depends on the complexity of `System::random`. `max_subject_len` +limits the size of the subject buffer. -**complexity**: Assuming that the random seed is of constant size, this function has constant complexity. +**complexity**: The complexity of this function depends on the implementation of `System::random`. ## ext_now @@ -310,20 +348,10 @@ This function serializes the current block's timestamp into the scratch buffer. **complexity**: Assuming that the timestamp is of constant size, this function has constant complexity. -## ext_input_size - -**complexity**: This function is of constant complexity. - -## ext_input_copy - -This function copies slice of data from the input buffer to the sandbox memory. The calling code specifies the slice length. Execution of the function consists of the following steps: - -1. Storing a specified slice of the input data into the sandbox memory (see sandboxing memory set) - -**complexity**: The computing complexity of this function is proportional to the length of the slice. No additional memory is required. - ## ext_scratch_size +This function returns the size of the scratch buffer. + **complexity**: This function is of constant complexity. ## ext_scratch_copy @@ -354,4 +382,5 @@ It consists of the following steps: 1. Invoking `get_rent_allowance` AccountDB function. 2. Serializing the rent allowance of the current contract into the scratch buffer. -**complexity**: Assuming that the rent allowance is of constant size, this function has constant complexity. +**complexity**: Assuming that the rent allowance is of constant size, this function has constant complexity. This +function performs a DB read. diff --git a/srml/contract/Cargo.toml b/srml/contracts/Cargo.toml similarity index 94% rename from srml/contract/Cargo.toml rename to srml/contracts/Cargo.toml index be34da3cacbbb936351ea01b839f6c373fe081e2..08c44bf63af1e664398d90bfa1387a71f612a667 100644 --- a/srml/contract/Cargo.toml +++ b/srml/contracts/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "srml-contract" +name = "srml-contracts" version = "2.0.0" authors = ["Parity Technologies "] edition = "2018" @@ -23,8 +23,8 @@ timestamp = { package = "srml-timestamp", path = "../timestamp", default-feature wabt = "~0.7.4" assert_matches = "1.1" hex-literal = "0.2.0" -consensus = { package = "srml-consensus", path = "../consensus" } balances = { package = "srml-balances", path = "../balances" } +hex = "0.3" [features] default = ["std"] diff --git a/srml/contract/src/account_db.rs b/srml/contracts/src/account_db.rs similarity index 94% rename from srml/contract/src/account_db.rs rename to srml/contracts/src/account_db.rs index df63ccc479cd5a22ff2f50754740e4d7a2f4632f..80d5fbe3bba58d8af2319e54b4e11a3d333abcd0 100644 --- a/srml/contract/src/account_db.rs +++ b/srml/contracts/src/account_db.rs @@ -75,7 +75,12 @@ pub trait AccountDb { pub struct DirectAccountDb; impl AccountDb for DirectAccountDb { - fn get_storage(&self, _account: &T::AccountId, trie_id: Option<&TrieId>, location: &StorageKey) -> Option> { + fn get_storage( + &self, + _account: &T::AccountId, + trie_id: Option<&TrieId>, + location: &StorageKey + ) -> Option> { trie_id.and_then(|id| child::get_raw(id, &blake2_256(location))) } fn get_code_hash(&self, account: &T::AccountId) -> Option> { @@ -124,6 +129,7 @@ impl AccountDb for DirectAccountDb { trie_id: ::TrieIdGenerator::trie_id(&address), deduct_block: >::block_number(), rent_allowance: >::max_value(), + last_write: None, } } else { // No contract exist and no code_hash provided @@ -138,12 +144,16 @@ impl AccountDb for DirectAccountDb { new_info.code_hash = code_hash; } + if !changed.storage.is_empty() { + new_info.last_write = Some(>::block_number()); + } + for (k, v) in changed.storage.into_iter() { if let Some(value) = child::get_raw(&new_info.trie_id[..], &blake2_256(&k)) { - new_info.storage_size -= value.len() as u64; + new_info.storage_size -= value.len() as u32; } if let Some(value) = v { - new_info.storage_size += value.len() as u64; + new_info.storage_size += value.len() as u32; child::put_raw(&new_info.trie_id[..], &blake2_256(&k), &value[..]); } else { child::kill(&new_info.trie_id[..], &blake2_256(&k)); @@ -172,10 +182,10 @@ impl AccountDb for DirectAccountDb { } pub struct OverlayAccountDb<'a, T: Trait + 'a> { local: RefCell>, - underlying: &'a AccountDb, + underlying: &'a dyn AccountDb, } impl<'a, T: Trait> OverlayAccountDb<'a, T> { - pub fn new(underlying: &'a AccountDb) -> OverlayAccountDb<'a, T> { + pub fn new(underlying: &'a dyn AccountDb) -> OverlayAccountDb<'a, T> { OverlayAccountDb { local: RefCell::new(ChangeSet::new()), underlying, @@ -235,7 +245,12 @@ impl<'a, T: Trait> OverlayAccountDb<'a, T> { } impl<'a, T: Trait> AccountDb for OverlayAccountDb<'a, T> { - fn get_storage(&self, account: &T::AccountId, trie_id: Option<&TrieId>, location: &StorageKey) -> Option> { + fn get_storage( + &self, + account: &T::AccountId, + trie_id: Option<&TrieId>, + location: &StorageKey + ) -> Option> { self.local .borrow() .get(account) diff --git a/srml/contract/src/exec.rs b/srml/contracts/src/exec.rs similarity index 94% rename from srml/contract/src/exec.rs rename to srml/contracts/src/exec.rs index 6c55608b093a3d5ece6a797494bbb1a1b646fe07..7a16c9d60dc7c0ca0ffbf0033224eae1b4adc808 100644 --- a/srml/contract/src/exec.rs +++ b/srml/contracts/src/exec.rs @@ -29,6 +29,9 @@ pub type CallOf = ::Call; pub type MomentOf = ::Moment; pub type SeedOf = ::Hash; +/// A type that represents a topic of an event. At the moment a hash is used. +pub type TopicOf = ::Hash; + #[cfg_attr(test, derive(Debug))] pub struct InstantiateReceipt { pub address: AccountId, @@ -103,11 +106,13 @@ pub trait Ext { /// Returns a reference to the timestamp of the current block fn now(&self) -> &MomentOf; - /// Returns a reference to the random seed for the current block - fn random_seed(&self) -> &SeedOf; + /// Returns a random number for the current block with the given subject. + fn random(&self, subject: &[u8]) -> SeedOf; - /// Deposit an event. - fn deposit_event(&mut self, data: Vec); + /// Deposit an event with the given topics. + /// + /// There should not be any duplicates in `topics`. + fn deposit_event(&mut self, topics: Vec>, data: Vec); /// Set rent allowance of the contract fn set_rent_allowance(&mut self, rent_allowance: BalanceOf); @@ -189,6 +194,15 @@ impl VmExecResult { } } +/// Struct that records a request to deposit an event with a list of topics. +#[cfg_attr(any(feature = "std", test), derive(Debug, PartialEq, Eq))] +pub struct IndexedEvent { + /// A list of topics this event will be deposited with. + pub topics: Vec, + /// The event to deposit. + pub event: Event, +} + /// A trait that represent a virtual machine. /// /// You can view a virtual machine as something that takes code, an input data buffer, @@ -238,7 +252,7 @@ pub struct ExecutionContext<'a, T: Trait + 'a, V, L> { pub self_trie_id: Option, pub overlay: OverlayAccountDb<'a, T>, pub depth: usize, - pub events: Vec>, + pub events: Vec>, pub calls: Vec<(T::AccountId, T::Call)>, pub config: &'a Config, pub vm: &'a V, @@ -339,7 +353,6 @@ where caller: self.self_account.clone(), value_transferred: value, timestamp: timestamp::Module::::now(), - random_seed: system::Module::::random_seed(), }, input_data, empty_output_buf, @@ -409,7 +422,6 @@ where caller: self.self_account.clone(), value_transferred: endowment, timestamp: timestamp::Module::::now(), - random_seed: system::Module::::random_seed(), }, input_data, EmptyOutputBuf::new(), @@ -418,7 +430,10 @@ where .into_result()?; // Deposit an instantiation event. - nested.events.push(RawEvent::Instantiated(self.self_account.clone(), dest.clone())); + nested.events.push(IndexedEvent { + event: RawEvent::Instantiated(self.self_account.clone(), dest.clone()), + topics: Vec::new(), + }); (nested.overlay.into_change_set(), nested.events, nested.calls) }; @@ -545,8 +560,10 @@ fn transfer<'a, T: Trait, V: Vm, L: Loader>( if transactor != dest { ctx.overlay.set_balance(transactor, new_from_balance); ctx.overlay.set_balance(dest, new_to_balance); - ctx.events - .push(RawEvent::Transfer(transactor.clone(), dest.clone(), value)); + ctx.events.push(IndexedEvent { + event: RawEvent::Transfer(transactor.clone(), dest.clone(), value), + topics: Vec::new(), + }); } Ok(()) @@ -557,7 +574,6 @@ struct CallContext<'a, 'b: 'a, T: Trait + 'b, V: Vm + 'b, L: Loader> { caller: T::AccountId, value_transferred: BalanceOf, timestamp: T::Moment, - random_seed: T::Hash, } impl<'a, 'b: 'a, T, E, V, L> Ext for CallContext<'a, 'b, T, V, L> @@ -623,16 +639,19 @@ where self.value_transferred } - fn random_seed(&self) -> &T::Hash { - &self.random_seed + fn random(&self, subject: &[u8]) -> SeedOf { + system::Module::::random(subject) } fn now(&self) -> &T::Moment { &self.timestamp } - fn deposit_event(&mut self, data: Vec) { - self.ctx.events.push(RawEvent::Contract(self.ctx.self_account.clone(), data)); + fn deposit_event(&mut self, topics: Vec, data: Vec) { + self.ctx.events.push(IndexedEvent { + topics, + event: RawEvent::Contract(self.ctx.self_account.clone(), data), + }); } fn set_rent_allowance(&mut self, rent_allowance: BalanceOf) { @@ -659,7 +678,7 @@ where mod tests { use super::{ BalanceOf, ExecFeeToken, ExecutionContext, Ext, Loader, EmptyOutputBuf, TransferFeeKind, TransferFeeToken, - Vm, VmExecResult, InstantiateReceipt, RawEvent, + Vm, VmExecResult, InstantiateReceipt, RawEvent, IndexedEvent, }; use crate::account_db::AccountDb; use crate::gas::GasMeter; @@ -684,7 +703,7 @@ mod tests { } #[derive(Clone)] - struct MockExecutable<'a>(Rc VmExecResult + 'a>); + struct MockExecutable<'a>(Rc VmExecResult + 'a>); impl<'a> MockExecutable<'a> { fn new(f: impl Fn(MockCtx) -> VmExecResult + 'a) -> Self { @@ -1262,8 +1281,14 @@ mod tests { // there are instantiation event. assert_eq!(ctx.overlay.get_code_hash(&created_contract_address).unwrap(), dummy_ch); assert_eq!(&ctx.events, &[ - RawEvent::Transfer(ALICE, created_contract_address, 100), - RawEvent::Instantiated(ALICE, created_contract_address), + IndexedEvent { + event: RawEvent::Transfer(ALICE, created_contract_address, 100), + topics: Vec::new(), + }, + IndexedEvent { + event: RawEvent::Instantiated(ALICE, created_contract_address), + topics: Vec::new(), + } ]); } ); @@ -1314,9 +1339,18 @@ mod tests { // there are instantiation event. assert_eq!(ctx.overlay.get_code_hash(&created_contract_address).unwrap(), dummy_ch); assert_eq!(&ctx.events, &[ - RawEvent::Transfer(ALICE, BOB, 20), - RawEvent::Transfer(BOB, created_contract_address, 15), - RawEvent::Instantiated(BOB, created_contract_address), + IndexedEvent { + event: RawEvent::Transfer(ALICE, BOB, 20), + topics: Vec::new(), + }, + IndexedEvent { + event: RawEvent::Transfer(BOB, created_contract_address, 15), + topics: Vec::new(), + }, + IndexedEvent { + event: RawEvent::Instantiated(BOB, created_contract_address), + topics: Vec::new(), + }, ]); } ); @@ -1362,7 +1396,10 @@ mod tests { // The contract wasn't created so we don't expect to see an instantiation // event here. assert_eq!(&ctx.events, &[ - RawEvent::Transfer(ALICE, BOB, 20), + IndexedEvent { + event: RawEvent::Transfer(ALICE, BOB, 20), + topics: Vec::new(), + }, ]); } ); diff --git a/srml/contract/src/gas.rs b/srml/contracts/src/gas.rs similarity index 97% rename from srml/contract/src/gas.rs rename to srml/contracts/src/gas.rs index f42b0919f3149b1854bb12c7fe1ced368a66ef74..1ea519634463c7ed232e99f1ad9c363247c0ca20 100644 --- a/srml/contract/src/gas.rs +++ b/srml/contracts/src/gas.rs @@ -16,7 +16,7 @@ use crate::{GasSpent, Module, Trait, BalanceOf, NegativeImbalanceOf}; use runtime_primitives::BLOCK_FULL; -use runtime_primitives::traits::{As, CheckedMul, CheckedSub, Zero}; +use runtime_primitives::traits::{CheckedMul, CheckedSub, Zero, SaturatedConversion}; use srml_support::{StorageValue, traits::{OnUnbalanced, ExistenceRequirement, WithdrawReason, Currency, Imbalance}}; #[cfg(test)] @@ -212,7 +212,7 @@ pub fn buy_gas( // Buy the specified amount of gas. let gas_price = >::gas_price(); - let cost = >>::as_(gas_limit.clone()) + let cost = gas_limit.clone().into() .checked_mul(&gas_price) .ok_or("overflow multiplying gas limit by price")?; @@ -248,7 +248,7 @@ pub fn refund_unused_gas( >::mutate(|block_gas_spent| *block_gas_spent += gas_spent); // Refund gas left by the price it was bought at. - let refund = >>::as_(gas_left) * gas_meter.gas_price; + let refund = gas_left.into() * gas_meter.gas_price; let refund_imbalance = T::Currency::deposit_creating(transactor, refund); if let Ok(imbalance) = imbalance.offset(refund_imbalance) { T::GasPayment::on_unbalanced(imbalance); @@ -258,8 +258,7 @@ pub fn refund_unused_gas( /// A little handy utility for converting a value in balance units into approximate value in gas units /// at the given gas price. pub fn approx_gas_for_balance(gas_price: BalanceOf, balance: BalanceOf) -> T::Gas { - let amount_in_gas: BalanceOf = balance / gas_price; - >>::sa(amount_in_gas) + (balance / gas_price).saturated_into::() } /// A simple utility macro that helps to match against a diff --git a/srml/contract/src/lib.rs b/srml/contracts/src/lib.rs similarity index 80% rename from srml/contract/src/lib.rs rename to srml/contracts/src/lib.rs index b6e8c70e8d84b6f60d7cd67f0782fd7736e6922e..b9c8976cc04be0a97ffb33309b8acaa533fe9462 100644 --- a/srml/contract/src/lib.rs +++ b/srml/contracts/src/lib.rs @@ -94,12 +94,16 @@ use crate::account_db::{AccountDb, DirectAccountDb}; #[cfg(feature = "std")] use serde::{Serialize, Deserialize}; use substrate_primitives::crypto::UncheckedFrom; -use rstd::prelude::*; -use rstd::marker::PhantomData; +use rstd::{prelude::*, marker::PhantomData, convert::TryFrom}; use parity_codec::{Codec, Encode, Decode}; -use runtime_primitives::traits::{Hash, As, SimpleArithmetic, Bounded, StaticLookup, Zero}; +use runtime_io::blake2_256; +use runtime_primitives::traits::{ + Hash, SimpleArithmetic, Bounded, StaticLookup, Zero, MaybeSerializeDebug, Member +}; use srml_support::dispatch::{Result, Dispatchable}; -use srml_support::{Parameter, StorageMap, StorageValue, decl_module, decl_event, decl_storage, storage::child}; +use srml_support::{ + Parameter, StorageMap, StorageValue, decl_module, decl_event, decl_storage, storage::child +}; use srml_support::traits::{OnFreeBalanceZero, OnUnbalanced, Currency}; use system::{ensure_signed, RawOrigin}; use substrate_primitives::storage::well_known_keys::CHILD_STORAGE_KEY_PREFIX; @@ -121,6 +125,7 @@ pub trait ComputeDispatchFee { /// Information for managing an acocunt and its sub trie abstraction. /// This is the required info to cache for an account #[derive(Encode, Decode)] +#[cfg_attr(feature = "std", derive(Debug))] pub enum ContractInfo { Alive(AliveContractInfo), Tombstone(TombstoneContractInfo), @@ -178,33 +183,48 @@ impl ContractInfo { } } -pub type AliveContractInfo = RawAliveContractInfo, BalanceOf, ::BlockNumber>; +pub type AliveContractInfo = + RawAliveContractInfo, BalanceOf, ::BlockNumber>; /// Information for managing an account and its sub trie abstraction. /// This is the required info to cache for an account. // Workaround for https://github.com/rust-lang/rust/issues/26925 . Remove when sorted. #[derive(Encode, Decode, Clone, PartialEq, Eq)] +#[cfg_attr(feature = "std", derive(Debug))] pub struct RawAliveContractInfo { /// Unique ID for the subtree encoded as a bytes vector. pub trie_id: TrieId, /// The size of stored value in octet. - pub storage_size: u64, + pub storage_size: u32, /// The code associated with a given account. pub code_hash: CodeHash, + /// Pay rent at most up to this value. pub rent_allowance: Balance, + /// Last block rent has been payed. pub deduct_block: BlockNumber, + /// Last block child storage has been written. + pub last_write: Option, } -#[derive(Encode, Decode)] -pub struct TombstoneContractInfo(T::Hash); +pub type TombstoneContractInfo = + RawTombstoneContractInfo<::Hash, ::Hashing>; + +// Workaround for https://github.com/rust-lang/rust/issues/26925 . Remove when sorted. +#[derive(Encode, Decode, PartialEq, Eq)] +#[cfg_attr(feature = "std", derive(Debug))] +pub struct RawTombstoneContractInfo(H, PhantomData); -impl TombstoneContractInfo { - fn new(storage_root: Vec, storage_size: u64, code_hash: CodeHash) -> Self { +impl RawTombstoneContractInfo +where + H: Member + MaybeSerializeDebug + AsRef<[u8]> + AsMut<[u8]> + Copy + Default + rstd::hash::Hash + + Codec, + Hasher: Hash, +{ + fn new(storage_root: &[u8], code_hash: H) -> Self { let mut buf = Vec::new(); storage_root.using_encoded(|encoded| buf.extend_from_slice(encoded)); - storage_size.using_encoded(|encoded| buf.extend_from_slice(encoded)); buf.extend_from_slice(code_hash.as_ref()); - TombstoneContractInfo(T::Hashing::hash(&buf[..])) + RawTombstoneContractInfo(Hasher::hash(&buf[..]), PhantomData) } } @@ -236,7 +256,10 @@ where fn trie_id(account_id: &T::AccountId) -> TrieId { // Note that skipping a value due to error is not an issue here. // We only need uniqueness, not sequence. - let new_seed = >::mutate(|v| v.wrapping_add(1)); + let new_seed = >::mutate(|v| { + *v = v.wrapping_add(1); + *v + }); let mut buf = Vec::new(); buf.extend_from_slice(account_id.as_ref()); @@ -252,7 +275,8 @@ where } pub type BalanceOf = <::Currency as Currency<::AccountId>>::Balance; -pub type NegativeImbalanceOf = <::Currency as Currency<::AccountId>>::NegativeImbalance; +pub type NegativeImbalanceOf = + <::Currency as Currency<::AccountId>>::NegativeImbalance; pub trait Trait: timestamp::Trait { type Currency: Currency; @@ -263,8 +287,8 @@ pub trait Trait: timestamp::Trait { /// The overarching event type. type Event: From> + Into<::Event>; - // `As` is needed for wasm-utils - type Gas: Parameter + Default + Codec + SimpleArithmetic + Bounded + Copy + As> + As + As; + type Gas: Parameter + Default + Codec + SimpleArithmetic + Bounded + Copy + + Into> + TryFrom>; /// A function type to get the contract address given the creator. type DetermineContractAddress: ContractAddressFor, Self::AccountId>; @@ -310,10 +334,10 @@ where pub struct DefaultDispatchFeeComputor(PhantomData); impl ComputeDispatchFee> for DefaultDispatchFeeComputor { fn compute_dispatch_fee(call: &T::Call) -> BalanceOf { - let encoded_len = call.using_encoded(|encoded| encoded.len()); + let encoded_len = call.using_encoded(|encoded| encoded.len() as u32); let base_fee = >::transaction_base_fee(); let byte_fee = >::transaction_byte_fee(); - base_fee + byte_fee * as As>::sa(encoded_len as u64) + base_fee + byte_fee * encoded_len.into() } } @@ -393,7 +417,12 @@ decl_module! { DirectAccountDb.commit(ctx.overlay.into_change_set()); // Then deposit all events produced. - ctx.events.into_iter().for_each(Self::deposit_event); + ctx.events.into_iter().for_each(|indexed_event| { + >::deposit_event_indexed( + &*indexed_event.topics, + ::Event::from(indexed_event.event).into(), + ); + }); } // Refund cost of the unused gas. @@ -447,7 +476,12 @@ decl_module! { DirectAccountDb.commit(ctx.overlay.into_change_set()); // Then deposit all events produced. - ctx.events.into_iter().for_each(Self::deposit_event); + ctx.events.into_iter().for_each(|indexed_event| { + >::deposit_event_indexed( + &*indexed_event.topics, + ::Event::from(indexed_event.event).into(), + ); + }); } // Refund cost of the unused gas. @@ -473,10 +507,10 @@ decl_module! { fn claim_surcharge(origin, dest: T::AccountId, aux_sender: Option) { let origin = origin.into(); let (signed, rewarded) = match origin { - Some(system::RawOrigin::Signed(ref account)) if aux_sender.is_none() => { + Ok(system::RawOrigin::Signed(ref account)) if aux_sender.is_none() => { (true, account) }, - Some(system::RawOrigin::None) if aux_sender.is_some() => { + Ok(system::RawOrigin::None) if aux_sender.is_some() => { (false, aux_sender.as_ref().expect("checked above")) }, _ => return Err("Invalid surcharge claim: origin must be signed or \ @@ -498,6 +532,84 @@ decl_module! { } } + /// Allows a contract to restore a tombstone by giving its storage. + /// + /// The contract that wants to restore (i.e. origin of the call, or `msg.sender` in Solidity terms) will compute a + /// tombstone with its storage and the given code_hash. If the computed tombstone + /// match the destination one, the destination contract is restored with the rent_allowance` specified, + /// while the origin sends all its funds to the destination and is removed. + fn restore_to( + origin, + dest: T::AccountId, + code_hash: CodeHash, + rent_allowance: BalanceOf, + delta: Vec + ) { + let origin = ensure_signed(origin)?; + + let mut origin_contract = >::get(&origin) + .and_then(|c| c.get_alive()) + .ok_or("Cannot restore from inexisting or tombstone contract")?; + + let current_block = >::block_number(); + + if origin_contract.last_write == Some(current_block) { + return Err("Origin TrieId written in the current block"); + } + + let dest_tombstone = >::get(&dest) + .and_then(|c| c.get_tombstone()) + .ok_or("Cannot restore to inexisting or alive contract")?; + + let last_write = if !delta.is_empty() { + Some(current_block) + } else { + origin_contract.last_write + }; + + let key_values_taken = delta.iter() + .filter_map(|key| { + child::get_raw(&origin_contract.trie_id, &blake2_256(key)).map(|value| { + child::kill(&origin_contract.trie_id, &blake2_256(key)); + (key, value) + }) + }) + .collect::>(); + + let tombstone = >::new( + // This operation is cheap enough because last_write (delta not included) + // is not this block as it has been checked earlier. + &runtime_io::child_storage_root(&origin_contract.trie_id)[..], + code_hash, + ); + + if tombstone != dest_tombstone { + for (key, value) in key_values_taken { + child::put_raw(&origin_contract.trie_id, &blake2_256(key), &value); + } + + return Err("Tombstones don't match"); + } + + origin_contract.storage_size -= key_values_taken.iter() + .map(|(_, value)| value.len() as u32) + .sum::(); + + >::remove(&origin); + >::insert(&dest, ContractInfo::Alive(RawAliveContractInfo { + trie_id: origin_contract.trie_id, + storage_size: origin_contract.storage_size, + code_hash, + rent_allowance, + deduct_block: current_block, + last_write, + })); + + let origin_free_balance = T::Currency::free_balance(&origin); + T::Currency::make_free_balance_be(&origin, >::zero()); + T::Currency::deposit_creating(&dest, origin_free_balance); + } + fn on_finalize() { >::kill(); } @@ -543,7 +655,7 @@ decl_storage! { TombstoneDeposit get(tombstone_deposit) config(): BalanceOf; /// Size of a contract at the time of creation. This is a simple way to ensure /// that empty contracts eventually gets deleted. - StorageSizeOffset get(storage_size_offset) config(): u64; + StorageSizeOffset get(storage_size_offset) config(): u32; /// Price of a byte of storage per one block interval. Should be greater than 0. RentByteFee get(rent_byte_price) config(): BalanceOf; /// The amount of funds a contract should deposit in order to offset @@ -566,17 +678,17 @@ decl_storage! { /// The fee to be paid for making a transaction; the per-byte portion. TransactionByteFee get(transaction_byte_fee) config(): BalanceOf; /// The fee required to create a contract instance. - ContractFee get(contract_fee) config(): BalanceOf = BalanceOf::::sa(21); + ContractFee get(contract_fee) config(): BalanceOf = 21.into(); /// The base fee charged for calling into a contract. - CallBaseFee get(call_base_fee) config(): T::Gas = T::Gas::sa(135); + CallBaseFee get(call_base_fee) config(): T::Gas = 135.into(); /// The base fee charged for creating a contract. - CreateBaseFee get(create_base_fee) config(): T::Gas = T::Gas::sa(175); + CreateBaseFee get(create_base_fee) config(): T::Gas = 175.into(); /// The price of one unit of gas. - GasPrice get(gas_price) config(): BalanceOf = BalanceOf::::sa(1); + GasPrice get(gas_price) config(): BalanceOf = 1.into(); /// The maximum nesting level of a call/create stack. MaxDepth get(max_depth) config(): u32 = 100; /// The maximum amount of gas that could be expended per block. - BlockGasLimit get(block_gas_limit) config(): T::Gas = T::Gas::sa(1_000_000); + BlockGasLimit get(block_gas_limit) config(): T::Gas = 10_000_000.into(); /// Gas spent so far in this block. GasSpent get(gas_spent): T::Gas; /// Current cost schedule for contracts. @@ -653,8 +765,11 @@ pub struct Schedule { /// Gas cost to deposit an event; the per-byte portion. pub event_data_per_byte_cost: Gas, + /// Gas cost to deposit an event; the cost per topic. + pub event_per_topic_cost: Gas, + /// Gas cost to deposit an event; the base. - pub event_data_base_cost: Gas, + pub event_base_cost: Gas, /// Gas cost per one byte read from the sandbox memory. pub sandbox_data_read_cost: Gas, @@ -662,6 +777,9 @@ pub struct Schedule { /// Gas cost per one byte written to the sandbox memory. pub sandbox_data_write_cost: Gas, + /// The maximum number of topics supported by an event. + pub max_event_topics: u32, + /// Maximum allowed stack height. /// /// See https://wiki.parity.io/WebAssembly-StackHeight to find out @@ -674,23 +792,29 @@ pub struct Schedule { /// Whether the `ext_println` function is allowed to be used contracts. /// MUST only be enabled for `dev` chains, NOT for production chains pub enable_println: bool, + + /// The maximum length of a subject used for PRNG generation. + pub max_subject_len: u32, } -impl> Default for Schedule { +impl> Default for Schedule { fn default() -> Schedule { Schedule { version: 0, - put_code_per_byte_cost: Gas::sa(1), - grow_mem_cost: Gas::sa(1), - regular_op_cost: Gas::sa(1), - return_data_per_byte_cost: Gas::sa(1), - event_data_per_byte_cost: Gas::sa(1), - event_data_base_cost: Gas::sa(1), - sandbox_data_read_cost: Gas::sa(1), - sandbox_data_write_cost: Gas::sa(1), + put_code_per_byte_cost: 1.into(), + grow_mem_cost: 1.into(), + regular_op_cost: 1.into(), + return_data_per_byte_cost: 1.into(), + event_data_per_byte_cost: 1.into(), + event_per_topic_cost: 1.into(), + event_base_cost: 1.into(), + sandbox_data_read_cost: 1.into(), + sandbox_data_write_cost: 1.into(), + max_event_topics: 4, max_stack_height: 64 * 1024, max_memory_pages: 16, enable_println: false, + max_subject_len: 32, } } } diff --git a/srml/contract/src/rent.rs b/srml/contracts/src/rent.rs similarity index 94% rename from srml/contract/src/rent.rs rename to srml/contracts/src/rent.rs index 5466e2553d90b2236102990374b391ebec4726f5..3baf043b90d37d16ceefd29e141f5c727a5d3eb0 100644 --- a/srml/contract/src/rent.rs +++ b/srml/contracts/src/rent.rs @@ -15,7 +15,8 @@ // along with Substrate. If not, see . use crate::{BalanceOf, ContractInfo, ContractInfoOf, Module, TombstoneContractInfo, Trait}; -use runtime_primitives::traits::{As, Bounded, CheckedDiv, CheckedMul, Saturating, Zero}; +use runtime_primitives::traits::{Bounded, CheckedDiv, CheckedMul, Saturating, Zero, + SaturatedConversion}; use srml_support::traits::{Currency, ExistenceRequirement, Imbalance, WithdrawReason}; use srml_support::StorageMap; @@ -75,10 +76,10 @@ fn try_evict_or_and_pay_rent( let fee_per_block = { let free_storage = balance .checked_div(&>::rent_deposit_offset()) - .unwrap_or(>::sa(0)); + .unwrap_or_else(Zero::zero); let effective_storage_size = - >::sa(contract.storage_size).saturating_sub(free_storage); + >::from(contract.storage_size).saturating_sub(free_storage); effective_storage_size .checked_mul(&>::rent_byte_price()) @@ -95,7 +96,7 @@ fn try_evict_or_and_pay_rent( let subsistence_threshold = T::Currency::minimum_balance() + >::tombstone_deposit(); let dues = fee_per_block - .checked_mul(&>::sa(blocks_passed.as_())) + .checked_mul(&blocks_passed.saturated_into::().into()) .unwrap_or(>::max_value()); let dues_limited = dues.min(contract.rent_allowance); @@ -162,9 +163,8 @@ fn try_evict_or_and_pay_rent( // Note: this operation is heavy. let child_storage_root = runtime_io::child_storage_root(&contract.trie_id); - let tombstone = TombstoneContractInfo::new( - child_storage_root, - contract.storage_size, + let tombstone = >::new( + &child_storage_root[..], contract.code_hash, ); >::insert(account, ContractInfo::Tombstone(tombstone)); diff --git a/srml/contract/src/tests.rs b/srml/contracts/src/tests.rs similarity index 66% rename from srml/contract/src/tests.rs rename to srml/contracts/src/tests.rs index a428018f8941fa8fdd7d0c1419d475d9f89c0ca2..79243f5d845f3c70d7d9cfca1d2e572634b46ed2 100644 --- a/srml/contract/src/tests.rs +++ b/srml/contracts/src/tests.rs @@ -21,8 +21,8 @@ use crate::account_db::{AccountDb, DirectAccountDb, OverlayAccountDb}; use crate::{ - BalanceOf, ComputeDispatchFee, ContractAddressFor, ContractInfo, ContractInfoOf, GenesisConfig, Module, - RawAliveContractInfo, RawEvent, Trait, TrieId, TrieIdFromParentCounter, TrieIdGenerator, + BalanceOf, ComputeDispatchFee, ContractAddressFor, ContractInfo, ContractInfoOf, GenesisConfig, + Module, RawAliveContractInfo, RawEvent, Trait, TrieId, TrieIdFromParentCounter, TrieIdGenerator, }; use assert_matches::assert_matches; use hex_literal::*; @@ -30,17 +30,17 @@ use parity_codec::{Decode, Encode, KeyedVec}; use runtime_io; use runtime_io::with_externalities; use runtime_primitives::testing::{Digest, DigestItem, Header, UintAuthorityId, H256}; -use runtime_primitives::traits::{As, BlakeTwo256, IdentityLookup}; +use runtime_primitives::traits::{BlakeTwo256, IdentityLookup}; use runtime_primitives::BuildStorage; use srml_support::{ assert_ok, impl_outer_dispatch, impl_outer_event, impl_outer_origin, storage::child, - traits::Currency, StorageMap, + traits::Currency, StorageMap, StorageValue }; use std::sync::atomic::{AtomicUsize, Ordering}; use substrate_primitives::storage::well_known_keys; use substrate_primitives::Blake2Hasher; use system::{self, EventRecord, Phase}; -use {balances, consensus, wabt}; +use {balances, wabt}; mod contract { // Re-export contents of the root. This basically @@ -64,7 +64,7 @@ impl_outer_dispatch! { } } -#[derive(Clone, Eq, PartialEq)] +#[derive(Clone, Eq, PartialEq, Debug)] pub struct Test; impl system::Trait for Test { type Origin = Origin; @@ -72,12 +72,10 @@ impl system::Trait for Test { type BlockNumber = u64; type Hash = H256; type Hashing = BlakeTwo256; - type Digest = Digest; type AccountId = u64; type Lookup = IdentityLookup; type Header = Header; type Event = MetaEvent; - type Log = DigestItem; } impl balances::Trait for Test { type Balance = u64; @@ -92,11 +90,6 @@ impl timestamp::Trait for Test { type Moment = u64; type OnTimestampSet = (); } -impl consensus::Trait for Test { - type Log = DigestItem; - type SessionKey = UintAuthorityId; - type InherentOfflineReport = (); -} impl Trait for Test { type Currency = Balances; type Call = Call; @@ -119,18 +112,21 @@ impl ContractAddressFor for DummyContractAddressFor { } } -static KEY_COUNTER: AtomicUsize = AtomicUsize::new(0); - pub struct DummyTrieIdGenerator; impl TrieIdGenerator for DummyTrieIdGenerator { fn trie_id(account_id: &u64) -> TrieId { use substrate_primitives::storage::well_known_keys; + let new_seed = >::mutate(|v| { + *v = v.wrapping_add(1); + *v + }); + // TODO: see https://github.com/paritytech/substrate/issues/2325 let mut res = vec![]; res.extend_from_slice(well_known_keys::CHILD_STORAGE_KEY_PREFIX); res.extend_from_slice(b"default:"); - res.extend_from_slice(&KEY_COUNTER.fetch_add(1, Ordering::Relaxed).to_le_bytes()); + res.extend_from_slice(&new_seed.to_le_bytes()); res.extend_from_slice(&account_id.to_le_bytes()); res } @@ -146,6 +142,7 @@ impl ComputeDispatchFee for DummyComputeDispatchFee { const ALICE: u64 = 1; const BOB: u64 = 2; const CHARLIE: u64 = 3; +const DJANGO: u64 = 4; pub struct ExtBuilder { existential_deposit: u64, @@ -263,6 +260,7 @@ fn account_removal_removes_storage() { deduct_block: System::block_number(), code_hash: H256::repeat_byte(1), rent_allowance: 40, + last_write: None, })); let mut overlay = OverlayAccountDb::::new(&DirectAccountDb); @@ -277,6 +275,7 @@ fn account_removal_removes_storage() { deduct_block: System::block_number(), code_hash: H256::repeat_byte(2), rent_allowance: 40, + last_write: None, })); let mut overlay = OverlayAccountDb::::new(&DirectAccountDb); @@ -294,15 +293,15 @@ fn account_removal_removes_storage() { // Verify that all entries from account 1 is removed, while // entries from account 2 is in place. { - assert!(>::get_storage(&DirectAccountDb, &1, Some(&trie_id1), key1).is_none()); - assert!(>::get_storage(&DirectAccountDb, &1, Some(&trie_id1), key2).is_none()); + assert!(>::get_storage(&DirectAccountDb, &1, Some(&trie_id1), key1).is_none()); + assert!(>::get_storage(&DirectAccountDb, &1, Some(&trie_id1), key2).is_none()); assert_eq!( - >::get_storage(&DirectAccountDb, &2, Some(&trie_id2), key1), + >::get_storage(&DirectAccountDb, &2, Some(&trie_id2), key1), Some(b"3".to_vec()) ); assert_eq!( - >::get_storage(&DirectAccountDb, &2, Some(&trie_id2), key2), + >::get_storage(&DirectAccountDb, &2, Some(&trie_id2), key2), Some(b"4".to_vec()) ); } @@ -313,14 +312,16 @@ fn account_removal_removes_storage() { const CODE_RETURN_FROM_START_FN: &str = r#" (module (import "env" "ext_return" (func $ext_return (param i32 i32))) - (import "env" "ext_deposit_event" (func $ext_deposit_event (param i32 i32))) + (import "env" "ext_deposit_event" (func $ext_deposit_event (param i32 i32 i32 i32))) (import "env" "memory" (memory 1 1)) (start $start) (func $start (call $ext_deposit_event - (i32.const 8) - (i32.const 4) + (i32.const 0) ;; The topics buffer + (i32.const 0) ;; The topics buffer's length + (i32.const 8) ;; The data buffer + (i32.const 4) ;; The data buffer's length ) (call $ext_return (i32.const 8) @@ -337,7 +338,7 @@ const CODE_RETURN_FROM_START_FN: &str = r#" (data (i32.const 8) "\01\02\03\04") ) "#; -const HASH_RETURN_FROM_START_FN: [u8; 32] = hex!("abb4194bdea47b2904fe90b4fd674bd40d96f423956627df8c39d2b1a791ab9d"); +const HASH_RETURN_FROM_START_FN: [u8; 32] = hex!("66c45bd7c473a1746e1d241176166ef53b1f207f56c5e87d1b6650140704181b"); #[test] fn instantiate_and_call_and_deposit_event() { @@ -363,28 +364,34 @@ fn instantiate_and_call_and_deposit_event() { EventRecord { phase: Phase::ApplyExtrinsic(0), event: MetaEvent::balances(balances::RawEvent::NewAccount(1, 1_000_000)), + topics: vec![], }, EventRecord { phase: Phase::ApplyExtrinsic(0), event: MetaEvent::contract(RawEvent::CodeStored(HASH_RETURN_FROM_START_FN.into())), + topics: vec![], }, EventRecord { phase: Phase::ApplyExtrinsic(0), event: MetaEvent::balances( balances::RawEvent::NewAccount(BOB, 100) - ) + ), + topics: vec![], }, EventRecord { phase: Phase::ApplyExtrinsic(0), - event: MetaEvent::contract(RawEvent::Transfer(ALICE, BOB, 100)) + event: MetaEvent::contract(RawEvent::Transfer(ALICE, BOB, 100)), + topics: vec![], }, EventRecord { phase: Phase::ApplyExtrinsic(0), - event: MetaEvent::contract(RawEvent::Contract(BOB, vec![1, 2, 3, 4])) + event: MetaEvent::contract(RawEvent::Contract(BOB, vec![1, 2, 3, 4])), + topics: vec![], }, EventRecord { phase: Phase::ApplyExtrinsic(0), - event: MetaEvent::contract(RawEvent::Instantiated(ALICE, BOB)) + event: MetaEvent::contract(RawEvent::Instantiated(ALICE, BOB)), + topics: vec![], } ]); @@ -416,7 +423,7 @@ const HASH_DISPATCH_CALL: [u8; 32] = hex!("49dfdcaf9c1553be10634467e95b8e71a3bc1 fn dispatch_call() { // This test can fail due to the encoding changes. In case it becomes too annoying // let's rewrite so as we use this module controlled call or we serialize it in runtime. - let encoded = parity_codec::Encode::encode(&Call::Balances(balances::Call::transfer(CHARLIE, 50))); + let encoded = Encode::encode(&Call::Balances(balances::Call::transfer(CHARLIE, 50))); assert_eq!(&encoded[..], &hex!("00000300000000000000C8")[..]); let wasm = wabt::wat2wasm(CODE_DISPATCH_CALL).unwrap(); @@ -434,10 +441,12 @@ fn dispatch_call() { EventRecord { phase: Phase::ApplyExtrinsic(0), event: MetaEvent::balances(balances::RawEvent::NewAccount(1, 1_000_000)), + topics: vec![], }, EventRecord { phase: Phase::ApplyExtrinsic(0), event: MetaEvent::contract(RawEvent::CodeStored(HASH_DISPATCH_CALL.into())), + topics: vec![], }, ]); @@ -461,24 +470,29 @@ fn dispatch_call() { EventRecord { phase: Phase::ApplyExtrinsic(0), event: MetaEvent::balances(balances::RawEvent::NewAccount(1, 1_000_000)), + topics: vec![], }, EventRecord { phase: Phase::ApplyExtrinsic(0), event: MetaEvent::contract(RawEvent::CodeStored(HASH_DISPATCH_CALL.into())), + topics: vec![], }, EventRecord { phase: Phase::ApplyExtrinsic(0), event: MetaEvent::balances( balances::RawEvent::NewAccount(BOB, 100) - ) + ), + topics: vec![], }, EventRecord { phase: Phase::ApplyExtrinsic(0), - event: MetaEvent::contract(RawEvent::Transfer(ALICE, BOB, 100)) + event: MetaEvent::contract(RawEvent::Transfer(ALICE, BOB, 100)), + topics: vec![], }, EventRecord { phase: Phase::ApplyExtrinsic(0), - event: MetaEvent::contract(RawEvent::Instantiated(ALICE, BOB)) + event: MetaEvent::contract(RawEvent::Instantiated(ALICE, BOB)), + topics: vec![], }, // Dispatching the call. @@ -486,19 +500,22 @@ fn dispatch_call() { phase: Phase::ApplyExtrinsic(0), event: MetaEvent::balances( balances::RawEvent::NewAccount(CHARLIE, 50) - ) + ), + topics: vec![], }, EventRecord { phase: Phase::ApplyExtrinsic(0), event: MetaEvent::balances( balances::RawEvent::Transfer(BOB, CHARLIE, 50, 0) - ) + ), + topics: vec![], }, // Event emited as a result of dispatch. EventRecord { phase: Phase::ApplyExtrinsic(0), - event: MetaEvent::contract(RawEvent::Dispatched(BOB, true)) + event: MetaEvent::contract(RawEvent::Dispatched(BOB, true)), + topics: vec![], } ]); }, @@ -510,8 +527,8 @@ const CODE_SET_RENT: &str = r#" (import "env" "ext_dispatch_call" (func $ext_dispatch_call (param i32 i32))) (import "env" "ext_set_storage" (func $ext_set_storage (param i32 i32 i32 i32))) (import "env" "ext_set_rent_allowance" (func $ext_set_rent_allowance (param i32 i32))) - (import "env" "ext_input_size" (func $ext_input_size (result i32))) - (import "env" "ext_input_copy" (func $ext_input_copy (param i32 i32 i32))) + (import "env" "ext_scratch_size" (func $ext_scratch_size (result i32))) + (import "env" "ext_scratch_copy" (func $ext_scratch_copy (param i32 i32 i32))) (import "env" "memory" (memory 1 1)) ;; insert a value of 4 bytes into storage @@ -537,7 +554,7 @@ const CODE_SET_RENT: &str = r#" ;; transfer 50 to ALICE (func $call_2 (call $ext_dispatch_call - (i32.const 8) + (i32.const 68) (i32.const 11) ) ) @@ -558,7 +575,7 @@ const CODE_SET_RENT: &str = r#" (func (export "call") (local $input_size i32) (set_local $input_size - (call $ext_input_size) + (call $ext_scratch_size) ) (block $IF_ELSE (block $IF_2 @@ -585,16 +602,16 @@ const CODE_SET_RENT: &str = r#" ;; Set call set_rent_allowance with input (func (export "deploy") (local $input_size i32) + (set_local $input_size + (call $ext_scratch_size) + ) (call $ext_set_storage (i32.const 0) (i32.const 1) (i32.const 0) (i32.const 4) ) - (set_local $input_size - (call $ext_input_size) - ) - (call $ext_input_copy + (call $ext_scratch_copy (i32.const 0) (i32.const 0) (get_local $input_size) @@ -609,10 +626,12 @@ const CODE_SET_RENT: &str = r#" (data (i32.const 0) "\28") ;; Encoding of call transfer 50 to CHARLIE - (data (i32.const 8) "\00\00\03\00\00\00\00\00\00\00\C8") + (data (i32.const 68) "\00\00\03\00\00\00\00\00\00\00\C8") ) "#; -const HASH_SET_RENT: [u8; 32] = hex!("a51c2a6f3f68936d4ae9abdb93b28eedcbd0f6f39770e168f9025f0c1e7094ef"); + +// Use test_hash_and_code test to get the actual hash if the code changed. +const HASH_SET_RENT: [u8; 32] = hex!("69aedfb4f6c1c398e97f8a5204de0f95ad5e7dc3540960beab11a86c569fbfcf"); /// Input data for each call in set_rent code mod call { @@ -625,10 +644,10 @@ mod call { /// Test correspondance of set_rent code and its hash. /// Also test that encoded extrinsic in code correspond to the correct transfer #[test] -fn set_rent_hash_and_code() { +fn test_set_rent_code_and_hash() { // This test can fail due to the encoding changes. In case it becomes too annoying // let's rewrite so as we use this module controlled call or we serialize it in runtime. - let encoded = parity_codec::Encode::encode(&Call::Balances(balances::Call::transfer(CHARLIE, 50))); + let encoded = Encode::encode(&Call::Balances(balances::Call::transfer(CHARLIE, 50))); assert_eq!(&encoded[..], &hex!("00000300000000000000C8")[..]); let wasm = wabt::wat2wasm(CODE_SET_RENT).unwrap(); @@ -639,15 +658,18 @@ fn set_rent_hash_and_code() { Balances::deposit_creating(&ALICE, 1_000_000); assert_ok!(Contract::put_code(Origin::signed(ALICE), 100_000, wasm)); - // If you ever need to update the wasm source this test will fail and will show you the actual hash. + // If you ever need to update the wasm source this test will fail + // and will show you the actual hash. assert_eq!(System::events(), vec![ EventRecord { phase: Phase::ApplyExtrinsic(0), event: MetaEvent::balances(balances::RawEvent::NewAccount(1, 1_000_000)), + topics: vec![], }, EventRecord { phase: Phase::ApplyExtrinsic(0), event: MetaEvent::contract(RawEvent::CodeStored(HASH_SET_RENT.into())), + topics: vec![], }, ]); } @@ -669,17 +691,17 @@ fn storage_size() { Origin::signed(ALICE), 30_000, 100_000, HASH_SET_RENT.into(), - ::Balance::sa(1_000u64).encode() // rent allowance + ::Balance::from(1_000u32).encode() // rent allowance )); - let bob_contract = super::ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap(); + let bob_contract = ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap(); assert_eq!(bob_contract.storage_size, Contract::storage_size_offset() + 4); assert_ok!(Contract::call(Origin::signed(ALICE), BOB, 0, 100_000, call::set_storage_4_byte())); - let bob_contract = super::ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap(); + let bob_contract = ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap(); assert_eq!(bob_contract.storage_size, Contract::storage_size_offset() + 4 + 4); assert_ok!(Contract::call(Origin::signed(ALICE), BOB, 0, 100_000, call::remove_storage_4_byte())); - let bob_contract = super::ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap(); + let bob_contract = ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap(); assert_eq!(bob_contract.storage_size, Contract::storage_size_offset() + 4); } ); @@ -699,15 +721,15 @@ fn deduct_blocks() { Origin::signed(ALICE), 30_000, 100_000, HASH_SET_RENT.into(), - ::Balance::sa(1_000u64).encode() // rent allowance + ::Balance::from(1_000u32).encode() // rent allowance )); // Check creation - let bob_contract = super::ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap(); + let bob_contract = ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap(); assert_eq!(bob_contract.rent_allowance, 1_000); // Advance 4 blocks - System::initialize(&5, &[0u8; 32].into(), &[0u8; 32].into()); + System::initialize(&5, &[0u8; 32].into(), &[0u8; 32].into(), &Default::default()); // Trigger rent through call assert_ok!(Contract::call(Origin::signed(ALICE), BOB, 0, 100_000, call::null())); @@ -716,13 +738,13 @@ fn deduct_blocks() { let rent = (8 + 4 - 3) // storage size = size_offset + deploy_set_storage - deposit_offset * 4 // rent byte price * 4; // blocks to rent - let bob_contract = super::ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap(); + let bob_contract = ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap(); assert_eq!(bob_contract.rent_allowance, 1_000 - rent); assert_eq!(bob_contract.deduct_block, 5); assert_eq!(Balances::free_balance(BOB), 30_000 - rent); // Advance 7 blocks more - System::initialize(&12, &[0u8; 32].into(), &[0u8; 32].into()); + System::initialize(&12, &[0u8; 32].into(), &[0u8; 32].into(), &Default::default()); // Trigger rent through call assert_ok!(Contract::call(Origin::signed(ALICE), BOB, 0, 100_000, call::null())); @@ -731,7 +753,7 @@ fn deduct_blocks() { let rent_2 = (8 + 4 - 2) // storage size = size_offset + deploy_set_storage - deposit_offset * 4 // rent byte price * 7; // blocks to rent - let bob_contract = super::ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap(); + let bob_contract = ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap(); assert_eq!(bob_contract.rent_allowance, 1_000 - rent - rent_2); assert_eq!(bob_contract.deduct_block, 12); assert_eq!(Balances::free_balance(BOB), 30_000 - rent - rent_2); @@ -739,7 +761,7 @@ fn deduct_blocks() { // Second call on same block should have no effect on rent assert_ok!(Contract::call(Origin::signed(ALICE), BOB, 0, 100_000, call::null())); - let bob_contract = super::ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap(); + let bob_contract = ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap(); assert_eq!(bob_contract.rent_allowance, 1_000 - rent - rent_2); assert_eq!(bob_contract.deduct_block, 12); assert_eq!(Balances::free_balance(BOB), 30_000 - rent - rent_2); @@ -792,19 +814,19 @@ fn claim_surcharge(blocks: u64, trigger_call: impl Fn() -> bool, removes: bool) Origin::signed(ALICE), 100, 100_000, HASH_SET_RENT.into(), - ::Balance::sa(1_000u64).encode() // rent allowance + ::Balance::from(1_000u32).encode() // rent allowance )); // Advance blocks - System::initialize(&blocks, &[0u8; 32].into(), &[0u8; 32].into()); + System::initialize(&blocks, &[0u8; 32].into(), &[0u8; 32].into(), &Default::default()); // Trigger rent through call assert!(trigger_call()); if removes { - assert!(super::ContractInfoOf::::get(BOB).unwrap().get_tombstone().is_some()); + assert!(ContractInfoOf::::get(BOB).unwrap().get_tombstone().is_some()); } else { - assert!(super::ContractInfoOf::::get(BOB).unwrap().get_alive().is_some()); + assert!(ContractInfoOf::::get(BOB).unwrap().get_alive().is_some()); } } ); @@ -828,26 +850,26 @@ fn removals(trigger_call: impl Fn() -> bool) { Origin::signed(ALICE), 100, 100_000, HASH_SET_RENT.into(), - ::Balance::sa(1_000u64).encode() // rent allowance + ::Balance::from(1_000u32).encode() // rent allowance )); // Trigger rent must have no effect assert!(trigger_call()); - assert_eq!(super::ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap().rent_allowance, 1_000); + assert_eq!(ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap().rent_allowance, 1_000); // Advance blocks - System::initialize(&10, &[0u8; 32].into(), &[0u8; 32].into()); + System::initialize(&10, &[0u8; 32].into(), &[0u8; 32].into(), &Default::default()); // Trigger rent through call assert!(trigger_call()); - assert!(super::ContractInfoOf::::get(BOB).unwrap().get_tombstone().is_some()); + assert!(ContractInfoOf::::get(BOB).unwrap().get_tombstone().is_some()); // Advance blocks - System::initialize(&20, &[0u8; 32].into(), &[0u8; 32].into()); + System::initialize(&20, &[0u8; 32].into(), &[0u8; 32].into(), &Default::default()); // Trigger rent must have no effect assert!(trigger_call()); - assert!(super::ContractInfoOf::::get(BOB).unwrap().get_tombstone().is_some()); + assert!(ContractInfoOf::::get(BOB).unwrap().get_tombstone().is_some()); } ); @@ -862,26 +884,26 @@ fn removals(trigger_call: impl Fn() -> bool) { Origin::signed(ALICE), 1_000, 100_000, HASH_SET_RENT.into(), - ::Balance::sa(100u64).encode() // rent allowance + ::Balance::from(100u32).encode() // rent allowance )); // Trigger rent must have no effect assert!(trigger_call()); - assert_eq!(super::ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap().rent_allowance, 100); + assert_eq!(ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap().rent_allowance, 100); // Advance blocks - System::initialize(&10, &[0u8; 32].into(), &[0u8; 32].into()); + System::initialize(&10, &[0u8; 32].into(), &[0u8; 32].into(), &Default::default()); // Trigger rent through call assert!(trigger_call()); - assert!(super::ContractInfoOf::::get(BOB).unwrap().get_tombstone().is_some()); + assert!(ContractInfoOf::::get(BOB).unwrap().get_tombstone().is_some()); // Advance blocks - System::initialize(&20, &[0u8; 32].into(), &[0u8; 32].into()); + System::initialize(&20, &[0u8; 32].into(), &[0u8; 32].into(), &Default::default()); // Trigger rent must have no effect assert!(trigger_call()); - assert!(super::ContractInfoOf::::get(BOB).unwrap().get_tombstone().is_some()); + assert!(ContractInfoOf::::get(BOB).unwrap().get_tombstone().is_some()); } ); @@ -896,30 +918,30 @@ fn removals(trigger_call: impl Fn() -> bool) { Origin::signed(ALICE), 50+Balances::minimum_balance(), 100_000, HASH_SET_RENT.into(), - ::Balance::sa(1_000u64).encode() // rent allowance + ::Balance::from(1_000u32).encode() // rent allowance )); // Trigger rent must have no effect assert!(trigger_call()); - assert_eq!(super::ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap().rent_allowance, 1_000); + assert_eq!(ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap().rent_allowance, 1_000); // Transfer funds assert_ok!(Contract::call(Origin::signed(ALICE), BOB, 0, 100_000, call::transfer())); - assert_eq!(super::ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap().rent_allowance, 1_000); + assert_eq!(ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap().rent_allowance, 1_000); // Advance blocks - System::initialize(&10, &[0u8; 32].into(), &[0u8; 32].into()); + System::initialize(&10, &[0u8; 32].into(), &[0u8; 32].into(), &Default::default()); // Trigger rent through call assert!(trigger_call()); - assert!(super::ContractInfoOf::::get(BOB).is_none()); + assert!(ContractInfoOf::::get(BOB).is_none()); // Advance blocks - System::initialize(&20, &[0u8; 32].into(), &[0u8; 32].into()); + System::initialize(&20, &[0u8; 32].into(), &[0u8; 32].into(), &Default::default()); // Trigger rent must have no effect assert!(trigger_call()); - assert!(super::ContractInfoOf::::get(BOB).is_none()); + assert!(ContractInfoOf::::get(BOB).is_none()); } ); } @@ -973,7 +995,8 @@ const CODE_CHECK_DEFAULT_RENT_ALLOWANCE: &str = r#" ) ) "#; -const HASH_CHECK_DEFAULT_RENT_ALLOWANCE: [u8; 32] = hex!("4f9ec2b94eea522cfff10b77ef4056c631045c00978a457d283950521ecf07b6"); +const HASH_CHECK_DEFAULT_RENT_ALLOWANCE: [u8; 32] = + hex!("4f9ec2b94eea522cfff10b77ef4056c631045c00978a457d283950521ecf07b6"); #[test] fn default_rent_allowance_on_create() { @@ -994,18 +1017,243 @@ fn default_rent_allowance_on_create() { )); // Check creation - let bob_contract = super::ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap(); + let bob_contract = ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap(); assert_eq!(bob_contract.rent_allowance, >::max_value()); // Advance blocks - System::initialize(&5, &[0u8; 32].into(), &[0u8; 32].into()); + System::initialize(&5, &[0u8; 32].into(), &[0u8; 32].into(), &Default::default()); // Trigger rent through call assert_ok!(Contract::call(Origin::signed(ALICE), BOB, 0, 100_000, call::null())); // Check contract is still alive - let bob_contract = super::ContractInfoOf::::get(BOB).unwrap().get_alive(); + let bob_contract = ContractInfoOf::::get(BOB).unwrap().get_alive(); assert!(bob_contract.is_some()) } ); } + +const CODE_RESTORATION: &str = r#" +(module + (import "env" "ext_set_storage" (func $ext_set_storage (param i32 i32 i32 i32))) + (import "env" "ext_dispatch_call" (func $ext_dispatch_call (param i32 i32))) + (import "env" "memory" (memory 1 1)) + + (func (export "call") + (call $ext_dispatch_call + ;; Pointer to the start of the encoded call buffer + (i32.const 200) + ;; The length of the encoded call buffer. + ;; + ;; NB: This is required to keep in sync with the values in `restoration`. + (i32.const 115) + ) + ) + (func (export "deploy") + ;; Data to restore + (call $ext_set_storage + (i32.const 0) + (i32.const 1) + (i32.const 0) + (i32.const 4) + ) + + ;; ACL + (call $ext_set_storage + (i32.const 100) + (i32.const 1) + (i32.const 0) + (i32.const 4) + ) + ) + + ;; Data to restore + (data (i32.const 0) "\28") + + ;; ACL + (data (i32.const 100) "\01") + + ;; Serialized version of `T::Call` that encodes a call to `restore_to` function. For more + ;; details check out the `ENCODED_CALL_LITERAL`. + (data (i32.const 200) + "\01\05\02\00\00\00\00\00\00\00\69\ae\df\b4\f6\c1\c3\98\e9\7f\8a\52\04\de\0f\95\ad\5e\7d\c3" + "\54\09\60\be\ab\11\a8\6c\56\9f\bf\cf\32\00\00\00\00\00\00\00\08\01\00\00\00\00\00\00\00\00" + "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\00\00\00" + "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00" + ) +) +"#; +const HASH_RESTORATION: [u8; 32] = hex!("02988182efba70fe605031f5c55bfa59e47f72c0a4707f22b6b74fffbf7803dc"); + +#[test] +fn restorations_dirty_storage_and_different_storage() { + restoration(true, true); +} + +#[test] +fn restorations_dirty_storage() { + restoration(false, true); +} + +#[test] +fn restoration_different_storage() { + restoration(true, false); +} + +#[test] +fn restoration_success() { + restoration(false, false); +} + +fn restoration(test_different_storage: bool, test_restore_to_with_dirty_storage: bool) { + let acl_key = { + let mut s = [0u8; 32]; + s[0] = 1; + s + }; + + // This test can fail due to the encoding changes. In case it becomes too annoying + // let's rewrite so as we use this module controlled call or we serialize it in runtime. + let encoded = hex::encode(Encode::encode(&Call::Contract(super::Call::restore_to( + BOB, + HASH_SET_RENT.into(), + ::Balance::from(50u32), + vec![acl_key, acl_key], + )))); + + // `ENCODED_CALL_LITERAL` is encoded `T::Call` represented as a byte array. There is an exact + // same copy of this (modulo hex notation differences) in `CODE_RESTORATION`. + // + // When this assert is triggered make sure that you update the literals here and in + // `CODE_RESTORATION`. Hopefully, we switch to automatical injection of the code. + const ENCODED_CALL_LITERAL: &str = + "0105020000000000000069aedfb4f6c1c398e97f8a5204de0f95ad5e7dc3540960beab11a86c569fbfcf320000\ + 0000000000080100000000000000000000000000000000000000000000000000000000000000010000000000000\ + 0000000000000000000000000000000000000000000000000"; + assert_eq!( + encoded, + ENCODED_CALL_LITERAL, + "The literal was changed and requires updating here and in `CODE_RESTORATION`", + ); + assert_eq!( + hex::decode(ENCODED_CALL_LITERAL).unwrap().len(), + 115, + "The size of the literal was changed and requires updating in `CODE_RESTORATION`", + ); + + let restoration_wasm = wabt::wat2wasm(CODE_RESTORATION).unwrap(); + let set_rent_wasm = wabt::wat2wasm(CODE_SET_RENT).unwrap(); + + with_externalities( + &mut ExtBuilder::default().existential_deposit(50).build(), + || { + Balances::deposit_creating(&ALICE, 1_000_000); + assert_ok!(Contract::put_code(Origin::signed(ALICE), 100_000, restoration_wasm)); + assert_ok!(Contract::put_code(Origin::signed(ALICE), 100_000, set_rent_wasm)); + + // If you ever need to update the wasm source this test will fail + // and will show you the actual hash. + assert_eq!(System::events(), vec![ + EventRecord { + phase: Phase::ApplyExtrinsic(0), + event: MetaEvent::balances(balances::RawEvent::NewAccount(1, 1_000_000)), + topics: vec![], + }, + EventRecord { + phase: Phase::ApplyExtrinsic(0), + event: MetaEvent::contract(RawEvent::CodeStored(HASH_RESTORATION.into())), + topics: vec![], + }, + EventRecord { + phase: Phase::ApplyExtrinsic(0), + event: MetaEvent::contract(RawEvent::CodeStored(HASH_SET_RENT.into())), + topics: vec![], + }, + ]); + + // Create an account with address `BOB` with code `HASH_SET_RENT`. + // The input parameter sets the rent allowance to 0. + assert_ok!(Contract::create( + Origin::signed(ALICE), + 30_000, + 100_000, + HASH_SET_RENT.into(), + ::Balance::from(0u32).encode() + )); + + // Check if `BOB` was created successfully and that the rent allowance is + // set to 0. + let bob_contract = ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap(); + assert_eq!(bob_contract.rent_allowance, 0); + + if test_different_storage { + assert_ok!(Contract::call( + Origin::signed(ALICE), + BOB, 0, 100_000, + call::set_storage_4_byte()) + ); + } + + // Advance 4 blocks, to the 5th. + System::initialize(&5, &[0u8; 32].into(), &[0u8; 32].into(), &Default::default()); + + // Call `BOB`, which makes it pay rent. Since the rent allowance is set to 0 + // we expect that it will get removed leaving tombstone. + assert_ok!(Contract::call(Origin::signed(ALICE), BOB, 0, 100_000, call::null())); + assert!(ContractInfoOf::::get(BOB).unwrap().get_tombstone().is_some()); + + /// Create another account with the address `DJANGO` with `CODE_RESTORATION`. + /// + /// Note that we can't use `ALICE` for creating `DJANGO` so we create yet another + /// account `CHARLIE` and create `DJANGO` with it. + Balances::deposit_creating(&CHARLIE, 1_000_000); + assert_ok!(Contract::create( + Origin::signed(CHARLIE), + 30_000, + 100_000, + HASH_RESTORATION.into(), + ::Balance::from(0u32).encode() + )); + + // Before performing a call to `DJANGO` save its original trie id. + let django_trie_id = ContractInfoOf::::get(DJANGO).unwrap() + .get_alive().unwrap().trie_id; + + if !test_restore_to_with_dirty_storage { + // Advance 1 block, to the 6th. + System::initialize(&6, &[0u8; 32].into(), &[0u8; 32].into(), &Default::default()); + } + + // Perform a call to `DJANGO`. This should either perform restoration successfully or + // fail depending on the test parameters. + assert_ok!(Contract::call( + Origin::signed(ALICE), + DJANGO, + 0, + 100_000, + vec![], + )); + + if test_different_storage || test_restore_to_with_dirty_storage { + // Parametrization of the test imply restoration failure. Check that `DJANGO` aka + // restoration contract is still in place and also that `BOB` doesn't exist. + assert!(ContractInfoOf::::get(BOB).unwrap().get_tombstone().is_some()); + let django_contract = ContractInfoOf::::get(DJANGO).unwrap() + .get_alive().unwrap(); + assert_eq!(django_contract.storage_size, 16); + assert_eq!(django_contract.trie_id, django_trie_id); + assert_eq!(django_contract.deduct_block, System::block_number()); + } else { + // Here we expect that the restoration is succeeded. Check that the restoration + // contract `DJANGO` ceased to exist and that `BOB` returned back. + let bob_contract = ContractInfoOf::::get(BOB).unwrap() + .get_alive().unwrap(); + assert_eq!(bob_contract.rent_allowance, 50); + assert_eq!(bob_contract.storage_size, 12); + assert_eq!(bob_contract.trie_id, django_trie_id); + assert_eq!(bob_contract.deduct_block, System::block_number()); + assert!(ContractInfoOf::::get(DJANGO).is_none()); + } + } + ); +} diff --git a/srml/contract/src/wasm/code_cache.rs b/srml/contracts/src/wasm/code_cache.rs similarity index 92% rename from srml/contract/src/wasm/code_cache.rs rename to srml/contracts/src/wasm/code_cache.rs index 0c71fe8cb5b8f9584a86467a01589cca345ea929..30c02ef94200f4b89822c4787efdc0587db315aa 100644 --- a/srml/contract/src/wasm/code_cache.rs +++ b/srml/contracts/src/wasm/code_cache.rs @@ -19,7 +19,8 @@ //! - In order to run contract code we need to instrument it with gas metering. //! To do that we need to provide the schedule which will supply exact gas costs values. //! We cache this code in the storage saving the schedule version. -//! - Before running contract code we check if the cached code has the schedule version that is equal to the current saved schedule. +//! - Before running contract code we check if the cached code has the schedule version that +//! is equal to the current saved schedule. //! If it is equal then run the code, if it isn't reinstrument with the current schedule. //! - When we update the schedule we want it to have strictly greater version than the current saved one: //! this guarantees that every instrumented contract code in cache cannot have the version equal to the current one. @@ -29,7 +30,7 @@ use crate::gas::{GasMeter, Token}; use crate::wasm::{prepare, runtime::Env, PrefabWasmModule}; use crate::{CodeHash, CodeStorage, PristineCode, Schedule, Trait}; use rstd::prelude::*; -use runtime_primitives::traits::{As, CheckedMul, Hash, Bounded}; +use runtime_primitives::traits::{CheckedMul, Hash, Bounded}; use srml_support::StorageMap; /// Gas metering token that used for charging storing code into the code storage. @@ -37,16 +38,15 @@ use srml_support::StorageMap; /// Specifies the code length in bytes. #[cfg_attr(test, derive(Debug, PartialEq, Eq))] #[derive(Copy, Clone)] -pub struct PutCodeToken(u64); +pub struct PutCodeToken(u32); impl Token for PutCodeToken { type Metadata = Schedule; fn calculate_amount(&self, metadata: &Schedule) -> T::Gas { - let code_len_in_gas = >::sa(self.0); metadata .put_code_per_byte_cost - .checked_mul(&code_len_in_gas) + .checked_mul(&self.0.into()) .unwrap_or_else(|| Bounded::max_value()) } } @@ -63,7 +63,7 @@ pub fn save( // The first time instrumentation is on the user. However, consequent reinstrumentation // due to the schedule changes is on governance system. if gas_meter - .charge(schedule, PutCodeToken(original_code.len() as u64)) + .charge(schedule, PutCodeToken(original_code.len() as u32)) .is_out_of_gas() { return Err("there is not enough gas for storing the code"); diff --git a/srml/contract/src/wasm/env_def/macros.rs b/srml/contracts/src/wasm/env_def/macros.rs similarity index 98% rename from srml/contract/src/wasm/env_def/macros.rs rename to srml/contracts/src/wasm/env_def/macros.rs index bfb42d19d01aeb35ba5fb09275db48b7038c5d09..32d02f5abea76f9bd536377878efb257a26216dc 100644 --- a/srml/contract/src/wasm/env_def/macros.rs +++ b/srml/contracts/src/wasm/env_def/macros.rs @@ -195,7 +195,7 @@ macro_rules! define_env { mod tests { use parity_wasm::elements::FunctionType; use parity_wasm::elements::ValueType; - use runtime_primitives::traits::{As, Zero}; + use runtime_primitives::traits::Zero; use sandbox::{self, ReturnValue, TypedValue}; use crate::wasm::tests::MockExt; use crate::wasm::Runtime; @@ -256,7 +256,7 @@ mod tests { #[test] fn macro_define_func() { define_func!( ext_gas (_ctx, amount: u32) => { - let amount = <::Gas as As>::sa(amount); + let amount = ::Gas::from(amount); if !amount.is_zero() { Ok(()) } else { @@ -308,7 +308,7 @@ mod tests { define_env!(Env, , ext_gas( _ctx, amount: u32 ) => { - let amount = <::Gas as As>::sa(amount); + let amount = ::Gas::from(amount); if !amount.is_zero() { Ok(()) } else { diff --git a/srml/contract/src/wasm/env_def/mod.rs b/srml/contracts/src/wasm/env_def/mod.rs similarity index 100% rename from srml/contract/src/wasm/env_def/mod.rs rename to srml/contracts/src/wasm/env_def/mod.rs diff --git a/srml/contract/src/wasm/mod.rs b/srml/contracts/src/wasm/mod.rs similarity index 84% rename from srml/contract/src/wasm/mod.rs rename to srml/contracts/src/wasm/mod.rs index 27b8577221c6dd2e97c900dade9cd30052257a1d..28f71dc9dfea0193a80a897aa98771318f3ad2d5 100644 --- a/srml/contract/src/wasm/mod.rs +++ b/srml/contracts/src/wasm/mod.rs @@ -134,7 +134,7 @@ impl<'a, T: Trait> crate::exec::Vm for WasmVm<'a, T> { let mut runtime = Runtime::new( ext, - input_data, + input_data.to_vec(), empty_output_buf, &self.schedule, memory, @@ -177,9 +177,10 @@ mod tests { use crate::exec::{CallReceipt, Ext, InstantiateReceipt, EmptyOutputBuf, StorageKey}; use crate::gas::GasMeter; use crate::tests::{Test, Call}; - use wabt; use crate::wasm::prepare::prepare_contract; use crate::CodeHash; + use wabt; + use hex_literal::hex; #[derive(Debug, PartialEq, Eq)] struct DispatchEntry(Call); @@ -204,9 +205,9 @@ mod tests { creates: Vec, transfers: Vec, dispatches: Vec, - events: Vec>, + // (topics, data) + events: Vec<(Vec, Vec)>, next_account_id: u64, - random_seed: H256, } impl Ext for MockExt { type T = Test; @@ -275,12 +276,12 @@ mod tests { &1111 } - fn random_seed(&self) -> &H256{ - &self.random_seed + fn random(&self, subject: &[u8]) -> H256 { + H256::from_slice(subject) } - fn deposit_event(&mut self, data: Vec) { - self.events.push(data) + fn deposit_event(&mut self, topics: Vec, data: Vec) { + self.events.push((topics, data)) } fn set_rent_allowance(&mut self, rent_allowance: u64) { @@ -418,7 +419,10 @@ mod tests { ;; Input data to pass to the contract being created. (data (i32.const 12) "\01\02\03\04") ;; Hash of code. - (data (i32.const 16) "\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11") + (data (i32.const 16) + "\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11" + "\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11" + ) ) "#; @@ -568,7 +572,10 @@ mod tests { (func (export "deploy")) - (data (i32.const 4) "\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11") + (data (i32.const 4) + "\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11" + "\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11\11" + ) ) "#; @@ -1114,11 +1121,12 @@ mod tests { .unwrap(); } - const CODE_RANDOM_SEED: &str = r#" + const CODE_RANDOM: &str = r#" (module - (import "env" "ext_random_seed" (func $ext_random_seed)) + (import "env" "ext_random" (func $ext_random (param i32 i32))) (import "env" "ext_scratch_size" (func $ext_scratch_size (result i32))) (import "env" "ext_scratch_copy" (func $ext_scratch_copy (param i32 i32 i32))) + (import "env" "ext_return" (func $ext_return (param i32 i32))) (import "env" "memory" (memory 1 1)) (func $assert (param i32) @@ -1132,7 +1140,10 @@ mod tests { (func (export "call") ;; This stores the block random seed in the scratch buffer - (call $ext_random_seed) + (call $ext_random + (i32.const 40) ;; Pointer in memory to the start of the subject buffer + (i32.const 32) ;; The subject buffer's length + ) ;; assert $ext_scratch_size == 32 (call $assert @@ -1149,59 +1160,71 @@ mod tests { (i32.const 32) ;; Count of bytes to copy. ) - ;; assert the contents of the buffer in 4 x i64 parts matches 1,2,3,4. - (call $assert (i64.eq (i64.load (i32.const 8)) (i64.const 1))) - (call $assert (i64.eq (i64.load (i32.const 16)) (i64.const 2))) - (call $assert (i64.eq (i64.load (i32.const 24)) (i64.const 3))) - (call $assert (i64.eq (i64.load (i32.const 32)) (i64.const 4))) + ;; return the data from the contract + (call $ext_return + (i32.const 8) + (i32.const 32) + ) ) (func (export "deploy")) + + ;; [8,40) is reserved for the result of PRNG. + + ;; the subject used for the PRNG. [40,72) + (data (i32.const 40) + "\00\01\02\03\04\05\06\07\08\09\0A\0B\0C\0D\0E\0F" + "\00\01\02\03\04\05\06\07\08\09\0A\0B\0C\0D\0E\0F" + ) ) "#; #[test] - fn random_seed() { + fn random() { let mut mock_ext = MockExt::default(); - let seed: [u8; 32] = [ - 1,0,0,0,0,0,0,0, - 2,0,0,0,0,0,0,0, - 3,0,0,0,0,0,0,0, - 4,0,0,0,0,0,0,0, - ]; - mock_ext.random_seed = H256::from_slice(&seed); let mut gas_meter = GasMeter::with_limit(50_000, 1); + + let mut return_buf = Vec::new(); execute( - CODE_RANDOM_SEED, + CODE_RANDOM, &[], - &mut Vec::new(), + &mut return_buf, &mut mock_ext, &mut gas_meter, ) .unwrap(); + + // The mock ext just returns the same data that was passed as the subject. + assert_eq!( + &return_buf, + &hex!("000102030405060708090A0B0C0D0E0F000102030405060708090A0B0C0D0E0F") + ); } const CODE_DEPOSIT_EVENT: &str = r#" (module - (import "env" "ext_deposit_event" (func $ext_deposit_event (param i32 i32))) + (import "env" "ext_deposit_event" (func $ext_deposit_event (param i32 i32 i32 i32))) (import "env" "memory" (memory 1 1)) (func (export "call") (call $ext_deposit_event - (i32.const 8) ;; Pointer to the start of encoded call buffer + (i32.const 32) ;; Pointer to the start of topics buffer + (i32.const 33) ;; The length of the topics buffer. + (i32.const 8) ;; Pointer to the start of the data buffer (i32.const 13) ;; Length of the buffer ) ) (func (export "deploy")) (data (i32.const 8) "\00\01\2A\00\00\00\00\00\00\00\E5\14\00") + + ;; Encoded Vec>, the buffer has length of 33 bytes. + (data (i32.const 32) "\04\33\33\33\33\33\33\33\33\33\33\33\33\33\33\33\33\33\33\33\33\33\33\33" + "\33\33\33\33\33\33\33\33\33") ) "#; #[test] fn deposit_event() { - // This test can fail due to the encoding changes. In case it becomes too annoying - // let's rewrite so as we use this module controlled call or we serialize it in runtime. - let mut mock_ext = MockExt::default(); let mut gas_meter = GasMeter::with_limit(50_000, 1); execute( @@ -1212,11 +1235,105 @@ mod tests { &mut gas_meter ) .unwrap(); + + assert_eq!(mock_ext.events, vec![ + (vec![H256::repeat_byte(0x33)], + vec![0x00, 0x01, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe5, 0x14, 0x00]) + ]); + assert_eq!(gas_meter.gas_left(), 50_000 - - 4 // Explicit - - 13 - 1 // Deposit event - - 13 // read memory + - 6 // Explicit + - 13 - 1 - 1 // Deposit event + - (13 + 33) // read memory + ); + } + + const CODE_DEPOSIT_EVENT_MAX_TOPICS: &str = r#" +(module + (import "env" "ext_deposit_event" (func $ext_deposit_event (param i32 i32 i32 i32))) + (import "env" "memory" (memory 1 1)) + + (func (export "call") + (call $ext_deposit_event + (i32.const 32) ;; Pointer to the start of topics buffer + (i32.const 161) ;; The length of the topics buffer. + (i32.const 8) ;; Pointer to the start of the data buffer + (i32.const 13) ;; Length of the buffer + ) + ) + (func (export "deploy")) + + (data (i32.const 8) "\00\01\2A\00\00\00\00\00\00\00\E5\14\00") + + ;; Encoded Vec>, the buffer has length of 161 bytes. + (data (i32.const 32) "\14" +"\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01" +"\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02" +"\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03\03" +"\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04" +"\05\05\05\05\05\05\05\05\05\05\05\05\05\05\05\05\05\05\05\05\05\05\05\05\05\05\05\05\05\05\05\05") +) +"#; + + #[test] + fn deposit_event_max_topics() { + // Checks that the runtime traps if there are more than `max_topic_events` topics. + let mut mock_ext = MockExt::default(); + let mut gas_meter = GasMeter::with_limit(50_000, 1); + + assert_eq!( + execute( + CODE_DEPOSIT_EVENT_MAX_TOPICS, + &[], + &mut Vec::new(), + &mut mock_ext, + &mut gas_meter + ), + Err("during execution"), + ); + } + + const CODE_DEPOSIT_EVENT_DUPLICATES: &str = r#" +(module + (import "env" "ext_deposit_event" (func $ext_deposit_event (param i32 i32 i32 i32))) + (import "env" "memory" (memory 1 1)) + + (func (export "call") + (call $ext_deposit_event + (i32.const 32) ;; Pointer to the start of topics buffer + (i32.const 129) ;; The length of the topics buffer. + (i32.const 8) ;; Pointer to the start of the data buffer + (i32.const 13) ;; Length of the buffer + ) + ) + (func (export "deploy")) + + (data (i32.const 8) "\00\01\2A\00\00\00\00\00\00\00\E5\14\00") + + ;; Encoded Vec>, the buffer has length of 129 bytes. + (data (i32.const 32) "\10" +"\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01" +"\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02" +"\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01" +"\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04") +) +"#; + + #[test] + fn deposit_event_duplicates() { + // Checks that the runtime traps if there are duplicates. + let mut mock_ext = MockExt::default(); + let mut gas_meter = GasMeter::with_limit(50_000, 1); + + assert_eq!( + execute( + CODE_DEPOSIT_EVENT_DUPLICATES, + &[], + &mut Vec::new(), + &mut mock_ext, + &mut gas_meter + ), + Err("during execution"), ); - assert_eq!(mock_ext.events, vec![vec![0, 1, 42, 0, 0, 0, 0, 0, 0, 0, 229, 20, 0]]); } } diff --git a/srml/contract/src/wasm/prepare.rs b/srml/contracts/src/wasm/prepare.rs similarity index 98% rename from srml/contract/src/wasm/prepare.rs rename to srml/contracts/src/wasm/prepare.rs index 94a38ef5883f84ef4a1d8dccc37080ecdba7223f..d780cc1a28328ac6c467fefb7f2094d8988080c0 100644 --- a/srml/contract/src/wasm/prepare.rs +++ b/srml/contracts/src/wasm/prepare.rs @@ -26,7 +26,7 @@ use parity_wasm::elements::{self, Internal, External, MemoryType, Type}; use pwasm_utils; use pwasm_utils::rules; use rstd::prelude::*; -use runtime_primitives::traits::As; +use runtime_primitives::traits::{UniqueSaturatedInto, SaturatedConversion}; struct ContractModule<'a, Gas: 'a> { /// A deserialized module. The module is valid (this is Guaranteed by `new` method). @@ -38,7 +38,7 @@ struct ContractModule<'a, Gas: 'a> { schedule: &'a Schedule, } -impl<'a, Gas: 'a + As + Clone> ContractModule<'a, Gas> { +impl<'a, Gas: 'a + From + UniqueSaturatedInto + Clone> ContractModule<'a, Gas> { /// Creates a new instance of `ContractModule`. /// /// Returns `Err` if the `original_code` couldn't be decoded or @@ -85,10 +85,10 @@ impl<'a, Gas: 'a + As + Clone> ContractModule<'a, Gas> { fn inject_gas_metering(&mut self) -> Result<(), &'static str> { let gas_rules = rules::Set::new( - self.schedule.regular_op_cost.clone().as_(), + self.schedule.regular_op_cost.clone().saturated_into(), Default::default(), ) - .with_grow_cost(self.schedule.grow_mem_cost.clone().as_()) + .with_grow_cost(self.schedule.grow_mem_cost.clone().saturated_into()) .with_forbidden_floats(); let module = self diff --git a/srml/contract/src/wasm/runtime.rs b/srml/contracts/src/wasm/runtime.rs similarity index 80% rename from srml/contract/src/wasm/runtime.rs rename to srml/contracts/src/wasm/runtime.rs index 3f7b10045c2961a99ca37b95cb64fbeaf6accacc..8f7c10b4071c5b5d75dfe6e2808e3889f29efbb3 100644 --- a/srml/contract/src/wasm/runtime.rs +++ b/srml/contracts/src/wasm/runtime.rs @@ -17,14 +17,17 @@ //! Environment definition of the wasm smart-contract runtime. use crate::{Schedule, Trait, CodeHash, ComputeDispatchFee, BalanceOf}; -use crate::exec::{Ext, VmExecResult, OutputBuf, EmptyOutputBuf, CallReceipt, InstantiateReceipt, StorageKey}; +use crate::exec::{ + Ext, VmExecResult, OutputBuf, EmptyOutputBuf, CallReceipt, InstantiateReceipt, StorageKey, + TopicOf, +}; use crate::gas::{GasMeter, Token, GasMeterResult, approx_gas_for_balance}; use sandbox; use system; use rstd::prelude::*; use rstd::mem; use parity_codec::{Decode, Encode}; -use runtime_primitives::traits::{As, CheckedMul, CheckedAdd, Bounded}; +use runtime_primitives::traits::{CheckedMul, CheckedAdd, Bounded, SaturatedConversion}; /// Enumerates all possible *special* trap conditions. /// @@ -36,9 +39,8 @@ enum SpecialTrap { } /// Can only be used for one call. -pub(crate) struct Runtime<'a, 'data, E: Ext + 'a> { +pub(crate) struct Runtime<'a, E: Ext + 'a> { ext: &'a mut E, - input_data: &'data [u8], // A VM can return a result only once and only by value. So // we wrap output buffer to make it possible to take the buffer out. empty_output_buf: Option, @@ -48,10 +50,10 @@ pub(crate) struct Runtime<'a, 'data, E: Ext + 'a> { gas_meter: &'a mut GasMeter, special_trap: Option, } -impl<'a, 'data, E: Ext + 'a> Runtime<'a, 'data, E> { +impl<'a, E: Ext + 'a> Runtime<'a, E> { pub(crate) fn new( ext: &'a mut E, - input_data: &'data [u8], + input_data: Vec, empty_output_buf: EmptyOutputBuf, schedule: &'a Schedule<::Gas>, memory: sandbox::Memory, @@ -59,9 +61,9 @@ impl<'a, 'data, E: Ext + 'a> Runtime<'a, 'data, E> { ) -> Self { Runtime { ext, - input_data, empty_output_buf: Some(empty_output_buf), - scratch_buf: Vec::new(), + // Put the input data into the scratch buffer immediately. + scratch_buf: input_data, schedule, memory, gas_meter, @@ -108,9 +110,9 @@ pub enum RuntimeToken { ReturnData(u32), /// Dispatch fee calculated by `T::ComputeDispatchFee`. ComputedDispatchFee(Gas), - /// The given number of bytes is read from the sandbox memory and - /// deposit in as an event. - DepositEvent(u32), + /// (topic_count, data_bytes): A buffer of the given size is posted as an event indexed with the + /// given number of topics. + DepositEvent(u32, u32), } impl Token for RuntimeToken { @@ -119,20 +121,35 @@ impl Token for RuntimeToken { fn calculate_amount(&self, metadata: &Schedule) -> T::Gas { use self::RuntimeToken::*; let value = match *self { - Explicit(amount) => Some(>::sa(amount)), + Explicit(amount) => Some(amount.into()), ReadMemory(byte_count) => metadata .sandbox_data_read_cost - .checked_mul(&>::sa(byte_count)), + .checked_mul(&byte_count.into()), WriteMemory(byte_count) => metadata .sandbox_data_write_cost - .checked_mul(&>::sa(byte_count)), + .checked_mul(&byte_count.into()), ReturnData(byte_count) => metadata .return_data_per_byte_cost - .checked_mul(&>::sa(byte_count)), - DepositEvent(byte_count) => metadata - .event_data_per_byte_cost - .checked_mul(&>::sa(byte_count)) - .and_then(|e| e.checked_add(&metadata.event_data_base_cost)), + .checked_mul(&byte_count.into()), + DepositEvent(topic_count, data_byte_count) => { + let data_cost = metadata + .event_data_per_byte_cost + .checked_mul(&data_byte_count.into()); + + let topics_cost = metadata + .event_per_topic_cost + .checked_mul(&topic_count.into()); + + data_cost + .and_then(|data_cost| { + topics_cost.and_then(|topics_cost| { + data_cost.checked_add(&topics_cost) + }) + }) + .and_then(|data_and_topics_cost| + data_and_topics_cost.checked_add(&metadata.event_base_cost) + ) + }, ComputedDispatchFee(gas) => Some(gas), }; @@ -322,7 +339,7 @@ define_env!(Env, , let nested_gas_limit = if gas == 0 { ctx.gas_meter.gas_left() } else { - <::Gas as As>::sa(gas) + gas.saturated_into() }; let ext = &mut ctx.ext; let call_outcome = ctx.gas_meter.with_nested(nested_gas_limit, |nested_meter| { @@ -395,7 +412,7 @@ define_env!(Env, , let nested_gas_limit = if gas == 0 { ctx.gas_meter.gas_left() } else { - <::Gas as As>::sa(gas) + gas.saturated_into() }; let ext = &mut ctx.ext; let instantiate_outcome = ctx.gas_meter.with_nested(nested_gas_limit, |nested_meter| { @@ -425,6 +442,8 @@ define_env!(Env, , // Save a data buffer as a result of the execution, terminate the execution and return a // successful result to the caller. + // + // This is the only way to return a data buffer to the caller. ext_return(ctx, data_ptr: u32, data_len: u32) => { match ctx .gas_meter @@ -467,13 +486,15 @@ define_env!(Env, , // will be returned. Otherwise, if this call is initiated by another contract then the address // of the contract will be returned. ext_caller(ctx) => { - ctx.scratch_buf = ctx.ext.caller().encode(); + ctx.scratch_buf.clear(); + ctx.ext.caller().encode_to(&mut ctx.scratch_buf); Ok(()) }, // Stores the address of the current contract into the scratch buffer. ext_address(ctx) => { - ctx.scratch_buf = ctx.ext.address().encode(); + ctx.scratch_buf.clear(); + ctx.ext.address().encode_to(&mut ctx.scratch_buf); Ok(()) }, @@ -481,7 +502,8 @@ define_env!(Env, , // // The data is encoded as T::Balance. The current contents of the scratch buffer are overwritten. ext_gas_price(ctx) => { - ctx.scratch_buf = ctx.gas_meter.gas_price().encode(); + ctx.scratch_buf.clear(); + ctx.gas_meter.gas_price().encode_to(&mut ctx.scratch_buf); Ok(()) }, @@ -489,7 +511,8 @@ define_env!(Env, , // // The data is encoded as T::Balance. The current contents of the scratch buffer are overwritten. ext_gas_left(ctx) => { - ctx.scratch_buf = ctx.gas_meter.gas_left().encode(); + ctx.scratch_buf.clear(); + ctx.gas_meter.gas_left().encode_to(&mut ctx.scratch_buf); Ok(()) }, @@ -497,7 +520,8 @@ define_env!(Env, , // // The data is encoded as T::Balance. The current contents of the scratch buffer are overwritten. ext_balance(ctx) => { - ctx.scratch_buf = ctx.ext.balance().encode(); + ctx.scratch_buf.clear(); + ctx.ext.balance().encode_to(&mut ctx.scratch_buf); Ok(()) }, @@ -505,20 +529,32 @@ define_env!(Env, , // // The data is encoded as T::Balance. The current contents of the scratch buffer are overwritten. ext_value_transferred(ctx) => { - ctx.scratch_buf = ctx.ext.value_transferred().encode(); + ctx.scratch_buf.clear(); + ctx.ext.value_transferred().encode_to(&mut ctx.scratch_buf); Ok(()) }, - // Load the latest block RNG seed into the scratch buffer - ext_random_seed(ctx) => { - ctx.scratch_buf = ctx.ext.random_seed().encode(); + // Stores the random number for the current block for the given subject into the scratch + // buffer. + // + // The data is encoded as T::Hash. The current contents of the scratch buffer are + // overwritten. + ext_random(ctx, subject_ptr: u32, subject_len: u32) => { + // The length of a subject can't exceed `max_subject_len`. + if subject_len > ctx.schedule.max_subject_len { + return Err(sandbox::HostError); + } + + let subject_buf = read_sandbox_memory(ctx, subject_ptr, subject_len)?; + ctx.scratch_buf.clear(); + ctx.ext.random(&subject_buf).encode_to(&mut ctx.scratch_buf); Ok(()) }, // Load the latest block timestamp into the scratch buffer ext_now(ctx) => { - let now: u64 = As::as_(ctx.ext.now().clone()); - ctx.scratch_buf = now.encode(); + ctx.scratch_buf.clear(); + ctx.ext.now().encode_to(&mut ctx.scratch_buf); Ok(()) }, @@ -546,45 +582,19 @@ define_env!(Env, , Ok(()) }, - // Returns the size of the input buffer. - ext_input_size(ctx) -> u32 => { - Ok(ctx.input_data.len() as u32) - }, - - // Copy data from the input buffer starting from `offset` with length `len` into the contract memory. - // The region at which the data should be put is specified by `dest_ptr`. - ext_input_copy(ctx, dest_ptr: u32, offset: u32, len: u32) => { - let offset = offset as usize; - if offset > ctx.input_data.len() { - // Offset can't be larger than input buffer length. - return Err(sandbox::HostError); - } - - // This can't panic since `offset <= ctx.input_data.len()`. - let src = &ctx.input_data[offset..]; - if src.len() != len as usize { - return Err(sandbox::HostError); - } - - // Finally, perform the write. - write_sandbox_memory( - ctx.schedule, - ctx.gas_meter, - &ctx.memory, - dest_ptr, - src, - )?; - - Ok(()) - }, - // Returns the size of the scratch buffer. + // + // For more details on the scratch buffer see `ext_scratch_copy`. ext_scratch_size(ctx) -> u32 => { Ok(ctx.scratch_buf.len() as u32) }, // Copy data from the scratch buffer starting from `offset` with length `len` into the contract memory. // The region at which the data should be put is specified by `dest_ptr`. + // + // In order to get size of the scratch buffer use `ext_scratch_size`. At the start of contract + // execution, the scratch buffer is filled with the input data. Whenever a contract calls + // function that uses the scratch buffer the contents of the scratch buffer are overwritten. ext_scratch_copy(ctx, dest_ptr: u32, offset: u32, len: u32) => { let offset = offset as usize; if offset > ctx.scratch_buf.len() { @@ -610,21 +620,47 @@ define_env!(Env, , Ok(()) }, - // Deposit a contract event with the data buffer. - ext_deposit_event(ctx, data_ptr: u32, data_len: u32) => { + // Deposit a contract event with the data buffer and optional list of topics. There is a limit + // on the maximum number of topics specified by `max_event_topics`. + // + // - topics_ptr - a pointer to the buffer of topics encoded as `Vec`. The value of this + // is ignored if `topics_len` is set to 0. The topics list can't contain duplicates. + // - topics_len - the length of the topics buffer. Pass 0 if you want to pass an empty vector. + // - data_ptr - a pointer to a raw data buffer which will saved along the event. + // - data_len - the length of the data buffer. + ext_deposit_event(ctx, topics_ptr: u32, topics_len: u32, data_ptr: u32, data_len: u32) => { + let mut topics = match topics_len { + 0 => Vec::new(), + _ => { + let topics_buf = read_sandbox_memory(ctx, topics_ptr, topics_len)?; + Vec::::T>>::decode(&mut &topics_buf[..]) + .ok_or_else(|| sandbox::HostError)? + } + }; + + // If there are more than `max_event_topics`, then trap. + if topics.len() > ctx.schedule.max_event_topics as usize { + return Err(sandbox::HostError); + } + + // Check for duplicate topics. If there are any, then trap. + if has_duplicates(&mut topics) { + return Err(sandbox::HostError); + } + + let event_data = read_sandbox_memory(ctx, data_ptr, data_len)?; + match ctx .gas_meter .charge( ctx.schedule, - RuntimeToken::DepositEvent(data_len) + RuntimeToken::DepositEvent(topics.len() as u32, data_len) ) { GasMeterResult::Proceed => (), GasMeterResult::OutOfGas => return Err(sandbox::HostError), } - - let event_data = read_sandbox_memory(ctx, data_ptr, data_len)?; - ctx.ext.deposit_event(event_data); + ctx.ext.deposit_event(topics, event_data); Ok(()) }, @@ -649,7 +685,8 @@ define_env!(Env, , // // The data is encoded as T::Balance. The current contents of the scratch buffer are overwritten. ext_rent_allowance(ctx) => { - ctx.scratch_buf = ctx.ext.rent_allowance().encode(); + ctx.scratch_buf.clear(); + ctx.ext.rent_allowance().encode_to(&mut ctx.scratch_buf); Ok(()) }, @@ -665,3 +702,21 @@ define_env!(Env, , Ok(()) }, ); + +/// Finds duplicates in a given vector. +/// +/// This function has complexity of O(n log n) and no additional memory is required, although +/// the order of items is not preserved. +fn has_duplicates>(items: &mut Vec) -> bool { + // Sort the vector + items.sort_unstable_by(|a, b| { + Ord::cmp(a.as_ref(), b.as_ref()) + }); + // And then find any two consecutive equal elements. + items.windows(2).any(|w| { + match w { + &[ref a, ref b] => a == b, + _ => false, + } + }) +} diff --git a/srml/council/src/lib.rs b/srml/council/src/lib.rs index a13eb7e28067ac66a8ac95ee5c8d2a63f5d85ff1..681bc731be895ee3855a4b910dee4ebe741bff99 100644 --- a/srml/council/src/lib.rs +++ b/srml/council/src/lib.rs @@ -18,34 +18,42 @@ #![cfg_attr(not(feature = "std"), no_std)] -pub mod voting; pub mod motions; pub mod seats; pub use crate::seats::{Trait, Module, RawEvent, Event, VoteIndex}; +/// Trait for type that can handle incremental changes to a set of account IDs. +pub trait OnMembersChanged { + /// A number of members `new` just joined the set and replaced some `old` ones. + fn on_members_changed(new: &[AccountId], old: &[AccountId]); +} + +impl OnMembersChanged for () { + fn on_members_changed(_new: &[T], _old: &[T]) {} +} + #[cfg(test)] mod tests { // These re-exports are here for a reason, edit with care pub use super::*; pub use runtime_io::with_externalities; - use srml_support::{impl_outer_origin, impl_outer_event, impl_outer_dispatch}; - pub use substrate_primitives::H256; - pub use primitives::BuildStorage; - pub use primitives::traits::{BlakeTwo256, IdentityLookup}; - pub use primitives::testing::{Digest, DigestItem, Header}; - pub use substrate_primitives::{Blake2Hasher}; - pub use {seats, motions, voting}; + use srml_support::{impl_outer_origin, impl_outer_event, impl_outer_dispatch, parameter_types}; + pub use substrate_primitives::{H256, Blake2Hasher, u32_trait::{_1, _2, _3, _4}}; + pub use primitives::{ + BuildStorage, traits::{BlakeTwo256, IdentityLookup}, testing::{Digest, DigestItem, Header} + }; + pub use {seats, motions}; impl_outer_origin! { pub enum Origin for Test { - motions + motions } } impl_outer_event! { pub enum Event for Test { - balances, democracy, seats, voting, motions, + balances, democracy, seats, motions, } } @@ -65,12 +73,10 @@ mod tests { type BlockNumber = u64; type Hash = H256; type Hashing = BlakeTwo256; - type Digest = Digest; type AccountId = u64; type Lookup = IdentityLookup; type Header = Header; type Event = Event; - type Log = DigestItem; } impl balances::Trait for Test { type Balance = u64; @@ -81,71 +87,133 @@ mod tests { type TransferPayment = (); type DustRemoval = (); } + parameter_types! { + pub const LaunchPeriod: u64 = 1; + pub const VotingPeriod: u64 = 3; + pub const MinimumDeposit: u64 = 1; + pub const EnactmentPeriod: u64 = 0; + pub const CooloffPeriod: u64 = 2; + } impl democracy::Trait for Test { - type Currency = balances::Module; type Proposal = Call; type Event = Event; + type Currency = balances::Module; + type EnactmentPeriod = EnactmentPeriod; + type LaunchPeriod = LaunchPeriod; + type EmergencyVotingPeriod = VotingPeriod; + type VotingPeriod = VotingPeriod; + type MinimumDeposit = MinimumDeposit; + type ExternalOrigin = motions::EnsureProportionAtLeast<_1, _2, u64>; + type ExternalMajorityOrigin = motions::EnsureProportionAtLeast<_2, _3, u64>; + type EmergencyOrigin = motions::EnsureProportionAtLeast<_1, _1, u64>; + type CancellationOrigin = motions::EnsureProportionAtLeast<_2, _3, u64>; + type VetoOrigin = motions::EnsureMember; + type CooloffPeriod = CooloffPeriod; } impl seats::Trait for Test { type Event = Event; type BadPresentation = (); type BadReaper = (); + type BadVoterIndex = (); + type LoserCandidate = (); + type OnMembersChanged = CouncilMotions; } impl motions::Trait for Test { type Origin = Origin; type Proposal = Call; type Event = Event; } - impl voting::Trait for Test { - type Event = Event; + + pub struct ExtBuilder { + balance_factor: u64, + decay_ratio: u32, + voting_fee: u64, + voter_bond: u64, + bad_presentation_punishment: u64, + with_council: bool, } - pub fn new_test_ext(with_council: bool) -> runtime_io::TestExternalities { - let mut t = system::GenesisConfig::::default().build_storage().unwrap().0; - t.extend(balances::GenesisConfig::{ - transaction_base_fee: 0, - transaction_byte_fee: 0, - balances: vec![(1, 10), (2, 20), (3, 30), (4, 40), (5, 50), (6, 60)], - existential_deposit: 0, - transfer_fee: 0, - creation_fee: 0, - vesting: vec![], - }.build_storage().unwrap().0); - t.extend(democracy::GenesisConfig::{ - launch_period: 1, - voting_period: 3, - minimum_deposit: 1, - public_delay: 0, - max_lock_periods: 6, - }.build_storage().unwrap().0); - t.extend(seats::GenesisConfig:: { - candidacy_bond: 9, - voter_bond: 3, - present_slash_per_voter: 1, - carry_count: 2, - inactive_grace_period: 1, - active_council: if with_council { vec![ - (1, 10), - (2, 10), - (3, 10) - ] } else { vec![] }, - approval_voting_period: 4, - presentation_duration: 2, - desired_seats: 2, - term_duration: 5, - }.build_storage().unwrap().0); - t.extend(voting::GenesisConfig:: { - cooloff_period: 2, - voting_period: 1, - enact_delay_period: 0, - }.build_storage().unwrap().0); - runtime_io::TestExternalities::new(t) + impl Default for ExtBuilder { + fn default() -> Self { + Self { + balance_factor: 1, + decay_ratio: 24, + voting_fee: 0, + voter_bond: 0, + bad_presentation_punishment: 1, + with_council: false, + } + } + } + + impl ExtBuilder { + pub fn with_council(mut self, council: bool) -> Self { + self.with_council = council; + self + } + pub fn balance_factor(mut self, factor: u64) -> Self { + self.balance_factor = factor; + self + } + pub fn decay_ratio(mut self, ratio: u32) -> Self { + self.decay_ratio = ratio; + self + } + pub fn voting_fee(mut self, fee: u64) -> Self { + self.voting_fee = fee; + self + } + pub fn bad_presentation_punishment(mut self, fee: u64) -> Self { + self.bad_presentation_punishment = fee; + self + } + pub fn voter_bond(mut self, fee: u64) -> Self { + self.voter_bond = fee; + self + } + pub fn build(self) -> runtime_io::TestExternalities { + let mut t = system::GenesisConfig::::default().build_storage().unwrap().0; + t.extend(balances::GenesisConfig::{ + transaction_base_fee: 0, + transaction_byte_fee: 0, + balances: vec![ + (1, 10 * self.balance_factor), + (2, 20 * self.balance_factor), + (3, 30 * self.balance_factor), + (4, 40 * self.balance_factor), + (5, 50 * self.balance_factor), + (6, 60 * self.balance_factor) + ], + existential_deposit: 0, + transfer_fee: 0, + creation_fee: 0, + vesting: vec![], + }.build_storage().unwrap().0); + t.extend(seats::GenesisConfig:: { + candidacy_bond: 3, + voter_bond: self.voter_bond, + present_slash_per_voter: self.bad_presentation_punishment, + carry_count: 2, + inactive_grace_period: 1, + active_council: if self.with_council { vec![ + (1, 10), + (2, 10), + (3, 10) + ] } else { vec![] }, + approval_voting_period: 4, + presentation_duration: 2, + desired_seats: 2, + decay_ratio: self.decay_ratio, + voting_fee: self.voting_fee, + term_duration: 5, + }.build_storage().unwrap().0); + runtime_io::TestExternalities::new(t) + } } pub type System = system::Module; pub type Balances = balances::Module; pub type Democracy = democracy::Module; pub type Council = seats::Module; - pub type CouncilVoting = voting::Module; pub type CouncilMotions = motions::Module; } diff --git a/srml/council/src/motions.rs b/srml/council/src/motions.rs index 393ebce4f890da485345bc7d7d7b50eeb22474b1..a53752d71f90525b67fb9e715509262277a02ca9 100644 --- a/srml/council/src/motions.rs +++ b/srml/council/src/motions.rs @@ -16,21 +16,27 @@ //! Council voting system. -use rstd::prelude::*; -use rstd::result; +use rstd::{prelude::*, result}; use substrate_primitives::u32_trait::Value as U32; use primitives::traits::{Hash, EnsureOrigin}; -use srml_support::dispatch::{Dispatchable, Parameter}; -use srml_support::{StorageValue, StorageMap, decl_module, decl_event, decl_storage, ensure}; -use super::{Trait as CouncilTrait, Module as Council}; +use srml_support::{ + dispatch::{Dispatchable, Parameter}, codec::{Encode, Decode}, + StorageValue, StorageMap, decl_module, decl_event, decl_storage, ensure +}; +use super::{Trait as CouncilTrait, Module as Council, OnMembersChanged}; use system::{self, ensure_signed}; /// Simple index type for proposal counting. pub type ProposalIndex = u32; +/// A number of council members. +/// +/// This also serves as a number of voting members, and since for motions, each council member may +/// vote exactly once, therefore also the number of votes for any given motion. +pub type MemberCount = u32; pub trait Trait: CouncilTrait { /// The outer origin type. - type Origin: From; + type Origin: From>; /// The outer call dispatch type. type Proposal: Parameter + Dispatchable::Origin>; @@ -42,31 +48,83 @@ pub trait Trait: CouncilTrait { /// Origin for the council module. #[derive(PartialEq, Eq, Clone)] #[cfg_attr(feature = "std", derive(Debug))] -pub enum Origin { - /// It has been condoned by a given number of council members. - Members(u32), +pub enum RawOrigin { + /// It has been condoned by a given number of council members from a given total. + Members(MemberCount, MemberCount), + /// It has been condoned by a single council member. + Member(AccountId), +} + +/// Origin for the council module. +pub type Origin = RawOrigin<::AccountId>; + +#[derive(PartialEq, Eq, Clone, Encode, Decode)] +#[cfg_attr(feature = "std", derive(Debug))] +/// Info for keeping track of a motion being voted on. +pub struct Votes { + /// The proposal's unique index. + index: ProposalIndex, + /// The number of approval votes that are needed to pass the motion. + threshold: MemberCount, + /// The current set of voters that approved it. + ayes: Vec, + /// The current set of voters that rejected it. + nays: Vec, +} + +decl_storage! { + trait Store for Module as CouncilMotions { + /// The hashes of the active proposals. + pub Proposals get(proposals): Vec; + /// Actual proposal for a given hash, if it's current. + pub ProposalOf get(proposal_of): map T::Hash => Option<::Proposal>; + /// Votes on a given proposal, if it is ongoing. + pub Voting get(voting): map T::Hash => Option>; + /// Proposals so far. + pub ProposalCount get(proposal_count): u32; + } } decl_event!( pub enum Event where ::Hash, ::AccountId { - /// A motion (given hash) has been proposed (by given account) with a threshold (given u32). - Proposed(AccountId, ProposalIndex, Hash, u32), + /// A motion (given hash) has been proposed (by given account) with a threshold (given + /// `MemberCount`). + Proposed(AccountId, ProposalIndex, Hash, MemberCount), /// A motion (given hash) has been voted on by given account, leaving - /// a tally (yes votes and no votes given as u32s respectively). - Voted(AccountId, Hash, bool, u32, u32), + /// a tally (yes votes and no votes given respectively as `MemberCount`). + Voted(AccountId, Hash, bool, MemberCount, MemberCount), /// A motion was approved by the required threshold. Approved(Hash), /// A motion was not approved by the required threshold. Disapproved(Hash), /// A motion was executed; `bool` is true if returned without error. Executed(Hash, bool), + /// A single councillor did some action; `bool` is true if returned without error. + MemberExecuted(Hash, bool), } ); decl_module! { pub struct Module for enum Call where origin: ::Origin { fn deposit_event() = default; - fn propose(origin, #[compact] threshold: u32, proposal: Box<::Proposal>) { + + /// Dispatch a proposal from a councilor using the `Member` origin. + /// + /// Origin must be a council member. + fn execute(origin, proposal: Box<::Proposal>) { + let who = ensure_signed(origin)?; + ensure!(Self::is_councillor(&who), "proposer not on council"); + + let proposal_hash = T::Hashing::hash_of(&proposal); + let ok = proposal.dispatch(RawOrigin::Member(who).into()).is_ok(); + Self::deposit_event(RawEvent::MemberExecuted(proposal_hash, ok)); + } + + /// # + /// - Bounded storage reads and writes. + /// - Argument `threshold` has bearing on weight. + /// # + fn propose(origin, #[compact] threshold: MemberCount, proposal: Box<::Proposal>) { let who = ensure_signed(origin)?; ensure!(Self::is_councillor(&who), "proposer not on council"); @@ -76,65 +134,71 @@ decl_module! { ensure!(!>::exists(proposal_hash), "duplicate proposals not allowed"); if threshold < 2 { - let ok = proposal.dispatch(Origin::Members(1).into()).is_ok(); + let seats = >::active_council().len() as MemberCount; + let ok = proposal.dispatch(RawOrigin::Members(1, seats).into()).is_ok(); Self::deposit_event(RawEvent::Executed(proposal_hash, ok)); } else { let index = Self::proposal_count(); >::mutate(|i| *i += 1); >::mutate(|proposals| proposals.push(proposal_hash)); >::insert(proposal_hash, *proposal); - >::insert(proposal_hash, (index, threshold, vec![who.clone()], vec![])); + let votes = Votes { index, threshold, ayes: vec![who.clone()], nays: vec![] }; + >::insert(proposal_hash, votes); Self::deposit_event(RawEvent::Proposed(who, index, proposal_hash, threshold)); } } + /// # + /// - Bounded storage read and writes. + /// - Will be slightly heavier if the proposal is approved / disapproved after the vote. + /// # fn vote(origin, proposal: T::Hash, #[compact] index: ProposalIndex, approve: bool) { let who = ensure_signed(origin)?; ensure!(Self::is_councillor(&who), "voter not on council"); let mut voting = Self::voting(&proposal).ok_or("proposal must exist")?; - ensure!(voting.0 == index, "mismatched index"); + ensure!(voting.index == index, "mismatched index"); - let position_yes = voting.2.iter().position(|a| a == &who); - let position_no = voting.3.iter().position(|a| a == &who); + let position_yes = voting.ayes.iter().position(|a| a == &who); + let position_no = voting.nays.iter().position(|a| a == &who); if approve { if position_yes.is_none() { - voting.2.push(who.clone()); + voting.ayes.push(who.clone()); } else { return Err("duplicate vote ignored") } if let Some(pos) = position_no { - voting.3.swap_remove(pos); + voting.nays.swap_remove(pos); } } else { if position_no.is_none() { - voting.3.push(who.clone()); + voting.nays.push(who.clone()); } else { return Err("duplicate vote ignored") } if let Some(pos) = position_yes { - voting.2.swap_remove(pos); + voting.ayes.swap_remove(pos); } } - let yes_votes = voting.2.len() as u32; - let no_votes = voting.3.len() as u32; + let yes_votes = voting.ayes.len() as MemberCount; + let no_votes = voting.nays.len() as MemberCount; Self::deposit_event(RawEvent::Voted(who, proposal, approve, yes_votes, no_votes)); - let threshold = voting.1; - let potential_votes = >::active_council().len() as u32; - let approved = yes_votes >= threshold; - let disapproved = potential_votes.saturating_sub(no_votes) < threshold; + let seats = >::active_council().len() as MemberCount; + let approved = yes_votes >= voting.threshold; + let disapproved = seats.saturating_sub(no_votes) < voting.threshold; if approved || disapproved { if approved { Self::deposit_event(RawEvent::Approved(proposal)); // execute motion, assuming it exists. if let Some(p) = >::take(&proposal) { - let ok = p.dispatch(Origin::Members(threshold).into()).is_ok(); + let origin = RawOrigin::Members(voting.threshold, seats).into(); + let ok = p.dispatch(origin).is_ok(); Self::deposit_event(RawEvent::Executed(proposal, ok)); } } else { @@ -153,22 +217,6 @@ decl_module! { } } -decl_storage! { - trait Store for Module as CouncilMotions { - /// The (hashes of) the active proposals. - pub Proposals get(proposals): Vec; - /// Actual proposal for a given hash, if it's current. - pub ProposalOf get(proposal_of): map T::Hash => Option< ::Proposal >; - /// Votes for a given proposal: (required_yes_votes, yes_voters, no_voters). - pub Voting get(voting): map T::Hash => Option<(ProposalIndex, u32, Vec, Vec)>; - /// Proposals so far. - pub ProposalCount get(proposal_count): u32; - } - add_extra_genesis { - build(|_, _, _| {}); - } -} - impl Module { pub fn is_councillor(who: &T::AccountId) -> bool { >::active_council().iter() @@ -176,24 +224,101 @@ impl Module { } } -/// Ensure that the origin `o` represents at least `n` council members. Returns -/// `Ok` or an `Err` otherwise. -pub fn ensure_council_members(o: OuterOrigin, n: u32) -> result::Result - where OuterOrigin: Into> +impl OnMembersChanged for Module { + fn on_members_changed(_new: &[T::AccountId], old: &[T::AccountId]) { + // remove accounts from all current voting in motions. + let mut old = old.to_vec(); + old.sort_unstable(); + for h in Self::proposals().into_iter() { + >::mutate(h, |v| + if let Some(mut votes) = v.take() { + votes.ayes = votes.ayes.into_iter() + .filter(|i| old.binary_search(i).is_err()) + .collect(); + votes.nays = votes.nays.into_iter() + .filter(|i| old.binary_search(i).is_err()) + .collect(); + *v = Some(votes); + } + ); + } + } +} + +/// Ensure that the origin `o` represents at least `n` council members. Returns `Ok` or an `Err` +/// otherwise. +pub fn ensure_council_members(o: OuterOrigin, n: MemberCount) + -> result::Result + where OuterOrigin: Into, OuterOrigin>> { match o.into() { - Some(Origin::Members(x)) if x >= n => Ok(n), + Ok(RawOrigin::Members(x, _)) if x >= n => Ok(n), _ => Err("bad origin: expected to be a threshold number of council members"), } } -pub struct EnsureMembers(::rstd::marker::PhantomData); -impl EnsureOrigin for EnsureMembers - where O: Into> -{ - type Success = u32; - fn ensure_origin(o: O) -> result::Result { - ensure_council_members(o, N::VALUE) +pub struct EnsureMember(::rstd::marker::PhantomData); +impl< + O: Into, O>> + From>, + AccountId +> EnsureOrigin for EnsureMember { + type Success = AccountId; + fn try_origin(o: O) -> Result { + o.into().and_then(|o| match o { + RawOrigin::Member(id) => Ok(id), + r => Err(O::from(r)), + }) + } +} + +pub struct EnsureMembers(::rstd::marker::PhantomData<(N, AccountId)>); +impl< + O: Into, O>> + From>, + N: U32, + AccountId, +> EnsureOrigin for EnsureMembers { + type Success = (MemberCount, MemberCount); + fn try_origin(o: O) -> Result { + o.into().and_then(|o| match o { + RawOrigin::Members(n, m) if n >= N::VALUE => Ok((n, m)), + r => Err(O::from(r)), + }) + } +} + +pub struct EnsureProportionMoreThan( + ::rstd::marker::PhantomData<(N, D, AccountId)> +); +impl< + O: Into, O>> + From>, + N: U32, + D: U32, + AccountId, +> EnsureOrigin for EnsureProportionMoreThan { + type Success = (); + fn try_origin(o: O) -> Result { + o.into().and_then(|o| match o { + RawOrigin::Members(n, m) if n * D::VALUE > N::VALUE * m => Ok(()), + r => Err(O::from(r)), + }) + } +} + +pub struct EnsureProportionAtLeast( + ::rstd::marker::PhantomData<(N, D, AccountId)> +); +impl< + O: Into, O>> + From>, + N: U32, + D: U32, + AccountId, +> EnsureOrigin for EnsureProportionAtLeast { + type Success = (); + fn try_origin(o: O) -> Result { + o.into().and_then(|o| match o { + RawOrigin::Members(n, m) if n * D::VALUE >= N::VALUE * m => Ok(()), + r => Err(O::from(r)), + }) } } @@ -203,13 +328,14 @@ mod tests { use super::RawEvent; use crate::tests::*; use crate::tests::{Call, Origin, Event as OuterEvent}; + use primitives::traits::BlakeTwo256; use srml_support::{Hashable, assert_ok, assert_noop}; use system::{EventRecord, Phase}; use hex_literal::hex; #[test] fn motions_basic_environment_works() { - with_externalities(&mut new_test_ext(true), || { + with_externalities(&mut ExtBuilder::default().with_council(true).build(), || { System::set_block_number(1); assert_eq!(Balances::free_balance(&42), 0); assert_eq!(CouncilMotions::proposals(), Vec::::new()); @@ -221,20 +347,63 @@ mod tests { } #[test] - fn motions_propose_works() { - with_externalities(&mut new_test_ext(true), || { + fn removal_of_old_voters_votes_works() { + with_externalities(&mut ExtBuilder::default().with_council(true).build(), || { + System::set_block_number(1); + let proposal = set_balance_proposal(42); + let hash = BlakeTwo256::hash_of(&proposal); + assert_ok!(CouncilMotions::propose(Origin::signed(1), 3, Box::new(proposal.clone()))); + assert_ok!(CouncilMotions::vote(Origin::signed(2), hash.clone(), 0, true)); + assert_eq!( + CouncilMotions::voting(&hash), + Some(Votes { index: 0, threshold: 3, ayes: vec![1, 2], nays: vec![] }) + ); + CouncilMotions::on_members_changed(&[], &[1]); + assert_eq!( + CouncilMotions::voting(&hash), + Some(Votes { index: 0, threshold: 3, ayes: vec![2], nays: vec![] }) + ); + + let proposal = set_balance_proposal(69); + let hash = BlakeTwo256::hash_of(&proposal); + assert_ok!(CouncilMotions::propose(Origin::signed(2), 2, Box::new(proposal.clone()))); + assert_ok!(CouncilMotions::vote(Origin::signed(3), hash.clone(), 1, false)); + assert_eq!( + CouncilMotions::voting(&hash), + Some(Votes { index: 1, threshold: 2, ayes: vec![2], nays: vec![3] }) + ); + CouncilMotions::on_members_changed(&[], &[3]); + assert_eq!( + CouncilMotions::voting(&hash), + Some(Votes { index: 1, threshold: 2, ayes: vec![2], nays: vec![] }) + ); + }); + } + + #[test] + fn propose_works() { + with_externalities(&mut ExtBuilder::default().with_council(true).build(), || { System::set_block_number(1); let proposal = set_balance_proposal(42); let hash = proposal.blake2_256().into(); assert_ok!(CouncilMotions::propose(Origin::signed(1), 3, Box::new(proposal.clone()))); assert_eq!(CouncilMotions::proposals(), vec![hash]); assert_eq!(CouncilMotions::proposal_of(&hash), Some(proposal)); - assert_eq!(CouncilMotions::voting(&hash), Some((0, 3, vec![1], Vec::::new()))); + assert_eq!( + CouncilMotions::voting(&hash), + Some(Votes { index: 0, threshold: 3, ayes: vec![1], nays: vec![] }) + ); assert_eq!(System::events(), vec![ EventRecord { phase: Phase::ApplyExtrinsic(0), - event: OuterEvent::motions(RawEvent::Proposed(1, 0, hex!["cd0b662a49f004093b80600415cf4126399af0d27ed6c185abeb1469c17eb5bf"].into(), 3)) + event: OuterEvent::motions(RawEvent::Proposed( + 1, + 0, + hex!["cd0b662a49f004093b80600415cf4126399af0d27ed6c185abeb1469c17eb5bf"].into(), + 3, + )), + topics: vec![], } ]); }); @@ -242,16 +411,19 @@ mod tests { #[test] fn motions_ignoring_non_council_proposals_works() { - with_externalities(&mut new_test_ext(true), || { + with_externalities(&mut ExtBuilder::default().with_council(true).build(), || { System::set_block_number(1); let proposal = set_balance_proposal(42); - assert_noop!(CouncilMotions::propose(Origin::signed(42), 3, Box::new(proposal.clone())), "proposer not on council"); + assert_noop!( + CouncilMotions::propose(Origin::signed(42), 3, Box::new(proposal.clone())), + "proposer not on council" + ); }); } #[test] fn motions_ignoring_non_council_votes_works() { - with_externalities(&mut new_test_ext(true), || { + with_externalities(&mut ExtBuilder::default().with_council(true).build(), || { System::set_block_number(1); let proposal = set_balance_proposal(42); let hash: H256 = proposal.blake2_256().into(); @@ -262,7 +434,7 @@ mod tests { #[test] fn motions_ignoring_bad_index_council_vote_works() { - with_externalities(&mut new_test_ext(true), || { + with_externalities(&mut ExtBuilder::default().with_council(true).build(), || { System::set_block_number(3); let proposal = set_balance_proposal(42); let hash: H256 = proposal.blake2_256().into(); @@ -273,25 +445,44 @@ mod tests { #[test] fn motions_revoting_works() { - with_externalities(&mut new_test_ext(true), || { + with_externalities(&mut ExtBuilder::default().with_council(true).build(), || { System::set_block_number(1); let proposal = set_balance_proposal(42); let hash: H256 = proposal.blake2_256().into(); assert_ok!(CouncilMotions::propose(Origin::signed(1), 2, Box::new(proposal.clone()))); - assert_eq!(CouncilMotions::voting(&hash), Some((0, 2, vec![1], Vec::::new()))); + assert_eq!( + CouncilMotions::voting(&hash), + Some(Votes { index: 0, threshold: 2, ayes: vec![1], nays: vec![] }) + ); assert_noop!(CouncilMotions::vote(Origin::signed(1), hash.clone(), 0, true), "duplicate vote ignored"); assert_ok!(CouncilMotions::vote(Origin::signed(1), hash.clone(), 0, false)); - assert_eq!(CouncilMotions::voting(&hash), Some((0, 2, Vec::::new(), vec![1]))); + assert_eq!( + CouncilMotions::voting(&hash), + Some(Votes { index: 0, threshold: 2, ayes: vec![], nays: vec![1] }) + ); assert_noop!(CouncilMotions::vote(Origin::signed(1), hash.clone(), 0, false), "duplicate vote ignored"); assert_eq!(System::events(), vec![ EventRecord { phase: Phase::ApplyExtrinsic(0), - event: OuterEvent::motions(RawEvent::Proposed(1, 0, hex!["cd0b662a49f004093b80600415cf4126399af0d27ed6c185abeb1469c17eb5bf"].into(), 2)) + event: OuterEvent::motions(RawEvent::Proposed( + 1, + 0, + hex!["cd0b662a49f004093b80600415cf4126399af0d27ed6c185abeb1469c17eb5bf"].into(), + 2, + )), + topics: vec![], }, EventRecord { phase: Phase::ApplyExtrinsic(0), - event: OuterEvent::motions(RawEvent::Voted(1, hex!["cd0b662a49f004093b80600415cf4126399af0d27ed6c185abeb1469c17eb5bf"].into(), false, 0, 1)) + event: OuterEvent::motions(RawEvent::Voted( + 1, + hex!["cd0b662a49f004093b80600415cf4126399af0d27ed6c185abeb1469c17eb5bf"].into(), + false, + 0, + 1, + )), + topics: vec![], } ]); }); @@ -299,7 +490,7 @@ mod tests { #[test] fn motions_disapproval_works() { - with_externalities(&mut new_test_ext(true), || { + with_externalities(&mut ExtBuilder::default().with_council(true).build(), || { System::set_block_number(1); let proposal = set_balance_proposal(42); let hash: H256 = proposal.blake2_256().into(); @@ -309,15 +500,32 @@ mod tests { assert_eq!(System::events(), vec![ EventRecord { phase: Phase::ApplyExtrinsic(0), - event: OuterEvent::motions(RawEvent::Proposed(1, 0, hex!["cd0b662a49f004093b80600415cf4126399af0d27ed6c185abeb1469c17eb5bf"].into(), 3)) + event: OuterEvent::motions( + RawEvent::Proposed( + 1, + 0, + hex!["cd0b662a49f004093b80600415cf4126399af0d27ed6c185abeb1469c17eb5bf"].into(), + 3, + )), + topics: vec![], }, EventRecord { phase: Phase::ApplyExtrinsic(0), - event: OuterEvent::motions(RawEvent::Voted(2, hex!["cd0b662a49f004093b80600415cf4126399af0d27ed6c185abeb1469c17eb5bf"].into(), false, 1, 1)) + event: OuterEvent::motions(RawEvent::Voted( + 2, + hex!["cd0b662a49f004093b80600415cf4126399af0d27ed6c185abeb1469c17eb5bf"].into(), + false, + 1, + 1, + )), + topics: vec![], }, EventRecord { phase: Phase::ApplyExtrinsic(0), - event: OuterEvent::motions(RawEvent::Disapproved(hex!["cd0b662a49f004093b80600415cf4126399af0d27ed6c185abeb1469c17eb5bf"].into())) + event: OuterEvent::motions(RawEvent::Disapproved( + hex!["cd0b662a49f004093b80600415cf4126399af0d27ed6c185abeb1469c17eb5bf"].into(), + )), + topics: vec![], } ]); }); @@ -325,7 +533,7 @@ mod tests { #[test] fn motions_approval_works() { - with_externalities(&mut new_test_ext(true), || { + with_externalities(&mut ExtBuilder::default().with_council(true).build(), || { System::set_block_number(1); let proposal = set_balance_proposal(42); let hash: H256 = proposal.blake2_256().into(); @@ -335,19 +543,39 @@ mod tests { assert_eq!(System::events(), vec![ EventRecord { phase: Phase::ApplyExtrinsic(0), - event: OuterEvent::motions(RawEvent::Proposed(1, 0, hex!["cd0b662a49f004093b80600415cf4126399af0d27ed6c185abeb1469c17eb5bf"].into(), 2)) + event: OuterEvent::motions(RawEvent::Proposed( + 1, + 0, + hex!["cd0b662a49f004093b80600415cf4126399af0d27ed6c185abeb1469c17eb5bf"].into(), + 2, + )), + topics: vec![], }, EventRecord { phase: Phase::ApplyExtrinsic(0), - event: OuterEvent::motions(RawEvent::Voted(2, hex!["cd0b662a49f004093b80600415cf4126399af0d27ed6c185abeb1469c17eb5bf"].into(), true, 2, 0)) + event: OuterEvent::motions(RawEvent::Voted( + 2, + hex!["cd0b662a49f004093b80600415cf4126399af0d27ed6c185abeb1469c17eb5bf"].into(), + true, + 2, + 0, + )), + topics: vec![], }, EventRecord { phase: Phase::ApplyExtrinsic(0), - event: OuterEvent::motions(RawEvent::Approved(hex!["cd0b662a49f004093b80600415cf4126399af0d27ed6c185abeb1469c17eb5bf"].into())) + event: OuterEvent::motions(RawEvent::Approved( + hex!["cd0b662a49f004093b80600415cf4126399af0d27ed6c185abeb1469c17eb5bf"].into(), + )), + topics: vec![], }, EventRecord { phase: Phase::ApplyExtrinsic(0), - event: OuterEvent::motions(RawEvent::Executed(hex!["cd0b662a49f004093b80600415cf4126399af0d27ed6c185abeb1469c17eb5bf"].into(), false)) + event: OuterEvent::motions(RawEvent::Executed( + hex!["cd0b662a49f004093b80600415cf4126399af0d27ed6c185abeb1469c17eb5bf"].into(), + false, + )), + topics: vec![], } ]); }); diff --git a/srml/council/src/seats.rs b/srml/council/src/seats.rs index 9ace6227da636a3aecdb0b1fb5031e120edb6dd0..84b6f388f29fc61cac7595dd11496ea6b0145eee 100644 --- a/srml/council/src/seats.rs +++ b/srml/council/src/seats.rs @@ -17,14 +17,20 @@ //! Council system: Handles the voting in and maintenance of council members. use rstd::prelude::*; -use primitives::traits::{Zero, One, As, StaticLookup}; +use primitives::traits::{Zero, One, StaticLookup, Bounded, Saturating}; use runtime_io::print; use srml_support::{ - StorageValue, StorageMap, dispatch::Result, decl_storage, decl_event, ensure, - traits::{Currency, ReservableCurrency, OnUnbalanced} + StorageValue, StorageMap, + dispatch::Result, decl_storage, decl_event, ensure, decl_module, + traits::{ + Currency, ReservableCurrency, OnUnbalanced, LockIdentifier, + LockableCurrency, WithdrawReasons, WithdrawReason, ExistenceRequirement + } }; use democracy; +use parity_codec::{Encode, Decode}; use system::{self, ensure_signed}; +use super::OnMembersChanged; // no polynomial attacks: // @@ -80,13 +86,51 @@ use system::{self, ensure_signed}; // after each vote as all but K entries are cleared. newly registering candidates must use cleared // entries before they increase the capacity. -use srml_support::decl_module; -pub type VoteIndex = u32; +/// The activity status of a voter. +#[derive(PartialEq, Eq, Copy, Clone, Encode, Decode, Default)] +#[cfg_attr(feature = "std", derive(Debug))] +pub struct VoterInfo { + /// Last VoteIndex in which this voter assigned (or initialized) approvals. + last_active: VoteIndex, + /// Last VoteIndex in which one of this voter's approvals won. + /// Note that `last_win = N` indicates a last win at index `N-1`, hence `last_win = 0` means no win ever. + last_win: VoteIndex, + /// The amount of stored weight as a result of not winning but changing approvals. + pot: Balance, + /// Current staked amount. A lock equal to this value always exists. + stake: Balance, +} + +/// Used to demonstrate the status of a particular index in the global voter list. +#[derive(PartialEq, Eq)] +#[cfg_attr(feature = "std", derive(Debug))] +pub enum CellStatus { + /// Any out of bound index. Means a push a must happen to the chunk pointed by `NextVoterSet`. + /// Voting fee is applied in case a new chunk is created. + Head, + /// Already occupied by another voter. Voting fee is applied. + Occupied, + /// Empty hole which should be filled. No fee will be applied. + Hole, +} + +const COUNCIL_SEATS_ID: LockIdentifier = *b"councils"; + +pub const VOTER_SET_SIZE: usize = 64; +pub const APPROVAL_SET_SIZE: usize = 8; type BalanceOf = <::Currency as Currency<::AccountId>>::Balance; type NegativeImbalanceOf = <::Currency as Currency<::AccountId>>::NegativeImbalance; +type SetIndex = u32; +pub type VoteIndex = u32; + +// all three must be in sync. +type ApprovalFlag = u32; +pub const APPROVAL_FLAG_MASK: ApprovalFlag = 0x8000_0000; +pub const APPROVAL_FLAG_LEN: usize = 32; + pub trait Trait: democracy::Trait { type Event: From> + Into<::Event>; @@ -95,6 +139,14 @@ pub trait Trait: democracy::Trait { /// Handler for the unbalanced reduction when slashing an invalid reaping attempt. type BadReaper: OnUnbalanced>; + + /// Handler for the unbalanced reduction when submitting a bad `voter_index`. + type BadVoterIndex: OnUnbalanced>; + + /// Handler for the unbalanced reduction when a candidate has lost (and is not a runner up) + type LoserCandidate: OnUnbalanced>; + /// What to do when the members change. + type OnMembersChanged: OnMembersChanged; } decl_module! { @@ -103,23 +155,56 @@ decl_module! { /// Set candidate approvals. Approval slots stay valid as long as candidates in those slots /// are registered. - fn set_approvals(origin, votes: Vec, #[compact] index: VoteIndex) -> Result { + /// + /// Locks the total balance of caller indefinitely. + /// Only [`retract_voter`] or [`reap_inactive_voter`] can unlock the balance. + /// + /// `hint` argument is interpreted differently based on: + /// - if `origin` is setting approvals for the first time: The index will be checked + /// for being a valid _hole_ in the voter list. + /// - if the hint is correctly pointing to a hole, no fee is deducted from `origin`. + /// - Otherwise, the call will succeed but the index is ignored and simply a push to the last chunk + /// with free space happens. If the new push causes a new chunk to be created, a fee indicated by + /// [`VotingFee`] is deducted. + /// - if `origin` is already a voter: the index __must__ be valid and point to the correct + /// position of the `origin` in the current voters list. + /// + /// Note that any trailing `false` votes in `votes` is ignored; In approval voting, not voting for a candidate + /// and voting false, are equal. + /// + /// # + /// - O(1). + /// - Two extra DB entries, one DB change. + /// - Argument `votes` is limited in length to number of candidates. + /// # + fn set_approvals(origin, votes: Vec, #[compact] index: VoteIndex, hint: SetIndex) -> Result { let who = ensure_signed(origin)?; - Self::do_set_approvals(who, votes, index) + Self::do_set_approvals(who, votes, index, hint) } /// Set candidate approvals from a proxy. Approval slots stay valid as long as candidates in those slots /// are registered. - fn proxy_set_approvals(origin, votes: Vec, #[compact] index: VoteIndex) -> Result { + /// + /// # + /// - Same as `set_approvals` with one additional storage read. + /// # + fn proxy_set_approvals(origin, votes: Vec, #[compact] index: VoteIndex, hint: SetIndex) -> Result { let who = >::proxy(ensure_signed(origin)?).ok_or("not a proxy")?; - Self::do_set_approvals(who, votes, index) + Self::do_set_approvals(who, votes, index, hint) } /// Remove a voter. For it not to be a bond-consuming no-op, all approved candidate indices /// must now be either unregistered or registered to a candidate that registered the slot after /// the voter gave their last approval set. /// + /// Both indices must be provided as explained in [`voter_at`] function. + /// /// May be called by anyone. Returns the voter deposit to `signed`. + /// + /// # + /// - O(1). + /// - Two fewer DB entries, one DB change. + /// # fn reap_inactive_voter( origin, #[compact] reporter_index: u32, @@ -128,34 +213,49 @@ decl_module! { #[compact] assumed_vote_index: VoteIndex ) { let reporter = ensure_signed(origin)?; - let who = T::Lookup::lookup(who)?; + ensure!(!Self::presentation_active(), "cannot reap during presentation period"); - ensure!(Self::voter_last_active(&reporter).is_some(), "reporter must be a voter"); - let last_active = Self::voter_last_active(&who).ok_or("target for inactivity cleanup must be active")?; + ensure!(Self::voter_info(&reporter).is_some(), "reporter must be a voter"); + + let info = Self::voter_info(&who).ok_or("target for inactivity cleanup must be active")?; + let last_active = info.last_active; + ensure!(assumed_vote_index == Self::vote_index(), "vote index not current"); - ensure!(assumed_vote_index > last_active + Self::inactivity_grace_period(), "cannot reap during grace period"); - let voters = Self::voters(); + ensure!( + assumed_vote_index > last_active+ Self::inactivity_grace_period(), + "cannot reap during grace period" + ); + let reporter_index = reporter_index as usize; let who_index = who_index as usize; - ensure!(reporter_index < voters.len() && voters[reporter_index] == reporter, "bad reporter index"); - ensure!(who_index < voters.len() && voters[who_index] == who, "bad target index"); + let assumed_reporter = Self::voter_at(reporter_index).ok_or("invalid reporter index")?; + let assumed_who = Self::voter_at(who_index).ok_or("invalid target index")?; + + ensure!(assumed_reporter == reporter, "bad reporter index"); + ensure!(assumed_who == who, "bad target index"); - // will definitely kill one of signed or who now. + // will definitely kill one of reporter or who now. - let valid = !Self::approvals_of(&who).iter() + let valid = !Self::all_approvals_of(&who).iter() .zip(Self::candidates().iter()) .any(|(&appr, addr)| appr && *addr != T::AccountId::default() && - Self::candidate_reg_info(addr).map_or(false, |x| x.0 <= last_active)/*defensive only: all items in candidates list are registered*/ + // defensive only: all items in candidates list are registered + Self::candidate_reg_info(addr).map_or(false, |x| x.0 <= last_active) ); Self::remove_voter( if valid { &who } else { &reporter }, - if valid { who_index } else { reporter_index }, - voters + if valid { who_index } else { reporter_index } ); + + T::Currency::remove_lock( + COUNCIL_SEATS_ID, + if valid { &who } else { &reporter } + ); + if valid { // This only fails if `reporter` doesn't exist, which it clearly must do since its the origin. // Still, it's no more harmful to propagate any error at this point. @@ -169,23 +269,42 @@ decl_module! { } /// Remove a voter. All votes are cancelled and the voter deposit is returned. + /// + /// The index must be provided as explained in [`voter_at`] function. + /// + /// Also removes the lock on the balance of the voter. See [`do_set_approvals()`]. + /// + /// # + /// - O(1). + /// - Two fewer DB entries, one DB change. + /// # fn retract_voter(origin, #[compact] index: u32) { let who = ensure_signed(origin)?; ensure!(!Self::presentation_active(), "cannot retract when presenting"); - ensure!(>::exists(&who), "cannot retract non-voter"); - let voters = Self::voters(); + ensure!(>::exists(&who), "cannot retract non-voter"); let index = index as usize; - ensure!(index < voters.len(), "retraction index invalid"); - ensure!(voters[index] == who, "retraction index mismatch"); + let voter = Self::voter_at(index).ok_or("retraction index invalid")?; + ensure!(voter == who, "retraction index mismatch"); - Self::remove_voter(&who, index, voters); + Self::remove_voter(&who, index); T::Currency::unreserve(&who, Self::voting_bond()); + T::Currency::remove_lock(COUNCIL_SEATS_ID, &who); } /// Submit oneself for candidacy. /// /// Account must have enough transferrable funds in it to pay the bond. + /// + /// NOTE: if `origin` has already assigned approvals via [`set_approvals`], + /// it will NOT have any usable funds to pass candidacy bond and must first retract. + /// Note that setting approvals will lock the entire balance of the voter until + /// retraction or being reported. + /// + /// # + /// - Independent of input. + /// - Three DB changes. + /// # fn submit_candidacy(origin, #[compact] slot: u32) { let who = ensure_signed(origin)?; @@ -214,8 +333,13 @@ decl_module! { } /// Claim that `signed` is one of the top Self::carry_count() + current_vote().1 candidates. - /// Only works if the `block_number >= current_vote().0` and `< current_vote().0 + presentation_duration()`` + /// Only works if the `block_number >= current_vote().0` and `< current_vote().0 + presentation_duration()` /// `signed` should have at least + /// + /// # + /// - O(voters) compute. + /// - One DB change. + /// # fn present_winner( origin, candidate: ::Source, @@ -223,15 +347,21 @@ decl_module! { #[compact] index: VoteIndex ) -> Result { let who = ensure_signed(origin)?; - ensure!(!total.is_zero(), "stake deposited to present winner and be added to leaderboard should be non-zero"); + ensure!( + !total.is_zero(), + "stake deposited to present winner and be added to leaderboard should be non-zero" + ); let candidate = T::Lookup::lookup(candidate)?; ensure!(index == Self::vote_index(), "index not current"); let (_, _, expiring) = Self::next_finalize().ok_or("cannot present outside of presentation period")?; - let stakes = Self::snapshoted_stakes(); - let voters = Self::voters(); - let bad_presentation_punishment = Self::present_slash_per_voter() * BalanceOf::::sa(voters.len() as u64); - ensure!(T::Currency::can_slash(&who, bad_presentation_punishment), "presenter must have sufficient slashable funds"); + let bad_presentation_punishment = + Self::present_slash_per_voter() + * BalanceOf::::from(Self::voter_count() as u32); + ensure!( + T::Currency::can_slash(&who, bad_presentation_punishment), + "presenter must have sufficient slashable funds" + ); let mut leaderboard = Self::leaderboard().ok_or("leaderboard must exist while present phase active")?; ensure!(total > leaderboard[0].0, "candidate not worthy of leaderboard"); @@ -240,17 +370,24 @@ decl_module! { ensure!(p < expiring.len(), "candidate must not form a duplicated member if elected"); } + let voters = Self::all_voters(); let (registered_since, candidate_index): (VoteIndex, u32) = Self::candidate_reg_info(&candidate).ok_or("presented candidate must be current")?; let actual_total = voters.iter() - .zip(stakes.iter()) - .filter_map(|(voter, stake)| - match Self::voter_last_active(voter) { - Some(b) if b >= registered_since => - Self::approvals_of(voter).get(candidate_index as usize) - .and_then(|approved| if *approved { Some(*stake) } else { None }), - _ => None, - }) + .filter_map(|maybe_voter| maybe_voter.as_ref()) + .filter_map(|voter| match Self::voter_info(voter) { + Some(b) if b.last_active >= registered_since => { + let last_win = b.last_win; + let now = Self::vote_index(); + let stake = b.stake; + let offset = Self::get_offset(stake, now - last_win); + let weight = stake + offset + b.pot; + if Self::approvals_of_at(voter, candidate_index as usize) { + Some(weight) + } else { None } + }, + _ => None, + }) .fold(Zero::zero(), |acc, n| acc + n); let dupe = leaderboard.iter().find(|&&(_, ref c)| c == &candidate).is_some(); if total == actual_total && !dupe { @@ -269,15 +406,16 @@ decl_module! { } /// Set the desired member count; if lower than the current count, then seats will not be up - /// election when they expire. If more, then a new vote will be started if one is not already - /// in progress. + /// election when they expire. If more, then a new vote will be started if one is not + /// already in progress. fn set_desired_seats(#[compact] count: u32) { >::put(count); } - /// Remove a particular member. A tally will happen instantly (if not already in a presentation + /// Remove a particular member from the council. This is effective immediately. + /// + /// Note: A tally should happen instantly (if not already in a presentation /// period) to fill the seat if removal means that the desired members are not met. - /// This is effective immediately. fn remove_member(who: ::Source) { let who = T::Lookup::lookup(who)?; let new_council: Vec<(T::AccountId, T::BlockNumber)> = Self::active_council() @@ -285,6 +423,7 @@ decl_module! { .filter(|i| i.0 != who) .collect(); >::put(new_council); + T::OnMembersChanged::on_members_changed(&[], &[who]); } /// Set the presentation duration. If there is currently a vote being presented for, will @@ -299,7 +438,7 @@ decl_module! { >::put(count); } - fn on_finalize(n: T::BlockNumber) { + fn on_initialize(n: T::BlockNumber) { if let Err(e) = Self::end_block(n) { print("Guru meditation"); print(e); @@ -311,57 +450,71 @@ decl_module! { decl_storage! { trait Store for Module as Council { - // parameters + // ---- parameters /// How much should be locked up in order to submit one's candidacy. - pub CandidacyBond get(candidacy_bond) config(): BalanceOf = BalanceOf::::sa(9); + pub CandidacyBond get(candidacy_bond) config(): BalanceOf = 9.into(); /// How much should be locked up in order to be able to submit votes. pub VotingBond get(voting_bond) config(voter_bond): BalanceOf; + /// The amount of fee paid upon each vote submission, unless if they submit a _hole_ index and replace it. + pub VotingFee get(voting_fee) config(voting_fee): BalanceOf; /// The punishment, per voter, if you provide an invalid presentation. - pub PresentSlashPerVoter get(present_slash_per_voter) config(): BalanceOf = BalanceOf::::sa(1); + pub PresentSlashPerVoter get(present_slash_per_voter) config(): BalanceOf = 1.into(); /// How many runners-up should have their approvals persist until the next vote. pub CarryCount get(carry_count) config(): u32 = 2; /// How long to give each top candidate to present themselves after the vote ends. - pub PresentationDuration get(presentation_duration) config(): T::BlockNumber = T::BlockNumber::sa(1000); - /// How many vote indexes need to go by after a target voter's last vote before they can be reaped if their + pub PresentationDuration get(presentation_duration) config(): T::BlockNumber = 1000.into(); + /// How many vote indices need to go by after a target voter's last vote before they can be reaped if their /// approvals are moot. pub InactiveGracePeriod get(inactivity_grace_period) config(inactive_grace_period): VoteIndex = 1; /// How often (in blocks) to check for new votes. - pub VotingPeriod get(voting_period) config(approval_voting_period): T::BlockNumber = T::BlockNumber::sa(1000); + pub VotingPeriod get(voting_period) config(approval_voting_period): T::BlockNumber = 1000.into(); /// How long each position is active for. - pub TermDuration get(term_duration) config(): T::BlockNumber = T::BlockNumber::sa(5); + pub TermDuration get(term_duration) config(): T::BlockNumber = 5.into(); /// Number of accounts that should be sitting on the council. pub DesiredSeats get(desired_seats) config(): u32; + /// Decay factor of weight when being accumulated. It should typically be set to + /// __at least__ `council_size -1` to keep the council secure. + /// When set to `N`, it indicates `(1/N)^t` of staked is decayed at weight increment step `t`. + /// 0 will result in no weight being added at all (normal approval voting). + pub DecayRatio get(decay_ratio) config(decay_ratio): u32 = 24; - // permanent state (always relevant, changes only at the finalization of voting) + // ---- permanent state (always relevant, changes only at the finalization of voting) /// The current council. When there's a vote going on, this should still be used for executive /// matters. The block number (second element in the tuple) is the block that their position is /// active until (calculated by the sum of the block number when the council member was elected /// and their term duration). pub ActiveCouncil get(active_council) config(): Vec<(T::AccountId, T::BlockNumber)>; - /// The total number of votes that have happened or are in progress. + /// The total number of vote rounds that have happened or are in progress. pub VoteCount get(vote_index): VoteIndex; - // persistent state (always relevant, changes constantly) - /// A list of votes for each voter, respecting the last cleared vote index that this voter was - /// last active at. - pub ApprovalsOf get(approvals_of): map T::AccountId => Vec; + // ---- persistent state (always relevant, changes constantly) + /// A list of votes for each voter. The votes are stored as numeric values and parsed in a bit-wise manner. + /// + /// In order to get a human-readable representation (`Vec`), use [`all_approvals_of`]. + /// + /// Furthermore, each vector of scalars is chunked with the cap of `APPROVAL_SET_SIZE`. + pub ApprovalsOf get(approvals_of): map (T::AccountId, SetIndex) => Vec; /// The vote index and list slot that the candidate `who` was registered or `None` if they are not /// currently registered. pub RegisterInfoOf get(candidate_reg_info): map T::AccountId => Option<(VoteIndex, u32)>; - /// The last cleared vote index that this voter was last active at. - pub LastActiveOf get(voter_last_active): map T::AccountId => Option; - /// The present voter list. - pub Voters get(voters): Vec; + /// Basic information about a voter. + pub VoterInfoOf get(voter_info): map T::AccountId => Option>>; + /// The present voter list (chunked and capped at [`VOTER_SET_SIZE`]). + pub Voters get(voters): map SetIndex => Vec>; + /// the next free set to store a voter in. This will keep growing. + pub NextVoterSet get(next_nonfull_voter_set): SetIndex = 0; + /// Current number of Voters. + pub VoterCount get(voter_count): SetIndex = 0; /// The present candidate list. pub Candidates get(candidates): Vec; // has holes + /// Current number of active candidates pub CandidateCount get(candidate_count): u32; - // temporary state (only relevant during finalization/presentation) + // ---- temporary state (only relevant during finalization/presentation) /// The accounts holding the seats that will become free on the next tally. pub NextFinalize get(next_finalize): Option<(T::BlockNumber, u32, Vec)>; - /// The stakes as they were at the point that the vote ended. - pub SnapshotedStakes get(snapshoted_stakes): Vec>; - /// Get the leaderboard if we;re in the presentation phase. + /// Get the leaderboard if we're in the presentation phase. The first element is the weight of each entry; + /// It may be the direct summed approval stakes, or a weighted version of it. pub Leaderboard get(leaderboard): Option, T::AccountId)> >; // ORDERED low -> high } } @@ -392,6 +545,14 @@ impl Module { >::exists(who) } + /// Iff the councillor `who` still has a seat at blocknumber `n` returns `true`. + pub fn will_still_be_councillor_at(who: &T::AccountId, n: T::BlockNumber) -> bool { + Self::active_council().iter() + .find(|&&(ref a, _)| a == who) + .map(|&(_, expires)| expires > n) + .unwrap_or(false) + } + /// Determine the block that a vote can happen on which is no less than `n`. pub fn next_vote_from(n: T::BlockNumber) -> T::BlockNumber { let voting_period = Self::voting_period(); @@ -446,15 +607,21 @@ impl Module { Ok(()) } - /// Remove a voter from the system. Trusts that Self::voters()[index] != voter. - fn remove_voter(voter: &T::AccountId, index: usize, mut voters: Vec) { - >::put({ voters.swap_remove(index); voters }); - >::remove(voter); - >::remove(voter); + /// Remove a voter at a specified index from the system. + fn remove_voter(voter: &T::AccountId, index: usize) { + let (set_index, vec_index) = Self::split_index(index, VOTER_SET_SIZE); + let mut set = Self::voters(set_index); + set[vec_index] = None; + >::insert(set_index, set); + >::mutate(|c| *c = *c - 1); + Self::remove_all_approvals_of(voter); + >::remove(voter); } - // Actually do the voting. - fn do_set_approvals(who: T::AccountId, votes: Vec, index: VoteIndex) -> Result { + /// Actually do the voting. + /// + /// The voter index must be provided as explained in [`voter_at`] function. + fn do_set_approvals(who: T::AccountId, votes: Vec, index: VoteIndex, hint: SetIndex) -> Result { let candidates = Self::candidates(); ensure!(!Self::presentation_active(), "no approval changes during presentation period"); @@ -463,39 +630,98 @@ impl Module { // Prevent a vote from voters that provide a list of votes that exceeds the candidates length // since otherwise an attacker may be able to submit a very long list of `votes` that far exceeds // the amount of candidates and waste more computation than a reasonable voting bond would cover. - ensure!(candidates.len() >= votes.len(), "amount of candidate approval votes cannot exceed amount of candidates"); + ensure!(candidates.len() >= votes.len(), "amount of candidate votes cannot exceed amount of candidates"); + + // Amount to be locked up. + let mut locked_balance = T::Currency::total_balance(&who); + let mut pot_to_set = Zero::zero(); + let hint = hint as usize; + + if let Some(info) = Self::voter_info(&who) { + // already a voter. Index must be valid. No fee. update pot. O(1) + let voter = Self::voter_at(hint).ok_or("invalid voter index")?; + ensure!(voter == who, "wrong voter index"); + + // write new accumulated offset. + let last_win = info.last_win; + let now = index; + let offset = Self::get_offset(info.stake, now - last_win); + pot_to_set = info.pot + offset; + } else { + // not yet a voter. Index _could be valid_. Fee might apply. Bond will be reserved O(1). + ensure!( + T::Currency::free_balance(&who) > Self::voting_bond(), + "new voter must have sufficient funds to pay the bond" + ); - if !>::exists(&who) { - // not yet a voter - deduct bond. - // NOTE: this must be the last potential bailer, since it changes state. - T::Currency::reserve(&who, Self::voting_bond())?; + let (set_index, vec_index) = Self::split_index(hint, VOTER_SET_SIZE); + match Self::cell_status(set_index, vec_index) { + CellStatus::Hole => { + // requested cell was a valid hole. + >::mutate(set_index, |set| set[vec_index] = Some(who.clone())); + }, + CellStatus::Head | CellStatus::Occupied => { + // Either occupied or out-of-range. + let next = Self::next_nonfull_voter_set(); + let mut set = Self::voters(next); + // Caused a new set to be created. Pay for it. + // This is the last potential error. Writes will begin afterwards. + if set.is_empty() { + let imbalance = T::Currency::withdraw( + &who, + Self::voting_fee(), + WithdrawReason::Fee, + ExistenceRequirement::KeepAlive, + )?; + T::BadVoterIndex::on_unbalanced(imbalance); + // NOTE: this is safe since the `withdraw()` will check this. + locked_balance -= Self::voting_fee(); + } + Self::checked_push_voter(&mut set, who.clone(), next); + >::insert(next, set); + } + } - >::mutate(|v| v.push(who.clone())); + T::Currency::reserve(&who, Self::voting_bond())?; + >::mutate(|c| *c = *c + 1); } - >::insert(&who, index); - >::insert(&who, votes); + + T::Currency::set_lock( + COUNCIL_SEATS_ID, + &who, + locked_balance, + T::BlockNumber::max_value(), + WithdrawReasons::all() + ); + + >::insert( + &who, + VoterInfo::> { + last_active: index, + last_win: index, + stake: locked_balance, + pot: pot_to_set, + } + ); + Self::set_approvals_chunked(&who, votes); Ok(()) } - /// Close the voting, snapshot the staking and the number of seats that are actually up for grabs. + /// Close the voting, record the number of seats that are actually up for grabs. fn start_tally() { let active_council = Self::active_council(); let desired_seats = Self::desired_seats() as usize; let number = >::block_number(); - let expiring = active_council.iter().take_while(|i| i.1 == number).map(|i| i.0.clone()).collect::>(); + let expiring = active_council.iter().take_while(|i| i.1 <= number).map(|i| i.0.clone()).collect::>(); let retaining_seats = active_council.len() - expiring.len(); if retaining_seats < desired_seats { let empty_seats = desired_seats - retaining_seats; >::put((number + Self::presentation_duration(), empty_seats as u32, expiring)); - let voters = Self::voters(); - let votes = voters.iter().map(T::Currency::total_balance).collect::>(); - >::put(votes); - // initialize leaderboard. let leaderboard_size = empty_seats + Self::carry_count() as usize; - >::put(vec![(BalanceOf::::zero(), T::AccountId::default()); leaderboard_size]); + >::put(vec![(Zero::zero(), T::AccountId::default()); leaderboard_size]); Self::deposit_event(RawEvent::TallyStarted(empty_seats as u32)); } @@ -506,7 +732,6 @@ impl Module { /// a new vote is started. /// Clears all presented candidates, returning the bond of the elected ones. fn finalize_tally() -> Result { - >::kill(); let (_, coming, expiring): (T::BlockNumber, u32, Vec) = >::take().ok_or("finalize can only be called after a tally is started.")?; let leaderboard: Vec<(BalanceOf, T::AccountId)> = >::take().unwrap_or_default(); @@ -514,16 +739,30 @@ impl Module { // return bond to winners. let candidacy_bond = Self::candidacy_bond(); - let incoming: Vec = leaderboard.iter() + let incoming: Vec<_> = leaderboard.iter() .rev() .take_while(|&&(b, _)| !b.is_zero()) .take(coming as usize) .map(|(_, a)| a) .cloned() - .inspect(|a| {T::Currency::unreserve(a, candidacy_bond);}) + .inspect(|a| { T::Currency::unreserve(a, candidacy_bond); }) .collect(); + + // Update last win index for anyone voted for any of the incomings. + incoming.iter().filter_map(|i| Self::candidate_reg_info(i)).for_each(|r| { + let index = r.1 as usize; + Self::all_voters() + .iter() + .filter_map(|mv| mv.as_ref()) + .filter(|v| Self::approvals_of_at(*v, index)) + .for_each(|v| >::mutate(v, |a| { + if let Some(activity) = a { activity.last_win = Self::vote_index() + 1; } + })); + }); let active_council = Self::active_council(); - let outgoing = active_council.iter().take(expiring.len()).map(|a| a.0.clone()).collect(); + let outgoing: Vec<_> = active_council.iter() + .take(expiring.len()) + .map(|a| a.0.clone()).collect(); // set the new council. let mut new_council: Vec<_> = active_council @@ -534,6 +773,8 @@ impl Module { new_council.sort_by_key(|&(_, expiry)| expiry); >::put(new_council); + T::OnMembersChanged::on_members_changed(&incoming, &outgoing); + // clear all except runners-up from candidate list. let candidates = Self::candidates(); let mut new_candidates = vec![T::AccountId::default(); candidates.len()]; // shrink later. @@ -565,6 +806,205 @@ impl Module { >::put(Self::vote_index() + 1); Ok(()) } + + fn checked_push_voter(set: &mut Vec>, who: T::AccountId, index: u32) { + let len = set.len(); + + // Defensive only: this should never happen. Don't push since it will break more things. + if len == VOTER_SET_SIZE { return; } + + set.push(Some(who)); + if len + 1 == VOTER_SET_SIZE { + >::put(index + 1); + } + } + + /// Get the set and vector index of a global voter index. + /// + /// Note that this function does not take holes into account. + /// See [`voter_at`]. + fn split_index(index: usize, scale: usize) -> (SetIndex, usize) { + let set_index = (index / scale) as u32; + let vec_index = index % scale; + (set_index, vec_index) + } + + /// Return a concatenated vector over all voter sets. + fn all_voters() -> Vec> { + let mut all = >::get(0); + let mut index = 1; + // NOTE: we could also use `Self::next_nonfull_voter_set()` here but that might change based + // on how we do chunking. This is more generic. + loop { + let next_set = >::get(index); + if next_set.is_empty() { + break; + } else { + index += 1; + all.extend(next_set); + } + } + all + } + + /// Shorthand for fetching a voter at a specific (global) index. + /// + /// NOTE: this function is used for checking indices. Yet, it does not take holes into account. + /// This means that any account submitting an index at any point in time should submit: + /// `VOTER_SET_SIZE * set_index + local_index`, meaning that you are ignoring all holes in the + /// first `set_index` sets. + fn voter_at(index: usize) -> Option { + let (set_index, vec_index) = Self::split_index(index, VOTER_SET_SIZE); + let set = Self::voters(set_index); + if vec_index < set.len() { + set[vec_index].clone() + } else { + None + } + } + + /// A more sophisticated version of `voter_at`. Will be kept separate as most often it is an overdue + /// compared to `voter_at`. Only used when setting approvals. + fn cell_status(set_index: SetIndex, vec_index: usize) -> CellStatus { + let set = Self::voters(set_index); + if vec_index < set.len() { + if let Some(_) = set[vec_index] { + CellStatus::Occupied + } else { + CellStatus::Hole + } + } else { + CellStatus::Head + } + } + + /// Sets the approval of a voter in a chunked manner. + fn set_approvals_chunked(who: &T::AccountId, approvals: Vec) { + let approvals_flag_vec = Self::bool_to_flag(approvals); + approvals_flag_vec + .chunks(APPROVAL_SET_SIZE) + .enumerate() + .for_each(|(index, slice)| >::insert((who.clone(), index as SetIndex), slice.to_vec())); + } + + /// shorthand for fetching a specific approval of a voter at a specific (global) index. + /// + /// Using this function to read a vote is preferred as it reads `APPROVAL_SET_SIZE` items of type + /// `ApprovalFlag` from storage at most; not all of them. + /// + /// Note that false is returned in case of no-vote or an explicit `false`. + fn approvals_of_at(who: &T::AccountId, index: usize) -> bool { + let (flag_index, bit) = Self::split_index(index, APPROVAL_FLAG_LEN); + let (set_index, vec_index) = Self::split_index(flag_index as usize, APPROVAL_SET_SIZE); + let set = Self::approvals_of((who.clone(), set_index)); + if vec_index < set.len() { + // This is because bit_at treats numbers in lsb -> msb order. + let reversed_index = set.len() - 1 - vec_index; + Self::bit_at(set[reversed_index], bit) + } else { + false + } + } + + /// Return true of the bit `n` of scalar `x` is set to `1` and false otherwise. + fn bit_at(x: ApprovalFlag, n: usize) -> bool { + if n < APPROVAL_FLAG_LEN { + // x & ( APPROVAL_FLAG_MASK >> n ) != 0 + x & ( 1 << n ) != 0 + } else { + false + } + } + + /// Convert a vec of boolean approval flags to a vec of integers, as denoted by + /// the type `ApprovalFlag`. see `bool_to_flag_should_work` test for examples. + pub fn bool_to_flag(x: Vec) -> Vec { + let mut result: Vec = Vec::with_capacity(x.len() / APPROVAL_FLAG_LEN); + if x.is_empty() { + return result; + } + result.push(0); + let mut index = 0; + let mut counter = 0; + loop { + let shl_index = counter % APPROVAL_FLAG_LEN; + result[index] += (if x[counter] { 1 } else { 0 }) << shl_index; + counter += 1; + if counter > x.len() - 1 { break; } + if counter % APPROVAL_FLAG_LEN == 0 { + result.push(0); + index += 1; + } + } + result + } + + /// Convert a vec of flags (u32) to boolean. + pub fn flag_to_bool(chunk: Vec) -> Vec { + let mut result = Vec::with_capacity(chunk.len()); + if chunk.is_empty() { return vec![] } + chunk.into_iter() + .map(|num| (0..APPROVAL_FLAG_LEN).map(|bit| Self::bit_at(num, bit)).collect::>()) + .for_each(|c| { + let last_approve = match c.iter().rposition(|n| *n) { + Some(index) => index + 1, + None => 0 + }; + result.extend(c.into_iter().take(last_approve)); + }); + result + } + + /// Return a concatenated vector over all approvals of a voter as boolean. + /// The trailing zeros are removed. + fn all_approvals_of(who: &T::AccountId) -> Vec { + let mut all: Vec = vec![]; + let mut index = 0_u32; + loop { + let chunk = Self::approvals_of((who.clone(), index)); + if chunk.is_empty() { break; } + all.extend(Self::flag_to_bool(chunk)); + index += 1; + } + all + } + + /// Remove all approvals associated with one account. + fn remove_all_approvals_of(who: &T::AccountId) { + let mut index = 0; + loop { + let set = Self::approvals_of((who.clone(), index)); + if set.len() > 0 { + >::remove((who.clone(), index)); + index += 1; + } else { + break + } + } + } + + /// Calculates the offset value (stored pot) of a stake, based on the distance + /// to the last win_index, `t`. Regardless of the internal implementation, + /// it should always be used with the following structure: + /// + /// Given Stake of voter `V` being `x` and distance to last_win index `t`, the new weight + /// of `V` is `x + get_offset(x, t)`. + /// + /// In other words, this function returns everything extra that should be added + /// to a voter's stake value to get the correct weight. Indeed, zero is + /// returned if `t` is zero. + fn get_offset(stake: BalanceOf, t: VoteIndex) -> BalanceOf { + let decay_ratio: BalanceOf = Self::decay_ratio().into(); + if t > 150 { return stake * decay_ratio } + let mut offset = stake; + let mut r = Zero::zero(); + let decay = decay_ratio + One::one(); + for _ in 0..t { + offset = offset.saturating_sub(offset / decay); + r += offset + } + r + } } #[cfg(test)] @@ -573,16 +1013,86 @@ mod tests { use crate::tests::*; use srml_support::{assert_ok, assert_noop, assert_err}; + fn voter_ids() -> Vec { + Council::all_voters().iter().map(|v| v.unwrap_or(0) ).collect::>() + } + + fn vote(i: u64, l: usize) { + let _ = Balances::make_free_balance_be(&i, 20); + assert_ok!(Council::set_approvals(Origin::signed(i), (0..l).map(|_| true).collect::>(), 0, 0)); + } + + fn vote_at(i: u64, l: usize, index: VoteIndex) { + let _ = Balances::make_free_balance_be(&i, 20); + assert_ok!(Council::set_approvals(Origin::signed(i), (0..l).map(|_| true).collect::>(), 0, index)); + } + + fn create_candidate(i: u64, index: u32) { + let _ = Balances::make_free_balance_be(&i, 20); + assert_ok!(Council::submit_candidacy(Origin::signed(i), index)); + } + + fn bond() -> u64 { + Council::voting_bond() + } + + + #[test] + fn bool_to_flag_should_work() { + with_externalities(&mut ExtBuilder::default().build(), || { + assert_eq!(Council::bool_to_flag(vec![]), vec![]); + assert_eq!(Council::bool_to_flag(vec![false]), vec![0]); + assert_eq!(Council::bool_to_flag(vec![true]), vec![1]); + assert_eq!(Council::bool_to_flag(vec![true, true, true, true]), vec![15]); + assert_eq!(Council::bool_to_flag(vec![true, true, true, true, true]), vec![15 + 16]); + + let set_1 = vec![ + true, false, false, false, // 0x1 + false, true, true, true, // 0xE + ]; + assert_eq!( + Council::bool_to_flag(set_1.clone()), + vec![0x00_00_00_E1_u32] + ); + assert_eq!( + Council::flag_to_bool(vec![0x00_00_00_E1_u32]), + set_1 + ); + + let set_2 = vec![ + false, false, false, true, // 0x8 + false, true, false, true, // 0xA + ]; + assert_eq!( + Council::bool_to_flag(set_2.clone()), + vec![0x00_00_00_A8_u32] + ); + assert_eq!( + Council::flag_to_bool(vec![0x00_00_00_A8_u32]), + set_2 + ); + + let mut rhs = (0..100/APPROVAL_FLAG_LEN).map(|_| 0xFFFFFFFF_u32).collect::>(); + // NOTE: this might be need change based on `APPROVAL_FLAG_LEN`. + rhs.extend(vec![0x00_00_00_0F]); + assert_eq!( + Council::bool_to_flag((0..100).map(|_| true).collect()), + rhs + ) + }) + } + #[test] fn params_should_work() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(1); assert_eq!(Council::next_vote_from(1), 4); assert_eq!(Council::next_vote_from(4), 4); assert_eq!(Council::next_vote_from(5), 8); assert_eq!(Council::vote_index(), 0); - assert_eq!(Council::candidacy_bond(), 9); - assert_eq!(Council::voting_bond(), 3); + assert_eq!(Council::candidacy_bond(), 3); + assert_eq!(Council::voting_bond(), 0); + assert_eq!(Council::voting_fee(), 0); assert_eq!(Council::present_slash_per_voter(), 1); assert_eq!(Council::presentation_duration(), 2); assert_eq!(Council::inactivity_grace_period(), 1); @@ -600,15 +1110,225 @@ mod tests { assert_eq!(Council::is_a_candidate(&1), false); assert_eq!(Council::candidate_reg_info(1), None); - assert_eq!(Council::voters(), Vec::::new()); - assert_eq!(Council::voter_last_active(1), None); - assert_eq!(Council::approvals_of(1), vec![]); + assert_eq!(Council::voters(0), Vec::>::new()); + assert_eq!(Council::voter_info(1), None); + assert_eq!(Council::all_approvals_of(&1), vec![]); }); } + #[test] + fn voter_set_growth_should_work() { + with_externalities(&mut ExtBuilder::default().build(), || { + assert_ok!(Council::submit_candidacy(Origin::signed(2), 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(3), 1)); + + // create 65. 64 (set0) + 1 (set1) + (1..=63).for_each(|i| vote(i, 2)); + assert_eq!(Council::next_nonfull_voter_set(), 0); + vote(64, 2); + assert_eq!(Council::next_nonfull_voter_set(), 1); + vote(65, 2); + + let set1 = Council::voters(0); + let set2 = Council::voters(1); + + assert_eq!(set1.len(), 64); + assert_eq!(set2.len(), 1); + + assert_eq!(set1[0], Some(1)); + assert_eq!(set1[10], Some(11)); + assert_eq!(set2[0], Some(65)); + }) + } + + #[test] + fn voter_set_reclaim_should_work() { + with_externalities(&mut ExtBuilder::default().build(), || { + assert_ok!(Council::submit_candidacy(Origin::signed(2), 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(3), 1)); + + (1..=129).for_each(|i| vote(i, 2)); + assert_eq!(Council::next_nonfull_voter_set(), 2); + + assert_ok!(Council::retract_voter(Origin::signed(11), 10)); + + assert_ok!(Council::retract_voter(Origin::signed(66), 65)); + assert_ok!(Council::retract_voter(Origin::signed(67), 66)); + + // length does not show it but holes do exist. + assert_eq!(Council::voters(0).len(), 64); + assert_eq!(Council::voters(1).len(), 64); + assert_eq!(Council::voters(2).len(), 1); + + assert_eq!(Council::voters(0)[10], None); + assert_eq!(Council::voters(1)[1], None); + assert_eq!(Council::voters(1)[2], None); + // Next set with capacity is 2. + assert_eq!(Council::next_nonfull_voter_set(), 2); + + // But we can fill a hole. + vote_at(130, 2, 10); + + // Nothing added to set 2. A hole was filled. + assert_eq!(Council::voters(0).len(), 64); + assert_eq!(Council::voters(1).len(), 64); + assert_eq!(Council::voters(2).len(), 1); + + // and the next two (scheduled) to the second set. + assert_eq!(Council::next_nonfull_voter_set(), 2); + }) + } + + #[test] + fn approvals_set_growth_should_work() { + with_externalities(&mut ExtBuilder::default().build(), || { + // create candidates and voters. + (1..=250).for_each(|i| create_candidate(i, (i-1) as u32)); + (1..=250).for_each(|i| vote(i, i as usize)); + + // all approvals of should return the exact expected vector. + assert_eq!(Council::all_approvals_of(&180), (0..180).map(|_| true).collect::>()); + + assert_eq!(Council::all_approvals_of(&32), (0..32).map(|_| true).collect::>()); + assert_eq!(Council::all_approvals_of(&8), (0..8).map(|_| true).collect::>()); + assert_eq!(Council::all_approvals_of(&64), (0..64).map(|_| true).collect::>()); + assert_eq!(Council::all_approvals_of(&65), (0..65).map(|_| true).collect::>()); + assert_eq!(Council::all_approvals_of(&63), (0..63).map(|_| true).collect::>()); + + // NOTE: assuming that APPROVAL_SET_SIZE is more or less small-ish. Might fail otherwise. + let full_sets = (180 / APPROVAL_FLAG_LEN) / APPROVAL_SET_SIZE; + let left_over = (180 / APPROVAL_FLAG_LEN) / APPROVAL_SET_SIZE; + let rem = 180 % APPROVAL_FLAG_LEN; + + // grab and check the last full set, if it exists. + if full_sets > 0 { + assert_eq!( + Council::approvals_of((180, (full_sets-1) as SetIndex )), + Council::bool_to_flag((0..APPROVAL_SET_SIZE * APPROVAL_FLAG_LEN).map(|_| true).collect::>()) + ); + } + + // grab and check the last, half-empty, set. + if left_over > 0 { + assert_eq!( + Council::approvals_of((180, full_sets as SetIndex)), + Council::bool_to_flag((0..left_over * APPROVAL_FLAG_LEN + rem).map(|_| true).collect::>()) + ); + } + }) + } + + + #[test] + fn cell_status_works() { + with_externalities(&mut ExtBuilder::default().build(), || { + assert_ok!(Council::submit_candidacy(Origin::signed(2), 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(3), 1)); + + (1..=63).for_each(|i| vote(i, 2)); + + assert_ok!(Council::retract_voter(Origin::signed(11), 10)); + assert_ok!(Council::retract_voter(Origin::signed(21), 20)); + + assert_eq!(Council::cell_status(0, 10), CellStatus::Hole); + assert_eq!(Council::cell_status(0, 0), CellStatus::Occupied); + assert_eq!(Council::cell_status(0, 20), CellStatus::Hole); + assert_eq!(Council::cell_status(0, 63), CellStatus::Head); + assert_eq!(Council::cell_status(1, 0), CellStatus::Head); + assert_eq!(Council::cell_status(1, 10), CellStatus::Head); + }) + } + + #[test] + fn initial_set_approvals_ignores_voter_index() { + with_externalities(&mut ExtBuilder::default().build(), || { + assert_ok!(Council::submit_candidacy(Origin::signed(2), 0)); + + // Last argument is essentially irrelevant. You might get or miss a tip. + assert_ok!(Council::set_approvals(Origin::signed(3), vec![true], 0, 0)); + assert_ok!(Council::set_approvals(Origin::signed(4), vec![true], 0, 5)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![true], 0, 100)); + + // indices are more or less ignored. all is pushed. + assert_eq!(voter_ids(), vec![3, 4, 5]); + }) + } + + #[test] + fn bad_approval_index_slashes_voters_and_bond_reduces_stake() { + with_externalities(&mut ExtBuilder::default().voting_fee(5).voter_bond(2).build(), || { + assert_ok!(Council::submit_candidacy(Origin::signed(2), 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(3), 1)); + + (1..=63).for_each(|i| vote(i, 2)); + assert_eq!(Balances::free_balance(&1), 20 - 5 - 2); // -5 fee -2 bond + assert_eq!(Balances::free_balance(&10), 20 - 2); + assert_eq!(Balances::free_balance(&60), 20 - 2); + + // still no fee + vote(64, 2); + assert_eq!(Balances::free_balance(&64), 20 - 2); // -2 bond + assert_eq!( + Council::voter_info(&64).unwrap(), + VoterInfo { last_win: 0, last_active: 0, stake: 20, pot:0 } + ); + + assert_eq!(Council::next_nonfull_voter_set(), 1); + + // now we charge the next voter. + vote(65, 2); + assert_eq!(Balances::free_balance(&65), 20 - 5 - 2); + assert_eq!( + Council::voter_info(&65).unwrap(), + VoterInfo { last_win: 0, last_active: 0, stake: 15, pot:0 } + ); + }); + } + + #[test] + fn subsequent_set_approvals_checks_voter_index() { + with_externalities(&mut ExtBuilder::default().build(), || { + assert_ok!(Council::submit_candidacy(Origin::signed(2), 0)); + + assert_ok!(Council::set_approvals(Origin::signed(3), vec![true], 0, 0)); + assert_ok!(Council::set_approvals(Origin::signed(4), vec![true], 0, 5)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![true], 0, 100)); + + // invalid index + assert_noop!(Council::set_approvals(Origin::signed(4), vec![true], 0, 5), "invalid voter index"); + // wrong index + assert_noop!(Council::set_approvals(Origin::signed(4), vec![true], 0, 0), "wrong voter index"); + // correct + assert_ok!(Council::set_approvals(Origin::signed(4), vec![true], 0, 1)); + }) + } + + #[test] + fn voter_index_does_not_take_holes_into_account() { + with_externalities(&mut ExtBuilder::default().build(), || { + assert_ok!(Council::submit_candidacy(Origin::signed(2), 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(3), 1)); + + // create 65. 64 (set0) + 1 (set1) + (1..=65).for_each(|i| vote(i, 2)); + + // account 65 has global index 65. + assert_eq!(Council::voter_at(64).unwrap(), 65); + + assert_ok!(Council::retract_voter(Origin::signed(1), 0)); + assert_ok!(Council::retract_voter(Origin::signed(2), 1)); + + // still the same. These holes are in some other set. + assert_eq!(Council::voter_at(64).unwrap(), 65); + // proof: can submit a new approval with the old index. + assert_noop!(Council::set_approvals(Origin::signed(65), vec![false, true], 0, 64 - 2), "wrong voter index"); + assert_ok!(Council::set_approvals(Origin::signed(65), vec![false, true], 0, 64)); + }) + } + #[test] fn simple_candidate_submission_should_work() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(1); assert_eq!(Council::candidates(), Vec::::new()); assert_eq!(Council::candidate_reg_info(1), None); @@ -633,7 +1353,7 @@ mod tests { } fn new_test_ext_with_candidate_holes() -> runtime_io::TestExternalities { - let mut t = new_test_ext(false); + let mut t = ExtBuilder::default().build(); with_externalities(&mut t, || { >::put(vec![0, 0, 1]); >::put(1); @@ -676,7 +1396,9 @@ mod tests { #[test] fn candidate_submission_not_using_free_slot_should_not_work() { - with_externalities(&mut new_test_ext_with_candidate_holes(), || { + let mut t = new_test_ext_with_candidate_holes(); + + with_externalities(&mut t, || { System::set_block_number(1); assert_noop!(Council::submit_candidacy(Origin::signed(4), 3), "invalid candidate slot"); }); @@ -684,7 +1406,7 @@ mod tests { #[test] fn bad_candidate_slot_submission_should_not_work() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(1); assert_eq!(Council::candidates(), Vec::::new()); assert_noop!(Council::submit_candidacy(Origin::signed(1), 1), "invalid candidate slot"); @@ -693,7 +1415,7 @@ mod tests { #[test] fn non_free_candidate_slot_submission_should_not_work() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(1); assert_eq!(Council::candidates(), Vec::::new()); assert_ok!(Council::submit_candidacy(Origin::signed(1), 0)); @@ -704,7 +1426,7 @@ mod tests { #[test] fn dupe_candidate_submission_should_not_work() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(1); assert_eq!(Council::candidates(), Vec::::new()); assert_ok!(Council::submit_candidacy(Origin::signed(1), 0)); @@ -715,45 +1437,367 @@ mod tests { #[test] fn poor_candidate_submission_should_not_work() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(1); assert_eq!(Council::candidates(), Vec::::new()); assert_noop!(Council::submit_candidacy(Origin::signed(7), 0), "candidate has not enough funds"); }); } + #[test] + fn balance_should_lock_to_the_maximum() { + with_externalities(&mut ExtBuilder::default().build(), || { + System::set_block_number(1); + assert_eq!(Council::candidates(), Vec::::new()); + assert_eq!(Balances::free_balance(&2), 20); + + assert_ok!(Council::submit_candidacy(Origin::signed(5), 0)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 0, 0)); + + assert_eq!(Balances::free_balance(&2), 20 - bond() ); + assert_noop!(Balances::reserve(&2, 1), "account liquidity restrictions prevent withdrawal"); // locked. + + // deposit a bit more. + let _ = Balances::deposit_creating(&2, 100); + assert_ok!(Balances::reserve(&2, 1)); // locked but now has enough. + + assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 0, 0)); + assert_noop!(Balances::reserve(&2, 1), "account liquidity restrictions prevent withdrawal"); // locked. + assert_eq!(Balances::locks(&2).len(), 1); + assert_eq!(Balances::locks(&2)[0].amount, 100 + 20); + + assert_ok!(Council::retract_voter(Origin::signed(2), 0)); + + assert_eq!(Balances::locks(&2).len(), 0); + assert_eq!(Balances::free_balance(&2), 120 - 1); // 1 ok call to .reserve() happened. + assert_ok!(Balances::reserve(&2, 1)); // unlocked. + }); + } + + #[test] + fn balance_should_lock_on_submit_approvals_unlock_on_retract() { + with_externalities(&mut ExtBuilder::default().voter_bond(8).voting_fee(0).build(), || { + System::set_block_number(1); + assert_eq!(Council::candidates(), Vec::::new()); + assert_eq!(Balances::free_balance(&2), 20); + + assert_ok!(Council::submit_candidacy(Origin::signed(5), 0)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 0, 0)); + + assert_eq!(Balances::free_balance(&2), 12); // 20 - 8 (bond) + assert_noop!(Balances::reserve(&2, 10), "account liquidity restrictions prevent withdrawal"); // locked. + + assert_ok!(Council::retract_voter(Origin::signed(2), 0)); + + assert_eq!(Balances::free_balance(&2), 20); + assert_ok!(Balances::reserve(&2, 10)); // unlocked. + }); + } + + #[test] + fn accumulating_weight_and_decaying_should_work() { + with_externalities(&mut ExtBuilder::default().balance_factor(10).build(), || { + System::set_block_number(4); + assert!(!Council::presentation_active()); + + assert_ok!(Council::submit_candidacy(Origin::signed(6), 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(5), 1)); + assert_ok!(Council::submit_candidacy(Origin::signed(1), 2)); + + assert_ok!(Council::set_approvals(Origin::signed(6), vec![true, false, false], 0, 0)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, true, false], 0, 0)); + assert_ok!(Council::set_approvals(Origin::signed(1), vec![false, false, true], 0, 0)); + + assert_ok!(Council::end_block(System::block_number())); + + System::set_block_number(6); + assert!(Council::presentation_active()); + + assert_eq!(Council::present_winner(Origin::signed(6), 6, 600, 0), Ok(())); + assert_eq!(Council::present_winner(Origin::signed(5), 5, 500, 0), Ok(())); + assert_eq!(Council::present_winner(Origin::signed(1), 1, 100, 0), Ok(())); + assert_eq!(Council::leaderboard(), Some(vec![(0, 0), (100, 1), (500, 5), (600, 6)])); + assert_ok!(Council::end_block(System::block_number())); + + assert_eq!(Council::active_council(), vec![(6, 11), (5, 11)]); + assert_eq!(Council::voter_info(6).unwrap(), VoterInfo { last_win: 1, last_active: 0, stake: 600, pot: 0}); + assert_eq!(Council::voter_info(5).unwrap(), VoterInfo { last_win: 1, last_active: 0, stake: 500, pot: 0}); + assert_eq!(Council::voter_info(1).unwrap(), VoterInfo { last_win: 0, last_active: 0, stake: 100, pot: 0}); + + System::set_block_number(12); + // retract needed to unlock approval funds => submit candidacy again. + assert_ok!(Council::retract_voter(Origin::signed(6), 0)); + assert_ok!(Council::retract_voter(Origin::signed(5), 1)); + assert_ok!(Council::submit_candidacy(Origin::signed(6), 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(5), 1)); + assert_ok!(Council::set_approvals(Origin::signed(6), vec![true, false, false], 1, 0)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, true, false], 1, 1)); + assert_ok!(Council::end_block(System::block_number())); + + System::set_block_number(14); + assert!(Council::presentation_active()); + assert_eq!(Council::present_winner(Origin::signed(6), 6, 600, 1), Ok(())); + assert_eq!(Council::present_winner(Origin::signed(5), 5, 500, 1), Ok(())); + assert_eq!(Council::present_winner(Origin::signed(1), 1, 100 + Council::get_offset(100, 1), 1), Ok(())); + assert_eq!(Council::leaderboard(), Some(vec![(0, 0), (100 + 96, 1), (500, 5), (600, 6)])); + assert_ok!(Council::end_block(System::block_number())); + + assert_eq!(Council::active_council(), vec![(6, 19), (5, 19)]); + assert_eq!( + Council::voter_info(6).unwrap(), + VoterInfo { last_win: 2, last_active: 1, stake: 600, pot:0 } + ); + assert_eq!(Council::voter_info(5).unwrap(), VoterInfo { last_win: 2, last_active: 1, stake: 500, pot:0 }); + assert_eq!(Council::voter_info(1).unwrap(), VoterInfo { last_win: 0, last_active: 0, stake: 100, pot:0 }); + + System::set_block_number(20); + assert_ok!(Council::retract_voter(Origin::signed(6), 0)); + assert_ok!(Council::retract_voter(Origin::signed(5), 1)); + assert_ok!(Council::submit_candidacy(Origin::signed(6), 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(5), 1)); + assert_ok!(Council::set_approvals(Origin::signed(6), vec![true, false, false], 2, 0)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, true, false], 2, 1)); + assert_ok!(Council::end_block(System::block_number())); + + System::set_block_number(22); + assert!(Council::presentation_active()); + assert_eq!(Council::present_winner(Origin::signed(6), 6, 600, 2), Ok(())); + assert_eq!(Council::present_winner(Origin::signed(5), 5, 500, 2), Ok(())); + assert_eq!(Council::present_winner(Origin::signed(1), 1, 100 + Council::get_offset(100, 2), 2), Ok(())); + assert_eq!(Council::leaderboard(), Some(vec![(0, 0), (100 + 96 + 93, 1), (500, 5), (600, 6)])); + assert_ok!(Council::end_block(System::block_number())); + + assert_eq!(Council::active_council(), vec![(6, 27), (5, 27)]); + assert_eq!( + Council::voter_info(6).unwrap(), + VoterInfo { last_win: 3, last_active: 2, stake: 600, pot: 0} + ); + assert_eq!(Council::voter_info(5).unwrap(), VoterInfo { last_win: 3, last_active: 2, stake: 500, pot: 0}); + assert_eq!(Council::voter_info(1).unwrap(), VoterInfo { last_win: 0, last_active: 0, stake: 100, pot: 0}); + + + System::set_block_number(28); + assert_ok!(Council::retract_voter(Origin::signed(6), 0)); + assert_ok!(Council::retract_voter(Origin::signed(5), 1)); + assert_ok!(Council::submit_candidacy(Origin::signed(6), 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(5), 1)); + assert_ok!(Council::set_approvals(Origin::signed(6), vec![true, false, false], 3, 0)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, true, false], 3, 1)); + assert_ok!(Council::end_block(System::block_number())); + + System::set_block_number(30); + assert!(Council::presentation_active()); + assert_eq!(Council::present_winner(Origin::signed(6), 6, 600, 3), Ok(())); + assert_eq!(Council::present_winner(Origin::signed(5), 5, 500, 3), Ok(())); + assert_eq!(Council::present_winner(Origin::signed(1), 1, 100 + Council::get_offset(100, 3), 3), Ok(())); + assert_eq!(Council::leaderboard(), Some(vec![(0, 0), (100 + 96 + 93 + 90, 1), (500, 5), (600, 6)])); + assert_ok!(Council::end_block(System::block_number())); + + assert_eq!(Council::active_council(), vec![(6, 35), (5, 35)]); + assert_eq!( + Council::voter_info(6).unwrap(), + VoterInfo { last_win: 4, last_active: 3, stake: 600, pot: 0} + ); + assert_eq!(Council::voter_info(5).unwrap(), VoterInfo { last_win: 4, last_active: 3, stake: 500, pot: 0}); + assert_eq!(Council::voter_info(1).unwrap(), VoterInfo { last_win: 0, last_active: 0, stake: 100, pot: 0}); + }) + } + + #[test] + fn winning_resets_accumulated_pot() { + with_externalities(&mut ExtBuilder::default().balance_factor(10).build(), || { + System::set_block_number(4); + assert!(!Council::presentation_active()); + + assert_ok!(Council::submit_candidacy(Origin::signed(6), 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(4), 1)); + assert_ok!(Council::submit_candidacy(Origin::signed(3), 2)); + assert_ok!(Council::submit_candidacy(Origin::signed(2), 3)); + + assert_ok!(Council::set_approvals(Origin::signed(6), vec![true, false, false, false], 0, 0)); + assert_ok!(Council::set_approvals(Origin::signed(4), vec![false, true, false, false], 0, 1)); + assert_ok!(Council::set_approvals(Origin::signed(3), vec![false, false, true, true], 0, 2)); + assert_ok!(Council::end_block(System::block_number())); + + System::set_block_number(6); + assert!(Council::presentation_active()); + assert_eq!(Council::present_winner(Origin::signed(6), 6, 600, 0), Ok(())); + assert_eq!(Council::present_winner(Origin::signed(4), 4, 400, 0), Ok(())); + assert_eq!(Council::present_winner(Origin::signed(3), 3, 300, 0), Ok(())); + assert_eq!(Council::present_winner(Origin::signed(2), 2, 300, 0), Ok(())); + assert_eq!(Council::leaderboard(), Some(vec![(300, 2), (300, 3), (400, 4), (600, 6)])); + assert_ok!(Council::end_block(System::block_number())); + + assert_eq!(Council::active_council(), vec![(6, 11), (4, 11)]); + + System::set_block_number(12); + assert_ok!(Council::retract_voter(Origin::signed(6), 0)); + assert_ok!(Council::retract_voter(Origin::signed(4), 1)); + assert_ok!(Council::submit_candidacy(Origin::signed(6), 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(4), 1)); + assert_ok!(Council::set_approvals(Origin::signed(6), vec![true, false, false, false], 1, 0)); + assert_ok!(Council::set_approvals(Origin::signed(4), vec![false, true, false, false], 1, 1)); + assert_ok!(Council::end_block(System::block_number())); + + System::set_block_number(14); + assert!(Council::presentation_active()); + assert_eq!(Council::present_winner(Origin::signed(6), 6, 600, 1), Ok(())); + assert_eq!(Council::present_winner(Origin::signed(4), 4, 400, 1), Ok(())); + assert_eq!(Council::present_winner(Origin::signed(3), 3, 300 + Council::get_offset(300, 1), 1), Ok(())); + assert_eq!(Council::present_winner(Origin::signed(2), 2, 300 + Council::get_offset(300, 1), 1), Ok(())); + assert_eq!(Council::leaderboard(), Some(vec![(400, 4), (588, 2), (588, 3), (600, 6)])); + assert_ok!(Council::end_block(System::block_number())); + + assert_eq!(Council::active_council(), vec![(6, 19), (3, 19)]); + + System::set_block_number(20); + assert_ok!(Council::end_block(System::block_number())); + + System::set_block_number(22); + // 2 will not get re-elected with 300 + 288, instead just 300. + // because one of 3's candidates (3) won in previous round + // 4 on the other hand will get extra weight since it was unlucky. + assert_eq!(Council::present_winner(Origin::signed(3), 2, 300, 2), Ok(())); + assert_eq!(Council::present_winner(Origin::signed(4), 4, 400 + Council::get_offset(400, 1), 2), Ok(())); + assert_ok!(Council::end_block(System::block_number())); + + assert_eq!(Council::active_council(), vec![(4, 27), (2, 27)]); + }) + } + + #[test] + fn resubmitting_approvals_stores_pot() { + with_externalities(&mut ExtBuilder::default() + .voter_bond(0) + .voting_fee(0) + .balance_factor(10) + .build(), + || { System::set_block_number(4); + assert!(!Council::presentation_active()); + + assert_ok!(Council::submit_candidacy(Origin::signed(6), 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(5), 1)); + assert_ok!(Council::submit_candidacy(Origin::signed(1), 2)); + + assert_ok!(Council::set_approvals(Origin::signed(6), vec![true, false, false], 0, 0)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, true, false], 0, 1)); + assert_ok!(Council::set_approvals(Origin::signed(1), vec![false, false, true], 0, 2)); + + assert_ok!(Council::end_block(System::block_number())); + + System::set_block_number(6); + assert!(Council::presentation_active()); + + assert_eq!(Council::present_winner(Origin::signed(6), 6, 600, 0), Ok(())); + assert_eq!(Council::present_winner(Origin::signed(5), 5, 500, 0), Ok(())); + assert_eq!(Council::present_winner(Origin::signed(1), 1, 100, 0), Ok(())); + assert_eq!(Council::leaderboard(), Some(vec![(0, 0), (100, 1), (500, 5), (600, 6)])); + assert_ok!(Council::end_block(System::block_number())); + + assert_eq!(Council::active_council(), vec![(6, 11), (5, 11)]); + + System::set_block_number(12); + assert_ok!(Council::retract_voter(Origin::signed(6), 0)); + assert_ok!(Council::retract_voter(Origin::signed(5), 1)); + assert_ok!(Council::submit_candidacy(Origin::signed(6), 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(5), 1)); + assert_ok!(Council::set_approvals(Origin::signed(6), vec![true, false, false], 1, 0)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, true, false], 1, 1)); + // give 1 some new high balance + let _ = Balances::make_free_balance_be(&1, 997); + assert_ok!(Council::set_approvals(Origin::signed(1), vec![false, false, true], 1, 2)); + assert_eq!(Council::voter_info(1).unwrap(), + VoterInfo { + stake: 1000, // 997 + 3 which is candidacy bond. + pot: Council::get_offset(100, 1), + last_active: 1, + last_win: 1, + } + ); + assert_ok!(Council::end_block(System::block_number())); + + assert_eq!(Council::active_council(), vec![(6, 11), (5, 11)]); + + System::set_block_number(14); + assert!(Council::presentation_active()); + assert_eq!(Council::present_winner(Origin::signed(6), 6, 600, 1), Ok(())); + assert_eq!(Council::present_winner(Origin::signed(5), 5, 500, 1), Ok(())); + assert_eq!(Council::present_winner(Origin::signed(1), 1, 1000 + 96 /* pot */, 1), Ok(())); + assert_eq!(Council::leaderboard(), Some(vec![(0, 0), (500, 5), (600, 6), (1096, 1)])); + assert_ok!(Council::end_block(System::block_number())); + + assert_eq!(Council::active_council(), vec![(1, 19), (6, 19)]); + }) + } + + #[test] + fn get_offset_should_work() { + with_externalities(&mut ExtBuilder::default().build(), || { + assert_eq!(Council::get_offset(100, 0), 0); + assert_eq!(Council::get_offset(100, 1), 96); + assert_eq!(Council::get_offset(100, 2), 96 + 93); + assert_eq!(Council::get_offset(100, 3), 96 + 93 + 90); + assert_eq!(Council::get_offset(100, 4), 96 + 93 + 90 + 87); + // limit + assert_eq!(Council::get_offset(100, 1000), 100 * 24); + + assert_eq!(Council::get_offset(50_000_000_000, 0), 0); + assert_eq!(Council::get_offset(50_000_000_000, 1), 48_000_000_000); + assert_eq!(Council::get_offset(50_000_000_000, 2), 48_000_000_000 + 46_080_000_000); + assert_eq!(Council::get_offset(50_000_000_000, 3), 48_000_000_000 + 46_080_000_000 + 44_236_800_000); + assert_eq!( + Council::get_offset(50_000_000_000, 4), + 48_000_000_000 + 46_080_000_000 + 44_236_800_000 + 42_467_328_000 + ); + // limit + assert_eq!(Council::get_offset(50_000_000_000, 1000), 50_000_000_000 * 24); + }) + } + + #[test] + fn get_offset_with_zero_decay() { + with_externalities(&mut ExtBuilder::default().decay_ratio(0).build(), || { + assert_eq!(Council::get_offset(100, 0), 0); + assert_eq!(Council::get_offset(100, 1), 0); + assert_eq!(Council::get_offset(100, 2), 0); + assert_eq!(Council::get_offset(100, 3), 0); + // limit + assert_eq!(Council::get_offset(100, 1000), 0); + }) + } + #[test] fn voting_should_work() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(1); assert_ok!(Council::submit_candidacy(Origin::signed(5), 0)); - assert_ok!(Council::set_approvals(Origin::signed(1), vec![true], 0)); - assert_ok!(Council::set_approvals(Origin::signed(4), vec![true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(1), vec![true], 0, 0)); + assert_ok!(Council::set_approvals(Origin::signed(4), vec![true], 0, 1)); - assert_eq!(Council::approvals_of(1), vec![true]); - assert_eq!(Council::approvals_of(4), vec![true]); - assert_eq!(Council::voters(), vec![1, 4]); + assert_eq!(Council::all_approvals_of(&1), vec![true]); + assert_eq!(Council::all_approvals_of(&4), vec![true]); + assert_eq!(voter_ids(), vec![1, 4]); assert_ok!(Council::submit_candidacy(Origin::signed(2), 1)); assert_ok!(Council::submit_candidacy(Origin::signed(3), 2)); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![false, true, true], 0)); - assert_ok!(Council::set_approvals(Origin::signed(3), vec![false, true, true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![false, true, true], 0, 2)); + assert_ok!(Council::set_approvals(Origin::signed(3), vec![false, true, true], 0, 3)); - assert_eq!(Council::approvals_of(1), vec![true]); - assert_eq!(Council::approvals_of(4), vec![true]); - assert_eq!(Council::approvals_of(2), vec![false, true, true]); - assert_eq!(Council::approvals_of(3), vec![false, true, true]); + assert_eq!(Council::all_approvals_of(&1), vec![true]); + assert_eq!(Council::all_approvals_of(&4), vec![true]); + assert_eq!(Council::all_approvals_of(&2), vec![false, true, true]); + assert_eq!(Council::all_approvals_of(&3), vec![false, true, true]); - assert_eq!(Council::voters(), vec![1, 4, 2, 3]); + assert_eq!(voter_ids(), vec![1, 4, 2, 3]); }); } #[test] fn proxy_voting_should_work() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(1); assert_ok!(Council::submit_candidacy(Origin::signed(5), 0)); @@ -762,74 +1806,79 @@ mod tests { Democracy::force_proxy(2, 12); Democracy::force_proxy(3, 13); Democracy::force_proxy(4, 14); + assert_ok!(Council::proxy_set_approvals(Origin::signed(11), vec![true], 0, 0)); + assert_ok!(Council::proxy_set_approvals(Origin::signed(14), vec![true], 0, 1)); - assert_ok!(Council::proxy_set_approvals(Origin::signed(11), vec![true], 0)); - assert_ok!(Council::proxy_set_approvals(Origin::signed(14), vec![true], 0)); - - assert_eq!(Council::approvals_of(1), vec![true]); - assert_eq!(Council::approvals_of(4), vec![true]); - assert_eq!(Council::voters(), vec![1, 4]); + assert_eq!(Council::all_approvals_of(&1), vec![true]); + assert_eq!(Council::all_approvals_of(&4), vec![true]); + assert_eq!(voter_ids(), vec![1, 4]); assert_ok!(Council::submit_candidacy(Origin::signed(2), 1)); assert_ok!(Council::submit_candidacy(Origin::signed(3), 2)); - assert_ok!(Council::proxy_set_approvals(Origin::signed(12), vec![false, true, true], 0)); - assert_ok!(Council::proxy_set_approvals(Origin::signed(13), vec![false, true, true], 0)); + assert_ok!(Council::proxy_set_approvals(Origin::signed(12), vec![false, true, true], 0, 2)); + assert_ok!(Council::proxy_set_approvals(Origin::signed(13), vec![false, true, true], 0, 3)); - assert_eq!(Council::approvals_of(1), vec![true]); - assert_eq!(Council::approvals_of(4), vec![true]); - assert_eq!(Council::approvals_of(2), vec![false, true, true]); - assert_eq!(Council::approvals_of(3), vec![false, true, true]); + assert_eq!(Council::all_approvals_of(&1), vec![true]); + assert_eq!(Council::all_approvals_of(&4), vec![true]); + assert_eq!(Council::all_approvals_of(&2), vec![false, true, true]); + assert_eq!(Council::all_approvals_of(&3), vec![false, true, true]); - assert_eq!(Council::voters(), vec![1, 4, 2, 3]); + assert_eq!(voter_ids(), vec![1, 4, 2, 3]); }); } #[test] fn setting_any_approval_vote_count_without_any_candidate_count_should_not_work() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(1); assert_eq!(Council::candidates().len(), 0); - assert_noop!(Council::set_approvals(Origin::signed(4), vec![], 0), "amount of candidates to receive approval votes should be non-zero"); + assert_noop!( + Council::set_approvals(Origin::signed(4), vec![], 0, 0), + "amount of candidates to receive approval votes should be non-zero" + ); }); } #[test] fn setting_an_approval_vote_count_more_than_candidate_count_should_not_work() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(1); assert_ok!(Council::submit_candidacy(Origin::signed(5), 0)); assert_eq!(Council::candidates().len(), 1); - assert_noop!(Council::set_approvals(Origin::signed(4), vec![true, true], 0), "amount of candidate approval votes cannot exceed amount of candidates"); + assert_noop!( + Council::set_approvals(Origin::signed(4),vec![true, true], 0, 0), + "amount of candidate votes cannot exceed amount of candidates" + ); }); } #[test] fn resubmitting_voting_should_work() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(1); assert_ok!(Council::submit_candidacy(Origin::signed(5), 0)); - assert_ok!(Council::set_approvals(Origin::signed(4), vec![true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(4), vec![true], 0, 0)); - assert_eq!(Council::approvals_of(4), vec![true]); + assert_eq!(Council::all_approvals_of(&4), vec![true]); assert_ok!(Council::submit_candidacy(Origin::signed(2), 1)); assert_ok!(Council::submit_candidacy(Origin::signed(3), 2)); assert_eq!(Council::candidates().len(), 3); - assert_ok!(Council::set_approvals(Origin::signed(4), vec![true, false, true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(4), vec![true, false, true], 0, 0)); - assert_eq!(Council::approvals_of(4), vec![true, false, true]); + assert_eq!(Council::all_approvals_of(&4), vec![true, false, true]); }); } #[test] fn retracting_voter_should_work() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(1); assert_ok!(Council::submit_candidacy(Origin::signed(5), 0)); @@ -837,88 +1886,108 @@ mod tests { assert_ok!(Council::submit_candidacy(Origin::signed(3), 2)); assert_eq!(Council::candidates().len(), 3); - assert_ok!(Council::set_approvals(Origin::signed(1), vec![true], 0)); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![false, true, true], 0)); - assert_ok!(Council::set_approvals(Origin::signed(3), vec![false, true, true], 0)); - assert_ok!(Council::set_approvals(Origin::signed(4), vec![true, false, true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(1), vec![true], 0, 0)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![false, true, true], 0, 1)); + assert_ok!(Council::set_approvals(Origin::signed(3), vec![false, true, true], 0, 2)); + assert_ok!(Council::set_approvals(Origin::signed(4), vec![true, false, true], 0, 3)); - assert_eq!(Council::voters(), vec![1, 2, 3, 4]); - assert_eq!(Council::approvals_of(1), vec![true]); - assert_eq!(Council::approvals_of(2), vec![false, true, true]); - assert_eq!(Council::approvals_of(3), vec![false, true, true]); - assert_eq!(Council::approvals_of(4), vec![true, false, true]); + assert_eq!(voter_ids(), vec![1, 2, 3, 4]); + assert_eq!(Council::all_approvals_of(&1), vec![true]); + assert_eq!(Council::all_approvals_of(&2), vec![false, true, true]); + assert_eq!(Council::all_approvals_of(&3), vec![false, true, true]); + assert_eq!(Council::all_approvals_of(&4), vec![true, false, true]); assert_ok!(Council::retract_voter(Origin::signed(1), 0)); - assert_eq!(Council::voters(), vec![4, 2, 3]); - assert_eq!(Council::approvals_of(1), Vec::::new()); - assert_eq!(Council::approvals_of(2), vec![false, true, true]); - assert_eq!(Council::approvals_of(3), vec![false, true, true]); - assert_eq!(Council::approvals_of(4), vec![true, false, true]); + assert_eq!(voter_ids(), vec![0, 2, 3, 4]); + assert_eq!(Council::all_approvals_of(&1), Vec::::new()); + assert_eq!(Council::all_approvals_of(&2), vec![false, true, true]); + assert_eq!(Council::all_approvals_of(&3), vec![false, true, true]); + assert_eq!(Council::all_approvals_of(&4), vec![true, false, true]); assert_ok!(Council::retract_voter(Origin::signed(2), 1)); - assert_eq!(Council::voters(), vec![4, 3]); - assert_eq!(Council::approvals_of(1), Vec::::new()); - assert_eq!(Council::approvals_of(2), Vec::::new()); - assert_eq!(Council::approvals_of(3), vec![false, true, true]); - assert_eq!(Council::approvals_of(4), vec![true, false, true]); + assert_eq!(voter_ids(), vec![0, 0, 3, 4]); + assert_eq!(Council::all_approvals_of(&1), Vec::::new()); + assert_eq!(Council::all_approvals_of(&2), Vec::::new()); + assert_eq!(Council::all_approvals_of(&3), vec![false, true, true]); + assert_eq!(Council::all_approvals_of(&4), vec![true, false, true]); - assert_ok!(Council::retract_voter(Origin::signed(3), 1)); + assert_ok!(Council::retract_voter(Origin::signed(3), 2)); - assert_eq!(Council::voters(), vec![4]); - assert_eq!(Council::approvals_of(1), Vec::::new()); - assert_eq!(Council::approvals_of(2), Vec::::new()); - assert_eq!(Council::approvals_of(3), Vec::::new()); - assert_eq!(Council::approvals_of(4), vec![true, false, true]); + assert_eq!(voter_ids(), vec![0, 0, 0, 4]); + assert_eq!(Council::all_approvals_of(&1), Vec::::new()); + assert_eq!(Council::all_approvals_of(&2), Vec::::new()); + assert_eq!(Council::all_approvals_of(&3), Vec::::new()); + assert_eq!(Council::all_approvals_of(&4), vec![true, false, true]); }); } #[test] fn invalid_retraction_index_should_not_work() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(1); assert_ok!(Council::submit_candidacy(Origin::signed(3), 0)); - assert_ok!(Council::set_approvals(Origin::signed(1), vec![true], 0)); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 0)); - assert_eq!(Council::voters(), vec![1, 2]); + assert_ok!(Council::set_approvals(Origin::signed(1), vec![true], 0, 0)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 0, 0)); + assert_eq!(voter_ids(), vec![1, 2]); assert_noop!(Council::retract_voter(Origin::signed(1), 1), "retraction index mismatch"); }); } #[test] fn overflow_retraction_index_should_not_work() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(1); assert_ok!(Council::submit_candidacy(Origin::signed(3), 0)); - assert_ok!(Council::set_approvals(Origin::signed(1), vec![true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(1), vec![true], 0, 0)); assert_noop!(Council::retract_voter(Origin::signed(1), 1), "retraction index invalid"); }); } #[test] fn non_voter_retraction_should_not_work() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(1); assert_ok!(Council::submit_candidacy(Origin::signed(3), 0)); - assert_ok!(Council::set_approvals(Origin::signed(1), vec![true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(1), vec![true], 0, 0)); assert_noop!(Council::retract_voter(Origin::signed(2), 0), "cannot retract non-voter"); }); } + #[test] + fn approval_storage_should_work() { + with_externalities(&mut ExtBuilder::default().build(), || { + assert_ok!(Council::submit_candidacy(Origin::signed(2), 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(3), 1)); + + assert_ok!(Council::set_approvals(Origin::signed(2), vec![true, false], 0, 0)); + assert_ok!(Council::set_approvals(Origin::signed(3), vec![false, false], 0, 0)); + assert_ok!(Council::set_approvals(Origin::signed(4), vec![], 0, 0)); + + assert_eq!(Council::all_approvals_of(&2), vec![true]); + // NOTE: these two are stored in mem differently though. + assert_eq!(Council::all_approvals_of(&3), vec![]); + assert_eq!(Council::all_approvals_of(&4), vec![]); + + assert_eq!(Council::approvals_of((3, 0)), vec![0]); + assert_eq!(Council::approvals_of((4, 0)), vec![]); + }); + } + #[test] fn simple_tally_should_work() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(4); assert!(!Council::presentation_active()); assert_ok!(Council::submit_candidacy(Origin::signed(2), 0)); assert_ok!(Council::submit_candidacy(Origin::signed(5), 1)); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![true, false], 0)); - assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, true], 0)); - assert_eq!(Council::voters(), vec![2, 5]); - assert_eq!(Council::approvals_of(2), vec![true, false]); - assert_eq!(Council::approvals_of(5), vec![false, true]); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 0, 0)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, true], 0, 0)); + assert_eq!(voter_ids(), vec![2, 5]); + assert_eq!(Council::all_approvals_of(&2), vec![true]); + assert_eq!(Council::all_approvals_of(&5), vec![false, true]); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(6); @@ -935,34 +2004,71 @@ mod tests { assert!(!Council::is_a_candidate(&2)); assert!(!Council::is_a_candidate(&5)); assert_eq!(Council::vote_index(), 1); - assert_eq!(Council::voter_last_active(2), Some(0)); - assert_eq!(Council::voter_last_active(5), Some(0)); + assert_eq!(Council::voter_info(2), Some(VoterInfo { last_win: 1, last_active: 0, stake: 20, pot: 0 })); + assert_eq!(Council::voter_info(5), Some(VoterInfo { last_win: 1, last_active: 0, stake: 50, pot: 0 })); + }); + } + + #[test] + fn seats_should_be_released() { + with_externalities(&mut ExtBuilder::default().build(), || { + System::set_block_number(4); + assert_ok!(Council::submit_candidacy(Origin::signed(2), 0)); + assert_ok!(Council::submit_candidacy(Origin::signed(5), 1)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![true, false], 0, 0)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, true], 0, 0)); + assert_ok!(Council::end_block(System::block_number())); + + System::set_block_number(6); + assert!(Council::presentation_active()); + assert_eq!(Council::present_winner(Origin::signed(4), 2, 20, 0), Ok(())); + assert_eq!(Council::present_winner(Origin::signed(4), 5, 50, 0), Ok(())); + assert_eq!(Council::leaderboard(), Some(vec![(0, 0), (0, 0), (20, 2), (50, 5)])); + assert_ok!(Council::end_block(System::block_number())); + + assert_eq!(Council::active_council(), vec![(5, 11), (2, 11)]); + let mut current = System::block_number(); + let free_block; + loop { + current += 1; + System::set_block_number(current); + assert_ok!(Council::end_block(System::block_number())); + if Council::active_council().len() == 0 { + free_block = current; + break; + } + } + // 11 + 2 which is the next voting period. + assert_eq!(free_block, 14); }); } #[test] fn presentations_with_zero_staked_deposit_should_not_work() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(4); assert_ok!(Council::submit_candidacy(Origin::signed(2), 0)); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 0, 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(6); - assert_noop!(Council::present_winner(Origin::signed(4), 2, 0, 0), "stake deposited to present winner and be added to leaderboard should be non-zero"); + assert_noop!( + Council::present_winner(Origin::signed(4), 2, 0, 0), + "stake deposited to present winner and be added to leaderboard should be non-zero" + ); }); } #[test] fn double_presentations_should_be_punished() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { assert!(Balances::can_slash(&4, 10)); System::set_block_number(4); assert_ok!(Council::submit_candidacy(Origin::signed(2), 0)); assert_ok!(Council::submit_candidacy(Origin::signed(5), 1)); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![true, false], 0)); - assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![true, false], 0, 0)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, true], 0, 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(6); @@ -978,10 +2084,10 @@ mod tests { #[test] fn retracting_inactive_voter_should_work() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(4); assert_ok!(Council::submit_candidacy(Origin::signed(2), 0)); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 0, 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(6); @@ -990,7 +2096,7 @@ mod tests { System::set_block_number(8); assert_ok!(Council::submit_candidacy(Origin::signed(5), 0)); - assert_ok!(Council::set_approvals(Origin::signed(5), vec![true], 1)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![true], 1, 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(10); @@ -998,24 +2104,24 @@ mod tests { assert_ok!(Council::end_block(System::block_number())); assert_ok!(Council::reap_inactive_voter(Origin::signed(5), - (Council::voters().iter().position(|&i| i == 5).unwrap() as u32).into(), - 2, (Council::voters().iter().position(|&i| i == 2).unwrap() as u32).into(), + (voter_ids().iter().position(|&i| i == 5).unwrap() as u32).into(), + 2, (voter_ids().iter().position(|&i| i == 2).unwrap() as u32).into(), 2 )); - assert_eq!(Council::voters(), vec![5]); - assert_eq!(Council::approvals_of(2).len(), 0); - assert_eq!(Balances::total_balance(&2), 17); - assert_eq!(Balances::total_balance(&5), 53); + assert_eq!(voter_ids(), vec![0, 5]); + assert_eq!(Council::all_approvals_of(&2).len(), 0); + assert_eq!(Balances::total_balance(&2), 20); + assert_eq!(Balances::total_balance(&5), 50); }); } #[test] fn presenting_for_double_election_should_not_work() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(4); assert_eq!(Council::submit_candidacy(Origin::signed(2), 0), Ok(())); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 0, 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(6); @@ -1023,21 +2129,26 @@ mod tests { assert_ok!(Council::end_block(System::block_number())); System::set_block_number(8); + // NOTE: This is now mandatory to disable the lock + assert_ok!(Council::retract_voter(Origin::signed(2), 0)); assert_eq!(Council::submit_candidacy(Origin::signed(2), 0), Ok(())); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 1)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 1, 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(10); - assert_noop!(Council::present_winner(Origin::signed(4), 2, 20, 1), "candidate must not form a duplicated member if elected"); + assert_noop!( + Council::present_winner(Origin::signed(4), 2, 20, 1), + "candidate must not form a duplicated member if elected" + ); }); } #[test] fn retracting_inactive_voter_with_other_candidates_in_slots_should_work() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().voter_bond(2).build(), || { System::set_block_number(4); assert_ok!(Council::submit_candidacy(Origin::signed(2), 0)); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 0, 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(6); @@ -1046,7 +2157,7 @@ mod tests { System::set_block_number(8); assert_ok!(Council::submit_candidacy(Origin::signed(5), 0)); - assert_ok!(Council::set_approvals(Origin::signed(5), vec![true], 1)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![true], 1, 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(10); @@ -1057,24 +2168,24 @@ mod tests { assert_ok!(Council::submit_candidacy(Origin::signed(1), 0)); assert_ok!(Council::reap_inactive_voter(Origin::signed(5), - (Council::voters().iter().position(|&i| i == 5).unwrap() as u32).into(), - 2, (Council::voters().iter().position(|&i| i == 2).unwrap() as u32).into(), + (voter_ids().iter().position(|&i| i == 5).unwrap() as u32).into(), + 2, (voter_ids().iter().position(|&i| i == 2).unwrap() as u32).into(), 2 )); - assert_eq!(Council::voters(), vec![5]); - assert_eq!(Council::approvals_of(2).len(), 0); - assert_eq!(Balances::total_balance(&2), 17); - assert_eq!(Balances::total_balance(&5), 53); + assert_eq!(voter_ids(), vec![0, 5]); + assert_eq!(Council::all_approvals_of(&2).len(), 0); + assert_eq!(Balances::total_balance(&2), 18); + assert_eq!(Balances::total_balance(&5), 52); }); } #[test] fn retracting_inactive_voter_with_bad_reporter_index_should_not_work() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(4); assert_ok!(Council::submit_candidacy(Origin::signed(2), 0)); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 0, 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(6); @@ -1083,7 +2194,7 @@ mod tests { System::set_block_number(8); assert_ok!(Council::submit_candidacy(Origin::signed(5), 0)); - assert_ok!(Council::set_approvals(Origin::signed(5), vec![true], 1)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![true], 1, 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(10); @@ -1092,18 +2203,18 @@ mod tests { assert_noop!(Council::reap_inactive_voter(Origin::signed(2), 42, - 2, (Council::voters().iter().position(|&i| i == 2).unwrap() as u32).into(), + 2, (voter_ids().iter().position(|&i| i == 2).unwrap() as u32).into(), 2 - ), "bad reporter index"); + ), "invalid reporter index"); }); } #[test] fn retracting_inactive_voter_with_bad_target_index_should_not_work() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(4); assert_ok!(Council::submit_candidacy(Origin::signed(2), 0)); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 0, 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(6); @@ -1112,7 +2223,7 @@ mod tests { System::set_block_number(8); assert_ok!(Council::submit_candidacy(Origin::signed(5), 0)); - assert_ok!(Council::set_approvals(Origin::signed(5), vec![true], 1)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![true], 1, 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(10); @@ -1120,25 +2231,25 @@ mod tests { assert_ok!(Council::end_block(System::block_number())); assert_noop!(Council::reap_inactive_voter(Origin::signed(2), - (Council::voters().iter().position(|&i| i == 2).unwrap() as u32).into(), + (voter_ids().iter().position(|&i| i == 2).unwrap() as u32).into(), 2, 42, 2 - ), "bad target index"); + ), "invalid target index"); }); } #[test] fn attempting_to_retract_active_voter_should_slash_reporter() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(4); assert_ok!(Council::submit_candidacy(Origin::signed(2), 0)); assert_ok!(Council::submit_candidacy(Origin::signed(3), 1)); assert_ok!(Council::submit_candidacy(Origin::signed(4), 2)); assert_ok!(Council::submit_candidacy(Origin::signed(5), 3)); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![true, false, false, false], 0)); - assert_ok!(Council::set_approvals(Origin::signed(3), vec![false, true, false, false], 0)); - assert_ok!(Council::set_approvals(Origin::signed(4), vec![false, false, true, false], 0)); - assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, false, false, true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![true, false, false, false], 0, 0)); + assert_ok!(Council::set_approvals(Origin::signed(3), vec![false, true, false, false], 0, 0)); + assert_ok!(Council::set_approvals(Origin::signed(4), vec![false, false, true, false], 0, 0)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, false, false, true], 0, 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(6); @@ -1153,34 +2264,34 @@ mod tests { assert_ok!(Council::end_block(System::block_number())); System::set_block_number(10); - assert_ok!(Council::present_winner(Origin::signed(4), 2, 20, 1)); - assert_ok!(Council::present_winner(Origin::signed(4), 3, 30, 1)); + assert_ok!(Council::present_winner(Origin::signed(4), 2, 20 + Council::get_offset(20, 1), 1)); + assert_ok!(Council::present_winner(Origin::signed(4), 3, 30 + Council::get_offset(30, 1), 1)); assert_ok!(Council::end_block(System::block_number())); assert_eq!(Council::vote_index(), 2); assert_eq!(Council::inactivity_grace_period(), 1); assert_eq!(Council::voting_period(), 4); - assert_eq!(Council::voter_last_active(4), Some(0)); + assert_eq!(Council::voter_info(4), Some(VoterInfo { last_win: 1, last_active: 0, stake: 40, pot: 0 })); assert_ok!(Council::reap_inactive_voter(Origin::signed(4), - (Council::voters().iter().position(|&i| i == 4).unwrap() as u32).into(), + (voter_ids().iter().position(|&i| i == 4).unwrap() as u32).into(), 2, - (Council::voters().iter().position(|&i| i == 2).unwrap() as u32).into(), + (voter_ids().iter().position(|&i| i == 2).unwrap() as u32).into(), 2 )); - assert_eq!(Council::voters(), vec![2, 3, 5]); - assert_eq!(Council::approvals_of(4).len(), 0); - assert_eq!(Balances::total_balance(&4), 37); + assert_eq!(voter_ids(), vec![2, 3, 0, 5]); + assert_eq!(Council::all_approvals_of(&4).len(), 0); + assert_eq!(Balances::total_balance(&4), 40); }); } #[test] fn attempting_to_retract_inactive_voter_by_nonvoter_should_not_work() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(4); assert_ok!(Council::submit_candidacy(Origin::signed(2), 0)); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![true], 0, 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(6); @@ -1189,7 +2300,7 @@ mod tests { System::set_block_number(8); assert_ok!(Council::submit_candidacy(Origin::signed(5), 0)); - assert_ok!(Council::set_approvals(Origin::signed(5), vec![true], 1)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![true], 1, 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(10); @@ -1198,7 +2309,7 @@ mod tests { assert_noop!(Council::reap_inactive_voter(Origin::signed(4), 0, - 2, (Council::voters().iter().position(|&i| i == 2).unwrap() as u32).into(), + 2, (voter_ids().iter().position(|&i| i == 2).unwrap() as u32).into(), 2 ), "reporter must be a voter"); }); @@ -1206,18 +2317,18 @@ mod tests { #[test] fn presenting_loser_should_not_work() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(4); assert_ok!(Council::submit_candidacy(Origin::signed(1), 0)); - assert_ok!(Council::set_approvals(Origin::signed(6), vec![true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(6), vec![true], 0, 0)); assert_ok!(Council::submit_candidacy(Origin::signed(2), 1)); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![false, true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![false, true], 0, 0)); assert_ok!(Council::submit_candidacy(Origin::signed(3), 2)); - assert_ok!(Council::set_approvals(Origin::signed(3), vec![false, false, true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(3), vec![false, false, true], 0, 0)); assert_ok!(Council::submit_candidacy(Origin::signed(4), 3)); - assert_ok!(Council::set_approvals(Origin::signed(4), vec![false, false, false, true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(4), vec![false, false, false, true], 0, 0)); assert_ok!(Council::submit_candidacy(Origin::signed(5), 4)); - assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, false, false, false, true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, false, false, false, true], 0, 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(6); @@ -1239,18 +2350,18 @@ mod tests { #[test] fn presenting_loser_first_should_not_matter() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(4); assert_ok!(Council::submit_candidacy(Origin::signed(1), 0)); - assert_ok!(Council::set_approvals(Origin::signed(6), vec![true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(6), vec![true], 0, 0)); assert_ok!(Council::submit_candidacy(Origin::signed(2), 1)); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![false, true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![false, true], 0, 0)); assert_ok!(Council::submit_candidacy(Origin::signed(3), 2)); - assert_ok!(Council::set_approvals(Origin::signed(3), vec![false, false, true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(3), vec![false, false, true], 0, 0)); assert_ok!(Council::submit_candidacy(Origin::signed(4), 3)); - assert_ok!(Council::set_approvals(Origin::signed(4), vec![false, false, false, true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(4), vec![false, false, false, true], 0, 0)); assert_ok!(Council::submit_candidacy(Origin::signed(5), 4)); - assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, false, false, false, true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, false, false, false, true], 0, 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(6); @@ -1271,21 +2382,24 @@ mod tests { #[test] fn present_outside_of_presentation_period_should_not_work() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(4); assert!(!Council::presentation_active()); - assert_noop!(Council::present_winner(Origin::signed(5), 5, 1, 0), "cannot present outside of presentation period"); + assert_noop!( + Council::present_winner(Origin::signed(5), 5, 1, 0), + "cannot present outside of presentation period" + ); }); } #[test] fn present_with_invalid_vote_index_should_not_work() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(4); assert_ok!(Council::submit_candidacy(Origin::signed(2), 0)); assert_ok!(Council::submit_candidacy(Origin::signed(5), 1)); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![true, false], 0)); - assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![true, false], 0, 0)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, true], 0, 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(6); @@ -1295,34 +2409,50 @@ mod tests { #[test] fn present_when_presenter_is_poor_should_not_work() { - with_externalities(&mut new_test_ext(false), || { - System::set_block_number(4); - assert!(!Council::presentation_active()); - - assert_ok!(Council::submit_candidacy(Origin::signed(1), 0)); - assert_ok!(Council::submit_candidacy(Origin::signed(5), 1)); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![true, false], 0)); - assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, true], 0)); - assert_ok!(Council::end_block(System::block_number())); - - System::set_block_number(6); - assert_eq!(Balances::free_balance(&1), 1); - assert_eq!(Balances::reserved_balance(&1), 9); - assert_noop!(Council::present_winner(Origin::signed(1), 1, 20, 0), "presenter must have sufficient slashable funds"); - }); + let test_present = |p| { + with_externalities(&mut ExtBuilder::default() + .voting_fee(5) + .voter_bond(2) + .bad_presentation_punishment(p) + .build(), + || { + System::set_block_number(4); + let _ = Balances::make_free_balance_be(&1, 15); + assert!(!Council::presentation_active()); + + assert_ok!(Council::submit_candidacy(Origin::signed(1), 0)); // -3 + assert_eq!(Balances::free_balance(&1), 12); + assert_ok!(Council::set_approvals(Origin::signed(1), vec![true], 0, 0)); // -2 -5 + assert_ok!(Council::end_block(System::block_number())); + + System::set_block_number(6); + assert_eq!(Balances::free_balance(&1), 5); + assert_eq!(Balances::reserved_balance(&1), 5); + if p > 5 { + assert_noop!(Council::present_winner( + Origin::signed(1), 1, 10, 0), + "presenter must have sufficient slashable funds" + ); + } else { + assert_ok!(Council::present_winner(Origin::signed(1), 1, 10, 0)); + } + }); + }; + test_present(4); + test_present(6); } #[test] fn invalid_present_tally_should_slash() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(4); assert!(!Council::presentation_active()); assert_eq!(Balances::total_balance(&4), 40); assert_ok!(Council::submit_candidacy(Origin::signed(2), 0)); assert_ok!(Council::submit_candidacy(Origin::signed(5), 1)); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![true, false], 0)); - assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![true, false], 0, 0)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, true], 0, 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(6); @@ -1334,20 +2464,20 @@ mod tests { #[test] fn runners_up_should_be_kept() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(4); assert!(!Council::presentation_active()); assert_ok!(Council::submit_candidacy(Origin::signed(1), 0)); - assert_ok!(Council::set_approvals(Origin::signed(6), vec![true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(6), vec![true], 0, 0)); assert_ok!(Council::submit_candidacy(Origin::signed(2), 1)); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![false, true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![false, true], 0, 0)); assert_ok!(Council::submit_candidacy(Origin::signed(3), 2)); - assert_ok!(Council::set_approvals(Origin::signed(3), vec![false, false, true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(3), vec![false, false, true], 0, 0)); assert_ok!(Council::submit_candidacy(Origin::signed(4), 3)); - assert_ok!(Council::set_approvals(Origin::signed(4), vec![false, false, false, true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(4), vec![false, false, false, true], 0, 0)); assert_ok!(Council::submit_candidacy(Origin::signed(5), 4)); - assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, false, false, false, true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, false, false, false, true], 0, 0)); assert_ok!(Council::end_block(System::block_number())); @@ -1355,7 +2485,7 @@ mod tests { assert!(Council::presentation_active()); assert_ok!(Council::present_winner(Origin::signed(4), 1, 60, 0)); // leaderboard length is the empty seats plus the carry count (i.e. 5 + 2), where those - // to be carried are the lowest and stored in lowest indexes + // to be carried are the lowest and stored in lowest indices assert_eq!(Council::leaderboard(), Some(vec![ (0, 0), (0, 0), @@ -1383,11 +2513,11 @@ mod tests { assert!(Council::is_a_candidate(&3)); assert!(Council::is_a_candidate(&4)); assert_eq!(Council::vote_index(), 1); - assert_eq!(Council::voter_last_active(2), Some(0)); - assert_eq!(Council::voter_last_active(3), Some(0)); - assert_eq!(Council::voter_last_active(4), Some(0)); - assert_eq!(Council::voter_last_active(5), Some(0)); - assert_eq!(Council::voter_last_active(6), Some(0)); + assert_eq!(Council::voter_info(2), Some(VoterInfo { last_win: 0, last_active: 0, stake: 20, pot: 0 })); + assert_eq!(Council::voter_info(3), Some(VoterInfo { last_win: 0, last_active: 0, stake: 30, pot: 0 })); + assert_eq!(Council::voter_info(4), Some(VoterInfo { last_win: 0, last_active: 0, stake: 40, pot: 0 })); + assert_eq!(Council::voter_info(5), Some(VoterInfo { last_win: 1, last_active: 0, stake: 50, pot: 0 })); + assert_eq!(Council::voter_info(6), Some(VoterInfo { last_win: 1, last_active: 0, stake: 60, pot: 0 })); assert_eq!(Council::candidate_reg_info(3), Some((0, 2))); assert_eq!(Council::candidate_reg_info(4), Some((0, 3))); }); @@ -1395,18 +2525,18 @@ mod tests { #[test] fn second_tally_should_use_runners_up() { - with_externalities(&mut new_test_ext(false), || { + with_externalities(&mut ExtBuilder::default().build(), || { System::set_block_number(4); assert_ok!(Council::submit_candidacy(Origin::signed(1), 0)); - assert_ok!(Council::set_approvals(Origin::signed(6), vec![true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(6), vec![true], 0, 0)); assert_ok!(Council::submit_candidacy(Origin::signed(2), 1)); - assert_ok!(Council::set_approvals(Origin::signed(2), vec![false, true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(2), vec![false, true], 0, 0)); assert_ok!(Council::submit_candidacy(Origin::signed(3), 2)); - assert_ok!(Council::set_approvals(Origin::signed(3), vec![false, false, true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(3), vec![false, false, true], 0, 0)); assert_ok!(Council::submit_candidacy(Origin::signed(4), 3)); - assert_ok!(Council::set_approvals(Origin::signed(4), vec![false, false, false, true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(4), vec![false, false, false, true], 0, 0)); assert_ok!(Council::submit_candidacy(Origin::signed(5), 4)); - assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, false, false, false, true], 0)); + assert_ok!(Council::set_approvals(Origin::signed(5), vec![false, false, false, false, true], 0, 0)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(6); @@ -1417,13 +2547,13 @@ mod tests { assert_ok!(Council::end_block(System::block_number())); System::set_block_number(8); - assert_ok!(Council::set_approvals(Origin::signed(6), vec![false, false, true, false], 1)); + assert_ok!(Council::set_approvals(Origin::signed(6), vec![false, false, true, false], 1, 0)); assert_ok!(Council::set_desired_seats(3)); assert_ok!(Council::end_block(System::block_number())); System::set_block_number(10); - assert_ok!(Council::present_winner(Origin::signed(4), 3, 90, 1)); - assert_ok!(Council::present_winner(Origin::signed(4), 4, 40, 1)); + assert_ok!(Council::present_winner(Origin::signed(4), 3, 30 + Council::get_offset(30, 1) + 60, 1)); + assert_ok!(Council::present_winner(Origin::signed(4), 4, 40 + Council::get_offset(40, 1), 1)); assert_ok!(Council::end_block(System::block_number())); assert!(!Council::presentation_active()); @@ -1435,11 +2565,14 @@ mod tests { assert!(!Council::is_a_candidate(&5)); assert!(Council::is_a_candidate(&4)); assert_eq!(Council::vote_index(), 2); - assert_eq!(Council::voter_last_active(2), Some(0)); - assert_eq!(Council::voter_last_active(3), Some(0)); - assert_eq!(Council::voter_last_active(4), Some(0)); - assert_eq!(Council::voter_last_active(5), Some(0)); - assert_eq!(Council::voter_last_active(6), Some(1)); + assert_eq!(Council::voter_info(2), Some( VoterInfo { last_win: 0, last_active: 0, stake: 20, pot: 0})); + assert_eq!(Council::voter_info(3), Some( VoterInfo { last_win: 2, last_active: 0, stake: 30, pot: 0})); + assert_eq!(Council::voter_info(4), Some( VoterInfo { last_win: 0, last_active: 0, stake: 40, pot: 0})); + assert_eq!(Council::voter_info(5), Some( VoterInfo { last_win: 1, last_active: 0, stake: 50, pot: 0})); + assert_eq!( + Council::voter_info(6), + Some(VoterInfo { last_win: 2, last_active: 1, stake: 60, pot: 0}) + ); assert_eq!(Council::candidate_reg_info(4), Some((0, 3))); }); diff --git a/srml/council/src/voting.rs b/srml/council/src/voting.rs deleted file mode 100644 index 37c1444a74ee8c2f48e94fee5f94dfc20d7f6a4e..0000000000000000000000000000000000000000 --- a/srml/council/src/voting.rs +++ /dev/null @@ -1,494 +0,0 @@ -// Copyright 2017-2019 Parity Technologies (UK) Ltd. -// This file is part of Substrate. - -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - -//! Council voting system. - -use rstd::prelude::*; -use rstd::borrow::Borrow; -use primitives::traits::{Hash, As, Zero}; -use runtime_io::print; -use srml_support::dispatch::Result; -use srml_support::{StorageValue, StorageMap, IsSubType, decl_module, decl_storage, decl_event, ensure}; -use {system, democracy}; -use super::{Trait as CouncilTrait, Module as Council}; -use system::ensure_signed; - -pub trait Trait: CouncilTrait { - type Event: From> + Into<::Event>; -} - -decl_module! { - pub struct Module for enum Call where origin: T::Origin { - fn deposit_event() = default; - - fn propose(origin, proposal: Box) { - let who = ensure_signed(origin)?; - - let expiry = >::block_number() + Self::voting_period(); - ensure!(Self::will_still_be_councillor_at(&who, expiry), "proposer would not be on council"); - - let proposal_hash = T::Hashing::hash_of(&proposal); - - ensure!(!>::exists(proposal_hash), "duplicate proposals not allowed"); - ensure!(!Self::is_vetoed(&proposal_hash), "proposal is vetoed"); - - let mut proposals = Self::proposals(); - proposals.push((expiry, proposal_hash)); - proposals.sort_by_key(|&(expiry, _)| expiry); - Self::set_proposals(&proposals); - - >::insert(proposal_hash, *proposal); - >::insert(proposal_hash, vec![who.clone()]); - >::insert((proposal_hash, who.clone()), true); - } - - fn vote(origin, proposal: T::Hash, approve: bool) { - let who = ensure_signed(origin)?; - - ensure!(Self::is_councillor(&who), "only councillors may vote on council proposals"); - - if Self::vote_of((proposal, who.clone())).is_none() { - >::mutate(proposal, |voters| voters.push(who.clone())); - } - >::insert((proposal, who), approve); - } - - fn veto(origin, proposal_hash: T::Hash) { - let who = ensure_signed(origin)?; - - ensure!(Self::is_councillor(&who), "only councillors may veto council proposals"); - ensure!(>::exists(&proposal_hash), "proposal must exist to be vetoed"); - - let mut existing_vetoers = Self::veto_of(&proposal_hash) - .map(|pair| pair.1) - .unwrap_or_else(Vec::new); - let insert_position = existing_vetoers.binary_search(&who) - .err().ok_or("a councillor may not veto a proposal twice")?; - existing_vetoers.insert(insert_position, who); - Self::set_veto_of( - &proposal_hash, - >::block_number() + Self::cooloff_period(), - existing_vetoers - ); - - Self::set_proposals( - &Self::proposals().into_iter().filter(|&(_, h)| h != proposal_hash - ).collect::>()); - >::remove(proposal_hash); - >::remove(proposal_hash); - for (c, _) in >::active_council() { - >::remove((proposal_hash, c)); - } - } - - fn set_cooloff_period(#[compact] blocks: T::BlockNumber) { - >::put(blocks); - } - - fn set_voting_period(#[compact] blocks: T::BlockNumber) { - >::put(blocks); - } - - fn on_finalize(n: T::BlockNumber) { - if let Err(e) = Self::end_block(n) { - print("Guru meditation"); - print(e); - } - } - } -} - -decl_storage! { - trait Store for Module as CouncilVoting { - pub CooloffPeriod get(cooloff_period) config(): T::BlockNumber = T::BlockNumber::sa(1000); - pub VotingPeriod get(voting_period) config(): T::BlockNumber = T::BlockNumber::sa(3); - /// Number of blocks by which to delay enactment of successful, non-unanimous-council-instigated referendum proposals. - pub EnactDelayPeriod get(enact_delay_period) config(): T::BlockNumber = T::BlockNumber::sa(0); - pub Proposals get(proposals) build(|_| vec![]): Vec<(T::BlockNumber, T::Hash)>; // ordered by expiry. - pub ProposalOf get(proposal_of): map T::Hash => Option; - pub ProposalVoters get(proposal_voters): map T::Hash => Vec; - pub CouncilVoteOf get(vote_of): map (T::Hash, T::AccountId) => Option; - pub VetoedProposal get(veto_of): map T::Hash => Option<(T::BlockNumber, Vec)>; - } -} - -decl_event!( - pub enum Event where ::Hash { - /// A voting tally has happened for a referendum cancellation vote. - /// Last three are yes, no, abstain counts. - TallyCancelation(Hash, u32, u32, u32), - /// A voting tally has happened for a referendum vote. - /// Last three are yes, no, abstain counts. - TallyReferendum(Hash, u32, u32, u32), - } -); - -impl Module { - pub fn is_vetoed>(proposal: B) -> bool { - Self::veto_of(proposal.borrow()) - .map(|(expiry, _): (T::BlockNumber, Vec)| >::block_number() < expiry) - .unwrap_or(false) - } - - pub fn will_still_be_councillor_at(who: &T::AccountId, n: T::BlockNumber) -> bool { - >::active_council().iter() - .find(|&&(ref a, _)| a == who) - .map(|&(_, expires)| expires > n) - .unwrap_or(false) - } - - pub fn is_councillor(who: &T::AccountId) -> bool { - >::active_council().iter() - .any(|&(ref a, _)| a == who) - } - - pub fn tally(proposal_hash: &T::Hash) -> (u32, u32, u32) { - Self::generic_tally(proposal_hash, |w: &T::AccountId, p: &T::Hash| Self::vote_of((*p, w.clone()))) - } - - // Private - fn set_veto_of(proposal: &T::Hash, expiry: T::BlockNumber, vetoers: Vec) { - >::insert(proposal, (expiry, vetoers)); - } - - fn kill_veto_of(proposal: &T::Hash) { - >::remove(proposal); - } - - fn take_tally(proposal_hash: &T::Hash) -> (u32, u32, u32) { - Self::generic_tally(proposal_hash, |w: &T::AccountId, p: &T::Hash| >::take((*p, w.clone()))) - } - - fn generic_tally Option>(proposal_hash: &T::Hash, vote_of: F) -> (u32, u32, u32) { - let c = >::active_council(); - let (approve, reject) = c.iter() - .filter_map(|&(ref a, _)| vote_of(a, proposal_hash)) - .map(|approve| if approve { (1, 0) } else { (0, 1) }) - .fold((0, 0), |(a, b), (c, d)| (a + c, b + d)); - (approve, reject, c.len() as u32 - approve - reject) - } - - fn set_proposals(p: &Vec<(T::BlockNumber, T::Hash)>) { - >::put(p); - } - - fn take_proposal_if_expiring_at(n: T::BlockNumber) -> Option<(T::Proposal, T::Hash)> { - let proposals = Self::proposals(); - match proposals.first() { - Some(&(expiry, hash)) if expiry == n => { - // yes this is horrible, but fixing it will need substantial work in storage. - Self::set_proposals(&proposals[1..].to_vec()); - >::take(hash).map(|p| (p, hash)) /* defensive only: all queued proposal hashes must have associated proposals*/ - } - _ => None, - } - } - - fn end_block(now: T::BlockNumber) -> Result { - while let Some((proposal, proposal_hash)) = Self::take_proposal_if_expiring_at(now) { - let tally = Self::take_tally(&proposal_hash); - if let Some(&democracy::Call::cancel_referendum(ref_index)) = IsSubType::>::is_aux_sub_type(&proposal) { - Self::deposit_event(RawEvent::TallyCancelation(proposal_hash, tally.0, tally.1, tally.2)); - if let (_, 0, 0) = tally { - >::internal_cancel_referendum(ref_index.into()); - } - } else { - Self::deposit_event(RawEvent::TallyReferendum(proposal_hash.clone(), tally.0, tally.1, tally.2)); - if tally.0 > tally.1 + tally.2 { - Self::kill_veto_of(&proposal_hash); - // If there were no nay-votes from the council, then it's weakly uncontroversial; we enact immediately. - let period = match tally.1 { - 0 => Zero::zero(), - _ => Self::enact_delay_period(), - }; - // If all council members voted yes, then it's strongly uncontroversial; we require a negative - // super-majority at referendum in order to defeat it. - let threshold = match tally { - (_, 0, 0) => democracy::VoteThreshold::SuperMajorityAgainst, - _ => democracy::VoteThreshold::SimpleMajority, - }; - >::internal_start_referendum(proposal, threshold, period).map(|_| ())?; - } - } - } - Ok(()) - } -} - -#[cfg(test)] -mod tests { - use super::*; - use crate::tests::*; - use crate::tests::{Call, Origin}; - use srml_support::{Hashable, assert_ok, assert_noop}; - use democracy::{ReferendumInfo, VoteThreshold}; - - #[test] - fn basic_environment_works() { - with_externalities(&mut new_test_ext(true), || { - System::set_block_number(1); - assert_eq!(Balances::free_balance(&42), 0); - assert_eq!(CouncilVoting::cooloff_period(), 2); - assert_eq!(CouncilVoting::voting_period(), 1); - assert_eq!(CouncilVoting::will_still_be_councillor_at(&1, 1), true); - assert_eq!(CouncilVoting::will_still_be_councillor_at(&1, 10), false); - assert_eq!(CouncilVoting::will_still_be_councillor_at(&4, 10), false); - assert_eq!(CouncilVoting::is_councillor(&1), true); - assert_eq!(CouncilVoting::is_councillor(&4), false); - assert_eq!(CouncilVoting::proposals(), Vec::<(u64, H256)>::new()); - assert_eq!(CouncilVoting::proposal_voters(H256::default()), Vec::::new()); - assert_eq!(CouncilVoting::is_vetoed(&H256::default()), false); - assert_eq!(CouncilVoting::vote_of((H256::default(), 1)), None); - assert_eq!(CouncilVoting::tally(&H256::default()), (0, 0, 3)); - }); - } - - fn set_balance_proposal(value: u64) -> Call { - Call::Balances(balances::Call::set_balance(42, value.into(), 0)) - } - - fn cancel_referendum_proposal(id: u32) -> Call { - Call::Democracy(democracy::Call::cancel_referendum(id.into())) - } - - #[test] - fn referendum_cancellation_should_work_when_unanimous() { - with_externalities(&mut new_test_ext(true), || { - System::set_block_number(1); - let proposal = set_balance_proposal(42); - assert_ok!(Democracy::internal_start_referendum(proposal.clone(), VoteThreshold::SuperMajorityApprove, 0), 0); - assert_eq!(Democracy::active_referendums(), vec![(0, ReferendumInfo::new(4, proposal, VoteThreshold::SuperMajorityApprove, 0))]); - - let cancellation = cancel_referendum_proposal(0); - let hash = cancellation.blake2_256().into(); - assert_ok!(CouncilVoting::propose(Origin::signed(1), Box::new(cancellation))); - assert_ok!(CouncilVoting::vote(Origin::signed(2), hash, true)); - assert_ok!(CouncilVoting::vote(Origin::signed(3), hash, true)); - assert_eq!(CouncilVoting::proposals(), vec![(2, hash)]); - assert_ok!(CouncilVoting::end_block(System::block_number())); - - System::set_block_number(2); - assert_ok!(CouncilVoting::end_block(System::block_number())); - assert_eq!(Democracy::active_referendums(), vec![]); - assert_eq!(Balances::free_balance(&42), 0); - }); - } - - #[test] - fn referendum_cancellation_should_fail_when_not_unanimous() { - with_externalities(&mut new_test_ext(true), || { - System::set_block_number(1); - let proposal = set_balance_proposal(42); - assert_ok!(Democracy::internal_start_referendum(proposal.clone(), VoteThreshold::SuperMajorityApprove, 0), 0); - - let cancellation = cancel_referendum_proposal(0); - let hash = cancellation.blake2_256().into(); - assert_ok!(CouncilVoting::propose(Origin::signed(1), Box::new(cancellation))); - assert_ok!(CouncilVoting::vote(Origin::signed(2), hash, true)); - assert_ok!(CouncilVoting::vote(Origin::signed(3), hash, false)); - assert_ok!(CouncilVoting::end_block(System::block_number())); - - System::set_block_number(2); - assert_ok!(CouncilVoting::end_block(System::block_number())); - assert_eq!(Democracy::active_referendums(), vec![(0, ReferendumInfo::new(4, proposal, VoteThreshold::SuperMajorityApprove, 0))]); - }); - } - - #[test] - fn referendum_cancellation_should_fail_when_abstentions() { - with_externalities(&mut new_test_ext(true), || { - System::set_block_number(1); - let proposal = set_balance_proposal(42); - assert_ok!(Democracy::internal_start_referendum(proposal.clone(), VoteThreshold::SuperMajorityApprove, 0), 0); - - let cancellation = cancel_referendum_proposal(0); - let hash = cancellation.blake2_256().into(); - assert_ok!(CouncilVoting::propose(Origin::signed(1), Box::new(cancellation))); - assert_ok!(CouncilVoting::vote(Origin::signed(2), hash, true)); - assert_ok!(CouncilVoting::end_block(System::block_number())); - - System::set_block_number(2); - assert_ok!(CouncilVoting::end_block(System::block_number())); - assert_eq!(Democracy::active_referendums(), vec![(0, ReferendumInfo::new(4, proposal, VoteThreshold::SuperMajorityApprove, 0))]); - }); - } - - #[test] - fn veto_should_work() { - with_externalities(&mut new_test_ext(true), || { - System::set_block_number(1); - let proposal = set_balance_proposal(42); - let hash = proposal.blake2_256().into(); - assert_ok!(CouncilVoting::propose(Origin::signed(1), Box::new(proposal.clone()))); - assert_ok!(CouncilVoting::veto(Origin::signed(2), hash)); - assert_eq!(CouncilVoting::proposals().len(), 0); - assert_eq!(Democracy::active_referendums().len(), 0); - }); - } - - #[test] - fn double_veto_should_not_work() { - with_externalities(&mut new_test_ext(true), || { - System::set_block_number(1); - let proposal = set_balance_proposal(42); - let hash = proposal.blake2_256().into(); - assert_ok!(CouncilVoting::propose(Origin::signed(1), Box::new(proposal.clone()))); - assert_ok!(CouncilVoting::veto(Origin::signed(2), hash)); - - System::set_block_number(3); - assert_ok!(CouncilVoting::propose(Origin::signed(1), Box::new(proposal.clone()))); - assert_noop!(CouncilVoting::veto(Origin::signed(2), hash), "a councillor may not veto a proposal twice"); - }); - } - - #[test] - fn retry_in_cooloff_should_not_work() { - with_externalities(&mut new_test_ext(true), || { - System::set_block_number(1); - let proposal = set_balance_proposal(42); - let hash = proposal.blake2_256().into(); - assert_ok!(CouncilVoting::propose(Origin::signed(1), Box::new(proposal.clone()))); - assert_ok!(CouncilVoting::veto(Origin::signed(2), hash)); - - System::set_block_number(2); - assert_noop!(CouncilVoting::propose(Origin::signed(1), Box::new(proposal.clone())), "proposal is vetoed"); - }); - } - - #[test] - fn retry_after_cooloff_should_work() { - with_externalities(&mut new_test_ext(true), || { - System::set_block_number(1); - let proposal = set_balance_proposal(42); - let hash = proposal.blake2_256().into(); - assert_ok!(CouncilVoting::propose(Origin::signed(1), Box::new(proposal.clone()))); - assert_ok!(CouncilVoting::veto(Origin::signed(2), hash)); - - System::set_block_number(3); - assert_ok!(CouncilVoting::propose(Origin::signed(1), Box::new(proposal.clone()))); - assert_ok!(CouncilVoting::vote(Origin::signed(2), hash, false)); - assert_ok!(CouncilVoting::vote(Origin::signed(3), hash, true)); - assert_ok!(CouncilVoting::end_block(System::block_number())); - - System::set_block_number(4); - assert_ok!(CouncilVoting::end_block(System::block_number())); - assert_eq!(CouncilVoting::proposals().len(), 0); - assert_eq!(Democracy::active_referendums(), vec![(0, ReferendumInfo::new(7, set_balance_proposal(42), VoteThreshold::SimpleMajority, 0))]); - }); - } - - #[test] - fn alternative_double_veto_should_work() { - with_externalities(&mut new_test_ext(true), || { - System::set_block_number(1); - let proposal = set_balance_proposal(42); - let hash = proposal.blake2_256().into(); - assert_ok!(CouncilVoting::propose(Origin::signed(1), Box::new(proposal.clone()))); - assert_ok!(CouncilVoting::veto(Origin::signed(2), hash)); - - System::set_block_number(3); - assert_ok!(CouncilVoting::propose(Origin::signed(1), Box::new(proposal.clone()))); - assert_ok!(CouncilVoting::veto(Origin::signed(3), hash)); - assert_eq!(CouncilVoting::proposals().len(), 0); - assert_eq!(Democracy::active_referendums().len(), 0); - }); - } - - #[test] - fn simple_propose_should_work() { - with_externalities(&mut new_test_ext(true), || { - System::set_block_number(1); - let proposal = set_balance_proposal(42); - let hash = proposal.blake2_256().into(); - assert_ok!(CouncilVoting::propose(Origin::signed(1), Box::new(proposal.clone()))); - assert_eq!(CouncilVoting::proposals().len(), 1); - assert_eq!(CouncilVoting::proposal_voters(&hash), vec![1]); - assert_eq!(CouncilVoting::vote_of((hash, 1)), Some(true)); - assert_eq!(CouncilVoting::tally(&hash), (1, 0, 2)); - }); - } - - #[test] - fn unvoted_proposal_should_expire_without_action() { - with_externalities(&mut new_test_ext(true), || { - System::set_block_number(1); - let proposal = set_balance_proposal(42); - assert_ok!(CouncilVoting::propose(Origin::signed(1), Box::new(proposal.clone()))); - assert_eq!(CouncilVoting::tally(&proposal.blake2_256().into()), (1, 0, 2)); - assert_ok!(CouncilVoting::end_block(System::block_number())); - - System::set_block_number(2); - assert_ok!(CouncilVoting::end_block(System::block_number())); - assert_eq!(CouncilVoting::proposals().len(), 0); - assert_eq!(Democracy::active_referendums().len(), 0); - }); - } - - #[test] - fn unanimous_proposal_should_expire_with_biased_referendum() { - with_externalities(&mut new_test_ext(true), || { - System::set_block_number(1); - let proposal = set_balance_proposal(42); - assert_ok!(CouncilVoting::propose(Origin::signed(1), Box::new(proposal.clone()))); - assert_ok!(CouncilVoting::vote(Origin::signed(2), proposal.blake2_256().into(), true)); - assert_ok!(CouncilVoting::vote(Origin::signed(3), proposal.blake2_256().into(), true)); - assert_eq!(CouncilVoting::tally(&proposal.blake2_256().into()), (3, 0, 0)); - assert_ok!(CouncilVoting::end_block(System::block_number())); - - System::set_block_number(2); - assert_ok!(CouncilVoting::end_block(System::block_number())); - assert_eq!(CouncilVoting::proposals().len(), 0); - assert_eq!(Democracy::active_referendums(), vec![(0, ReferendumInfo::new(5, proposal, VoteThreshold::SuperMajorityAgainst, 0))]); - }); - } - - #[test] - fn majority_proposal_should_expire_with_unbiased_referendum() { - with_externalities(&mut new_test_ext(true), || { - System::set_block_number(1); - let proposal = set_balance_proposal(42); - assert_ok!(CouncilVoting::propose(Origin::signed(1), Box::new(proposal.clone()))); - assert_ok!(CouncilVoting::vote(Origin::signed(2), proposal.blake2_256().into(), true)); - assert_ok!(CouncilVoting::vote(Origin::signed(3), proposal.blake2_256().into(), false)); - assert_eq!(CouncilVoting::tally(&proposal.blake2_256().into()), (2, 1, 0)); - assert_ok!(CouncilVoting::end_block(System::block_number())); - - System::set_block_number(2); - assert_ok!(CouncilVoting::end_block(System::block_number())); - assert_eq!(CouncilVoting::proposals().len(), 0); - assert_eq!(Democracy::active_referendums(), vec![(0, ReferendumInfo::new(5, proposal, VoteThreshold::SimpleMajority, 0))]); - }); - } - - #[test] - fn propose_by_public_should_not_work() { - with_externalities(&mut new_test_ext(true), || { - System::set_block_number(1); - let proposal = set_balance_proposal(42); - assert_noop!(CouncilVoting::propose(Origin::signed(4), Box::new(proposal)), "proposer would not be on council"); - }); - } - - #[test] - fn vote_by_public_should_not_work() { - with_externalities(&mut new_test_ext(true), || { - System::set_block_number(1); - let proposal = set_balance_proposal(42); - assert_ok!(CouncilVoting::propose(Origin::signed(1), Box::new(proposal.clone()))); - assert_noop!(CouncilVoting::vote(Origin::signed(4), proposal.blake2_256().into(), true), "only councillors may vote on council proposals"); - }); - } -} diff --git a/srml/democracy/src/lib.rs b/srml/democracy/src/lib.rs index 4bd7ad60aa1b6fe11cc7c0a346c49aad1b19bd08..0fead411c8796d6c460c8f2a0c8f91557ff6e8a3 100644 --- a/srml/democracy/src/lib.rs +++ b/srml/democracy/src/lib.rs @@ -15,19 +15,23 @@ // along with Substrate. If not, see . //! Democratic system: Handles administration of general stakeholder voting. - +#![recursion_limit="128"] #![cfg_attr(not(feature = "std"), no_std)] use rstd::prelude::*; -use rstd::result; -use primitives::traits::{Zero, As, Bounded}; -use parity_codec::{Encode, Decode}; -use srml_support::{StorageValue, StorageMap, Parameter, Dispatchable, IsSubType, EnumerableStorageMap}; -use srml_support::{decl_module, decl_storage, decl_event, ensure}; -use srml_support::traits::{Currency, ReservableCurrency, LockableCurrency, WithdrawReason, LockIdentifier, - OnFreeBalanceZero}; +use rstd::{result, convert::TryFrom}; +use primitives::traits::{Zero, Bounded, CheckedMul, CheckedDiv, EnsureOrigin, Hash}; +use parity_codec::{Encode, Decode, Input, Output}; +use srml_support::{ + decl_module, decl_storage, decl_event, ensure, + StorageValue, StorageMap, Parameter, Dispatchable, IsSubType, EnumerableStorageMap, + traits::{ + Currency, ReservableCurrency, LockableCurrency, WithdrawReason, LockIdentifier, + OnFreeBalanceZero, Get + } +}; use srml_support::dispatch::Result; -use system::ensure_signed; +use system::{ensure_signed, ensure_root}; mod vote_threshold; pub use vote_threshold::{Approved, VoteThreshold}; @@ -36,63 +40,299 @@ const DEMOCRACY_ID: LockIdentifier = *b"democrac"; /// A proposal index. pub type PropIndex = u32; + /// A referendum index. pub type ReferendumIndex = u32; -/// A number of lock periods. -pub type LockPeriods = i8; -const MAX_RECURSION_LIMIT: u32 = 16; - -/// A number of lock periods, plus a vote, one way or the other. -#[derive(Encode, Decode, Copy, Clone, Eq, PartialEq, Default)] +/// A value denoting the strength of conviction of a vote. +#[derive(Encode, Decode, Copy, Clone, Eq, PartialEq, Ord, PartialOrd)] #[cfg_attr(feature = "std", derive(Debug))] -pub struct Vote(i8); +pub enum Conviction { + /// 0.1x votes, unlocked. + None, + /// 1x votes, locked for an enactment period following a successful vote. + Locked1x, + /// 2x votes, locked for 2x enactment periods following a successful vote. + Locked2x, + /// 3x votes, locked for 4x... + Locked3x, + /// 4x votes, locked for 8x... + Locked4x, + /// 5x votes, locked for 16x... + Locked5x, +} -impl Vote { - /// Create a new instance. - pub fn new(aye: bool, multiplier: LockPeriods) -> Self { - let m = multiplier.max(1) - 1; - Vote(if aye { - -1 - m - } else { - m +impl Default for Conviction { + fn default() -> Self { + Conviction::None + } +} + +impl From for u8 { + fn from(c: Conviction) -> u8 { + match c { + Conviction::None => 0, + Conviction::Locked1x => 1, + Conviction::Locked2x => 2, + Conviction::Locked3x => 3, + Conviction::Locked4x => 4, + Conviction::Locked5x => 5, + } + } +} + +impl TryFrom for Conviction { + type Error = (); + fn try_from(i: u8) -> result::Result { + Ok(match i { + 0 => Conviction::None, + 1 => Conviction::Locked1x, + 2 => Conviction::Locked2x, + 3 => Conviction::Locked3x, + 4 => Conviction::Locked4x, + 5 => Conviction::Locked5x, + _ => return Err(()), }) } +} - /// Is this an aye vote? - pub fn is_aye(self) -> bool { - self.0 < 0 +impl Conviction { + /// The amount of time (in number of periods) that our conviction implies a successful voter's + /// balance should be locked for. + fn lock_periods(self) -> u32 { + match self { + Conviction::None => 0, + Conviction::Locked1x => 1, + Conviction::Locked2x => 2, + Conviction::Locked3x => 4, + Conviction::Locked4x => 8, + Conviction::Locked5x => 16, + } } - /// The strength (measured in lock periods). - pub fn multiplier(self) -> LockPeriods { - 1 + if self.0 < 0 { -(self.0 + 1) } else { self.0 } + /// The votes of a voter of the given `balance` with our conviction. + fn votes< + B: From + Zero + Copy + CheckedMul + CheckedDiv + Bounded + >(self, balance: B) -> (B, B) { + match self { + Conviction::None => { + let r = balance.checked_div(&10u8.into()).unwrap_or_else(Zero::zero); + (r, r) + } + x => ( + balance.checked_mul(&u8::from(x).into()).unwrap_or_else(B::max_value), + balance, + ) + } + } +} + +impl Bounded for Conviction { + fn min_value() -> Self { + Conviction::None + } + + fn max_value() -> Self { + Conviction::Locked5x + } +} + +const MAX_RECURSION_LIMIT: u32 = 16; + +/// A number of lock periods, plus a vote, one way or the other. +#[derive(Copy, Clone, Eq, PartialEq, Default)] +#[cfg_attr(feature = "std", derive(Debug))] +pub struct Vote { + pub aye: bool, + pub conviction: Conviction, +} + +impl Encode for Vote { + fn encode_to(&self, output: &mut T) { + output.push_byte(u8::from(self.conviction) | if self.aye { 0b1000_0000 } else { 0 }); + } +} + +impl Decode for Vote { + fn decode(input: &mut I) -> Option { + let b = input.read_byte()?; + Some(Vote { + aye: (b & 0b1000_0000) == 0b1000_0000, + conviction: Conviction::try_from(b & 0b0111_1111).ok()?, + }) } } type BalanceOf = <::Currency as Currency<::AccountId>>::Balance; pub trait Trait: system::Trait + Sized { - type Currency: ReservableCurrency + LockableCurrency; - type Proposal: Parameter + Dispatchable + IsSubType>; - type Event: From> + Into<::Event>; + + /// Currency type for this module. + type Currency: ReservableCurrency + + LockableCurrency; + + /// The minimum period of locking and the period between a proposal being approved and enacted. + /// + /// It should generally be a little more than the unstake period to ensure that + /// voting stakers have an opportunity to remove themselves from the system in the case where + /// they are on the losing side of a vote. + type EnactmentPeriod: Get; + + /// How often (in blocks) new public referenda are launched. + type LaunchPeriod: Get; + + /// How often (in blocks) to check for new votes. + type VotingPeriod: Get; + + /// The minimum amount to be used as a deposit for a public referendum proposal. + type MinimumDeposit: Get>; + + /// Origin from which the next tabled referendum may be forced. This is a normal + /// "super-majority-required" referendum. + type ExternalOrigin: EnsureOrigin; + + /// Origin from which the next tabled referendum may be forced; this allows for the tabling of + /// a majority-carries referendum. + type ExternalMajorityOrigin: EnsureOrigin; + + /// Origin from which emergency referenda may be scheduled. + type EmergencyOrigin: EnsureOrigin; + + /// Minimum voting period allowed for an emergency referendum. + type EmergencyVotingPeriod: Get; + + /// Origin from which any referenda may be cancelled in an emergency. + type CancellationOrigin: EnsureOrigin; + + /// Origin for anyone able to veto proposals. + type VetoOrigin: EnsureOrigin; + + /// Period in blocks where an external proposal may not be re-submitted after being vetoed. + type CooloffPeriod: Get; +} + +/// Info regarding an ongoing referendum. +#[derive(Encode, Decode, Clone, PartialEq, Eq)] +#[cfg_attr(feature = "std", derive(Debug))] +pub struct ReferendumInfo { + /// When voting on this referendum will end. + end: BlockNumber, + /// The proposal being voted on. + proposal: Proposal, + /// The thresholding mechanism to determine whether it passed. + threshold: VoteThreshold, + /// The delay (in blocks) to wait after a successful referendum before deploying. + delay: BlockNumber, +} + +impl ReferendumInfo { + /// Create a new instance. + pub fn new( + end: BlockNumber, + proposal: Proposal, + threshold: VoteThreshold, + delay: BlockNumber + ) -> Self { + ReferendumInfo { end, proposal, threshold, delay } + } +} + +decl_storage! { + trait Store for Module as Democracy { + + /// The number of (public) proposals that have been made so far. + pub PublicPropCount get(public_prop_count) build(|_| 0 as PropIndex) : PropIndex; + /// The public proposals. Unsorted. + pub PublicProps get(public_props): Vec<(PropIndex, T::Proposal, T::AccountId)>; + /// Those who have locked a deposit. + pub DepositOf get(deposit_of): map PropIndex => Option<(BalanceOf, Vec)>; + + /// The next free referendum index, aka the number of referenda started so far. + pub ReferendumCount get(referendum_count) build(|_| 0 as ReferendumIndex): ReferendumIndex; + /// The next referendum index that should be tallied. + pub NextTally get(next_tally) build(|_| 0 as ReferendumIndex): ReferendumIndex; + /// Information concerning any given referendum. + pub ReferendumInfoOf get(referendum_info): + map ReferendumIndex => Option<(ReferendumInfo)>; + /// Queue of successful referenda to be dispatched. + pub DispatchQueue get(dispatch_queue): + map T::BlockNumber => Vec>; + + /// Get the voters for the current proposal. + pub VotersFor get(voters_for): map ReferendumIndex => Vec; + + /// Get the vote in a given referendum of a particular voter. The result is meaningful only + /// if `voters_for` includes the voter when called with the referendum (you'll get the + /// default `Vote` value otherwise). If you don't want to check `voters_for`, then you can + /// also check for simple existence with `VoteOf::exists` first. + pub VoteOf get(vote_of): map (ReferendumIndex, T::AccountId) => Vote; + + /// Who is able to vote for whom. Value is the fund-holding account, key is the + /// vote-transaction-sending account. + pub Proxy get(proxy): map T::AccountId => Option; + + /// Get the account (and lock periods) to which another account is delegating vote. + pub Delegations get(delegations): linked_map T::AccountId => (T::AccountId, Conviction); + + /// True if the last referendum tabled was submitted externally. False if it was a public + /// proposal. + pub LastTabledWasExternal: bool; + + /// The referendum to be tabled whenever it would be valid to table an external proposal. + /// This happens when a referendum needs to be tabled and one of two conditions are met: + /// - `LastTabledWasExternal` is `false`; or + /// - `PublicProps` is empty. + pub NextExternal: Option<(T::Proposal, VoteThreshold)>; + + /// A record of who vetoed what. Maps proposal hash to a possible existent block number + /// (until when it may not be resubmitted) and who vetoed it. + pub Blacklist get(blacklist): map T::Hash => Option<(T::BlockNumber, Vec)>; + + /// Record of all proposals that have been subject to emergency cancellation. + pub Cancellations: map T::Hash => bool; + } } +decl_event!( + pub enum Event where + Balance = BalanceOf, + ::AccountId, + ::Hash, + ::BlockNumber, + { + Proposed(PropIndex, Balance), + Tabled(PropIndex, Balance, Vec), + ExternalTabled, + Started(ReferendumIndex, VoteThreshold), + Passed(ReferendumIndex), + NotPassed(ReferendumIndex), + Cancelled(ReferendumIndex), + Executed(ReferendumIndex, bool), + Delegated(AccountId, AccountId), + Undelegated(AccountId), + Vetoed(AccountId, Hash, BlockNumber), + } +); + decl_module! { pub struct Module for enum Call where origin: T::Origin { fn deposit_event() = default; /// Propose a sensitive action to be taken. - fn propose( - origin, + /// + /// # + /// - O(1). + /// - Two DB changes, one DB entry. + /// # + fn propose(origin, proposal: Box, #[compact] value: BalanceOf ) { let who = ensure_signed(origin)?; - ensure!(value >= Self::minimum_deposit(), "value too low"); + ensure!(value >= T::MinimumDeposit::get(), "value too low"); T::Currency::reserve(&who, value) .map_err(|_| "proposer's balance too low")?; @@ -108,6 +348,11 @@ decl_module! { } /// Propose a sensitive action to be taken. + /// + /// # + /// - O(1). + /// - One DB entry. + /// # fn second(origin, #[compact] proposal: PropIndex) { let who = ensure_signed(origin)?; let mut deposit = Self::deposit_of(proposal) @@ -120,26 +365,123 @@ decl_module! { /// Vote in a referendum. If `vote.is_aye()`, the vote is to enact the proposal; /// otherwise it is a vote to keep the status quo. - fn vote(origin, #[compact] ref_index: ReferendumIndex, vote: Vote) -> Result { + /// + /// # + /// - O(1). + /// - One DB change, one DB entry. + /// # + fn vote(origin, + #[compact] ref_index: ReferendumIndex, + vote: Vote + ) -> Result { let who = ensure_signed(origin)?; Self::do_vote(who, ref_index, vote) } - /// Vote in a referendum on behalf of a stash. If `vote.is_aye()`, the vote is to enact the proposal; - /// otherwise it is a vote to keep the status quo. - fn proxy_vote(origin, #[compact] ref_index: ReferendumIndex, vote: Vote) -> Result { + /// Vote in a referendum on behalf of a stash. If `vote.is_aye()`, the vote is to enact + /// the proposal; otherwise it is a vote to keep the status quo. + /// + /// # + /// - O(1). + /// - One DB change, one DB entry. + /// # + fn proxy_vote(origin, + #[compact] ref_index: ReferendumIndex, + vote: Vote + ) -> Result { let who = Self::proxy(ensure_signed(origin)?).ok_or("not a proxy")?; Self::do_vote(who, ref_index, vote) } - /// Start a referendum. - fn start_referendum(proposal: Box, threshold: VoteThreshold, delay: T::BlockNumber) -> Result { + /// Schedule an emergency referendum. + /// + /// This will create a new referendum for the `proposal`, approved as long as counted votes + /// exceed `threshold` and, if approved, enacted after the given `delay`. + /// + /// It may be called from either the Root or the Emergency origin. + fn emergency_propose(origin, + proposal: Box, + threshold: VoteThreshold, + voting_period: T::BlockNumber, + delay: T::BlockNumber + ) { + T::EmergencyOrigin::try_origin(origin) + .map(|_| ()) + .or_else(|origin| ensure_root(origin))?; + let now = >::block_number(); + // We don't consider it an error if `vote_period` is too low, but we do enforce the + // minimum. This is primarily due to practicality. If it's an emergency, we don't want + // to introduce more delays than is strictly needed by requiring a potentially costly + // resubmission in the case of a mistakenly low `vote_period`; better to just let the + // referendum take place with the lowest valid value. + let period = voting_period.max(T::EmergencyVotingPeriod::get()); Self::inject_referendum( - >::block_number() + Self::voting_period(), + now + period, *proposal, threshold, delay, - ).map(|_| ()) + ).map(|_| ())?; + } + + /// Schedule an emergency cancellation of a referendum. Cannot happen twice to the same + /// referendum. + fn emergency_cancel(origin, ref_index: ReferendumIndex) { + T::CancellationOrigin::ensure_origin(origin)?; + + let info = Self::referendum_info(ref_index).ok_or("unknown index")?; + let h = T::Hashing::hash_of(&info.proposal); + ensure!(!>::exists(h), "cannot cancel the same proposal twice"); + + >::insert(h, true); + Self::clear_referendum(ref_index); + } + + /// Schedule a referendum to be tabled once it is legal to schedule an external + /// referendum. + fn external_propose(origin, proposal: Box) { + T::ExternalOrigin::ensure_origin(origin)?; + ensure!(!>::exists(), "proposal already made"); + let proposal_hash = T::Hashing::hash_of(&proposal); + if let Some((until, _)) = >::get(proposal_hash) { + ensure!(>::block_number() >= until, "proposal still blacklisted"); + } + >::put((*proposal, VoteThreshold::SuperMajorityApprove)); + } + + /// Schedule a majority-carries referendum to be tabled next once it is legal to schedule + /// an external referendum. + fn external_propose_majority(origin, proposal: Box) { + T::ExternalMajorityOrigin::ensure_origin(origin)?; + ensure!(!>::exists(), "proposal already made"); + let proposal_hash = T::Hashing::hash_of(&proposal); + if let Some((until, _)) = >::get(proposal_hash) { + ensure!(>::block_number() >= until, "proposal still blacklisted"); + } + >::put((*proposal, VoteThreshold::SimpleMajority)); + } + + /// Veto and blacklist the external proposal hash. + fn veto_external(origin, proposal_hash: T::Hash) { + let who = T::VetoOrigin::ensure_origin(origin)?; + + if let Some((proposal, _)) = >::get() { + ensure!(proposal_hash == T::Hashing::hash_of(&proposal), "unknown proposal"); + } else { + Err("no external proposal")?; + } + + let mut existing_vetoers = >::get(&proposal_hash) + .map(|pair| pair.1) + .unwrap_or_else(Vec::new); + let insert_position = existing_vetoers.binary_search(&who) + .err().ok_or("identity may not veto a proposal twice")?; + + existing_vetoers.insert(insert_position, who.clone()); + let until = >::block_number() + T::CooloffPeriod::get(); + >::insert(&proposal_hash, (until, existing_vetoers)); + + Self::deposit_event(RawEvent::Vetoed(who, proposal_hash, until)); + >::kill(); } /// Remove a referendum. @@ -148,18 +490,32 @@ decl_module! { } /// Cancel a proposal queued for enactment. - pub fn cancel_queued(#[compact] when: T::BlockNumber, #[compact] which: u32) { + fn cancel_queued( + #[compact] when: T::BlockNumber, + #[compact] which: u32, + #[compact] what: ReferendumIndex + ) { let which = which as usize; - >::mutate(when, |items| if items.len() > which { items[which] = None }); + let mut items = >::get(when); + if items.get(which).and_then(Option::as_ref).map_or(false, |x| x.1 == what) { + items[which] = None; + >::insert(when, items); + } else { + Err("proposal not found")? + } } - fn on_finalize(n: T::BlockNumber) { + fn on_initialize(n: T::BlockNumber) { if let Err(e) = Self::end_block(n) { runtime_io::print(e); } } /// Specify a proxy. Called by the stash. + /// + /// # + /// - One extra DB entry. + /// # fn set_proxy(origin, proxy: T::AccountId) { let who = ensure_signed(origin)?; ensure!(!>::exists(&proxy), "already a proxy"); @@ -167,12 +523,20 @@ decl_module! { } /// Clear the proxy. Called by the proxy. + /// + /// # + /// - One DB clear. + /// # fn resign_proxy(origin) { let who = ensure_signed(origin)?; >::remove(who); } /// Clear the proxy. Called by the stash. + /// + /// # + /// - One DB clear. + /// # fn remove_proxy(origin, proxy: T::AccountId) { let who = ensure_signed(origin)?; ensure!(&Self::proxy(&proxy).ok_or("not a proxy")? == &who, "wrong proxy"); @@ -180,117 +544,55 @@ decl_module! { } /// Delegate vote. - pub fn delegate(origin, to: T::AccountId, lock_periods: LockPeriods) { + /// + /// # + /// - One extra DB entry. + /// # + pub fn delegate(origin, to: T::AccountId, conviction: Conviction) { let who = ensure_signed(origin)?; - >::insert(who.clone(), (to.clone(), lock_periods.clone())); + >::insert(who.clone(), (to.clone(), conviction)); // Currency is locked indefinitely as long as it's delegated. - T::Currency::extend_lock(DEMOCRACY_ID, &who, Bounded::max_value(), T::BlockNumber::max_value(), WithdrawReason::Transfer.into()); + T::Currency::extend_lock( + DEMOCRACY_ID, + &who, + Bounded::max_value(), + T::BlockNumber::max_value(), + WithdrawReason::Transfer.into() + ); Self::deposit_event(RawEvent::Delegated(who, to)); } /// Undelegate vote. + /// + /// # + /// - O(1). + /// # fn undelegate(origin) { let who = ensure_signed(origin)?; ensure!(>::exists(&who), "not delegated"); - let d = >::take(&who); + let (_, conviction) = >::take(&who); // Indefinite lock is reduced to the maximum voting lock that could be possible. - let lock_period = Self::public_delay(); let now = >::block_number(); - let locked_until = now + lock_period * T::BlockNumber::sa(d.1 as u64); - T::Currency::set_lock(DEMOCRACY_ID, &who, Bounded::max_value(), locked_until, WithdrawReason::Transfer.into()); + let locked_until = now + T::EnactmentPeriod::get() * conviction.lock_periods().into(); + T::Currency::set_lock( + DEMOCRACY_ID, + &who, + Bounded::max_value(), + locked_until, + WithdrawReason::Transfer.into() + ); Self::deposit_event(RawEvent::Undelegated(who)); } } } -/// Info regarding an ongoing referendum. -#[derive(Encode, Decode, Clone, PartialEq, Eq)] -#[cfg_attr(feature = "std", derive(Debug))] -pub struct ReferendumInfo { - /// When voting on this referendum will end. - end: BlockNumber, - /// The proposal being voted on. - proposal: Proposal, - /// The thresholding mechanism to determine whether it passed. - threshold: VoteThreshold, - /// The delay (in blocks) to wait after a successful referendum before deploying. - delay: BlockNumber, -} - -impl ReferendumInfo { - /// Create a new instance. - pub fn new(end: BlockNumber, proposal: Proposal, threshold: VoteThreshold, delay: BlockNumber) -> Self { - ReferendumInfo { end, proposal, threshold, delay } - } -} - -decl_storage! { - trait Store for Module as Democracy { - - /// The number of (public) proposals that have been made so far. - pub PublicPropCount get(public_prop_count) build(|_| 0 as PropIndex) : PropIndex; - /// The public proposals. Unsorted. - pub PublicProps get(public_props): Vec<(PropIndex, T::Proposal, T::AccountId)>; - /// Those who have locked a deposit. - pub DepositOf get(deposit_of): map PropIndex => Option<(BalanceOf, Vec)>; - /// How often (in blocks) new public referenda are launched. - pub LaunchPeriod get(launch_period) config(): T::BlockNumber = T::BlockNumber::sa(1000); - /// The minimum amount to be used as a deposit for a public referendum proposal. - pub MinimumDeposit get(minimum_deposit) config(): BalanceOf; - /// The delay before enactment for all public referenda. - pub PublicDelay get(public_delay) config(): T::BlockNumber; - /// The maximum number of additional lock periods a voter may offer to strengthen their vote. Multiples of `PublicDelay`. - pub MaxLockPeriods get(max_lock_periods) config(): LockPeriods; - - /// How often (in blocks) to check for new votes. - pub VotingPeriod get(voting_period) config(): T::BlockNumber = T::BlockNumber::sa(1000); - - /// The next free referendum index, aka the number of referendums started so far. - pub ReferendumCount get(referendum_count) build(|_| 0 as ReferendumIndex): ReferendumIndex; - /// The next referendum index that should be tallied. - pub NextTally get(next_tally) build(|_| 0 as ReferendumIndex): ReferendumIndex; - /// Information concerning any given referendum. - pub ReferendumInfoOf get(referendum_info): map ReferendumIndex => Option<(ReferendumInfo)>; - /// Queue of successful referenda to be dispatched. - pub DispatchQueue get(dispatch_queue): map T::BlockNumber => Vec>; - - /// Get the voters for the current proposal. - pub VotersFor get(voters_for): map ReferendumIndex => Vec; - - /// Get the vote in a given referendum of a particular voter. The result is meaningful only if `voters_for` includes the - /// voter when called with the referendum (you'll get the default `Vote` value otherwise). If you don't want to check - /// `voters_for`, then you can also check for simple existence with `VoteOf::exists` first. - pub VoteOf get(vote_of): map (ReferendumIndex, T::AccountId) => Vote; - - /// Who is able to vote for whom. Value is the fund-holding account, key is the vote-transaction-sending account. - pub Proxy get(proxy): map T::AccountId => Option; - - /// Get the account (and lock periods) to which another account is delegating vote. - pub Delegations get(delegations): linked_map T::AccountId => (T::AccountId, LockPeriods); - } -} - -decl_event!( - pub enum Event where Balance = BalanceOf, ::AccountId { - Proposed(PropIndex, Balance), - Tabled(PropIndex, Balance, Vec), - Started(ReferendumIndex, VoteThreshold), - Passed(ReferendumIndex), - NotPassed(ReferendumIndex), - Cancelled(ReferendumIndex), - Executed(ReferendumIndex, bool), - Delegated(AccountId, AccountId), - Undelegated(AccountId), - } -); - impl Module { // exposed immutables. /// Get the amount locked in support of `proposal`; `None` if proposal isn't a valid proposal /// index. pub fn locked_for(proposal: PropIndex) -> Option> { - Self::deposit_of(proposal).map(|(d, l)| d * BalanceOf::::sa(l.len() as u64)) + Self::deposit_of(proposal).map(|(d, l)| d * (l.len() as u32).into()) } /// Return true if `ref_index` is an on-going referendum. @@ -298,8 +600,10 @@ impl Module { >::exists(ref_index) } - /// Get all referendums currently active. - pub fn active_referendums() -> Vec<(ReferendumIndex, ReferendumInfo)> { + /// Get all referenda currently active. + pub fn active_referenda() + -> Vec<(ReferendumIndex, ReferendumInfo)> + { let next = Self::next_tally(); let last = Self::referendum_count(); (next..last).into_iter() @@ -307,8 +611,10 @@ impl Module { .collect() } - /// Get all referendums ready for tally at block `n`. - pub fn maturing_referendums_at(n: T::BlockNumber) -> Vec<(ReferendumIndex, ReferendumInfo)> { + /// Get all referenda ready for tally at block `n`. + pub fn maturing_referenda_at( + n: T::BlockNumber + ) -> Vec<(ReferendumIndex, ReferendumInfo)> { let next = Self::next_tally(); let last = Self::referendum_count(); (next..last).into_iter() @@ -319,52 +625,75 @@ impl Module { /// Get the voters for the current proposal. pub fn tally(ref_index: ReferendumIndex) -> (BalanceOf, BalanceOf, BalanceOf) { - let (approve, against, capital): (BalanceOf, BalanceOf, BalanceOf) = Self::voters_for(ref_index).iter() - .map(|voter| ( - T::Currency::total_balance(voter), Self::vote_of((ref_index, voter.clone())) - )) - .map(|(bal, vote)| - if vote.is_aye() { - (bal * BalanceOf::::sa(vote.multiplier() as u64), Zero::zero(), bal) - } else { - (Zero::zero(), bal * BalanceOf::::sa(vote.multiplier() as u64), bal) - } - ).fold((Zero::zero(), Zero::zero(), Zero::zero()), |(a, b, c), (d, e, f)| (a + d, b + e, c + f)); + let (approve, against, capital): + (BalanceOf, BalanceOf, BalanceOf) = Self::voters_for(ref_index) + .iter() + .map(|voter| ( + T::Currency::total_balance(voter), Self::vote_of((ref_index, voter.clone())) + )) + .map(|(balance, Vote { aye, conviction })| { + let (votes, turnout) = conviction.votes(balance); + if aye { + (votes, Zero::zero(), turnout) + } else { + (Zero::zero(), votes, turnout) + } + }).fold( + (Zero::zero(), Zero::zero(), Zero::zero()), + |(a, b, c), (d, e, f)| (a + d, b + e, c + f) + ); let (del_approve, del_against, del_capital) = Self::tally_delegation(ref_index); (approve + del_approve, against + del_against, capital + del_capital) } /// Get the delegated voters for the current proposal. - /// I think this goes into a worker once https://github.com/paritytech/substrate/issues/1458 is done. + /// I think this goes into a worker once https://github.com/paritytech/substrate/issues/1458 is + /// done. fn tally_delegation(ref_index: ReferendumIndex) -> (BalanceOf, BalanceOf, BalanceOf) { - Self::voters_for(ref_index).iter() - .fold((Zero::zero(), Zero::zero(), Zero::zero()), |(approve_acc, against_acc, capital_acc), voter| { - let vote = Self::vote_of((ref_index, voter.clone())); - let (votes, balance) = Self::delegated_votes(ref_index, voter.clone(), vote.multiplier(), MAX_RECURSION_LIMIT); - if vote.is_aye() { - (approve_acc + votes, against_acc, capital_acc + balance) + Self::voters_for(ref_index).iter().fold( + (Zero::zero(), Zero::zero(), Zero::zero()), + |(approve_acc, against_acc, turnout_acc), voter| { + let Vote { aye, conviction } = Self::vote_of((ref_index, voter.clone())); + let (votes, turnout) = Self::delegated_votes( + ref_index, + voter.clone(), + conviction, + MAX_RECURSION_LIMIT + ); + if aye { + (approve_acc + votes, against_acc, turnout_acc + turnout) } else { - (approve_acc, against_acc + votes, capital_acc + balance) + (approve_acc, against_acc + votes, turnout_acc + turnout) } - }) + } + ) } fn delegated_votes( ref_index: ReferendumIndex, to: T::AccountId, - min_lock_periods: LockPeriods, + parent_conviction: Conviction, recursion_limit: u32, ) -> (BalanceOf, BalanceOf) { if recursion_limit == 0 { return (Zero::zero(), Zero::zero()); } >::enumerate() - .filter(|(delegator, (delegate, _))| *delegate == to && !>::exists(&(ref_index, delegator.clone()))) - .fold((Zero::zero(), Zero::zero()), |(votes_acc, balance_acc), (delegator, (_delegate, periods))| { - let lock_periods = if min_lock_periods <= periods { min_lock_periods } else { periods }; - let balance = T::Currency::total_balance(&delegator); - let votes = T::Currency::total_balance(&delegator) * BalanceOf::::sa(lock_periods as u64); - let (del_votes, del_balance) = Self::delegated_votes(ref_index, delegator, lock_periods, recursion_limit - 1); - (votes_acc + votes + del_votes, balance_acc + balance + del_balance) - }) + .filter(|(delegator, (delegate, _))| + *delegate == to && !>::exists(&(ref_index, delegator.clone())) + ).fold( + (Zero::zero(), Zero::zero()), + |(votes_acc, turnout_acc), (delegator, (_delegate, max_conviction))| { + let conviction = Conviction::min(parent_conviction, max_conviction); + let balance = T::Currency::total_balance(&delegator); + let (votes, turnout) = conviction.votes(balance); + let (del_votes, del_turnout) = Self::delegated_votes( + ref_index, + delegator, + conviction, + recursion_limit - 1 + ); + (votes_acc + votes + del_votes, turnout_acc + turnout + del_turnout) + } + ) } // Exposed mutables. @@ -375,8 +704,17 @@ impl Module { } /// Start a referendum. Can be called directly by the council. - pub fn internal_start_referendum(proposal: T::Proposal, threshold: VoteThreshold, delay: T::BlockNumber) -> result::Result { - >::inject_referendum(>::block_number() + >::voting_period(), proposal, threshold, delay) + pub fn internal_start_referendum( + proposal: T::Proposal, + threshold: VoteThreshold, + delay: T::BlockNumber + ) -> result::Result { + >::inject_referendum( + >::block_number() + T::VotingPeriod::get(), + proposal, + threshold, + delay + ) } /// Remove a referendum. Can be called directly by the council. @@ -389,7 +727,6 @@ impl Module { /// Actually enact a vote, if legit. fn do_vote(who: T::AccountId, ref_index: ReferendumIndex, vote: Vote) -> Result { - ensure!(vote.multiplier() <= Self::max_lock_periods(), "vote has too great a strength"); ensure!(Self::is_active_referendum(ref_index), "vote given for invalid referendum."); if !>::exists(&(ref_index, who.clone())) { >::mutate(ref_index, |voters| voters.push(who.clone())); @@ -406,12 +743,17 @@ impl Module { delay: T::BlockNumber, ) -> result::Result { let ref_index = Self::referendum_count(); - if ref_index > 0 && Self::referendum_info(ref_index - 1).map(|i| i.end > end).unwrap_or(false) { + if ref_index.checked_sub(1) + .and_then(Self::referendum_info) + .map(|i| i.end > end) + .unwrap_or(false) + { Err("Cannot inject a referendum that ends earlier than preceeding referendum")? } >::put(ref_index + 1); - >::insert(ref_index, ReferendumInfo { end, proposal, threshold, delay }); + let item = ReferendumInfo { end, proposal, threshold, delay }; + >::insert(ref_index, item); Self::deposit_event(RawEvent::Started(ref_index, threshold)); Ok(ref_index) } @@ -431,47 +773,92 @@ impl Module { Self::deposit_event(RawEvent::Executed(index, ok)); } + /// Table the next waiting proposal for a vote. fn launch_next(now: T::BlockNumber) -> Result { + if >::take() { + Self::launch_public(now).or_else(|_| Self::launch_external(now)) + } else { + Self::launch_external(now).or_else(|_| Self::launch_public(now)) + }.map_err(|_| "No proposals waiting") + } + + /// Table the waiting external proposal for a vote, if there is one. + fn launch_external(now: T::BlockNumber) -> Result { + if let Some((proposal, threshold)) = >::take() { + >::put(true); + Self::deposit_event(RawEvent::ExternalTabled); + Self::inject_referendum( + now + T::VotingPeriod::get(), + proposal, + threshold, + T::EnactmentPeriod::get(), + )?; + Ok(()) + } else { + Err("No external proposal waiting") + } + } + + /// Table the waiting public proposal with the highest backing for a vote. + fn launch_public(now: T::BlockNumber) -> Result { let mut public_props = Self::public_props(); if let Some((winner_index, _)) = public_props.iter() .enumerate() - .max_by_key(|x| Self::locked_for((x.1).0).unwrap_or_else(Zero::zero)/*defensive only: All current public proposals have an amount locked*/) + .max_by_key(|x| Self::locked_for((x.1).0).unwrap_or_else(Zero::zero) + /* ^^ defensive only: All current public proposals have an amount locked*/) { let (prop_index, proposal, _) = public_props.swap_remove(winner_index); >::put(public_props); - if let Some((deposit, depositors)) = >::take(prop_index) {//: (BalanceOf, Vec) = + if let Some((deposit, depositors)) = >::take(prop_index) { // refund depositors for d in &depositors { T::Currency::unreserve(d, deposit); } Self::deposit_event(RawEvent::Tabled(prop_index, deposit, depositors)); - Self::inject_referendum(now + Self::voting_period(), proposal, VoteThreshold::SuperMajorityApprove, Self::public_delay())?; + Self::inject_referendum( + now + T::VotingPeriod::get(), + proposal, + VoteThreshold::SuperMajorityApprove, + T::EnactmentPeriod::get(), + )?; } + Ok(()) + } else { + Err("No public proposals waiting") } - Ok(()) } - fn bake_referendum(now: T::BlockNumber, index: ReferendumIndex, info: ReferendumInfo) -> Result { + fn bake_referendum( + now: T::BlockNumber, + index: ReferendumIndex, + info: ReferendumInfo + ) -> Result { let (approve, against, capital) = Self::tally(index); let total_issuance = T::Currency::total_issuance(); let approved = info.threshold.approved(approve, against, capital, total_issuance); - let lock_period = Self::public_delay(); // Logic defined in https://www.slideshare.net/gavofyork/governance-in-polkadot-poc3 // Essentially, we extend the lock-period of the coins behind the winning votes to be the // vote strength times the public delay period from now. - for (a, vote) in Self::voters_for(index).into_iter() + for (a, Vote { conviction, .. }) in Self::voters_for(index).into_iter() .map(|a| (a.clone(), Self::vote_of((index, a)))) - // ^^^ defensive only: all items come from `voters`; for an item to be in `voters` there must be a vote registered; qed - .filter(|&(_, vote)| vote.is_aye() == approved) // Just the winning coins + // ^^^ defensive only: all items come from `voters`; for an item to be in `voters` + // there must be a vote registered; qed + .filter(|&(_, vote)| vote.aye == approved) // Just the winning coins { - // now plus: the base lock period multiplied by the number of periods this voter offered to - // lock should they win... - let locked_until = now + lock_period * T::BlockNumber::sa((vote.multiplier()) as u64); + // now plus: the base lock period multiplied by the number of periods this voter + // offered to lock should they win... + let locked_until = now + T::EnactmentPeriod::get() * conviction.lock_periods().into(); // ...extend their bondage until at least then. - T::Currency::extend_lock(DEMOCRACY_ID, &a, Bounded::max_value(), locked_until, WithdrawReason::Transfer.into()); + T::Currency::extend_lock( + DEMOCRACY_ID, + &a, + Bounded::max_value(), + locked_until, + WithdrawReason::Transfer.into() + ); } Self::clear_referendum(index); @@ -480,7 +867,10 @@ impl Module { if info.delay.is_zero() { Self::enact_proposal(info.proposal, index); } else { - >::mutate(now + info.delay, |q| q.push(Some((info.proposal, index)))); + >::mutate( + now + info.delay, + |q| q.push(Some((info.proposal, index))) + ); } } else { Self::deposit_event(RawEvent::NotPassed(index)); @@ -491,14 +881,17 @@ impl Module { } /// Current era is ending; we should finish up any proposals. + // TODO: move to initialize_block #2779 fn end_block(now: T::BlockNumber) -> Result { // pick out another public referendum if it's time. - if (now % Self::launch_period()).is_zero() { - Self::launch_next(now.clone())?; + if (now % T::LaunchPeriod::get()).is_zero() { + // Errors come from the queue being empty. we don't really care about that, and even if + // we did, there is nothing we can do here. + let _ = Self::launch_next(now.clone()); } // tally up votes for any expiring referenda. - for (index, info) in Self::maturing_referendums_at(now).into_iter() { + for (index, info) in Self::maturing_referenda_at(now).into_iter() { Self::bake_referendum(now.clone(), index, info)?; } @@ -519,15 +912,21 @@ impl OnFreeBalanceZero for Module { mod tests { use super::*; use runtime_io::with_externalities; - use srml_support::{impl_outer_origin, impl_outer_dispatch, assert_noop, assert_ok}; + use srml_support::{ + impl_outer_origin, impl_outer_dispatch, assert_noop, assert_ok, parameter_types, + traits::Contains + }; use substrate_primitives::{H256, Blake2Hasher}; use primitives::BuildStorage; - use primitives::traits::{BlakeTwo256, IdentityLookup}; - use primitives::testing::{Digest, DigestItem, Header}; + use primitives::traits::{BlakeTwo256, IdentityLookup, Bounded}; + use primitives::testing::Header; use balances::BalanceLock; + use system::EnsureSignedBy; - const AYE: Vote = Vote(-1); - const NAY: Vote = Vote(0); + const AYE: Vote = Vote{ aye: true, conviction: Conviction::None }; + const NAY: Vote = Vote{ aye: false, conviction: Conviction::None }; + const BIG_AYE: Vote = Vote{ aye: true, conviction: Conviction::Locked1x }; + const BIG_NAY: Vote = Vote{ aye: false, conviction: Conviction::Locked1x }; impl_outer_origin! { pub enum Origin for Test {} @@ -549,12 +948,10 @@ mod tests { type BlockNumber = u64; type Hash = H256; type Hashing = BlakeTwo256; - type Digest = Digest; type AccountId = u64; type Lookup = IdentityLookup; type Header = Header; type Event = (); - type Log = DigestItem; } impl balances::Trait for Test { type Balance = u64; @@ -565,17 +962,43 @@ mod tests { type TransferPayment = (); type DustRemoval = (); } - impl Trait for Test { - type Currency = balances::Module; + parameter_types! { + pub const LaunchPeriod: u64 = 2; + pub const VotingPeriod: u64 = 2; + pub const EmergencyVotingPeriod: u64 = 1; + pub const MinimumDeposit: u64 = 1; + pub const EnactmentPeriod: u64 = 2; + pub const CooloffPeriod: u64 = 2; + pub const One: u64 = 1; + pub const Two: u64 = 2; + pub const Three: u64 = 3; + pub const Four: u64 = 4; + pub const Five: u64 = 5; + } + pub struct OneToFive; + impl Contains for OneToFive { + fn contains(n: &u64) -> bool { + *n >= 1 && *n <= 5 + } + } + impl super::Trait for Test { type Proposal = Call; type Event = (); + type Currency = balances::Module; + type EnactmentPeriod = EnactmentPeriod; + type LaunchPeriod = LaunchPeriod; + type VotingPeriod = VotingPeriod; + type EmergencyVotingPeriod = EmergencyVotingPeriod; + type MinimumDeposit = MinimumDeposit; + type EmergencyOrigin = EnsureSignedBy; + type ExternalOrigin = EnsureSignedBy; + type ExternalMajorityOrigin = EnsureSignedBy; + type CancellationOrigin = EnsureSignedBy; + type VetoOrigin = EnsureSignedBy; + type CooloffPeriod = CooloffPeriod; } fn new_test_ext() -> runtime_io::TestExternalities { - new_test_ext_with_public_delay(0) - } - - fn new_test_ext_with_public_delay(public_delay: u64) -> runtime_io::TestExternalities { let mut t = system::GenesisConfig::::default().build_storage().unwrap().0; t.extend(balances::GenesisConfig::{ transaction_base_fee: 0, @@ -586,13 +1009,7 @@ mod tests { creation_fee: 0, vesting: vec![], }.build_storage().unwrap().0); - t.extend(GenesisConfig::{ - launch_period: 1, - voting_period: 1, - minimum_deposit: 1, - public_delay, - max_lock_periods: 6, - }.build_storage().unwrap().0); + t.extend(GenesisConfig::::default().build_storage().unwrap().0); runtime_io::TestExternalities::new(t) } @@ -603,49 +1020,347 @@ mod tests { #[test] fn params_should_work() { with_externalities(&mut new_test_ext(), || { - assert_eq!(Democracy::launch_period(), 1); - assert_eq!(Democracy::voting_period(), 1); - assert_eq!(Democracy::minimum_deposit(), 1); assert_eq!(Democracy::referendum_count(), 0); assert_eq!(Balances::free_balance(&42), 0); assert_eq!(Balances::total_issuance(), 210); - assert_eq!(Democracy::public_delay(), 0); - assert_eq!(Democracy::max_lock_periods(), 6); }); } + fn set_balance_proposal(value: u64) -> Call { + Call::Balances(balances::Call::set_balance(42, value, 0)) + } + + fn propose_set_balance(who: u64, value: u64, delay: u64) -> super::Result { + Democracy::propose( + Origin::signed(who), + Box::new(set_balance_proposal(value)), + delay + ) + } + + fn next_block() { + assert_eq!(Democracy::end_block(System::block_number()), Ok(())); + System::set_block_number(System::block_number() + 1); + } + + fn fast_forward_to(n: u64) { + while System::block_number() < n { + next_block(); + } + } + #[test] - fn vote_should_work() { - assert_eq!(Vote::new(true, 0).multiplier(), 1); - assert_eq!(Vote::new(true, 1).multiplier(), 1); - assert_eq!(Vote::new(true, 2).multiplier(), 2); - assert_eq!(Vote::new(true, 0).is_aye(), true); - assert_eq!(Vote::new(true, 1).is_aye(), true); - assert_eq!(Vote::new(true, 2).is_aye(), true); - assert_eq!(Vote::new(false, 0).multiplier(), 1); - assert_eq!(Vote::new(false, 1).multiplier(), 1); - assert_eq!(Vote::new(false, 2).multiplier(), 2); - assert_eq!(Vote::new(false, 0).is_aye(), false); - assert_eq!(Vote::new(false, 1).is_aye(), false); - assert_eq!(Vote::new(false, 2).is_aye(), false); + fn external_and_public_interleaving_works() { + with_externalities(&mut new_test_ext(), || { + System::set_block_number(0); + assert_ok!(Democracy::external_propose( + Origin::signed(2), + Box::new(set_balance_proposal(1)), + )); + assert_ok!(propose_set_balance(6, 2, 2)); + + fast_forward_to(1); + + // both waiting: external goes first. + assert_eq!( + Democracy::referendum_info(0), + Some(ReferendumInfo { + end: 2, + proposal: set_balance_proposal(1), + threshold: VoteThreshold::SuperMajorityApprove, + delay: 2 + }) + ); + // replenish external + assert_ok!(Democracy::external_propose( + Origin::signed(2), + Box::new(set_balance_proposal(3)), + )); + + fast_forward_to(3); + + // both waiting: public goes next. + assert_eq!( + Democracy::referendum_info(1), + Some(ReferendumInfo { + end: 4, + proposal: set_balance_proposal(2), + threshold: VoteThreshold::SuperMajorityApprove, + delay: 2 + }) + ); + // don't replenish public + + fast_forward_to(5); + + // it's external "turn" again, though since public is empty that doesn't really matter + assert_eq!( + Democracy::referendum_info(2), + Some(ReferendumInfo { + end: 6, + proposal: set_balance_proposal(3), + threshold: VoteThreshold::SuperMajorityApprove, + delay: 2 + }) + ); + // replenish external + assert_ok!(Democracy::external_propose( + Origin::signed(2), + Box::new(set_balance_proposal(5)), + )); + + fast_forward_to(7); + + // external goes again because there's no public waiting. + assert_eq!( + Democracy::referendum_info(3), + Some(ReferendumInfo { + end: 8, + proposal: set_balance_proposal(5), + threshold: VoteThreshold::SuperMajorityApprove, + delay: 2 + }) + ); + // replenish both + assert_ok!(Democracy::external_propose( + Origin::signed(2), + Box::new(set_balance_proposal(7)), + )); + assert_ok!(propose_set_balance(6, 4, 2)); + + fast_forward_to(9); + + // public goes now since external went last time. + assert_eq!( + Democracy::referendum_info(4), + Some(ReferendumInfo { + end: 10, + proposal: set_balance_proposal(4), + threshold: VoteThreshold::SuperMajorityApprove, + delay: 2 + }) + ); + // replenish public again + assert_ok!(propose_set_balance(6, 6, 2)); + // cancel external + let h = BlakeTwo256::hash_of(&set_balance_proposal(7)); + assert_ok!(Democracy::veto_external(Origin::signed(3), h)); + + fast_forward_to(11); + + // public goes again now since there's no external waiting. + assert_eq!( + Democracy::referendum_info(5), + Some(ReferendumInfo { + end: 12, + proposal: set_balance_proposal(6), + threshold: VoteThreshold::SuperMajorityApprove, + delay: 2 + }) + ); + }); } + #[test] - fn invalid_vote_strength_should_not_work() { + fn emergency_cancel_should_work() { with_externalities(&mut new_test_ext(), || { - System::set_block_number(1); - let r = Democracy::inject_referendum(1, set_balance_proposal(2), VoteThreshold::SuperMajorityApprove, 0).unwrap(); - assert_noop!(Democracy::vote(Origin::signed(1), r, Vote::new(true, 7)), "vote has too great a strength"); - assert_noop!(Democracy::vote(Origin::signed(1), r, Vote::new(false, 7)), "vote has too great a strength"); + System::set_block_number(0); + let r = Democracy::inject_referendum( + 2, + set_balance_proposal(2), + VoteThreshold::SuperMajorityApprove, + 2 + ).unwrap(); + assert!(Democracy::referendum_info(r).is_some()); + + assert_noop!(Democracy::emergency_cancel(Origin::signed(3), r), "Invalid origin"); + assert_ok!(Democracy::emergency_cancel(Origin::signed(4), r)); + assert!(Democracy::referendum_info(r).is_none()); + + // some time later... + + let r = Democracy::inject_referendum( + 2, + set_balance_proposal(2), + VoteThreshold::SuperMajorityApprove, + 2 + ).unwrap(); + assert!(Democracy::referendum_info(r).is_some()); + assert_noop!(Democracy::emergency_cancel(Origin::signed(4), r), "cannot cancel the same proposal twice"); }); } - fn set_balance_proposal(value: u64) -> Call { - Call::Balances(balances::Call::set_balance(42, value.into(), 0)) + #[test] + fn veto_external_works() { + with_externalities(&mut new_test_ext(), || { + System::set_block_number(0); + assert_ok!(Democracy::external_propose( + Origin::signed(2), + Box::new(set_balance_proposal(2)), + )); + assert!(>::exists()); + + let h = BlakeTwo256::hash_of(&set_balance_proposal(2)); + assert_ok!(Democracy::veto_external(Origin::signed(3), h.clone())); + // cancelled. + assert!(!>::exists()); + // fails - same proposal can't be resubmitted. + assert_noop!(Democracy::external_propose( + Origin::signed(2), + Box::new(set_balance_proposal(2)), + ), "proposal still blacklisted"); + + fast_forward_to(1); + // fails as we're still in cooloff period. + assert_noop!(Democracy::external_propose( + Origin::signed(2), + Box::new(set_balance_proposal(2)), + ), "proposal still blacklisted"); + + fast_forward_to(2); + // works; as we're out of the cooloff period. + assert_ok!(Democracy::external_propose( + Origin::signed(2), + Box::new(set_balance_proposal(2)), + )); + assert!(>::exists()); + + // 3 can't veto the same thing twice. + assert_noop!( + Democracy::veto_external(Origin::signed(3), h.clone()), + "identity may not veto a proposal twice" + ); + + // 4 vetoes. + assert_ok!(Democracy::veto_external(Origin::signed(4), h.clone())); + // cancelled again. + assert!(!>::exists()); + + fast_forward_to(3); + // same proposal fails as we're still in cooloff + assert_noop!(Democracy::external_propose( + Origin::signed(2), + Box::new(set_balance_proposal(2)), + ), "proposal still blacklisted"); + // different proposal works fine. + assert_ok!(Democracy::external_propose( + Origin::signed(2), + Box::new(set_balance_proposal(3)), + )); + }); + } + + #[test] + fn emergency_referendum_works() { + with_externalities(&mut new_test_ext(), || { + System::set_block_number(0); + assert_noop!(Democracy::emergency_propose( + Origin::signed(6), // invalid + Box::new(set_balance_proposal(2)), + VoteThreshold::SuperMajorityAgainst, + 0, + 0, + ), "bad origin: expected to be a root origin"); + assert_ok!(Democracy::emergency_propose( + Origin::signed(1), + Box::new(set_balance_proposal(2)), + VoteThreshold::SuperMajorityAgainst, + 0, + 0, + )); + assert_eq!( + Democracy::referendum_info(0), + Some(ReferendumInfo { + end: 1, + proposal: set_balance_proposal(2), + threshold: VoteThreshold::SuperMajorityAgainst, + delay: 0 + }) + ); + + assert_ok!(Democracy::vote(Origin::signed(1), 0, AYE)); + fast_forward_to(1); + assert_eq!(Balances::free_balance(&42), 0); + fast_forward_to(2); + assert_eq!(Balances::free_balance(&42), 2); + + assert_ok!(Democracy::emergency_propose( + Origin::signed(1), + Box::new(set_balance_proposal(4)), + VoteThreshold::SuperMajorityAgainst, + 3, + 3 + )); + assert_eq!( + Democracy::referendum_info(1), + Some(ReferendumInfo { + end: 5, + proposal: set_balance_proposal(4), + threshold: VoteThreshold::SuperMajorityAgainst, + delay: 3 + }) + ); + assert_ok!(Democracy::vote(Origin::signed(1), 1, AYE)); + fast_forward_to(8); + assert_eq!(Balances::free_balance(&42), 2); + fast_forward_to(9); + assert_eq!(Balances::free_balance(&42), 4); + }); } - fn propose_set_balance(who: u64, value: u64, locked: u64) -> super::Result { - Democracy::propose(Origin::signed(who), Box::new(set_balance_proposal(value)), locked.into()) + #[test] + fn external_referendum_works() { + with_externalities(&mut new_test_ext(), || { + System::set_block_number(0); + assert_noop!(Democracy::external_propose( + Origin::signed(1), + Box::new(set_balance_proposal(2)), + ), "Invalid origin"); + assert_ok!(Democracy::external_propose( + Origin::signed(2), + Box::new(set_balance_proposal(2)), + )); + assert_noop!(Democracy::external_propose( + Origin::signed(2), + Box::new(set_balance_proposal(1)), + ), "proposal already made"); + fast_forward_to(1); + assert_eq!( + Democracy::referendum_info(0), + Some(ReferendumInfo { + end: 2, + proposal: set_balance_proposal(2), + threshold: VoteThreshold::SuperMajorityApprove, + delay: 2 + }) + ); + }); + } + + #[test] + fn external_majority_referendum_works() { + with_externalities(&mut new_test_ext(), || { + System::set_block_number(0); + assert_noop!(Democracy::external_propose_majority( + Origin::signed(1), + Box::new(set_balance_proposal(2)) + ), "Invalid origin"); + assert_ok!(Democracy::external_propose_majority( + Origin::signed(3), + Box::new(set_balance_proposal(2)) + )); + fast_forward_to(1); + assert_eq!( + Democracy::referendum_info(0), + Some(ReferendumInfo { + end: 2, + proposal: set_balance_proposal(2), + threshold: VoteThreshold::SimpleMajority, + delay: 2, + }) + ); + }); } #[test] @@ -664,24 +1379,74 @@ mod tests { #[test] fn single_proposal_should_work() { with_externalities(&mut new_test_ext(), || { - System::set_block_number(1); + System::set_block_number(0); assert_ok!(propose_set_balance(1, 2, 1)); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); + assert!(Democracy::referendum_info(0).is_none()); + + // end of 0 => next referendum scheduled. + fast_forward_to(1); - System::set_block_number(2); let r = 0; assert_ok!(Democracy::vote(Origin::signed(1), r, AYE)); assert_eq!(Democracy::referendum_count(), 1); + assert_eq!( + Democracy::referendum_info(0), + Some(ReferendumInfo { + end: 2, + proposal: set_balance_proposal(2), + threshold: VoteThreshold::SuperMajorityApprove, + delay: 2 + }) + ); assert_eq!(Democracy::voters_for(r), vec![1]); assert_eq!(Democracy::vote_of((r, 1)), AYE); - assert_eq!(Democracy::tally(r), (10, 0, 10)); + assert_eq!(Democracy::tally(r), (1, 0, 1)); + + fast_forward_to(2); + + // referendum still running + assert!(Democracy::referendum_info(0).is_some()); + + // referendum runs during 1 and 2, ends @ end of 2. + fast_forward_to(3); + + assert!(Democracy::referendum_info(0).is_none()); + assert_eq!(Democracy::dispatch_queue(4), vec![ + Some((set_balance_proposal(2), 0)) + ]); + + // referendum passes and wait another two blocks for enactment. + fast_forward_to(5); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); assert_eq!(Balances::free_balance(&42), 2); }); } + #[test] + fn cancel_queued_should_work() { + with_externalities(&mut new_test_ext(), || { + System::set_block_number(0); + assert_ok!(propose_set_balance(1, 2, 1)); + + // end of 0 => next referendum scheduled. + fast_forward_to(1); + + assert_ok!(Democracy::vote(Origin::signed(1), 0, AYE)); + + fast_forward_to(3); + + assert_eq!(Democracy::dispatch_queue(4), vec![ + Some((set_balance_proposal(2), 0)) + ]); + + assert_noop!(Democracy::cancel_queued(3, 0, 0), "proposal not found"); + assert_noop!(Democracy::cancel_queued(4, 1, 0), "proposal not found"); + assert_ok!(Democracy::cancel_queued(4, 0, 0)); + assert_eq!(Democracy::dispatch_queue(4), vec![None]); + }); + } + #[test] fn proxy_should_work() { with_externalities(&mut new_test_ext(), || { @@ -715,21 +1480,19 @@ mod tests { #[test] fn single_proposal_should_work_with_proxy() { with_externalities(&mut new_test_ext(), || { - System::set_block_number(1); + System::set_block_number(0); assert_ok!(propose_set_balance(1, 2, 1)); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); - System::set_block_number(2); + fast_forward_to(1); let r = 0; assert_ok!(Democracy::set_proxy(Origin::signed(1), 10)); assert_ok!(Democracy::proxy_vote(Origin::signed(10), r, AYE)); - assert_eq!(Democracy::referendum_count(), 1); assert_eq!(Democracy::voters_for(r), vec![1]); assert_eq!(Democracy::vote_of((r, 1)), AYE); - assert_eq!(Democracy::tally(r), (10, 0, 10)); + assert_eq!(Democracy::tally(r), (1, 0, 1)); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); + fast_forward_to(5); assert_eq!(Balances::free_balance(&42), 2); }); } @@ -737,27 +1500,23 @@ mod tests { #[test] fn single_proposal_should_work_with_delegation() { with_externalities(&mut new_test_ext(), || { - System::set_block_number(1); + System::set_block_number(0); assert_ok!(propose_set_balance(1, 2, 1)); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); - System::set_block_number(2); - let r = 0; + fast_forward_to(1); // Delegate vote. - assert_ok!(Democracy::delegate(Origin::signed(2), 1, 100)); + assert_ok!(Democracy::delegate(Origin::signed(2), 1, Conviction::max_value())); + let r = 0; assert_ok!(Democracy::vote(Origin::signed(1), r, AYE)); - - assert_eq!(Democracy::referendum_count(), 1); assert_eq!(Democracy::voters_for(r), vec![1]); assert_eq!(Democracy::vote_of((r, 1)), AYE); - // Delegated vote is counted. - assert_eq!(Democracy::tally(r), (30, 0, 30)); + assert_eq!(Democracy::tally(r), (3, 0, 3)); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); + fast_forward_to(5); assert_eq!(Balances::free_balance(&42), 2); }); @@ -766,27 +1525,24 @@ mod tests { #[test] fn single_proposal_should_work_with_cyclic_delegation() { with_externalities(&mut new_test_ext(), || { - System::set_block_number(1); + System::set_block_number(0); assert_ok!(propose_set_balance(1, 2, 1)); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); - System::set_block_number(2); - let r = 0; + fast_forward_to(1); // Check behavior with cycle. - assert_ok!(Democracy::delegate(Origin::signed(2), 1, 100)); - assert_ok!(Democracy::delegate(Origin::signed(3), 2, 100)); - assert_ok!(Democracy::delegate(Origin::signed(1), 3, 100)); - + assert_ok!(Democracy::delegate(Origin::signed(2), 1, Conviction::max_value())); + assert_ok!(Democracy::delegate(Origin::signed(3), 2, Conviction::max_value())); + assert_ok!(Democracy::delegate(Origin::signed(1), 3, Conviction::max_value())); + let r = 0; assert_ok!(Democracy::vote(Origin::signed(1), r, AYE)); - - assert_eq!(Democracy::referendum_count(), 1); assert_eq!(Democracy::voters_for(r), vec![1]); // Delegated vote is counted. - assert_eq!(Democracy::tally(r), (60, 0, 60)); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); + assert_eq!(Democracy::tally(r), (6, 0, 6)); + + fast_forward_to(5); assert_eq!(Balances::free_balance(&42), 2); }); @@ -796,30 +1552,24 @@ mod tests { /// If transactor already voted, delegated vote is overwriten. fn single_proposal_should_work_with_vote_and_delegation() { with_externalities(&mut new_test_ext(), || { - System::set_block_number(1); + System::set_block_number(0); assert_ok!(propose_set_balance(1, 2, 1)); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); - System::set_block_number(2); - let r = 0; + fast_forward_to(1); + let r = 0; assert_ok!(Democracy::vote(Origin::signed(1), r, AYE)); - // Vote. assert_ok!(Democracy::vote(Origin::signed(2), r, AYE)); - // Delegate vote. - assert_ok!(Democracy::delegate(Origin::signed(2), 1, 100)); - - assert_eq!(Democracy::referendum_count(), 1); + assert_ok!(Democracy::delegate(Origin::signed(2), 1, Conviction::max_value())); assert_eq!(Democracy::voters_for(r), vec![1, 2]); assert_eq!(Democracy::vote_of((r, 1)), AYE); - // Delegated vote is not counted. - assert_eq!(Democracy::tally(r), (30, 0, 30)); + assert_eq!(Democracy::tally(r), (3, 0, 3)); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); + fast_forward_to(5); assert_eq!(Balances::free_balance(&42), 2); }); @@ -828,16 +1578,15 @@ mod tests { #[test] fn single_proposal_should_work_with_undelegation() { with_externalities(&mut new_test_ext(), || { - System::set_block_number(1); + System::set_block_number(0); assert_ok!(propose_set_balance(1, 2, 1)); // Delegate and undelegate vote. - assert_ok!(Democracy::delegate(Origin::signed(2), 1, 100)); + assert_ok!(Democracy::delegate(Origin::signed(2), 1, Conviction::max_value())); assert_ok!(Democracy::undelegate(Origin::signed(2))); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); - System::set_block_number(2); + fast_forward_to(1); let r = 0; assert_ok!(Democracy::vote(Origin::signed(1), r, AYE)); @@ -846,9 +1595,9 @@ mod tests { assert_eq!(Democracy::vote_of((r, 1)), AYE); // Delegated vote is not counted. - assert_eq!(Democracy::tally(r), (10, 0, 10)); + assert_eq!(Democracy::tally(r), (1, 0, 1)); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); + fast_forward_to(5); assert_eq!(Balances::free_balance(&42), 2); }); @@ -858,18 +1607,17 @@ mod tests { /// If transactor voted, delegated vote is overwriten. fn single_proposal_should_work_with_delegation_and_vote() { with_externalities(&mut new_test_ext(), || { - System::set_block_number(1); + System::set_block_number(0); assert_ok!(propose_set_balance(1, 2, 1)); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); - System::set_block_number(2); + fast_forward_to(1); let r = 0; assert_ok!(Democracy::vote(Origin::signed(1), r, AYE)); // Delegate vote. - assert_ok!(Democracy::delegate(Origin::signed(2), 1, 100)); + assert_ok!(Democracy::delegate(Origin::signed(2), 1, Conviction::max_value())); // Vote. assert_ok!(Democracy::vote(Origin::signed(2), r, AYE)); @@ -879,9 +1627,9 @@ mod tests { assert_eq!(Democracy::vote_of((r, 1)), AYE); // Delegated vote is not counted. - assert_eq!(Democracy::tally(r), (30, 0, 30)); + assert_eq!(Democracy::tally(r), (3, 0, 3)); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); + fast_forward_to(5); assert_eq!(Balances::free_balance(&42), 2); }); @@ -911,7 +1659,7 @@ mod tests { assert_ok!(Democracy::second(Origin::signed(5), 0)); assert_ok!(Democracy::second(Origin::signed(5), 0)); assert_ok!(Democracy::second(Origin::signed(5), 0)); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); + fast_forward_to(3); assert_eq!(Balances::free_balance(&1), 10); assert_eq!(Balances::free_balance(&2), 20); assert_eq!(Balances::free_balance(&5), 50); @@ -950,21 +1698,12 @@ mod tests { assert_ok!(propose_set_balance(1, 2, 2)); assert_ok!(propose_set_balance(1, 4, 4)); assert_ok!(propose_set_balance(1, 3, 3)); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); - - System::set_block_number(1); + fast_forward_to(1); assert_ok!(Democracy::vote(Origin::signed(1), 0, AYE)); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); - assert_eq!(Balances::free_balance(&42), 4); - - System::set_block_number(2); + fast_forward_to(3); assert_ok!(Democracy::vote(Origin::signed(1), 1, AYE)); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); - assert_eq!(Balances::free_balance(&42), 3); - - System::set_block_number(3); + fast_forward_to(5); assert_ok!(Democracy::vote(Origin::signed(1), 2, AYE)); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); }); } @@ -972,14 +1711,20 @@ mod tests { fn simple_passing_should_work() { with_externalities(&mut new_test_ext(), || { System::set_block_number(1); - let r = Democracy::inject_referendum(1, set_balance_proposal(2), VoteThreshold::SuperMajorityApprove, 0).unwrap(); + let r = Democracy::inject_referendum( + 1, + set_balance_proposal(2), + VoteThreshold::SuperMajorityApprove, + 0 + ).unwrap(); assert_ok!(Democracy::vote(Origin::signed(1), r, AYE)); assert_eq!(Democracy::voters_for(r), vec![1]); assert_eq!(Democracy::vote_of((r, 1)), AYE); - assert_eq!(Democracy::tally(r), (10, 0, 10)); + assert_eq!(Democracy::tally(r), (1, 0, 1)); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); + next_block(); + next_block(); assert_eq!(Balances::free_balance(&42), 2); }); @@ -989,11 +1734,17 @@ mod tests { fn cancel_referendum_should_work() { with_externalities(&mut new_test_ext(), || { System::set_block_number(1); - let r = Democracy::inject_referendum(1, set_balance_proposal(2), VoteThreshold::SuperMajorityApprove, 0).unwrap(); + let r = Democracy::inject_referendum( + 1, + set_balance_proposal(2), + VoteThreshold::SuperMajorityApprove, + 0 + ).unwrap(); assert_ok!(Democracy::vote(Origin::signed(1), r, AYE)); assert_ok!(Democracy::cancel_referendum(r.into())); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); + next_block(); + next_block(); assert_eq!(Balances::free_balance(&42), 0); }); @@ -1003,14 +1754,20 @@ mod tests { fn simple_failing_should_work() { with_externalities(&mut new_test_ext(), || { System::set_block_number(1); - let r = Democracy::inject_referendum(1, set_balance_proposal(2), VoteThreshold::SuperMajorityApprove, 0).unwrap(); + let r = Democracy::inject_referendum( + 1, + set_balance_proposal(2), + VoteThreshold::SuperMajorityApprove, + 0 + ).unwrap(); assert_ok!(Democracy::vote(Origin::signed(1), r, NAY)); assert_eq!(Democracy::voters_for(r), vec![1]); assert_eq!(Democracy::vote_of((r, 1)), NAY); - assert_eq!(Democracy::tally(r), (0, 10, 10)); + assert_eq!(Democracy::tally(r), (0, 1, 1)); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); + next_block(); + next_block(); assert_eq!(Balances::free_balance(&42), 0); }); @@ -1020,17 +1777,23 @@ mod tests { fn controversial_voting_should_work() { with_externalities(&mut new_test_ext(), || { System::set_block_number(1); - let r = Democracy::inject_referendum(1, set_balance_proposal(2), VoteThreshold::SuperMajorityApprove, 0).unwrap(); - assert_ok!(Democracy::vote(Origin::signed(1), r, AYE)); - assert_ok!(Democracy::vote(Origin::signed(2), r, NAY)); - assert_ok!(Democracy::vote(Origin::signed(3), r, NAY)); - assert_ok!(Democracy::vote(Origin::signed(4), r, AYE)); - assert_ok!(Democracy::vote(Origin::signed(5), r, NAY)); - assert_ok!(Democracy::vote(Origin::signed(6), r, AYE)); + let r = Democracy::inject_referendum( + 1, + set_balance_proposal(2), + VoteThreshold::SuperMajorityApprove, + 0 + ).unwrap(); + assert_ok!(Democracy::vote(Origin::signed(1), r, BIG_AYE)); + assert_ok!(Democracy::vote(Origin::signed(2), r, BIG_NAY)); + assert_ok!(Democracy::vote(Origin::signed(3), r, BIG_NAY)); + assert_ok!(Democracy::vote(Origin::signed(4), r, BIG_AYE)); + assert_ok!(Democracy::vote(Origin::signed(5), r, BIG_NAY)); + assert_ok!(Democracy::vote(Origin::signed(6), r, BIG_AYE)); assert_eq!(Democracy::tally(r), (110, 100, 210)); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); + next_block(); + next_block(); assert_eq!(Balances::free_balance(&42), 2); }); @@ -1040,7 +1803,12 @@ mod tests { fn delayed_enactment_should_work() { with_externalities(&mut new_test_ext(), || { System::set_block_number(1); - let r = Democracy::inject_referendum(1, set_balance_proposal(2), VoteThreshold::SuperMajorityApprove, 1).unwrap(); + let r = Democracy::inject_referendum( + 1, + set_balance_proposal(2), + VoteThreshold::SuperMajorityApprove, + 1 + ).unwrap(); assert_ok!(Democracy::vote(Origin::signed(1), r, AYE)); assert_ok!(Democracy::vote(Origin::signed(2), r, AYE)); assert_ok!(Democracy::vote(Origin::signed(3), r, AYE)); @@ -1048,102 +1816,157 @@ mod tests { assert_ok!(Democracy::vote(Origin::signed(5), r, AYE)); assert_ok!(Democracy::vote(Origin::signed(6), r, AYE)); - assert_eq!(Democracy::tally(r), (210, 0, 210)); + assert_eq!(Democracy::tally(r), (21, 0, 21)); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); + next_block(); assert_eq!(Balances::free_balance(&42), 0); - System::set_block_number(2); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); + next_block(); assert_eq!(Balances::free_balance(&42), 2); }); } #[test] - fn lock_voting_should_work() { - with_externalities(&mut new_test_ext_with_public_delay(1), || { + fn controversial_low_turnout_voting_should_work() { + with_externalities(&mut new_test_ext(), || { System::set_block_number(1); - let r = Democracy::inject_referendum(1, set_balance_proposal(2), VoteThreshold::SuperMajorityApprove, 0).unwrap(); - assert_ok!(Democracy::vote(Origin::signed(1), r, Vote::new(false, 6))); - assert_ok!(Democracy::vote(Origin::signed(2), r, Vote::new(true, 5))); - assert_ok!(Democracy::vote(Origin::signed(3), r, Vote::new(true, 4))); - assert_ok!(Democracy::vote(Origin::signed(4), r, Vote::new(true, 3))); - assert_ok!(Democracy::vote(Origin::signed(5), r, Vote::new(true, 2))); - assert_ok!(Democracy::vote(Origin::signed(6), r, Vote::new(false, 1))); + let r = Democracy::inject_referendum( + 1, + set_balance_proposal(2), + VoteThreshold::SuperMajorityApprove, + 0 + ).unwrap(); + assert_ok!(Democracy::vote(Origin::signed(5), r, BIG_NAY)); + assert_ok!(Democracy::vote(Origin::signed(6), r, BIG_AYE)); - assert_eq!(Democracy::tally(r), (440, 120, 210)); - - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); - - assert_eq!(Balances::locks(1), vec![]); - assert_eq!(Balances::locks(2), vec![BalanceLock { id: DEMOCRACY_ID, amount: u64::max_value(), until: 6, reasons: WithdrawReason::Transfer.into() }]); - assert_eq!(Balances::locks(3), vec![BalanceLock { id: DEMOCRACY_ID, amount: u64::max_value(), until: 5, reasons: WithdrawReason::Transfer.into() }]); - assert_eq!(Balances::locks(4), vec![BalanceLock { id: DEMOCRACY_ID, amount: u64::max_value(), until: 4, reasons: WithdrawReason::Transfer.into() }]); - assert_eq!(Balances::locks(5), vec![BalanceLock { id: DEMOCRACY_ID, amount: u64::max_value(), until: 3, reasons: WithdrawReason::Transfer.into() }]); - assert_eq!(Balances::locks(6), vec![]); + assert_eq!(Democracy::tally(r), (60, 50, 110)); - System::set_block_number(2); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); + next_block(); + next_block(); - assert_eq!(Balances::free_balance(&42), 2); + assert_eq!(Balances::free_balance(&42), 0); }); } #[test] - fn lock_voting_should_work_with_delegation() { - with_externalities(&mut new_test_ext_with_public_delay(1), || { - System::set_block_number(1); - let r = Democracy::inject_referendum(1, set_balance_proposal(2), VoteThreshold::SuperMajorityApprove, 0).unwrap(); - assert_ok!(Democracy::vote(Origin::signed(1), r, Vote::new(false, 6))); - assert_ok!(Democracy::vote(Origin::signed(2), r, Vote::new(true, 5))); - assert_ok!(Democracy::vote(Origin::signed(3), r, Vote::new(true, 4))); - assert_ok!(Democracy::vote(Origin::signed(4), r, Vote::new(true, 3))); - assert_ok!(Democracy::delegate(Origin::signed(5), 2, 2)); - assert_ok!(Democracy::vote(Origin::signed(6), r, Vote::new(false, 1))); + fn passing_low_turnout_voting_should_work() { + with_externalities(&mut new_test_ext(), || { + assert_eq!(Balances::free_balance(&42), 0); + assert_eq!(Balances::total_issuance(), 210); - assert_eq!(Democracy::tally(r), (440, 120, 210)); + System::set_block_number(1); + let r = Democracy::inject_referendum( + 1, + set_balance_proposal(2), + VoteThreshold::SuperMajorityApprove, + 0 + ).unwrap(); + assert_ok!(Democracy::vote(Origin::signed(4), r, BIG_AYE)); + assert_ok!(Democracy::vote(Origin::signed(5), r, BIG_NAY)); + assert_ok!(Democracy::vote(Origin::signed(6), r, BIG_AYE)); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); + assert_eq!(Democracy::tally(r), (100, 50, 150)); - System::set_block_number(2); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); + next_block(); + next_block(); assert_eq!(Balances::free_balance(&42), 2); }); } #[test] - fn controversial_low_turnout_voting_should_work() { + fn lock_voting_should_work() { with_externalities(&mut new_test_ext(), || { - System::set_block_number(1); - let r = Democracy::inject_referendum(1, set_balance_proposal(2), VoteThreshold::SuperMajorityApprove, 0).unwrap(); - assert_ok!(Democracy::vote(Origin::signed(5), r, NAY)); - assert_ok!(Democracy::vote(Origin::signed(6), r, AYE)); - - assert_eq!(Democracy::tally(r), (60, 50, 110)); + System::set_block_number(0); + let r = Democracy::inject_referendum( + 1, + set_balance_proposal(2), + VoteThreshold::SuperMajorityApprove, + 0 + ).unwrap(); + assert_ok!(Democracy::vote(Origin::signed(1), r, Vote { + aye: false, + conviction: Conviction::Locked5x + })); + assert_ok!(Democracy::vote(Origin::signed(2), r, Vote { + aye: true, + conviction: Conviction::Locked4x + })); + assert_ok!(Democracy::vote(Origin::signed(3), r, Vote { + aye: true, + conviction: Conviction::Locked3x + })); + assert_ok!(Democracy::vote(Origin::signed(4), r, Vote { + aye: true, + conviction: Conviction::Locked2x + })); + assert_ok!(Democracy::vote(Origin::signed(5), r, Vote { + aye: false, + conviction: Conviction::Locked1x + })); + + assert_eq!(Democracy::tally(r), (250, 100, 150)); + + fast_forward_to(2); - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); + assert_eq!(Balances::locks(1), vec![]); + assert_eq!(Balances::locks(2), vec![BalanceLock { + id: DEMOCRACY_ID, + amount: u64::max_value(), + until: 17, + reasons: WithdrawReason::Transfer.into() + }]); + assert_eq!(Balances::locks(3), vec![BalanceLock { + id: DEMOCRACY_ID, + amount: u64::max_value(), + until: 9, + reasons: WithdrawReason::Transfer.into() + }]); + assert_eq!(Balances::locks(4), vec![BalanceLock { + id: DEMOCRACY_ID, + amount: u64::max_value(), + until: 5, + reasons: WithdrawReason::Transfer.into() + }]); + assert_eq!(Balances::locks(5), vec![]); - assert_eq!(Balances::free_balance(&42), 0); + assert_eq!(Balances::free_balance(&42), 2); }); } #[test] - fn passing_low_turnout_voting_should_work() { + fn lock_voting_should_work_with_delegation() { with_externalities(&mut new_test_ext(), || { - assert_eq!(Balances::free_balance(&42), 0); - assert_eq!(Balances::total_issuance(), 210); - System::set_block_number(1); - let r = Democracy::inject_referendum(1, set_balance_proposal(2), VoteThreshold::SuperMajorityApprove, 0).unwrap(); - assert_ok!(Democracy::vote(Origin::signed(4), r, AYE)); - assert_ok!(Democracy::vote(Origin::signed(5), r, NAY)); - assert_ok!(Democracy::vote(Origin::signed(6), r, AYE)); - - assert_eq!(Democracy::tally(r), (100, 50, 150)); - - assert_eq!(Democracy::end_block(System::block_number()), Ok(())); + let r = Democracy::inject_referendum( + 1, + set_balance_proposal(2), + VoteThreshold::SuperMajorityApprove, + 0 + ).unwrap(); + assert_ok!(Democracy::vote(Origin::signed(1), r, Vote { + aye: false, + conviction: Conviction::Locked5x + })); + assert_ok!(Democracy::vote(Origin::signed(2), r, Vote { + aye: true, + conviction: Conviction::Locked4x + })); + assert_ok!(Democracy::vote(Origin::signed(3), r, Vote { + aye: true, + conviction: Conviction::Locked3x + })); + assert_ok!(Democracy::delegate(Origin::signed(4), 2, Conviction::Locked2x)); + assert_ok!(Democracy::vote(Origin::signed(5), r, Vote { + aye: false, + conviction: Conviction::Locked1x + })); + + assert_eq!(Democracy::tally(r), (250, 100, 150)); + + next_block(); + next_block(); assert_eq!(Balances::free_balance(&42), 2); }); diff --git a/srml/example/Cargo.toml b/srml/example/Cargo.toml index 7601a799f81c72564de689121f2b649b3083b734..44a6a85e47e0f0c408bba993990f6f5f1b804663 100644 --- a/srml/example/Cargo.toml +++ b/srml/example/Cargo.toml @@ -10,11 +10,11 @@ parity-codec = { version = "3.3", default-features = false } srml-support = { path = "../support", default-features = false } system = { package = "srml-system", path = "../system", default-features = false } balances = { package = "srml-balances", path = "../balances", default-features = false } +sr-primitives = { path = "../../core/sr-primitives", default-features = false } [dev-dependencies] sr-io = { path = "../../core/sr-io" } substrate-primitives = { path = "../../core/primitives" } -sr-primitives = { path = "../../core/sr-primitives" } [features] default = ["std"] diff --git a/srml/example/src/lib.rs b/srml/example/src/lib.rs index 33c023ee8a669e3eed5a7d3798179c48895c0935..dd14b7198acd3aee381228b1064bfdd0c75279bc 100644 --- a/srml/example/src/lib.rs +++ b/srml/example/src/lib.rs @@ -16,7 +16,7 @@ //! # Example Module //! -//! +//! //! The Example: A simple example of a runtime module demonstrating //! concepts, APIs and structures common to most runtime modules. //! @@ -27,27 +27,30 @@ //! //! //!

//! //! ### Documentation Template:
//! -//! Copy and paste this template from srml/example/src/lib.rs into file srml//src/lib.rs of -//! your own custom module and complete it. +//! Copy and paste this template from srml/example/src/lib.rs into file +//! `srml//src/lib.rs` of your own custom module and complete it. //!

 //! // Add heading with custom module name
 //!
@@ -64,7 +67,7 @@
 //!
 //! \## Overview
 //!
-//!  
+//! 
 //! // Short description of module purpose.
 //! // Links to Traits that should be implemented.
 //! // What this module is for.
@@ -196,7 +199,8 @@
 //!
 //! \## Usage
 //!
-//! // Insert 2-3 examples of usage and code snippets that show how to use  module in a custom module.
+//! // Insert 2-3 examples of usage and code snippets that show how to
+//! // use  module in a custom module.
 //!
 //! \### Prerequisites
 //!
@@ -205,7 +209,7 @@
 //!
 //! \```rust
 //! use ;
-//! 
+//!
 //! pub trait Trait: ::Trait { }
 //! \```
 //!
@@ -251,6 +255,7 @@
 
 use srml_support::{StorageValue, dispatch::Result, decl_module, decl_storage, decl_event};
 use system::ensure_signed;
+use sr_primitives::weights::TransactionWeight;
 
 /// Our module's configuration trait. All our types and consts go in here. If the
 /// module is dependent on specific other modules, then their configuration traits
@@ -323,8 +328,10 @@ decl_event!(
 // - Public calls that are signed by an external account.
 // - Root calls that are allowed to be made only by the governance system.
 // - Unsigned calls that can be of two kinds:
-//   * "Inherent extrinsics" that are opinions generally held by the block authors that build child blocks.
-//   * Unsigned Transactions that are of intrinsic recognisable utility to the network, and are validated by the runtime.
+//   * "Inherent extrinsics" that are opinions generally held by the block
+//     authors that build child blocks.
+//   * Unsigned Transactions that are of intrinsic recognisable utility to the
+//     network, and are validated by the runtime.
 //
 // Information about where this dispatch initiated from is provided as the first argument
 // "origin". As such functions must always look like:
@@ -388,6 +395,20 @@ decl_module! {
 		// no progress.
 		//
 		// If you don't respect these rules, it is likely that your chain will be attackable.
+		//
+		// Each transaction can optionally indicate a weight. The weight is passed in as a
+		// custom attribute and the value can be anything that implements the `Weighable`
+		// trait. Most often using substrate's default `TransactionWeight` is enough for you.
+		//
+		// A basic weight is a tuple of `(base_weight, byte_weight)`. Upon including each transaction
+		// in a block, the final weight is calculated as `base_weight + byte_weight * tx_size`.
+		// If this value, added to the weight of all included transactions, exceeds `MAX_TRANSACTION_WEIGHT`,
+		// the transaction is not included. If no weight attribute is provided, the `::default()`
+		// implementation of `TransactionWeight` is used.
+		//
+		// The example below showcases a transaction which is relatively costly, but less dependent on
+		// the input, hence `byte_weight` is configured smaller.
+		#[weight = TransactionWeight::Basic(100_000, 10)]
 		fn accumulate_dummy(origin, increase_by: T::Balance) -> Result {
 			// This is a public call, so we ensure that the origin is some signed account.
 			let _sender = ensure_signed(origin)?;
@@ -490,7 +511,7 @@ mod tests {
 	// or public keys. `u64` is used as the `AccountId` and no `Signature`s are requried.
 	use sr_primitives::{
 		BuildStorage, traits::{BlakeTwo256, OnInitialize, OnFinalize, IdentityLookup},
-		testing::{Digest, DigestItem, Header}
+		testing::Header
 	};
 
 	impl_outer_origin! {
@@ -508,12 +529,10 @@ mod tests {
 		type BlockNumber = u64;
 		type Hash = H256;
 		type Hashing = BlakeTwo256;
-		type Digest = Digest;
 		type AccountId = u64;
 		type Lookup = IdentityLookup;
 		type Header = Header;
 		type Event = ();
-		type Log = DigestItem;
 	}
 	impl balances::Trait for Test {
 		type Balance = u64;
diff --git a/srml/executive/src/lib.rs b/srml/executive/src/lib.rs
index 3dc161bb0c37efb947454752ec4f1188aa3de071..f4299abe476306dba563bf27491eb57f3ca3fd6d 100644
--- a/srml/executive/src/lib.rs
+++ b/srml/executive/src/lib.rs
@@ -77,19 +77,20 @@
 use rstd::prelude::*;
 use rstd::marker::PhantomData;
 use rstd::result;
-use primitives::traits::{
+use primitives::{generic::Digest, traits::{
 	self, Header, Zero, One, Checkable, Applyable, CheckEqual, OnFinalize,
-	OnInitialize, Digest, NumberFor, Block as BlockT, OffchainWorker,
+	OnInitialize, NumberFor, Block as BlockT, OffchainWorker,
 	ValidateUnsigned,
-};
+}};
 use srml_support::{Dispatchable, traits::MakePayment};
 use parity_codec::{Codec, Encode};
-use system::extrinsics_root;
+use system::{extrinsics_root, DigestOf};
 use primitives::{ApplyOutcome, ApplyError};
 use primitives::transaction_validity::{TransactionValidity, TransactionPriority, TransactionLongevity};
+use primitives::weights::Weighable;
 
 mod internal {
-	pub const MAX_TRANSACTIONS_SIZE: u32 = 4 * 1024 * 1024;
+	pub const MAX_TRANSACTIONS_WEIGHT: u32 = 4 * 1024 * 1024;
 
 	pub enum ApplyError {
 		BadSignature(&'static str),
@@ -111,6 +112,10 @@ pub trait ExecuteBlock {
 	fn execute_block(block: Block);
 }
 
+pub type CheckedOf = >::Checked;
+pub type CallOf =  as Applyable>::Call;
+pub type OriginOf =  as Dispatchable>::Origin;
+
 pub struct Executive(
 	PhantomData<(System, Block, Context, Payment, UnsignedValidator, AllModules)>
 );
@@ -125,10 +130,10 @@ impl<
 > ExecuteBlock for Executive
 where
 	Block::Extrinsic: Checkable + Codec,
-	>::Checked: Applyable,
-	<>::Checked as Applyable>::Call: Dispatchable,
-	<<>::Checked as Applyable>::Call as Dispatchable>::Origin: From>,
-	UnsignedValidator: ValidateUnsigned>::Checked as Applyable>::Call>
+	CheckedOf: Applyable + Weighable,
+	CallOf: Dispatchable,
+	OriginOf: From>,
+	UnsignedValidator: ValidateUnsigned>,
 {
 	fn execute_block(block: Block) {
 		Executive::::execute_block(block);
@@ -145,18 +150,25 @@ impl<
 > Executive
 where
 	Block::Extrinsic: Checkable + Codec,
-	>::Checked: Applyable,
-	<>::Checked as Applyable>::Call: Dispatchable,
-	<<>::Checked as Applyable>::Call as Dispatchable>::Origin: From>,
-	UnsignedValidator: ValidateUnsigned>::Checked as Applyable>::Call>
+	CheckedOf: Applyable + Weighable,
+	CallOf: Dispatchable,
+	OriginOf: From>,
+	UnsignedValidator: ValidateUnsigned>,
 {
 	/// Start the execution of a particular block.
 	pub fn initialize_block(header: &System::Header) {
-		Self::initialize_block_impl(header.number(), header.parent_hash(), header.extrinsics_root());
+		let mut digests = >::default();
+		header.digest().logs().iter().for_each(|d| if d.as_pre_runtime().is_some() { digests.push(d.clone()) });
+		Self::initialize_block_impl(header.number(), header.parent_hash(), header.extrinsics_root(), &digests);
 	}
 
-	fn initialize_block_impl(block_number: &System::BlockNumber, parent_hash: &System::Hash, extrinsics_root: &System::Hash) {
-		>::initialize(block_number, parent_hash, extrinsics_root);
+	fn initialize_block_impl(
+		block_number: &System::BlockNumber,
+		parent_hash: &System::Hash,
+		extrinsics_root: &System::Hash,
+		digest: &Digest,
+	) {
+		>::initialize(block_number, parent_hash, extrinsics_root, digest);
 		>::on_initialize(*block_number);
 	}
 
@@ -166,7 +178,8 @@ where
 		// Check that `parent_hash` is correct.
 		let n = header.number().clone();
 		assert!(
-			n > System::BlockNumber::zero() && >::block_hash(n - System::BlockNumber::one()) == *header.parent_hash(),
+			n > System::BlockNumber::zero()
+			&& >::block_hash(n - System::BlockNumber::one()) == *header.parent_hash(),
 			"Parent hash should be valid."
 		);
 
@@ -193,6 +206,7 @@ where
 
 	/// Execute given extrinsics and take care of post-extrinsics book-keeping.
 	fn execute_extrinsics_with_book_keeping(extrinsics: Vec, block_number: NumberFor) {
+
 		extrinsics.into_iter().for_each(Self::apply_extrinsic_no_note);
 
 		// post-extrinsics book-keeping
@@ -242,12 +256,17 @@ where
 	}
 
 	/// Actually apply an extrinsic given its `encoded_len`; this doesn't note its hash.
-	fn apply_extrinsic_with_len(uxt: Block::Extrinsic, encoded_len: usize, to_note: Option>) -> result::Result {
+	fn apply_extrinsic_with_len(
+		uxt: Block::Extrinsic,
+		encoded_len: usize,
+		to_note: Option>,
+	) -> result::Result {
 		// Verify that the signature is good.
 		let xt = uxt.check(&Default::default()).map_err(internal::ApplyError::BadSignature)?;
 
-		// Check the size of the block if that extrinsic is applied.
-		if >::all_extrinsics_len() + encoded_len as u32 > internal::MAX_TRANSACTIONS_SIZE {
+		// Check the weight of the block if that extrinsic is applied.
+		let weight = xt.weight(encoded_len);
+		if >::all_extrinsics_weight() + weight > internal::MAX_TRANSACTIONS_WEIGHT {
 			return Err(internal::ApplyError::FullBlock);
 		}
 
@@ -257,12 +276,12 @@ where
 			if index != &expected_index { return Err(
 				if index < &expected_index { internal::ApplyError::Stale } else { internal::ApplyError::Future }
 			) }
-
 			// pay any fees
 			Payment::make_payment(sender, encoded_len).map_err(|_| internal::ApplyError::CantPay)?;
 
 			// AUDIT: Under no circumstances may this function panic from here onwards.
-
+			// FIXME: ensure this at compile-time (such as by not defining a panic function, forcing
+			// a linker error unless the compiler can prove it cannot be called).
 			// increment nonce in storage
 			>::inc_account_nonce(sender);
 		}
@@ -355,6 +374,7 @@ where
 					requires,
 					provides,
 					longevity: TransactionLongevity::max_value(),
+					propagate: true,
 				}
 			},
 			(None, None) => UnsignedValidator::validate_unsigned(&xt.deconstruct().0),
@@ -377,7 +397,7 @@ mod tests {
 	use substrate_primitives::{H256, Blake2Hasher};
 	use primitives::BuildStorage;
 	use primitives::traits::{Header as HeaderT, BlakeTwo256, IdentityLookup};
-	use primitives::testing::{Digest, DigestItem, Header, Block};
+	use primitives::testing::{Digest, Header, Block};
 	use srml_support::{traits::Currency, impl_outer_origin, impl_outer_event};
 	use system;
 	use hex_literal::hex;
@@ -402,12 +422,10 @@ mod tests {
 		type BlockNumber = u64;
 		type Hash = substrate_primitives::H256;
 		type Hashing = BlakeTwo256;
-		type Digest = Digest;
 		type AccountId = u64;
 		type Lookup = IdentityLookup;
 		type Header = Header;
 		type Event = MetaEvent;
-		type Log = DigestItem;
 	}
 	impl balances::Trait for Runtime {
 		type Balance = u64;
@@ -429,6 +447,7 @@ mod tests {
 					requires: vec![],
 					provides: vec![],
 					longevity: std::u64::MAX,
+					propagate: false,
 				},
 				_ => TransactionValidity::Invalid(0),
 			}
@@ -436,7 +455,14 @@ mod tests {
 	}
 
 	type TestXt = primitives::testing::TestXt>;
-	type Executive = super::Executive, system::ChainContext, balances::Module, Runtime, ()>;
+	type Executive = super::Executive<
+		Runtime,
+		Block,
+		system::ChainContext,
+		balances::Module,
+		Runtime,
+		()
+	>;
 
 	#[test]
 	fn balance_transfer_dispatch_works() {
@@ -453,8 +479,13 @@ mod tests {
 		let xt = primitives::testing::TestXt(Some(1), 0, Call::transfer(2, 69));
 		let mut t = runtime_io::TestExternalities::::new(t);
 		with_externalities(&mut t, || {
-			Executive::initialize_block(&Header::new(1, H256::default(), H256::default(),
-				[69u8; 32].into(), Digest::default()));
+			Executive::initialize_block(&Header::new(
+				1,
+				H256::default(),
+				H256::default(),
+				[69u8; 32].into(),
+				Digest::default(),
+			));
 			Executive::apply_extrinsic(xt).unwrap();
 			assert_eq!(>::total_balance(&1), 32);
 			assert_eq!(>::total_balance(&2), 69);
@@ -474,7 +505,7 @@ mod tests {
 				header: Header {
 					parent_hash: [69u8; 32].into(),
 					number: 1,
-					state_root: hex!("ac2840371d51ff2e036c8fc05af7313b7a030f735c38b2f03b94cbe87bfbb7c9").into(),
+					state_root: hex!("5ba497e45e379d80a4524f9509d224e9c175d0fa30f3491481e7e44a6a758adf").into(),
 					extrinsics_root: hex!("03170a2e7597b7b7e3d84c05391d139a62b157e78786d8c082f29dcf4c111314").into(),
 					digest: Digest { logs: vec![], },
 				},
@@ -522,34 +553,46 @@ mod tests {
 		let mut t = new_test_ext();
 		let xt = primitives::testing::TestXt(Some(1), 42, Call::transfer(33, 69));
 		with_externalities(&mut t, || {
-			Executive::initialize_block(&Header::new(1, H256::default(), H256::default(), [69u8; 32].into(), Digest::default()));
+			Executive::initialize_block(&Header::new(
+				1,
+				H256::default(),
+				H256::default(),
+				[69u8; 32].into(),
+				Digest::default(),
+			));
 			assert!(Executive::apply_extrinsic(xt).is_err());
 			assert_eq!(>::extrinsic_index(), Some(0));
 		});
 	}
 
 	#[test]
-	fn block_size_limit_enforced() {
+	fn block_weight_limit_enforced() {
 		let run_test = |should_fail: bool| {
 			let mut t = new_test_ext();
 			let xt = primitives::testing::TestXt(Some(1), 0, Call::transfer(33, 69));
 			let xt2 = primitives::testing::TestXt(Some(1), 1, Call::transfer(33, 69));
 			let encoded = xt2.encode();
-			let len = if should_fail { (internal::MAX_TRANSACTIONS_SIZE - 1) as usize } else { encoded.len() };
+			let len = if should_fail { (internal::MAX_TRANSACTIONS_WEIGHT - 1) as usize } else { encoded.len() };
 			with_externalities(&mut t, || {
-				Executive::initialize_block(&Header::new(1, H256::default(), H256::default(), [69u8; 32].into(), Digest::default()));
-				assert_eq!(>::all_extrinsics_len(), 0);
+				Executive::initialize_block(&Header::new(
+					1,
+					H256::default(),
+					H256::default(),
+					[69u8; 32].into(),
+					Digest::default(),
+				));
+				assert_eq!(>::all_extrinsics_weight(), 0);
 
 				Executive::apply_extrinsic(xt).unwrap();
 				let res = Executive::apply_extrinsic_with_len(xt2, len, Some(encoded));
 
 				if should_fail {
 					assert!(res.is_err());
-					assert_eq!(>::all_extrinsics_len(), 28);
+					assert_eq!(>::all_extrinsics_weight(), 28);
 					assert_eq!(>::extrinsic_index(), Some(1));
 				} else {
 					assert!(res.is_ok());
-					assert_eq!(>::all_extrinsics_len(), 56);
+					assert_eq!(>::all_extrinsics_weight(), 56);
 					assert_eq!(>::extrinsic_index(), Some(2));
 				}
 			});
@@ -559,6 +602,21 @@ mod tests {
 		run_test(true);
 	}
 
+	#[test]
+	fn default_block_weight() {
+		let xt = primitives::testing::TestXt(None, 0, Call::set_balance(33, 69, 69));
+		let mut t = new_test_ext();
+		with_externalities(&mut t, || {
+			Executive::apply_extrinsic(xt.clone()).unwrap();
+			Executive::apply_extrinsic(xt.clone()).unwrap();
+			Executive::apply_extrinsic(xt.clone()).unwrap();
+			assert_eq!(
+				>::all_extrinsics_weight(),
+				3 * (0 /*base*/ + 22 /*len*/ * 1 /*byte*/)
+			);
+		});
+	}
+
 	#[test]
 	fn validate_unsigned() {
 		let xt = primitives::testing::TestXt(None, 0, Call::set_balance(33, 69, 69));
@@ -566,7 +624,8 @@ mod tests {
 			priority: 0,
 			requires: vec![],
 			provides: vec![],
-			longevity: 18446744073709551615
+			longevity: 18446744073709551615,
+			propagate: false,
 		};
 		let mut t = new_test_ext();
 
diff --git a/srml/finality-tracker/Cargo.toml b/srml/finality-tracker/Cargo.toml
index c7006a3c3e632b98eca02b44c191f03b947a3897..e6cf47ab25a26db462e35d96a8a3e344e9446cd8 100644
--- a/srml/finality-tracker/Cargo.toml
+++ b/srml/finality-tracker/Cargo.toml
@@ -17,7 +17,7 @@ srml-system = { path = "../system", default-features = false }
 substrate-primitives = { path = "../../core/primitives", default-features = false }
 sr-io = { path = "../../core/sr-io", default-features = false }
 lazy_static = "1.0"
-parking_lot = "0.7"
+parking_lot = "0.8.0"
 
 [features]
 default = ["std"]
diff --git a/srml/finality-tracker/src/lib.rs b/srml/finality-tracker/src/lib.rs
index 91beefa66b290881ab41d76021bbaedef7a15071..6442fee543ab4dc7d996907c7167af3f3d91c4e2 100644
--- a/srml/finality-tracker/src/lib.rs
+++ b/srml/finality-tracker/src/lib.rs
@@ -26,7 +26,7 @@ use inherents::{
 	InherentData, MakeFatalError,
 };
 use srml_support::StorageValue;
-use primitives::traits::{As, One, Zero};
+use primitives::traits::{One, Zero, SaturatedConversion};
 use rstd::{prelude::*, result, cmp, vec};
 use parity_codec::Decode;
 use srml_system::{ensure_none, Trait as SystemTrait};
@@ -34,8 +34,8 @@ use srml_system::{ensure_none, Trait as SystemTrait};
 #[cfg(feature = "std")]
 use parity_codec::Encode;
 
-const DEFAULT_WINDOW_SIZE: u64 = 101;
-const DEFAULT_DELAY: u64 = 1000;
+const DEFAULT_WINDOW_SIZE: u32 = 101;
+const DEFAULT_DELAY: u32 = 1000;
 
 /// The identifier for the `finalnum` inherent.
 pub const INHERENT_IDENTIFIER: InherentIdentifier = *b"finalnum";
@@ -100,9 +100,9 @@ decl_storage! {
 		/// The median.
 		Median get(median) build(|_| T::BlockNumber::zero()): T::BlockNumber;
 		/// The number of recent samples to keep from this chain. Default is n-100
-		pub WindowSize get(window_size) config(window_size): T::BlockNumber = T::BlockNumber::sa(DEFAULT_WINDOW_SIZE);
+		pub WindowSize get(window_size) config(window_size): T::BlockNumber = DEFAULT_WINDOW_SIZE.into();
 		/// The delay after which point things become suspicious.
-		pub ReportLatency get(report_latency) config(report_latency): T::BlockNumber = T::BlockNumber::sa(DEFAULT_DELAY);
+		pub ReportLatency get(report_latency) config(report_latency): T::BlockNumber = DEFAULT_DELAY.into();
 
 		/// Final hint to apply in the block. `None` means "same as parent".
 		Update: Option;
@@ -154,7 +154,7 @@ impl Module {
 		// the sample size has just been shrunk.
 		{
 			// take into account the item we haven't pushed yet.
-			let to_prune = (recent.len() + 1).saturating_sub(window_size.as_() as usize);
+			let to_prune = (recent.len() + 1).saturating_sub(window_size.saturated_into::());
 
 			for drained in recent.drain(..to_prune) {
 				let idx = ordered.binary_search(&drained)
@@ -188,13 +188,13 @@ impl Module {
 			}
 		};
 
-		let our_window_size = recent.len();
+		let our_window_size = recent.len() as u32;
 
 		::RecentHints::put(recent);
 		::OrderedHints::put(ordered);
 		::Median::put(median);
 
-		if T::BlockNumber::sa(our_window_size as u64) == window_size {
+		if T::BlockNumber::from(our_window_size) == window_size {
 			let now = srml_system::Module::::block_number();
 			let latency = Self::report_latency();
 
@@ -202,7 +202,7 @@ impl Module {
 			let delay = latency + (window_size / two);
 			// median may be at most n - delay
 			if median + delay <= now {
-				T::OnFinalizationStalled::on_stalled(window_size - T::BlockNumber::one());
+				T::OnFinalizationStalled::on_stalled(window_size - T::BlockNumber::one(), median);
 			}
 		}
 	}
@@ -212,20 +212,20 @@ impl Module {
 pub trait OnFinalizationStalled {
 	/// The parameter here is how many more blocks to wait before applying
 	/// changes triggered by finality stalling.
-	fn on_stalled(further_wait: N);
+	fn on_stalled(further_wait: N, median: N);
 }
 
 macro_rules! impl_on_stalled {
 	() => (
 		impl OnFinalizationStalled for () {
-			fn on_stalled(_: N) {}
+			fn on_stalled(_: N, _: N) {}
 		}
 	);
 
 	( $($t:ident)* ) => {
 		impl),*> OnFinalizationStalled for ($($t,)*) {
-			fn on_stalled(further_wait: NUM) {
-				$($t::on_stalled(further_wait.clone());)*
+			fn on_stalled(further_wait: NUM, median: NUM) {
+				$($t::on_stalled(further_wait.clone(), median.clone());)*
 			}
 		}
 	}
@@ -263,7 +263,7 @@ mod tests {
 	use substrate_primitives::H256;
 	use primitives::BuildStorage;
 	use primitives::traits::{BlakeTwo256, IdentityLookup, OnFinalize, Header as HeaderT};
-	use primitives::testing::{Digest, DigestItem, Header};
+	use primitives::testing::Header;
 	use srml_support::impl_outer_origin;
 	use srml_system as system;
 	use lazy_static::lazy_static;
@@ -290,12 +290,10 @@ mod tests {
 				type BlockNumber = u64;
 				type Hash = H256;
 				type Hashing = BlakeTwo256;
-				type Digest = Digest;
 				type AccountId = u64;
 				type Lookup = IdentityLookup;
 				type Header = Header;
 				type Event = ();
-				type Log = DigestItem;
 			}
 
 			type System = system::Module;
@@ -306,7 +304,7 @@ mod tests {
 
 			pub struct StallTracker;
 			impl OnFinalizationStalled for StallTracker {
-				fn on_stalled(further_wait: u64) {
+				fn on_stalled(further_wait: u64, _median: u64) {
 					let now = System::block_number();
 					NOTIFICATIONS.lock().push(StallEvent { at: now, further_wait });
 				}
@@ -344,7 +342,7 @@ mod tests {
 		with_externalities(&mut TestExternalities::new(t), || {
 			let mut parent_hash = System::parent_hash();
 			for i in 2..106 {
-				System::initialize(&i, &parent_hash, &Default::default());
+				System::initialize(&i, &parent_hash, &Default::default(), &Default::default());
 				FinalityTracker::on_finalize(i);
 				let hdr = System::finalize();
 				parent_hash = hdr.hash();
@@ -369,7 +367,7 @@ mod tests {
 		with_externalities(&mut TestExternalities::new(t), || {
 			let mut parent_hash = System::parent_hash();
 			for i in 2..106 {
-				System::initialize(&i, &parent_hash, &Default::default());
+				System::initialize(&i, &parent_hash, &Default::default(), &Default::default());
 				assert_ok!(FinalityTracker::dispatch(
 					Call::final_hint(i-1),
 					Origin::NONE,
diff --git a/srml/grandpa/Cargo.toml b/srml/grandpa/Cargo.toml
index 7855019af8a4d3af942d4ec895c173a0f3ef39ab..9e61029f728c2eabd3e78aa136262af91ce4edf6 100644
--- a/srml/grandpa/Cargo.toml
+++ b/srml/grandpa/Cargo.toml
@@ -14,7 +14,6 @@ primitives = { package = "sr-primitives", path = "../../core/sr-primitives", def
 srml-support = { path = "../support", default-features = false }
 system = { package = "srml-system", path = "../system", default-features = false }
 session = { package = "srml-session", path = "../session", default-features = false }
-consensus = { package = "srml-consensus", path = "../consensus", default-features = false }
 finality-tracker = { package = "srml-finality-tracker", path = "../finality-tracker", default-features = false }
 
 [dev-dependencies]
@@ -31,7 +30,6 @@ std = [
 	"srml-support/std",
 	"primitives/std",
 	"system/std",
-	"consensus/std",
 	"session/std",
 	"finality-tracker/std",
 ]
diff --git a/srml/grandpa/src/lib.rs b/srml/grandpa/src/lib.rs
index e9886eddb13c75e31744c32b991a63d3272a036f..61610e91940fd05e5f825f291e8bdbac99adc390 100644
--- a/srml/grandpa/src/lib.rs
+++ b/srml/grandpa/src/lib.rs
@@ -33,136 +33,84 @@ pub use substrate_finality_grandpa_primitives as fg_primitives;
 #[cfg(feature = "std")]
 use serde::Serialize;
 use rstd::prelude::*;
-use parity_codec as codec;
-use codec::{Encode, Decode};
-use fg_primitives::ScheduledChange;
-use srml_support::{Parameter, decl_event, decl_storage, decl_module};
-use srml_support::dispatch::Result;
-use srml_support::storage::StorageValue;
-use srml_support::storage::unhashed::StorageVec;
-use primitives::traits::CurrentHeight;
-use substrate_primitives::ed25519;
-use system::ensure_signed;
-use primitives::traits::MaybeSerializeDebug;
-use ed25519::Public as AuthorityId;
+use parity_codec::{self as codec, Encode, Decode};
+use srml_support::{
+	decl_event, decl_storage, decl_module, dispatch::Result, storage::StorageValue
+};
+use primitives::{
+	generic::{DigestItem, OpaqueDigestItemId}, traits::CurrentHeight
+};
+use fg_primitives::{ScheduledChange, GRANDPA_ENGINE_ID};
+pub use fg_primitives::{AuthorityId, AuthorityWeight};
+use system::{ensure_signed, DigestOf};
 
 mod mock;
 mod tests;
 
-struct AuthorityStorageVec(rstd::marker::PhantomData);
-impl StorageVec for AuthorityStorageVec {
-	type Item = (S, u64);
-	const PREFIX: &'static [u8] = crate::fg_primitives::well_known_keys::AUTHORITY_PREFIX;
-}
-
-/// The log type of this crate, projected from module trait type.
-pub type Log = RawLog<
-	::BlockNumber,
-	::SessionKey,
->;
-
-/// Logs which can be scanned by GRANDPA for authorities change events.
-pub trait GrandpaChangeSignal {
-	/// Try to cast the log entry as a contained signal.
-	fn as_signal(&self) -> Option>;
-	/// Try to cast the log entry as a contained forced signal.
-	fn as_forced_signal(&self) -> Option<(N, ScheduledChange)>;
-}
-
-/// A logs in this module.
+/// Consensus log type of this module.
 #[cfg_attr(feature = "std", derive(Serialize, Debug))]
 #[derive(Encode, Decode, PartialEq, Eq, Clone)]
-pub enum RawLog {
+pub enum Signal {
 	/// Authorities set change has been signaled. Contains the new set of authorities
 	/// and the delay in blocks _to finalize_ before applying.
-	AuthoritiesChangeSignal(N, Vec<(SessionKey, u64)>),
+	AuthoritiesChange(ScheduledChange),
 	/// A forced authorities set change. Contains in this order: the median last
 	/// finalized block when the change was signaled, the delay in blocks _to import_
 	/// before applying and the new set of authorities.
-	ForcedAuthoritiesChangeSignal(N, N, Vec<(SessionKey, u64)>),
+	ForcedAuthoritiesChange(N, ScheduledChange),
 }
 
-impl RawLog {
+impl Signal {
 	/// Try to cast the log entry as a contained signal.
-	pub fn as_signal(&self) -> Option<(N, &[(SessionKey, u64)])> {
-		match *self {
-			RawLog::AuthoritiesChangeSignal(ref delay, ref signal) => Some((delay.clone(), signal)),
-			RawLog::ForcedAuthoritiesChangeSignal(_, _, _) => None,
+	pub fn try_into_change(self) -> Option> {
+		match self {
+			Signal::AuthoritiesChange(change) => Some(change),
+			Signal::ForcedAuthoritiesChange(_, _) => None,
 		}
 	}
 
 	/// Try to cast the log entry as a contained forced signal.
-	pub fn as_forced_signal(&self) -> Option<(N, N, &[(SessionKey, u64)])> {
-		match *self {
-			RawLog::ForcedAuthoritiesChangeSignal(ref median, ref delay, ref signal) => Some((median.clone(), delay.clone(), signal)),
-			RawLog::AuthoritiesChangeSignal(_, _) => None,
+	pub fn try_into_forced_change(self) -> Option<(N, ScheduledChange)> {
+		match self {
+			Signal::ForcedAuthoritiesChange(median, change) => Some((median, change)),
+			Signal::AuthoritiesChange(_) => None,
 		}
 	}
 }
 
-impl GrandpaChangeSignal for RawLog
-	where N: Clone, SessionKey: Clone + Into,
-{
-	fn as_signal(&self) -> Option> {
-		RawLog::as_signal(self).map(|(delay, next_authorities)| ScheduledChange {
-			delay,
-			next_authorities: next_authorities.iter()
-				.cloned()
-				.map(|(k, w)| (k.into(), w))
-				.collect(),
-		})
-	}
-
-	fn as_forced_signal(&self) -> Option<(N, ScheduledChange)> {
-		RawLog::as_forced_signal(self).map(|(median, delay, next_authorities)| (median, ScheduledChange {
-			delay,
-			next_authorities: next_authorities.iter()
-				.cloned()
-				.map(|(k, w)| (k.into(), w))
-				.collect(),
-		}))
-	}
-}
-
 pub trait Trait: system::Trait {
-	/// Type for all log entries of this module.
-	type Log: From> + Into>;
-
-	/// The session key type used by authorities.
-	type SessionKey: Parameter + Default + MaybeSerializeDebug;
-
 	/// The event type of this module.
-	type Event: From> + Into<::Event>;
+	type Event: From + Into<::Event>;
 }
 
 /// A stored pending change, old format.
 // TODO: remove shim
 // https://github.com/paritytech/substrate/issues/1614
 #[derive(Encode, Decode)]
-pub struct OldStoredPendingChange {
+pub struct OldStoredPendingChange {
 	/// The block number this was scheduled at.
 	pub scheduled_at: N,
 	/// The delay in blocks until it will be applied.
 	pub delay: N,
 	/// The next authority set.
-	pub next_authorities: Vec<(SessionKey, u64)>,
+	pub next_authorities: Vec<(AuthorityId, u64)>,
 }
 
 /// A stored pending change.
 #[derive(Encode)]
-pub struct StoredPendingChange {
+pub struct StoredPendingChange {
 	/// The block number this was scheduled at.
 	pub scheduled_at: N,
 	/// The delay in blocks until it will be applied.
 	pub delay: N,
 	/// The next authority set.
-	pub next_authorities: Vec<(SessionKey, u64)>,
+	pub next_authorities: Vec<(AuthorityId, u64)>,
 	/// If defined it means the change was forced and the given block number
 	/// indicates the median last finalized block when the change was signaled.
 	pub forced: Option,
 }
 
-impl Decode for StoredPendingChange {
+impl Decode for StoredPendingChange {
 	fn decode(value: &mut I) -> Option {
 		let old = OldStoredPendingChange::decode(value)?;
 		let forced = >::decode(value).unwrap_or(None);
@@ -177,43 +125,31 @@ impl Decode for StoredPendingChange where ::SessionKey {
+	pub enum Event {
 		/// New authority set has been applied.
-		NewAuthorities(Vec<(SessionKey, u64)>),
+		NewAuthorities(Vec<(AuthorityId, u64)>),
 	}
 );
 
 decl_storage! {
 	trait Store for Module as GrandpaFinality {
-		// Pending change: (signaled at, scheduled change).
-		PendingChange get(pending_change): Option>;
-		// next block number where we can force a change.
+		/// The current authority set.
+		Authorities get(authorities) config(): Vec<(AuthorityId, AuthorityWeight)>;
+
+		/// Pending change: (signaled at, scheduled change).
+		PendingChange: Option>;
+
+		/// next block number where we can force a change.
 		NextForced get(next_forced): Option;
-	}
-	add_extra_genesis {
-		config(authorities): Vec<(T::SessionKey, u64)>;
-
-		build(|storage: &mut primitives::StorageOverlay, _: &mut primitives::ChildrenStorageOverlay, config: &GenesisConfig| {
-			use codec::{Encode, KeyedVec};
-
-			let auth_count = config.authorities.len() as u32;
-			config.authorities.iter().enumerate().for_each(|(i, v)| {
-				storage.insert((i as u32).to_keyed_vec(
-					crate::fg_primitives::well_known_keys::AUTHORITY_PREFIX),
-					v.encode()
-				);
-			});
-			storage.insert(
-				crate::fg_primitives::well_known_keys::AUTHORITY_COUNT.to_vec(),
-				auth_count.encode(),
-			);
-		});
+
+		/// `true` if we are currently stalled.
+		Stalled get(stalled): Option<(T::BlockNumber, T::BlockNumber)>;
 	}
 }
 
 decl_module! {
 	pub struct Module for enum Call where origin: T::Origin {
-		fn deposit_event() = default;
+		fn deposit_event() = default;
 
 		/// Report some misbehavior.
 		fn report_misbehavior(origin, _report: Vec) {
@@ -225,24 +161,28 @@ decl_module! {
 			if let Some(pending_change) = >::get() {
 				if block_number == pending_change.scheduled_at {
 					if let Some(median) = pending_change.forced {
-						Self::deposit_log(RawLog::ForcedAuthoritiesChangeSignal(
+						Self::deposit_log(Signal::ForcedAuthoritiesChange(
 							median,
-							pending_change.delay,
-							pending_change.next_authorities.clone(),
-						));
+							ScheduledChange{
+								delay: pending_change.delay,
+								next_authorities: pending_change.next_authorities.clone(),
+							}
+						))
 					} else {
-						Self::deposit_log(RawLog::AuthoritiesChangeSignal(
-							pending_change.delay,
-							pending_change.next_authorities.clone(),
+						Self::deposit_log(Signal::AuthoritiesChange(
+							ScheduledChange{
+								delay: pending_change.delay,
+								next_authorities: pending_change.next_authorities.clone(),
+							}
 						));
 					}
 				}
 
 				if block_number == pending_change.scheduled_at + pending_change.delay {
+					>::put(&pending_change.next_authorities);
 					Self::deposit_event(
-						RawEvent::NewAuthorities(pending_change.next_authorities.clone())
+						Event::NewAuthorities(pending_change.next_authorities)
 					);
-					>::set_items(pending_change.next_authorities);
 					>::kill();
 				}
 			}
@@ -252,8 +192,8 @@ decl_module! {
 
 impl Module {
 	/// Get the current set of authorities, along with their respective weights.
-	pub fn grandpa_authorities() -> Vec<(T::SessionKey, u64)> {
-		>::items()
+	pub fn grandpa_authorities() -> Vec<(AuthorityId, u64)> {
+		>::get()
 	}
 
 	/// Schedule a change in the authorities.
@@ -271,13 +211,11 @@ impl Module {
 	/// No change should be signaled while any change is pending. Returns
 	/// an error if a change is already pending.
 	pub fn schedule_change(
-		next_authorities: Vec<(T::SessionKey, u64)>,
+		next_authorities: Vec<(AuthorityId, u64)>,
 		in_blocks: T::BlockNumber,
 		forced: Option,
 	) -> Result {
-		use primitives::traits::As;
-
-		if Self::pending_change().is_none() {
+		if !>::exists() {
 			let scheduled_at = system::ChainContext::::default().current_height();
 
 			if let Some(_) = forced {
@@ -287,7 +225,7 @@ impl Module {
 
 				// only allow the next forced change when twice the window has passed since
 				// this one.
-				>::put(scheduled_at + in_blocks * T::BlockNumber::sa(2));
+				>::put(scheduled_at + in_blocks * 2.into());
 			}
 
 			>::put(StoredPendingChange {
@@ -304,79 +242,60 @@ impl Module {
 	}
 
 	/// Deposit one of this module's logs.
-	fn deposit_log(log: Log) {
-		>::deposit_log(::Log::from(log).into());
+	fn deposit_log(log: Signal) {
+		let log: DigestItem = DigestItem::Consensus(GRANDPA_ENGINE_ID, log.encode());
+		>::deposit_log(log.into());
 	}
 }
 
-impl Module where AuthorityId: core::convert::From<::SessionKey> {
-	/// See if the digest contains any standard scheduled change.
-	pub fn scrape_digest_change(log: &Log)
+impl Module {
+	pub fn grandpa_log(digest: &DigestOf) -> Option> {
+		let id = OpaqueDigestItemId::Consensus(&GRANDPA_ENGINE_ID);
+		digest.convert_first(|l| l.try_to::>(id))
+	}
+
+	pub fn pending_change(digest: &DigestOf)
 		-> Option>
 	{
-		 as GrandpaChangeSignal>::as_signal(log)
+		Self::grandpa_log(digest).and_then(|signal| signal.try_into_change())
 	}
 
-	/// See if the digest contains any forced scheduled change.
-	pub fn scrape_digest_forced_change(log: &Log)
+	pub fn forced_change(digest: &DigestOf)
 		-> Option<(T::BlockNumber, ScheduledChange)>
 	{
-		 as GrandpaChangeSignal>::as_forced_signal(log)
-	}
-}
-
-/// Helper for authorities being synchronized with the general session authorities.
-///
-/// This is not the only way to manage an authority set for GRANDPA, but it is
-/// a convenient one. When this is used, no other mechanism for altering authority
-/// sets should be.
-pub struct SyncedAuthorities(::rstd::marker::PhantomData);
-
-// FIXME: remove when https://github.com/rust-lang/rust/issues/26925 is fixed
-impl Default for SyncedAuthorities {
-	fn default() -> Self {
-		SyncedAuthorities(::rstd::marker::PhantomData)
+		Self::grandpa_log(digest).and_then(|signal| signal.try_into_forced_change())
 	}
 }
 
-impl session::OnSessionChange for SyncedAuthorities where
-	T: Trait + consensus::Trait::SessionKey>,
-	::Log: From::SessionKey>>
-{
-	fn on_session_change(_: X, _: bool) {
-		use primitives::traits::Zero;
-
-		let next_authorities = >::authorities()
-			.into_iter()
-			.map(|key| (key, 1)) // evenly-weighted.
-			.collect::::SessionKey, u64)>>();
-
+impl session::OneSessionHandler for Module {
+	type Key = AuthorityId;
+	fn on_new_session<'a, I: 'a>(changed: bool, validators: I)
+		where I: Iterator
+	{
 		// instant changes
-		let last_authorities = >::grandpa_authorities();
-		if next_authorities != last_authorities {
-			let _ = >::schedule_change(next_authorities, Zero::zero(), None);
+		if changed {
+			let next_authorities = validators.map(|(_, k)| (k, 1u64)).collect::>();
+			let last_authorities = >::grandpa_authorities();
+			if next_authorities != last_authorities {
+				use primitives::traits::Zero;
+				if let Some((further_wait, median)) = >::take() {
+					let _ = Self::schedule_change(next_authorities, further_wait, Some(median));
+				} else {
+					let _ = Self::schedule_change(next_authorities, Zero::zero(), None);
+				}
+			}
 		}
 	}
+	fn on_disabled(_i: usize) {
+		// ignore?
+	}
 }
 
-impl finality_tracker::OnFinalizationStalled for SyncedAuthorities where
-	T: Trait + consensus::Trait::SessionKey>,
-	::Log: From::SessionKey>>,
-	T: finality_tracker::Trait,
-{
-	fn on_stalled(further_wait: T::BlockNumber) {
+impl finality_tracker::OnFinalizationStalled for Module {
+	fn on_stalled(further_wait: T::BlockNumber, median: T::BlockNumber) {
 		// when we record old authority sets, we can use `finality_tracker::median`
 		// to figure out _who_ failed. until then, we can't meaningfully guard
 		// against `next == last` the way that normal session changes do.
-
-		let next_authorities = >::authorities()
-			.into_iter()
-			.map(|key| (key, 1)) // evenly-weighted.
-			.collect::::SessionKey, u64)>>();
-
-		let median = >::median();
-
-		// schedule a change for `further_wait` blocks.
-		let _ = >::schedule_change(next_authorities, further_wait, Some(median));
+		>::put((further_wait, median));
 	}
 }
diff --git a/srml/grandpa/src/mock.rs b/srml/grandpa/src/mock.rs
index 4405604ab19c07a9e074439ebc778ae3b10ac20c..80c99b9a3cfaa8cb37f25ef6b52f8ccc9963bcff 100644
--- a/srml/grandpa/src/mock.rs
+++ b/srml/grandpa/src/mock.rs
@@ -18,21 +18,23 @@
 
 #![cfg(test)]
 
-use primitives::{BuildStorage, traits::IdentityLookup, testing::{Digest, DigestItem, Header}};
-use primitives::generic::DigestItem as GenDigestItem;
+use primitives::{
+	BuildStorage, DigestItem, traits::IdentityLookup, testing::{Header, UintAuthorityId}
+};
 use runtime_io;
 use srml_support::{impl_outer_origin, impl_outer_event};
 use substrate_primitives::{H256, Blake2Hasher};
 use parity_codec::{Encode, Decode};
-use crate::{GenesisConfig, Trait, Module, RawLog};
+use crate::{AuthorityId, GenesisConfig, Trait, Module, Signal};
+use substrate_finality_grandpa_primitives::GRANDPA_ENGINE_ID;
 
 impl_outer_origin!{
 	pub enum Origin for Test {}
 }
 
-impl From> for DigestItem {
-	fn from(log: RawLog) -> DigestItem {
-		GenDigestItem::Other(log.encode())
+impl From> for DigestItem {
+	fn from(log: Signal) -> DigestItem {
+		DigestItem::Consensus(GRANDPA_ENGINE_ID, log.encode())
 	}
 }
 
@@ -40,9 +42,8 @@ impl From> for DigestItem {
 #[derive(Clone, PartialEq, Eq, Debug, Decode, Encode)]
 pub struct Test;
 impl Trait for Test {
-	type Log = DigestItem;
-	type SessionKey = u64;
 	type Event = TestEvent;
+
 }
 impl system::Trait for Test {
 	type Origin = Origin;
@@ -50,12 +51,10 @@ impl system::Trait for Test {
 	type BlockNumber = u64;
 	type Hash = H256;
 	type Hashing = ::primitives::traits::BlakeTwo256;
-	type Digest = Digest;
 	type AccountId = u64;
 	type Lookup = IdentityLookup;
 	type Header = Header;
 	type Event = TestEvent;
-	type Log = DigestItem;
 }
 
 mod grandpa {
@@ -64,14 +63,19 @@ mod grandpa {
 
 impl_outer_event!{
 	pub enum TestEvent for Test {
-		grandpa,
+		grandpa,
 	}
 }
 
+pub fn to_authorities(vec: Vec<(u64, u64)>) -> Vec<(AuthorityId, u64)> {
+	vec.into_iter().map(|(id, weight)| (UintAuthorityId(id).into(), weight)).collect()
+}
+
 pub fn new_test_ext(authorities: Vec<(u64, u64)>) -> runtime_io::TestExternalities {
 	let mut t = system::GenesisConfig::::default().build_storage().unwrap().0;
 	t.extend(GenesisConfig:: {
-		authorities,
+		_genesis_phantom_data: Default::default(),
+		authorities: to_authorities(authorities),
 	}.build_storage().unwrap().0);
 	t.into()
 }
diff --git a/srml/grandpa/src/tests.rs b/srml/grandpa/src/tests.rs
index 3050b6a572e0d2d8269cf0a6ba8beb5862248da8..ab923f295b6d7475e6603ebd2b895527d70be9d4 100644
--- a/srml/grandpa/src/tests.rs
+++ b/srml/grandpa/src/tests.rs
@@ -18,35 +18,38 @@
 
 #![cfg(test)]
 
-use primitives::{testing, traits::OnFinalize};
-use primitives::traits::Header;
+use primitives::testing::Digest;
+use primitives::traits::{Header, OnFinalize};
 use runtime_io::with_externalities;
-use crate::mock::{Grandpa, System, new_test_ext};
+use crate::mock::*;
 use system::{EventRecord, Phase};
-use crate::{RawLog, RawEvent};
 use codec::{Decode, Encode};
+use fg_primitives::ScheduledChange;
 use super::*;
 
 #[test]
 fn authorities_change_logged() {
 	with_externalities(&mut new_test_ext(vec![(1, 1), (2, 1), (3, 1)]), || {
-		System::initialize(&1, &Default::default(), &Default::default());
-		Grandpa::schedule_change(vec![(4, 1), (5, 1), (6, 1)], 0, None).unwrap();
+		System::initialize(&1, &Default::default(), &Default::default(), &Default::default());
+		Grandpa::schedule_change(to_authorities(vec![(4, 1), (5, 1), (6, 1)]), 0, None).unwrap();
 
 		System::note_finished_extrinsics();
 		Grandpa::on_finalize(1);
 
 		let header = System::finalize();
-		assert_eq!(header.digest, testing::Digest {
+		assert_eq!(header.digest, Digest {
 			logs: vec![
-				RawLog::AuthoritiesChangeSignal(0, vec![(4, 1), (5, 1), (6, 1)]).into(),
+				Signal::AuthoritiesChange(
+					ScheduledChange { delay: 0, next_authorities: to_authorities(vec![(4, 1), (5, 1), (6, 1)]) }
+				).into(),
 			],
 		});
 
 		assert_eq!(System::events(), vec![
 			EventRecord {
 				phase: Phase::Finalization,
-				event: RawEvent::NewAuthorities(vec![(4, 1), (5, 1), (6, 1)]).into(),
+				event: Event::NewAuthorities(to_authorities(vec![(4, 1), (5, 1), (6, 1)])).into(),
+				topics: vec![],
 			},
 		]);
 	});
@@ -55,20 +58,22 @@ fn authorities_change_logged() {
 #[test]
 fn authorities_change_logged_after_delay() {
 	with_externalities(&mut new_test_ext(vec![(1, 1), (2, 1), (3, 1)]), || {
-		System::initialize(&1, &Default::default(), &Default::default());
-		Grandpa::schedule_change(vec![(4, 1), (5, 1), (6, 1)], 1, None).unwrap();
+		System::initialize(&1, &Default::default(), &Default::default(), &Default::default());
+		Grandpa::schedule_change(to_authorities(vec![(4, 1), (5, 1), (6, 1)]), 1, None).unwrap();
 		Grandpa::on_finalize(1);
 		let header = System::finalize();
-		assert_eq!(header.digest, testing::Digest {
+		assert_eq!(header.digest, Digest {
 			logs: vec![
-				RawLog::AuthoritiesChangeSignal(1, vec![(4, 1), (5, 1), (6, 1)]).into(),
+				Signal::AuthoritiesChange(
+					ScheduledChange { delay: 1, next_authorities: to_authorities(vec![(4, 1), (5, 1), (6, 1)]) }
+				).into(),
 			],
 		});
 
 		// no change at this height.
 		assert_eq!(System::events(), vec![]);
 
-		System::initialize(&2, &header.hash(), &Default::default());
+		System::initialize(&2, &header.hash(), &Default::default(), &Default::default());
 		System::note_finished_extrinsics();
 		Grandpa::on_finalize(2);
 
@@ -76,7 +81,8 @@ fn authorities_change_logged_after_delay() {
 		assert_eq!(System::events(), vec![
 			EventRecord {
 				phase: Phase::Finalization,
-				event: RawEvent::NewAuthorities(vec![(4, 1), (5, 1), (6, 1)]).into(),
+				event: Event::NewAuthorities(to_authorities(vec![(4, 1), (5, 1), (6, 1)])).into(),
+				topics: vec![],
 			},
 		]);
 	});
@@ -85,24 +91,24 @@ fn authorities_change_logged_after_delay() {
 #[test]
 fn cannot_schedule_change_when_one_pending() {
 	with_externalities(&mut new_test_ext(vec![(1, 1), (2, 1), (3, 1)]), || {
-		System::initialize(&1, &Default::default(), &Default::default());
-		Grandpa::schedule_change(vec![(4, 1), (5, 1), (6, 1)], 1, None).unwrap();
-		assert!(Grandpa::pending_change().is_some());
-		assert!(Grandpa::schedule_change(vec![(5, 1)], 1, None).is_err());
+		System::initialize(&1, &Default::default(), &Default::default(), &Default::default());
+		Grandpa::schedule_change(to_authorities(vec![(4, 1), (5, 1), (6, 1)]), 1, None).unwrap();
+		assert!(>::exists());
+		assert!(Grandpa::schedule_change(to_authorities(vec![(5, 1)]), 1, None).is_err());
 
 		Grandpa::on_finalize(1);
 		let header = System::finalize();
 
-		System::initialize(&2, &header.hash(), &Default::default());
-		assert!(Grandpa::pending_change().is_some());
-		assert!(Grandpa::schedule_change(vec![(5, 1)], 1, None).is_err());
+		System::initialize(&2, &header.hash(), &Default::default(), &Default::default());
+		assert!(>::exists());
+		assert!(Grandpa::schedule_change(to_authorities(vec![(5, 1)]), 1, None).is_err());
 
 		Grandpa::on_finalize(2);
 		let header = System::finalize();
 
-		System::initialize(&3, &header.hash(), &Default::default());
-		assert!(Grandpa::pending_change().is_none());
-		assert!(Grandpa::schedule_change(vec![(5, 1)], 1, None).is_ok());
+		System::initialize(&3, &header.hash(), &Default::default(), &Default::default());
+		assert!(!>::exists());
+		assert!(Grandpa::schedule_change(to_authorities(vec![(5, 1)]), 1, None).is_ok());
 
 		Grandpa::on_finalize(3);
 		let _header = System::finalize();
@@ -114,11 +120,11 @@ fn new_decodes_from_old() {
 	let old = OldStoredPendingChange {
 		scheduled_at: 5u32,
 		delay: 100u32,
-		next_authorities: vec![(1u64, 5), (2u64, 10), (3u64, 2)],
+		next_authorities: to_authorities(vec![(1, 5), (2, 10), (3, 2)]),
 	};
 
 	let encoded = old.encode();
-	let new = StoredPendingChange::::decode(&mut &encoded[..]).unwrap();
+	let new = StoredPendingChange::::decode(&mut &encoded[..]).unwrap();
 	assert!(new.forced.is_none());
 	assert_eq!(new.scheduled_at, old.scheduled_at);
 	assert_eq!(new.delay, old.delay);
@@ -128,25 +134,25 @@ fn new_decodes_from_old() {
 #[test]
 fn dispatch_forced_change() {
 	with_externalities(&mut new_test_ext(vec![(1, 1), (2, 1), (3, 1)]), || {
-		System::initialize(&1, &Default::default(), &Default::default());
+		System::initialize(&1, &Default::default(), &Default::default(), &Default::default());
 		Grandpa::schedule_change(
-			vec![(4, 1), (5, 1), (6, 1)],
+			to_authorities(vec![(4, 1), (5, 1), (6, 1)]),
 			5,
 			Some(0),
 		).unwrap();
 
-		assert!(Grandpa::pending_change().is_some());
-		assert!(Grandpa::schedule_change(vec![(5, 1)], 1, Some(0)).is_err());
+		assert!(>::exists());
+		assert!(Grandpa::schedule_change(to_authorities(vec![(5, 1)]), 1, Some(0)).is_err());
 
 		Grandpa::on_finalize(1);
 		let mut header = System::finalize();
 
 		for i in 2..7 {
-			System::initialize(&i, &header.hash(), &Default::default());
-			assert!(Grandpa::pending_change().unwrap().forced.is_some());
+			System::initialize(&i, &header.hash(), &Default::default(), &Default::default());
+			assert!(>::get().unwrap().forced.is_some());
 			assert_eq!(Grandpa::next_forced(), Some(11));
-			assert!(Grandpa::schedule_change(vec![(5, 1)], 1, None).is_err());
-			assert!(Grandpa::schedule_change(vec![(5, 1)], 1, Some(0)).is_err());
+			assert!(Grandpa::schedule_change(to_authorities(vec![(5, 1)]), 1, None).is_err());
+			assert!(Grandpa::schedule_change(to_authorities(vec![(5, 1)]), 1, Some(0)).is_err());
 
 			Grandpa::on_finalize(i);
 			header = System::finalize();
@@ -155,20 +161,20 @@ fn dispatch_forced_change() {
 		// change has been applied at the end of block 6.
 		// add a normal change.
 		{
-			System::initialize(&7, &header.hash(), &Default::default());
-			assert!(Grandpa::pending_change().is_none());
-			assert_eq!(Grandpa::grandpa_authorities(), vec![(4, 1), (5, 1), (6, 1)]);
-			assert!(Grandpa::schedule_change(vec![(5, 1)], 1, None).is_ok());
+			System::initialize(&7, &header.hash(), &Default::default(), &Default::default());
+			assert!(!>::exists());
+			assert_eq!(Grandpa::grandpa_authorities(), to_authorities(vec![(4, 1), (5, 1), (6, 1)]));
+			assert!(Grandpa::schedule_change(to_authorities(vec![(5, 1)]), 1, None).is_ok());
 			Grandpa::on_finalize(7);
 			header = System::finalize();
 		}
 
 		// run the normal change.
 		{
-			System::initialize(&8, &header.hash(), &Default::default());
-			assert!(Grandpa::pending_change().is_some());
-			assert_eq!(Grandpa::grandpa_authorities(), vec![(4, 1), (5, 1), (6, 1)]);
-			assert!(Grandpa::schedule_change(vec![(5, 1)], 1, None).is_err());
+			System::initialize(&8, &header.hash(), &Default::default(), &Default::default());
+			assert!(>::exists());
+			assert_eq!(Grandpa::grandpa_authorities(), to_authorities(vec![(4, 1), (5, 1), (6, 1)]));
+			assert!(Grandpa::schedule_change(to_authorities(vec![(5, 1)]), 1, None).is_err());
 			Grandpa::on_finalize(8);
 			header = System::finalize();
 		}
@@ -176,19 +182,19 @@ fn dispatch_forced_change() {
 		// normal change applied. but we can't apply a new forced change for some
 		// time.
 		for i in 9..11 {
-			System::initialize(&i, &header.hash(), &Default::default());
-			assert!(Grandpa::pending_change().is_none());
-			assert_eq!(Grandpa::grandpa_authorities(), vec![(5, 1)]);
+			System::initialize(&i, &header.hash(), &Default::default(), &Default::default());
+			assert!(!>::exists());
+			assert_eq!(Grandpa::grandpa_authorities(), to_authorities(vec![(5, 1)]));
 			assert_eq!(Grandpa::next_forced(), Some(11));
-			assert!(Grandpa::schedule_change(vec![(5, 1), (6, 1)], 5, Some(0)).is_err());
+			assert!(Grandpa::schedule_change(to_authorities(vec![(5, 1), (6, 1)]), 5, Some(0)).is_err());
 			Grandpa::on_finalize(i);
 			header = System::finalize();
 		}
 
 		{
-			System::initialize(&11, &header.hash(), &Default::default());
-			assert!(Grandpa::pending_change().is_none());
-			assert!(Grandpa::schedule_change(vec![(5, 1), (6, 1), (7, 1)], 5, Some(0)).is_ok());
+			System::initialize(&11, &header.hash(), &Default::default(), &Default::default());
+			assert!(!>::exists());
+			assert!(Grandpa::schedule_change(to_authorities(vec![(5, 1), (6, 1), (7, 1)]), 5, Some(0)).is_ok());
 			assert_eq!(Grandpa::next_forced(), Some(21));
 			Grandpa::on_finalize(11);
 			header = System::finalize();
diff --git a/srml/indices/src/address.rs b/srml/indices/src/address.rs
index c7709e3bec3a5722b0662d141a65c9b494474d6c..c76585d2169670f3e1e253f5f29d736458f4e0ea 100644
--- a/srml/indices/src/address.rs
+++ b/srml/indices/src/address.rs
@@ -18,7 +18,8 @@
 
 #[cfg(feature = "std")]
 use std::fmt;
-use crate::{Member, Decode, Encode, As, Input, Output};
+use rstd::convert::TryInto;
+use crate::{Member, Decode, Encode, Input, Output};
 
 /// An indices-aware address, which can be either a direct `AccountId` or
 /// an index.
@@ -59,14 +60,20 @@ fn need_more_than(a: T, b: T) -> Option {
 
 impl Decode for Address where
 	AccountId: Member + Decode,
-	AccountIndex: Member + Decode + PartialOrd + Ord + As + As + As + Copy,
+	AccountIndex: Member + Decode + PartialOrd + Ord + From + Copy,
 {
 	fn decode(input: &mut I) -> Option {
 		Some(match input.read_byte()? {
-			x @ 0x00...0xef => Address::Index(As::sa(x)),
-			0xfc => Address::Index(As::sa(need_more_than(0xef, u16::decode(input)?)?)),
-			0xfd => Address::Index(As::sa(need_more_than(0xffff, u32::decode(input)?)?)),
-			0xfe => Address::Index(need_more_than(As::sa(0xffffffffu32), Decode::decode(input)?)?),
+			x @ 0x00..=0xef => Address::Index(AccountIndex::from(x as u32)),
+			0xfc => Address::Index(AccountIndex::from(
+				need_more_than(0xef, u16::decode(input)?)? as u32
+			)),
+			0xfd => Address::Index(AccountIndex::from(
+				need_more_than(0xffff, u32::decode(input)?)?
+			)),
+			0xfe => Address::Index(
+				need_more_than(0xffffffffu32.into(), Decode::decode(input)?)?
+			),
 			0xff => Address::Id(Decode::decode(input)?),
 			_ => return None,
 		})
@@ -75,7 +82,7 @@ impl Decode for Address where
 
 impl Encode for Address where
 	AccountId: Member + Encode,
-	AccountIndex: Member + Encode + PartialOrd + Ord + As + As + As + Copy,
+	AccountIndex: Member + Encode + PartialOrd + Ord + Copy + From + TryInto,
 {
 	fn encode_to(&self, dest: &mut T) {
 		match *self {
@@ -83,19 +90,26 @@ impl Encode for Address where
 				dest.push_byte(255);
 				dest.push(i);
 			}
-			Address::Index(i) if i > As::sa(0xffffffffu32) => {
-				dest.push_byte(254);
-				dest.push(&i);
-			}
-			Address::Index(i) if i > As::sa(0xffffu32) => {
-				dest.push_byte(253);
-				dest.push(&As::::as_(i));
-			}
-			Address::Index(i) if i >= As::sa(0xf0u32) => {
-				dest.push_byte(252);
-				dest.push(&As::::as_(i));
-			}
-			Address::Index(i) => dest.push_byte(As::::as_(i)),
+			Address::Index(i) => {
+				let maybe_u32: Result = i.try_into();
+				if let Ok(x) = maybe_u32 {
+					if x > 0xffff {
+						dest.push_byte(253);
+						dest.push(&x);
+					}
+					else if x >= 0xf0 {
+						dest.push_byte(252);
+						dest.push(&(x as u16));
+					}
+					else {
+						dest.push_byte(x as u8);
+					}
+
+				} else {
+					dest.push_byte(254);
+					dest.push(&i);
+				}
+			},
 		}
 	}
 }
diff --git a/srml/indices/src/lib.rs b/srml/indices/src/lib.rs
index 4a6010f800dec7b60a465b5816e2221a8a4eee0f..45487e3b51cd126be2d08f34c5ac53b42d396786 100644
--- a/srml/indices/src/lib.rs
+++ b/srml/indices/src/lib.rs
@@ -19,10 +19,10 @@
 
 #![cfg_attr(not(feature = "std"), no_std)]
 
-use rstd::{prelude::*, result, marker::PhantomData};
+use rstd::{prelude::*, result, marker::PhantomData, convert::TryInto};
 use parity_codec::{Encode, Decode, Codec, Input, Output};
 use srml_support::{StorageValue, StorageMap, Parameter, decl_module, decl_event, decl_storage};
-use primitives::traits::{One, SimpleArithmetic, As, StaticLookup, Member};
+use primitives::traits::{One, SimpleArithmetic, StaticLookup, Member};
 use system::{IsDeadAccount, OnNewAccount};
 
 use self::address::Address as RawAddress;
@@ -33,23 +33,25 @@ pub mod address;
 mod tests;
 
 /// Number of account IDs stored per enum set.
-const ENUM_SET_SIZE: usize = 64;
+const ENUM_SET_SIZE: u32 = 64;
 
 pub type Address = RawAddress<::AccountId, ::AccountIndex>;
 
 /// Turn an Id into an Index, or None for the purpose of getting
 /// a hint at a possibly desired index.
-pub trait ResolveHint> {
+pub trait ResolveHint {
 	/// Turn an Id into an Index, or None for the purpose of getting
 	/// a hint at a possibly desired index.
 	fn resolve_hint(who: &AccountId) -> Option;
 }
 
-/// Simple encode-based resolve hint implemenntation.
+/// Simple encode-based resolve hint implementation.
 pub struct SimpleResolveHint(PhantomData<(AccountId, AccountIndex)>);
-impl> ResolveHint for SimpleResolveHint {
+impl>
+	ResolveHint for SimpleResolveHint
+{
 	fn resolve_hint(who: &AccountId) -> Option {
-		Some(AccountIndex::sa(who.using_encoded(|e| e[0] as usize + e[1] as usize * 256)))
+		Some(AccountIndex::from(who.using_encoded(|e| e[0] as u32 + e[1] as u32 * 256)))
 	}
 }
 
@@ -57,7 +59,7 @@ impl> ResolveHint + As + As + As + As + Copy;
+	type AccountIndex: Parameter + Member + Codec + Default + SimpleArithmetic + Copy;
 
 	/// Whether an account is dead or not.
 	type IsDeadAccount: IsDeadAccount;
@@ -92,15 +94,18 @@ decl_storage! {
 	trait Store for Module as Indices {
 		/// The next free enumeration set.
 		pub NextEnumSet get(next_enum_set) build(|config: &GenesisConfig| {
-			T::AccountIndex::sa(config.ids.len() / ENUM_SET_SIZE)
+			(config.ids.len() as u32 / ENUM_SET_SIZE).into()
 		}): T::AccountIndex;
 
 		/// The enumeration sets.
 		pub EnumSet get(enum_set) build(|config: &GenesisConfig| {
-			(0..(config.ids.len() + ENUM_SET_SIZE - 1) / ENUM_SET_SIZE)
+			(0..((config.ids.len() as u32) + ENUM_SET_SIZE - 1) / ENUM_SET_SIZE)
 				.map(|i| (
-					T::AccountIndex::sa(i),
-					config.ids[i * ENUM_SET_SIZE..config.ids.len().min((i + 1) * ENUM_SET_SIZE)].to_owned(),
+					i.into(),
+					config.ids[
+						(i * ENUM_SET_SIZE) as usize..
+						config.ids.len().min(((i + 1) * ENUM_SET_SIZE) as usize)
+					].to_owned(),
 				))
 				.collect::>()
 		}): map T::AccountIndex => Vec;
@@ -117,7 +122,7 @@ impl Module {
 	pub fn lookup_index(index: T::AccountIndex) -> Option {
 		let enum_set_size = Self::enum_set_size();
 		let set = Self::enum_set(index / enum_set_size);
-		let i: usize = (index % enum_set_size).as_();
+		let i: usize = (index % enum_set_size).try_into().ok()?;
 		set.get(i).cloned()
 	}
 
@@ -125,12 +130,18 @@ impl Module {
 	pub fn can_reclaim(try_index: T::AccountIndex) -> bool {
 		let enum_set_size = Self::enum_set_size();
 		let try_set = Self::enum_set(try_index / enum_set_size);
-		let i = (try_index % enum_set_size).as_();
-		i < try_set.len() && T::IsDeadAccount::is_dead_account(&try_set[i])
+		let maybe_usize: Result = (try_index % enum_set_size).try_into();
+		if let Ok(i) = maybe_usize {
+			i < try_set.len() && T::IsDeadAccount::is_dead_account(&try_set[i])
+		} else {
+			false
+		}
 	}
 
 	/// Lookup an address to get an Id, if there's one there.
-	pub fn lookup_address(a: address::Address) -> Option {
+	pub fn lookup_address(
+		a: address::Address
+	) -> Option {
 		match a {
 			address::Address::Id(i) => Some(i),
 			address::Address::Index(i) => Self::lookup_index(i),
@@ -140,11 +151,26 @@ impl Module {
 	// PUBLIC MUTABLES (DANGEROUS)
 
 	fn enum_set_size() -> T::AccountIndex {
-		T::AccountIndex::sa(ENUM_SET_SIZE)
+		ENUM_SET_SIZE.into()
 	}
 }
 
 impl OnNewAccount for Module {
+	// Implementation of the config type managing the creation of new accounts.
+	// See Balances module for a concrete example.
+	//
+	// # 
+	// - Independent of the arguments.
+	// - Given the correct value of `Self::next_enum_set`, it always has a limited
+	//   number of reads and writes and no complex computation.
+	//
+	// As for storage, calling this function with _non-dead-indices_ will linearly grow the length of
+	// of `Self::enum_set`. Appropriate economic incentives should exist to make callers of this
+	// function provide a `who` argument that reclaims a dead account.
+	//
+	// At the time of this writing, only the Balances module calls this function upon creation
+	// of new accounts.
+	// # 
 	fn on_new_account(who: &T::AccountId) {
 		let enum_set_size = Self::enum_set_size();
 		let next_set_index = Self::next_enum_set();
@@ -153,36 +179,38 @@ impl OnNewAccount for Module {
 			// then check to see if this account id identifies a dead account index.
 			let set_index = try_index / enum_set_size;
 			let mut try_set = Self::enum_set(set_index);
-			let item_index = (try_index % enum_set_size).as_();
-			if item_index < try_set.len() {
-				if T::IsDeadAccount::is_dead_account(&try_set[item_index]) {
-					// yup - this index refers to a dead account. can be reused.
-					try_set[item_index] = who.clone();
-					>::insert(set_index, try_set);
-
-					return
+			if let Ok(item_index) = (try_index % enum_set_size).try_into() {
+				if item_index < try_set.len() {
+					if T::IsDeadAccount::is_dead_account(&try_set[item_index]) {
+						// yup - this index refers to a dead account. can be reused.
+						try_set[item_index] = who.clone();
+						>::insert(set_index, try_set);
+
+						return
+					}
 				}
 			}
 		}
 
 		// insert normally as a back up
 		let mut set_index = next_set_index;
-		// defensive only: this loop should never iterate since we keep NextEnumSet up to date later.
+		// defensive only: this loop should never iterate since we keep NextEnumSet up to date
+		// later.
 		let mut set = loop {
 			let set = Self::enum_set(set_index);
-			if set.len() < ENUM_SET_SIZE {
+			if set.len() < ENUM_SET_SIZE as usize {
 				break set;
 			}
 			set_index += One::one();
 		};
 
-		let index = T::AccountIndex::sa(set_index.as_() * ENUM_SET_SIZE + set.len());
+		let index = set_index * enum_set_size + T::AccountIndex::from(set.len() as u32);
 
 		// update set.
 		set.push(who.clone());
 
 		// keep NextEnumSet up to date
-		if set.len() == ENUM_SET_SIZE {
+		if set.len() == ENUM_SET_SIZE as usize {
 			>::put(set_index + One::one());
 		}
 
diff --git a/srml/indices/src/mock.rs b/srml/indices/src/mock.rs
index 80d3fa2c4fc9d3a4d15e33f607a6d44a03d26ac1..e2ea51e89d958dd893d8a56df7d78c714f342236 100644
--- a/srml/indices/src/mock.rs
+++ b/srml/indices/src/mock.rs
@@ -21,7 +21,7 @@
 use std::collections::HashSet;
 use ref_thread_local::{ref_thread_local, RefThreadLocal};
 use primitives::BuildStorage;
-use primitives::testing::{Digest, DigestItem, Header};
+use primitives::testing::Header;
 use substrate_primitives::{H256, Blake2Hasher};
 use srml_support::impl_outer_origin;
 use {runtime_io, system};
@@ -71,12 +71,10 @@ impl system::Trait for Runtime {
 	type BlockNumber = u64;
 	type Hash = H256;
 	type Hashing = ::primitives::traits::BlakeTwo256;
-	type Digest = Digest;
 	type AccountId = u64;
 	type Lookup = Indices;
 	type Header = Header;
 	type Event = ();
-	type Log = DigestItem;
 }
 impl Trait for Runtime {
 	type AccountIndex = u64;
diff --git a/srml/metadata/src/lib.rs b/srml/metadata/src/lib.rs
index 5f8b57206b7c9bd400cbb3340d44d3ebfe0c408e..b1ab57b506878559b3a8dd07e2d37a1e00c2629b 100644
--- a/srml/metadata/src/lib.rs
+++ b/srml/metadata/src/lib.rs
@@ -280,7 +280,7 @@ pub enum StorageFunctionType {
 		key1: DecodeDifferentStr,
 		key2: DecodeDifferentStr,
 		value: DecodeDifferentStr,
-		key2_hasher: DecodeDifferentStr,
+		key2_hasher: StorageHasher,
 	},
 }
 
@@ -292,22 +292,6 @@ pub enum StorageFunctionModifier {
 	Default,
 }
 
-/// All metadata about the outer dispatch.
-#[derive(Clone, PartialEq, Eq, Encode)]
-#[cfg_attr(feature = "std", derive(Decode, Debug, Serialize))]
-pub struct OuterDispatchMetadata {
-	pub name: DecodeDifferentStr,
-	pub calls: DecodeDifferentArray,
-}
-
-/// A Call from the outer dispatch.
-#[derive(Clone, PartialEq, Eq, Encode)]
-#[cfg_attr(feature = "std", derive(Decode, Debug, Serialize))]
-pub struct OuterDispatchCall {
-	pub name: DecodeDifferentStr,
-	pub index: u16,
-}
-
 #[derive(Eq, Encode, PartialEq)]
 #[cfg_attr(feature = "std", derive(Decode, Debug, Serialize))]
 /// Metadata prefixed by a u32 for reserved usage
@@ -327,8 +311,10 @@ pub enum RuntimeMetadata {
 	V2(RuntimeMetadataDeprecated),
 	/// Version 3 for runtime metadata. No longer used.
 	V3(RuntimeMetadataDeprecated),
-	/// Version 4 for runtime metadata.
-	V4(RuntimeMetadataV4),
+	/// Version 4 for runtime metadata. No longer used.
+	V4(RuntimeMetadataDeprecated),
+	/// Version 5 for runtime metadata.
+	V5(RuntimeMetadataV5),
 }
 
 /// Enum that should fail.
@@ -351,7 +337,7 @@ impl Decode for RuntimeMetadataDeprecated {
 /// The metadata of a runtime.
 #[derive(Eq, Encode, PartialEq)]
 #[cfg_attr(feature = "std", derive(Decode, Debug, Serialize))]
-pub struct RuntimeMetadataV4 {
+pub struct RuntimeMetadataV5 {
 	pub modules: DecodeDifferentArray,
 }
 
diff --git a/srml/session/Cargo.toml b/srml/session/Cargo.toml
index 318c6d9f2266b721a24012c60f59cdd526f5f161..2c8c040ea1519408ac68cd6144b2725aa0fd4fac 100644
--- a/srml/session/Cargo.toml
+++ b/srml/session/Cargo.toml
@@ -11,7 +11,6 @@ parity-codec = { version = "3.3", default-features = false, features = ["derive"
 rstd = { package = "sr-std", path = "../../core/sr-std", default-features = false }
 primitives = { package = "sr-primitives", path = "../../core/sr-primitives", default-features = false }
 srml-support = { path = "../support", default-features = false }
-consensus = { package = "srml-consensus", path = "../consensus", default-features = false }
 system = { package = "srml-system", path = "../system", default-features = false }
 timestamp = { package = "srml-timestamp", path = "../timestamp", default-features = false }
 
@@ -29,7 +28,5 @@ std = [
 	"rstd/std",
 	"srml-support/std",
 	"primitives/std",
-	"consensus/std",
-	"system/std",
 	"timestamp/std"
 ]
diff --git a/srml/session/src/lib.rs b/srml/session/src/lib.rs
index 255bb4f64741616885bc71b53091ddb7a0d5d4cf..3ae7c9801299be7026bcadfe4c66be07dc77b36c 100644
--- a/srml/session/src/lib.rs
+++ b/srml/session/src/lib.rs
@@ -115,208 +115,259 @@
 
 #![cfg_attr(not(feature = "std"), no_std)]
 
-use rstd::prelude::*;
-use primitives::traits::{As, Zero, One, Convert};
+use rstd::{prelude::*, marker::PhantomData, ops::Rem};
+#[cfg(not(feature = "std"))]
+use rstd::alloc::borrow::ToOwned;
+use parity_codec::Decode;
+use primitives::traits::{Zero, Saturating, Member, OpaqueKeys};
 use srml_support::{StorageValue, StorageMap, for_each_tuple, decl_module, decl_event, decl_storage};
-use srml_support::{dispatch::Result, traits::OnFreeBalanceZero};
+use srml_support::{ensure, traits::{OnFreeBalanceZero, Get}, Parameter, print};
 use system::ensure_signed;
-use rstd::ops::Mul;
 
-/// A session has changed.
-pub trait OnSessionChange {
-	/// Session has changed.
-	fn on_session_change(time_elapsed: T, should_reward: bool);
+/// Simple index type with which we can count sessions.
+pub type SessionIndex = u32;
+
+pub trait ShouldEndSession {
+	fn should_end_session(now: BlockNumber) -> bool;
+}
+
+pub struct PeriodicSessions<
+	Period,
+	Offset,
+>(PhantomData<(Period, Offset)>);
+
+impl<
+	BlockNumber: Rem + Saturating + Zero,
+	Period: Get,
+	Offset: Get,
+> ShouldEndSession for PeriodicSessions {
+	fn should_end_session(now: BlockNumber) -> bool {
+		((now.saturating_sub(Offset::get())) % Period::get()).is_zero()
+	}
+}
+
+pub trait OnSessionEnding {
+	/// Handle the fact that the session is ending, and optionally provide the new validator set.
+	fn on_session_ending(i: SessionIndex) -> Option>;
+}
+
+impl OnSessionEnding for () {
+	fn on_session_ending(_: SessionIndex) -> Option> { None }
+}
+
+/// Handler for when a session keys set changes.
+pub trait SessionHandler {
+	/// Session set has changed; act appropriately.
+	fn on_new_session(changed: bool, validators: &[(AccountId, Ks)]);
+
+	/// A validator got disabled. Act accordingly until a new session begins.
+	fn on_disabled(validator_index: usize);
 }
 
-macro_rules! impl_session_change {
+pub trait OneSessionHandler {
+	type Key: Decode + Default;
+	fn on_new_session<'a, I: 'a>(changed: bool, validators: I)
+		where I: Iterator, AccountId: 'a;
+	fn on_disabled(i: usize);
+}
+
+macro_rules! impl_session_handlers {
 	() => (
-		impl OnSessionChange for () {
-			fn on_session_change(_: T, _: bool) {}
+		impl SessionHandler for () {
+			fn on_new_session(_: bool, _: &[(AId, Ks)]) {}
+			fn on_disabled(_: usize) {}
 		}
 	);
 
 	( $($t:ident)* ) => {
-		impl),*> OnSessionChange for ($($t,)*) {
-			fn on_session_change(time_elapsed: T, should_reward: bool) {
-				$($t::on_session_change(time_elapsed.clone(), should_reward);)*
+		impl ),*> SessionHandler for ( $( $t , )* ) {
+			fn on_new_session(changed: bool, validators: &[(AId, Ks)]) {
+				let mut i: usize = 0;
+				$(
+					i += 1;
+					let our_keys = validators.iter()
+						.map(|k| (&k.0, k.1.get::<$t::Key>(i - 1).unwrap_or_default()));
+					$t::on_new_session(changed, our_keys);
+				)*
+			}
+			fn on_disabled(i: usize) {
+				$(
+					$t::on_disabled(i);
+				)*
 			}
 		}
 	}
 }
 
-for_each_tuple!(impl_session_change);
+for_each_tuple!(impl_session_handlers);
 
-pub trait Trait: timestamp::Trait + consensus::Trait {
-	/// Create a session key from an account key.
-	type ConvertAccountIdToSessionKey: Convert>;
-
-	/// Handler when a session changes.
-	type OnSessionChange: OnSessionChange;
 
+pub trait Trait: system::Trait {
 	/// The overarching event type.
-	type Event: From> + Into<::Event>;
-}
+	type Event: From + Into<::Event>;
 
-decl_module! {
-	pub struct Module for enum Call where origin: T::Origin {
-		fn deposit_event() = default;
-
-		/// Sets the session key of a validator (function caller) to `key`.
-		/// This doesn't take effect until the next session.
-		fn set_key(origin, key: T::SessionKey) {
-			let who = ensure_signed(origin)?;
-			// set new value for next session
-			>::insert(who, key);
-		}
+	/// Indicator for when to end the session.
+	type ShouldEndSession: ShouldEndSession;
 
-		/// Set a new session length. Won't kick in until the next session change (at current length).
-		fn set_length(#[compact] new: T::BlockNumber) {
-			>::put(new);
-		}
+	/// Handler for when a session is about to end.
+	type OnSessionEnding: OnSessionEnding;
 
-		/// Forces a new session.
-		fn force_new_session(apply_rewards: bool) -> Result {
-			Self::apply_force_new_session(apply_rewards)
-		}
+	/// Handler when a session has changed.
+	type SessionHandler: SessionHandler;
 
-		/// Called when a block is finalized. Will rotate session if it is the last
-		/// block of the current session.
-		fn on_finalize(n: T::BlockNumber) {
-			Self::check_rotate_session(n);
-		}
-	}
+	/// The keys.
+	type Keys: OpaqueKeys + Member + Parameter + Default;
 }
 
-decl_event!(
-	pub enum Event where ::BlockNumber {
-		/// New session has happened. Note that the argument is the session index, not the block
-		/// number as the type might suggest.
-		NewSession(BlockNumber),
-	}
-);
+type OpaqueKey = Vec;
 
 decl_storage! {
 	trait Store for Module as Session {
 		/// The current set of validators.
 		pub Validators get(validators) config(): Vec;
-		/// Current length of the session.
-		pub SessionLength get(length) config(session_length): T::BlockNumber = T::BlockNumber::sa(1000);
+
 		/// Current index of the session.
-		pub CurrentIndex get(current_index) build(|_| T::BlockNumber::sa(0)): T::BlockNumber;
-		/// Timestamp when current session started.
-		pub CurrentStart get(current_start) build(|_| T::Moment::zero()): T::Moment;
-
-		/// New session is being forced if this entry exists; in which case, the boolean value is true if
-		/// the new session should be considered a normal rotation (rewardable) and false if the new session
-		/// should be considered exceptional (slashable).
-		pub ForcingNewSession get(forcing_new_session): Option;
-		/// Block at which the session length last changed.
-		LastLengthChange: Option;
+		pub CurrentIndex get(current_index): SessionIndex;
+
+		/// True if anything has changed in this session.
+		Changed: bool;
+
 		/// The next key for a given validator.
 		NextKeyFor build(|config: &GenesisConfig| {
 			config.keys.clone()
-		}): map T::AccountId => Option;
-		/// The next session length.
-		NextSessionLength: Option;
+		}): map T::AccountId => Option;
+
+		/// The keys that are currently active.
+		Active build(|config: &GenesisConfig| {
+			(0..T::Keys::count()).map(|i| (
+				i as u32,
+				config.keys.iter()
+					.map(|x| x.1.get_raw(i).to_vec())
+					.collect::>(),
+			)).collect::)>>()
+		}): map u32 => Vec;
 	}
 	add_extra_genesis {
-		config(keys): Vec<(T::AccountId, T::SessionKey)>;
+		config(keys): Vec<(T::AccountId, T::Keys)>;
 	}
 }
 
-impl Module {
-	/// The current number of validators.
-	pub fn validator_count() -> u32 {
-		>::get().len() as u32
+decl_event!(
+	pub enum Event {
+		/// New session has happened. Note that the argument is the session index, not the block
+		/// number as the type might suggest.
+		NewSession(SessionIndex),
 	}
+);
 
-	/// The last length change if there was one, zero if not.
-	pub fn last_length_change() -> T::BlockNumber {
-		>::get().unwrap_or_else(T::BlockNumber::zero)
-	}
+decl_module! {
+	pub struct Module for enum Call where origin: T::Origin {
+		fn deposit_event() = default;
 
-	// INTERNAL API (available to other runtime modules)
-	/// Forces a new session, no origin.
-	pub fn apply_force_new_session(apply_rewards: bool) -> Result {
-		>::put(apply_rewards);
-		Ok(())
-	}
+		/// Sets the session key(s) of the function caller to `key`.
+		/// Allows an account to set its session key prior to becoming a validator.
+		/// This doesn't take effect until the next session.
+		///
+		/// The dispatch origin of this function must be signed.
+		///
+		/// # 
+		/// - O(1).
+		/// - One extra DB entry.
+		/// # 
+		fn set_keys(origin, keys: T::Keys, proof: Vec) {
+			let who = ensure_signed(origin)?;
 
-	/// Set the current set of validators.
-	///
-	/// Called by `staking::new_era` only. `rotate_session` must be called after this in order to
-	/// update the session keys to the next validator set.
-	pub fn set_validators(new: &[T::AccountId]) {
-		>::put(&new.to_vec());
-	}
+			ensure!(keys.ownership_proof_is_valid(&proof), "invalid ownership proof");
+
+			let old_keys = >::get(&who);
+			let mut updates = vec![];
+
+			for i in 0..T::Keys::count() {
+				let new_key = keys.get_raw(i);
+				let maybe_old_key = old_keys.as_ref().map(|o| o.get_raw(i));
+				if maybe_old_key == Some(new_key) {
+					// no change.
+					updates.push(None);
+					continue;
+				}
+				let mut active = >::get(i as u32);
+				match active.binary_search_by(|k| k[..].cmp(&new_key)) {
+					Ok(_) => return Err("duplicate key provided"),
+					Err(pos) => active.insert(pos, new_key.to_owned()),
+				}
+				if let Some(old_key) = maybe_old_key {
+					match active.binary_search_by(|k| k[..].cmp(&old_key)) {
+						Ok(pos) => { active.remove(pos); }
+						Err(_) => {
+							// unreachable as long as our state is valid. we don't want to panic if
+							// it isn't, though.
+							print("ERROR: active doesn't contain outgoing key");
+						}
+					}
+				}
+				updates.push(Some((i, active)));
+			}
+
+			// Update the active sets.
+			for (i, active) in updates.into_iter().filter_map(|x| x) {
+				>::insert(i as u32, active);
+			}
+			// Set new keys value for next session.
+			>::insert(who, keys);
+			// Something changed.
+			>::put(true);
+		}
 
-	/// Hook to be called after transaction processing.
-	pub fn check_rotate_session(block_number: T::BlockNumber) {
-		// Do this last, after the staking system has had the chance to switch out the authorities for the
-		// new set.
-		// Check block number and call `rotate_session` if necessary.
-		let is_final_block = ((block_number - Self::last_length_change()) % Self::length()).is_zero();
-		let (should_end_session, apply_rewards) = >::take()
-			.map_or((is_final_block, is_final_block), |apply_rewards| (true, apply_rewards));
-		if should_end_session {
-			Self::rotate_session(is_final_block, apply_rewards);
+		/// Called when a block is finalized. Will rotate session if it is the last
+		/// block of the current session.
+		fn on_initialize(n: T::BlockNumber) {
+			if T::ShouldEndSession::should_end_session(n) {
+				Self::rotate_session();
+			}
 		}
 	}
+}
 
+impl Module {
 	/// Move on to next session: register the new authority set.
-	pub fn rotate_session(is_final_block: bool, apply_rewards: bool) {
-		let now = >::get();
-		let time_elapsed = now.clone() - Self::current_start();
-		let session_index = >::get() + One::one();
-
-		Self::deposit_event(RawEvent::NewSession(session_index));
-
+	pub fn rotate_session() {
 		// Increment current session index.
-		>::put(session_index);
-		>::put(now);
+		let session_index = >::get();
 
-		// Enact session length change.
-		let len_changed = if let Some(next_len) = >::take() {
-			>::put(next_len);
-			true
+		let mut changed = >::take();
+
+		// See if we have a new validator set.
+		let validators = if let Some(new) = T::OnSessionEnding::on_session_ending(session_index) {
+			changed = true;
+			>::put(&new);
+			new
 		} else {
-			false
+			>::get()
 		};
-		if len_changed || !is_final_block {
-			let block_number = >::block_number();
-			>::put(block_number);
-		}
 
-		T::OnSessionChange::on_session_change(time_elapsed, apply_rewards);
+		let session_index = session_index + 1;
+		>::put(session_index);
 
-		// Update any changes in session keys.
-		let v = Self::validators();
-		>::set_authority_count(v.len() as u32);
-		for (i, v) in v.into_iter().enumerate() {
-			>::set_authority(
-				i as u32,
-				&>::get(&v)
-					.or_else(|| T::ConvertAccountIdToSessionKey::convert(v))
-					.unwrap_or_default()
-			);
-		};
+		// Record that this happened.
+		Self::deposit_event(Event::NewSession(session_index));
+
+		// Tell everyone about the new session keys.
+		let amalgamated = validators.into_iter()
+			.map(|a| { let k = >::get(&a).unwrap_or_default(); (a, k) })
+			.collect::>();
+		T::SessionHandler::on_new_session::(changed, &amalgamated);
 	}
 
-	/// Get the time that should elapse over a session if everything is working perfectly.
-	pub fn ideal_session_duration() -> T::Moment {
-		let block_period: T::Moment = >::minimum_period();
-		let session_length: T::BlockNumber = Self::length();
-		Mul::::mul(block_period, session_length)
+	/// Disable the validator of index `i`.
+	pub fn disable_index(i: usize) {
+		T::SessionHandler::on_disabled(i);
+		>::put(true);
 	}
 
-	/// Number of blocks remaining in this session, not counting this one. If the session is
-	/// due to rotate at the end of this block, then it will return 0. If the session just began, then
-	/// it will return `Self::length() - 1`.
-	pub fn blocks_remaining() -> T::BlockNumber {
-		let length = Self::length();
-		let length_minus_1 = length - One::one();
-		let block_number = >::block_number();
-		length_minus_1 - (block_number - Self::last_length_change() + length_minus_1) % length
+	/// Disable the validator identified by `c`. (If using with the staking module, this would be
+	/// their *controller* account.)
+	pub fn disable(c: &T::AccountId) -> rstd::result::Result<(), ()> {
+		Self::validators().iter().position(|i| i == c).map(Self::disable_index).ok_or(())
 	}
 }
 
@@ -334,8 +385,8 @@ mod tests {
 	use runtime_io::with_externalities;
 	use substrate_primitives::{H256, Blake2Hasher};
 	use primitives::BuildStorage;
-	use primitives::traits::{BlakeTwo256, IdentityLookup};
-	use primitives::testing::{Digest, DigestItem, Header, UintAuthorityId, ConvertUintAuthorityId};
+	use primitives::traits::{BlakeTwo256, IdentityLookup, OnInitialize};
+	use primitives::testing::{Header, UintAuthorityId};
 
 	impl_outer_origin!{
 		pub enum Origin for Test {}
@@ -343,62 +394,87 @@ mod tests {
 
 	thread_local!{
 		static NEXT_VALIDATORS: RefCell> = RefCell::new(vec![1, 2, 3]);
+		static AUTHORITIES: RefCell> =
+			RefCell::new(vec![UintAuthorityId(1), UintAuthorityId(2), UintAuthorityId(3)]);
+		static FORCE_SESSION_END: RefCell = RefCell::new(false);
+		static SESSION_LENGTH: RefCell = RefCell::new(2);
 	}
 
-	pub struct TestOnSessionChange;
-	impl OnSessionChange for TestOnSessionChange {
-		fn on_session_change(_elapsed: u64, _should_reward: bool) {
-			NEXT_VALIDATORS.with(|v| Session::set_validators(&*v.borrow()));
+	pub struct TestShouldEndSession;
+	impl ShouldEndSession for TestShouldEndSession {
+		fn should_end_session(now: u64) -> bool {
+			let l = SESSION_LENGTH.with(|l| *l.borrow());
+			now % l == 0 || FORCE_SESSION_END.with(|l| { let r = *l.borrow(); *l.borrow_mut() = false; r })
 		}
 	}
 
+	pub struct TestSessionHandler;
+	impl SessionHandler for TestSessionHandler {
+		fn on_new_session(_changed: bool, validators: &[(u64, T)]) {
+			AUTHORITIES.with(|l|
+				*l.borrow_mut() = validators.iter().map(|(_, id)| id.get::(0).unwrap_or_default()).collect()
+			);
+		}
+		fn on_disabled(_validator_index: usize) {}
+	}
+
+	pub struct TestOnSessionEnding;
+	impl OnSessionEnding for TestOnSessionEnding {
+		fn on_session_ending(_: SessionIndex) -> Option> {
+			Some(NEXT_VALIDATORS.with(|l| l.borrow().clone()))
+		}
+	}
+
+	fn authorities() -> Vec {
+		AUTHORITIES.with(|l| l.borrow().to_vec())
+	}
+
+	fn force_new_session() {
+		FORCE_SESSION_END.with(|l| *l.borrow_mut() = true )
+	}
+
+	fn set_session_length(x: u64) {
+		SESSION_LENGTH.with(|l| *l.borrow_mut() = x )
+	}
+
 	#[derive(Clone, Eq, PartialEq)]
 	pub struct Test;
-	impl consensus::Trait for Test {
-		type Log = DigestItem;
-		type SessionKey = UintAuthorityId;
-		type InherentOfflineReport = ();
-	}
 	impl system::Trait for Test {
 		type Origin = Origin;
 		type Index = u64;
 		type BlockNumber = u64;
 		type Hash = H256;
 		type Hashing = BlakeTwo256;
-		type Digest = Digest;
 		type AccountId = u64;
 		type Lookup = IdentityLookup;
 		type Header = Header;
 		type Event = ();
-		type Log = DigestItem;
 	}
 	impl timestamp::Trait for Test {
 		type Moment = u64;
 		type OnTimestampSet = ();
 	}
 	impl Trait for Test {
-		type ConvertAccountIdToSessionKey = ConvertUintAuthorityId;
-		type OnSessionChange = TestOnSessionChange;
+		type ShouldEndSession = TestShouldEndSession;
+		type OnSessionEnding = TestOnSessionEnding;
+		type SessionHandler = TestSessionHandler;
+		type Keys = UintAuthorityId;
 		type Event = ();
 	}
 
 	type System = system::Module;
-	type Consensus = consensus::Module;
 	type Session = Module;
 
 	fn new_test_ext() -> runtime_io::TestExternalities {
 		let mut t = system::GenesisConfig::::default().build_storage().unwrap().0;
-		t.extend(consensus::GenesisConfig::{
-			code: vec![],
-			authorities: NEXT_VALIDATORS.with(|l| l.borrow().iter().cloned().map(UintAuthorityId).collect()),
-		}.build_storage().unwrap().0);
 		t.extend(timestamp::GenesisConfig::{
 			minimum_period: 5,
 		}.build_storage().unwrap().0);
 		t.extend(GenesisConfig::{
-			session_length: 2,
 			validators: NEXT_VALIDATORS.with(|l| l.borrow().clone()),
-			keys: vec![],
+			keys: NEXT_VALIDATORS.with(|l|
+				l.borrow().iter().cloned().map(|i| (i, UintAuthorityId(i))).collect()
+			),
 		}.build_storage().unwrap().0);
 		runtime_io::TestExternalities::new(t)
 	}
@@ -406,8 +482,7 @@ mod tests {
 	#[test]
 	fn simple_setup_should_work() {
 		with_externalities(&mut new_test_ext(), || {
-			assert_eq!(Consensus::authorities(), vec![UintAuthorityId(1), UintAuthorityId(2), UintAuthorityId(3)]);
-			assert_eq!(Session::length(), 2);
+			assert_eq!(authorities(), vec![UintAuthorityId(1), UintAuthorityId(2), UintAuthorityId(3)]);
 			assert_eq!(Session::validators(), vec![1, 2, 3]);
 		});
 	}
@@ -416,106 +491,56 @@ mod tests {
 	fn authorities_should_track_validators() {
 		with_externalities(&mut new_test_ext(), || {
 			NEXT_VALIDATORS.with(|v| *v.borrow_mut() = vec![1, 2]);
-			assert_ok!(Session::force_new_session(false));
-			Session::check_rotate_session(1);
+			force_new_session();
+
+			System::set_block_number(1);
+			Session::on_initialize(1);
 			assert_eq!(Session::validators(), vec![1, 2]);
-			assert_eq!(Consensus::authorities(), vec![UintAuthorityId(1), UintAuthorityId(2)]);
+			assert_eq!(authorities(), vec![UintAuthorityId(1), UintAuthorityId(2)]);
 
 			NEXT_VALIDATORS.with(|v| *v.borrow_mut() = vec![1, 2, 4]);
-			assert_ok!(Session::force_new_session(false));
-			Session::check_rotate_session(2);
+			assert_ok!(Session::set_keys(Origin::signed(4), UintAuthorityId(4), vec![]));
+
+			force_new_session();
+			System::set_block_number(2);
+			Session::on_initialize(2);
 			assert_eq!(Session::validators(), vec![1, 2, 4]);
-			assert_eq!(Consensus::authorities(), vec![UintAuthorityId(1), UintAuthorityId(2), UintAuthorityId(4)]);
+			assert_eq!(authorities(), vec![UintAuthorityId(1), UintAuthorityId(2), UintAuthorityId(4)]);
 
 			NEXT_VALIDATORS.with(|v| *v.borrow_mut() = vec![1, 2, 3]);
-			assert_ok!(Session::force_new_session(false));
-			Session::check_rotate_session(3);
+			force_new_session();
+			System::set_block_number(3);
+			Session::on_initialize(3);
 			assert_eq!(Session::validators(), vec![1, 2, 3]);
-			assert_eq!(Consensus::authorities(), vec![UintAuthorityId(1), UintAuthorityId(2), UintAuthorityId(3)]);
+			assert_eq!(authorities(), vec![UintAuthorityId(1), UintAuthorityId(2), UintAuthorityId(3)]);
 		});
 	}
 
 	#[test]
 	fn should_work_with_early_exit() {
 		with_externalities(&mut new_test_ext(), || {
-			System::set_block_number(1);
-			assert_ok!(Session::set_length(10));
-			assert_eq!(Session::blocks_remaining(), 1);
-			Session::check_rotate_session(1);
+			set_session_length(10);
 
-			System::set_block_number(2);
-			assert_eq!(Session::blocks_remaining(), 0);
-			Session::check_rotate_session(2);
-			assert_eq!(Session::length(), 10);
-
-			System::set_block_number(7);
-			assert_eq!(Session::current_index(), 1);
-			assert_eq!(Session::blocks_remaining(), 5);
-			assert_ok!(Session::force_new_session(false));
-			Session::check_rotate_session(7);
-
-			System::set_block_number(8);
-			assert_eq!(Session::current_index(), 2);
-			assert_eq!(Session::blocks_remaining(), 9);
-			Session::check_rotate_session(8);
-
-			System::set_block_number(17);
-			assert_eq!(Session::current_index(), 2);
-			assert_eq!(Session::blocks_remaining(), 0);
-			Session::check_rotate_session(17);
-
-			System::set_block_number(18);
-			assert_eq!(Session::current_index(), 3);
-		});
-	}
-
-	#[test]
-	fn session_length_change_should_work() {
-		with_externalities(&mut new_test_ext(), || {
-			// Block 1: Change to length 3; no visible change.
 			System::set_block_number(1);
-			assert_ok!(Session::set_length(3));
-			Session::check_rotate_session(1);
-			assert_eq!(Session::length(), 2);
+			Session::on_initialize(1);
 			assert_eq!(Session::current_index(), 0);
 
-			// Block 2: Length now changed to 3. Index incremented.
 			System::set_block_number(2);
-			assert_ok!(Session::set_length(3));
-			Session::check_rotate_session(2);
-			assert_eq!(Session::length(), 3);
-			assert_eq!(Session::current_index(), 1);
+			Session::on_initialize(2);
+			assert_eq!(Session::current_index(), 0);
+			force_new_session();
 
-			// Block 3: Length now changed to 3. Index incremented.
 			System::set_block_number(3);
-			Session::check_rotate_session(3);
-			assert_eq!(Session::length(), 3);
+			Session::on_initialize(3);
 			assert_eq!(Session::current_index(), 1);
 
-			// Block 4: Change to length 2; no visible change.
-			System::set_block_number(4);
-			assert_ok!(Session::set_length(2));
-			Session::check_rotate_session(4);
-			assert_eq!(Session::length(), 3);
+			System::set_block_number(9);
+			Session::on_initialize(9);
 			assert_eq!(Session::current_index(), 1);
 
-			// Block 5: Length now changed to 2. Index incremented.
-			System::set_block_number(5);
-			Session::check_rotate_session(5);
-			assert_eq!(Session::length(), 2);
-			assert_eq!(Session::current_index(), 2);
-
-			// Block 6: No change.
-			System::set_block_number(6);
-			Session::check_rotate_session(6);
-			assert_eq!(Session::length(), 2);
+			System::set_block_number(10);
+			Session::on_initialize(10);
 			assert_eq!(Session::current_index(), 2);
-
-			// Block 7: Next index.
-			System::set_block_number(7);
-			Session::check_rotate_session(7);
-			assert_eq!(Session::length(), 2);
-			assert_eq!(Session::current_index(), 3);
 		});
 	}
 
@@ -524,26 +549,24 @@ mod tests {
 		with_externalities(&mut new_test_ext(), || {
 			// Block 1: No change
 			System::set_block_number(1);
-			Session::check_rotate_session(1);
-			assert_eq!(Consensus::authorities(), vec![UintAuthorityId(1), UintAuthorityId(2), UintAuthorityId(3)]);
+			Session::on_initialize(1);
+			assert_eq!(authorities(), vec![UintAuthorityId(1), UintAuthorityId(2), UintAuthorityId(3)]);
 
 			// Block 2: Session rollover, but no change.
 			System::set_block_number(2);
-			Session::check_rotate_session(2);
-			assert_eq!(Consensus::authorities(), vec![UintAuthorityId(1), UintAuthorityId(2), UintAuthorityId(3)]);
+			Session::on_initialize(2);
+			assert_eq!(authorities(), vec![UintAuthorityId(1), UintAuthorityId(2), UintAuthorityId(3)]);
 
 			// Block 3: Set new key for validator 2; no visible change.
 			System::set_block_number(3);
-			assert_ok!(Session::set_key(Origin::signed(2), UintAuthorityId(5)));
-			assert_eq!(Consensus::authorities(), vec![UintAuthorityId(1), UintAuthorityId(2), UintAuthorityId(3)]);
-
-			Session::check_rotate_session(3);
-			assert_eq!(Consensus::authorities(), vec![UintAuthorityId(1), UintAuthorityId(2), UintAuthorityId(3)]);
+			Session::on_initialize(3);
+			assert_ok!(Session::set_keys(Origin::signed(2), UintAuthorityId(5), vec![]));
+			assert_eq!(authorities(), vec![UintAuthorityId(1), UintAuthorityId(2), UintAuthorityId(3)]);
 
 			// Block 4: Session rollover, authority 2 changes.
 			System::set_block_number(4);
-			Session::check_rotate_session(4);
-			assert_eq!(Consensus::authorities(), vec![UintAuthorityId(1), UintAuthorityId(5), UintAuthorityId(3)]);
+			Session::on_initialize(4);
+			assert_eq!(authorities(), vec![UintAuthorityId(1), UintAuthorityId(5), UintAuthorityId(3)]);
 		});
 	}
 }
diff --git a/srml/staking/Cargo.toml b/srml/staking/Cargo.toml
index 857ea73ee44421cf6ce636e558d858ff969e492c..1b95f30f32350b4135c85860c0d4ebd37dfef1ac 100644
--- a/srml/staking/Cargo.toml
+++ b/srml/staking/Cargo.toml
@@ -13,7 +13,6 @@ rstd = { package = "sr-std", path = "../../core/sr-std", default-features = fals
 runtime_io = { package = "sr-io", path = "../../core/sr-io", default-features = false }
 primitives = { package = "sr-primitives", path = "../../core/sr-primitives", default-features = false }
 srml-support = { path = "../support", default-features = false }
-consensus = { package = "srml-consensus", path = "../consensus", default-features = false }
 system = { package = "srml-system", path = "../system", default-features = false }
 session = { package = "srml-session", path = "../session", default-features = false }
 
@@ -21,8 +20,10 @@ session = { package = "srml-session", path = "../session", default-features = fa
 substrate-primitives = { path = "../../core/primitives" }
 timestamp = { package = "srml-timestamp", path = "../timestamp" }
 balances = { package = "srml-balances", path = "../balances" }
+rand = "0.6.5"
 
 [features]
+bench = []
 default = ["std"]
 std = [
 	"serde",
diff --git a/srml/staking/src/benches.rs b/srml/staking/src/benches.rs
new file mode 100644
index 0000000000000000000000000000000000000000..e3ee00b9e94802658a05364b1b0b34a1ceee79ff
--- /dev/null
+++ b/srml/staking/src/benches.rs
@@ -0,0 +1,114 @@
+// Copyright 2019 Parity Technologies
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+//! Benchmarks of the phragmen election algorithm.
+//! Note that execution times will not be accurate in an absolute scale, since
+//! - Everything is executed in the context of `TestExternalities`
+//! - Everything is executed in native environment.
+//!
+//! Run using:
+//!
+//! ```zsh
+//!  cargo bench --features bench --color always
+//! ```
+
+use test::Bencher;
+use runtime_io::with_externalities;
+use mock::*;
+use super::*;
+use rand::{self, Rng};
+
+const VALIDATORS: u64 = 1000;
+const NOMINATORS: u64 = 10_000;
+const EDGES: u64 = 2;
+const TO_ELECT: usize = 100;
+const STAKE: u64 = 1000;
+
+fn do_phragmen(b: &mut Bencher, num_vals: u64, num_noms: u64, count: usize, votes_per: u64) {
+	with_externalities(&mut ExtBuilder::default().nominate(false).build(), || {
+		assert!(num_vals > votes_per);
+		let rr = |a, b| rand::thread_rng().gen_range(a as usize, b as usize) as u64;
+
+		// prefix to distinguish the validator and nominator account ranges.
+		let np = 10_000;
+
+		(1 ..= 2*num_vals)
+			.step_by(2)
+			.for_each(|acc| bond_validator(acc, STAKE + rr(10, 50)));
+
+		(np ..= (np + 2*num_noms))
+			.step_by(2)
+			.for_each(|acc| {
+				let mut stashes_to_vote = (1 ..= 2*num_vals)
+					.step_by(2)
+					.map(|ctrl| ctrl + 1)
+					.collect::>();
+				let votes = (0 .. votes_per)
+					.map(|_| {
+						stashes_to_vote.remove(rr(0, stashes_to_vote.len()) as usize)
+					})
+					.collect::>();
+				bond_nominator(acc, STAKE + rr(10, 50), votes);
+			});
+
+		b.iter(|| {
+			let _ = phragmen::elect::(
+				count,
+				1_usize,
+				>::enumerate(),
+				>::enumerate(),
+				Staking::slashable_balance_of
+			);
+		})
+	})
+}
+
+macro_rules! phragmen_benches {
+	($($name:ident: $tup:expr,)*) => {
+    $(
+        #[bench]
+        fn $name(b: &mut Bencher) {
+			let (v, n, t, e) = $tup;
+			println!("");
+			println!(
+				"++ Benchmark: {} Validators // {} Nominators // {} Edges-per-nominator // {} total edges // electing {}",
+				v, n, e, e * n, t
+			);
+			do_phragmen(b, v, n, t, e);
+        }
+    )*
+	}
+}
+
+phragmen_benches! {
+	bench_1_1: (VALIDATORS, NOMINATORS, TO_ELECT, EDGES),
+	bench_1_2: (VALIDATORS*2, NOMINATORS, TO_ELECT, EDGES),
+	bench_1_3: (VALIDATORS*4, NOMINATORS, TO_ELECT, EDGES),
+	bench_1_4: (VALIDATORS*8, NOMINATORS, TO_ELECT, EDGES),
+
+	bench_0_1: (VALIDATORS, NOMINATORS, TO_ELECT, EDGES),
+	bench_0_2: (VALIDATORS, NOMINATORS, TO_ELECT * 4, EDGES),
+	bench_0_3: (VALIDATORS, NOMINATORS, TO_ELECT * 8, EDGES),
+	bench_0_4: (VALIDATORS, NOMINATORS, TO_ELECT * 16, EDGES),
+
+	bench_2_1: (VALIDATORS, NOMINATORS, TO_ELECT, EDGES),
+	bench_2_2: (VALIDATORS, NOMINATORS*2, TO_ELECT, EDGES),
+	bench_2_3: (VALIDATORS, NOMINATORS*4, TO_ELECT, EDGES),
+	bench_2_4: (VALIDATORS, NOMINATORS*8, TO_ELECT, EDGES),
+
+	bench_3_1: (VALIDATORS, NOMINATORS, TO_ELECT, EDGES),
+	bench_3_2: (VALIDATORS, NOMINATORS, TO_ELECT, EDGES*2),
+	bench_3_3: (VALIDATORS, NOMINATORS, TO_ELECT, EDGES*4),
+	bench_3_4: (VALIDATORS, NOMINATORS, TO_ELECT, EDGES*8),
+}
diff --git a/srml/staking/src/lib.rs b/srml/staking/src/lib.rs
index ec77eab06ff6b5eec8fb1d0746e8d0d344cf8c46..c1b42a8b3bcc05f6036afe7a08b6a1e37ce666d6 100644
--- a/srml/staking/src/lib.rs
+++ b/srml/staking/src/lib.rs
@@ -24,24 +24,25 @@
 //!
 //! ## Overview
 //!
-//! The Staking module is the means by which a set of network maintainers (known as _authorities_ in some contexts
-//! and _validators_ in others) are chosen based upon those who voluntarily place funds under deposit. Under deposit,
-//! those funds are rewarded under normal operation but are held at pain of _slash_ (expropriation) should the
-//! staked maintainer be found not to be discharging its duties properly.
+//! The Staking module is the means by which a set of network maintainers (known as _authorities_
+//! in some contexts and _validators_ in others) are chosen based upon those who voluntarily place
+//! funds under deposit. Under deposit, those funds are rewarded under normal operation but are
+//! held at pain of _slash_ (expropriation) should the staked maintainer be found not to be
+//! discharging its duties properly.
 //!
 //! ### Terminology
 //! 
 //!
-//! - Staking: The process of locking up funds for some time, placing them at risk of slashing (loss)
-//! in order to become a rewarded maintainer of the network.
-//! - Validating: The process of running a node to actively maintain the network, either by producing
-//! blocks or guaranteeing finality of the chain.
-//! - Nominating: The process of placing staked funds behind one or more validators in order to share
-//! in any reward, and punishment, they take.
+//! - Staking: The process of locking up funds for some time, placing them at risk of slashing
+//! (loss) in order to become a rewarded maintainer of the network.
+//! - Validating: The process of running a node to actively maintain the network, either by
+//! producing blocks or guaranteeing finality of the chain.
+//! - Nominating: The process of placing staked funds behind one or more validators in order to
+//! share in any reward, and punishment, they take.
 //! - Stash account: The account holding an owner's funds used for staking.
 //! - Controller account: The account that controls an owner's funds for staking.
-//! - Era: A (whole) number of sessions, which is the period that the validator set (and each validator's
-//! active nominator set) is recalculated and where rewards are paid out.
+//! - Era: A (whole) number of sessions, which is the period that the validator set (and each
+//! validator's active nominator set) is recalculated and where rewards are paid out.
 //! - Slash: The punishment of a staker by reducing its funds.
 //!
 //! ### Goals
@@ -57,50 +58,55 @@
 //!
 //! #### Staking
 //!
-//! Almost any interaction with the Staking module requires a process of _**bonding**_ (also known as
-//! being a _staker_). To become *bonded*, a fund-holding account known as the _stash account_, which holds
-//! some or all of the funds that become frozen in place as part of the staking process, is paired with an
-//! active **controller** account, which issues instructions on how they shall be used.
+//! Almost any interaction with the Staking module requires a process of _**bonding**_ (also known
+//! as being a _staker_). To become *bonded*, a fund-holding account known as the _stash account_,
+//! which holds some or all of the funds that become frozen in place as part of the staking process,
+//! is paired with an active **controller** account, which issues instructions on how they shall be
+//! used.
 //!
 //! An account pair can become bonded using the [`bond`](./enum.Call.html#variant.bond) call.
 //!
 //! Stash accounts can change their associated controller using the
 //! [`set_controller`](./enum.Call.html#variant.set_controller) call.
 //!
-//! There are three possible roles that any staked account pair can be in: `Validator`, `Nominator` and `Idle`
-//! (defined in [`StakerStatus`](./enum.StakerStatus.html)). There are three corresponding instructions to change between roles, namely:
+//! There are three possible roles that any staked account pair can be in: `Validator`, `Nominator`
+//! and `Idle` (defined in [`StakerStatus`](./enum.StakerStatus.html)). There are three
+//! corresponding instructions to change between roles, namely:
 //! [`validate`](./enum.Call.html#variant.validate), [`nominate`](./enum.Call.html#variant.nominate),
 //! and [`chill`](./enum.Call.html#variant.chill).
 //!
 //! #### Validating
 //!
-//! A **validator** takes the role of either validating blocks or ensuring their finality, maintaining the veracity of
-//! the network. A validator should avoid both any sort of malicious misbehavior and going offline.
-//! Bonded accounts that state interest in being a validator do NOT get immediately chosen as a validator. Instead, they
-//! are declared as a _candidate_ and they _might_ get elected at the _next era_ as a validator. The result of the
-//! election is determined by nominators and their votes.
+//! A **validator** takes the role of either validating blocks or ensuring their finality,
+//! maintaining the veracity of the network. A validator should avoid both any sort of malicious
+//! misbehavior and going offline. Bonded accounts that state interest in being a validator do NOT
+//! get immediately chosen as a validator. Instead, they are declared as a _candidate_ and they
+//! _might_ get elected at the _next era_ as a validator. The result of the election is determined
+//! by nominators and their votes.
 //!
-//! An account can become a validator candidate via the [`validate`](./enum.Call.html#variant.validate) call.
+//! An account can become a validator candidate via the
+//! [`validate`](./enum.Call.html#variant.validate) call.
 //!
 //! #### Nomination
 //!
-//! A **nominator** does not take any _direct_ role in maintaining the network, instead, it votes on a set of validators
-//! to be elected. Once interest in nomination is stated by an account, it takes effect at the next election round. The
-//! funds in the nominator's stash account indicate the _weight_ of its vote.
-//! Both the rewards and any punishment that a validator earns are shared between the validator and its nominators.
-//! This rule incentivizes the nominators to NOT vote for the misbehaving/offline validators as much as possible, simply
-//! because the nominators will also lose funds if they vote poorly.
+//! A **nominator** does not take any _direct_ role in maintaining the network, instead, it votes on
+//! a set of validators  to be elected. Once interest in nomination is stated by an account, it
+//! takes effect at the next election round. The funds in the nominator's stash account indicate the
+//! _weight_ of its vote. Both the rewards and any punishment that a validator earns are shared
+//! between the validator and its nominators. This rule incentivizes the nominators to NOT vote for
+//! the misbehaving/offline validators as much as possible, simply because the nominators will also
+//! lose funds if they vote poorly.
 //!
 //! An account can become a nominator via the [`nominate`](enum.Call.html#variant.nominate) call.
 //!
 //! #### Rewards and Slash
 //!
-//! The **reward and slashing** procedure is the core of the Staking module, attempting to _embrace valid behavior_
-//! while _punishing any misbehavior or lack of availability_.
+//! The **reward and slashing** procedure is the core of the Staking module, attempting to _embrace
+//! valid behavior_ while _punishing any misbehavior or lack of availability_.
 //!
-//! Slashing can occur at any point in time, once misbehavior is reported. Once slashing is determined, a value is
-//! deducted from the balance of the validator and all the nominators who voted for this validator
-//! (values are deducted from the _stash_ account of the slashed entity).
+//! Slashing can occur at any point in time, once misbehavior is reported. Once slashing is
+//! determined, a value is deducted from the balance of the validator and all the nominators who
+//! voted for this validator (values are deducted from the _stash_ account of the slashed entity).
 //!
 //! Similar to slashing, rewards are also shared among a validator and its associated nominators.
 //! Yet, the reward funds are not always transferred to the stash account and can be configured.
@@ -108,9 +114,9 @@
 //!
 //! #### Chilling
 //!
-//! Finally, any of the roles above can choose to step back temporarily and just chill for a while. This means that if
-//! they are a nominator, they will not be considered as voters anymore and if they are validators, they will no longer
-//! be a candidate for the next election.
+//! Finally, any of the roles above can choose to step back temporarily and just chill for a while.
+//! This means that if they are a nominator, they will not be considered as voters anymore and if
+//! they are validators, they will no longer be a candidate for the next election.
 //!
 //! An account can step back via the [`chill`](enum.Call.html#variant.chill) call.
 //!
@@ -118,8 +124,8 @@
 //!
 //! ### Dispatchable Functions
 //!
-//! The dispatchable functions of the Staking module enable the steps needed for entities to accept and change their
-//! role, alongside some helper functions to get/set the metadata of the module.
+//! The dispatchable functions of the Staking module enable the steps needed for entities to accept
+//! and change their role, alongside some helper functions to get/set the metadata of the module.
 //!
 //! ### Public Functions
 //!
@@ -153,30 +159,34 @@
 //!
 //! ### Slot Stake
 //!
-//! The term [`SlotStake`](./struct.Module.html#method.slot_stake) will be used throughout this section. It refers
-//! to a value calculated at the end of each era, containing the _minimum value at stake among all validators._
-//! Note that a validator's value at stake might be a combination of The validator's own stake
-//! and the votes it received. See [`Exposure`](./struct.Exposure.html) for more details.
+//! The term [`SlotStake`](./struct.Module.html#method.slot_stake) will be used throughout this
+//! section. It refers to a value calculated at the end of each era, containing the _minimum value
+//! at stake among all validators._ Note that a validator's value at stake might be a combination
+//! of the validator's own stake and the votes it received. See [`Exposure`](./struct.Exposure.html)
+//! for more details.
 //!
 //! ### Reward Calculation
 //!
-//! Rewards are recorded **per-session** and paid **per-era**. The value of the reward for each session is calculated at
-//! the end of the session based on the timeliness of the session, then accumulated to be paid later. The value of
-//! the new _per-session-reward_ is calculated at the end of each era by multiplying `SlotStake` and `SessionReward`
-//! (`SessionReward` is the multiplication factor, represented by a number between 0 and 1).
-//! Once a new era is triggered, rewards are paid to the validators and their associated nominators.
+//! Rewards are recorded **per-session** and paid **per-era**. The value of the reward for each
+//! session is calculated at the end of the session based on the timeliness of the session, then
+//! accumulated to be paid later. The value of the new _per-session-reward_ is calculated at the end
+//! of each era by multiplying `SlotStake` and `SessionReward`  (`SessionReward` is the
+//! multiplication factor, represented by a number between 0 and 1). Once a new era is triggered,
+//! rewards are paid to the validators and their associated nominators.
 //!
 //! The validator can declare an amount, named
-//! [`validator_payment`](./struct.ValidatorPrefs.html#structfield.validator_payment), that does not get shared
-//! with the nominators at each reward payout through its [`ValidatorPrefs`](./struct.ValidatorPrefs.html). This value
-//! gets deducted from the total reward that can be paid. The remaining portion is split among the validator and all
-//! of the nominators that nominated the validator, proportional to the value staked behind this validator (_i.e._
-//! dividing the [`own`](./struct.Exposure.html#structfield.own) or [`others`](./struct.Exposure.html#structfield.others)
-//! by [`total`](./struct.Exposure.html#structfield.total) in [`Exposure`](./struct.Exposure.html)).
+//! [`validator_payment`](./struct.ValidatorPrefs.html#structfield.validator_payment), that does not
+//! get shared with the nominators at each reward payout through its
+//! [`ValidatorPrefs`](./struct.ValidatorPrefs.html). This value gets deducted from the total reward
+//! that can be paid. The remaining portion is split among the validator and all of the nominators
+//! that nominated the validator, proportional to the value staked behind this validator (_i.e._
+//! dividing the [`own`](./struct.Exposure.html#structfield.own) or
+//! [`others`](./struct.Exposure.html#structfield.others) by
+//! [`total`](./struct.Exposure.html#structfield.total) in [`Exposure`](./struct.Exposure.html)).
 //!
 //! All entities who receive a reward have the option to choose their reward destination
-//! through the [`Payee`](./struct.Payee.html) storage item (see [`set_payee`](enum.Call.html#variant.set_payee)),
-//! to be one of the following:
+//! through the [`Payee`](./struct.Payee.html) storage item (see
+//! [`set_payee`](enum.Call.html#variant.set_payee)), to be one of the following:
 //!
 //! - Controller account, (obviously) not increasing the staked value.
 //! - Stash account, not increasing the staked value.
@@ -185,43 +195,52 @@
 //! ### Slashing details
 //!
 //! A validator can be _reported_ to be offline at any point via the public function
-//! [`on_offline_validator`](enum.Call.html#variant.on_offline_validator). Each validator declares how many times it
-//! can be _reported_ before it actually gets slashed via its
-//! [`unstake_threshold`](./struct.ValidatorPrefs.html#structfield.unstake_threshold).
+//! [`on_offline_validator`](enum.Call.html#variant.on_offline_validator). Each validator declares
+//! how many times it can be _reported_ before it actually gets slashed via its
+//! [`ValidatorPrefs::unstake_threshold`](./struct.ValidatorPrefs.html#structfield.unstake_threshold).
 //!
 //! On top of this, the Staking module also introduces an
 //! [`OfflineSlashGrace`](./struct.Module.html#method.offline_slash_grace), which applies
 //! to all validators and prevents them from getting immediately slashed.
 //!
 //! Essentially, a validator gets slashed once they have been reported more than
-//! [`OfflineSlashGrace`] + [`unstake_threshold`] times. Getting slashed due to offline report always leads
-//! to being _unstaked_ (_i.e._ removed as a validator candidate) as the consequence.
+//! [`OfflineSlashGrace`] + [`ValidatorPrefs::unstake_threshold`] times. Getting slashed due to
+//! offline report always leads to being _unstaked_ (_i.e._ removed as a validator candidate) as
+//! the consequence.
 //!
 //! The base slash value is computed _per slash-event_ by multiplying
-//! [`OfflineSlash`](./struct.Module.html#method.offline_slash) and the `total` `Exposure`. This value is then
-//! multiplied by `2.pow(unstake_threshold)` to obtain the final slash value. All individual accounts' punishments are
-//! capped at their total stake (NOTE: This cap should never come into force in a correctly implemented,
-//! non-corrupted, well-configured system).
+//! [`OfflineSlash`](./struct.Module.html#method.offline_slash) and the `total` `Exposure`. This
+//! value is then multiplied by `2.pow(unstake_threshold)` to obtain the final slash value. All
+//! individual accounts' punishments are capped at their total stake (NOTE: This cap should never
+//! come into force in a correctly implemented, non-corrupted, well-configured system).
 //!
 //! ### Additional Fund Management Operations
 //!
 //! Any funds already placed into stash can be the target of the following operations:
 //!
-//! The controller account can free a portion (or all) of the funds using the [`unbond`](enum.Call.html#variant.unbond)
-//! call. Note that the funds are not immediately accessible. Instead, a duration denoted by
-//! [`BondingDuration`](./struct.BondingDuration.html) (in number of eras) must pass until the funds can actually be
-//! removed. Once the `BondingDuration` is over, the [`withdraw_unbonded`](./enum.Call.html#variant.withdraw_unbonded) call can be used
-//! to actually withdraw the funds.
+//! The controller account can free a portion (or all) of the funds using the
+//! [`unbond`](enum.Call.html#variant.unbond) call. Note that the funds are not immediately
+//! accessible. Instead, a duration denoted by [`BondingDuration`](./struct.BondingDuration.html)
+//! (in number of eras) must pass until the funds can actually be removed. Once the
+//! `BondingDuration` is over, the [`withdraw_unbonded`](./enum.Call.html#variant.withdraw_unbonded)
+//! call can be used to actually withdraw the funds.
+//!
+//! Note that there is a limitation to the number of fund-chunks that can be scheduled to be
+//! unlocked in the future via [`unbond`](enum.Call.html#variant.unbond). In case this maximum
+//! (`MAX_UNLOCKING_CHUNKS`) is reached, the bonded account _must_ first wait until a successful
+//! call to `withdraw_unbonded` to remove some of the chunks.
 //!
 //! ### Election Algorithm
 //!
 //! The current election algorithm is implemented based on Phragmén.
-//! The reference implementation can be found [here](https://github.com/w3f/consensus/tree/master/NPoS).
+//! The reference implementation can be found
+//! [here](https://github.com/w3f/consensus/tree/master/NPoS).
 //!
-//! The election algorithm, aside from electing the validators with the most stake value and votes, tries to divide
-//! the nominator votes among candidates in an equal manner. To further assure this, an optional post-processing
-//! can be applied that iteractively normalizes the nominator staked values until the total difference among
-//! votes of a particular nominator are less than a threshold.
+//! The election algorithm, aside from electing the validators with the most stake value and votes,
+//! tries to divide the nominator votes among candidates in an equal manner. To further assure this,
+//! an optional post-processing can be applied that iteratively normalizes the nominator staked
+//! values until the total difference among votes of a particular nominator are less than a
+//! threshold.
 //!
 //! ## GenesisConfig
 //!
@@ -230,38 +249,58 @@
 //! ## Related Modules
 //!
 //! - [Balances](../srml_balances/index.html): Used to manage values at stake.
-//! - [Session](../srml_session/index.html): Used to manage sessions. Also, a list of new validators is
-//! stored in the Session module's `Validators` at the end of each era.
+//! - [Session](../srml_session/index.html): Used to manage sessions. Also, a list of new validators
+//! is stored in the Session module's `Validators` at the end of each era.
 
+#![recursion_limit="128"]
 #![cfg_attr(not(feature = "std"), no_std)]
+#![cfg_attr(all(feature = "bench", test), feature(test))]
+
+#[cfg(all(feature = "bench", test))]
+extern crate test;
+
+#[cfg(any(feature = "bench", test))]
+mod mock;
+
+#[cfg(test)]
+mod tests;
+
+mod phragmen;
+
+#[cfg(all(feature = "bench", test))]
+mod benches;
 
 #[cfg(feature = "std")]
 use runtime_io::with_storage;
 use rstd::{prelude::*, result, collections::btree_map::BTreeMap};
 use parity_codec::{HasCompact, Encode, Decode};
-use srml_support::{StorageValue, StorageMap, EnumerableStorageMap, dispatch::Result};
-use srml_support::{decl_module, decl_event, decl_storage, ensure};
-use srml_support::traits::{
-	Currency, OnFreeBalanceZero, OnDilution, LockIdentifier, LockableCurrency, WithdrawReasons,
-	OnUnbalanced, Imbalance,
+use srml_support::{
+	StorageValue, StorageMap, EnumerableStorageMap, decl_module, decl_event,
+	decl_storage, ensure, traits::{
+		Currency, OnFreeBalanceZero, OnDilution, LockIdentifier, LockableCurrency,
+		WithdrawReasons, OnUnbalanced, Imbalance, Get
+	}
 };
-use session::OnSessionChange;
+use session::{OnSessionEnding, SessionIndex};
 use primitives::Perbill;
-use primitives::traits::{Convert, Zero, One, As, StaticLookup, CheckedSub, CheckedShl, Saturating, Bounded};
+use primitives::traits::{
+	Convert, Zero, One, StaticLookup, CheckedSub, CheckedShl, Saturating, Bounded
+};
 #[cfg(feature = "std")]
 use primitives::{Serialize, Deserialize};
 use system::ensure_signed;
 
-mod mock;
-mod tests;
-mod phragmen;
-
 use phragmen::{elect, ACCURACY, ExtendedBalance};
 
 const RECENT_OFFLINE_COUNT: usize = 32;
 const DEFAULT_MINIMUM_VALIDATOR_COUNT: u32 = 4;
 const MAX_NOMINATIONS: usize = 16;
 const MAX_UNSTAKE_THRESHOLD: u32 = 10;
+const MAX_UNLOCKING_CHUNKS: usize = 32;
+const STAKING_ID: LockIdentifier = *b"staking ";
+
+/// Counter for the number of eras that have passed.
+pub type EraIndex = u32;
 
 /// Indicates the initial status of the staker.
 #[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))]
@@ -299,7 +338,8 @@ pub struct ValidatorPrefs {
 	/// Validator should ensure this many more slashes than is necessary before being unstaked.
 	#[codec(compact)]
 	pub unstake_threshold: u32,
-	/// Reward that validator takes up-front; only the rest is split between themselves and nominators.
+	/// Reward that validator takes up-front; only the rest is split between themselves and
+	/// nominators.
 	#[codec(compact)]
 	pub validator_payment: Balance,
 }
@@ -316,19 +356,19 @@ impl Default for ValidatorPrefs {
 /// Just a Balance/BlockNumber tuple to encode when a chunk of funds will be unlocked.
 #[derive(PartialEq, Eq, Clone, Encode, Decode)]
 #[cfg_attr(feature = "std", derive(Debug))]
-pub struct UnlockChunk {
+pub struct UnlockChunk {
 	/// Amount of funds to be unlocked.
 	#[codec(compact)]
 	value: Balance,
 	/// Era number at which point it'll be unlocked.
 	#[codec(compact)]
-	era: BlockNumber,
+	era: EraIndex,
 }
 
 /// The ledger of a (bonded) stash.
 #[derive(PartialEq, Eq, Clone, Encode, Decode)]
 #[cfg_attr(feature = "std", derive(Debug))]
-pub struct StakingLedger {
+pub struct StakingLedger {
 	/// The stash account whose balance is actually locked and at stake.
 	pub stash: AccountId,
 	/// The total amount of the stash's balance that we are currently accounting for.
@@ -341,17 +381,16 @@ pub struct StakingLedger>,
+	pub unlocking: Vec>,
 }
 
 impl<
 	AccountId,
 	Balance: HasCompact + Copy + Saturating,
-	BlockNumber: HasCompact + PartialOrd
-> StakingLedger {
+> StakingLedger {
 	/// Remove entries from `unlocking` that are sufficiently old and reduce the
 	/// total by the sum of their balances.
-	fn consolidate_unlocked(self, current_era: BlockNumber) -> Self {
+	fn consolidate_unlocked(self, current_era: EraIndex) -> Self {
 		let mut total = self.total;
 		let unlocking = self.unlocking.into_iter()
 			.filter(|chunk| if chunk.era > current_era {
@@ -391,12 +430,17 @@ pub struct Exposure {
 }
 
 type BalanceOf = <::Currency as Currency<::AccountId>>::Balance;
-type PositiveImbalanceOf = <::Currency as Currency<::AccountId>>::PositiveImbalance;
-type NegativeImbalanceOf = <::Currency as Currency<::AccountId>>::NegativeImbalance;
+type PositiveImbalanceOf =
+<::Currency as Currency<::AccountId>>::PositiveImbalance;
+type NegativeImbalanceOf =
+<::Currency as Currency<::AccountId>>::NegativeImbalance;
 
 type RawAssignment = (::AccountId, ExtendedBalance);
 type Assignment = (::AccountId, ExtendedBalance, BalanceOf);
-type ExpoMap = BTreeMap::<::AccountId, Exposure<::AccountId, BalanceOf>>;
+type ExpoMap = BTreeMap<
+	::AccountId,
+	Exposure<::AccountId, BalanceOf>
+>;
 
 pub trait Trait: system::Trait + session::Trait {
 	/// The staking balance.
@@ -420,9 +464,13 @@ pub trait Trait: system::Trait + session::Trait {
 
 	/// Handler for the unbalanced increment when rewarding a staker.
 	type Reward: OnUnbalanced>;
-}
 
-const STAKING_ID: LockIdentifier = *b"staking ";
+	/// Number of sessions per era.
+	type SessionsPerEra: Get;
+
+	/// Number of eras that staked funds must remain bonded for.
+	type BondingDuration: Get;
+}
 
 decl_storage! {
 	trait Store for Module as Staking {
@@ -430,26 +478,25 @@ decl_storage! {
 		/// The ideal number of staking participants.
 		pub ValidatorCount get(validator_count) config(): u32;
 		/// Minimum number of staking participants before emergency conditions are imposed.
-		pub MinimumValidatorCount get(minimum_validator_count) config(): u32 = DEFAULT_MINIMUM_VALIDATOR_COUNT;
-		/// The length of a staking era in sessions.
-		pub SessionsPerEra get(sessions_per_era) config(): T::BlockNumber = T::BlockNumber::sa(1000);
+		pub MinimumValidatorCount get(minimum_validator_count) config():
+			u32 = DEFAULT_MINIMUM_VALIDATOR_COUNT;
 		/// Maximum reward, per validator, that is provided per acceptable session.
-		pub SessionReward get(session_reward) config(): Perbill = Perbill::from_billionths(60);
+		pub SessionReward get(session_reward) config(): Perbill = Perbill::from_parts(60);
 		/// Slash, per validator that is taken for the first time they are found to be offline.
-		pub OfflineSlash get(offline_slash) config(): Perbill = Perbill::from_millionths(1000); // Perbill::from_fraction() is only for std, so use from_millionths().
+		pub OfflineSlash get(offline_slash) config(): Perbill = Perbill::from_millionths(1000);
 		/// Number of instances of offline reports before slashing begins for validators.
 		pub OfflineSlashGrace get(offline_slash_grace) config(): u32;
-		/// The length of the bonding duration in eras.
-		pub BondingDuration get(bonding_duration) config(): T::BlockNumber = T::BlockNumber::sa(12);
 
-		/// Any validators that may never be slashed or forcibly kicked. It's a Vec since they're easy to initialize
-		/// and the performance hit is minimal (we expect no more than four invulnerables) and restricted to testnets.
+		/// Any validators that may never be slashed or forcibly kicked. It's a Vec since they're
+		/// easy to initialize and the performance hit is minimal (we expect no more than four
+		/// invulnerables) and restricted to testnets.
 		pub Invulnerables get(invulnerables) config(): Vec;
 
 		/// Map from all locked "stash" accounts to the controller account.
 		pub Bonded get(bonded): map T::AccountId => Option;
 		/// Map from all (unlocked) "controller" accounts to the info regarding the staking.
-		pub Ledger get(ledger): map T::AccountId => Option, T::BlockNumber>>;
+		pub Ledger get(ledger):
+			map T::AccountId => Option>>;
 
 		/// Where the reward payment should be made. Keyed by stash.
 		pub Payee get(payee): map T::AccountId => RewardDestination;
@@ -460,38 +507,34 @@ decl_storage! {
 		/// The map from nominator stash key to the set of stash keys of all validators to nominate.
 		pub Nominators get(nominators): linked_map T::AccountId => Vec;
 
-		/// Nominators for a particular account that is in action right now. You can't iterate through validators here,
-		/// but you can find them in the Session module.
+		/// Nominators for a particular account that is in action right now. You can't iterate
+		/// through validators here, but you can find them in the Session module.
 		///
 		/// This is keyed by the stash account.
 		pub Stakers get(stakers): map T::AccountId => Exposure>;
 
-		// The historical validators and their nominations for a given era. Stored as a trie root of the mapping
-		// `T::AccountId` => `Exposure>`, which is just the contents of `Stakers`,
-		// under a key that is the `era`.
+		// The historical validators and their nominations for a given era. Stored as a trie root
+		// of the mapping `T::AccountId` => `Exposure>`, which is just
+		// the contents of `Stakers`, under a key that is the `era`.
 		//
-		// Every era change, this will be appended with the trie root of the contents of `Stakers`, and the oldest
-		// entry removed down to a specific number of entries (probably around 90 for a 3 month history).
+		// Every era change, this will be appended with the trie root of the contents of `Stakers`,
+		// and the oldest entry removed down to a specific number of entries (probably around 90 for
+		// a 3 month history).
 		// pub HistoricalStakers get(historical_stakers): map T::BlockNumber => Option;
 
 		/// The currently elected validator set keyed by stash account ID.
 		pub CurrentElected get(current_elected): Vec;
 
 		/// The current era index.
-		pub CurrentEra get(current_era) config(): T::BlockNumber;
+		pub CurrentEra get(current_era) config(): EraIndex;
 
 		/// Maximum reward, per validator, that is provided per acceptable session.
 		pub CurrentSessionReward get(current_session_reward) config(): BalanceOf;
 
-		/// The accumulated reward for the current era. Reset to zero at the beginning of the era and
-		/// increased for every successfully finished session.
+		/// The accumulated reward for the current era. Reset to zero at the beginning of the era
+		/// and increased for every successfully finished session.
 		pub CurrentEraReward get(current_era_reward): BalanceOf;
 
-		/// The next value of sessions per era.
-		pub NextSessionsPerEra get(next_sessions_per_era): Option;
-		/// The session index at which the era length last changed.
-		pub LastEraLengthChange get(last_era_length_change): T::BlockNumber;
-
 		/// The amount of balance actively at stake for each validator slot, currently.
 		///
 		/// This is used to derive rewards and punishments.
@@ -499,18 +542,25 @@ decl_storage! {
 			config.stakers.iter().map(|&(_, _, value, _)| value).min().unwrap_or_default()
 		}): BalanceOf;
 
-		/// The number of times a given validator has been reported offline. This gets decremented by one each era that passes.
+		/// The number of times a given validator has been reported offline. This gets decremented
+		/// by one each era that passes.
 		pub SlashCount get(slash_count): map T::AccountId => u32;
 
-		/// We are forcing a new era.
-		pub ForcingNewEra get(forcing_new_era): Option<()>;
-
-		/// Most recent `RECENT_OFFLINE_COUNT` instances. (Who it was, when it was reported, how many instances they were offline for).
+		/// Most recent `RECENT_OFFLINE_COUNT` instances. (Who it was, when it was reported, how
+		/// many instances they were offline for).
 		pub RecentlyOffline get(recently_offline): Vec<(T::AccountId, T::BlockNumber, u32)>;
+
+		/// True if the next session change will be a new era regardless of index.
+		pub ForceNewEra get(forcing_new_era): bool;
 	}
 	add_extra_genesis {
-		config(stakers): Vec<(T::AccountId, T::AccountId, BalanceOf, StakerStatus)>;
-		build(|storage: &mut primitives::StorageOverlay, _: &mut primitives::ChildrenStorageOverlay, config: &GenesisConfig| {
+		config(stakers):
+			Vec<(T::AccountId, T::AccountId, BalanceOf, StakerStatus)>;
+		build(|
+			storage: &mut primitives::StorageOverlay,
+			_: &mut primitives::ChildrenStorageOverlay,
+			config: &GenesisConfig
+		| {
 			with_storage(storage, || {
 				for &(ref stash, ref controller, balance, ref status) in &config.stakers {
 					assert!(T::Currency::free_balance(&stash) >= balance);
@@ -535,21 +585,52 @@ decl_storage! {
 					};
 				}
 
-				>::select_validators();
+				if let (_, Some(validators)) = >::select_validators() {
+					>::put(&validators);
+				}
 			});
 		});
 	}
 }
 
+decl_event!(
+	pub enum Event where Balance = BalanceOf, ::AccountId {
+		/// All validators have been rewarded by the given balance.
+		Reward(Balance),
+		/// One validator (and its nominators) has been given an offline-warning (it is still
+		/// within its grace). The accrued number of slashes is recorded, too.
+		OfflineWarning(AccountId, u32),
+		/// One validator (and its nominators) has been slashed by the given amount.
+		OfflineSlash(AccountId, Balance),
+	}
+);
+
 decl_module! {
 	pub struct Module for enum Call where origin: T::Origin {
 		fn deposit_event() = default;
 
-		/// Take the origin account as a stash and lock up `value` of its balance. `controller` will be the
-		/// account that controls it.
+		/// Take the origin account as a stash and lock up `value` of its balance. `controller` will
+		/// be the  account that controls it.
 		///
 		/// The dispatch origin for this call must be _Signed_ by the stash account.
-		fn bond(origin, controller: ::Source, #[compact] value: BalanceOf, payee: RewardDestination) {
+		///
+		/// # 
+		/// - Independent of the arguments. Moderate complexity.
+		/// - O(1).
+		/// - Three extra DB entries.
+		///
+		/// NOTE: Two of the storage writes (`Self::bonded`, `Self::payee`) are _never_ cleaned unless
+		/// the `origin` falls below _existential deposit_ and gets removed as dust.
+		///
+		/// NOTE: At the moment, there are no financial restrictions to bond
+		/// (which creates a bunch of storage items for an account). In essence, nothing prevents many accounts from
+		/// spamming `Staking` storage by bonding 1 UNIT. See test case: `bond_with_no_staked_value`.
+		/// # 
+		fn bond(origin,
+			controller: ::Source,
+			#[compact] value: BalanceOf,
+			payee: RewardDestination
+		) {
 			let stash = ensure_signed(origin)?;
 
 			if >::exists(&stash) {
@@ -563,21 +644,28 @@ decl_module! {
 			}
 
 			// You're auto-bonded forever, here. We might improve this by only bonding when
-			// you actually validate/nominate.
+			// you actually validate/nominate and remove once you unbond __everything__.
 			>::insert(&stash, controller.clone());
 			>::insert(&stash, payee);
 
 			let stash_balance = T::Currency::free_balance(&stash);
 			let value = value.min(stash_balance);
-			Self::update_ledger(&controller, &StakingLedger { stash, total: value, active: value, unlocking: vec![] });
+			let item = StakingLedger { stash, total: value, active: value, unlocking: vec![] };
+			Self::update_ledger(&controller, &item);
 		}
 
-		/// Add some extra amount that have appeared in the stash `free_balance` into the balance up for
-		/// staking.
+		/// Add some extra amount that have appeared in the stash `free_balance` into the balance up
+		/// for  staking.
 		///
 		/// Use this if there are additional funds in your stash account that you wish to bond.
 		///
 		/// The dispatch origin for this call must be _Signed_ by the stash, not the controller.
+		///
+		/// # 
+		/// - Independent of the arguments. Insignificant complexity.
+		/// - O(1).
+		/// - One DB entry.
+		/// # 
 		fn bond_extra(origin, #[compact] max_additional: BalanceOf) {
 			let stash = ensure_signed(origin)?;
 
@@ -601,12 +689,29 @@ decl_module! {
 		/// Once the unlock period is done, you can call `withdraw_unbonded` to actually move
 		/// the funds out of management ready for transfer.
 		///
+		/// No more than a limited number of unlocking chunks (see `MAX_UNLOCKING_CHUNKS`)
+		/// can co-exists at the same time. In that case, [`Call::withdraw_unbonded`] need
+		/// to be called first to remove some of the chunks (if possible).
+		///
 		/// The dispatch origin for this call must be _Signed_ by the controller, not the stash.
 		///
 		/// See also [`Call::withdraw_unbonded`].
+		///
+		/// # 
+		/// - Independent of the arguments. Limited but potentially exploitable complexity.
+		/// - Contains a limited number of reads.
+		/// - Each call (requires the remainder of the bonded balance to be above `minimum_balance`)
+		///   will cause a new entry to be inserted into a vector (`Ledger.unlocking`) kept in storage.
+		///   The only way to clean the aforementioned storage item is also user-controlled via `withdraw_unbonded`.
+		/// - One DB entry.
+		/// 
 		fn unbond(origin, #[compact] value: BalanceOf) {
 			let controller = ensure_signed(origin)?;
 			let mut ledger = Self::ledger(&controller).ok_or("not a controller")?;
+			ensure!(
+				ledger.unlocking.len() < MAX_UNLOCKING_CHUNKS,
+				"can not schedule more unlock chunks"
+			);
 
 			let mut value = value.min(ledger.active);
 
@@ -619,7 +724,7 @@ decl_module! {
 					ledger.active = Zero::zero();
 				}
 
-				let era = Self::current_era() + Self::bonding_duration();
+				let era = Self::current_era() + T::BondingDuration::get();
 				ledger.unlocking.push(UnlockChunk { value, era });
 				Self::update_ledger(&controller, &ledger);
 			}
@@ -633,6 +738,14 @@ decl_module! {
 		/// The dispatch origin for this call must be _Signed_ by the controller, not the stash.
 		///
 		/// See also [`Call::unbond`].
+		///
+		/// # 
+		/// - Could be dependent on the `origin` argument and how much `unlocking` chunks exist. It implies
+		///   `consolidate_unlocked` which loops over `Ledger.unlocking`, which is indirectly
+		///   user-controlled. See [`unbond`] for more detail.
+		/// - Contains a limited number of reads, yet the size of which could be large based on `ledger`.
+		/// - Writes are limited to the `origin` account key.
+		/// # 
 		fn withdraw_unbonded(origin) {
 			let controller = ensure_signed(origin)?;
 			let ledger = Self::ledger(&controller).ok_or("not a controller")?;
@@ -645,11 +758,20 @@ decl_module! {
 		/// Effects will be felt at the beginning of the next era.
 		///
 		/// The dispatch origin for this call must be _Signed_ by the controller, not the stash.
+		///
+		/// # 
+		/// - Independent of the arguments. Insignificant complexity.
+		/// - Contains a limited number of reads.
+		/// - Writes are limited to the `origin` account key.
+		/// # 
 		fn validate(origin, prefs: ValidatorPrefs>) {
 			let controller = ensure_signed(origin)?;
 			let ledger = Self::ledger(&controller).ok_or("not a controller")?;
 			let stash = &ledger.stash;
-			ensure!(prefs.unstake_threshold <= MAX_UNSTAKE_THRESHOLD, "unstake threshold too large");
+			ensure!(
+				prefs.unstake_threshold <= MAX_UNSTAKE_THRESHOLD,
+				"unstake threshold too large"
+			);
 			>::remove(stash);
 			>::insert(stash, prefs);
 		}
@@ -659,6 +781,12 @@ decl_module! {
 		/// Effects will be felt at the beginning of the next era.
 		///
 		/// The dispatch origin for this call must be _Signed_ by the controller, not the stash.
+		///
+		/// # 
+		/// - The transaction's complexity is proportional to the size of `targets`,
+		/// which is capped at `MAX_NOMINATIONS`.
+		/// - Both the reads and writes follow a similar pattern.
+		/// # 
 		fn nominate(origin, targets: Vec<::Source>) {
 			let controller = ensure_signed(origin)?;
 			let ledger = Self::ledger(&controller).ok_or("not a controller")?;
@@ -678,6 +806,12 @@ decl_module! {
 		/// Effects will be felt at the beginning of the next era.
 		///
 		/// The dispatch origin for this call must be _Signed_ by the controller, not the stash.
+		///
+		/// # 
+		/// - Independent of the arguments. Insignificant complexity.
+		/// - Contains one read.
+		/// - Writes are limited to the `origin` account key.
+		/// # 
 		fn chill(origin) {
 			let controller = ensure_signed(origin)?;
 			let ledger = Self::ledger(&controller).ok_or("not a controller")?;
@@ -691,6 +825,12 @@ decl_module! {
 		/// Effects will be felt at the beginning of the next era.
 		///
 		/// The dispatch origin for this call must be _Signed_ by the controller, not the stash.
+		///
+		/// # 
+		/// - Independent of the arguments. Insignificant complexity.
+		/// - Contains a limited number of reads.
+		/// - Writes are limited to the `origin` account key.
+		/// # 
 		fn set_payee(origin, payee: RewardDestination) {
 			let controller = ensure_signed(origin)?;
 			let ledger = Self::ledger(&controller).ok_or("not a controller")?;
@@ -703,6 +843,12 @@ decl_module! {
 		/// Effects will be felt at the beginning of the next era.
 		///
 		/// The dispatch origin for this call must be _Signed_ by the stash, not the controller.
+		///
+		/// # 
+		/// - Independent of the arguments. Insignificant complexity.
+		/// - Contains a limited number of reads.
+		/// - Writes are limited to the `origin` account key.
+		/// # 
 		fn set_controller(origin, controller: ::Source) {
 			let stash = ensure_signed(origin)?;
 			let old_controller = Self::bonded(&stash).ok_or("not a stash")?;
@@ -712,29 +858,29 @@ decl_module! {
 			}
 			if controller != old_controller {
 				>::insert(&stash, &controller);
-				if let Some(l) = >::take(&old_controller) { >::insert(&controller, l) };
+				if let Some(l) = >::take(&old_controller) {
+					>::insert(&controller, l);
+				}
 			}
 		}
 
-		/// Set the number of sessions in an era.
-		fn set_sessions_per_era(#[compact] new: T::BlockNumber) {
-			>::put(new);
-		}
-
-		/// The length of the bonding duration in eras.
-		fn set_bonding_duration(#[compact] new: T::BlockNumber) {
-			>::put(new);
-		}
-
 		/// The ideal number of validators.
 		fn set_validator_count(#[compact] new: u32) {
 			>::put(new);
 		}
 
+		// ----- Root calls.
+
 		/// Force there to be a new era. This also forces a new session immediately after.
 		/// `apply_rewards` should be true for validators to get the session reward.
-		fn force_new_era(apply_rewards: bool) -> Result {
-			Self::apply_force_new_era(apply_rewards)
+		///
+		/// # 
+		/// - Independent of the arguments.
+		/// - Triggers the Phragmen election. Expensive but not user-controlled.
+		/// - Depends on state: `O(|edges| * |validators|)`.
+		/// # 
+		fn force_new_era() {
+			Self::apply_force_new_era()
 		}
 
 		/// Set the offline slash grace period.
@@ -749,32 +895,9 @@ decl_module! {
 	}
 }
 
-decl_event!(
-	pub enum Event where Balance = BalanceOf, ::AccountId {
-		/// All validators have been rewarded by the given balance.
-		Reward(Balance),
-		/// One validator (and its nominators) has been given an offline-warning (it is still
-		/// within its grace). The accrued number of slashes is recorded, too.
-		OfflineWarning(AccountId, u32),
-		/// One validator (and its nominators) has been slashed by the given amount.
-		OfflineSlash(AccountId, Balance),
-	}
-);
-
 impl Module {
-	/// Just force_new_era without origin check.
-	fn apply_force_new_era(apply_rewards: bool) -> Result {
-		>::put(());
-		>::apply_force_new_session(apply_rewards)
-	}
-
 	// PUBLIC IMMUTABLES
 
-	/// The length of a staking era in blocks.
-	pub fn era_length() -> T::BlockNumber {
-		Self::sessions_per_era() * >::length()
-	}
-
 	/// The total balance that can be slashed from a validator controller account as of
 	/// right now.
 	pub fn slashable_balance(who: &T::AccountId) -> BalanceOf {
@@ -784,32 +907,43 @@ impl Module {
 	// MUTABLES (DANGEROUS)
 
 	/// Update the ledger for a controller. This will also update the stash lock.
-	fn update_ledger(controller: &T::AccountId, ledger: &StakingLedger, T::BlockNumber>) {
-		T::Currency::set_lock(STAKING_ID, &ledger.stash, ledger.total, T::BlockNumber::max_value(), WithdrawReasons::all());
+	fn update_ledger(
+		controller: &T::AccountId,
+		ledger: &StakingLedger>
+	) {
+		T::Currency::set_lock(
+			STAKING_ID,
+			&ledger.stash,
+			ledger.total,
+			T::BlockNumber::max_value(),
+			WithdrawReasons::all()
+		);
 		>::insert(controller, ledger);
 	}
 
-	/// Slash a given validator by a specific amount. Removes the slash from the validator's balance by preference,
-	/// and reduces the nominators' balance if needed.
+	/// Slash a given validator by a specific amount. Removes the slash from the validator's
+	/// balance by preference, and reduces the nominators' balance if needed.
 	fn slash_validator(stash: &T::AccountId, slash: BalanceOf) {
 		// The exposure (backing stake) information of the validator to be slashed.
 		let exposure = Self::stakers(stash);
-		// The amount we are actually going to slash (can't be bigger than the validator's total exposure)
+		// The amount we are actually going to slash (can't be bigger than the validator's total
+		// exposure)
 		let slash = slash.min(exposure.total);
 		// The amount we'll slash from the validator's stash directly.
 		let own_slash = exposure.own.min(slash);
 		let (mut imbalance, missing) = T::Currency::slash(stash, own_slash);
 		let own_slash = own_slash - missing;
-		// The amount remaining that we can't slash from the validator, that must be taken from the nominators.
+		// The amount remaining that we can't slash from the validator, that must be taken from the
+		// nominators.
 		let rest_slash = slash - own_slash;
 		if !rest_slash.is_zero() {
 			// The total to be slashed from the nominators.
 			let total = exposure.total - exposure.own;
 			if !total.is_zero() {
-				let safe_mul_rational = |b| b * rest_slash / total;// FIXME #1572 avoid overflow
 				for i in exposure.others.iter() {
+					let per_u64 = Perbill::from_rational_approximation(i.value, total);
 					// best effort - not much that can be done on fail.
-					imbalance.subsume(T::Currency::slash(&i.who, safe_mul_rational(i.value)).0)
+					imbalance.subsume(T::Currency::slash(&i.who, per_u64 * rest_slash).0)
 				}
 			}
 		}
@@ -839,8 +973,9 @@ impl Module {
 		}
 	}
 
-	/// Reward a given validator by a specific amount. Add the reward to the validator's, and its nominators'
-	/// balance, pro-rata based on their exposure, after having removed the validator's pre-payout cut.
+	/// Reward a given validator by a specific amount. Add the reward to the validator's, and its
+	/// nominators' balance, pro-rata based on their exposure, after having removed the validator's
+	/// pre-payout cut.
 	fn reward_validator(stash: &T::AccountId, reward: BalanceOf) {
 		let off_the_table = reward.min(Self::validators(stash).validator_payment);
 		let reward = reward - off_the_table;
@@ -850,41 +985,29 @@ impl Module {
 		} else {
 			let exposure = Self::stakers(stash);
 			let total = exposure.total.max(One::one());
-			let safe_mul_rational = |b| b * reward / total;// FIXME #1572:  avoid overflow
+
 			for i in &exposure.others {
-				let nom_payout = safe_mul_rational(i.value);
-				imbalance.maybe_subsume(Self::make_payout(&i.who, nom_payout));
+				let per_u64 = Perbill::from_rational_approximation(i.value, total);
+				imbalance.maybe_subsume(Self::make_payout(&i.who, per_u64 * reward));
 			}
-			safe_mul_rational(exposure.own)
+
+			let per_u64 = Perbill::from_rational_approximation(exposure.own, total);
+			per_u64 * reward
 		};
 		imbalance.maybe_subsume(Self::make_payout(stash, validator_cut + off_the_table));
 		T::Reward::on_unbalanced(imbalance);
 	}
 
-	/// Get the reward for the session, assuming it ends with this block.
-	fn this_session_reward(actual_elapsed: T::Moment) -> BalanceOf {
-		let ideal_elapsed = >::ideal_session_duration();
-		if ideal_elapsed.is_zero() {
-			return Self::current_session_reward();
-		}
-		let per65536: u64 = (T::Moment::sa(65536u64) * ideal_elapsed.clone() / actual_elapsed.max(ideal_elapsed)).as_();
-		Self::current_session_reward() * >::sa(per65536) / >::sa(65536u64)
-	}
-
-	/// Session has just changed. We need to determine whether we pay a reward, slash and/or
-	/// move to a new era.
-	fn new_session(actual_elapsed: T::Moment, should_reward: bool) {
-		if should_reward {
-			// accumulate good session reward
-			let reward = Self::this_session_reward(actual_elapsed);
-			>::mutate(|r| *r += reward);
-		}
+	/// Session has just ended. Provide the validator set for the next session if it's an era-end.
+	fn new_session(session_index: SessionIndex) -> Option> {
+		// accumulate good session reward
+		let reward = Self::current_session_reward();
+		>::mutate(|r| *r += reward);
 
-		let session_index = >::current_index();
-		if >::take().is_some()
-			|| ((session_index - Self::last_era_length_change()) % Self::sessions_per_era()).is_zero()
-		{
-			Self::new_era();
+		if >::take() || session_index % T::SessionsPerEra::get() == 0 {
+			Self::new_era()
+		} else {
+			None
 		}
 	}
 
@@ -892,7 +1015,7 @@ impl Module {
 	///
 	/// NOTE: This always happens immediately before a session change to ensure that new validators
 	/// get a chance to set their session keys.
-	fn new_era() {
+	fn new_era() -> Option> {
 		// Payout
 		let reward = >::take();
 		if !reward.is_zero() {
@@ -901,29 +1024,23 @@ impl Module {
 				Self::reward_validator(v, reward);
 			}
 			Self::deposit_event(RawEvent::Reward(reward));
-			let len = validators.len() as u64; // validators length can never overflow u64
-			let len = BalanceOf::::sa(len);
+			let len = validators.len() as u32; // validators length can never overflow u64
+			let len: BalanceOf = len.into();
 			let total_minted = reward * len;
 			let total_rewarded_stake = Self::slot_stake() * len;
 			T::OnRewardMinted::on_dilution(total_minted, total_rewarded_stake);
 		}
 
 		// Increment current era.
-		>::put(&(>::get() + One::one()));
-
-		// Enact era length change.
-		if let Some(next_spe) = Self::next_sessions_per_era() {
-			if next_spe != Self::sessions_per_era() {
-				>::put(&next_spe);
-				>::put(&>::current_index());
-			}
-		}
+		>::mutate(|s| *s += 1);
 
 		// Reassign all Stakers.
-		let slot_stake = Self::select_validators();
+		let (slot_stake, maybe_new_validators) = Self::select_validators();
 
 		// Update the balances for rewarding according to the stakes.
 		>::put(Self::session_reward() * slot_stake);
+
+		maybe_new_validators
 	}
 
 	fn slashable_balance_of(stash: &T::AccountId) -> BalanceOf {
@@ -933,7 +1050,7 @@ impl Module {
 	/// Select a new validator set from the assembled stakers and their role preferences.
 	///
 	/// Returns the new `SlotStake` value.
-	fn select_validators() -> BalanceOf {
+	fn select_validators() -> (BalanceOf, Option>) {
 		let maybe_elected_set = elect::(
 			Self::validator_count() as usize,
 			Self::minimum_validator_count().max(1) as usize,
@@ -947,8 +1064,10 @@ impl Module {
 			let assignments = elected_set.1;
 
 			// helper closure.
-			let to_balance = |b: ExtendedBalance| >>::convert(b);
-			let to_votes = |b: BalanceOf| , u64>>::convert(b) as ExtendedBalance;
+			let to_balance = |b: ExtendedBalance|
+				>>::convert(b);
+			let to_votes = |b: BalanceOf|
+				, u64>>::convert(b) as ExtendedBalance;
 
 			// The return value of this is safe to be converted to u64.
 			// The original balance, `b` is within the scope of u64. It is just extended to u128
@@ -975,7 +1094,8 @@ impl Module {
 				.iter()
 				.map(|e| (e, Self::slashable_balance_of(e)))
 				.for_each(|(e, s)| {
-					exposures.insert(e.clone(), Exposure { own: s, total: s, ..Default::default() });
+					let item = Exposure { own: s, total: s, ..Default::default() };
+					exposures.insert(e.clone(), item);
 				});
 
 			for (n, _, assignment) in &assignments_with_stakes {
@@ -992,11 +1112,16 @@ impl Module {
 			}
 
 			// This optimization will most likely be only applied off-chain.
-			let do_equalise = false;
-			if do_equalise {
+			let do_equalize = false;
+			if do_equalize {
 				let tolerance = 10 as u128;
 				let iterations = 10 as usize;
-				phragmen::equalize::(&mut assignments_with_stakes, &mut exposures, tolerance, iterations);
+				phragmen::equalize::(
+					&mut assignments_with_stakes,
+					&mut exposures,
+					tolerance,
+					iterations
+				);
 			}
 
 			// Clear Stakers and reduce their slash_count.
@@ -1020,11 +1145,10 @@ impl Module {
 
 			// Set the new validator set.
 			>::put(&elected_stashes);
-			>::set_validators(
-				&elected_stashes.into_iter().map(|s| Self::bonded(s).unwrap_or_default()).collect::>()
-			);
-
-			slot_stake
+			let validators = elected_stashes.into_iter()
+				.map(|s| Self::bonded(s).unwrap_or_default())
+				.collect::>();
+			(slot_stake, Some(validators))
 		} else {
 			// There were not enough candidates for even our minimal level of functionality.
 			// This is bad.
@@ -1032,10 +1156,14 @@ impl Module {
 			// and let the chain keep producing blocks until we can decide on a sufficiently
 			// substantial set.
 			// TODO: #2494
-			Self::slot_stake()
+			(Self::slot_stake(), None)
 		}
 	}
 
+	fn apply_force_new_era() {
+		>::put(true);
+	}
+
 	/// Call when a validator is determined to be offline. `count` is the
 	/// number of offenses the validator has committed.
 	///
@@ -1082,8 +1210,7 @@ impl Module {
 					.map(|x| x.min(slash_exposure))
 					.unwrap_or(slash_exposure);
 				let _ = Self::slash_validator(&stash, slash);
-				>::remove(&stash);
-				let _ = Self::apply_force_new_era(false);
+				let _ = >::disable(&controller);
 
 				RawEvent::OfflineSlash(stash.clone(), slash)
 			} else {
@@ -1095,9 +1222,9 @@ impl Module {
 	}
 }
 
-impl OnSessionChange for Module {
-	fn on_session_change(elapsed: T::Moment, should_reward: bool) {
-		Self::new_session(elapsed, should_reward);
+impl OnSessionEnding for Module {
+	fn on_session_ending(i: SessionIndex) -> Option> {
+		Self::new_session(i + 1)
 	}
 }
 
@@ -1112,12 +1239,3 @@ impl OnFreeBalanceZero for Module {
 		>::remove(stash);
 	}
 }
-
-impl consensus::OnOfflineReport> for Module {
-	fn handle_report(reported_indices: Vec) {
-		for validator_index in reported_indices {
-			let v = >::validators()[validator_index as usize].clone();
-			Self::on_offline_validator(v, 1);
-		}
-	}
-}
diff --git a/srml/staking/src/mock.rs b/srml/staking/src/mock.rs
index 88b401b19eb51a81b38dc3a1818e3efbc0c16ac5..ea4fcbd8f9f012995875ec0a58baf3420fd73655 100644
--- a/srml/staking/src/mock.rs
+++ b/srml/staking/src/mock.rs
@@ -16,17 +16,18 @@
 
 //! Test utilities
 
-#![cfg(test)]
-
-use primitives::{traits::{IdentityLookup, Convert}, BuildStorage, Perbill};
-use primitives::testing::{Digest, DigestItem, Header, UintAuthorityId, ConvertUintAuthorityId};
+use std::{collections::HashSet, cell::RefCell};
+use primitives::{BuildStorage, Perbill};
+use primitives::traits::{IdentityLookup, Convert, OpaqueKeys, OnInitialize};
+use primitives::testing::{Header, UintAuthorityId};
 use substrate_primitives::{H256, Blake2Hasher};
 use runtime_io;
-use srml_support::impl_outer_origin;
-use crate::{GenesisConfig, Module, Trait, StakerStatus};
+use srml_support::{impl_outer_origin, parameter_types, assert_ok, traits::Currency};
+use crate::{EraIndex, GenesisConfig, Module, Trait, StakerStatus, ValidatorPrefs, RewardDestination};
 
 /// The AccountId alias in this test module.
-pub type AccountIdType = u64;
+pub type AccountId = u64;
+pub type BlockNumber = u64;
 
 /// Simple structure that exposes how u64 currency can be represented as... u64.
 pub struct CurrencyToVoteHandler;
@@ -39,6 +40,32 @@ impl Convert for CurrencyToVoteHandler {
 	}
 }
 
+thread_local! {
+	static SESSION: RefCell<(Vec, HashSet)> = RefCell::new(Default::default());
+}
+
+pub struct TestSessionHandler;
+impl session::SessionHandler for TestSessionHandler {
+	fn on_new_session(_changed: bool, validators: &[(AccountId, Ks)]) {
+		SESSION.with(|x|
+			*x.borrow_mut() = (validators.iter().map(|x| x.0.clone()).collect(), HashSet::new())
+		);
+	}
+
+	fn on_disabled(validator_index: usize) {
+		SESSION.with(|d| {
+			let mut d = d.borrow_mut();
+			let value = d.0[validator_index];
+			println!("on_disabled {} -> {}", validator_index, value);
+			d.1.insert(value);
+		})
+	}
+}
+
+pub fn is_disabled(validator: AccountId) -> bool {
+	SESSION.with(|d| d.borrow().1.contains(&validator))
+}
+
 impl_outer_origin!{
 	pub enum Origin for Test {}
 }
@@ -46,23 +73,16 @@ impl_outer_origin!{
 // Workaround for https://github.com/rust-lang/rust/issues/26925 . Remove when sorted.
 #[derive(Clone, PartialEq, Eq, Debug)]
 pub struct Test;
-impl consensus::Trait for Test {
-	type Log = DigestItem;
-	type SessionKey = UintAuthorityId;
-	type InherentOfflineReport = ();
-}
 impl system::Trait for Test {
 	type Origin = Origin;
 	type Index = u64;
 	type BlockNumber = u64;
 	type Hash = H256;
 	type Hashing = ::primitives::traits::BlakeTwo256;
-	type Digest = Digest;
-	type AccountId = AccountIdType;
+	type AccountId = AccountId;
 	type Lookup = IdentityLookup;
 	type Header = Header;
 	type Event = ();
-	type Log = DigestItem;
 }
 impl balances::Trait for Test {
 	type Balance = u64;
@@ -73,15 +93,25 @@ impl balances::Trait for Test {
 	type TransferPayment = ();
 	type DustRemoval = ();
 }
+parameter_types! {
+	pub const Period: BlockNumber = 1;
+	pub const Offset: BlockNumber = 0;
+}
 impl session::Trait for Test {
-	type ConvertAccountIdToSessionKey = ConvertUintAuthorityId;
-	type OnSessionChange = Staking;
+	type OnSessionEnding = Staking;
+	type Keys = UintAuthorityId;
+	type ShouldEndSession = session::PeriodicSessions;
+	type SessionHandler = TestSessionHandler;
 	type Event = ();
 }
 impl timestamp::Trait for Test {
 	type Moment = u64;
 	type OnTimestampSet = ();
 }
+parameter_types! {
+	pub const SessionsPerEra: session::SessionIndex = 3;
+	pub const BondingDuration: EraIndex = 3;
+}
 impl Trait for Test {
 	type Currency = balances::Module;
 	type CurrencyToVote = CurrencyToVoteHandler;
@@ -89,13 +119,13 @@ impl Trait for Test {
 	type Event = ();
 	type Slash = ();
 	type Reward = ();
+	type SessionsPerEra = SessionsPerEra;
+	type BondingDuration = BondingDuration;
 }
 
 pub struct ExtBuilder {
 	existential_deposit: u64,
-	session_length: u64,
-	sessions_per_era: u64,
-	current_era: u64,
+	current_era: EraIndex,
 	reward: u64,
 	validator_pool: bool,
 	nominate: bool,
@@ -108,8 +138,6 @@ impl Default for ExtBuilder {
 	fn default() -> Self {
 		Self {
 			existential_deposit: 0,
-			session_length: 1,
-			sessions_per_era: 1,
 			current_era: 0,
 			reward: 10,
 			validator_pool: false,
@@ -126,15 +154,7 @@ impl ExtBuilder {
 		self.existential_deposit = existential_deposit;
 		self
 	}
-	pub fn session_length(mut self, session_length: u64) -> Self {
-		self.session_length = session_length;
-		self
-	}
-	pub fn sessions_per_era(mut self, sessions_per_era: u64) -> Self {
-		self.sessions_per_era = sessions_per_era;
-		self
-	}
-	pub fn _current_era(mut self, current_era: u64) -> Self {
+	pub fn _current_era(mut self, current_era: EraIndex) -> Self {
 		self.current_era = current_era;
 		self
 	}
@@ -165,14 +185,10 @@ impl ExtBuilder {
 		} else {
 			1
 		};
-		let _ = consensus::GenesisConfig::{
-			code: vec![],
-			authorities: vec![],
-		}.assimilate_storage(&mut t, &mut c);
+		let validators = if self.validator_pool { vec![10, 20, 30, 40] } else { vec![10, 20] };
 		let _ = session::GenesisConfig::{
-			session_length: self.session_length,
 			// NOTE: if config.nominate == false then 100 is also selected in the initial round.
-			validators: if self.validator_pool { vec![10, 20, 30, 40] }  else { vec![10, 20] },
+			validators,
 			keys: vec![],
 		}.assimilate_storage(&mut t, &mut c);
 		let _ = balances::GenesisConfig::{
@@ -199,30 +215,26 @@ impl ExtBuilder {
 			creation_fee: 0,
 			vesting: vec![],
 		}.assimilate_storage(&mut t, &mut c);
+		let stake_21 = if self.fair { 1000 } else { 2000 };
+		let stake_31 = if self.validator_pool { balance_factor * 1000 } else { 1 };
+		let status_41 = if self.validator_pool {
+			StakerStatus::::Validator
+		} else {
+			StakerStatus::::Idle
+		};
+		let nominated = if self.nominate { vec![11, 21] } else { vec![] };
 		let _ = GenesisConfig::{
-			sessions_per_era: self.sessions_per_era,
 			current_era: self.current_era,
-			stakers: if self.validator_pool {
-				vec![
-					(11, 10, balance_factor * 1000, StakerStatus::::Validator),
-					(21, 20, balance_factor * if self.fair { 1000 } else { 2000 }, StakerStatus::::Validator),
-					(31, 30, balance_factor * 1000, if self.validator_pool { StakerStatus::::Validator } else { StakerStatus::::Idle }),
-					(41, 40, balance_factor * 1000, if self.validator_pool { StakerStatus::::Validator } else { StakerStatus::::Idle }),
-					// nominator
-					(101, 100, balance_factor * 500, if self.nominate { StakerStatus::::Nominator(vec![11, 21]) } else { StakerStatus::::Nominator(vec![]) })
-				]
-			} else {
-				vec![
-					(11, 10, balance_factor * 1000, StakerStatus::::Validator),
-					(21, 20, balance_factor * if self.fair { 1000 } else { 2000 }, StakerStatus::::Validator),
-					(31, 30, 1, StakerStatus::::Validator),
-					// nominator
-					(101, 100, balance_factor * 500, if self.nominate { StakerStatus::::Nominator(vec![11, 21]) } else { StakerStatus::::Nominator(vec![]) })
-				]
-			},
+			stakers: vec![
+				(11, 10, balance_factor * 1000, StakerStatus::::Validator),
+				(21, 20, stake_21, StakerStatus::::Validator),
+				(31, 30, stake_31, StakerStatus::::Validator),
+				(41, 40, balance_factor * 1000, status_41),
+				// nominator
+				(101, 100, balance_factor * 500, StakerStatus::::Nominator(nominated))
+			],
 			validator_count: self.validator_count,
 			minimum_validator_count: self.minimum_validator_count,
-			bonding_duration: self.sessions_per_era * self.session_length * 3,
 			session_reward: Perbill::from_millionths((1000000 * self.reward / balance_factor) as u32),
 			offline_slash: Perbill::from_percent(5),
 			current_session_reward: self.reward,
@@ -232,7 +244,14 @@ impl ExtBuilder {
 		let _ = timestamp::GenesisConfig::{
 			minimum_period: 5,
 		}.assimilate_storage(&mut t, &mut c);
-		t.into()
+		let mut ext = t.into();
+		runtime_io::with_externalities(&mut ext, || {
+			let validators = Session::validators();
+			SESSION.with(|x|
+				*x.borrow_mut() = (validators.clone(), HashSet::new())
+			);
+		});
+		ext
 	}
 }
 
@@ -241,3 +260,46 @@ pub type Balances = balances::Module;
 pub type Session = session::Module;
 pub type Timestamp = timestamp::Module;
 pub type Staking = Module;
+
+pub fn check_exposure(acc: u64) {
+	let expo = Staking::stakers(&acc);
+	assert_eq!(expo.total as u128, expo.own as u128 + expo.others.iter().map(|e| e.value as u128).sum::());
+}
+
+pub fn check_exposure_all() {
+	Staking::current_elected().into_iter().for_each(|acc| check_exposure(acc));
+}
+
+pub fn assert_total_expo(acc: u64, val: u64) {
+	let expo = Staking::stakers(&acc);
+	assert_eq!(expo.total, val);
+}
+
+pub fn bond_validator(acc: u64, val: u64) {
+	// a = controller
+	// a + 1 = stash
+	let _ = Balances::make_free_balance_be(&(acc+1), val);
+	assert_ok!(Staking::bond(Origin::signed(acc+1), acc, val, RewardDestination::Controller));
+	assert_ok!(Staking::validate(Origin::signed(acc), ValidatorPrefs::default()));
+}
+
+pub fn bond_nominator(acc: u64, val: u64, target: Vec) {
+	// a = controller
+	// a + 1 = stash
+	let _ = Balances::make_free_balance_be(&(acc+1), val);
+	assert_ok!(Staking::bond(Origin::signed(acc+1), acc, val, RewardDestination::Controller));
+	assert_ok!(Staking::nominate(Origin::signed(acc), target));
+}
+
+pub fn start_session(session_index: session::SessionIndex) {
+	for i in 0..(session_index - Session::current_index()) {
+		System::set_block_number((i + 1).into());
+		Session::on_initialize(System::block_number());
+	}
+	assert_eq!(Session::current_index(), session_index);
+}
+
+pub fn start_era(era_index: EraIndex) {
+	start_session((era_index * 3).into());
+	assert_eq!(Staking::current_era(), era_index);
+}
diff --git a/srml/staking/src/phragmen.rs b/srml/staking/src/phragmen.rs
index 39fa2e9741ca82b47e0858af3c19746e241f61b8..50f63323bb3fb043e24f6adaa2f1ad2ea1f01507 100644
--- a/srml/staking/src/phragmen.rs
+++ b/srml/staking/src/phragmen.rs
@@ -19,7 +19,6 @@
 use rstd::{prelude::*, collections::btree_map::BTreeMap};
 use primitives::{PerU128};
 use primitives::traits::{Zero, Convert, Saturating};
-use parity_codec::{Encode, Decode};
 use crate::{BalanceOf, Assignment, RawAssignment, ExpoMap, Trait, ValidatorPrefs};
 
 type Fraction = PerU128;
@@ -35,7 +34,7 @@ const SCALE_FACTOR: ExtendedBalance = u32::max_value() as ExtendedBalance + 1;
 pub const ACCURACY: ExtendedBalance = u32::max_value() as ExtendedBalance + 1;
 
 /// Wrapper around validation candidates some metadata.
-#[derive(Clone, Encode, Decode, Default)]
+#[derive(Clone, Default)]
 #[cfg_attr(feature = "std", derive(Debug))]
 pub struct Candidate {
 	/// The validator's account
@@ -49,7 +48,7 @@ pub struct Candidate {
 }
 
 /// Wrapper around the nomination info of a single nominator for a group of validators.
-#[derive(Clone, Encode, Decode, Default)]
+#[derive(Clone, Default)]
 #[cfg_attr(feature = "std", derive(Debug))]
 pub struct Nominator {
 	/// The nominator's account.
@@ -63,7 +62,7 @@ pub struct Nominator {
 }
 
 /// Wrapper around a nominator vote and the load of that vote.
-#[derive(Clone, Encode, Decode, Default)]
+#[derive(Clone, Default)]
 #[cfg_attr(feature = "std", derive(Debug))]
 pub struct Edge {
 	/// Account being voted for
@@ -106,31 +105,32 @@ pub fn elect(
 
 	// 1- Pre-process candidates and place them in a container, optimisation and add phantom votes.
 	// Candidates who have 0 stake => have no votes or all null-votes. Kick them out not.
-	let mut nominators: Vec> = Vec::with_capacity(validator_iter.size_hint().0 + nominator_iter.size_hint().0);
+	let mut nominators: Vec> =
+		Vec::with_capacity(validator_iter.size_hint().0 + nominator_iter.size_hint().0);
 	let mut candidates = validator_iter.map(|(who, _)| {
-			let stash_balance = stash_of(&who);
-			(Candidate { who, ..Default::default() }, stash_balance)
-		})
-		.filter_map(|(mut c, s)| {
-			c.approval_stake += to_votes(s);
-			if c.approval_stake.is_zero() {
-				None
-			} else {
-				Some((c, s))
-			}
-		})
-		.enumerate()
-		.map(|(idx, (c, s))| {
-			nominators.push(Nominator {
-				who: c.who.clone(),
-				edges: vec![ Edge { who: c.who.clone(), candidate_index: idx, ..Default::default() }],
-				budget: to_votes(s),
-				load: Fraction::zero(),
-			});
-			c_idx_cache.insert(c.who.clone(), idx);
-			c
-		})
-		.collect::>>();
+		let stash_balance = stash_of(&who);
+		(Candidate { who, ..Default::default() }, stash_balance)
+	})
+	.filter_map(|(mut c, s)| {
+		c.approval_stake += to_votes(s);
+		if c.approval_stake.is_zero() {
+			None
+		} else {
+			Some((c, s))
+		}
+	})
+	.enumerate()
+	.map(|(idx, (c, s))| {
+		nominators.push(Nominator {
+			who: c.who.clone(),
+			edges: vec![ Edge { who: c.who.clone(), candidate_index: idx, ..Default::default() }],
+			budget: to_votes(s),
+			load: Fraction::zero(),
+		});
+		c_idx_cache.insert(c.who.clone(), idx);
+		c
+	})
+	.collect::>>();
 
 	// 2- Collect the nominators with the associated votes.
 	// Also collect approval stake along the way.
@@ -180,7 +180,7 @@ pub fn elect(
 						let temp =
 							n.budget.saturating_mul(SCALE_FACTOR) / c.approval_stake
 							* (*n.load / SCALE_FACTOR);
-						c.score = Fraction::from_max_value((*c.score).saturating_add(temp));
+						c.score = Fraction::from_parts((*c.score).saturating_add(temp));
 					}
 				}
 			}
@@ -196,7 +196,7 @@ pub fn elect(
 				for n in &mut nominators {
 					for e in &mut n.edges {
 						if e.who == winner.who {
-							e.load = Fraction::from_max_value(*winner.score - *n.load);
+							e.load = Fraction::from_parts(*winner.score - *n.load);
 							n.load = winner.score;
 						}
 					}
diff --git a/srml/staking/src/tests.rs b/srml/staking/src/tests.rs
index 17885dc2510220718ad1f510a5372d403cfab56e..0643cd15cf5661c07b2a6126bc8e21591e43c882 100644
--- a/srml/staking/src/tests.rs
+++ b/srml/staking/src/tests.rs
@@ -16,50 +16,14 @@
 
 //! Tests for the module.
 
-#![cfg(test)]
-
 use super::*;
 use runtime_io::with_externalities;
 use phragmen;
+use primitives::traits::OnInitialize;
 use srml_support::{assert_ok, assert_noop, assert_eq_uvec, EnumerableStorageMap};
-use mock::{Balances, Session, Staking, System, Timestamp, Test, ExtBuilder, Origin};
+use mock::*;
 use srml_support::traits::{Currency, ReservableCurrency};
 
-#[inline]
-fn check_exposure(acc: u64) {
-	let expo = Staking::stakers(&acc);
-	assert_eq!(expo.total as u128, expo.own as u128 + expo.others.iter().map(|e| e.value as u128).sum::());
-}
-
-#[inline]
-fn check_exposure_all() {
-	Staking::current_elected().into_iter().for_each(|acc| check_exposure(acc));
-}
-
-#[inline]
-fn assert_total_expo(acc: u64, val: u64) {
-	let expo = Staking::stakers(&acc);
-	assert_eq!(expo.total, val);
-}
-
-#[inline]
-fn bond_validator(acc: u64, val: u64) {
-	// a = controller
-	// a + 1 = stash
-	let _ = Balances::make_free_balance_be(&(acc+1), val);
-	assert_ok!(Staking::bond(Origin::signed(acc+1), acc, val, RewardDestination::Controller));
-	assert_ok!(Staking::validate(Origin::signed(acc), ValidatorPrefs::default()));
-}
-
-#[inline]
-fn bond_nominator(acc: u64, val: u64, target: Vec) {
-	// a = controller
-	// a + 1 = stash
-	let _ = Balances::make_free_balance_be(&(acc+1), val);
-	assert_ok!(Staking::bond(Origin::signed(acc+1), acc, val, RewardDestination::Controller));
-	assert_ok!(Staking::nominate(Origin::signed(acc), target));
-}
-
 #[test]
 fn basic_setup_works() {
 	// Verifies initial conditions of mock
@@ -130,7 +94,7 @@ fn no_offline_should_work() {
 		assert_eq!(Staking::slash_count(&10), 0);
 		assert_eq!(Balances::free_balance(&10), 1);
 		// New era is not being forced
-		assert!(Staking::forcing_new_era().is_none());
+		assert!(!Staking::forcing_new_era());
 	});
 }
 
@@ -147,9 +111,7 @@ fn change_controller_works() {
 
 		assert_ok!(Staking::set_controller(Origin::signed(11), 5));
 
-		System::set_block_number(1);
-		Session::check_rotate_session(System::block_number());
-		assert_eq!(Staking::current_era(), 1);
+		start_era(1);
 
 		assert_noop!(
 			Staking::validate(Origin::signed(10), ValidatorPrefs::default()),
@@ -187,12 +149,12 @@ fn invulnerability_should_work() {
 		assert!(>::exists(&11));
 		// New era not being forced
 		// NOTE: new era is always forced once slashing happens -> new validators need to be chosen.
-		assert!(Staking::forcing_new_era().is_none());
+		assert!(!Staking::forcing_new_era());
 	});
 }
 
 #[test]
-fn offline_should_slash_and_kick() {
+fn offline_should_slash_and_disable() {
 	// Test that an offline validator gets slashed and kicked
 	with_externalities(&mut ExtBuilder::default().build(), || {
 		// Give account 10 some balance
@@ -207,6 +169,8 @@ fn offline_should_slash_and_kick() {
 		assert_eq!(Staking::slash_count(&11), 0);
 		// Account 10 has the funds we just gave it
 		assert_eq!(Balances::free_balance(&11), 1000);
+		// Account 10 is not yet disabled.
+		assert!(!is_disabled(10));
 		// Report account 10 as offline, one greater than unstake threshold
 		Staking::on_offline_validator(10, 4);
 		// Confirm user has been reported
@@ -214,10 +178,8 @@ fn offline_should_slash_and_kick() {
 		// Confirm balance has been reduced by 2^unstake_threshold * offline_slash() * amount_at_stake.
 		let slash_base = Staking::offline_slash() * Staking::stakers(11).total;
 		assert_eq!(Balances::free_balance(&11), 1000 - 2_u64.pow(3) * slash_base);
-		// Confirm account 10 has been removed as a validator
-		assert!(!>::exists(&11));
-		// A new era is forced due to slashing
-		assert!(Staking::forcing_new_era().is_some());
+		// Confirm account 10 has been disabled.
+		assert!(is_disabled(10));
 	});
 }
 
@@ -256,7 +218,7 @@ fn offline_grace_should_delay_slashing() {
 		// User gets slashed
 		assert!(Balances::free_balance(&11) < 70);
 		// New era is forced
-		assert!(Staking::forcing_new_era().is_some());
+		assert!(is_disabled(10));
 	});
 }
 
@@ -323,7 +285,7 @@ fn slashing_does_not_cause_underflow() {
 		});
 
 		System::set_block_number(1);
-		Session::check_rotate_session(System::block_number());
+		Session::on_initialize(System::block_number());
 
 		// Should not panic
 		Staking::on_offline_validator(10, 100);
@@ -340,8 +302,6 @@ fn rewards_should_work() {
 	// * rewards get paid per Era
 	// * Check that nominators are also rewarded
 	with_externalities(&mut ExtBuilder::default()
-		.session_length(3)
-		.sessions_per_era(3)
 	.build(),
 	|| {
 		let delay = 1;
@@ -353,9 +313,6 @@ fn rewards_should_work() {
 		assert_ok!(Staking::set_payee(Origin::signed(10), RewardDestination::Controller));
 
 		// Initial config should be correct
-		assert_eq!(Staking::era_length(), 9);
-		assert_eq!(Staking::sessions_per_era(), 3);
-		assert_eq!(Staking::last_era_length_change(), 0);
 		assert_eq!(Staking::current_era(), 0);
 		assert_eq!(Session::current_index(), 0);
 		assert_eq!(Staking::current_session_reward(), 10);
@@ -380,7 +337,7 @@ fn rewards_should_work() {
 		let mut block = 3; // Block 3 => Session 1 => Era 0
 		System::set_block_number(block);
 		Timestamp::set_timestamp(block*5);	// on time.
-		Session::check_rotate_session(System::block_number());
+		Session::on_initialize(System::block_number());
 		assert_eq!(Staking::current_era(), 0);
 		assert_eq!(Session::current_index(), 1);
 
@@ -391,24 +348,24 @@ fn rewards_should_work() {
 		block = 6; // Block 6 => Session 2 => Era 0
 		System::set_block_number(block);
 		Timestamp::set_timestamp(block*5 + delay);	// a little late.
-		Session::check_rotate_session(System::block_number());
+		Session::on_initialize(System::block_number());
 		assert_eq!(Staking::current_era(), 0);
 		assert_eq!(Session::current_index(), 2);
 
 		// session reward is the same,
 		assert_eq!(Staking::current_session_reward(), session_reward);
 		// though 2 will be deducted while stashed in the era reward due to delay
-		assert_eq!(Staking::current_era_reward(), 2*session_reward - delay);
+		assert_eq!(Staking::current_era_reward(), 2*session_reward); // - delay);
 
 		block = 9; // Block 9 => Session 3 => Era 1
 		System::set_block_number(block);
 		Timestamp::set_timestamp(block*5);  // back to being on time. no delays
-		Session::check_rotate_session(System::block_number());
+		Session::on_initialize(System::block_number());
 		assert_eq!(Staking::current_era(), 1);
 		assert_eq!(Session::current_index(), 3);
 
-		assert_eq!(Balances::total_balance(&10), 1 + (3*session_reward - delay)/2);
-		assert_eq!(Balances::total_balance(&2), 500 + (3*session_reward - delay)/2);
+		assert_eq!(Balances::total_balance(&10), 1 + (3*session_reward)/2);
+		assert_eq!(Balances::total_balance(&2), 500 + (3*session_reward)/2);
 	});
 }
 
@@ -418,12 +375,9 @@ fn multi_era_reward_should_work() {
 	// The value of current_session_reward is set at the end of each era, based on
 	// slot_stake and session_reward.
 	with_externalities(&mut ExtBuilder::default()
-		.session_length(3)
-		.sessions_per_era(3)
 		.nominate(false)
 		.build(),
 	|| {
-		let delay = 1;
 		let session_reward = 10;
 
 		// This is set by the test config builder.
@@ -435,37 +389,21 @@ fn multi_era_reward_should_work() {
 		// Set payee to controller
 		assert_ok!(Staking::set_payee(Origin::signed(10), RewardDestination::Controller));
 
-		let mut block = 3;
-		// Block 3 => Session 1 => Era 0
-		System::set_block_number(block);
-		Timestamp::set_timestamp(block*5);
-		Session::check_rotate_session(System::block_number());
-		assert_eq!(Staking::current_era(), 0);
-		assert_eq!(Session::current_index(), 1);
+		start_session(1);
 
 		// session triggered: the reward value stashed should be 10
 		assert_eq!(Staking::current_session_reward(), session_reward);
 		assert_eq!(Staking::current_era_reward(), session_reward);
 
-		block = 6; // Block 6 => Session 2 => Era 0
-		System::set_block_number(block);
-		Timestamp::set_timestamp(block*5 + delay);	// a little late.
-		Session::check_rotate_session(System::block_number());
-		assert_eq!(Staking::current_era(), 0);
-		assert_eq!(Session::current_index(), 2);
+		start_session(2);
 
 		assert_eq!(Staking::current_session_reward(), session_reward);
-		assert_eq!(Staking::current_era_reward(), 2*session_reward - delay);
+		assert_eq!(Staking::current_era_reward(), 2*session_reward);
 
-		block = 9; // Block 9 => Session 3 => Era 1
-		System::set_block_number(block);
-		Timestamp::set_timestamp(block*5);  // back to being punktlisch. no delayss
-		Session::check_rotate_session(System::block_number());
-		assert_eq!(Staking::current_era(), 1);
-		assert_eq!(Session::current_index(), 3);
+		start_session(3);
 
 		// 1 + sum of of the session rewards accumulated
-		let recorded_balance = 1 + 3*session_reward - delay;
+		let recorded_balance = 1 + 3*session_reward;
 		assert_eq!(Balances::total_balance(&10), recorded_balance);
 
 		// the reward for next era will be: session_reward * slot_stake
@@ -473,14 +411,13 @@ fn multi_era_reward_should_work() {
 		assert_eq!(Staking::current_session_reward(), new_session_reward);
 
 		// fast forward to next era:
-		block=12; System::set_block_number(block);Timestamp::set_timestamp(block*5);Session::check_rotate_session(System::block_number());
-		block=15; System::set_block_number(block);Timestamp::set_timestamp(block*5);Session::check_rotate_session(System::block_number());
+		start_session(5);
 
 		// intermediate test.
 		assert_eq!(Staking::current_era_reward(), 2*new_session_reward);
 
 		// new era is triggered here.
-		block=18; System::set_block_number(block);Timestamp::set_timestamp(block*5);Session::check_rotate_session(System::block_number());
+		start_session(6);
 
 		// pay time
 		assert_eq!(Balances::total_balance(&10), 3*new_session_reward + recorded_balance);
@@ -494,7 +431,6 @@ fn staking_should_work() {
 	// * new ones will be chosen per era
 	// * either one can unlock the stash and back-down from being a validator via `chill`ing.
 	with_externalities(&mut ExtBuilder::default()
-		.sessions_per_era(3)
 		.nominate(false)
 		.fair(false) // to give 20 more staked value
 		.build(),
@@ -502,15 +438,12 @@ fn staking_should_work() {
 		// remember + compare this along with the test.
 		assert_eq_uvec!(Session::validators(), vec![20, 10]);
 
-		assert_ok!(Staking::set_bonding_duration(2));
-		assert_eq!(Staking::bonding_duration(), 2);
-
 		// put some money in account that we'll use.
 		for i in 1..5 { let _ = Balances::make_free_balance_be(&i, 2000); }
 
 		// --- Block 1:
 		System::set_block_number(1);
-		Session::check_rotate_session(System::block_number());
+		Session::on_initialize(System::block_number());
 		assert_eq!(Staking::current_era(), 0);
 
 		// add a new candidate for being a validator. account 3 controlled by 4.
@@ -522,7 +455,7 @@ fn staking_should_work() {
 
 		// --- Block 2:
 		System::set_block_number(2);
-		Session::check_rotate_session(System::block_number());
+		Session::on_initialize(System::block_number());
 		assert_eq!(Staking::current_era(), 0);
 
 		// No effects will be seen so far. Era has not been yet triggered.
@@ -531,7 +464,7 @@ fn staking_should_work() {
 
 		// --- Block 3: the validators will now change.
 		System::set_block_number(3);
-		Session::check_rotate_session(System::block_number());
+		Session::on_initialize(System::block_number());
 
 		// 2 only voted for 4 and 20
 		assert_eq!(Session::validators().len(), 2);
@@ -541,7 +474,7 @@ fn staking_should_work() {
 
 		// --- Block 4: Unstake 4 as a validator, freeing up the balance stashed in 3
 		System::set_block_number(4);
-		Session::check_rotate_session(System::block_number());
+		Session::on_initialize(System::block_number());
 
 		// 4 will chill
 		Staking::chill(Origin::signed(4)).unwrap();
@@ -553,14 +486,14 @@ fn staking_should_work() {
 
 		// --- Block 5: nothing. 4 is still there.
 		System::set_block_number(5);
-		Session::check_rotate_session(System::block_number());
+		Session::on_initialize(System::block_number());
 		assert_eq_uvec!(Session::validators(), vec![20, 4]);
 		assert_eq!(Staking::current_era(), 1);
 
 
 		// --- Block 6: 4 will not be a validator.
 		System::set_block_number(6);
-		Session::check_rotate_session(System::block_number());
+		Session::on_initialize(System::block_number());
 		assert_eq!(Staking::current_era(), 2);
 		assert_eq!(Session::validators().contains(&4), false);
 		assert_eq_uvec!(Session::validators(), vec![20, 10]);
@@ -585,9 +518,7 @@ fn less_than_needed_candidates_works() {
 		assert_eq!(Staking::minimum_validator_count(), 1);
 		assert_eq_uvec!(Session::validators(), vec![30, 20, 10]);
 
-		System::set_block_number(1);
-		Session::check_rotate_session(System::block_number());
-		assert_eq!(Staking::current_era(), 1);
+		start_era(1);
 
 		// Previous set is selected. NO election algorithm is even executed.
 		assert_eq_uvec!(Session::validators(), vec![30, 20, 10]);
@@ -611,7 +542,6 @@ fn no_candidate_emergency_condition() {
 		.nominate(false)
 		.build(),
 	|| {
-		assert_eq!(Staking::era_length(), 1);
 		assert_eq!(Staking::validator_count(), 15);
 
 		// initial validators
@@ -621,7 +551,7 @@ fn no_candidate_emergency_condition() {
 
 		// trigger era
 		System::set_block_number(1);
-		Session::check_rotate_session(System::block_number());
+		Session::on_initialize(System::block_number());
 
 		// Previous ones are elected. chill is invalidates. TODO: #2494
 		assert_eq_uvec!(Session::validators(), vec![10, 20, 30, 40]);
@@ -700,16 +630,14 @@ fn nominating_and_rewards_should_work() {
 		assert_ok!(Staking::bond(Origin::signed(3), 4, 1000, RewardDestination::Controller));
 		assert_ok!(Staking::nominate(Origin::signed(4), vec![11, 21, 41]));
 
-		System::set_block_number(1);
-		Session::check_rotate_session(System::block_number());
-		assert_eq!(Staking::current_era(), 1);
+		start_era(1);
 
 		// 10 and 20 have more votes, they will be chosen by phragmen.
 		assert_eq_uvec!(Session::validators(), vec![20, 10]);
 
 		// OLD validators must have already received some rewards.
-		assert_eq!(Balances::total_balance(&40), 1 + session_reward);
-		assert_eq!(Balances::total_balance(&30), 1 + session_reward);
+		assert_eq!(Balances::total_balance(&40), 1 + 3 * session_reward);
+		assert_eq!(Balances::total_balance(&30), 1 + 3 * session_reward);
 
 		// ------ check the staked value of all parties.
 
@@ -731,22 +659,29 @@ fn nominating_and_rewards_should_work() {
 		assert_eq!(Staking::stakers(41).total, 0);
 
 
-		System::set_block_number(2);
-		Session::check_rotate_session(System::block_number());
+		start_era(2);
 		// next session reward.
-		let new_session_reward = Staking::session_reward() * Staking::slot_stake();
+		let new_session_reward = Staking::session_reward() * 3 * Staking::slot_stake();
 		// nothing else will happen, era ends and rewards are paid again,
 		// it is expected that nominators will also be paid. See below
 
+		// Approximation resulting from Perbill conversion
+		let approximation = 1;
 		// Nominator 2: has [400/1800 ~ 2/9 from 10] + [600/2200 ~ 3/11 from 20]'s reward. ==> 2/9 + 3/11
-		assert_eq!(Balances::total_balance(&2), initial_balance + (2*new_session_reward/9 + 3*new_session_reward/11));
+		assert_eq!(
+			Balances::total_balance(&2),
+			initial_balance + (2*new_session_reward/9 + 3*new_session_reward/11) - 1 - approximation
+		);
 		// Nominator 4: has [400/1800 ~ 2/9 from 10] + [600/2200 ~ 3/11 from 20]'s reward. ==> 2/9 + 3/11
-		assert_eq!(Balances::total_balance(&4), initial_balance + (2*new_session_reward/9 + 3*new_session_reward/11));
+		assert_eq!(
+			Balances::total_balance(&4),
+			initial_balance + (2*new_session_reward/9 + 3*new_session_reward/11) - 1 - approximation
+		);
 
 		// 10 got 800 / 1800 external stake => 8/18 =? 4/9 => Validator's share = 5/9
-		assert_eq!(Balances::total_balance(&10), initial_balance + 5*new_session_reward/9);
+		assert_eq!(Balances::total_balance(&10), initial_balance + 5*new_session_reward/9 - approximation);
 		// 10 got 1200 / 2200 external stake => 12/22 =? 6/11 => Validator's share = 5/11
-		assert_eq!(Balances::total_balance(&20), initial_balance + 5*new_session_reward/11);
+		assert_eq!(Balances::total_balance(&20), initial_balance + 5*new_session_reward/11+ 2);
 
 		check_exposure_all();
 	});
@@ -756,7 +691,6 @@ fn nominating_and_rewards_should_work() {
 fn nominators_also_get_slashed() {
 	// A nominator should be slashed if the validator they nominated is slashed
 	with_externalities(&mut ExtBuilder::default().nominate(false).build(), || {
-		assert_eq!(Staking::era_length(), 1);
 		assert_eq!(Staking::validator_count(), 2);
 		// slash happens immediately.
 		assert_eq!(Staking::offline_slash_grace(), 0);
@@ -779,8 +713,7 @@ fn nominators_also_get_slashed() {
 		assert_ok!(Staking::nominate(Origin::signed(2), vec![20, 10]));
 
 		// new era, pay rewards,
-		System::set_block_number(1);
-		Session::check_rotate_session(System::block_number());
+		start_era(1);
 
 		// Nominator stash didn't collect any.
 		assert_eq!(Balances::total_balance(&2), initial_balance);
@@ -794,11 +727,11 @@ fn nominators_also_get_slashed() {
 		let nominator_slash = nominator_stake.min(total_slash - validator_slash);
 
 		// initial + first era reward + slash
-		assert_eq!(Balances::total_balance(&10), initial_balance + 10 - validator_slash);
+		assert_eq!(Balances::total_balance(&10), initial_balance + 30 - validator_slash);
 		assert_eq!(Balances::total_balance(&2), initial_balance - nominator_slash);
 		check_exposure_all();
 		// Because slashing happened.
-		assert!(Staking::forcing_new_era().is_some());
+		assert!(is_disabled(10));
 	});
 }
 
@@ -809,7 +742,6 @@ fn double_staking_should_fail() {
 	// * an account already bonded as stash cannot nominate.
 	// * an account already bonded as controller can nominate.
 	with_externalities(&mut ExtBuilder::default()
-		.sessions_per_era(2)
 		.build(),
 		|| {
 			let arbitrary_value = 5;
@@ -829,7 +761,6 @@ fn double_controlling_should_fail() {
 	// should test (in the same order):
 	// * an account already bonded as controller CANNOT be reused as the controller of another account.
 	with_externalities(&mut ExtBuilder::default()
-		.sessions_per_era(2)
 		.build(),
 		|| {
 			let arbitrary_value = 5;
@@ -843,70 +774,43 @@ fn double_controlling_should_fail() {
 #[test]
 fn session_and_eras_work() {
 	with_externalities(&mut ExtBuilder::default()
-		.sessions_per_era(2)
 		.build(),
 	|| {
-		assert_eq!(Staking::era_length(), 2);
-		assert_eq!(Staking::sessions_per_era(), 2);
-		assert_eq!(Staking::last_era_length_change(), 0);
 		assert_eq!(Staking::current_era(), 0);
-		assert_eq!(Session::current_index(), 0);
 
 		// Block 1: No change.
-		System::set_block_number(1);
-		Session::check_rotate_session(System::block_number());
+		start_session(1);
 		assert_eq!(Session::current_index(), 1);
-		assert_eq!(Staking::sessions_per_era(), 2);
-		assert_eq!(Staking::last_era_length_change(), 0);
 		assert_eq!(Staking::current_era(), 0);
 
 		// Block 2: Simple era change.
-		System::set_block_number(2);
-		Session::check_rotate_session(System::block_number());
-		assert_eq!(Session::current_index(), 2);
-		assert_eq!(Staking::sessions_per_era(), 2);
-		assert_eq!(Staking::last_era_length_change(), 0);
+		start_session(3);
+		assert_eq!(Session::current_index(), 3);
 		assert_eq!(Staking::current_era(), 1);
 
 		// Block 3: Schedule an era length change; no visible changes.
-		System::set_block_number(3);
-		assert_ok!(Staking::set_sessions_per_era(3));
-		Session::check_rotate_session(System::block_number());
-		assert_eq!(Session::current_index(), 3);
-		assert_eq!(Staking::sessions_per_era(), 2);
-		assert_eq!(Staking::last_era_length_change(), 0);
+		start_session(4);
+		assert_eq!(Session::current_index(), 4);
 		assert_eq!(Staking::current_era(), 1);
 
 		// Block 4: Era change kicks in.
-		System::set_block_number(4);
-		Session::check_rotate_session(System::block_number());
-		assert_eq!(Session::current_index(), 4);
-		assert_eq!(Staking::sessions_per_era(), 3);
-		assert_eq!(Staking::last_era_length_change(), 4);
+		start_session(6);
+		assert_eq!(Session::current_index(), 6);
 		assert_eq!(Staking::current_era(), 2);
 
 		// Block 5: No change.
-		System::set_block_number(5);
-		Session::check_rotate_session(System::block_number());
-		assert_eq!(Session::current_index(), 5);
-		assert_eq!(Staking::sessions_per_era(), 3);
-		assert_eq!(Staking::last_era_length_change(), 4);
+		start_session(7);
+		assert_eq!(Session::current_index(), 7);
 		assert_eq!(Staking::current_era(), 2);
 
 		// Block 6: No change.
-		System::set_block_number(6);
-		Session::check_rotate_session(System::block_number());
-		assert_eq!(Session::current_index(), 6);
-		assert_eq!(Staking::sessions_per_era(), 3);
-		assert_eq!(Staking::last_era_length_change(), 4);
+		start_session(8);
+		assert_eq!(Session::current_index(), 8);
 		assert_eq!(Staking::current_era(), 2);
 
 		// Block 7: Era increment.
-		System::set_block_number(7);
-		Session::check_rotate_session(System::block_number());
-		assert_eq!(Session::current_index(), 7);
-		assert_eq!(Staking::sessions_per_era(), 3);
-		assert_eq!(Staking::last_era_length_change(), 4);
+		start_session(9);
+		assert_eq!(Session::current_index(), 9);
 		assert_eq!(Staking::current_era(), 3);
 	});
 }
@@ -984,31 +888,39 @@ fn reward_destination_works() {
 		// Check the balance of the stash account
 		assert_eq!(Balances::free_balance(&11), 1000);
 		// Check how much is at stake
-		assert_eq!(Staking::ledger(&10), Some(StakingLedger { stash: 11, total: 1000, active: 1000, unlocking: vec![] }));
+		assert_eq!(Staking::ledger(&10), Some(StakingLedger {
+			stash: 11,
+			total: 1000,
+			active: 1000,
+			unlocking: vec![],
+		}));
 		// Check current session reward is 10
-		let session_reward0 = Staking::current_session_reward(); // 10
+		let session_reward0 = 3 * Staking::current_session_reward(); // 10
 
 		// Move forward the system for payment
-		System::set_block_number(1);
 		Timestamp::set_timestamp(5);
-		Session::check_rotate_session(System::block_number());
+		start_era(1);
 
 		// Check that RewardDestination is Staked (default)
 		assert_eq!(Staking::payee(&11), RewardDestination::Staked);
 		// Check that reward went to the stash account of validator
 		assert_eq!(Balances::free_balance(&11), 1000 + session_reward0);
 		// Check that amount at stake increased accordingly
-		assert_eq!(Staking::ledger(&10), Some(StakingLedger { stash: 11, total: 1000 + session_reward0, active: 1000 + session_reward0, unlocking: vec![] }));
+		assert_eq!(Staking::ledger(&10), Some(StakingLedger {
+			stash: 11,
+			total: 1000 + session_reward0,
+			active: 1000 + session_reward0,
+			unlocking: vec![],
+		}));
 		// Update current session reward
-		let session_reward1 = Staking::current_session_reward(); // 1010 (1* slot_stake)
+		let session_reward1 = 3 * Staking::current_session_reward(); // 1010 (1* slot_stake)
 
 		//Change RewardDestination to Stash
 		>::insert(&11, RewardDestination::Stash);
 
 		// Move forward the system for payment
-		System::set_block_number(2);
 		Timestamp::set_timestamp(10);
-		Session::check_rotate_session(System::block_number());
+		start_era(2);
 
 		// Check that RewardDestination is Stash
 		assert_eq!(Staking::payee(&11), RewardDestination::Stash);
@@ -1017,7 +929,12 @@ fn reward_destination_works() {
 		// Record this value
 		let recorded_stash_balance = 1000 + session_reward0 + session_reward1;
 		// Check that amount at stake is NOT increased
-		assert_eq!(Staking::ledger(&10), Some(StakingLedger { stash: 11, total: 1000 + session_reward0, active: 1000 + session_reward0, unlocking: vec![] }));
+		assert_eq!(Staking::ledger(&10), Some(StakingLedger {
+			stash: 11,
+			total: 1000 + session_reward0,
+			active: 1000 + session_reward0,
+			unlocking: vec![],
+		}));
 
 		// Change RewardDestination to Controller
 		>::insert(&11, RewardDestination::Controller);
@@ -1026,17 +943,21 @@ fn reward_destination_works() {
 		assert_eq!(Balances::free_balance(&10), 1);
 
 		// Move forward the system for payment
-		System::set_block_number(3);
 		Timestamp::set_timestamp(15);
-		Session::check_rotate_session(System::block_number());
-		let session_reward2 = Staking::current_session_reward(); // 1010 (1* slot_stake)
+		start_era(3);
+		let session_reward2 = 3 * Staking::current_session_reward(); // 1010 (1* slot_stake)
 
 		// Check that RewardDestination is Controller
 		assert_eq!(Staking::payee(&11), RewardDestination::Controller);
 		// Check that reward went to the controller account
 		assert_eq!(Balances::free_balance(&10), 1 + session_reward2);
 		// Check that amount at stake is NOT increased
-		assert_eq!(Staking::ledger(&10), Some(StakingLedger { stash: 11, total: 1000 + session_reward0, active: 1000 + session_reward0, unlocking: vec![] }));
+		assert_eq!(Staking::ledger(&10), Some(StakingLedger {
+			stash: 11,
+			total: 1000 + session_reward0,
+			active: 1000 + session_reward0,
+			unlocking: vec![],
+		}));
 		// Check that amount in staked account is NOT increased.
 		assert_eq!(Balances::free_balance(&11), recorded_stash_balance);
 	});
@@ -1048,8 +969,6 @@ fn validator_payment_prefs_work() {
 	// Note: unstake threshold is being directly tested in slashing tests.
 	// This test will focus on validator payment.
 	with_externalities(&mut ExtBuilder::default()
-		.session_length(3)
-		.sessions_per_era(3)
 		.build(),
 	|| {
 		// Initial config
@@ -1081,7 +1000,7 @@ fn validator_payment_prefs_work() {
 		// Block 3 => Session 1 => Era 0
 		let mut block = 3;
 		System::set_block_number(block);
-		Session::check_rotate_session(System::block_number());
+		Session::on_initialize(System::block_number());
 		assert_eq!(Staking::current_era(), 0);
 		assert_eq!(Session::current_index(), 1);
 
@@ -1091,7 +1010,7 @@ fn validator_payment_prefs_work() {
 
 		block = 6; // Block 6 => Session 2 => Era 0
 		System::set_block_number(block);
-		Session::check_rotate_session(System::block_number());
+		Session::on_initialize(System::block_number());
 		assert_eq!(Staking::current_era(), 0);
 		assert_eq!(Session::current_index(), 2);
 
@@ -1100,7 +1019,7 @@ fn validator_payment_prefs_work() {
 
 		block = 9; // Block 9 => Session 3 => Era 1
 		System::set_block_number(block);
-		Session::check_rotate_session(System::block_number());
+		Session::on_initialize(System::block_number());
 		assert_eq!(Staking::current_era(), 1);
 		assert_eq!(Session::current_index(), 3);
 
@@ -1130,7 +1049,12 @@ fn bond_extra_works() {
 		// Check that account 10 is bonded to account 11
 		assert_eq!(Staking::bonded(&11), Some(10));
 		// Check how much is at stake
-		assert_eq!(Staking::ledger(&10), Some(StakingLedger { stash: 11, total: 1000, active: 1000, unlocking: vec![] }));
+		assert_eq!(Staking::ledger(&10), Some(StakingLedger {
+			stash: 11,
+			total: 1000,
+			active: 1000,
+			unlocking: vec![],
+		}));
 
 		// Give account 11 some large free balance greater than total
 		let _ = Balances::make_free_balance_be(&11, 1000000);
@@ -1138,12 +1062,22 @@ fn bond_extra_works() {
 		// Call the bond_extra function from controller, add only 100
 		assert_ok!(Staking::bond_extra(Origin::signed(11), 100));
 		// There should be 100 more `total` and `active` in the ledger
-		assert_eq!(Staking::ledger(&10), Some(StakingLedger { stash: 11, total: 1000 + 100, active: 1000 + 100, unlocking: vec![] }));
+		assert_eq!(Staking::ledger(&10), Some(StakingLedger {
+			stash: 11,
+			total: 1000 + 100,
+			active: 1000 + 100,
+			unlocking: vec![],
+		}));
 
 		// Call the bond_extra function with a large number, should handle it
 		assert_ok!(Staking::bond_extra(Origin::signed(11), u64::max_value()));
 		// The full amount of the funds should now be in the total and active
-		assert_eq!(Staking::ledger(&10), Some(StakingLedger { stash: 11, total: 1000000, active: 1000000, unlocking: vec![] }));
+		assert_eq!(Staking::ledger(&10), Some(StakingLedger {
+			stash: 11,
+			total: 1000000,
+			active: 1000000,
+			unlocking: vec![],
+		}));
 	});
 }
 
@@ -1161,14 +1095,10 @@ fn bond_extra_and_withdraw_unbonded_works() {
 		// Set payee to controller. avoids confusion
 		assert_ok!(Staking::set_payee(Origin::signed(10), RewardDestination::Controller));
 
-		// Set unbonding era (bonding_duration) to 2
-		assert_ok!(Staking::set_bonding_duration(2));
-
 		// Give account 11 some large free balance greater than total
 		let _ = Balances::make_free_balance_be(&11, 1000000);
 
 		// Initial config should be correct
-		assert_eq!(Staking::sessions_per_era(), 1);
 		assert_eq!(Staking::current_era(), 0);
 		assert_eq!(Session::current_index(), 0);
 		assert_eq!(Staking::current_session_reward(), 10);
@@ -1177,58 +1107,65 @@ fn bond_extra_and_withdraw_unbonded_works() {
 		assert_eq!(Balances::total_balance(&10), 1);
 
 		// confirm that 10 is a normal validator and gets paid at the end of the era.
-		System::set_block_number(1);
-		Session::check_rotate_session(System::block_number());
+		start_era(1);
 
 		// Initial state of 10
-		assert_eq!(Staking::ledger(&10), Some(StakingLedger { stash: 11, total: 1000, active: 1000, unlocking: vec![] }));
+		assert_eq!(Staking::ledger(&10), Some(StakingLedger {
+			stash: 11,
+			total: 1000,
+			active: 1000,
+			unlocking: vec![],
+		}));
 		assert_eq!(Staking::stakers(&11), Exposure { total: 1000, own: 1000, others: vec![] });
 
 		// deposit the extra 100 units
 		Staking::bond_extra(Origin::signed(11), 100).unwrap();
 
-		assert_eq!(Staking::ledger(&10), Some(StakingLedger { stash: 11, total: 1000 + 100, active: 1000 + 100, unlocking: vec![] }));
+		assert_eq!(Staking::ledger(&10), Some(StakingLedger {
+			stash: 11,
+			total: 1000 + 100,
+			active: 1000 + 100,
+			unlocking: vec![],
+		}));
 		// Exposure is a snapshot! only updated after the next era update.
 		assert_ne!(Staking::stakers(&11), Exposure { total: 1000 + 100, own: 1000 + 100, others: vec![] });
 
 		// trigger next era.
-		System::set_block_number(2);Timestamp::set_timestamp(10);Session::check_rotate_session(System::block_number());
+		Timestamp::set_timestamp(10);
+		start_era(2);
 		assert_eq!(Staking::current_era(), 2);
-		assert_eq!(Session::current_index(), 2);
 
 		// ledger should be the same.
-		assert_eq!(Staking::ledger(&10), Some(StakingLedger { stash: 11, total: 1000 + 100, active: 1000 + 100, unlocking: vec![] }));
+		assert_eq!(Staking::ledger(&10), Some(StakingLedger {
+			stash: 11,
+			total: 1000 + 100,
+			active: 1000 + 100,
+			unlocking: vec![],
+		}));
 		// Exposure is now updated.
 		assert_eq!(Staking::stakers(&11), Exposure { total: 1000 + 100, own: 1000 + 100, others: vec![] });
 
 		// Unbond almost all of the funds in stash.
 		Staking::unbond(Origin::signed(10), 1000).unwrap();
 		assert_eq!(Staking::ledger(&10), Some(StakingLedger {
-			stash: 11, total: 1000 + 100, active: 100, unlocking: vec![UnlockChunk{ value: 1000, era: 2 + 2}] })
+			stash: 11, total: 1000 + 100, active: 100, unlocking: vec![UnlockChunk{ value: 1000, era: 2 + 3}] })
 		);
 
 		// Attempting to free the balances now will fail. 2 eras need to pass.
 		Staking::withdraw_unbonded(Origin::signed(10)).unwrap();
 		assert_eq!(Staking::ledger(&10), Some(StakingLedger {
-			stash: 11, total: 1000 + 100, active: 100, unlocking: vec![UnlockChunk{ value: 1000, era: 2 + 2}] }));
+			stash: 11, total: 1000 + 100, active: 100, unlocking: vec![UnlockChunk{ value: 1000, era: 2 + 3}] }));
 
 		// trigger next era.
-		System::set_block_number(3);
-		Session::check_rotate_session(System::block_number());
-
-		assert_eq!(Staking::current_era(), 3);
-		assert_eq!(Session::current_index(), 3);
+		start_era(3);
 
 		// nothing yet
 		Staking::withdraw_unbonded(Origin::signed(10)).unwrap();
 		assert_eq!(Staking::ledger(&10), Some(StakingLedger {
-			stash: 11, total: 1000 + 100, active: 100, unlocking: vec![UnlockChunk{ value: 1000, era: 2 + 2}] }));
+			stash: 11, total: 1000 + 100, active: 100, unlocking: vec![UnlockChunk{ value: 1000, era: 2 + 3}] }));
 
 		// trigger next era.
-		System::set_block_number(4);
-		Session::check_rotate_session(System::block_number());
-		assert_eq!(Staking::current_era(), 4);
-		assert_eq!(Session::current_index(), 4);
+		start_era(5);
 
 		Staking::withdraw_unbonded(Origin::signed(10)).unwrap();
 		// Now the value is free and the staking ledger is updated.
@@ -1237,6 +1174,33 @@ fn bond_extra_and_withdraw_unbonded_works() {
 	})
 }
 
+#[test]
+fn too_many_unbond_calls_should_not_work() {
+	with_externalities(&mut ExtBuilder::default().build(), || {
+		// locked at era 0 until 3
+		for _ in 0..MAX_UNLOCKING_CHUNKS-1 {
+			assert_ok!(Staking::unbond(Origin::signed(10), 1));
+		}
+
+		start_era(1);
+
+		// locked at era 1 until 4
+		assert_ok!(Staking::unbond(Origin::signed(10), 1));
+		// can't do more.
+		assert_noop!(Staking::unbond(Origin::signed(10), 1), "can not schedule more unlock chunks");
+
+		start_era(3);
+
+		assert_noop!(Staking::unbond(Origin::signed(10), 1), "can not schedule more unlock chunks");
+		// free up.
+		assert_ok!(Staking::withdraw_unbonded(Origin::signed(10)));
+
+		// Can add again.
+		assert_ok!(Staking::unbond(Origin::signed(10), 1));
+		assert_eq!(Staking::ledger(&10).unwrap().unlocking.len(), 2);
+	})
+}
+
 #[test]
 fn slot_stake_is_least_staked_validator_and_exposure_defines_maximum_punishment() {
 	// Test that slot_stake is determined by the least staked validator
@@ -1267,23 +1231,21 @@ fn slot_stake_is_least_staked_validator_and_exposure_defines_maximum_punishment(
 		>::insert(&20, StakingLedger { stash: 22, total: 69, active: 69, unlocking: vec![] });
 
 		// New era --> rewards are paid --> stakes are changed
-		System::set_block_number(1);
-		Session::check_rotate_session(System::block_number());
-		assert_eq!(Staking::current_era(), 1);
+		start_era(1);
 
 		// -- new balances + reward
-		assert_eq!(Staking::stakers(&11).total, 1000 + 10);
-		assert_eq!(Staking::stakers(&21).total, 69 + 10);
+		assert_eq!(Staking::stakers(&11).total, 1000 + 30);
+		assert_eq!(Staking::stakers(&21).total, 69 + 30);
 
 		// -- slot stake should also be updated.
-		assert_eq!(Staking::slot_stake(), 79);
+		assert_eq!(Staking::slot_stake(), 69 + 30);
 
 		// If 10 gets slashed now, it will be slashed by 5% of exposure.total * 2.pow(unstake_thresh)
 		Staking::on_offline_validator(10, 4);
 		// Confirm user has been reported
 		assert_eq!(Staking::slash_count(&11), 4);
 		// check the balance of 10 (slash will be deducted from free balance.)
-		assert_eq!(Balances::free_balance(&11), 1000 + 10 - 50 /*5% of 1000*/ * 8 /*2**3*/);
+		assert_eq!(Balances::free_balance(&11), 1000 + 30 - 51 /*5% of 1030*/ * 8 /*2**3*/);
 
 		check_exposure_all();
 	});
@@ -1318,7 +1280,7 @@ fn on_free_balance_zero_stash_removes_validator() {
 		assert!(>::exists(&11));
 
 		// Reduce free_balance of controller to 0
-		Balances::slash(&10, u64::max_value());
+		let _ = Balances::slash(&10, u64::max_value());
 
 		// Check the balance of the stash account has not been touched
 		assert_eq!(Balances::free_balance(&11), 256000);
@@ -1333,7 +1295,7 @@ fn on_free_balance_zero_stash_removes_validator() {
 		assert!(>::exists(&11));
 
 		// Reduce free_balance of stash to 0
-		Balances::slash(&11, u64::max_value());
+		let _ = Balances::slash(&11, u64::max_value());
 		// Check total balance of stash
 		assert_eq!(Balances::total_balance(&11), 0);
 
@@ -1374,7 +1336,7 @@ fn on_free_balance_zero_stash_removes_nominator() {
 		assert!(>::exists(&11));
 
 		// Reduce free_balance of controller to 0
-		Balances::slash(&10, u64::max_value());
+		let _ = Balances::slash(&10, u64::max_value());
 		// Check total balance of account 10
 		assert_eq!(Balances::total_balance(&10), 0);
 
@@ -1390,7 +1352,7 @@ fn on_free_balance_zero_stash_removes_nominator() {
 		assert!(>::exists(&11));
 
 		// Reduce free_balance of stash to 0
-		Balances::slash(&11, u64::max_value());
+		let _ = Balances::slash(&11, u64::max_value());
 		// Check total balance of stash
 		assert_eq!(Balances::total_balance(&11), 0);
 
@@ -1479,8 +1441,7 @@ fn phragmen_poc_works() {
 		assert_ok!(Staking::nominate(Origin::signed(4), vec![11, 21, 41]));
 
 		// New era => election algorithm will trigger
-		System::set_block_number(1);
-		Session::check_rotate_session(System::block_number());
+		start_era(1);
 
 		assert_eq_uvec!(Session::validators(), vec![20, 10]);
 
@@ -1557,7 +1518,6 @@ fn switching_roles() {
 	// Test that it should be possible to switch between roles (nominator, validator, idle) with minimal overhead.
 	with_externalities(&mut ExtBuilder::default()
 		.nominate(false)
-		.sessions_per_era(3)
 		.build(),
 	|| {
 		// Reset reward destination
@@ -1581,21 +1541,21 @@ fn switching_roles() {
 
 		// new block
 		System::set_block_number(1);
-		Session::check_rotate_session(System::block_number());
+		Session::on_initialize(System::block_number());
 
 		// no change
 		assert_eq_uvec!(Session::validators(), vec![20, 10]);
 
 		// new block
 		System::set_block_number(2);
-		Session::check_rotate_session(System::block_number());
+		Session::on_initialize(System::block_number());
 
 		// no change
 		assert_eq_uvec!(Session::validators(), vec![20, 10]);
 
 		// new block --> ne era --> new validators
 		System::set_block_number(3);
-		Session::check_rotate_session(System::block_number());
+		Session::on_initialize(System::block_number());
 
 		// with current nominators 10 and 5 have the most stake
 		assert_eq_uvec!(Session::validators(), vec![6, 10]);
@@ -1610,16 +1570,16 @@ fn switching_roles() {
 		// Winners: 20 and 2
 
 		System::set_block_number(4);
-		Session::check_rotate_session(System::block_number());
+		Session::on_initialize(System::block_number());
 		assert_eq_uvec!(Session::validators(), vec![6, 10]);
 
 		System::set_block_number(5);
-		Session::check_rotate_session(System::block_number());
+		Session::on_initialize(System::block_number());
 		assert_eq_uvec!(Session::validators(), vec![6, 10]);
 
 		// ne era
 		System::set_block_number(6);
-		Session::check_rotate_session(System::block_number());
+		Session::on_initialize(System::block_number());
 		assert_eq_uvec!(Session::validators(), vec![2, 20]);
 		check_exposure_all();
 	});
@@ -1645,8 +1605,7 @@ fn wrong_vote_is_null() {
 		]));
 
 		// new block
-		System::set_block_number(1);
-		Session::check_rotate_session(System::block_number());
+		start_era(1);
 
 		assert_eq_uvec!(Session::validators(), vec![20, 10]);
 	});
@@ -1671,16 +1630,14 @@ fn bond_with_no_staked_value() {
 		assert_ok!(Staking::bond(Origin::signed(1), 2, 1, RewardDestination::Controller));
 		assert_ok!(Staking::validate(Origin::signed(2), ValidatorPrefs::default()));
 
-		System::set_block_number(1);
-		Session::check_rotate_session(System::block_number());
+		start_era(1);
 
-		// Not elected even though we want 3.
 		assert_eq_uvec!(Session::validators(), vec![30, 20, 10]);
 
-		// min of 10, 20 and 30 (30 got a payout into staking so it raised it from 1 to 11).
-		assert_eq!(Staking::slot_stake(), 11);
+		// min of 10, 20 and 30 (30 got a payout into staking so it raised it from 1 to 31).
+		assert_eq!(Staking::slot_stake(), 31);
 
-		// let's make the stingy one elected.
+		// make the stingy one elected.
 		assert_ok!(Staking::bond(Origin::signed(3), 4, 500, RewardDestination::Controller));
 		assert_ok!(Staking::nominate(Origin::signed(4), vec![1]));
 
@@ -1688,12 +1645,15 @@ fn bond_with_no_staked_value() {
 		assert_eq!(Balances::free_balance(&2), initial_balance_2);
 		assert_eq!(Balances::free_balance(&4), initial_balance_4);
 
-		System::set_block_number(2);
-		Session::check_rotate_session(System::block_number());
+		start_era(2);
 
 		// Stingy one is selected
 		assert_eq_uvec!(Session::validators(), vec![20, 10, 2]);
-		assert_eq!(Staking::stakers(1), Exposure { own: 1, total: 501, others: vec![IndividualExposure { who: 3, value: 500}]});
+		assert_eq!(Staking::stakers(1), Exposure {
+			own: 1,
+			total: 501,
+			others: vec![IndividualExposure { who: 3, value: 500}],
+		});
 		// New slot stake.
 		assert_eq!(Staking::slot_stake(), 501);
 
@@ -1701,14 +1661,15 @@ fn bond_with_no_staked_value() {
 		assert_eq!(Balances::free_balance(&2), initial_balance_2);
 		assert_eq!(Balances::free_balance(&4), initial_balance_4);
 
-		System::set_block_number(3);
-		Session::check_rotate_session(System::block_number());
+		start_era(3);
 
-		let reward = Staking::current_session_reward();
+		// Approximation resulting from Perbill conversion
+		let approximation = 1;
+		let reward = Staking::current_session_reward() * 3;
 		// 2 will not get a reward of only 1
 		// 4 will get the rest
-		assert_eq!(Balances::free_balance(&2), initial_balance_2 + 1);
-		assert_eq!(Balances::free_balance(&4), initial_balance_4 + reward - 1);
+		assert_eq!(Balances::free_balance(&2), initial_balance_2 + 3 - approximation);
+		assert_eq!(Balances::free_balance(&4), initial_balance_4 + reward - 3 - approximation);
 	});
 }
 
@@ -1733,8 +1694,7 @@ fn bond_with_little_staked_value_bounded_by_slot_stake() {
 		assert_ok!(Staking::bond(Origin::signed(1), 2, 1, RewardDestination::Controller));
 		assert_ok!(Staking::validate(Origin::signed(2), ValidatorPrefs::default()));
 
-		System::set_block_number(1);
-		Session::check_rotate_session(System::block_number());
+		start_era(1);
 
 		// 2 is elected.
 		// and fucks up the slot stake.
@@ -1742,21 +1702,20 @@ fn bond_with_little_staked_value_bounded_by_slot_stake() {
 		assert_eq!(Staking::slot_stake(), 1);
 
 		// Old ones are rewarded.
-		assert_eq!(Balances::free_balance(&10), initial_balance_10 + 10);
+		assert_eq!(Balances::free_balance(&10), initial_balance_10 + 30);
 		// no rewards paid to 2. This was initial election.
 		assert_eq!(Balances::free_balance(&2), initial_balance_2);
 
-		System::set_block_number(2);
-		Session::check_rotate_session(System::block_number());
+		start_era(2);
 
 		assert_eq_uvec!(Session::validators(), vec![20, 10, 2]);
 		assert_eq!(Staking::slot_stake(), 1);
 
 		let reward = Staking::current_session_reward();
 		// 2 will not get the full reward, practically 1
-		assert_eq!(Balances::free_balance(&2), initial_balance_2 + reward.max(1));
+		assert_eq!(Balances::free_balance(&2), initial_balance_2 + reward.max(3));
 		// same for 10
-		assert_eq!(Balances::free_balance(&10), initial_balance_10 + 10 + reward.max(1));
+		assert_eq!(Balances::free_balance(&10), initial_balance_10 + 30 + reward.max(3));
 		check_exposure_all();
 	});
 }
@@ -1789,7 +1748,7 @@ fn phragmen_linear_worse_case_equalize() {
 		assert_ok!(Staking::set_validator_count(7));
 
 		System::set_block_number(1);
-		Session::check_rotate_session(System::block_number());
+		Session::on_initialize(System::block_number());
 
 		assert_eq_uvec!(Session::validators(), vec![10, 60, 40, 20, 50, 30, 70]);
 
@@ -1827,7 +1786,7 @@ fn phragmen_chooses_correct_number_of_validators() {
 		assert_eq!(Session::validators().len(), 1);
 
 		System::set_block_number(1);
-		Session::check_rotate_session(System::block_number());
+		Session::on_initialize(System::block_number());
 
 		assert_eq!(Session::validators().len(), 1);
 		check_exposure_all();
@@ -1846,8 +1805,7 @@ fn phragmen_score_should_be_accurate_on_large_stakes() {
 		bond_validator(6, u64::max_value()-1);
 		bond_validator(8, u64::max_value()-2);
 
-		System::set_block_number(2);
-		Session::check_rotate_session(System::block_number());
+		start_era(1);
 
 		assert_eq!(Session::validators(), vec![4, 2]);
 		check_exposure_all();
@@ -1869,8 +1827,7 @@ fn phragmen_should_not_overflow_validators() {
 		bond_nominator(6, u64::max_value()/2, vec![3, 5]);
 		bond_nominator(8, u64::max_value()/2, vec![3, 5]);
 
-		System::set_block_number(2);
-		Session::check_rotate_session(System::block_number());
+		start_era(1);
 
 		assert_eq_uvec!(Session::validators(), vec![4, 2]);
 
@@ -1896,8 +1853,7 @@ fn phragmen_should_not_overflow_nominators() {
 		bond_nominator(6, u64::max_value(), vec![3, 5]);
 		bond_nominator(8, u64::max_value(), vec![3, 5]);
 
-		System::set_block_number(2);
-		Session::check_rotate_session(System::block_number());
+		start_era(1);
 
 		assert_eq_uvec!(Session::validators(), vec![4, 2]);
 
@@ -1919,8 +1875,7 @@ fn phragmen_should_not_overflow_ultimate() {
 		bond_nominator(6, u64::max_value(), vec![3, 5]);
 		bond_nominator(8, u64::max_value(), vec![3, 5]);
 
-		System::set_block_number(2);
-		Session::check_rotate_session(System::block_number());
+		start_era(1);
 
 		assert_eq_uvec!(Session::validators(), vec![4, 2]);
 
@@ -1972,8 +1927,7 @@ fn phragmen_large_scale_test() {
 			prefix + 25]
 		);
 
-		System::set_block_number(1);
-		Session::check_rotate_session(System::block_number());
+		start_era(1);
 
 		// For manual inspection
 		println!("Validators are {:?}", Session::validators());
@@ -2022,8 +1976,7 @@ fn phragmen_large_scale_test_2() {
 
 		bond_nominator(50, nom_budget, vec![3, 5]);
 
-		System::set_block_number(1);
-		Session::check_rotate_session(System::block_number());
+		start_era(1);
 
 		// Each exposure => total == own + sum(others)
 		check_exposure_all();
@@ -2032,3 +1985,36 @@ fn phragmen_large_scale_test_2() {
 		assert_total_expo(5, nom_budget / 2 + c_budget);
 	})
 }
+
+#[test]
+fn reward_validator_slashing_validator_doesnt_overflow() {
+	with_externalities(&mut ExtBuilder::default()
+		.build(),
+	|| {
+		let stake = u32::max_value() as u64 * 2;
+		let reward_slash = u32::max_value() as u64 * 2;
+
+		// Assert multiplication overflows in balance arithmetic.
+		assert!(stake.checked_mul(reward_slash).is_none());
+
+		// Set staker
+		let _ = Balances::make_free_balance_be(&11, stake);
+		>::insert(&11, Exposure { total: stake, own: stake, others: vec![] });
+
+		// Check reward
+		Staking::reward_validator(&11, reward_slash);
+		assert_eq!(Balances::total_balance(&11), stake * 2);
+
+		// Set staker
+		let _ = Balances::make_free_balance_be(&11, stake);
+		let _ = Balances::make_free_balance_be(&2, stake);
+		>::insert(&11, Exposure { total: stake, own: 1, others: vec![
+			IndividualExposure { who: 2, value: stake - 1 }
+		]});
+
+		// Check slashing
+		Staking::slash_validator(&11, reward_slash);
+		assert_eq!(Balances::total_balance(&11), stake - 1);
+		assert_eq!(Balances::total_balance(&2), 1);
+	})
+}
diff --git a/srml/sudo/Cargo.toml b/srml/sudo/Cargo.toml
index d6271cae8b9580037a067a179dfec160a8f1f11b..29ef579516fd58d7fe52f7611a3a678753b539ed 100644
--- a/srml/sudo/Cargo.toml
+++ b/srml/sudo/Cargo.toml
@@ -8,6 +8,7 @@ edition = "2018"
 serde = { version = "1.0", optional = true }
 parity-codec = { version = "3.3", default-features = false, features = ["derive"] }
 sr-std = { path = "../../core/sr-std", default-features = false }
+sr-io = { path = "../../core/sr-io", default-features = false }
 sr-primitives = { path = "../../core/sr-primitives", default-features = false }
 srml-support = { path = "../support", default-features = false }
 srml-support-procedural = { path = "../support/procedural" }
@@ -23,6 +24,7 @@ std = [
 	"serde",
 	"parity-codec/std",
 	"sr-std/std",
+	"sr-io/std",
 	"sr-primitives/std",
 	"srml-support/std",
 	"system/std",
diff --git a/srml/sudo/src/lib.rs b/srml/sudo/src/lib.rs
index 8c5953646956cc00293033e0cb9215fafb193b02..a421bdae68a522c4a68c8abf501f52db82479d45 100644
--- a/srml/sudo/src/lib.rs
+++ b/srml/sudo/src/lib.rs
@@ -88,7 +88,10 @@
 
 use sr_std::prelude::*;
 use sr_primitives::traits::StaticLookup;
-use srml_support::{StorageValue, Parameter, Dispatchable, decl_module, decl_event, decl_storage, ensure};
+use srml_support::{
+	StorageValue, Parameter, Dispatchable, decl_module, decl_event,
+	decl_storage, ensure
+};
 use system::ensure_signed;
 
 pub trait Trait: system::Trait {
@@ -107,18 +110,37 @@ decl_module! {
 		/// Authenticates the sudo key and dispatches a function call with `Root` origin.
 		///
 		/// The dispatch origin for this call must be _Signed_.
+		///
+		/// # 
+		/// - O(1).
+		/// - Limited storage reads.
+		/// - No DB writes.
+		/// # 
 		fn sudo(origin, proposal: Box) {
 			// This is a public call, so we ensure that the origin is some signed account.
 			let sender = ensure_signed(origin)?;
 			ensure!(sender == Self::key(), "only the current sudo key can sudo");
 
-			let ok = proposal.dispatch(system::RawOrigin::Root.into()).is_ok();
-			Self::deposit_event(RawEvent::Sudid(ok));
+			let res = match proposal.dispatch(system::RawOrigin::Root.into()) {
+				Ok(_) => true,
+				Err(e) => {
+					sr_io::print(e);
+					false
+				}
+			};
+
+			Self::deposit_event(RawEvent::Sudid(res));
 		}
 
 		/// Authenticates the current sudo key and sets the given AccountId (`new`) as the new sudo key.
 		///
 		/// The dispatch origin for this call must be _Signed_.
+		///
+		/// # 
+		/// - O(1).
+		/// - Limited storage reads.
+		/// - One DB change.
+		/// # 
 		fn set_key(origin, new: ::Source) {
 			// This is a public call, so we ensure that the origin is some signed account.
 			let sender = ensure_signed(origin)?;
diff --git a/srml/support/procedural/src/lib.rs b/srml/support/procedural/src/lib.rs
index f98baa7ed56cde792762299c157e0f24662b72ed..280d2a317d14e51070cdb3c5c409c3d93cb7654d 100644
--- a/srml/support/procedural/src/lib.rs
+++ b/srml/support/procedural/src/lib.rs
@@ -47,23 +47,26 @@ use proc_macro::TokenStream;
 ///
 /// Basic storage consists of a name and a type; supported types are:
 ///
-/// * Value: `Foo: type`: Implements [StorageValue](../srml_support/storage/trait.StorageValue.html).
-/// * Map: `Foo: map hasher($hash) type => type`: Implements [StorageMap](../srml_support/storage/trait.StorageMap.html)
+/// * Value: `Foo: type`: Implements the [`StorageValue`](../srml_support/storage/trait.StorageValue.html) trait.
+/// * Map: `Foo: map hasher($hash) type => type`: Implements the
+///   [`StorageMap`](../srml_support/storage/trait.StorageMap.html) trait
 ///   with `$hash` representing a choice of hashing algorithms available in the
-///   [`Hashable` trait](../srml_support/trait.Hashable.html).
+///   [`Hashable`](../srml_support/trait.Hashable.html) trait.
 ///
 ///   `hasher($hash)` is optional and its default is `blake2_256`.
 ///
-///   /!\ Be careful with each key in the map that is inserted in the trie `$hash(module_name ++ " " ++ storage_name ++ encoding(key))`.
+///   /!\ Be careful with each key in the map that is inserted in the trie
+///   `$hash(module_name ++ " " ++ storage_name ++ encoding(key))`.
 ///   If the keys are not trusted (e.g. can be set by a user), a cryptographic `hasher` such as
 ///   `blake2_256` must be used. Otherwise, other values in storage can be compromised.
 ///
 /// * Linked map: `Foo: linked_map hasher($hash) type => type`: Same as `Map` but also implements
-///   [EnumarableStorageMap](../srml_support/storage/trait.EnumerableStorageMap.html).
+///   the [`EnumerableStorageMap`](../srml_support/storage/trait.EnumerableStorageMap.html) trait.
 ///
-/// * Double map: `Foo: double_map hasher($hash) u32, $hash2(u32) => u32`: Implements `StorageDoubleMap` with
+/// * Double map: `Foo: double_map hasher($hash) u32, $hash2(u32) => u32`: Implements the
+///   [`StorageDoubleMap`](../srml_support/storage/trait.StorageDoubleMap.html) trait with
 ///   `$hash` and `$hash2` representing choices of hashing algorithms available in the
-///   [`Hashable` trait](../srml_support/trait.Hashable.html).
+///   [`Hashable`](../srml_support/trait.Hashable.html) trait.
 ///
 ///   `hasher($hash)` is optional and its default is `blake2_256`.
 ///
diff --git a/srml/support/procedural/src/storage/impls.rs b/srml/support/procedural/src/storage/impls.rs
index 39d16edd91008aaa23b0955c413acf85698aa3e3..b481a4242053954cb66d2ee5dbf05a47d0a0c729 100644
--- a/srml/support/procedural/src/storage/impls.rs
+++ b/srml/support/procedural/src/storage/impls.rs
@@ -116,13 +116,17 @@ impl<'a, I: Iterator> Impls<'a, I> {
 				}
 
 				/// Take a value from storage, removing it afterwards.
-				fn take>(storage: &S) -> Self::Query {
+				fn take>(storage: &mut S) -> Self::Query {
 					storage.take(>::key())
 						.#option_simple_1(|| #fielddefault)
 				}
 
 				/// Mutate the value under a key.
-				fn mutate R, S: #scrate::HashedStorage<#scrate::Twox128>>(f: F, storage: &S) -> R {
+				fn mutate(f: F, storage: &mut S) -> R
+				where
+					F: FnOnce(&mut Self::Query) -> R,
+					S: #scrate::HashedStorage<#scrate::Twox128>,
+				{
 					let mut val = >::get(storage);
 
 					let ret = f(&mut val);
@@ -212,21 +216,28 @@ impl<'a, I: Iterator> Impls<'a, I> {
 				}
 
 				/// Take the value, reading and removing it.
-				fn take>(key: &#kty, storage: &S) -> Self::Query {
+				fn take>(key: &#kty, storage: &mut S) -> Self::Query {
 					let key = #as_map::key_for(key);
 					storage.take(&key[..]).#option_simple_1(|| #fielddefault)
 				}
 
 				/// Mutate the value under a key
-				fn mutate R, S: #scrate::HashedStorage<#scrate::#hasher>>(key: &#kty, f: F, storage: &S) -> R {
+				fn mutate(key: &#kty, f: F, storage: &mut S) -> R
+				where
+					F: FnOnce(&mut Self::Query) -> R,
+					S: #scrate::HashedStorage<#scrate::#hasher>,
+				{
 					let mut val = #as_map::get(key, storage);
 
 					let ret = f(&mut val);
 					#mutate_impl ;
 					ret
 				}
-
 			}
+
+			impl<#traitinstance: 'static + #traittype, #instance #bound_instantiable>
+				#scrate::storage::hashed::generator::AppendableStorageMap<#kty, #typ> for #name<#traitinstance, #instance>
+			{}
 		}
 	}
 
@@ -349,16 +360,18 @@ impl<'a, I: Iterator> Impls<'a, I> {
 					///
 					/// Takes care of updating previous and next elements points
 					/// as well as updates head if the element is first or last.
-					fn remove_linkage>(linkage: Linkage<#kty>, storage: &S);
+					fn remove_linkage>(linkage: Linkage<#kty>, storage: &mut S);
 
 					/// Read the contained data and it's linkage.
-					fn read_with_linkage>(storage: &S, key: &[u8]) -> Option<(#value_type, Linkage<#kty>)>;
+					fn read_with_linkage(storage: &S, key: &[u8]) -> Option<(#value_type, Linkage<#kty>)>
+					where
+						S: #scrate::HashedStorage<#scrate::#hasher>;
 
 					/// Generate linkage for newly inserted element.
 					///
 					/// Takes care of updating head and previous head's pointer.
 					fn new_head_linkage>(
-						storage: &S,
+						storage: &mut S,
 						key: &#kty,
 					) -> Linkage<#kty>;
 
@@ -368,7 +381,7 @@ impl<'a, I: Iterator> Impls<'a, I> {
 					/// Overwrite current head pointer.
 					///
 					/// If `None` is given head is removed from storage.
-					fn write_head>(storage: &S, head: Option<&#kty>);
+					fn write_head>(storage: &mut S, head: Option<&#kty>);
 				}
 			}
 		};
@@ -380,7 +393,7 @@ impl<'a, I: Iterator> Impls<'a, I> {
 			impl<#traitinstance: #traittype, #instance #bound_instantiable> self::#inner_module::Utils<#traitinstance, #instance> for #name<#traitinstance, #instance> {
 				fn remove_linkage>(
 					linkage: self::#inner_module::Linkage<#kty>,
-					storage: &S,
+					storage: &mut S,
 				) {
 					use self::#inner_module::Utils;
 
@@ -415,7 +428,7 @@ impl<'a, I: Iterator> Impls<'a, I> {
 				}
 
 				fn new_head_linkage>(
-					storage: &S,
+					storage: &mut S,
 					key: &#kty,
 				) -> self::#inner_module::Linkage<#kty> {
 					use self::#inner_module::Utils;
@@ -450,7 +463,7 @@ impl<'a, I: Iterator> Impls<'a, I> {
 					storage.get(#final_head_key)
 				}
 
-				fn write_head>(storage: &S, head: Option<&#kty>) {
+				fn write_head>(storage: &mut S, head: Option<&#kty>) {
 					match head {
 						Some(head) => storage.put(#final_head_key, head),
 						None => storage.kill(#final_head_key),
@@ -489,7 +502,7 @@ impl<'a, I: Iterator> Impls<'a, I> {
 				}
 
 				/// Take the value, reading and removing it.
-				fn take>(key: &#kty, storage: &S) -> Self::Query {
+				fn take>(key: &#kty, storage: &mut S) -> Self::Query {
 					use self::#inner_module::Utils;
 
 					let res: Option<(#value_type, self::#inner_module::Linkage<#kty>)> = storage.take(&*#as_map::key_for(key));
@@ -503,12 +516,12 @@ impl<'a, I: Iterator> Impls<'a, I> {
 				}
 
 				/// Remove the value under a key.
-				fn remove>(key: &#kty, storage: &S) {
+				fn remove>(key: &#kty, storage: &mut S) {
 					#as_map::take(key, storage);
 				}
 
 				/// Store a value to be associated with the given key from the map.
-				fn insert>(key: &#kty, val: &#typ, storage: &S) {
+				fn insert>(key: &#kty, val: &#typ, storage: &mut S) {
 					use self::#inner_module::Utils;
 
 					let key_for = &*#as_map::key_for(key);
@@ -522,7 +535,11 @@ impl<'a, I: Iterator> Impls<'a, I> {
 				}
 
 				/// Mutate the value under a key
-				fn mutate R, S: #scrate::HashedStorage<#scrate::#hasher>>(key: &#kty, f: F, storage: &S) -> R {
+				fn mutate(key: &#kty, f: F, storage: &mut S) -> R
+				where
+					F: FnOnce(&mut Self::Query) -> R,
+					S: #scrate::HashedStorage<#scrate::#hasher>,
+				{
 					use self::#inner_module::Utils;
 
 					let key_for = &*#as_map::key_for(key);
@@ -545,7 +562,9 @@ impl<'a, I: Iterator> Impls<'a, I> {
 					Self::read_head(storage)
 				}
 
-				fn enumerate<'a, S: #scrate::HashedStorage<#scrate::#hasher>>(storage: &'a S) -> #scrate::rstd::boxed::Box + 'a> where
+				fn enumerate<'a, S>(storage: &'a S) -> #scrate::rstd::boxed::Box + 'a>
+				where
+					S: #scrate::HashedStorage<#scrate::#hasher>,
 					#kty: 'a,
 					#typ: 'a,
 				{
@@ -561,7 +580,13 @@ impl<'a, I: Iterator> Impls<'a, I> {
 		}
 	}
 
-	pub fn double_map(self, hasher: TokenStream2, k1ty: &syn::Type, k2ty: &syn::Type, k2_hasher: TokenStream2) -> TokenStream2 {
+	pub fn double_map(
+		self,
+		hasher: TokenStream2,
+		k1ty: &syn::Type,
+		k2ty: &syn::Type,
+		k2_hasher: TokenStream2,
+	) -> TokenStream2 {
 		let Self {
 			scrate,
 			visibility,
@@ -633,8 +658,10 @@ impl<'a, I: Iterator> Impls<'a, I> {
 				}
 
 				fn key_for(k1: &#k1ty, k2: &#k2ty) -> Vec {
+					use #scrate::storage::hashed::generator::StorageHasher;
+
 					let mut key = #as_double_map::prefix_for(k1);
-					key.extend(&#scrate::Hashable::#k2_hasher(k2));
+					#scrate::codec::Encode::using_encoded(k2, |e| key.extend(&#scrate::#k2_hasher::hash(e)));
 					key
 				}
 
@@ -643,12 +670,16 @@ impl<'a, I: Iterator> Impls<'a, I> {
 					storage.get(&key).#option_simple_1(|| #fielddefault)
 				}
 
-				fn take(key1: &#k1ty, key2: &#k2ty, storage: &S) -> Self::Query {
+				fn take(key1: &#k1ty, key2: &#k2ty, storage: &mut S) -> Self::Query {
 					let key = #as_double_map::key_for(key1, key2);
 					storage.take(&key).#option_simple_1(|| #fielddefault)
 				}
 
-				fn mutate R, S: #scrate::UnhashedStorage>(key1: &#k1ty, key2: &#k2ty, f: F, storage: &S) -> R {
+				fn mutate(key1: &#k1ty, key2: &#k2ty, f: F, storage: &mut S) -> R
+				where
+					F: FnOnce(&mut Self::Query) -> R,
+					S: #scrate::UnhashedStorage,
+				{
 					let mut val = #as_double_map::get(key1, key2, storage);
 
 					let ret = f(&mut val);
diff --git a/srml/support/procedural/src/storage/mod.rs b/srml/support/procedural/src/storage/mod.rs
index ce81dd95c5a2e0f5200f6454e14a9741b1b9a509..742c47d259350649319910376ea61fd5bc6ce937 100644
--- a/srml/support/procedural/src/storage/mod.rs
+++ b/srml/support/procedural/src/storage/mod.rs
@@ -214,7 +214,13 @@ enum HasherKind {
 
 impl From<&SetHasher> for HasherKind {
 	fn from(set_hasher: &SetHasher) -> Self {
-		match set_hasher.inner.content {
+		(&set_hasher.inner.content).into()
+	}
+}
+
+impl From<&Hasher> for HasherKind {
+	fn from(hasher: &Hasher) -> Self {
+		match hasher {
 			Hasher::Blake2_256(_) => HasherKind::Blake2_256,
 			Hasher::Blake2_128(_) => HasherKind::Blake2_128,
 			Hasher::Twox256(_) => HasherKind::Twox256,
@@ -223,6 +229,7 @@ impl From<&SetHasher> for HasherKind {
 		}
 	}
 }
+
 impl HasherKind {
 	fn into_storage_hasher_struct(&self) -> TokenStream2 {
 		match self {
diff --git a/srml/support/procedural/src/storage/transformation.rs b/srml/support/procedural/src/storage/transformation.rs
index 1e0141615ff05bd8d5dbbc4d7b1f21411cc073b5..2827259420991ddd454b1d1c715599b3d854c33a 100644
--- a/srml/support/procedural/src/storage/transformation.rs
+++ b/srml/support/procedural/src/storage/transformation.rs
@@ -198,7 +198,7 @@ fn decl_store_extra_genesis(
 
 	let mut is_trait_needed = false;
 	let mut has_trait_field = false;
-	let mut serde_complete_bound = std::collections::HashSet::new();
+	let mut serde_complete_bound = Vec::new();
 	let mut config_field = TokenStream2::new();
 	let mut config_field_default = TokenStream2::new();
 	let mut builders = TokenStream2::new();
@@ -217,7 +217,7 @@ fn decl_store_extra_genesis(
 
 		let type_infos = get_type_infos(storage_type);
 
-		let mut opt_build;
+		let opt_build;
 		// need build line
 		if let Some(ref config) = config.inner {
 			let ident = if let Some(ident) = config.expr.content.as_ref() {
@@ -239,9 +239,20 @@ fn decl_store_extra_genesis(
 				has_trait_field = true;
 			}
 
-			serde_complete_bound.insert(type_infos.value_type);
-			if let DeclStorageTypeInfosKind::Map { key_type, .. } = type_infos.kind {
-				serde_complete_bound.insert(key_type);
+			let value_type = &type_infos.value_type;
+			serde_complete_bound.push(quote!( #value_type ));
+			match type_infos.kind {
+				DeclStorageTypeInfosKind::Map { key_type, .. } =>
+					serde_complete_bound.push(quote!( #key_type )),
+				DeclStorageTypeInfosKind::DoubleMap { key1_type, key2_type, .. } => {
+					serde_complete_bound.push(quote!( #key1_type ));
+					serde_complete_bound.push(quote!( #key2_type ));
+				},
+				_ => {},
+			}
+
+			if type_infos.is_option {
+				serde_complete_bound.push(type_infos.typ.clone());
 			}
 
 			// Propagate doc attributes.
@@ -284,7 +295,7 @@ fn decl_store_extra_genesis(
 						use #scrate::codec::{Encode, Decode};
 
 						let v = (#builder)(&self);
-						<#name<#traitinstance, #instance> as #scrate::storage::hashed::generator::StorageValue<#typ>>::put(&v, &storage);
+						<#name<#traitinstance, #instance> as #scrate::storage::hashed::generator::StorageValue<#typ>>::put(&v, storage);
 					}}
 				},
 				DeclStorageTypeInfosKind::Map { key_type, .. } => {
@@ -294,7 +305,7 @@ fn decl_store_extra_genesis(
 
 						let data = (#builder)(&self);
 						for (k, v) in data.into_iter() {
-							<#name<#traitinstance, #instance> as #scrate::storage::hashed::generator::StorageMap<#key_type, #typ>>::insert(&k, &v, &storage);
+							<#name<#traitinstance, #instance> as #scrate::storage::hashed::generator::StorageMap<#key_type, #typ>>::insert(&k, &v, storage);
 						}
 					}}
 				},
@@ -305,7 +316,7 @@ fn decl_store_extra_genesis(
 
 						let data = (#builder)(&self);
 						for (k1, k2, v) in data.into_iter() {
-							<#name<#traitinstance, #instance> as #scrate::storage::unhashed::generator::StorageDoubleMap<#key1_type, #key2_type, #typ>>::insert(&k1, &k2, &v, &storage);
+							<#name<#traitinstance, #instance> as #scrate::storage::unhashed::generator::StorageDoubleMap<#key1_type, #key2_type, #typ>>::insert(&k1, &k2, &v, storage);
 						}
 					}}
 				},
@@ -335,7 +346,7 @@ fn decl_store_extra_genesis(
 						has_trait_field = true;
 					}
 
-					serde_complete_bound.insert(extra_type);
+					serde_complete_bound.push(quote!( #extra_type ));
 
 					let extrafield = &extra_field.content;
 					genesis_extrafields.extend(quote!{
@@ -363,7 +374,7 @@ fn decl_store_extra_genesis(
 	let serde_bug_bound = if !serde_complete_bound.is_empty() {
 		let mut b_ser = String::new();
 		let mut b_dser = String::new();
-		// panic!("{:#?}", serde_complete_bound);
+
 		serde_complete_bound.into_iter().for_each(|bound| {
 			let stype = quote!(#bound);
 			b_ser.push_str(&format!("{} : {}::serde::Serialize, ", stype, scrate));
@@ -440,12 +451,11 @@ fn decl_store_extra_genesis(
 			#[cfg(feature = "std")]
 			impl#fparam_impl #scrate::runtime_primitives::BuildStorage for GenesisConfig#sparam {
 				fn assimilate_storage(self, r: &mut #scrate::runtime_primitives::StorageOverlay, c: &mut #scrate::runtime_primitives::ChildrenStorageOverlay) -> ::std::result::Result<(), String> {
-					use #scrate::rstd::cell::RefCell;
-					let storage = RefCell::new(r);
+					let storage = r;
 
 					#builders
 
-					let r = storage.into_inner();
+					let r = storage;
 
 					#scall(r, c, &self);
 
@@ -515,7 +525,7 @@ fn decl_storage_items(
 
 			impls.extend(quote! {
 				/// Tag a type as an instance of a module.
-				/// 
+				///
 				/// Defines storage prefixes, they must be unique.
 				pub trait #instantiable: 'static {
 					#const_impls
@@ -596,7 +606,7 @@ fn decl_storage_items(
 				i.linked_map(hasher.into_storage_hasher_struct(), key_type)
 			},
 			DeclStorageTypeInfosKind::DoubleMap { key1_type, key2_type, key2_hasher, hasher } => {
-				i.double_map(hasher.into_storage_hasher_struct(), key1_type, key2_type, key2_hasher)
+				i.double_map(hasher.into_storage_hasher_struct(), key1_type, key2_type, key2_hasher.into_storage_hasher_struct())
 			},
 		};
 		impls.extend(implementation)
@@ -748,14 +758,14 @@ fn store_functions_to_metadata (
 				let hasher = hasher.into_metadata();
 				let k1ty = clean_type_string("e!(#key1_type).to_string());
 				let k2ty = clean_type_string("e!(#key2_type).to_string());
-				let k2_hasher = clean_type_string(&key2_hasher.to_string());
+				let k2_hasher = key2_hasher.into_metadata();
 				quote!{
 					#scrate::metadata::StorageFunctionType::DoubleMap {
 						hasher: #scrate::metadata::#hasher,
 						key1: #scrate::metadata::DecodeDifferent::Encode(#k1ty),
 						key2: #scrate::metadata::DecodeDifferent::Encode(#k2ty),
 						value: #scrate::metadata::DecodeDifferent::Encode(#styp),
-						key2_hasher: #scrate::metadata::DecodeDifferent::Encode(#k2_hasher),
+						key2_hasher: #scrate::metadata::#k2_hasher,
 					}
 				}
 			},
@@ -860,7 +870,7 @@ enum DeclStorageTypeInfosKind<'a> {
 		hasher: HasherKind,
 		key1_type: &'a syn::Type,
 		key2_type: &'a syn::Type,
-		key2_hasher: TokenStream2,
+		key2_hasher: HasherKind,
 	}
 }
 
@@ -890,7 +900,7 @@ fn get_type_infos(storage_type: &DeclStorageType) -> DeclStorageTypeInfos {
 			hasher: map.hasher.inner.as_ref().map(|h| h.into()).unwrap_or(HasherKind::Blake2_256),
 			key1_type: &map.key1,
 			key2_type: &map.key2.content,
-			key2_hasher: { let h = &map.key2_hasher; quote! { #h } },
+			key2_hasher: (&map.key2_hasher).into(),
 		}),
 	};
 
diff --git a/srml/support/src/dispatch.rs b/srml/support/src/dispatch.rs
index 48db2e748eabd44011ef3d4c92aae7ab4249dcdc..37e40058252dd68c67a82af8946f1841cb8c6a69 100644
--- a/srml/support/src/dispatch.rs
+++ b/srml/support/src/dispatch.rs
@@ -22,10 +22,8 @@ pub use crate::rstd::prelude::{Vec, Clone, Eq, PartialEq};
 pub use std::fmt;
 pub use crate::rstd::result;
 pub use crate::codec::{Codec, Decode, Encode, Input, Output, HasCompact, EncodeAsRef};
-pub use srml_metadata::{
-	FunctionMetadata, DecodeDifferent, DecodeDifferentArray,
-	FunctionArgumentMetadata, OuterDispatchMetadata, OuterDispatchCall
-};
+pub use srml_metadata::{FunctionMetadata, DecodeDifferent, DecodeDifferentArray, FunctionArgumentMetadata};
+pub use sr_primitives::weights::{TransactionWeight, Weighable, Weight};
 
 /// A type that cannot be instantiated.
 pub enum Never {}
@@ -203,8 +201,7 @@ impl Parameter for T where T: Codec + Clone + Eq {}
 /// [`OffchainWorker`](../sr_primitives/traits/trait.OffchainWorker.html) trait.
 #[macro_export]
 macro_rules! decl_module {
-	// Macro transformations (to convert invocations with incomplete parameters to the canonical
-	// form)
+	// Entry point #1.
 	(
 		$(#[$attr:meta])*
 		pub struct $mod_type:ident<$trait_instance:ident: $trait_name:ident$(, I: $instantiable:path $(= $module_default_instance:path)?)?>
@@ -224,6 +221,7 @@ macro_rules! decl_module {
 			$($t)*
 		);
 	};
+	// Entry point #2.
 	(
 		$(#[$attr:meta])*
 		pub struct $mod_type:ident<$trait_instance:ident: $trait_name:ident$(, I: $instantiable:path $(= $module_default_instance:path)?)?>
@@ -244,6 +242,7 @@ macro_rules! decl_module {
 		);
 	};
 
+	// Normalization expansions. Fills the defaults.
 	(@normalize
 		$(#[$attr:meta])*
 		pub struct $mod_type:ident<$trait_instance:ident: $trait_name:ident$(, I: $instantiable:path $(= $module_default_instance:path)?)?>
@@ -405,9 +404,13 @@ macro_rules! decl_module {
 			$($rest)*
 		);
 	};
+	// This puts the function statement into the [], decreasing `$rest` and moving toward finishing the parse.
 	(@normalize
 		$(#[$attr:meta])*
-		pub struct $mod_type:ident<$trait_instance:ident: $trait_name:ident$(, $instance:ident: $instantiable:path $(= $module_default_instance:path)?)?>
+		pub struct $mod_type:ident<
+			$trait_instance:ident:
+				$trait_name:ident$(, $instance:ident: $instantiable:path $(= $module_default_instance:path)?)?
+			>
 		for enum $call_type:ident where origin: $origin_type:ty, system = $system:ident
 		{ $( $deposit_event:tt )* }
 		{ $( $on_initialize:tt )* }
@@ -415,6 +418,7 @@ macro_rules! decl_module {
 		{ $( $offchain:tt )* }
 		[ $($t:tt)* ]
 		$(#[doc = $doc_attr:tt])*
+		#[weight = $weight:expr]
 		$fn_vis:vis fn $fn_name:ident(
 			$origin:ident $(, $(#[$codec_attr:ident])* $param_name:ident : $param:ty)*
 		) $( -> $result:ty )* { $( $impl:tt )* }
@@ -422,7 +426,9 @@ macro_rules! decl_module {
 	) => {
 		$crate::decl_module!(@normalize
 			$(#[$attr])*
-			pub struct $mod_type<$trait_instance: $trait_name$(, $instance: $instantiable $(= $module_default_instance)?)?>
+			pub struct $mod_type<
+				$trait_instance: $trait_name$(, $instance: $instantiable $(= $module_default_instance)?)?
+			>
 			for enum $call_type where origin: $origin_type, system = $system
 			{ $( $deposit_event )* }
 			{ $( $on_initialize )* }
@@ -431,6 +437,7 @@ macro_rules! decl_module {
 			[
 				$($t)*
 				$(#[doc = $doc_attr])*
+				#[weight = $weight]
 				$fn_vis fn $fn_name(
 					$origin $( , $(#[$codec_attr])* $param_name : $param )*
 				) $( -> $result )* { $( $impl )* }
@@ -439,6 +446,45 @@ macro_rules! decl_module {
 			$($rest)*
 		);
 	};
+	// Add #[weight] if none is defined.
+	(@normalize
+		$(#[$attr:meta])*
+		pub struct $mod_type:ident<
+			$trait_instance:ident:
+				$trait_name:ident$(, $instance:ident: $instantiable:path $(= $module_default_instance:path)?)?
+			>
+		for enum $call_type:ident where origin: $origin_type:ty, system = $system:ident
+		{ $( $deposit_event:tt )* }
+		{ $( $on_initialize:tt )* }
+		{ $( $on_finalize:tt )* }
+		{ $( $offchain:tt )* }
+		[ $($t:tt)* ]
+		$(#[doc = $doc_attr:tt])*
+		$fn_vis:vis fn $fn_name:ident(
+			$from:ident $(, $(#[$codec_attr:ident])* $param_name:ident : $param:ty)*
+		) $( -> $result:ty )* { $( $impl:tt )* }
+		$($rest:tt)*
+	) => {
+		$crate::decl_module!(@normalize
+			$(#[$attr])*
+			pub struct $mod_type<
+				$trait_instance: $trait_name$(, $instance: $instantiable $(= $module_default_instance)?)?
+			>
+			for enum $call_type where origin: $origin_type, system = $system
+			{ $( $deposit_event )* }
+			{ $( $on_initialize )* }
+			{ $( $on_finalize )* }
+			{ $( $offchain )* }
+			[ $($t)* ]
+			$(#[doc = $doc_attr])*
+			#[weight = $crate::dispatch::TransactionWeight::default()]
+			$fn_vis fn $fn_name(
+				$from $(, $(#[$codec_attr])* $param_name : $param )*
+			) $( -> $result )* { $( $impl )* }
+			$($rest)*
+		);
+	};
+	// Ignore any ident which is not `origin` with type `T::Origin`.
 	(@normalize
 		$(#[$attr:meta])*
 		pub struct $mod_type:ident<$trait_instance:ident: $trait_name:ident$(, I: $instantiable:path $(= $module_default_instance:path)?)?>
@@ -449,6 +495,7 @@ macro_rules! decl_module {
 		{ $( $offchain:tt )* }
 		[ $($t:tt)* ]
 		$(#[doc = $doc_attr:tt])*
+		$(#[weight = $weight:expr])?
 		$fn_vis:vis fn $fn_name:ident(
 			$origin:ident : T::Origin $(, $(#[$codec_attr:ident])* $param_name:ident : $param:ty)*
 		) $( -> $result:ty )* { $( $impl:tt )* }
@@ -460,6 +507,7 @@ macro_rules! decl_module {
 			not use the `T::Origin` type.)"
 		)
 	};
+	// Ignore any ident which is `origin` but has a type, regardless of the type token itself.
 	(@normalize
 		$(#[$attr:meta])*
 		pub struct $mod_type:ident<$trait_instance:ident: $trait_name:ident$(, I: $instantiable:path $(= $module_default_instance:path)?)?>
@@ -470,6 +518,7 @@ macro_rules! decl_module {
 		{ $( $offchain:tt )* }
 		[ $($t:tt)* ]
 		$(#[doc = $doc_attr:tt])*
+		$(#[weight = $weight:expr])?
 		$fn_vis:vis fn $fn_name:ident(
 			origin : $origin:ty $(, $(#[$codec_attr:ident])* $param_name:ident : $param:ty)*
 		) $( -> $result:ty )* { $( $impl:tt )* }
@@ -481,6 +530,7 @@ macro_rules! decl_module {
 			not use the `T::Origin` type.)"
 		)
 	};
+	// Add root if no origin is defined.
 	(@normalize
 		$(#[$attr:meta])*
 		pub struct $mod_type:ident<$trait_instance:ident: $trait_name:ident$(, $instance:ident: $instantiable:path $(= $module_default_instance:path)?)?>
@@ -491,6 +541,7 @@ macro_rules! decl_module {
 		{ $( $offchain:tt )* }
 		[ $($t:tt)* ]
 		$(#[doc = $doc_attr:tt])*
+		$(#[weight = $weight:expr])?
 		$fn_vis:vis fn $fn_name:ident(
 			$( $(#[$codec_attr:ident])* $param_name:ident : $param:ty),*
 		) $( -> $result:ty )* { $( $impl:tt )* }
@@ -504,17 +555,18 @@ macro_rules! decl_module {
 			{ $( $on_initialize )* }
 			{ $( $on_finalize )* }
 			{ $( $offchain )* }
-			[
-				$($t)*
-				$(#[doc = $doc_attr])*
-				$fn_vis fn $fn_name(
-					root $( , $(#[$codec_attr])* $param_name : $param )*
-				) $( -> $result )* { $( $impl )* }
-				{ $($instance: $instantiable)? }
-			]
+			[ $($t)* ]
+
+			$(#[doc = $doc_attr])*
+			$(#[weight = $weight])?
+			$fn_vis fn $fn_name(
+				root $( , $(#[$codec_attr])* $param_name : $param )*
+			) $( -> $result )* { $( $impl )* }
+
 			$($rest)*
 		);
 	};
+	// Last normalize step. Triggers `@imp` expansion which is the real expansion.
 	(@normalize
 		$(#[$attr:meta])*
 		pub struct $mod_type:ident<$trait_instance:ident: $trait_name:ident$(, I: $instantiable:path $(= $module_default_instance:path)?)?>
@@ -689,6 +741,7 @@ macro_rules! decl_module {
 		{}
 	};
 
+	// Expansion for root dispatch functions with no specified result type.
 	(@impl_function
 		$module:ident<$trait_instance:ident: $trait_name:ident$(, $instance:ident: $instantiable:path)?>;
 		$origin_ty:ty;
@@ -697,12 +750,14 @@ macro_rules! decl_module {
 		$vis:vis fn $name:ident ( root $(, $param:ident : $param_ty:ty )* ) { $( $impl:tt )* }
 	) => {
 		$(#[doc = $doc_attr])*
+		#[allow(unreachable_code)]
 		$vis fn $name($( $param: $param_ty ),* ) -> $crate::dispatch::Result {
 			{ $( $impl )* }
 			Ok(())
 		}
 	};
 
+	// Expansion for root dispatch functions with explicit return types.
 	(@impl_function
 		$module:ident<$trait_instance:ident: $trait_name:ident$(, $instance:ident: $instantiable:path)?>;
 		$origin_ty:ty;
@@ -718,6 +773,7 @@ macro_rules! decl_module {
 		}
 	};
 
+	// Expansion for _origin_ dispatch functions with no return type.
 	(@impl_function
 		$module:ident<$trait_instance:ident: $trait_name:ident$(, $instance:ident: $instantiable:path)?>;
 		$origin_ty:ty;
@@ -736,6 +792,7 @@ macro_rules! decl_module {
 		}
 	};
 
+	// Expansion for _origin_ dispatch functions with explicit return type.
 	(@impl_function
 		$module:ident<$trait_instance:ident: $trait_name:ident$(, $instance:ident: $instantiable:path)?>;
 		$origin_ty:ty;
@@ -776,6 +833,7 @@ macro_rules! decl_module {
 				$type,
 			}
 			variant $fn_name;
+			$( #[doc = $doc_attr] )*
 			$( $rest )*
 		}
 	};
@@ -803,6 +861,7 @@ macro_rules! decl_module {
 				$type,
 			}
 			variant $fn_name;
+			$( #[doc = $doc_attr] )*
 			$( $rest )*
 		}
 	};
@@ -862,10 +921,14 @@ macro_rules! decl_module {
 
 	(@imp
 		$(#[$attr:meta])*
-		pub struct $mod_type:ident<$trait_instance:ident: $trait_name:ident$(, $instance:ident: $instantiable:path $(= $module_default_instance:path)?)?>
+		pub struct $mod_type:ident<
+			$trait_instance:ident: $trait_name:ident
+			$(, $instance:ident: $instantiable:path $(= $module_default_instance:path)?)?
+		>
 		for enum $call_type:ident where origin: $origin_type:ty, system = $system:ident {
 			$(
 				$(#[doc = $doc_attr:tt])*
+				#[weight = $weight:expr]
 				$fn_vis:vis fn $fn_name:ident(
 					$from:ident $( , $(#[$codec_attr:ident])* $param_name:ident : $param:ty)*
 				) $( -> $result:ty )* { $( $impl:tt )* }
@@ -877,10 +940,17 @@ macro_rules! decl_module {
 		{ $( $on_finalize:tt )* }
 		{ $( $offchain:tt )* }
 	) => {
+		$crate::__check_reserved_fn_name! {
+			$($fn_name)*
+		}
+
 		// Workaround for https://github.com/rust-lang/rust/issues/26925 . Remove when sorted.
 		#[derive(Clone, Copy, PartialEq, Eq)]
 		#[cfg_attr(feature = "std", derive(Debug))]
-		pub struct $mod_type<$trait_instance: $trait_name $(, $instance: $instantiable $( = $module_default_instance)?)?>($crate::rstd::marker::PhantomData<($trait_instance $(, $instance)?)>);
+		pub struct $mod_type<
+			$trait_instance: $trait_name
+			$(, $instance: $instantiable $( = $module_default_instance)?)?
+		>($crate::rstd::marker::PhantomData<($trait_instance $(, $instance)?)>);
 
 		$crate::decl_module! {
 			@impl_on_initialize
@@ -899,7 +969,6 @@ macro_rules! decl_module {
 			$mod_type<$trait_instance: $trait_name $(, $instance: $instantiable)?>;
 			$( $offchain )*
 		}
-
 		$crate::decl_module! {
 			@impl_deposit_event
 			$mod_type<$trait_instance: $trait_name $(, $instance: $instantiable)?>;
@@ -942,6 +1011,18 @@ macro_rules! decl_module {
 			)*
 		}
 
+		// Implement weight calculation function for Call
+		impl<$trait_instance: $trait_name $(, $instance: $instantiable)?> $crate::dispatch::Weighable
+			for $call_type<$trait_instance $(, $instance)?>
+		{
+			fn weight(&self, _len: usize) -> $crate::dispatch::Weight {
+				match self {
+					$( $call_type::$fn_name(..) => $crate::dispatch::Weighable::weight(&$weight, _len), )*
+					$call_type::__PhantomItem(_, _) => { unreachable!("__PhantomItem should never be used.") },
+				}
+			}
+		}
+
 		// manual implementation of clone/eq/partialeq because using derive erroneously requires
 		// clone/eq/partialeq from T.
 		impl<$trait_instance: $trait_name $(, $instance: $instantiable)?> $crate::dispatch::Clone
@@ -1063,14 +1144,19 @@ macro_rules! impl_outer_dispatch {
 				$camelcase ( $crate::dispatch::CallableCallFor<$camelcase> )
 			,)*
 		}
+		impl $crate::dispatch::Weighable for $call_type {
+			fn weight(&self, len: usize) -> $crate::dispatch::Weight {
+				match self {
+					$( $call_type::$camelcase(call) => call.weight(len), )*
+				}
+			}
+		}
 		impl $crate::dispatch::Dispatchable for $call_type {
 			type Origin = $origin;
 			type Trait = $call_type;
 			fn dispatch(self, origin: $origin) -> $crate::dispatch::Result {
 				match self {
-					$(
-						$call_type::$camelcase(call) => call.dispatch(origin),
-					)*
+					$( $call_type::$camelcase(call) => call.dispatch(origin), )*
 				}
 			}
 		}
@@ -1204,6 +1290,38 @@ macro_rules! __function_to_metadata {
 	}
 }
 
+#[macro_export]
+#[doc(hidden)]
+macro_rules! __check_reserved_fn_name {
+	(deposit_event $( $rest:ident )*) => {
+		$crate::__check_reserved_fn_name!(@compile_error deposit_event);
+	};
+	(on_initialize $( $rest:ident )*) => {
+		$crate::__check_reserved_fn_name!(@compile_error on_initialize);
+	};
+	(on_initialise $( $rest:ident )*) => {
+		$crate::__check_reserved_fn_name!(@compile_error on_initialise);
+	};
+	(on_finalize $( $rest:ident )*) => {
+		$crate::__check_reserved_fn_name!(@compile_error on_finalize);
+	};
+	(on_finalise $( $rest:ident )*) => {
+		$crate::__check_reserved_fn_name!(@compile_error on_finalise);
+	};
+	(offchain_worker $( $rest:ident )*) => {
+		$crate::__check_reserved_fn_name!(@compile_error offchain_worker);
+	};
+	($t:ident $( $rest:ident )*) => {
+		$crate::__check_reserved_fn_name!($( $rest )*);
+	};
+	() => {};
+	(@compile_error $ident:ident) => {
+		compile_error!(concat!("Invalid call fn name: `", stringify!($ident),
+		"`, name is reserved and doesn't match expected signature, please refer to `decl_module!`",
+		" documentation to see the appropriate usage, or rename it to an unreserved keyword."));
+	};
+}
+
 #[cfg(test)]
 // Do not complain about unused `dispatch` and `dispatch_aux`.
 #[allow(dead_code)]
@@ -1230,6 +1348,7 @@ mod tests {
 			fn aux_0(_origin) -> Result { unreachable!() }
 			fn aux_1(_origin, #[compact] _data: u32) -> Result { unreachable!() }
 			fn aux_2(_origin, _data: i32, _data2: String) -> Result { unreachable!() }
+			#[weight = TransactionWeight::Basic(10, 100)]
 			fn aux_3() -> Result { unreachable!() }
 			fn aux_4(_data: i32) -> Result { unreachable!() }
 			fn aux_5(_origin, _data: i32, #[compact] _data2: u32) -> Result { unreachable!() }
@@ -1237,6 +1356,9 @@ mod tests {
 			fn on_initialize(n: T::BlockNumber) { if n.into() == 42 { panic!("on_initialize") } }
 			fn on_finalize(n: T::BlockNumber) { if n.into() == 42 { panic!("on_finalize") } }
 			fn offchain_worker() {}
+
+			#[weight = TransactionWeight::Max]
+			fn weighted() { unreachable!() }
 		}
 	}
 
@@ -1301,6 +1423,11 @@ mod tests {
 					]),
 					documentation: DecodeDifferent::Encode(&[]),
 				},
+				FunctionMetadata {
+					name: DecodeDifferent::Encode("weighted"),
+					arguments: DecodeDifferent::Encode(&[]),
+					documentation: DecodeDifferent::Encode(&[]),
+				},
 			];
 
 	struct TraitImpl {}
@@ -1355,4 +1482,14 @@ mod tests {
 	fn on_finalize_should_work() {
 		 as OnFinalize>::on_finalize(42);
 	}
+
+	#[test]
+	fn weight_should_attach_to_call_enum() {
+		// max weight. not dependent on input.
+		assert_eq!(Call::::weighted().weight(100), 3 * 1024 * 1024);
+		// default weight.
+		assert_eq!(Call::::aux_0().weight(5), 5 /*tx-len*/);
+		// custom basic
+		assert_eq!(Call::::aux_3().weight(5), 10 + 100 * 5 );
+	}
 }
diff --git a/srml/support/src/double_map.rs b/srml/support/src/double_map.rs
index 80d974064dedd41bbebd506e890e58575fd6f32c..d35570ae4f7b6d34bc681ec96ba50e5384f61f19 100644
--- a/srml/support/src/double_map.rs
+++ b/srml/support/src/double_map.rs
@@ -64,7 +64,7 @@ pub trait StorageDoubleMapWithHasher {
 
 	/// Get an entry from this map.
 	///
-	/// If there is entry stored under the given keys, returns `None`.
+	/// If there is no entry stored under the given keys, returns `None`.
 	fn get(k1: &Q, k2: &R) -> Option
 	where
 		Self::Key1: Borrow,
diff --git a/srml/support/src/lib.rs b/srml/support/src/lib.rs
index be8d4fb73a51787980695e28eacedf1067c0c47f..ae825397a6ae4f0ae9f51324e9c50348b45f00de 100644
--- a/srml/support/src/lib.rs
+++ b/srml/support/src/lib.rs
@@ -57,11 +57,46 @@ pub mod unsigned;
 mod double_map;
 pub mod traits;
 
-pub use self::storage::{StorageList, StorageValue, StorageMap, EnumerableStorageMap, StorageDoubleMap};
+pub use self::storage::{
+	StorageValue, StorageMap, EnumerableStorageMap, StorageDoubleMap, AppendableStorageMap
+};
 pub use self::hashable::Hashable;
 pub use self::dispatch::{Parameter, Dispatchable, Callable, IsSubType};
 pub use self::double_map::StorageDoubleMapWithHasher;
-pub use runtime_io::print;
+pub use runtime_io::{print, storage_root};
+
+/// Macro for easily creating a new implementation of the `Get` trait. Use similarly to
+/// how you would declare a `const`:
+///
+/// ```no_compile
+/// parameter_types! {
+///   pub const Argument: u64 = 42;
+/// }
+/// trait Config {
+///   type Parameter: Get;
+/// }
+/// struct Runtime;
+/// impl Config for Runtime {
+///   type Parameter = Argument;
+/// }
+/// ```
+#[macro_export]
+macro_rules! parameter_types {
+	(pub const $name:ident: $type:ty = $value:expr; $( $rest:tt )*) => (
+		pub struct $name;
+		$crate::parameter_types!{IMPL $name , $type , $value}
+		$crate::parameter_types!{ $( $rest )* }
+	);
+	(const $name:ident: $type:ty = $value:expr; $( $rest:tt )*) => (
+		struct $name;
+		$crate::parameter_types!{IMPL $name , $type , $value}
+		$crate::parameter_types!{ $( $rest )* }
+	);
+	() => ();
+	(IMPL $name:ident , $type:ty , $value:expr) => {
+		impl $crate::traits::Get<$type> for $name { fn get() -> $type { $value } }
+	}
+}
 
 #[doc(inline)]
 pub use srml_support_procedural::decl_storage;
@@ -96,9 +131,9 @@ macro_rules! ensure {
 #[cfg(feature = "std")]
 macro_rules! assert_noop {
 	( $x:expr , $y:expr ) => {
-		let h = runtime_io::storage_root();
+		let h = $crate::storage_root();
 		$crate::assert_err!($x, $y);
-		assert_eq!(h, runtime_io::storage_root());
+		assert_eq!(h, $crate::storage_root());
 	}
 }
 
@@ -235,9 +270,11 @@ mod tests {
 			pub GenericData get(generic_data): linked_map hasher(twox_128) T::BlockNumber => T::BlockNumber;
 			pub GenericData2 get(generic_data2): linked_map T::BlockNumber => Option;
 
-			pub DataDM config(test_config) build(|_| vec![(15u32, 16u32, 42u64)]): double_map hasher(twox_64_concat) u32, blake2_256(u32) => u64;
+			pub DataDM config(test_config) build(|_| vec![(15u32, 16u32, 42u64)]):
+				double_map hasher(twox_64_concat) u32, blake2_256(u32) => u64;
 			pub GenericDataDM: double_map T::BlockNumber, twox_128(T::BlockNumber) => T::BlockNumber;
 			pub GenericData2DM: double_map T::BlockNumber, twox_256(T::BlockNumber) => Option;
+			pub AppendableDM: double_map u32, blake2_256(T::BlockNumber) => Vec;
 		}
 	}
 
@@ -367,6 +404,21 @@ mod tests {
 			assert_eq!(DoubleMap::get(key1, key2+1), 0u64);
 			assert_eq!(DoubleMap::get(key1+1, key2), 4u64);
 			assert_eq!(DoubleMap::get(key1+1, key2+1), 4u64);
+
+		});
+	}
+
+	#[test]
+	fn double_map_append_should_work() {
+		with_externalities(&mut new_test_ext(), || {
+			type DoubleMap = AppendableDM;
+
+			let key1 = 17u32;
+			let key2 = 18u32;
+
+			DoubleMap::insert(key1, key2, vec![1]);
+			DoubleMap::append(key1, key2, &[2, 3]).unwrap();
+			assert_eq!(DoubleMap::get(key1, key2), vec![1, 2, 3]);
 		});
 	}
 
@@ -389,7 +441,9 @@ mod tests {
 				modifier: StorageFunctionModifier::Default,
 				ty: StorageFunctionType::Map{
 					hasher: StorageHasher::Twox128,
-					key: DecodeDifferent::Encode("T::BlockNumber"), value: DecodeDifferent::Encode("T::BlockNumber"), is_linked: true
+					key: DecodeDifferent::Encode("T::BlockNumber"),
+					value: DecodeDifferent::Encode("T::BlockNumber"),
+					is_linked: true
 				},
 				default: DecodeDifferent::Encode(
 					DefaultByteGetter(&__GetByteStructGenericData(PhantomData::))
@@ -401,7 +455,9 @@ mod tests {
 				modifier: StorageFunctionModifier::Optional,
 				ty: StorageFunctionType::Map{
 					hasher: StorageHasher::Blake2_256,
-					key: DecodeDifferent::Encode("T::BlockNumber"), value: DecodeDifferent::Encode("T::BlockNumber"), is_linked: true
+					key: DecodeDifferent::Encode("T::BlockNumber"),
+					value: DecodeDifferent::Encode("T::BlockNumber"),
+					is_linked: true
 				},
 				default: DecodeDifferent::Encode(
 					DefaultByteGetter(&__GetByteStructGenericData2(PhantomData::))
@@ -416,7 +472,7 @@ mod tests {
 					key1: DecodeDifferent::Encode("u32"),
 					key2: DecodeDifferent::Encode("u32"),
 					value: DecodeDifferent::Encode("u64"),
-					key2_hasher: DecodeDifferent::Encode("blake2_256"),
+					key2_hasher: StorageHasher::Blake2_256,
 				},
 				default: DecodeDifferent::Encode(
 					DefaultByteGetter(&__GetByteStructDataDM(PhantomData::))
@@ -431,7 +487,7 @@ mod tests {
 					key1: DecodeDifferent::Encode("T::BlockNumber"),
 					key2: DecodeDifferent::Encode("T::BlockNumber"),
 					value: DecodeDifferent::Encode("T::BlockNumber"),
-					key2_hasher: DecodeDifferent::Encode("twox_128"),
+					key2_hasher: StorageHasher::Twox128,
 				},
 				default: DecodeDifferent::Encode(
 					DefaultByteGetter(&__GetByteStructGenericDataDM(PhantomData::))
@@ -446,7 +502,22 @@ mod tests {
 					key1: DecodeDifferent::Encode("T::BlockNumber"),
 					key2: DecodeDifferent::Encode("T::BlockNumber"),
 					value: DecodeDifferent::Encode("T::BlockNumber"),
-					key2_hasher: DecodeDifferent::Encode("twox_256"),
+					key2_hasher: StorageHasher::Twox256,
+				},
+				default: DecodeDifferent::Encode(
+					DefaultByteGetter(&__GetByteStructGenericData2DM(PhantomData::))
+				),
+				documentation: DecodeDifferent::Encode(&[]),
+			},
+			StorageFunctionMetadata {
+				name: DecodeDifferent::Encode("AppendableDM"),
+				modifier: StorageFunctionModifier::Default,
+				ty: StorageFunctionType::DoubleMap{
+					hasher: StorageHasher::Blake2_256,
+					key1: DecodeDifferent::Encode("u32"),
+					key2: DecodeDifferent::Encode("T::BlockNumber"),
+					value: DecodeDifferent::Encode("Vec"),
+					key2_hasher: StorageHasher::Blake2_256,
 				},
 				default: DecodeDifferent::Encode(
 					DefaultByteGetter(&__GetByteStructGenericData2DM(PhantomData::))
diff --git a/srml/support/src/metadata.rs b/srml/support/src/metadata.rs
index b1da7587be390d18789d0eb1a853a450d5e20790..9a6b671f7792e640067bef8f3706d71b15782e1a 100644
--- a/srml/support/src/metadata.rs
+++ b/srml/support/src/metadata.rs
@@ -16,7 +16,7 @@
 
 pub use srml_metadata::{
 	DecodeDifferent, FnEncode, RuntimeMetadata,
-	ModuleMetadata, RuntimeMetadataV4,
+	ModuleMetadata, RuntimeMetadataV5,
 	DefaultByteGetter, RuntimeMetadataPrefixed,
 	StorageMetadata, StorageFunctionMetadata,
 	StorageFunctionType, StorageFunctionModifier,
@@ -40,8 +40,8 @@ macro_rules! impl_runtime_metadata {
 	) => {
 		impl $runtime {
 			pub fn metadata() -> $crate::metadata::RuntimeMetadataPrefixed {
-				$crate::metadata::RuntimeMetadata::V4 (
-					$crate::metadata::RuntimeMetadataV4 {
+				$crate::metadata::RuntimeMetadata::V5 (
+					$crate::metadata::RuntimeMetadataV5 {
 						modules: $crate::__runtime_modules_to_metadata!($runtime;; $( $rest )*),
 					}
 				).into()
@@ -82,16 +82,6 @@ macro_rules! __runtime_modules_to_metadata {
 #[macro_export]
 #[doc(hidden)]
 macro_rules! __runtime_modules_to_metadata_calls_call {
-	// skip system
-	(
-		system,
-		$skip_module: ident $( <$instance:ident> )?,
-		$skip_runtime: ident,
-		with Call
-		$(with $kws:ident)*
-	) => {
-		None
-	};
 	(
 		$mod: ident,
 		$module: ident $( <$instance:ident> )?,
@@ -246,7 +236,8 @@ mod tests {
 
 	mod system {
 		pub trait Trait {
-			type Origin: Into>> + From>;
+			type Origin: Into, Self::Origin>>
+				+ From>;
 			type AccountId;
 			type BlockNumber;
 		}
@@ -381,8 +372,8 @@ mod tests {
 			event_module2::Module with Event Storage Call,
 	);
 
-	const EXPECTED_METADATA: RuntimeMetadata = RuntimeMetadata::V4(
-		RuntimeMetadataV4 {
+	const EXPECTED_METADATA: RuntimeMetadata = RuntimeMetadata::V5(
+		RuntimeMetadataV5 {
 		modules: DecodeDifferent::Encode(&[
 			ModuleMetadata {
 				name: DecodeDifferent::Encode("system"),
diff --git a/srml/support/src/origin.rs b/srml/support/src/origin.rs
index 48d4be80c6f984b068c0e882bb6ace3b1be27397..9bc2cab8b9d178630144cfee9d44c3485fef0f1e 100644
--- a/srml/support/src/origin.rs
+++ b/srml/support/src/origin.rs
@@ -112,12 +112,12 @@ macro_rules! impl_outer_origin {
 				$name::system(x)
 			}
 		}
-		impl Into>> for $name {
-			fn into(self) -> Option<$system::Origin<$runtime>> {
+		impl Into<$crate::rstd::result::Result<$system::Origin<$runtime>, $name>> for $name {
+			fn into(self) -> $crate::rstd::result::Result<$system::Origin<$runtime>, Self> {
 				if let $name::system(l) = self {
-					Some(l)
+					Ok(l)
 				} else {
-					None
+					Err(self)
 				}
 			}
 		}
@@ -132,12 +132,18 @@ macro_rules! impl_outer_origin {
 					$name::$module(x)
 				}
 			}
-			impl Into )*>> for $name {
-				fn into(self) -> Option<$module::Origin $( <$generic_param $(, $generic_instance )? > )*> {
+			impl Into<$crate::rstd::result::Result<
+				$module::Origin $( <$generic_param $(, $generic_instance )? > )*,
+				$name
+			>> for $name {
+				fn into(self) -> $crate::rstd::result::Result<
+					$module::Origin $( <$generic_param $(, $generic_instance )? > )*,
+					Self
+				> {
 					if let $name::$module(l) = self {
-						Some(l)
+						Ok(l)
 					} else {
-						None
+						Err(self)
 					}
 				}
 			}
diff --git a/srml/support/src/runtime.rs b/srml/support/src/runtime.rs
index a045c928068a2ccc932bc0ee8a72822ceb3ecd6d..6bccac0d4eff01def9000d1a23c809c84349aa9a 100644
--- a/srml/support/src/runtime.rs
+++ b/srml/support/src/runtime.rs
@@ -17,25 +17,26 @@
 //! Macros to define a runtime. A runtime is basically all your logic running in Substrate,
 //! consisting of selected SRML modules and maybe some of your own modules.
 //! A lot of supporting logic is automatically generated for a runtime,
-//! mostly for to combine data types and metadata of the included modules.
+//! mostly to combine data types and metadata of the included modules.
 
 /// Construct a runtime, with the given name and the given modules.
 ///
-/// The parameters here are specific types for Block, NodeBlock and InherentData
-/// (TODO: describe the difference between Block and NodeBlock)
-///	and the modules that are used by the runtime.
+/// The parameters here are specific types for `Block`, `NodeBlock`, and `InherentData`
+/// and the modules that are used by the runtime.
+/// `Block` is the block type that is used in the runtime and `NodeBlock` is the block type
+/// that is used in the node. For instance they can differ in the extrinsics type.
 ///
 /// # Example:
 ///
 /// ```nocompile
 /// construct_runtime!(
-///     pub enum Runtime with Log(interalIdent: DigestItem) where
+///     pub enum Runtime where
 ///         Block = Block,
 ///         NodeBlock = runtime::Block,
 ///         UncheckedExtrinsic = UncheckedExtrinsic
 ///     {
 ///         System: system,
-///         Test: test::{default, Log(Test)},
+///         Test: test::{default},
 ///         Test2: test_with_long_module::{Module},
 ///
 ///         // Module with instances
@@ -49,20 +50,20 @@
 /// The identifier `System` is the name of the module and the lower case identifier `system` is the
 /// name of the Rust module/crate for this Substrate module.
 ///
-/// The module `Test: test::{default, Log(Test)}` will expand to
-/// `Test: test::{Module, Call, Storage, Event, Config, Log(Test)}`.
+/// The module `Test: test::{default}` will expand to
+/// `Test: test::{Module, Call, Storage, Event, Config}`.
 ///
 /// The module `Test2: test_with_long_module::{Module}` will expand to
 /// `Test2: test_with_long_module::{Module}`.
 ///
 /// We provide support for the following types in a module:
+///
 /// - `Module`
 /// - `Call`
 /// - `Storage`
 /// - `Event` or `Event` (if the event is generic) or `Event` (if also over instance)
 /// - `Origin` or `Origin` (if the origin is generic) or `Origin` (if also over instance)
 /// - `Config` or `Config` (if the config is generic) or `Config` (if also over instance)
-/// - `Log( $(IDENT),* )`
 /// - `Inherent $( (CALL) )*` - If the module provides/can check inherents. The optional parameter
 ///                             is for modules that use a `Call` from a different module as
 ///                             inherent.
@@ -71,7 +72,8 @@
 /// # Note
 ///
 /// The population of the genesis storage depends on the order of modules. So, if one of your
-/// modules depends on another module. The dependent module need to come before the module depending on it.
+/// modules depends on another module, the module that is depended upon needs to come before
+/// the module depending on it.
 #[macro_export]
 macro_rules! construct_runtime {
 
@@ -79,7 +81,7 @@ macro_rules! construct_runtime {
 	// form)
 
 	(
-		pub enum $runtime:ident with Log ($log_internal:ident: DigestItem<$( $log_genarg:ty ),+>)
+		pub enum $runtime:ident
 			where
 				Block = $block:ident,
 				NodeBlock = $node_block:ty,
@@ -94,7 +96,6 @@ macro_rules! construct_runtime {
 				$block;
 				$node_block;
 				$uncheckedextrinsic;
-				$log_internal < $( $log_genarg ),* >;
 			};
 			{};
 			$( $rest )*
@@ -108,7 +109,8 @@ macro_rules! construct_runtime {
 	) => {
 		$crate::construct_runtime!(
 			{ $( $preset )* };
-			{ $( $expanded )* $name: $module::{Module, Call, Storage, Event, Config}, };
+			{ $( $expanded )* };
+			$name: $module::{default},
 			$( $rest )*
 		);
 	};
@@ -116,27 +118,25 @@ macro_rules! construct_runtime {
 		{ $( $preset:tt )* };
 		{ $( $expanded:tt )* };
 		$name:ident: $module:ident::{
-			default,
-			$(
+			default
+			$(,
 				$modules:ident
 					$( <$modules_generic:ident $(, $modules_instance:ident)?> )*
 					$( ( $( $modules_args:ident ),* ) )*
-			),*
+			)*
 		},
 		$( $rest:tt )*
 	) => {
 		$crate::construct_runtime!(
 			{ $( $preset )* };
-			{
-				$( $expanded )*
-				$name: $module::{
-					Module, Call, Storage, Event, Config,
-					$(
-						$modules $( <$modules_generic $(, $modules_instance)?> )*
-						$( ( $( $modules_args ),* ) )*
-					),*
-				},
-			};
+			{ $( $expanded )* };
+			$name: $module::{
+				Module, Call, Storage, Event, Config
+				$(,
+					$modules $( <$modules_generic $(, $modules_instance)?> )*
+					$( ( $( $modules_args ),* ) )*
+				)*
+			},
 			$( $rest )*
 		);
 	};
@@ -201,7 +201,6 @@ macro_rules! construct_runtime {
 			$block:ident;
 			$node_block:ty;
 			$uncheckedextrinsic:ident;
-			$log_internal:ident <$( $log_genarg:ty ),+>;
 		};
 		{
 			$(
@@ -261,14 +260,6 @@ macro_rules! construct_runtime {
 				$name: $module:: $( < $module_instance >:: )? { $( $modules )* }
 			)*
 		);
-		$crate::__decl_outer_log!(
-			$runtime;
-			$log_internal < $( $log_genarg ),* >;
-			{};
-			$(
-				$name: $module:: $( < $module_instance >:: )? { $( $modules $( ( $( $modules_args )* ) )* )* }
-			)*
-		);
 		$crate::__decl_outer_config!(
 			$runtime;
 			{};
@@ -284,7 +275,7 @@ macro_rules! construct_runtime {
 			$uncheckedextrinsic;
 			;
 			$(
-				$name: $module::{ $( $modules $( ( $( $modules_args ),* ) )* ),* }
+				$name: $module::{ $( $modules $( ( $( $modules_args )* ) )* ),* }
 			),*;
 		);
 		$crate::__impl_outer_validate_unsigned!(
@@ -536,26 +527,6 @@ macro_rules! __decl_all_modules {
 #[macro_export]
 #[doc(hidden)]
 macro_rules! __decl_outer_dispatch {
-	(
-		$runtime:ident;
-		$( $parsed_modules:ident :: $parsed_name:ident ),*;
-		System: $module:ident::{
-			$ignore:ident $( <$ignor:ident> )* $(, $modules:ident $( <$modules_generic:ident> )* )*
-		}
-		$(, $rest_name:ident : $rest_module:ident::{
-			$( $rest_modules:ident $( <$rest_modules_generic:ident> )* ),*
-		})*;
-	) => {
-		$crate::__decl_outer_dispatch!(
-			$runtime;
-			$( $parsed_modules :: $parsed_name ),*;
-			$(
-				$rest_name: $rest_module::{
-					$( $rest_modules $( <$rest_modules_generic> )* ),*
-				}
-			),*;
-		);
-	};
 	(
 		$runtime:ident;
 		$( $parsed_modules:ident :: $parsed_name:ident ),*;
@@ -695,75 +666,6 @@ macro_rules! __decl_runtime_metadata {
 				$( $parsed_modules::Module $( < $module_instance > )? with $( $withs )* , )*
 		);
 	}
-
-}
-/// A private macro that generates Log enum for the runtime. See impl_outer_log macro.
-#[macro_export]
-#[doc(hidden)]
-macro_rules! __decl_outer_log {
-	(
-		$runtime:ident;
-		$log_internal:ident <$( $log_genarg:ty ),+>;
-		{ $( $parsed:tt )* };
-		$name:ident: $module:ident:: $(<$module_instance:ident>::)? {
-			Log ( $( $args:ident )* ) $( $modules:ident $( ( $( $modules_args:ident )* ) )* )*
-		}
-		$( $rest:tt )*
-	) => {
-		$crate::__decl_outer_log!(
-			$runtime;
-			$log_internal < $( $log_genarg ),* >;
-			{ $( $parsed )* $module $(<$module_instance>)? ( $( $args )* )};
-			$( $rest )*
-		);
-	};
-	(
-		$runtime:ident;
-		$log_internal:ident <$( $log_genarg:ty ),+>;
-		{ $( $parsed:tt )* };
-		$name:ident: $module:ident:: $(<$module_instance:ident>::)? {
-			$ignore:ident $( ( $( $args_ignore:ident )* ) )*
-			$( $modules:ident $( ( $( $modules_args:ident )* ) )* )*
-		}
-		$( $rest:tt )*
-	) => {
-		$crate::__decl_outer_log!(
-			$runtime;
-			$log_internal < $( $log_genarg ),* >;
-			{ $( $parsed )* };
-			$name: $module:: $(<$module_instance>::)? { $( $modules $( ( $( $modules_args )* ) )* )* }
-			$( $rest )*
-		);
-	};
-	(
-		$runtime:ident;
-		$log_internal:ident <$( $log_genarg:ty ),+>;
-		{ $( $parsed:tt )* };
-		$name:ident: $module:ident:: $(<$module_instance:ident>::)? {}
-		$( $rest:tt )*
-	) => {
-		$crate::__decl_outer_log!(
-			$runtime;
-			$log_internal < $( $log_genarg ),* >;
-			{ $( $parsed )* };
-			$( $rest )*
-		);
-	};
-	(
-		$runtime:ident;
-		$log_internal:ident <$( $log_genarg:ty ),+>;
-		{ $(
-			$parsed_modules:ident $(< $parsed_instance:ident >)? ( $( $parsed_args:ident )* )
-		)* };
-	) => {
-		$crate::paste::item! {
-			$crate::runtime_primitives::impl_outer_log!(
-				pub enum Log($log_internal: DigestItem<$( $log_genarg ),*>) for $runtime {
-					$( [< $parsed_modules $(_ $parsed_instance)? >] $(< $parsed_modules::$parsed_instance >)? ( $( $parsed_args ),* ) ),*
-				}
-			);
-		}
-	};
 }
 
 /// A private macro that generates GenesisConfig for the runtime. See impl_outer_config macro.
diff --git a/srml/support/src/storage/child.rs b/srml/support/src/storage/child.rs
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/srml/support/src/storage/hashed/generator.rs b/srml/support/src/storage/hashed/generator.rs
index 12600a9eafa6a9239f9aeb8d2d508c1dbadc7998..5a8b2f9d8f54b0fe4f51edb715aafa8614bf589a 100644
--- a/srml/support/src/storage/hashed/generator.rs
+++ b/srml/support/src/storage/hashed/generator.rs
@@ -103,25 +103,25 @@ pub trait HashedStorage {
 	}
 
 	/// Put a value in under a key.
-	fn put(&self, key: &[u8], val: &T);
+	fn put(&mut self, key: &[u8], val: &T);
 
 	/// Remove the bytes of a key from storage.
-	fn kill(&self, key: &[u8]);
+	fn kill(&mut self, key: &[u8]);
 
 	/// Take a value from storage, deleting it after reading.
-	fn take(&self, key: &[u8]) -> Option {
+	fn take(&mut self, key: &[u8]) -> Option {
 		let value = self.get(key);
 		self.kill(key);
 		value
 	}
 
 	/// Take a value from storage, deleting it after reading.
-	fn take_or_panic(&self, key: &[u8]) -> T {
+	fn take_or_panic(&mut self, key: &[u8]) -> T {
 		self.take(key).expect("Required values must be in storage")
 	}
 
 	/// Take a value from storage, deleting it after reading.
-	fn take_or_default(&self, key: &[u8]) -> T {
+	fn take_or_default(&mut self, key: &[u8]) -> T {
 		self.take(key).unwrap_or_default()
 	}
 
@@ -129,12 +129,12 @@ pub trait HashedStorage {
 	fn get_raw(&self, key: &[u8]) -> Option>;
 
 	/// Put a raw byte slice into storage.
-	fn put_raw(&self, key: &[u8], value: &[u8]);
+	fn put_raw(&mut self, key: &[u8], value: &[u8]);
 }
 
 // We use a construct like this during when genesis storage is being built.
 #[cfg(feature = "std")]
-impl HashedStorage for std::cell::RefCell<&mut sr_primitives::StorageOverlay> {
+impl HashedStorage for sr_primitives::StorageOverlay {
 	fn exists(&self, key: &[u8]) -> bool {
 		UnhashedStorage::exists(self, &H::hash(key).as_ref())
 	}
@@ -143,11 +143,11 @@ impl HashedStorage for std::cell::RefCell<&mut sr_primitive
 		UnhashedStorage::get(self, &H::hash(key).as_ref())
 	}
 
-	fn put(&self, key: &[u8], val: &T) {
+	fn put(&mut self, key: &[u8], val: &T) {
 		UnhashedStorage::put(self, &H::hash(key).as_ref(), val)
 	}
 
-	fn kill(&self, key: &[u8]) {
+	fn kill(&mut self, key: &[u8]) {
 		UnhashedStorage::kill(self, &H::hash(key).as_ref())
 	}
 
@@ -155,7 +155,7 @@ impl HashedStorage for std::cell::RefCell<&mut sr_primitive
 		UnhashedStorage::get_raw(self, &H::hash(key).as_ref())
 	}
 
-	fn put_raw(&self, key: &[u8], value: &[u8]) {
+	fn put_raw(&mut self, key: &[u8], value: &[u8]) {
 		UnhashedStorage::put_raw(self, &H::hash(key).as_ref(), value)
 	}
 }
@@ -177,18 +177,18 @@ pub trait StorageValue {
 	fn get>(storage: &S) -> Self::Query;
 
 	/// Take a value from storage, removing it afterwards.
-	fn take>(storage: &S) -> Self::Query;
+	fn take>(storage: &mut S) -> Self::Query;
 
 	/// Store a value under this key into the provided storage instance.
-	fn put>(val: &T, storage: &S) {
+	fn put>(val: &T, storage: &mut S) {
 		storage.put(Self::key(), val)
 	}
 
 	/// Mutate this value
-	fn mutate R, S: HashedStorage>(f: F, storage: &S) -> R;
+	fn mutate R, S: HashedStorage>(f: F, storage: &mut S) -> R;
 
 	/// Clear the storage value.
-	fn kill>(storage: &S) {
+	fn kill>(storage: &mut S) {
 		storage.kill(Self::key())
 	}
 
@@ -196,7 +196,7 @@ pub trait StorageValue {
 	///
 	/// `T` is required to implement `codec::EncodeAppend`.
 	fn append, I: codec::Encode>(
-		items: &[I], storage: &S
+		items: &[I], storage: &mut S
 	) -> Result<(), &'static str> where T: codec::EncodeAppend {
 		let new_val = ::append(
 			storage.get_raw(Self::key()).unwrap_or_default(),
@@ -207,36 +207,6 @@ pub trait StorageValue {
 	}
 }
 
-/// A strongly-typed list in storage.
-pub trait StorageList {
-	/// Get the prefix key in storage.
-	fn prefix() -> &'static [u8];
-
-	/// Get the key used to put the length field.
-	fn len_key() -> Vec;
-
-	/// Get the storage key used to fetch a value at a given index.
-	fn key_for(index: u32) -> Vec;
-
-	/// Read out all the items.
-	fn items>(storage: &S) -> Vec;
-
-	/// Set the current set of items.
-	fn set_items>(items: &[T], storage: &S);
-
-	/// Set the item at the given index.
-	fn set_item>(index: u32, item: &T, storage: &S);
-
-	/// Load the value at given index. Returns `None` if the index is out-of-bounds.
-	fn get>(index: u32, storage: &S) -> Option;
-
-	/// Load the length of the list
-	fn len>(storage: &S) -> u32;
-
-	/// Clear the list.
-	fn clear>(storage: &S);
-}
-
 /// A strongly-typed map in storage.
 pub trait StorageMap {
 	/// The type that get/take returns.
@@ -259,20 +229,20 @@ pub trait StorageMap {
 	fn get>(key: &K, storage: &S) -> Self::Query;
 
 	/// Take the value under a key.
-	fn take>(key: &K, storage: &S) -> Self::Query;
+	fn take>(key: &K, storage: &mut S) -> Self::Query;
 
 	/// Store a value to be associated with the given key from the map.
-	fn insert>(key: &K, val: &V, storage: &S) {
+	fn insert>(key: &K, val: &V, storage: &mut S) {
 		storage.put(&Self::key_for(key)[..], val);
 	}
 
 	/// Remove the value under a key.
-	fn remove>(key: &K, storage: &S) {
+	fn remove>(key: &K, storage: &mut S) {
 		storage.kill(&Self::key_for(key)[..]);
 	}
 
 	/// Mutate the value under a key.
-	fn mutate R, S: HashedStorage>(key: &K, f: F, storage: &S) -> R;
+	fn mutate R, S: HashedStorage>(key: &K, f: F, storage: &mut S) -> R;
 }
 
 /// A `StorageMap` with enumerable entries.
@@ -281,5 +251,25 @@ pub trait EnumerableStorageMap: StorageMap>(storage: &S) -> Option;
 
 	/// Enumerate all elements in the map.
-	fn enumerate<'a, S: HashedStorage>(storage: &'a S) -> Box + 'a> where K: 'a, V: 'a;
+	fn enumerate<'a, S: HashedStorage>(
+		storage: &'a S
+	) -> Box + 'a> where K: 'a, V: 'a;
+}
+
+/// A `StorageMap` with appendable entries.
+pub trait AppendableStorageMap: StorageMap {
+	/// Append the given items to the value in the storage.
+	///
+	/// `T` is required to implement `codec::EncodeAppend`.
+	fn append, I: codec::Encode>(
+		key : &K, items: &[I], storage: &mut S
+	) -> Result<(), &'static str> where V: codec::EncodeAppend {
+		let k = Self::key_for(key);
+		let new_val = ::append(
+			storage.get_raw(&k[..]).unwrap_or_default(),
+			items,
+		).ok_or_else(|| "Could not append given item")?;
+		storage.put_raw(&k[..], &new_val);
+		Ok(())
+	}
 }
diff --git a/srml/support/src/storage/hashed/mod.rs b/srml/support/src/storage/hashed/mod.rs
index 5c65cf0513b26e8cbfc3a8ea1d4bce110d444c2c..5ca718df8c012e1bc5942b97ee1a6ec988a397d4 100644
--- a/srml/support/src/storage/hashed/mod.rs
+++ b/srml/support/src/storage/hashed/mod.rs
@@ -24,73 +24,136 @@ use runtime_io::{self, twox_128};
 use crate::codec::{Codec, Encode, Decode, KeyedVec};
 
 /// Return the value of the item in storage under `key`, or `None` if there is no explicit entry.
-pub fn get R, R: AsRef<[u8]>>(hash: &HashFn, key: &[u8]) -> Option {
+pub fn get(hash: &HashFn, key: &[u8]) -> Option
+where
+	T: Decode + Sized,
+	HashFn: Fn(&[u8]) -> R,
+	R: AsRef<[u8]>,
+{
 	unhashed::get(&hash(key).as_ref())
 }
 
 /// Return the value of the item in storage under `key`, or the type's default if there is no
 /// explicit entry.
-pub fn get_or_default R, R: AsRef<[u8]>>(hash: &HashFn, key: &[u8]) -> T {
+pub fn get_or_default(hash: &HashFn, key: &[u8]) -> T
+where
+	T: Decode + Sized + Default,
+	HashFn: Fn(&[u8]) -> R,
+	R: AsRef<[u8]>,
+{
 	unhashed::get_or_default(&hash(key).as_ref())
 }
 
 /// Return the value of the item in storage under `key`, or `default_value` if there is no
 /// explicit entry.
-pub fn get_or R, R: AsRef<[u8]>>(hash: &HashFn, key: &[u8], default_value: T) -> T {
+pub fn get_or(hash: &HashFn, key: &[u8], default_value: T) -> T
+where
+	T: Decode + Sized,
+	HashFn: Fn(&[u8]) -> R,
+	R: AsRef<[u8]>,
+{
 	unhashed::get_or(&hash(key).as_ref(), default_value)
 }
 
 /// Return the value of the item in storage under `key`, or `default_value()` if there is no
 /// explicit entry.
-pub fn get_or_else T, HashFn: Fn(&[u8]) -> R, R: AsRef<[u8]>>(hash: &HashFn, key: &[u8], default_value: F) -> T {
+pub fn get_or_else(hash: &HashFn, key: &[u8], default_value: F) -> T
+where
+	T: Decode + Sized,
+	F: FnOnce() -> T,
+	HashFn: Fn(&[u8]) -> R,
+	R: AsRef<[u8]>,
+{
 	unhashed::get_or_else(&hash(key).as_ref(), default_value)
 }
 
 /// Put `value` in storage under `key`.
-pub fn put R, R: AsRef<[u8]>>(hash: &HashFn, key: &[u8], value: &T) {
+pub fn put(hash: &HashFn, key: &[u8], value: &T)
+where
+	T: Encode,
+	HashFn: Fn(&[u8]) -> R,
+	R: AsRef<[u8]>,
+{
 	unhashed::put(&hash(key).as_ref(), value)
 }
 
 /// Remove `key` from storage, returning its value if it had an explicit entry or `None` otherwise.
-pub fn take R, R: AsRef<[u8]>>(hash: &HashFn, key: &[u8]) -> Option {
+pub fn take(hash: &HashFn, key: &[u8]) -> Option
+where
+	T: Decode + Sized,
+	HashFn: Fn(&[u8]) -> R,
+	R: AsRef<[u8]>,
+{
 	unhashed::take(&hash(key).as_ref())
 }
 
 /// Remove `key` from storage, returning its value, or, if there was no explicit entry in storage,
 /// the default for its type.
-pub fn take_or_default R, R: AsRef<[u8]>>(hash: &HashFn, key: &[u8]) -> T {
+pub fn take_or_default(hash: &HashFn, key: &[u8]) -> T
+where
+	T: Decode + Sized + Default,
+	HashFn: Fn(&[u8]) -> R,
+	R: AsRef<[u8]>,
+{
 	unhashed::take_or_default(&hash(key).as_ref())
 }
 
 /// Return the value of the item in storage under `key`, or `default_value` if there is no
 /// explicit entry. Ensure there is no explicit entry on return.
-pub fn take_or R, R: AsRef<[u8]>>(hash: &HashFn, key: &[u8], default_value: T) -> T {
+pub fn take_or(hash: &HashFn, key: &[u8], default_value: T) -> T
+where
+	T: Decode + Sized,
+	HashFn: Fn(&[u8]) -> R,
+	R: AsRef<[u8]>,
+{
 	unhashed::take_or(&hash(key).as_ref(), default_value)
 }
 
 /// Return the value of the item in storage under `key`, or `default_value()` if there is no
 /// explicit entry. Ensure there is no explicit entry on return.
-pub fn take_or_else T, HashFn: Fn(&[u8]) -> R, R: AsRef<[u8]>>(hash: &HashFn, key: &[u8], default_value: F) -> T {
+pub fn take_or_else(hash: &HashFn, key: &[u8], default_value: F) -> T
+where
+	T: Decode + Sized,
+	F: FnOnce() -> T,
+	HashFn: Fn(&[u8]) -> R,
+	R: AsRef<[u8]>,
+{
 	unhashed::take_or_else(&hash(key).as_ref(), default_value)
 }
 
 /// Check to see if `key` has an explicit entry in storage.
-pub fn exists R, R: AsRef<[u8]>>(hash: &HashFn, key: &[u8]) -> bool {
+pub fn exists(hash: &HashFn, key: &[u8]) -> bool
+where
+	HashFn: Fn(&[u8]) -> R,
+	R: AsRef<[u8]>,
+{
 	unhashed::exists(&hash(key).as_ref())
 }
 
 /// Ensure `key` has no explicit entry in storage.
-pub fn kill R, R: AsRef<[u8]>>(hash: &HashFn, key: &[u8]) {
+pub fn kill(hash: &HashFn, key: &[u8])
+where
+	HashFn: Fn(&[u8]) -> R,
+	R: AsRef<[u8]>,
+{
 	unhashed::kill(&hash(key).as_ref())
 }
 
 /// Get a Vec of bytes from storage.
-pub fn get_raw R, R: AsRef<[u8]>>(hash: &HashFn, key: &[u8]) -> Option> {
+pub fn get_raw(hash: &HashFn, key: &[u8]) -> Option>
+where
+	HashFn: Fn(&[u8]) -> R,
+	R: AsRef<[u8]>,
+{
 	unhashed::get_raw(&hash(key).as_ref())
 }
 
 /// Put a raw byte slice into storage.
-pub fn put_raw R, R: AsRef<[u8]>>(hash: &HashFn, key: &[u8], value: &[u8]) {
+pub fn put_raw(hash: &HashFn, key: &[u8], value: &[u8])
+where
+	HashFn: Fn(&[u8]) -> R,
+	R: AsRef<[u8]>,
+{
 	unhashed::put_raw(&hash(key).as_ref(), value)
 }
 
diff --git a/srml/support/src/storage/mod.rs b/srml/support/src/storage/mod.rs
index fb23383c9d11301075544454404edbaea747bf2b..a1891dade3b0c5b4010824c0bff8e641e18f9194 100644
--- a/srml/support/src/storage/mod.rs
+++ b/srml/support/src/storage/mod.rs
@@ -70,17 +70,17 @@ impl HashedStorage for RuntimeStorage {
 	}
 
 	/// Put a value in under a key.
-	fn put(&self, key: &[u8], val: &T) {
+	fn put(&mut self, key: &[u8], val: &T) {
 		hashed::put(&H::hash, key, val)
 	}
 
 	/// Remove the bytes of a key from storage.
-	fn kill(&self, key: &[u8]) {
+	fn kill(&mut self, key: &[u8]) {
 		hashed::kill(&H::hash, key)
 	}
 
 	/// Take a value from storage, deleting it after reading.
-	fn take(&self, key: &[u8]) -> Option {
+	fn take(&mut self, key: &[u8]) -> Option {
 		hashed::take(&H::hash, key)
 	}
 
@@ -88,7 +88,7 @@ impl HashedStorage for RuntimeStorage {
 		hashed::get_raw(&H::hash, key)
 	}
 
-	fn put_raw(&self, key: &[u8], value: &[u8]) {
+	fn put_raw(&mut self, key: &[u8], value: &[u8]) {
 		hashed::put_raw(&H::hash, key, value)
 	}
 }
@@ -104,22 +104,22 @@ impl UnhashedStorage for RuntimeStorage {
 	}
 
 	/// Put a value in under a key.
-	fn put(&self, key: &[u8], val: &T) {
+	fn put(&mut self, key: &[u8], val: &T) {
 		unhashed::put(key, val)
 	}
 
 	/// Remove the bytes of a key from storage.
-	fn kill(&self, key: &[u8]) {
+	fn kill(&mut self, key: &[u8]) {
 		unhashed::kill(key)
 	}
 
 	/// Remove the bytes of a key from storage.
-	fn kill_prefix(&self, prefix: &[u8]) {
+	fn kill_prefix(&mut self, prefix: &[u8]) {
 		unhashed::kill_prefix(prefix)
 	}
 
 	/// Take a value from storage, deleting it after reading.
-	fn take(&self, key: &[u8]) -> Option {
+	fn take(&mut self, key: &[u8]) -> Option {
 		unhashed::take(key)
 	}
 
@@ -127,7 +127,7 @@ impl UnhashedStorage for RuntimeStorage {
 		unhashed::get_raw(key)
 	}
 
-	fn put_raw(&self, key: &[u8], value: &[u8]) {
+	fn put_raw(&mut self, key: &[u8], value: &[u8]) {
 		unhashed::put_raw(key, value)
 	}
 }
@@ -178,89 +178,21 @@ impl StorageValue for U where U: hashed::generator::StorageValue
 		U::get(&RuntimeStorage)
 	}
 	fn put>(val: Arg) {
-		U::put(val.borrow(), &RuntimeStorage)
+		U::put(val.borrow(), &mut RuntimeStorage)
 	}
 	fn mutate R>(f: F) -> R {
-		U::mutate(f, &RuntimeStorage)
+		U::mutate(f, &mut RuntimeStorage)
 	}
 	fn kill() {
-		U::kill(&RuntimeStorage)
+		U::kill(&mut RuntimeStorage)
 	}
 	fn take() -> Self::Query {
-		U::take(&RuntimeStorage)
+		U::take(&mut RuntimeStorage)
 	}
 	fn append(items: &[I]) -> Result<(), &'static str>
 		where T: EncodeAppend
 	{
-		U::append(items, &RuntimeStorage)
-	}
-}
-
-/// A strongly-typed list in storage.
-pub trait StorageList {
-	/// Get the prefix key in storage.
-	fn prefix() -> &'static [u8];
-
-	/// Get the key used to store the length field.
-	fn len_key() -> Vec;
-
-	/// Get the storage key used to fetch a value at a given index.
-	fn key_for(index: u32) -> Vec;
-
-	/// Read out all the items.
-	fn items() -> Vec;
-
-	/// Set the current set of items.
-	fn set_items(items: &[T]);
-
-	/// Set the item at the given index.
-	fn set_item>(index: u32, val: Arg);
-
-	/// Load the value at given index. Returns `None` if the index is out-of-bounds.
-	fn get(index: u32) -> Option;
-
-	/// Load the length of the list
-	fn len() -> u32;
-
-	/// Clear the list.
-	fn clear();
-}
-
-impl StorageList for U where U: hashed::generator::StorageList {
-	fn prefix() -> &'static [u8] {
-		>::prefix()
-	}
-
-	fn len_key() -> Vec {
-		>::len_key()
-	}
-
-	fn key_for(index: u32) -> Vec {
-		>::key_for(index)
-	}
-
-	fn items() -> Vec {
-		U::items(&RuntimeStorage)
-	}
-
-	fn set_items(items: &[T]) {
-		U::set_items(items, &RuntimeStorage)
-	}
-
-	fn set_item>(index: u32, val: Arg) {
-		U::set_item(index, val.borrow(), &RuntimeStorage)
-	}
-
-	fn get(index: u32) -> Option {
-		U::get(index, &RuntimeStorage)
-	}
-
-	fn len() -> u32 {
-		U::len(&RuntimeStorage)
-	}
-
-	fn clear() {
-		U::clear(&RuntimeStorage)
+		U::append(items, &mut RuntimeStorage)
 	}
 }
 
@@ -314,26 +246,45 @@ impl StorageMap for U where U: hashed::generator::S
 	}
 
 	fn insert, ValArg: Borrow>(key: KeyArg, val: ValArg) {
-		U::insert(key.borrow(), val.borrow(), &RuntimeStorage)
+		U::insert(key.borrow(), val.borrow(), &mut RuntimeStorage)
 	}
 
 	fn remove>(key: KeyArg) {
-		U::remove(key.borrow(), &RuntimeStorage)
+		U::remove(key.borrow(), &mut RuntimeStorage)
 	}
 
 	fn mutate, R, F: FnOnce(&mut Self::Query) -> R>(key: KeyArg, f: F) -> R {
-		U::mutate(key.borrow(), f, &RuntimeStorage)
+		U::mutate(key.borrow(), f, &mut RuntimeStorage)
 	}
 
 	fn take>(key: KeyArg) -> Self::Query {
-		U::take(key.borrow(), &RuntimeStorage)
+		U::take(key.borrow(), &mut RuntimeStorage)
+	}
+}
+
+/// A storage map with values that can be appended to.
+pub trait AppendableStorageMap: StorageMap {
+	/// Append the given item to the value in the storage.
+	///
+	/// `T` is required to implement `codec::EncodeAppend`.
+	fn append, I: Encode>(key: KeyArg, items: &[I]) -> Result<(), &'static str>
+		where V: EncodeAppend;
+}
+
+impl AppendableStorageMap for U
+	where U: hashed::generator::AppendableStorageMap
+{
+	fn append, I: Encode>(key: KeyArg, items: &[I]) -> Result<(), &'static str>
+		where V: EncodeAppend
+	{
+		U::append(key.borrow(), items, &mut RuntimeStorage)
 	}
 }
 
 /// A storage map that can be enumerated.
 ///
-/// Note that type is primarily useful for off-chain computations.
-/// Runtime implementors should avoid enumerating storage entries.
+/// Primarily useful for off-chain computations.
+/// Runtime implementors should avoid enumerating storage entries on-chain.
 pub trait EnumerableStorageMap: StorageMap {
 	/// Return current head element.
 	fn head() -> Option;
@@ -342,7 +293,9 @@ pub trait EnumerableStorageMap: StorageMap {
 	fn enumerate() -> Box> where K: 'static, V: 'static;
 }
 
-impl EnumerableStorageMap for U where U: hashed::generator::EnumerableStorageMap {
+impl EnumerableStorageMap for U
+	where U: hashed::generator::EnumerableStorageMap
+{
 	fn head() -> Option {
 		>::head(&RuntimeStorage)
 	}
@@ -401,6 +354,20 @@ pub trait StorageDoubleMap {
 		KArg1: Borrow,
 		KArg2: Borrow,
 		F: FnOnce(&mut Self::Query) -> R;
+
+	/// Append the given items to the value under the key specified.
+	///
+	/// `V` is required to implement `codec::EncodeAppend`.
+	fn append(
+		k1: KArg1,
+		k2: KArg2,
+		items: &[I],
+	) -> Result<(), &'static str>
+	where
+		KArg1: Borrow,
+		KArg2: Borrow,
+		I: codec::Encode,
+		V: EncodeAppend;
 }
 
 impl StorageDoubleMap for U
@@ -430,19 +397,19 @@ where
 	}
 
 	fn take, KArg2: Borrow>(k1: KArg1, k2: KArg2) -> Self::Query {
-		U::take(k1.borrow(), k2.borrow(), &RuntimeStorage)
+		U::take(k1.borrow(), k2.borrow(), &mut RuntimeStorage)
 	}
 
 	fn insert, KArg2: Borrow, VArg: Borrow>(k1: KArg1, k2: KArg2, val: VArg) {
-		U::insert(k1.borrow(), k2.borrow(), val.borrow(), &RuntimeStorage)
+		U::insert(k1.borrow(), k2.borrow(), val.borrow(), &mut RuntimeStorage)
 	}
 
 	fn remove, KArg2: Borrow>(k1: KArg1, k2: KArg2) {
-		U::remove(k1.borrow(), k2.borrow(), &RuntimeStorage)
+		U::remove(k1.borrow(), k2.borrow(), &mut RuntimeStorage)
 	}
 
 	fn remove_prefix>(k1: KArg1) {
-		U::remove_prefix(k1.borrow(), &RuntimeStorage)
+		U::remove_prefix(k1.borrow(), &mut RuntimeStorage)
 	}
 
 	fn mutate(k1: KArg1, k2: KArg2, f: F) -> R
@@ -451,7 +418,21 @@ where
 		KArg2: Borrow,
 		F: FnOnce(&mut Self::Query) -> R
 	{
-		U::mutate(k1.borrow(), k2.borrow(), f, &RuntimeStorage)
+		U::mutate(k1.borrow(), k2.borrow(), f, &mut RuntimeStorage)
+	}
+
+	fn append(
+		k1: KArg1,
+		k2: KArg2,
+		items: &[I],
+	) -> Result<(), &'static str>
+	where
+		KArg1: Borrow,
+		KArg2: Borrow,
+		I: codec::Encode,
+		V: EncodeAppend,
+	{
+		U::append(k1.borrow(), k2.borrow(), items, &mut RuntimeStorage)
 	}
 }
 
diff --git a/srml/support/src/storage/storage_items.rs b/srml/support/src/storage/storage_items.rs
index 720cac64c5361291ab3eee18fc462198c443dd10..9d89b81e0d950b224f45e31e90aa460a35948230 100644
--- a/srml/support/src/storage/storage_items.rs
+++ b/srml/support/src/storage/storage_items.rs
@@ -22,7 +22,6 @@
 //! Three kinds of data types are currently supported:
 //!   - values
 //!   - maps
-//!   - lists
 //!
 //! # Examples:
 //!
@@ -39,8 +38,6 @@
 //!     pub Value: b"putd_key" => SessionKey;
 //!     // private map.
 //!     Balances: b"private_map:" => map [AuthorityId => Balance];
-//!     // private list.
-//!     Authorities: b"auth:" => list [AuthorityId];
 //! }
 //!
 //!# fn main() { }
@@ -159,16 +156,6 @@ macro_rules! storage_items {
 		storage_items!($($t)*);
 	};
 
-
-	// lists
-	($name:ident : $prefix:expr => list [$ty:ty]; $($t:tt)*) => {
-		$crate::__storage_items_internal!(() $name: $prefix => list [$ty]);
-		storage_items!($($t)*);
-	};
-	(pub $name:ident : $prefix:expr => list [$ty:ty]; $($t:tt)*) => {
-		$crate::__storage_items_internal!((pub) $name: $prefix => list [$ty]);
-		storage_items!($($t)*);
-	};
 	() => ()
 }
 
@@ -197,12 +184,12 @@ macro_rules! __storage_items_internal {
 			}
 
 			/// Take a value from storage, removing it afterwards.
-			fn take>(storage: &S) -> Self::Query {
+			fn take>(storage: &mut S) -> Self::Query {
 				storage.$taker($key)
 			}
 
 			/// Mutate this value.
-			fn mutate R, S: $crate::HashedStorage<$crate::Twox128>>(f: F, storage: &S) -> R {
+			fn mutate R, S: $crate::HashedStorage<$crate::Twox128>>(f: F, storage: &mut S) -> R {
 				let mut val = >::get(storage);
 
 				let ret = f(&mut val);
@@ -256,13 +243,13 @@ macro_rules! __storage_items_internal {
 			}
 
 			/// Take the value, reading and removing it.
-			fn take>(key: &$kty, storage: &S) -> Self::Query {
+			fn take>(key: &$kty, storage: &mut S) -> Self::Query {
 				let key = <$name as $crate::storage::hashed::generator::StorageMap<$kty, $ty>>::key_for(key);
 				storage.$taker(&key[..])
 			}
 
 			/// Mutate the value under a key.
-			fn mutate R, S: $crate::HashedStorage>(key: &$kty, f: F, storage: &S) -> R {
+			fn mutate R, S: $crate::HashedStorage>(key: &$kty, f: F, storage: &mut S) -> R {
 				let mut val = >::take(key, storage);
 
 				let ret = f(&mut val);
@@ -282,84 +269,6 @@ macro_rules! __storage_items_internal {
 			}
 		}
 	};
-	// generator for lists.
-	(($($vis:tt)*) $name:ident : $prefix:expr => list [$ty:ty]) => {
-		$($vis)* struct $name;
-
-		impl $name {
-			fn clear_item>(index: u32, storage: &S) {
-				if index < <$name as $crate::storage::hashed::generator::StorageList<$ty>>::len(storage) {
-					storage.kill(&<$name as $crate::storage::hashed::generator::StorageList<$ty>>::key_for(index));
-				}
-			}
-
-			fn set_len>(count: u32, storage: &S) {
-				(count..<$name as $crate::storage::hashed::generator::StorageList<$ty>>::len(storage)).for_each(|i| $name::clear_item(i, storage));
-				storage.put(&<$name as $crate::storage::hashed::generator::StorageList<$ty>>::len_key(), &count);
-			}
-		}
-
-		impl $crate::storage::hashed::generator::StorageList<$ty> for $name {
-			/// Get the prefix key in storage.
-			fn prefix() -> &'static [u8] {
-				$prefix
-			}
-
-			/// Get the key used to put the length field.
-			fn len_key() -> $crate::rstd::vec::Vec {
-				let mut key = $prefix.to_vec();
-				key.extend(b"len");
-				key
-			}
-
-			/// Get the storage key used to fetch a value at a given index.
-			fn key_for(index: u32) -> $crate::rstd::vec::Vec {
-				let mut key = $prefix.to_vec();
-				$crate::codec::Encode::encode_to(&index, &mut key);
-				key
-			}
-
-			/// Read out all the items.
-			fn items>(storage: &S) -> $crate::rstd::vec::Vec<$ty> {
-				(0..<$name as $crate::storage::hashed::generator::StorageList<$ty>>::len(storage))
-					.map(|i| <$name as $crate::storage::hashed::generator::StorageList<$ty>>::get(i, storage).expect("all items within length are set; qed"))
-					.collect()
-			}
-
-			/// Set the current set of items.
-			fn set_items>(items: &[$ty], storage: &S) {
-				$name::set_len(items.len() as u32, storage);
-				items.iter()
-					.enumerate()
-					.for_each(|(i, item)| <$name as $crate::storage::hashed::generator::StorageList<$ty>>::set_item(i as u32, item, storage));
-			}
-
-			fn set_item>(index: u32, item: &$ty, storage: &S) {
-				if index < <$name as $crate::storage::hashed::generator::StorageList<$ty>>::len(storage) {
-					storage.put(&<$name as $crate::storage::hashed::generator::StorageList<$ty>>::key_for(index)[..], item);
-				}
-			}
-
-			/// Load the value at given index. Returns `None` if the index is out-of-bounds.
-			fn get>(index: u32, storage: &S) -> Option<$ty> {
-				storage.get(&<$name as $crate::storage::hashed::generator::StorageList<$ty>>::key_for(index)[..])
-			}
-
-			/// Load the length of the list.
-			fn len>(storage: &S) -> u32 {
-				storage.get(&<$name as $crate::storage::hashed::generator::StorageList<$ty>>::len_key()).unwrap_or_default()
-			}
-
-			/// Clear the list.
-			fn clear>(storage: &S) {
-				for i in 0..<$name as $crate::storage::hashed::generator::StorageList<$ty>>::len(storage) {
-					$name::clear_item(i, storage);
-				}
-
-				storage.kill(&<$name as $crate::storage::hashed::generator::StorageList<$ty>>::len_key()[..])
-			}
-		}
-	};
 }
 
 #[macro_export]
@@ -383,7 +292,6 @@ macro_rules! __handle_wrap_internal {
 #[allow(dead_code)]
 mod tests {
 	use std::collections::HashMap;
-	use std::cell::RefCell;
 	use super::*;
 	use crate::metadata::*;
 	use crate::metadata::StorageHasher;
@@ -392,49 +300,26 @@ mod tests {
 
 	storage_items! {
 		Value: b"a" => u32;
-		List: b"b:" => list [u64];
 		Map: b"c:" => map [u32 => [u8; 32]];
 	}
 
 	#[test]
 	fn value() {
-		let mut overlay = HashMap::new();
-		let storage = RefCell::new(&mut overlay);
+		let mut storage = HashMap::new();
 		assert!(Value::get(&storage).is_none());
-		Value::put(&100_000, &storage);
+		Value::put(&100_000, &mut storage);
 		assert_eq!(Value::get(&storage), Some(100_000));
-		Value::kill(&storage);
+		Value::kill(&mut storage);
 		assert!(Value::get(&storage).is_none());
 	}
 
-	#[test]
-	fn list() {
-		let mut overlay = HashMap::new();
-		let storage = RefCell::new(&mut overlay);
-		assert_eq!(List::len(&storage), 0);
-		assert!(List::items(&storage).is_empty());
-
-		List::set_items(&[0, 2, 4, 6, 8], &storage);
-		assert_eq!(List::items(&storage), &[0, 2, 4, 6, 8]);
-		assert_eq!(List::len(&storage), 5);
-
-		List::set_item(2, &10, &storage);
-		assert_eq!(List::items(&storage), &[0, 2, 10, 6, 8]);
-		assert_eq!(List::len(&storage), 5);
-
-		List::clear(&storage);
-		assert_eq!(List::len(&storage), 0);
-		assert!(List::items(&storage).is_empty());
-	}
-
 	#[test]
 	fn map() {
-		let mut overlay = HashMap::new();
-		let storage = RefCell::new(&mut overlay);
+		let mut storage = HashMap::new();
 		assert!(Map::get(&5, &storage).is_none());
-		Map::insert(&5, &[1; 32], &storage);
+		Map::insert(&5, &[1; 32], &mut storage);
 		assert_eq!(Map::get(&5, &storage), Some([1; 32]));
-		assert_eq!(Map::take(&5, &storage), Some([1; 32]));
+		assert_eq!(Map::take(&5, &mut storage), Some([1; 32]));
 		assert!(Map::get(&5, &storage).is_none());
 		assert!(Map::get(&999, &storage).is_none());
 	}
@@ -904,3 +789,46 @@ mod test3 {
 		type BlockNumber = u32;
 	}
 }
+
+#[cfg(test)]
+#[allow(dead_code)]
+mod test_map_vec_append {
+	pub trait Trait {
+		type Origin;
+		type BlockNumber;
+	}
+	decl_module! {
+		pub struct Module for enum Call where origin: T::Origin {}
+	}
+	crate::decl_storage! {
+		trait Store for Module as Test {
+			JustVec: Vec;
+			MapVec: map u32 => Vec;
+		}
+	}
+
+	struct Test {}
+
+	impl Trait for Test {
+		type Origin = u32;
+		type BlockNumber = u32;
+	}
+
+	#[test]
+	fn append_works() {
+		use crate::storage::{AppendableStorageMap, StorageMap, StorageValue};
+		use runtime_io::{with_externalities, TestExternalities};
+
+		with_externalities(&mut TestExternalities::default(), || {
+			let _ = >::append(1, &[1, 2, 3]);
+			let _ = >::append(1, &[4, 5]);
+			assert_eq!(>::get(1), vec![1, 2, 3, 4, 5]);
+
+			let _ = >::append(&[1, 2, 3]);
+			let _ = >::append(&[4, 5]);
+			assert_eq!(>::get(), vec![1, 2, 3, 4, 5]);
+		});
+	}
+}
+
+
diff --git a/srml/support/src/storage/unhashed/generator.rs b/srml/support/src/storage/unhashed/generator.rs
index 25592dce6d9444f1d8a72fe355eee7c2ca2ca248..3c56ae0ac5fd4cb2119ece2d289031ff0e00d3fe 100644
--- a/srml/support/src/storage/unhashed/generator.rs
+++ b/srml/support/src/storage/unhashed/generator.rs
@@ -27,73 +27,81 @@ pub trait UnhashedStorage {
 
 	/// Load the bytes of a key from storage. Can panic if the type is incorrect. Will panic if
 	/// it's not there.
-	fn require(&self, key: &[u8]) -> T { self.get(key).expect("Required values must be in storage") }
+	fn require(&self, key: &[u8]) -> T {
+		self.get(key).expect("Required values must be in storage")
+	}
 
 	/// Load the bytes of a key from storage. Can panic if the type is incorrect. The type's
 	/// default is returned if it's not there.
-	fn get_or_default(&self, key: &[u8]) -> T { self.get(key).unwrap_or_default() }
+	fn get_or_default(&self, key: &[u8]) -> T {
+		self.get(key).unwrap_or_default()
+	}
 
 	/// Put a value in under a key.
-	fn put(&self, key: &[u8], val: &T);
+	fn put(&mut self, key: &[u8], val: &T);
 
 	/// Remove the bytes of a key from storage.
-	fn kill(&self, key: &[u8]);
+	fn kill(&mut self, key: &[u8]);
 
 	/// Remove the bytes of a key from storage.
-	fn kill_prefix(&self, prefix: &[u8]);
+	fn kill_prefix(&mut self, prefix: &[u8]);
 
 	/// Take a value from storage, deleting it after reading.
-	fn take(&self, key: &[u8]) -> Option {
+	fn take(&mut self, key: &[u8]) -> Option {
 		let value = self.get(key);
 		self.kill(key);
 		value
 	}
 
 	/// Take a value from storage, deleting it after reading.
-	fn take_or_panic(&self, key: &[u8]) -> T { self.take(key).expect("Required values must be in storage") }
+	fn take_or_panic(&mut self, key: &[u8]) -> T {
+		self.take(key).expect("Required values must be in storage")
+	}
 
 	/// Take a value from storage, deleting it after reading.
-	fn take_or_default(&self, key: &[u8]) -> T { self.take(key).unwrap_or_default() }
+	fn take_or_default(&mut self, key: &[u8]) -> T {
+		self.take(key).unwrap_or_default()
+	}
 
 	/// Get a Vec of bytes from storage.
 	fn get_raw(&self, key: &[u8]) -> Option>;
 
 	/// Put a raw byte slice into storage.
-	fn put_raw(&self, key: &[u8], value: &[u8]);
+	fn put_raw(&mut self, key: &[u8], value: &[u8]);
 }
 
 // We use a construct like this during when genesis storage is being built.
 #[cfg(feature = "std")]
-impl UnhashedStorage for std::cell::RefCell<&mut sr_primitives::StorageOverlay> {
+impl UnhashedStorage for sr_primitives::StorageOverlay {
 	fn exists(&self, key: &[u8]) -> bool {
-		self.borrow().contains_key(key)
+		self.contains_key(key)
 	}
 
 	fn get(&self, key: &[u8]) -> Option {
-		self.borrow().get(key)
+		self.get(key)
 			.map(|x| codec::Decode::decode(&mut x.as_slice()).expect("Unable to decode expected type."))
 	}
 
-	fn put(&self, key: &[u8], val: &T) {
-		self.borrow_mut().insert(key.to_vec(), codec::Encode::encode(val));
+	fn put(&mut self, key: &[u8], val: &T) {
+		self.insert(key.to_vec(), codec::Encode::encode(val));
 	}
 
-	fn kill(&self, key: &[u8]) {
-		self.borrow_mut().remove(key);
+	fn kill(&mut self, key: &[u8]) {
+		self.remove(key);
 	}
 
-	fn kill_prefix(&self, prefix: &[u8]) {
-		self.borrow_mut().retain(|key, _| {
+	fn kill_prefix(&mut self, prefix: &[u8]) {
+		self.retain(|key, _| {
 			!key.starts_with(prefix)
 		})
 	}
 
 	fn get_raw(&self, key: &[u8]) -> Option> {
-		self.borrow().get(key).cloned()
+		self.get(key).cloned()
 	}
 
-	fn put_raw(&self, key: &[u8], value: &[u8]) {
-		self.borrow_mut().insert(key.to_vec(), value.to_vec());
+	fn put_raw(&mut self, key: &[u8], value: &[u8]) {
+		self.insert(key.to_vec(), value.to_vec());
 	}
 }
 
@@ -131,23 +139,43 @@ pub trait StorageDoubleMap
 	fn get(k1: &K1, k2: &K2, storage: &S) -> Self::Query;
 
 	/// Take the value under a key.
-	fn take(k1: &K1, k2: &K2, storage: &S) -> Self::Query;
+	fn take(k1: &K1, k2: &K2, storage: &mut S) -> Self::Query;
 
 	/// Store a value to be associated with the given key from the map.
-	fn insert(k1: &K1, k2: &K2, val: &V, storage: &S) {
+	fn insert(k1: &K1, k2: &K2, val: &V, storage: &mut S) {
 		storage.put(&Self::key_for(k1, k2), val);
 	}
 
 	/// Remove the value under a key.
-	fn remove(k1: &K1, k2: &K2, storage: &S) {
+	fn remove(k1: &K1, k2: &K2, storage: &mut S) {
 		storage.kill(&Self::key_for(k1, k2));
 	}
 
 	/// Removes all entries that shares the `k1` as the first key.
-	fn remove_prefix(k1: &K1, storage: &S) {
+	fn remove_prefix(k1: &K1, storage: &mut S) {
 		storage.kill_prefix(&Self::prefix_for(k1));
 	}
 
 	/// Mutate the value under a key.
-	fn mutate R, S: UnhashedStorage>(k1: &K1, k2: &K2, f: F, storage: &S) -> R;
+	fn mutate R, S: UnhashedStorage>(k1: &K1, k2: &K2, f: F, storage: &mut S) -> R;
+
+	/// Append the given items to the value under the key specified.
+	fn append(
+		k1: &K1,
+		k2: &K2,
+		items: &[I],
+		storage: &mut S,
+	) -> Result<(), &'static str>
+	where
+		I: codec::Encode,
+		V: codec::EncodeAppend,
+	{
+		let key = Self::key_for(k1, k2);
+		let new_val = ::append(
+			storage.get_raw(&key).unwrap_or_default(),
+			items,
+		).ok_or_else(|| "Could not append given item")?;
+		storage.put_raw(&key, &new_val);
+		Ok(())
+	}
 }
diff --git a/srml/support/src/traits.rs b/srml/support/src/traits.rs
index 67b1f973ce4de72dbb5aa88b6f3b73a53a633e03..3b3c63e223ce14831368094bf3b882a929c89f74 100644
--- a/srml/support/src/traits.rs
+++ b/srml/support/src/traits.rs
@@ -14,7 +14,9 @@
 // You should have received a copy of the GNU General Public License
 // along with Substrate.  If not, see .
 
-//! Traits for SRML
+//! Traits for SRML.
+//!
+//! NOTE: If you're looking for `parameter_types`, it has moved in to the top-level module.
 
 use crate::rstd::result;
 use crate::codec::{Codec, Encode, Decode};
@@ -22,26 +24,52 @@ use crate::runtime_primitives::traits::{
 	MaybeSerializeDebug, SimpleArithmetic
 };
 
+use super::for_each_tuple;
+
+/// A trait for querying a single fixed value from a type.
+pub trait Get {
+	/// Return a constant value.
+	fn get() -> T;
+}
+
+/// A trait for querying whether a type can be said to statically "contain" a value. Similar
+/// in nature to `Get`, except it is designed to be lazy rather than active (you can't ask it to
+/// enumerate all values that it contains) and work for multiple values rather than just one.
+pub trait Contains {
+	/// Return `true` if this "contains" the given value `t`.
+	fn contains(t: &T) -> bool;
+}
+
+impl> Contains for T {
+	fn contains(t: &V) -> bool {
+		&Self::get() == t
+	}
+}
+
 /// The account with the given id was killed.
 pub trait OnFreeBalanceZero {
 	/// The account was the given id was killed.
 	fn on_free_balance_zero(who: &AccountId);
 }
 
-impl OnFreeBalanceZero for () {
-	fn on_free_balance_zero(_who: &AccountId) {}
-}
-impl<
-	AccountId,
-	X: OnFreeBalanceZero,
-	Y: OnFreeBalanceZero,
-> OnFreeBalanceZero for (X, Y) {
-	fn on_free_balance_zero(who: &AccountId) {
-		X::on_free_balance_zero(who);
-		Y::on_free_balance_zero(who);
+macro_rules! impl_on_free_balance_zero {
+	() => (
+		impl OnFreeBalanceZero for () {
+			fn on_free_balance_zero(_: &AccountId) {}
+		}
+	);
+
+	( $($t:ident)* ) => {
+		impl),*> OnFreeBalanceZero for ($($t,)*) {
+			fn on_free_balance_zero(who: &AccountId) {
+				$($t::on_free_balance_zero(who);)*
+			}
+		}
 	}
 }
 
+for_each_tuple!(impl_on_free_balance_zero);
+
 /// Trait for a hook to get called when some balance has been minted, causing dilution.
 pub trait OnDilution {
 	/// Some `portion` of the total balance just "grew" by `minted`. `portion` is the pre-growth
diff --git a/srml/support/src/unsigned.rs b/srml/support/src/unsigned.rs
index dcdf4b2683787f84f9b5c094415bef9c90f80e43..8ea613461a1a83ddd25c421f03c276b7fe52da51 100644
--- a/srml/support/src/unsigned.rs
+++ b/srml/support/src/unsigned.rs
@@ -84,6 +84,7 @@ mod test_empty_call {
 	pub enum Call {
 	}
 
+	#[allow(unused)]
 	pub struct Runtime;
 
 	impl_outer_validate_unsigned! {
diff --git a/srml/support/test/Cargo.toml b/srml/support/test/Cargo.toml
index 29cc927ff7617569609a4fa1df4ea536fdd868b6..44a3b8d8841a20cdffbf6e7f62eef052574f2a47 100644
--- a/srml/support/test/Cargo.toml
+++ b/srml/support/test/Cargo.toml
@@ -4,13 +4,14 @@ version = "2.0.0"
 authors = ["Parity Technologies "]
 edition = "2018"
 
-[dev-dependencies]
+[dependencies]
 serde = { version = "1.0", default-features = false, features = ["derive"] }
 parity-codec = { version = "3.3", default-features = false, features = ["derive"] }
 runtime_io = { package = "sr-io", path = "../../../core/sr-io", default-features = false }
-srml-support = { path = "../", default-features = false }
+srml-support = { version = "2", path = "../", default-features = false }
 inherents = { package = "substrate-inherents", path = "../../../core/inherents", default-features = false }
 primitives = { package = "substrate-primitives", path = "../../../core/primitives", default-features = false }
+trybuild = "1"
 
 [features]
 default = ["std"]
diff --git a/srml/support/test/src/lib.rs b/srml/support/test/src/lib.rs
index 7b23662e68db4dcb94b6c8e52c19710ad4a236f6..a7a869cf8794d7855697b6c7d3066c21b32533bb 100644
--- a/srml/support/test/src/lib.rs
+++ b/srml/support/test/src/lib.rs
@@ -16,3 +16,9 @@
 
 //! Test crate for srml_support. Allow to make use of `srml_support::decl_storage`.
 //! See tests directory.
+
+#[test]
+fn reserved_keyword() {
+    let t = trybuild::TestCases::new();
+    t.compile_fail("tests/reserved_keyword/*.rs");
+}
diff --git a/srml/support/test/tests/final_keys.rs b/srml/support/test/tests/final_keys.rs
index 69b815e10af605aee3e19d63f382d3e82256b269..549506df496c9505719ad0e07ff5a0c7fe84c480 100644
--- a/srml/support/test/tests/final_keys.rs
+++ b/srml/support/test/tests/final_keys.rs
@@ -18,11 +18,11 @@ use runtime_io::{with_externalities, Blake2Hasher};
 use srml_support::{StorageValue, StorageMap, StorageDoubleMap};
 use srml_support::storage::unhashed;
 use srml_support::runtime_primitives::BuildStorage;
-use parity_codec::Encode;
+use parity_codec::{Encode, Decode};
 
 pub trait Trait {
 	type Origin;
-	type BlockNumber;
+	type BlockNumber: Encode + Decode + Default + Clone;
 }
 
 srml_support::decl_module! {
@@ -41,6 +41,9 @@ srml_support::decl_storage!{
 
 		pub DoubleMap: double_map u32, blake2_256(u32) => u32;
 		pub DoubleMap2: double_map hasher(twox_128) u32, blake2_128(u32) => u32;
+
+		pub Foo get(foo) config(): Option;
+		pub Foo2 get(foo2) config(): double_map u32, blake2_256(T::BlockNumber) => Option;
 	}
 }
 
diff --git a/srml/support/test/tests/instance.rs b/srml/support/test/tests/instance.rs
index 641ad9f4b56f475b922f13706c28f1910887dcb4..f7b4a4bd3a2517506ca905dd7f723eef0f1a4822 100644
--- a/srml/support/test/tests/instance.rs
+++ b/srml/support/test/tests/instance.rs
@@ -16,14 +16,11 @@
 
 #![recursion_limit="128"]
 
-#[cfg(feature = "std")]
-use serde::Serialize;
 use runtime_io::{with_externalities, Blake2Hasher};
 use srml_support::rstd::prelude::*;
 use srml_support::rstd as rstd;
-use srml_support::codec::{Encode, Decode};
 use srml_support::runtime_primitives::{generic, BuildStorage};
-use srml_support::runtime_primitives::traits::{BlakeTwo256, Block as _, Verify, Digest};
+use srml_support::runtime_primitives::traits::{BlakeTwo256, Block as _, Verify};
 use srml_support::Parameter;
 use inherents::{
 	ProvideInherent, InherentData, InherentIdentifier, RuntimeString, MakeFatalError
@@ -39,16 +36,15 @@ mod system {
 	use super::*;
 
 	pub trait Trait: 'static + Eq + Clone {
-		type Origin: Into>> + From>;
+		type Origin: Into, Self::Origin>>
+			+ From>;
 		type BlockNumber;
-		type Digest: Digest;
 		type Hash;
 		type AccountId;
 		type Event: From;
-		type Log: From> + Into>;
 	}
 
-	pub type DigestItemOf = <::Digest as Digest>::Item;
+	pub type DigestItemOf = generic::DigestItem<::Hash>;
 
 	srml_support::decl_module! {
 		pub struct Module for enum Call where origin: T::Origin {
@@ -57,7 +53,7 @@ mod system {
 		}
 	}
 	impl Module {
-		pub fn deposit_log(_item: ::Item) {
+		pub fn deposit_log(_item: DigestItemOf) {
 			unimplemented!();
 		}
 	}
@@ -89,37 +85,23 @@ mod system {
 
 	pub type Origin = RawOrigin<::AccountId>;
 
-	pub type Log = RawLog<
-		::Hash,
-	>;
-
-	#[cfg_attr(feature = "std", derive(Serialize, Debug))]
-	#[derive(Encode, Decode, PartialEq, Eq, Clone)]
-	pub enum RawLog {
-		ChangesTrieRoot(H),
-	}
-
 	pub fn ensure_root(o: OuterOrigin) -> Result<(), &'static str>
-		where OuterOrigin: Into>>
+		where OuterOrigin: Into, OuterOrigin>>
 	{
-		match o.into() {
-			Some(RawOrigin::Root) => Ok(()),
-			_ => Err("bad origin: expected to be a root origin"),
-		}
+		o.into().map(|_| ()).map_err(|_| "bad origin: expected to be a root origin")
 	}
 }
 
 // Test for:
 // * No default instance
 // * Custom InstantiableTrait
-// * Origin, Inherent, Log, Event
+// * Origin, Inherent, Event
 mod module1 {
 	use super::*;
 
 	pub trait Trait: system::Trait {
 		type Event: From> + Into<::Event>;
 		type Origin: From>;
-		type Log: From> + Into>;
 	}
 
 	srml_support::decl_module! {
@@ -128,18 +110,10 @@ mod module1 {
 
 			fn one() {
 				Self::deposit_event(RawEvent::AnotherVariant(3));
-				Self::deposit_log(RawLog::AmountChange(3));
 			}
 		}
 	}
 
-	impl, I: InstantiableThing> Module {
-		/// Deposit one of this module's logs.
-		fn deposit_log(log: Log) {
-			>::deposit_log(>::Log::from(log).into());
-		}
-	}
-
 	srml_support::decl_storage! {
 		trait Store for Module, I: InstantiableThing> as Module1 {
 			pub Value config(value): u64;
@@ -162,19 +136,6 @@ mod module1 {
 		_Phantom(rstd::marker::PhantomData<(T, I)>),
 	}
 
-	pub type Log = RawLog<
-		T,
-		I,
-	>;
-
-	/// A logs in this module.
-	#[cfg_attr(feature = "std", derive(serde::Serialize, Debug))]
-	#[derive(parity_codec::Encode, parity_codec::Decode, PartialEq, Eq, Clone)]
-	pub enum RawLog {
-		_Phantom(rstd::marker::PhantomData<(T, I)>),
-		AmountChange(u32),
-	}
-
 	pub const INHERENT_IDENTIFIER: InherentIdentifier = *b"12345678";
 
 	impl, I: InstantiableThing> ProvideInherent for Module {
@@ -202,7 +163,6 @@ mod module2 {
 		type Amount: Parameter + Default;
 		type Event: From> + Into<::Event>;
 		type Origin: From>;
-		type Log: From> + Into>;
 	}
 
 	impl, I: Instance> Currency for Module {}
@@ -236,19 +196,6 @@ mod module2 {
 		_Phantom(rstd::marker::PhantomData<(T, I)>),
 	}
 
-	pub type Log = RawLog<
-		T,
-		I,
-	>;
-
-	/// A logs in this module.
-	#[cfg_attr(feature = "std", derive(serde::Serialize, Debug))]
-	#[derive(parity_codec::Encode, parity_codec::Decode, PartialEq, Eq, Clone)]
-	pub enum RawLog {
-		_Phantom(rstd::marker::PhantomData<(T, I)>),
-		AmountChange(u32),
-	}
-
 	pub const INHERENT_IDENTIFIER: InherentIdentifier = *b"12345678";
 
 	impl, I: Instance> ProvideInherent for Module {
@@ -285,36 +232,30 @@ mod module3 {
 impl module1::Trait for Runtime {
 	type Event = Event;
 	type Origin = Origin;
-	type Log = Log;
 }
 impl module1::Trait for Runtime {
 	type Event = Event;
 	type Origin = Origin;
-	type Log = Log;
 }
 impl module2::Trait for Runtime {
 	type Amount = u16;
 	type Event = Event;
 	type Origin = Origin;
-	type Log = Log;
 }
 impl module2::Trait for Runtime {
 	type Amount = u32;
 	type Event = Event;
 	type Origin = Origin;
-	type Log = Log;
 }
 impl module2::Trait for Runtime {
 	type Amount = u32;
 	type Event = Event;
 	type Origin = Origin;
-	type Log = Log;
 }
 impl module2::Trait for Runtime {
 	type Amount = u64;
 	type Event = Event;
 	type Origin = Origin;
-	type Log = Log;
 }
 impl module3::Trait for Runtime {
 	type Currency = Module2_2;
@@ -330,30 +271,28 @@ impl system::Trait for Runtime {
 	type Hash = H256;
 	type Origin = Origin;
 	type BlockNumber = BlockNumber;
-	type Digest = generic::Digest;
 	type AccountId = AccountId;
 	type Event = Event;
-	type Log = Log;
 }
 
 srml_support::construct_runtime!(
-	pub enum Runtime with Log(InternalLog: DigestItem) where
+	pub enum Runtime where
 		Block = Block,
 		NodeBlock = Block,
 		UncheckedExtrinsic = UncheckedExtrinsic
 	{
-		System: system::{Module, Call, Event, Log(ChangesTrieRoot)},
-		Module1_1: module1::::{Module, Call, Storage, Event, Config, Origin, Log(), Inherent},
-		Module1_2: module1::::{Module, Call, Storage, Event, Config, Origin, Log(), Inherent},
-		Module2: module2::{Module, Call, Storage, Event, Config, Origin, Log(), Inherent},
-		Module2_1: module2::::{Module, Call, Storage, Event, Config, Origin, Log(), Inherent},
-		Module2_2: module2::::{Module, Call, Storage, Event, Config, Origin, Log(), Inherent},
-		Module2_3: module2::::{Module, Call, Storage, Event, Config, Origin, Log(), Inherent},
+		System: system::{Module, Call, Event},
+		Module1_1: module1::::{Module, Call, Storage, Event, Config, Origin, Inherent},
+		Module1_2: module1::::{Module, Call, Storage, Event, Config, Origin, Inherent},
+		Module2: module2::{Module, Call, Storage, Event, Config, Origin, Inherent},
+		Module2_1: module2::::{Module, Call, Storage, Event, Config, Origin, Inherent},
+		Module2_2: module2::::{Module, Call, Storage, Event, Config, Origin, Inherent},
+		Module2_3: module2::::{Module, Call, Storage, Event, Config, Origin, Inherent},
 		Module3: module3::{Module, Call},
 	}
 );
 
-pub type Header = generic::Header;
+pub type Header = generic::Header;
 pub type Block = generic::Block;
 pub type UncheckedExtrinsic = generic::UncheckedMortalCompactExtrinsic;
 
diff --git a/srml/support/test/tests/reserved_keyword/on_initialize.rs b/srml/support/test/tests/reserved_keyword/on_initialize.rs
new file mode 100644
index 0000000000000000000000000000000000000000..c63153241ce8f3ce052d9e355e36aa3d5f860818
--- /dev/null
+++ b/srml/support/test/tests/reserved_keyword/on_initialize.rs
@@ -0,0 +1,33 @@
+macro_rules! reserved {
+	($($reserved:ident)*) => {
+		$(
+			mod $reserved {
+				pub use srml_support::dispatch::Result;
+
+				pub trait Trait {
+					type Origin;
+					type BlockNumber: Into;
+				}
+
+				pub mod system {
+					use srml_support::dispatch::Result;
+
+					pub fn ensure_root(_: R) -> Result {
+						Ok(())
+					}
+				}
+
+				srml_support::decl_module! {
+					pub struct Module for enum Call where origin: T::Origin {
+						fn $reserved() -> Result { unreachable!() }
+					}
+				}
+			}
+		)*
+	}
+}
+
+reserved!(on_finalize on_initialize on_finalise on_initialise offchain_worker deposit_event);
+
+fn main() {
+}
diff --git a/srml/support/test/tests/reserved_keyword/on_initialize.stderr b/srml/support/test/tests/reserved_keyword/on_initialize.stderr
new file mode 100644
index 0000000000000000000000000000000000000000..7a37eb66c32acd89f96ef45fa3a88dd9724030c1
--- /dev/null
+++ b/srml/support/test/tests/reserved_keyword/on_initialize.stderr
@@ -0,0 +1,47 @@
+error: Invalid call fn name: `on_finalize`, name is reserved and doesn't match expected signature, please refer to `decl_module!` documentation to see the appropriate usage, or rename it to an unreserved keyword.
+  --> $DIR/on_initialize.rs:30:1
+   |
+30 | reserved!(on_finalize on_initialize on_finalise on_initialise offchain_worker deposit_event);
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ in this macro invocation
+   |
+   = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info)
+
+error: Invalid call fn name: `on_initialize`, name is reserved and doesn't match expected signature, please refer to `decl_module!` documentation to see the appropriate usage, or rename it to an unreserved keyword.
+  --> $DIR/on_initialize.rs:30:1
+   |
+30 | reserved!(on_finalize on_initialize on_finalise on_initialise offchain_worker deposit_event);
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ in this macro invocation
+   |
+   = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info)
+
+error: Invalid call fn name: `on_finalise`, name is reserved and doesn't match expected signature, please refer to `decl_module!` documentation to see the appropriate usage, or rename it to an unreserved keyword.
+  --> $DIR/on_initialize.rs:30:1
+   |
+30 | reserved!(on_finalize on_initialize on_finalise on_initialise offchain_worker deposit_event);
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ in this macro invocation
+   |
+   = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info)
+
+error: Invalid call fn name: `on_initialise`, name is reserved and doesn't match expected signature, please refer to `decl_module!` documentation to see the appropriate usage, or rename it to an unreserved keyword.
+  --> $DIR/on_initialize.rs:30:1
+   |
+30 | reserved!(on_finalize on_initialize on_finalise on_initialise offchain_worker deposit_event);
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ in this macro invocation
+   |
+   = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info)
+
+error: Invalid call fn name: `offchain_worker`, name is reserved and doesn't match expected signature, please refer to `decl_module!` documentation to see the appropriate usage, or rename it to an unreserved keyword.
+  --> $DIR/on_initialize.rs:30:1
+   |
+30 | reserved!(on_finalize on_initialize on_finalise on_initialise offchain_worker deposit_event);
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ in this macro invocation
+   |
+   = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info)
+
+error: Invalid call fn name: `deposit_event`, name is reserved and doesn't match expected signature, please refer to `decl_module!` documentation to see the appropriate usage, or rename it to an unreserved keyword.
+  --> $DIR/on_initialize.rs:30:1
+   |
+30 | reserved!(on_finalize on_initialize on_finalise on_initialise offchain_worker deposit_event);
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ in this macro invocation
+   |
+   = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info)
diff --git a/srml/system/benches/bench.rs b/srml/system/benches/bench.rs
index a5a87ff2e5e69f5f4193c064d1c18cb32b3996d6..ee4ebf711ab31c872efc022359008e0ca87a55f7 100644
--- a/srml/system/benches/bench.rs
+++ b/srml/system/benches/bench.rs
@@ -21,7 +21,7 @@ use runtime_io::{with_externalities, Blake2Hasher};
 use substrate_primitives::H256;
 use primitives::{
 	BuildStorage, traits::{BlakeTwo256, IdentityLookup},
-	testing::{Digest, DigestItem, Header},
+	testing::Header,
 };
 
 mod module {
@@ -62,12 +62,10 @@ impl system::Trait for Runtime {
 	type BlockNumber = u64;
 	type Hash = H256;
 	type Hashing = BlakeTwo256;
-	type Digest = Digest;
 	type AccountId = u64;
 	type Lookup = IdentityLookup;
 	type Header = Header;
 	type Event = Event;
-	type Log = DigestItem;
 }
 
 impl module::Trait for Runtime {
diff --git a/srml/system/src/lib.rs b/srml/system/src/lib.rs
index 0eccd3d0145f504c17c40afeca4ba7b214bf29f1..73f8c942091e3203c7dc831c639225d83c6a8ce4 100644
--- a/srml/system/src/lib.rs
+++ b/srml/system/src/lib.rs
@@ -76,16 +76,20 @@ use serde::Serialize;
 use rstd::prelude::*;
 #[cfg(any(feature = "std", test))]
 use rstd::map;
-use primitives::traits::{self, CheckEqual, SimpleArithmetic, SimpleBitOps, One, Bounded, Lookup,
-	Hash, Member, MaybeDisplay, EnsureOrigin, Digest as DigestT, As, CurrentHeight, BlockNumberToHash,
-	MaybeSerializeDebugButNotDeserialize, MaybeSerializeDebug, StaticLookup
-};
+use primitives::{generic, traits::{self, CheckEqual, SimpleArithmetic,
+	SimpleBitOps, Hash, Member, MaybeDisplay, EnsureOrigin, CurrentHeight, BlockNumberToHash,
+	MaybeSerializeDebugButNotDeserialize, MaybeSerializeDebug, StaticLookup, One, Bounded, Lookup,
+}};
 #[cfg(any(feature = "std", test))]
 use primitives::traits::Zero;
 use substrate_primitives::storage::well_known_keys;
-use srml_support::{storage, StorageValue, StorageMap, Parameter, decl_module, decl_event, decl_storage};
+use srml_support::{
+	storage, decl_module, decl_event, decl_storage, StorageDoubleMap, StorageValue,
+	StorageMap, Parameter, for_each_tuple, traits::Contains
+};
 use safe_mix::TripletMix;
 use parity_codec::{Encode, Decode};
+use crate::{self as system};
 
 #[cfg(any(feature = "std", test))]
 use runtime_io::{twox_128, TestExternalities, Blake2Hasher};
@@ -99,10 +103,24 @@ pub trait OnNewAccount {
 	fn on_new_account(who: &AccountId);
 }
 
-impl OnNewAccount for () {
-	fn on_new_account(_who: &AccountId) {}
+macro_rules! impl_on_new_account {
+	() => (
+		impl OnNewAccount for () {
+			fn on_new_account(_: &AccountId) {}
+		}
+	);
+
+	( $($t:ident)* ) => {
+		impl),*> OnNewAccount for ($($t,)*) {
+			fn on_new_account(who: &AccountId) {
+				$($t::on_new_account(who);)*
+			}
+		}
+	}
 }
 
+for_each_tuple!(impl_on_new_account);
+
 /// Determiner to say whether a given account is unused.
 pub trait IsDeadAccount {
 	/// Is the given account dead?
@@ -128,7 +146,7 @@ pub fn extrinsics_data_root(xts: Vec>) -> H::Output {
 
 pub trait Trait: 'static + Eq + Clone {
 	/// The aggregated `Origin` type used by dispatchable calls.
-	type Origin: Into>> + From>;
+	type Origin: Into, Self::Origin>> + From>;
 
 	/// Account index (aka nonce) type. This stores the number of previous transactions associated with a sender
 	/// account.
@@ -148,10 +166,6 @@ pub trait Trait: 'static + Eq + Clone {
 	/// The hashing system (algorithm) being used in the runtime (e.g. Blake2).
 	type Hashing: Hash;
 
-	/// Collection of (light-client-relevant) logs for a block to be included verbatim in the block header.
-	type Digest:
-		Parameter + Member + MaybeSerializeDebugButNotDeserialize + Default + traits::Digest;
-
 	/// The user account identifier type for the runtime.
 	type AccountId: Parameter + Member + MaybeSerializeDebug + MaybeDisplay + Ord + Default;
 
@@ -166,33 +180,51 @@ pub trait Trait: 'static + Eq + Clone {
 	type Header: Parameter + traits::Header<
 		Number = Self::BlockNumber,
 		Hash = Self::Hash,
-		Digest = Self::Digest
 	>;
 
 	/// The aggregated event type of the runtime.
 	type Event: Parameter + Member + From;
-
-	/// A piece of information that can be part of the digest (as a digest item).
-	type Log: From> + Into>;
 }
 
-pub type DigestItemOf = <::Digest as traits::Digest>::Item;
+pub type DigestOf = generic::Digest<::Hash>;
+pub type DigestItemOf = generic::DigestItem<::Hash>;
+
+pub type Key = Vec;
+pub type KeyValue = (Vec, Vec);
 
 decl_module! {
 	pub struct Module for enum Call where origin: T::Origin {
 		/// Deposits an event into this block's event record.
 		pub fn deposit_event(event: T::Event) {
-			let extrinsic_index = Self::extrinsic_index();
-			let phase = extrinsic_index.map_or(Phase::Finalization, |c| Phase::ApplyExtrinsic(c));
-			let event = EventRecord { phase, event };
-
-			// Appending can only fail if `Events` can not be decoded or
-			// when we try to insert more than `u32::max_value()` events.
-			// If one of these conditions is met, we just insert the new event.
-			let events = [event];
-			if >::append(&events).is_err() {
-				let [event] = events;
-				>::put(vec![event]);
+			Self::deposit_event_indexed(&[], event);
+		}
+
+		/// Make some on-chain remark.
+		fn remark(origin, _remark: Vec) {
+			ensure_signed(origin)?;
+		}
+
+		/// Set the number of pages in the WebAssembly environment's heap.
+		fn set_heap_pages(pages: u64) {
+			storage::unhashed::put_raw(well_known_keys::HEAP_PAGES, &pages.encode());
+		}
+
+		/// Set the new code.
+		pub fn set_code(new: Vec) {
+			storage::unhashed::put_raw(well_known_keys::CODE, &new);
+		}
+
+		/// Set some items of storage.
+		fn set_storage(items: Vec) {
+			for i in &items {
+				storage::unhashed::put_raw(&i.0, &i.1);
+			}
+		}
+
+		/// Kill some items from storage.
+		fn kill_storage(keys: Vec) {
+			for key in &keys {
+				storage::unhashed::kill(&key);
 			}
 		}
 	}
@@ -211,11 +243,13 @@ pub enum Phase {
 /// Record of an event happening.
 #[derive(Encode, Decode)]
 #[cfg_attr(feature = "std", derive(Serialize, PartialEq, Eq, Clone, Debug))]
-pub struct EventRecord {
+pub struct EventRecord {
 	/// The phase of the block it happened in.
 	pub phase: Phase,
 	/// The event itself.
 	pub event: E,
+	/// The list of the topics this event has.
+	pub topics: Vec,
 }
 
 decl_event!(
@@ -254,38 +288,6 @@ impl From> for RawOrigin {
 /// Exposed trait-generic origin type.
 pub type Origin = RawOrigin<::AccountId>;
 
-pub type Log = RawLog<
-	::Hash,
->;
-
-/// A log in this module.
-#[cfg_attr(feature = "std", derive(Serialize, Debug))]
-#[derive(Encode, Decode, PartialEq, Eq, Clone)]
-pub enum RawLog {
-	/// Changes trie has been computed for this block. Contains the root of
-	/// changes trie.
-	ChangesTrieRoot(Hash),
-}
-
-impl RawLog {
-	/// Try to cast the log entry as ChangesTrieRoot log entry.
-	pub fn as_changes_trie_root(&self) -> Option<&Hash> {
-		match *self {
-			RawLog::ChangesTrieRoot(ref item) => Some(item),
-		}
-	}
-}
-
-// Implementation for tests outside of this crate.
-#[cfg(any(feature = "std", test))]
-impl From> for primitives::testing::DigestItem {
-	fn from(log: RawLog) -> primitives::testing::DigestItem {
-		match log {
-			RawLog::ChangesTrieRoot(root) => primitives::generic::DigestItem::ChangesTrieRoot(root),
-		}
-	}
-}
-
 // Create a Hash with 69 for each byte,
 // only used to build genesis config.
 #[cfg(feature = "std")]
@@ -295,14 +297,20 @@ fn hash69 + Default>() -> T {
 	h
 }
 
+/// This type alias represents an index of an event.
+///
+/// We use `u32` here because this index is used as index for `Events`
+/// which can't contain more than `u32::max_value()` items.
+type EventIndex = u32;
+
 decl_storage! {
 	trait Store for Module as System {
 		/// Extrinsics nonce for accounts.
 		pub AccountNonce get(account_nonce): map T::AccountId => T::Index;
 		/// Total extrinsics count for the current block.
 		ExtrinsicCount: Option;
-		/// Total length in bytes for all extrinsics put together, for the current block.
-		AllExtrinsicsLen: Option;
+		/// Total weight for all extrinsics put together, for the current block.
+		AllExtrinsicsWeight: Option;
 		/// Map of block numbers to block hashes.
 		pub BlockHash get(block_hash) build(|_| vec![(T::BlockNumber::zero(), hash69())]): map T::BlockNumber => T::Hash;
 		/// Extrinsics data for the current block (maps an extrinsic's index to its data).
@@ -311,22 +319,48 @@ decl_storage! {
 		/// ring buffer with the `i8` prefix being the index into the `Vec` of the oldest hash.
 		RandomMaterial get(random_material): (i8, Vec);
 		/// The current block number being processed. Set by `execute_block`.
-		Number get(block_number) build(|_| T::BlockNumber::sa(1u64)): T::BlockNumber;
+		Number get(block_number) build(|_| 1.into()): T::BlockNumber;
 		/// Hash of the previous block.
 		ParentHash get(parent_hash) build(|_| hash69()): T::Hash;
 		/// Extrinsics root of the current block, also part of the block header.
 		ExtrinsicsRoot get(extrinsics_root): T::Hash;
 		/// Digest of the current block, also part of the block header.
-		Digest get(digest): T::Digest;
+		Digest get(digest): DigestOf;
 		/// Events deposited for the current block.
-		Events get(events): Vec>;
+		Events get(events): Vec>;
+		/// The number of events in the `Events` list.
+		EventCount get(event_count): EventIndex;
+
+		// TODO: https://github.com/paritytech/substrate/issues/2553
+		// Possibly, we can improve it by using something like:
+		// `Option<(BlockNumber, Vec)>`, however in this case we won't be able to use
+		// `EventTopics::append`.
+
+		/// Mapping between a topic (represented by T::Hash) and a vector of indexes
+		/// of events in the `>` list.
+		///
+		/// The first key serves no purpose. This field is declared as double_map just
+		/// for convenience of using `remove_prefix`.
+		///
+		/// All topic vectors have deterministic storage locations depending on the topic. This
+		/// allows light-clients to leverage the changes trie storage tracking mechanism and
+		/// in case of changes fetch the list of events of interest.
+		///
+		/// The value has the type `(T::BlockNumber, EventIndex)` because if we used only just
+		/// the `EventIndex` then in case if the topic has the same contents on the next block
+		/// no notification will be triggered thus the event might be lost.
+		EventTopics get(event_topics): double_map hasher(blake2_256) (), blake2_256(T::Hash)
+			=> Vec<(T::BlockNumber, EventIndex)>;
 	}
 	add_extra_genesis {
 		config(changes_trie_config): Option;
+		#[serde(with = "substrate_primitives::bytes")]
+		config(code): Vec;
 
 		build(|storage: &mut primitives::StorageOverlay, _: &mut primitives::ChildrenStorageOverlay, config: &GenesisConfig| {
 			use parity_codec::Encode;
 
+			storage.insert(well_known_keys::CODE.to_vec(), config.code.clone());
 			storage.insert(well_known_keys::EXTRINSIC_INDEX.to_vec(), 0u32.encode());
 
 			if let Some(ref changes_trie_config) = config.changes_trie_config {
@@ -339,45 +373,150 @@ decl_storage! {
 }
 
 pub struct EnsureRoot(::rstd::marker::PhantomData);
-impl>>, AccountId> EnsureOrigin for EnsureRoot {
+impl<
+	O: Into, O>> + From>,
+	AccountId,
+> EnsureOrigin for EnsureRoot {
 	type Success = ();
-	fn ensure_origin(o: O) -> Result {
-		ensure_root(o)
+	fn try_origin(o: O) -> Result {
+		o.into().and_then(|o| match o {
+			RawOrigin::Root => Ok(()),
+			r => Err(O::from(r)),
+		})
+	}
+}
+
+pub struct EnsureSigned(::rstd::marker::PhantomData);
+impl<
+	O: Into, O>> + From>,
+	AccountId,
+> EnsureOrigin for EnsureSigned {
+	type Success = AccountId;
+	fn try_origin(o: O) -> Result {
+		o.into().and_then(|o| match o {
+			RawOrigin::Signed(who) => Ok(who),
+			r => Err(O::from(r)),
+		})
+	}
+}
+
+pub struct EnsureSignedBy(::rstd::marker::PhantomData<(Who, AccountId)>);
+impl<
+	O: Into, O>> + From>,
+	Who: Contains,
+	AccountId: PartialEq + Clone,
+> EnsureOrigin for EnsureSignedBy {
+	type Success = AccountId;
+	fn try_origin(o: O) -> Result {
+		o.into().and_then(|o| match o {
+			RawOrigin::Signed(ref who) if Who::contains(who) => Ok(who.clone()),
+			r => Err(O::from(r)),
+		})
+	}
+}
+
+pub struct EnsureNone(::rstd::marker::PhantomData);
+impl<
+	O: Into, O>> + From>,
+	AccountId,
+> EnsureOrigin for EnsureNone {
+	type Success = ();
+	fn try_origin(o: O) -> Result {
+		o.into().and_then(|o| match o {
+			RawOrigin::None => Ok(()),
+			r => Err(O::from(r)),
+		})
+	}
+}
+
+pub struct EnsureNever(::rstd::marker::PhantomData);
+impl EnsureOrigin for EnsureNever {
+	type Success = T;
+	fn try_origin(o: O) -> Result {
+		Err(o)
 	}
 }
 
 /// Ensure that the origin `o` represents a signed extrinsic (i.e. transaction).
 /// Returns `Ok` with the account that signed the extrinsic or an `Err` otherwise.
 pub fn ensure_signed(o: OuterOrigin) -> Result
-	where OuterOrigin: Into>>
+	where OuterOrigin: Into, OuterOrigin>>
 {
 	match o.into() {
-		Some(RawOrigin::Signed(t)) => Ok(t),
+		Ok(RawOrigin::Signed(t)) => Ok(t),
 		_ => Err("bad origin: expected to be a signed origin"),
 	}
 }
 
 /// Ensure that the origin `o` represents the root. Returns `Ok` or an `Err` otherwise.
 pub fn ensure_root(o: OuterOrigin) -> Result<(), &'static str>
-	where OuterOrigin: Into>>
+	where OuterOrigin: Into, OuterOrigin>>
 {
 	match o.into() {
-		Some(RawOrigin::Root) => Ok(()),
+		Ok(RawOrigin::Root) => Ok(()),
 		_ => Err("bad origin: expected to be a root origin"),
 	}
 }
 
 /// Ensure that the origin `o` represents an unsigned extrinsic. Returns `Ok` or an `Err` otherwise.
 pub fn ensure_none(o: OuterOrigin) -> Result<(), &'static str>
-	where OuterOrigin: Into>>
+	where OuterOrigin: Into, OuterOrigin>>
 {
 	match o.into() {
-		Some(RawOrigin::None) => Ok(()),
+		Ok(RawOrigin::None) => Ok(()),
 		_ => Err("bad origin: expected to be no origin"),
 	}
 }
 
 impl Module {
+	/// Deposits an event into this block's event record adding this event
+	/// to the corresponding topic indexes.
+	///
+	/// This will update storage entries that correspond to the specified topics.
+	/// It is expected that light-clients could subscribe to this topics.
+	pub fn deposit_event_indexed(topics: &[T::Hash], event: T::Event) {
+		let extrinsic_index = Self::extrinsic_index();
+		let phase = extrinsic_index.map_or(Phase::Finalization, |c| Phase::ApplyExtrinsic(c));
+		let event = EventRecord {
+			phase,
+			event,
+			topics: topics.iter().cloned().collect::>(),
+		};
+
+		// Index of the to be added event.
+		let event_idx = {
+			let old_event_count = >::get();
+			let new_event_count = match old_event_count.checked_add(1) {
+				// We've reached the maximum number of events at this block, just
+				// don't do anything and leave the event_count unaltered.
+				None => return,
+				Some(nc) => nc,
+			};
+			>::put(new_event_count);
+			old_event_count
+		};
+
+		// Appending can only fail if `Events` can not be decoded or
+		// when we try to insert more than `u32::max_value()` events.
+		//
+		// We perform early return if we've reached the maximum capacity of the event list,
+		// so `Events` seems to be corrupted. Also, this has happened after the start of execution
+		// (since the event list is cleared at the block initialization).
+		if >::append(&[event]).is_err() {
+			// The most sensible thing to do here is to just ignore this event and wait until the
+			// new block.
+			return;
+		}
+
+		let block_no = Self::block_number();
+		for topic in topics {
+			// The same applies here.
+			if >::append(&(), topic, &[(block_no, event_idx)]).is_err() {
+				return;
+			}
+		}
+	}
+
 	/// Gets the index of extrinsic that is currently executing.
 	pub fn extrinsic_index() -> Option {
 		storage::unhashed::get(well_known_keys::EXTRINSIC_INDEX)
@@ -388,16 +527,22 @@ impl Module {
 		>::get().unwrap_or_default()
 	}
 
-	/// Gets a total length of all executed extrinsics.
-	pub fn all_extrinsics_len() -> u32 {
-		>::get().unwrap_or_default()
+	/// Gets a total weight of all executed extrinsics.
+	pub fn all_extrinsics_weight() -> u32 {
+		>::get().unwrap_or_default()
 	}
 
 	/// Start the execution of a particular block.
-	pub fn initialize(number: &T::BlockNumber, parent_hash: &T::Hash, txs_root: &T::Hash) {
+	pub fn initialize(
+		number: &T::BlockNumber,
+		parent_hash: &T::Hash,
+		txs_root: &T::Hash,
+		digest: &DigestOf,
+	) {
 		// populate environment
 		storage::unhashed::put(well_known_keys::EXTRINSIC_INDEX, &0u32);
 		>::put(number);
+		>::put(digest);
 		>::put(parent_hash);
 		>::insert(*number - One::one(), parent_hash);
 		>::put(txs_root);
@@ -408,37 +553,44 @@ impl Module {
 			*index = (*index + 1) % 81;
 		});
 		>::kill();
+		>::kill();
+		>::remove_prefix(&());
 	}
 
 	/// Remove temporary "environment" entries in storage.
 	pub fn finalize() -> T::Header {
 		>::kill();
-		>::kill();
+		>::kill();
 
 		let number = >::take();
 		let parent_hash = >::take();
 		let mut digest = >::take();
 		let extrinsics_root = >::take();
 		let storage_root = T::Hashing::storage_root();
-		let storage_changes_root = T::Hashing::storage_changes_root(parent_hash, number.as_() - 1);
+		let storage_changes_root = T::Hashing::storage_changes_root(parent_hash);
 
 		// we can't compute changes trie root earlier && put it to the Digest
 		// because it will include all currently existing temporaries.
 		if let Some(storage_changes_root) = storage_changes_root {
-			let item = RawLog::ChangesTrieRoot(storage_changes_root);
-			let item = ::Log::from(item).into();
+			let item = generic::DigestItem::ChangesTrieRoot(storage_changes_root);
 			digest.push(item);
 		}
 
-		// > stays to be inspected by the client.
+		// The following fields
+		//
+		// - >
+		// - >
+		// - >
+		//
+		// stay to be inspected by the client and will be cleared by `Self::initialize`.
 
 		::new(number, extrinsics_root, storage_root, parent_hash, digest)
 	}
 
 	/// Deposits a log and ensures it matches the block's log data.
-	pub fn deposit_log(item: ::Item) {
+	pub fn deposit_log(item: DigestItemOf) {
 		let mut l = >::get();
-		traits::Digest::push(&mut l, item);
+		l.push(item);
 		>::put(l);
 	}
 
@@ -474,38 +626,51 @@ impl Module {
 
 	/// Get the basic random seed.
 	///
-	/// In general you won't want to use this, but rather `Self::random` which allows you to give a subject for the
-	/// random result and whose value will be independently low-influence random from any other such seeds.
+	/// In general you won't want to use this, but rather `Self::random` which
+	/// allows you to give a subject for the random result and whose value will
+	/// be independently low-influence random from any other such seeds.
 	pub fn random_seed() -> T::Hash {
 		Self::random(&[][..])
 	}
 
 	/// Get a low-influence "random" value.
 	///
-	/// Being a deterministic block chain, real randomness is difficult to come by. This gives you something that
-	/// approximates it. `subject` is a context identifier and allows you to get a different result to other callers
-	/// of this function; use it like `random(&b"my context"[..])`.
+	/// Being a deterministic block chain, real randomness is difficult to come
+	/// by. This gives you something that approximates it. `subject` is a
+	/// context identifier and allows you to get a different result to other
+	/// callers of this function; use it like `random(&b"my context"[..])`.
 	///
-	/// This is initially implemented through a low-influence "triplet mix" convolution of previous block hash values.
-	/// In the future it will be generated from a secure "VRF".
+	/// This is initially implemented through a low-influence "triplet mix"
+	/// convolution of previous block hash values. In the future it will be
+	/// generated from a secure verifiable random function (VRF).
 	///
 	/// ### Security Notes
-	/// This randomness uses a low-influence function, drawing upon the block hashes from the previous 81 blocks. Its
-	/// result for any given subject will be known in advance by the block producer of this block (and, indeed, anyone
-	/// who knows the block's `parent_hash`). However, it is mostly impossible for the producer of this block *alone*
-	/// to influence the value of this hash. A sizable minority of dishonest and coordinating block producers would be
-	/// required in order to affect this value. If that is an insufficient security guarantee then two things can be
-	/// used to improve this randomness:
-	/// - Name, in advance, the block number whose random value will be used; ensure your module retains a buffer of
-	/// previous random values for its subject and then index into these in order to obviate the ability of your user
-	/// to look up the parent hash and choose when to transact based upon it.
-	/// - Require your user to first commit to an additional value by first posting its hash. Require them to reveal
-	/// the value to determine the final result, hashing it with the output of this random function. This reduces the
-	/// ability of a cabal of block producers from conspiring against individuals.
 	///
-	/// WARNING: Hashing the result of this function will remove any low-infleunce properties it has and mean that
-	/// all bits of the resulting value are entirely manipulatable by the author of the parent block, who can determine
-	/// the value of `parent_hash`.
+	/// This randomness uses a low-influence function, drawing upon the block
+	/// hashes from the previous 81 blocks. Its result for any given subject
+	/// will be known in advance by the block producer of this block (and,
+	/// indeed, anyone who knows the block's `parent_hash`). However, it is
+	/// mostly impossible for the producer of this block *alone* to influence
+	/// the value of this hash. A sizable minority of dishonest and coordinating
+	/// block producers would be required in order to affect this value. If that
+	/// is an insufficient security guarantee then two things can be used to
+	/// improve this randomness:
+	///
+	/// - Name, in advance, the block number whose random value will be used;
+	///   ensure your module retains a buffer of previous random values for its
+	///   subject and then index into these in order to obviate the ability of
+	///   your user to look up the parent hash and choose when to transact based
+	///   upon it.
+	/// - Require your user to first commit to an additional value by first
+	///   posting its hash. Require them to reveal the value to determine the
+	///   final result, hashing it with the output of this random function. This
+	///   reduces the ability of a cabal of block producers from conspiring
+	///   against individuals.
+	///
+	/// WARNING: Hashing the result of this function will remove any
+	/// low-influnce properties it has and mean that all bits of the resulting
+	/// value are entirely manipulatable by the author of the parent block, who
+	/// can determine the value of `parent_hash`.
 	pub fn random(subject: &[u8]) -> T::Hash {
 		let (index, hash_series) = >::get();
 		if hash_series.len() > 0 {
@@ -527,8 +692,9 @@ impl Module {
 		>::insert(who, Self::account_nonce(who) + T::Index::one());
 	}
 
-	/// Note what the extrinsic data of the current extrinsic index is. If this is called, then
-	/// ensure `derive_extrinsics` is also called before block-building is completed.
+	/// Note what the extrinsic data of the current extrinsic index is. If this
+	/// is called, then ensure `derive_extrinsics` is also called before
+	/// block-building is completed.
 	///
 	/// NOTE: This function is called only when the block is being constructed locally.
 	/// `execute_block` doesn't note any extrinsics.
@@ -544,10 +710,10 @@ impl Module {
 		}.into());
 
 		let next_extrinsic_index = Self::extrinsic_index().unwrap_or_default() + 1u32;
-		let total_length = encoded_len.saturating_add(Self::all_extrinsics_len());
+		let total_length = encoded_len.saturating_add(Self::all_extrinsics_weight());
 
 		storage::unhashed::put(well_known_keys::EXTRINSIC_INDEX, &next_extrinsic_index);
-		>::put(&total_length);
+		>::put(&total_length);
 	}
 
 	/// To be called immediately after `note_applied_extrinsic` of the last extrinsic of the block
@@ -602,7 +768,7 @@ mod tests {
 	use substrate_primitives::H256;
 	use primitives::BuildStorage;
 	use primitives::traits::{BlakeTwo256, IdentityLookup};
-	use primitives::testing::{Digest, DigestItem, Header};
+	use primitives::testing::Header;
 	use srml_support::impl_outer_origin;
 
 	impl_outer_origin!{
@@ -617,12 +783,10 @@ mod tests {
 		type BlockNumber = u64;
 		type Hash = H256;
 		type Hashing = BlakeTwo256;
-		type Digest = Digest;
 		type AccountId = u64;
 		type Lookup = IdentityLookup;
 		type Header = Header;
 		type Event = u16;
-		type Log = DigestItem;
 	}
 
 	impl From for u16 {
@@ -640,19 +804,32 @@ mod tests {
 		GenesisConfig::::default().build_storage().unwrap().0.into()
 	}
 
+	#[test]
+	fn origin_works() {
+		let o = Origin::from(RawOrigin::::Signed(1u64));
+		let x: Result, Origin> = o.into();
+		assert_eq!(x, Ok(RawOrigin::::Signed(1u64)));
+	}
+
 	#[test]
 	fn deposit_event_should_work() {
 		with_externalities(&mut new_test_ext(), || {
-			System::initialize(&1, &[0u8; 32].into(), &[0u8; 32].into());
+			System::initialize(&1, &[0u8; 32].into(), &[0u8; 32].into(), &Default::default());
 			System::note_finished_extrinsics();
 			System::deposit_event(1u16);
 			System::finalize();
 			assert_eq!(
 				System::events(),
-				vec![EventRecord { phase: Phase::Finalization, event: 1u16 }]
+				vec![
+					EventRecord {
+						phase: Phase::Finalization,
+						event: 1u16,
+						topics: vec![],
+					}
+				]
 			);
 
-			System::initialize(&2, &[0u8; 32].into(), &[0u8; 32].into());
+			System::initialize(&2, &[0u8; 32].into(), &[0u8; 32].into(), &Default::default());
 			System::deposit_event(42u16);
 			System::note_applied_extrinsic(&Ok(()), 0);
 			System::note_applied_extrinsic(&Err(""), 0);
@@ -660,11 +837,71 @@ mod tests {
 			System::deposit_event(3u16);
 			System::finalize();
 			assert_eq!(System::events(), vec![
-				EventRecord { phase: Phase::ApplyExtrinsic(0), event: 42u16 },
-				EventRecord { phase: Phase::ApplyExtrinsic(0), event: 100u16 },
-				EventRecord { phase: Phase::ApplyExtrinsic(1), event: 101u16 },
-				EventRecord { phase: Phase::Finalization, event: 3u16 }
+				EventRecord { phase: Phase::ApplyExtrinsic(0), event: 42u16, topics: vec![] },
+				EventRecord { phase: Phase::ApplyExtrinsic(0), event: 100u16, topics: vec![] },
+				EventRecord { phase: Phase::ApplyExtrinsic(1), event: 101u16, topics: vec![] },
+				EventRecord { phase: Phase::Finalization, event: 3u16, topics: vec![] }
 			]);
 		});
 	}
+
+	#[test]
+	fn deposit_event_topics() {
+		with_externalities(&mut new_test_ext(), || {
+			const BLOCK_NUMBER: u64 = 1;
+
+			System::initialize(&BLOCK_NUMBER, &[0u8; 32].into(), &[0u8; 32].into(), &Default::default());
+			System::note_finished_extrinsics();
+
+			let topics = vec![
+				H256::repeat_byte(1),
+				H256::repeat_byte(2),
+				H256::repeat_byte(3),
+			];
+
+			// We deposit a few events with different sets of topics.
+			System::deposit_event_indexed(&topics[0..3], 1u16);
+			System::deposit_event_indexed(&topics[0..1], 2u16);
+			System::deposit_event_indexed(&topics[1..2], 3u16);
+
+			System::finalize();
+
+			// Check that topics are reflected in the event record.
+			assert_eq!(
+				System::events(),
+				vec![
+					EventRecord {
+						phase: Phase::Finalization,
+						event: 1u16,
+						topics: topics[0..3].to_vec(),
+					},
+					EventRecord {
+						phase: Phase::Finalization,
+						event: 2u16,
+						topics: topics[0..1].to_vec(),
+					},
+					EventRecord {
+						phase: Phase::Finalization,
+						event: 3u16,
+						topics: topics[1..2].to_vec(),
+					}
+				]
+			);
+
+			// Check that the topic-events mapping reflects the deposited topics.
+			// Note that these are indexes of the events.
+			assert_eq!(
+				System::event_topics(&(), &topics[0]),
+				vec![(BLOCK_NUMBER, 0), (BLOCK_NUMBER, 1)],
+			);
+			assert_eq!(
+				System::event_topics(&(), &topics[1]),
+				vec![(BLOCK_NUMBER, 0), (BLOCK_NUMBER, 2)],
+			);
+			assert_eq!(
+				System::event_topics(&(), &topics[2]),
+				vec![(BLOCK_NUMBER, 0)],
+			);
+		});
+	}
 }
diff --git a/srml/timestamp/src/lib.rs b/srml/timestamp/src/lib.rs
index bc998a8539653c1db224b5c20d656b46267b269d..e9c0d85a20a0522205aa381916acfe899ea59080 100644
--- a/srml/timestamp/src/lib.rs
+++ b/srml/timestamp/src/lib.rs
@@ -87,6 +87,7 @@
 
 #![cfg_attr(not(feature = "std"), no_std)]
 
+use rstd::{result, ops::{Mul, Div}, cmp};
 use parity_codec::Encode;
 #[cfg(feature = "std")]
 use parity_codec::Decode;
@@ -94,9 +95,8 @@ use parity_codec::Decode;
 use inherents::ProvideInherentData;
 use srml_support::{StorageValue, Parameter, decl_storage, decl_module};
 use srml_support::for_each_tuple;
-use runtime_primitives::traits::{As, SimpleArithmetic, Zero};
+use runtime_primitives::traits::{SimpleArithmetic, Zero, SaturatedConversion};
 use system::ensure_none;
-use rstd::{result, ops::{Mul, Div}, cmp};
 use inherents::{RuntimeString, InherentIdentifier, ProvideInherent, IsFatalError, InherentData};
 
 /// The identifier for the `timestamp` inherent.
@@ -252,7 +252,7 @@ decl_module! {
 decl_storage! {
 	trait Store for Module as Timestamp {
 		/// Current time for the current block.
-		pub Now get(now) build(|_| T::Moment::sa(0)): T::Moment;
+		pub Now get(now) build(|_| 0.into()): T::Moment;
 
 		/// Old storage item provided for compatibility. Remove after all networks upgraded.
 		// TODO: #2133
@@ -262,7 +262,7 @@ decl_storage! {
 		/// that the block production apparatus provides. Your chosen consensus system will generally
 		/// work with this to determine a sensible block time. e.g. For Aura, it will be double this
 		/// period on default settings.
-		pub MinimumPeriod get(minimum_period) config(): T::Moment = T::Moment::sa(3);
+		pub MinimumPeriod get(minimum_period) config(): T::Moment = 3.into();
 
 		/// Did the timestamp get updated in this block?
 		DidUpdate: bool;
@@ -297,23 +297,25 @@ impl ProvideInherent for Module {
 	const INHERENT_IDENTIFIER: InherentIdentifier = INHERENT_IDENTIFIER;
 
 	fn create_inherent(data: &InherentData) -> Option {
-		let data = extract_inherent_data(data).expect("Gets and decodes timestamp inherent data");
+		let data: T::Moment = extract_inherent_data(data)
+			.expect("Gets and decodes timestamp inherent data")
+			.saturated_into();
 
-		let next_time = cmp::max(As::sa(data), Self::now() + >::get());
+		let next_time = cmp::max(data, Self::now() + >::get());
 		Some(Call::set(next_time.into()))
 	}
 
 	fn check_inherent(call: &Self::Call, data: &InherentData) -> result::Result<(), Self::Error> {
 		const MAX_TIMESTAMP_DRIFT: u64 = 60;
 
-		let t = match call {
-			Call::set(ref t) => t.clone(),
+		let t: u64 = match call {
+			Call::set(ref t) => t.clone().saturated_into::(),
 			_ => return Ok(()),
-		}.as_();
+		};
 
 		let data = extract_inherent_data(data).map_err(|e| InherentError::Other(e))?;
 
-		let minimum = (Self::now() + >::get()).as_();
+		let minimum = (Self::now() + >::get()).saturated_into::();
 		if t > data + MAX_TIMESTAMP_DRIFT {
 			Err(InherentError::Other("Timestamp too far in future to accept".into()))
 		} else if t < minimum {
@@ -333,7 +335,7 @@ mod tests {
 	use substrate_primitives::H256;
 	use runtime_primitives::BuildStorage;
 	use runtime_primitives::traits::{BlakeTwo256, IdentityLookup};
-	use runtime_primitives::testing::{Digest, DigestItem, Header};
+	use runtime_primitives::testing::Header;
 
 	impl_outer_origin! {
 		pub enum Origin for Test {}
@@ -347,12 +349,10 @@ mod tests {
 		type BlockNumber = u64;
 		type Hash = H256;
 		type Hashing = BlakeTwo256;
-		type Digest = Digest;
 		type AccountId = u64;
 		type Lookup = IdentityLookup;
 		type Header = Header;
 		type Event = ();
-		type Log = DigestItem;
 	}
 	impl Trait for Test {
 		type Moment = u64;
diff --git a/srml/treasury/src/lib.rs b/srml/treasury/src/lib.rs
index c0a43bc8f663d7b28176ee73bf57c5cbb9a4995f..95fa90f88ff5f543daf03d8145b98a19f315249d 100644
--- a/srml/treasury/src/lib.rs
+++ b/srml/treasury/src/lib.rs
@@ -15,47 +15,55 @@
 // along with Substrate.  If not, see .
 
 //! # Treasury Module
-//! 
-//! The `treasury` module keeps account of currency in a `pot` and manages the subsequent
-//! deployment of these funds.
-//! 
+//!
+//! The Treasury module provides a "pot" of funds that can be managed by stakeholders in the
+//! system and a structure for making spending proposals from this pot.
+//!
+//! - [`treasury::Trait`](./trait.Trait.html)
+//! - [`Call`](./enum.Call.html)
+//!
 //! ## Overview
-//! 
-//! Funds for treasury are raised in two ways:
-//! 1. By minting new tokens, leading to inflation, and
-//! 2. By channeling tokens from transaction fees and slashing.
-//! 
-//! Treasury funds can be used to pay for developers who provide software updates,
-//! any changes decided by referenda, and to generally keep the system running smoothly. 
-//! 
-//! Treasury can be used with other modules, such as to tax validator rewards in the `staking` module.
-//! 
-//! ### Implementations 
-//! 
+//!
+//! The Treasury Module itself provides the pot to store funds, and a means for stakeholders to
+//! propose, approve, and deny expendatures.  The chain will need to provide a method (e.g.
+//! inflation, fees) for collecting funds.
+//!
+//! By way of example, the Council could vote to fund the Treasury with a portion of the block
+//! reward and use the funds to pay developers.
+//!
+//! ### Terminology
+//!
+//! - **Proposal:** A suggestion to allocate funds from the pot to a beneficiary.
+//! - **Beneficiary:** An account who will receive the funds from a proposal iff
+//! the proposal is approved.
+//! - **Deposit:** Funds that a proposer must lock when making a proposal. The
+//! deposit will be returned or slashed if the proposal is approved or rejected
+//! respectively.
+//! - **Pot:** Unspent funds accumulated by the treasury module.
+//!
+//! ### Implementations
+//!
 //! The treasury module provides an implementation for the following trait:
-//! - `OnDilution` - Mint extra funds upon dilution; maintain the ratio of `portion` diluted to `total_issuance`.
-//! 
+//!
+//! - `OnDilution` - When new funds are minted to reward the deployment of other existing funds,
+//! a corresponding amount of tokens are minted into the treasury so that the tokens being rewarded
+//! do not represent a higher portion of total supply. For example, in the default substrate node,
+//! when validators are rewarded new tokens for staking, they do not hold a higher portion of total
+//! tokens. Rather, tokens are added to the treasury to keep the portion of tokens staked constant.
+//!
 //! ## Interface
-//! 
+//!
 //! ### Dispatchable Functions
-//! 
-//! - `propose_spend` - Propose a spending proposal and stake a proposal deposit.
+//!
+//! - `propose_spend` - Make a spending proposal and stake the required deposit.
 //! - `set_pot` - Set the spendable balance of funds.
 //! - `configure` - Configure the module's proposal requirements.
-//! - `reject_proposal` - Reject a proposal and slash the deposit.
-//! - `approve_proposal` - Accept the proposal and return the deposit.
-//! 
-//! Please refer to the [`Call`](./enum.Call.html) enum and its associated variants for documentation on each function.
-//! 
-//! ### Public Functions
-//! 
-//! See the [module](./struct.Module.html) for details on publicly available functions.
-//! 
-//! ## Related Modules
-//! 
-//! The treasury module depends on the `system` and `srml_support` modules as well as
-//! Substrate Core libraries and the Rust standard library.
-//! 
+//! - `reject_proposal` - Reject a proposal, slashing the deposit.
+//! - `approve_proposal` - Accept the proposal, returning the deposit.
+//!
+//! ## GenesisConfig
+//!
+//! The Treasury module depends on the [`GenesisConfig`](./struct.GenesisConfig.html).
 
 #![cfg_attr(not(feature = "std"), no_std)]
 
@@ -64,7 +72,9 @@ use serde::{Serialize, Deserialize};
 use rstd::prelude::*;
 use srml_support::{StorageValue, StorageMap, decl_module, decl_storage, decl_event, ensure};
 use srml_support::traits::{Currency, ReservableCurrency, OnDilution, OnUnbalanced, Imbalance};
-use runtime_primitives::{Permill, traits::{Zero, EnsureOrigin, StaticLookup}};
+use runtime_primitives::{Permill,
+	traits::{Zero, EnsureOrigin, StaticLookup, Saturating, CheckedSub, CheckedMul}
+};
 use parity_codec::{Encode, Decode};
 use system::ensure_signed;
 
@@ -100,6 +110,12 @@ decl_module! {
 		/// Put forward a suggestion for spending. A deposit proportional to the value
 		/// is reserved and slashed if the proposal is rejected. It is returned once the
 		/// proposal is awarded.
+		///
+		/// # 
+		/// - O(1).
+		/// - Limited storage reads.
+		/// - One DB change, one extra DB entry.
+		/// # 
 		fn propose_spend(
 			origin,
 			#[compact] value: BalanceOf,
@@ -139,6 +155,12 @@ decl_module! {
 		}
 
 		/// Reject a proposed spend. The original deposit will be slashed.
+		///
+		/// # 
+		/// - O(1).
+		/// - Limited storage reads.
+		/// - One DB clear.
+		/// # 
 		fn reject_proposal(origin, #[compact] proposal_id: ProposalIndex) {
 			T::RejectOrigin::ensure_origin(origin)?;
 			let proposal = >::take(proposal_id).ok_or("No proposal at that index")?;
@@ -150,6 +172,12 @@ decl_module! {
 
 		/// Approve a proposal. At a later time, the proposal will be allocated to the beneficiary
 		/// and the original deposit will be returned.
+		///
+		/// # 
+		/// - O(1).
+		/// - Limited storage reads.
+		/// - One DB change.
+		/// # 
 		fn approve_proposal(origin, #[compact] proposal_id: ProposalIndex) {
 			T::ApproveOrigin::ensure_origin(origin)?;
 
@@ -181,8 +209,8 @@ decl_storage! {
 	trait Store for Module as Treasury {
 		// Config...
 
-		/// Proportion of funds that should be bonded in order to place a proposal. An accepted
-		/// proposal gets these back. A rejected proposal doesn't.
+		/// Fraction of a proposal's value that should be bonded in order to place the proposal.
+		/// An accepted proposal gets these back. A rejected proposal does not.
 		ProposalBond get(proposal_bond) config(): Permill;
 
 		/// Minimum amount of funds that should be placed in a deposit for making a proposal.
@@ -291,8 +319,12 @@ impl OnDilution> for Module {
 		// pre dilution and post-dilution.
 		if !minted.is_zero() && !portion.is_zero() {
 			let total_issuance = T::Currency::total_issuance();
-			let funding = (total_issuance - portion) / portion * minted;
-			>::mutate(|x| *x += funding);
+			if let Some(funding) = total_issuance.checked_sub(&portion) {
+				let funding = funding / portion;
+				if let Some(funding) = funding.checked_mul(&minted) {
+					>::mutate(|x| *x = x.saturating_add(funding));
+				}
+			}
 		}
 	}
 }
@@ -306,7 +338,7 @@ mod tests {
 	use substrate_primitives::{H256, Blake2Hasher};
 	use runtime_primitives::BuildStorage;
 	use runtime_primitives::traits::{BlakeTwo256, OnFinalize, IdentityLookup};
-	use runtime_primitives::testing::{Digest, DigestItem, Header};
+	use runtime_primitives::testing::Header;
 
 	impl_outer_origin! {
 		pub enum Origin for Test {}
@@ -320,12 +352,10 @@ mod tests {
 		type BlockNumber = u64;
 		type Hash = H256;
 		type Hashing = BlakeTwo256;
-		type Digest = Digest;
 		type AccountId = u64;
 		type Lookup = IdentityLookup;
 		type Header = Header;
 		type Event = ();
-		type Log = DigestItem;
 	}
 	impl balances::Trait for Test {
 		type Balance = u64;
@@ -501,6 +531,35 @@ mod tests {
 		});
 	}
 
+	#[test]
+	// Note: This test demonstrates that `on_dilution` does not increase the pot with good resolution
+	// with large amounts of the network staked. https://github.com/paritytech/substrate/issues/2579
+	// A fix to 2579 should include a change of this test.
+	fn on_dilution_quantization_effects() {
+		with_externalities(&mut new_test_ext(), || {
+			// minted = 1% of total issuance for all cases
+			let _ = Treasury::set_pot(0);
+			assert_eq!(Balances::total_issuance(), 200);
+
+			Treasury::on_dilution(2, 66);   // portion = 33% of total issuance
+			assert_eq!(Treasury::pot(), 4); // should increase by 4 (200 - 66) / 66 * 2
+
+			Treasury::on_dilution(2, 67);   // portion = 33+eps% of total issuance
+			assert_eq!(Treasury::pot(), 6); // should increase by 2 (200 - 67) / 67 * 2
+
+			Treasury::on_dilution(2, 100);  // portion = 50% of total issuance
+			assert_eq!(Treasury::pot(), 8); // should increase by 2 (200 - 100) / 100 * 2
+
+			// If any more than 50% of the network is staked (i.e. (2 * portion) > total_issuance)
+			// then the pot will not increase.
+			Treasury::on_dilution(2, 101);  // portion = 50+eps% of total issuance
+			assert_eq!(Treasury::pot(), 8); // should increase by 0 (200 - 101) / 101 * 2
+
+			Treasury::on_dilution(2, 134);  // portion = 67% of total issuance
+			assert_eq!(Treasury::pot(), 8); // should increase by 0 (200 - 134) / 134 * 2
+		});
+	}
+
 	#[test]
 	fn pot_underflow_should_not_diminish() {
 		with_externalities(&mut new_test_ext(), || {
diff --git a/subkey/README.adoc b/subkey/README.adoc
index 7fe194eb82b701e0821391eacb465f89454f8add..52770e78ec4432778a5683bd140e25005b877a96 100644
--- a/subkey/README.adoc
+++ b/subkey/README.adoc
@@ -53,3 +53,18 @@ You can use the included vanity generator to find a seed that provides an addres
 ```bash
 subkey vanity 1337
 ```
+
+=== Signing a transaction
+
+Sign a transaction from an encoded `Call`.
+
+```bash
+subkey sign-transaction \
+	--call  \
+	--nonce 0 \
+	--suri  \
+	--password  \
+	--prior-block-hash 
+```
+
+Will output a signed and encoded `UncheckedMortalCompactExtrinsic` as hex.
diff --git a/subkey/src/cli.yml b/subkey/src/cli.yml
index 8b839cd4437e412a6175fe8dfba907d39e074fc6..89190df3624f5e3310ad125eacf98fce2ce622db 100644
--- a/subkey/src/cli.yml
+++ b/subkey/src/cli.yml
@@ -21,6 +21,12 @@ args:
 subcommands:
   - generate:
       about: Generate a random account
+      args:
+        - words:
+            short: w
+            long: words
+            help: The number of words in the phrase to generate. One of 12 (default), 15, 18, 21 and 24.
+            takes_value: true
   - inspect:
       about: Gets a public key and a SS58 address from the provided Secret URI
       args:
@@ -92,3 +98,36 @@ subcommands:
             help: Number of keys to generate
             takes_value: true
             default_value: "1"
+  - sign-transaction:
+      about: Sign transaction from encoded Call. Returns a signed and encoded UncheckedMortalCompactExtrinsic as hex.
+      args:
+        - call:
+            short: c
+            long: call
+            help: The call, hex-encoded.
+            takes_value: true
+            required: true
+        - nonce:
+            short: n
+            long: nonce
+            help: The nonce.
+            takes_value: true
+            required: true
+        - suri:
+            long: suri
+            short: s
+            help: The secret key URI.
+            takes_value: true
+            required: true
+        - password:
+            short: p
+            long: password
+            takes_value: true
+            help: The password for the key.
+            required: true
+        - prior-block-hash:
+            short: h
+            long: prior-block-hash
+            help: The prior block hash, hex-encoded.
+            takes_value: true
+            required: true
diff --git a/subkey/src/main.rs b/subkey/src/main.rs
index b0ad1b281dde8c7716aa4da26732406fa3c52a8f..b38bffd772bbf375491f9060a1784d52b84af59e 100644
--- a/subkey/src/main.rs
+++ b/subkey/src/main.rs
@@ -18,75 +18,48 @@
 #[cfg(feature = "bench")]
 extern crate test;
 
-use std::io::{stdin, Read};
+use std::{str::FromStr, io::{stdin, Read}};
 use hex_literal::hex;
 use clap::load_yaml;
-use rand::{RngCore, rngs::OsRng};
-use substrate_bip39::mini_secret_from_entropy;
 use bip39::{Mnemonic, Language, MnemonicType};
 use substrate_primitives::{ed25519, sr25519, hexdisplay::HexDisplay, Pair, crypto::Ss58Codec, blake2_256};
 use parity_codec::{Encode, Decode, Compact};
 use sr_primitives::generic::Era;
-use schnorrkel::keys::MiniSecretKey;
 use node_primitives::{Balance, Index, Hash};
 use node_runtime::{Call, UncheckedExtrinsic, BalancesCall};
 
 mod vanity;
 
 trait Crypto {
-	type Seed: AsRef<[u8]> + AsMut<[u8]> + Sized + Default;
-	type Pair: Pair;
-	fn generate_phrase() -> String {
-		Mnemonic::new(MnemonicType::Words12, Language::English).phrase().to_owned()
-	}
-	fn generate_seed() -> Self::Seed {
-		let mut seed: Self::Seed = Default::default();
-		OsRng::new().unwrap().fill_bytes(seed.as_mut());
-		seed
-	}
-	fn seed_from_phrase(phrase: &str, password: Option<&str>) -> Self::Seed;
-	fn pair_from_seed(seed: &Self::Seed) -> Self::Pair;
-	fn pair_from_suri(phrase: &str, password: Option<&str>) -> Self::Pair {
-		Self::pair_from_seed(&Self::seed_from_phrase(phrase, password))
-	}
-	fn ss58_from_pair(pair: &Self::Pair) -> String;
-	fn public_from_pair(pair: &Self::Pair) -> Vec;
-	fn seed_from_pair(_pair: &Self::Pair) -> Option<&Self::Seed> { None }
-	fn print_from_seed(seed: &Self::Seed) {
-		let pair = Self::pair_from_seed(seed);
-		println!("Seed 0x{} is account:\n  Public key (hex): 0x{}\n  Address (SS58): {}",
-			HexDisplay::from(&seed.as_ref()),
-			HexDisplay::from(&Self::public_from_pair(&pair)),
-			Self::ss58_from_pair(&pair)
-		);
-	}
-	fn print_from_phrase(phrase: &str, password: Option<&str>) {
-		let seed = Self::seed_from_phrase(phrase, password);
-		let pair = Self::pair_from_seed(&seed);
-		println!("Phrase `{}` is account:\n  Seed: 0x{}\n  Public key (hex): 0x{}\n  Address (SS58): {}",
-			phrase,
-			HexDisplay::from(&seed.as_ref()),
-			HexDisplay::from(&Self::public_from_pair(&pair)),
-			Self::ss58_from_pair(&pair)
-		);
+	type Pair: Pair;
+	type Public: Ss58Codec + AsRef<[u8]>;
+	fn pair_from_suri(suri: &str, password: Option<&str>) -> Self::Pair {
+		Self::Pair::from_string(suri, password).expect("Invalid phrase")
 	}
+	fn ss58_from_pair(pair: &Self::Pair) -> String { pair.public().to_ss58check() }
+	fn public_from_pair(pair: &Self::Pair) -> Vec { pair.public().as_ref().to_owned() }
 	fn print_from_uri(uri: &str, password: Option<&str>) where ::Public: Sized + Ss58Codec + AsRef<[u8]> {
-		if let Ok(pair) = Self::Pair::from_string(uri, password) {
-			let seed_text = Self::seed_from_pair(&pair)
-				.map_or_else(Default::default, |s| format!("\n  Seed: 0x{}", HexDisplay::from(&s.as_ref())));
-			println!("Secret Key URI `{}` is account:{}\n  Public key (hex): 0x{}\n  Address (SS58): {}",
+		if let Ok((pair, seed)) = Self::Pair::from_phrase(uri, password) {
+			println!("Secret phrase `{}` is account:\n  Secret seed: 0x{}\n  Public key (hex): 0x{}\n  Address (SS58): {}",
 				uri,
-				seed_text,
+				HexDisplay::from(&seed.as_ref()),
 				HexDisplay::from(&Self::public_from_pair(&pair)),
 				Self::ss58_from_pair(&pair)
 			);
-		}
-		if let Ok(public) = ::Public::from_string(uri) {
+		} else if let Ok(pair) = Self::Pair::from_string(uri, password) {
+			println!("Secret Key URI `{}` is account:\n  Public key (hex): 0x{}\n  Address (SS58): {}",
+				uri,
+				HexDisplay::from(&Self::public_from_pair(&pair)),
+				Self::ss58_from_pair(&pair)
+			);
+		} else if let Ok(public) = ::Public::from_string(uri) {
 			println!("Public Key URI `{}` is account:\n  Public key (hex): 0x{}\n  Address (SS58): {}",
 				uri,
 				HexDisplay::from(&public.as_ref()),
 				public.to_ss58check()
 			);
+		} else {
+			println!("Invalid phrase/URI given");
 		}
 	}
 }
@@ -94,75 +67,47 @@ trait Crypto {
 struct Ed25519;
 
 impl Crypto for Ed25519 {
-	type Seed = [u8; 32];
 	type Pair = ed25519::Pair;
+	type Public = ed25519::Public;
 
-	fn seed_from_phrase(phrase: &str, password: Option<&str>) -> Self::Seed {
-		Sr25519::seed_from_phrase(phrase, password)
-	}
 	fn pair_from_suri(suri: &str, password_override: Option<&str>) -> Self::Pair {
 		ed25519::Pair::from_legacy_string(suri, password_override)
 	}
-	fn pair_from_seed(seed: &Self::Seed) -> Self::Pair { ed25519::Pair::from_seed(seed.clone()) }
-	fn ss58_from_pair(pair: &Self::Pair) -> String { pair.public().to_ss58check() }
-	fn public_from_pair(pair: &Self::Pair) -> Vec { (&pair.public().0[..]).to_owned() }
-	fn seed_from_pair(pair: &Self::Pair) -> Option<&Self::Seed> { Some(pair.seed()) }
 }
 
 struct Sr25519;
 
 impl Crypto for Sr25519 {
-	type Seed = [u8; 32];
 	type Pair = sr25519::Pair;
-
-	fn seed_from_phrase(phrase: &str, password: Option<&str>) -> Self::Seed {
-		mini_secret_from_entropy(
-			Mnemonic::from_phrase(phrase, Language::English)
-				.unwrap_or_else(|_|
-					panic!("Phrase is not a valid BIP-39 phrase: \n    {}", phrase)
-				)
-				.entropy(),
-			password.unwrap_or("")
-		)
-			.expect("32 bytes can always build a key; qed")
-			.to_bytes()
-	}
-
-	fn pair_from_suri(suri: &str, password: Option<&str>) -> Self::Pair {
-		sr25519::Pair::from_string(suri, password).expect("Invalid phrase")
-	}
-
-	fn pair_from_seed(seed: &Self::Seed) -> Self::Pair {
-		MiniSecretKey::from_bytes(seed)
-			.expect("32 bytes can always build a key; qed")
-			.into()
-	}
-	fn ss58_from_pair(pair: &Self::Pair) -> String { pair.public().to_ss58check() }
-	fn public_from_pair(pair: &Self::Pair) -> Vec { (&pair.public().0[..]).to_owned() }
+	type Public = sr25519::Public;
 }
 
-fn execute>(matches: clap::ArgMatches) where
+fn execute(matches: clap::ArgMatches) where
 	<::Pair as Pair>::Signature: AsRef<[u8]> + AsMut<[u8]> + Default,
 	<::Pair as Pair>::Public: Sized + AsRef<[u8]> + Ss58Codec + AsRef<<::Pair as Pair>::Public>,
 {
 	let password = matches.value_of("password");
 	match matches.subcommand() {
-		("generate", Some(_matches)) => {
+		("generate", Some(matches)) => {
 			// create a new randomly generated mnemonic phrase
-			let mnemonic = Mnemonic::new(MnemonicType::Words12, Language::English);
-			C::print_from_phrase(mnemonic.phrase(), password);
-		},
-		("vanity", Some(matches)) => {
-			let desired: String = matches.value_of("pattern").map(str::to_string).unwrap_or_default();
-			let key = vanity::generate_key::(&desired).expect("Key generation failed");
-			C::print_from_seed(&key.seed);
+			let words = matches.value_of("words")
+				.map(|x| usize::from_str(x).expect("Invalid number given for --words"))
+				.map(|x| MnemonicType::for_word_count(x)
+					.expect("Invalid number of words given for phrase: must be 12/15/18/21/24")
+				).unwrap_or(MnemonicType::Words12);
+			let mnemonic = Mnemonic::new(words, Language::English);
+			C::print_from_uri(mnemonic.phrase(), password);
 		}
 		("inspect", Some(matches)) => {
-			// TODO: Accept public key with derivation path.
 			let uri = matches.value_of("uri")
 				.expect("URI parameter is required; thus it can't be None; qed");
 			C::print_from_uri(uri, password);
-		},
+		}
+		("vanity", Some(matches)) => {
+			let desired: String = matches.value_of("pattern").map(str::to_string).unwrap_or_default();
+			let result = vanity::generate_key::(&desired).expect("Key generation failed");
+			C::print_from_uri(&format!("0x{}", HexDisplay::from(&result.seed.as_ref())), None);
+		}
 		("sign", Some(matches)) => {
 			let suri = matches.value_of("suri")
 				.expect("secret URI parameter is required; thus it can't be None; qed");
@@ -201,7 +146,8 @@ fn execute>(matches: clap::ArgMatches) where
 			let genesis_hash: Hash = match matches.value_of("genesis").unwrap_or("alex") {
 				"elm" => hex!["10c08714a10c7da78f40a60f6f732cf0dba97acfb5e2035445b032386157d5c3"].into(),
 				"alex" => hex!["dcd1346701ca8396496e52aa2785b1748deb6db09551b72159dcb3e08991025b"].into(),
-				h => hex::decode(h).ok().and_then(|x| Decode::decode(&mut &x[..])).expect("Invalid genesis hash or unrecognised chain identifier"),
+				h => hex::decode(h).ok().and_then(|x| Decode::decode(&mut &x[..]))
+          .expect("Invalid genesis hash or unrecognised chain identifier"),
 			};
 
 			println!("Using a genesis hash of {}", HexDisplay::from(&genesis_hash.as_ref()));
@@ -223,6 +169,48 @@ fn execute>(matches: clap::ArgMatches) where
 			);
 			println!("0x{}", hex::encode(&extrinsic.encode()));
 		}
+		("sign-transaction", Some(matches)) => {
+			let s = matches.value_of("suri")
+				.expect("secret URI parameter is required; thus it can't be None; qed");
+			let signer = Sr25519::pair_from_suri(s, password);
+
+			let index = matches.value_of("nonce")
+				.expect("nonce is required; thus it can't be None; qed");
+			let index = str::parse::(index)
+				.expect("Invalid 'index' parameter; expecting an integer.");
+
+			let call = matches.value_of("call")
+				.expect("call is required; thus it can't be None; qed");
+			let function: Call = hex::decode(&call).ok()
+				.and_then(|x| Decode::decode(&mut &x[..])).unwrap();
+
+			let h = matches.value_of("prior-block-hash")
+				.expect("prior-block-hash is required; thus it can't be None; qed");
+			let prior_block_hash: Hash = hex::decode(h).ok()
+				.and_then(|x| Decode::decode(&mut &x[..]))
+				.expect("Invalid prior block hash");
+
+			let era = Era::immortal();
+
+			let raw_payload = (Compact(index), function, era, prior_block_hash);
+			let signature = raw_payload.using_encoded(|payload|
+				if payload.len() > 256 {
+					signer.sign(&blake2_256(payload)[..])
+				} else {
+					signer.sign(payload)
+				}
+			);
+
+			let extrinsic = UncheckedExtrinsic::new_signed(
+				index,
+				raw_payload.1,
+				signer.public().into(),
+				signature.into(),
+				era,
+			);
+
+			println!("0x{}", hex::encode(&extrinsic.encode()));
+		}
 		("verify", Some(matches)) => {
 			let sig_data = matches.value_of("sig")
 				.expect("signature parameter is required; thus it can't be None; qed");
diff --git a/subkey/src/vanity.rs b/subkey/src/vanity.rs
index 400b3bae82a385d25400eb5f98e5b2c5e138c2b3..ea1a609218e65a5efd2b27c90ce0a523baeb142c 100644
--- a/subkey/src/vanity.rs
+++ b/subkey/src/vanity.rs
@@ -16,31 +16,31 @@
 
 use rand::{rngs::OsRng, RngCore};
 use super::Crypto;
+use substrate_primitives::Pair;
 
 fn good_waypoint(done: u64) -> u64 {
 	match done {
-		0 ... 1_000_000 => 100_000,
-		0 ... 10_000_000 => 1_000_000,
-		0 ... 100_000_000 => 10_000_000,
+		0 ..= 1_000_000 => 100_000,
+		0 ..= 10_000_000 => 1_000_000,
+		0 ..= 100_000_000 => 10_000_000,
 		_ => 100_000_000,
 	}
 }
 
-fn next_seed(mut seed: [u8; 32]) -> [u8; 32] {
-	for i in 0..32 {
+fn next_seed(seed: &mut [u8]) {
+	for i in 0..seed.len() {
 		match seed[i] {
 			255 => { seed[i] = 0; }
 			_ => { seed[i] += 1; break; }
 		}
 	}
-	return seed;
 }
 
 /// A structure used to carry both Pair and seed.
 /// This should usually NOT been used. If unsure, use Pair.
 pub(super) struct KeyPair {
 	pub pair: C::Pair,
-	pub seed: C::Seed,
+	pub seed: ::Seed,
 	pub score: usize,
 }
 
@@ -57,7 +57,7 @@ fn calculate_score(_desired: &str, key: &str) -> usize {
 	0
 }
 
-pub(super) fn generate_key>(desired: &str) -> Result, &str> {
+pub(super) fn generate_key(desired: &str) -> Result, &str> {
 	if desired.is_empty() {
 		return Err("Pattern must not be empty");
 	}
@@ -66,18 +66,17 @@ pub(super) fn generate_key>(desired: &str) -> Result::Seed::default();
 	let mut done = 0;
 
-	OsRng::new().unwrap().fill_bytes(&mut seed[..]);
-
 	loop {
-		// reset to a new random seed at beginning and regularly thereafter
 		if done % 100000 == 0 {
-			OsRng::new().unwrap().fill_bytes(&mut seed[..]);
+			OsRng::new().unwrap().fill_bytes(seed.as_mut());
+		} else {
+			next_seed(seed.as_mut());
 		}
 
-		let p = C::pair_from_seed(&seed);
+		let p = C::Pair::from_seed(&seed);
 		let ss58 = C::ss58_from_pair(&p);
 		let score = calculate_score(&desired, &ss58);
 		if score > best || desired.len() < 2 {
@@ -92,7 +91,6 @@ pub(super) fn generate_key>(desired: &str) -> Result"]
+edition = "2018"
+
+[dependencies]
+cli = { package = "substrate-cli", path = "../../core/cli" }
+client = { package = "substrate-client", path = "../../core/client" }
+consensus_common = { package = "substrate-consensus-common", path = "../../core/consensus/common" }
+log = "0.4"
+parity-codec = { version = "3.3", default-features = false, features = ["derive"] }
+primitives = { package = "substrate-primitives", path = "../../core/primitives", default-features = false }
+sr_primitives = { package = "sr-primitives", path = "../../core/sr-primitives", default-features = false }
+substrate-service = { path = "../../core/service" }
+
+[features]
+default = ["std"]
+std = [
+	"parity-codec/std",
+	"primitives/std",
+]
diff --git a/test-utils/transaction-factory/src/complex_mode.rs b/test-utils/transaction-factory/src/complex_mode.rs
new file mode 100644
index 0000000000000000000000000000000000000000..0d383c30256f9390ea8ddf530cc31e6a57c0537b
--- /dev/null
+++ b/test-utils/transaction-factory/src/complex_mode.rs
@@ -0,0 +1,156 @@
+// Copyright 2019 Parity Technologies (UK) Ltd.
+// This file is part of Substrate.
+
+// Substrate is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// Substrate is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with Substrate.  If not, see .
+
+/// This module implements the `MasterToNToM` mode:
+///
+/// Manufacture `num` transactions from the master account to `num`
+/// randomly created accounts. From each of these randomly created
+/// accounts manufacture a transaction to another randomly created
+/// account.
+/// Repeat this round `rounds` times. If `rounds` = 1 the behavior
+/// is the same as `MasterToN`.
+///
+///   A -> B
+///   A -> C
+///   A -> D
+///   ... x `num`
+///
+///   B -> E
+///   C -> F
+///   D -> G
+///   ...
+///   E -> H
+///   F -> I
+///   G -> J
+///   ...
+///   ... x `rounds`
+
+use std::sync::Arc;
+
+use log::info;
+use client::block_builder::api::BlockBuilder;
+use client::runtime_api::ConstructRuntimeApi;
+use sr_primitives::generic::BlockId;
+use sr_primitives::traits::{Block as BlockT, ProvideRuntimeApi, One, Zero};
+use substrate_service::{
+	FactoryBlock, FullClient, ServiceFactory, ComponentClient, FullComponents
+};
+
+use crate::{RuntimeAdapter, create_block};
+
+pub fn next(
+	factory_state: &mut RA,
+	client: &Arc>>,
+	prior_block_hash: ::Hash,
+	prior_block_id: BlockId,
+) -> Option<::Block>
+where
+	F: ServiceFactory,
+	F::RuntimeApi: ConstructRuntimeApi, FullClient>,
+	FullClient: ProvideRuntimeApi,
+	 as ProvideRuntimeApi>::Api: BlockBuilder>,
+	RA: RuntimeAdapter,
+{
+	let total = factory_state.start_number() + factory_state.num() * factory_state.rounds();
+
+	if factory_state.block_no() >= total || factory_state.round() >= factory_state.rounds() {
+		return None;
+	}
+
+	info!(
+		"Round {}: Creating {} transactions in total, {} per round. {} rounds in total.",
+		factory_state.round() + RA::Number::one(),
+		factory_state.num() * factory_state.rounds(),
+		factory_state.num(),
+		factory_state.rounds(),
+	);
+
+	let from = from::(factory_state);
+
+	let seed = factory_state.start_number() + factory_state.block_no();
+	let to = RA::gen_random_account_id(&seed);
+
+	let amount;
+	if factory_state.round() == RA::Number::zero() {
+		amount = RA::minimum_balance() * factory_state.rounds();
+	} else {
+		let rounds_left = factory_state.rounds() - factory_state.round();
+		amount = RA::minimum_balance() * rounds_left;
+	};
+
+	let transfer = factory_state.transfer_extrinsic(
+		&from.0,
+		&from.1,
+		&to,
+		&amount,
+		&prior_block_hash,
+	);
+
+	let inherents = factory_state.inherent_extrinsics();
+	let inherents = client.runtime_api().inherent_extrinsics(&prior_block_id, inherents)
+		.expect("Failed to create inherent extrinsics");
+
+	let block = create_block::(&client, transfer, inherents);
+	info!(
+		"Created block {} with hash {}. Transferring {} from {} to {}.",
+		factory_state.block_no() + RA::Number::one(),
+		prior_block_hash,
+		amount,
+		from.0,
+		to
+	);
+
+	factory_state.set_block_no(factory_state.block_no() + RA::Number::one());
+
+	let new_round = factory_state.block_no() > RA::Number::zero()
+		&& factory_state.block_no() % factory_state.num() == RA::Number::zero();
+	if new_round {
+		factory_state.set_round(factory_state.round() + RA::Number::one());
+		factory_state.set_block_in_round(RA::Number::zero());
+	} else {
+		factory_state.set_block_in_round(factory_state.block_in_round() + RA::Number::one());
+	}
+
+	Some(block)
+}
+
+/// Return the account which received tokens at this point in the previous round.
+fn from(
+	factory_state: &mut RA
+) -> (::AccountId, ::Secret)
+where RA: RuntimeAdapter
+{
+	let is_first_round = factory_state.round() == RA::Number::zero();
+	match is_first_round {
+		true => {
+			// first round always uses master account
+			(RA::master_account_id(), RA::master_account_secret())
+		},
+		_ => {
+			// the account to which was sent in the last round
+			let is_round_one = factory_state.round() == RA::Number::one();
+			let seed = match is_round_one {
+				true => factory_state.start_number() + factory_state.block_in_round(),
+				_ => {
+					let block_no_in_prior_round =
+						factory_state.num() * (factory_state.round() - RA::Number::one()) + factory_state.block_in_round();
+					factory_state.start_number() + block_no_in_prior_round
+				}
+			};
+			(RA::gen_random_account_id(&seed), RA::gen_random_account_secret(&seed))
+		},
+	}
+}
diff --git a/test-utils/transaction-factory/src/lib.rs b/test-utils/transaction-factory/src/lib.rs
new file mode 100644
index 0000000000000000000000000000000000000000..8f292f3a02a2e48b6106e2ae8da8ea55d12ec68d
--- /dev/null
+++ b/test-utils/transaction-factory/src/lib.rs
@@ -0,0 +1,180 @@
+// Copyright 2019 Parity Technologies (UK) Ltd.
+// This file is part of Substrate.
+
+// Substrate is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// Substrate is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with Substrate.  If not, see .
+
+//! Simple transaction factory which distributes tokens from a master
+//! account to a specified number of newly created accounts.
+//!
+//! The factory currently only works on an empty database!
+
+use std::collections::HashMap;
+use std::sync::Arc;
+use std::ops::Mul;
+use std::cmp::PartialOrd;
+use std::fmt::Display;
+
+use log::info;
+
+use client::block_builder::api::BlockBuilder;
+use client::runtime_api::ConstructRuntimeApi;
+use consensus_common::{
+	BlockOrigin, ImportBlock, InherentData, ForkChoiceStrategy,
+	SelectChain
+};
+use consensus_common::block_import::BlockImport;
+use parity_codec::{Decode, Encode};
+use sr_primitives::generic::BlockId;
+use sr_primitives::traits::{
+	Block as BlockT, Header as HeaderT, ProvideRuntimeApi, SimpleArithmetic,
+	One, Zero,
+};
+use substrate_service::{
+	FactoryBlock, FactoryFullConfiguration, FullClient, new_client,
+	ServiceFactory, ComponentClient, FullComponents};
+pub use crate::modes::Mode;
+
+pub mod modes;
+mod complex_mode;
+mod simple_modes;
+
+pub trait RuntimeAdapter {
+	type AccountId: Display;
+	type Balance: Display + Mul;
+	type Block: BlockT;
+	type Index: Copy;
+	type Number: Display + PartialOrd + SimpleArithmetic + Zero + One;
+	type Phase: Copy;
+	type Secret;
+
+	fn new(mode: Mode, rounds: u64, start_number: u64) -> Self;
+
+	fn block_no(&self) -> Self::Number;
+	fn block_in_round(&self) -> Self::Number;
+	fn mode(&self) -> &Mode;
+	fn num(&self) -> Self::Number;
+	fn rounds(&self) -> Self::Number;
+	fn round(&self) -> Self::Number;
+	fn start_number(&self) -> Self::Number;
+
+	fn set_block_in_round(&mut self, val: Self::Number);
+	fn set_block_no(&mut self, val: Self::Number);
+	fn set_round(&mut self, val: Self::Number);
+
+	fn transfer_extrinsic(
+		&self,
+		sender: &Self::AccountId,
+		key: &Self::Secret,
+		destination: &Self::AccountId,
+		amount: &Self::Number,
+		prior_block_hash: &::Hash,
+	) -> ::Extrinsic;
+
+	fn inherent_extrinsics(&self) -> InherentData;
+
+	fn minimum_balance() -> Self::Number;
+	fn master_account_id() -> Self::AccountId;
+	fn master_account_secret() -> Self::Secret;
+	fn extract_index(&self, account_id: &Self::AccountId, block_hash: &::Hash) -> Self::Index;
+	fn extract_phase(&self, block_hash: ::Hash) -> Self::Phase;
+	fn gen_random_account_id(seed: &Self::Number) -> Self::AccountId;
+	fn gen_random_account_secret(seed: &Self::Number) -> Self::Secret;
+}
+
+/// Manufactures transactions. The exact amount depends on
+/// `mode`, `num` and `rounds`.
+pub fn factory(
+	mut factory_state: RA,
+	mut config: FactoryFullConfiguration,
+) -> cli::error::Result<()>
+where
+	F: ServiceFactory,
+	F::RuntimeApi: ConstructRuntimeApi, FullClient>,
+	FullClient: ProvideRuntimeApi,
+	 as ProvideRuntimeApi>::Api: BlockBuilder>,
+	RA: RuntimeAdapter,
+	<::Block as BlockT>::Hash: From,
+{
+	if *factory_state.mode() != Mode::MasterToNToM && factory_state.rounds() > RA::Number::one() {
+		let msg = "The factory can only be used with rounds set to 1 in this mode.".into();
+		return Err(cli::error::Error::Input(msg));
+	}
+
+	let client = new_client::(&config)?;
+
+	let select_chain = F::build_select_chain(&mut config, client.clone())?;
+
+	let best_header: Result<::Header, cli::error::Error> =
+		select_chain.best_chain().map_err(|e| format!("{:?}", e).into());
+	let mut best_hash = best_header?.hash();
+	let best_block_id = BlockId::::hash(best_hash);
+
+	while let Some(block) = match factory_state.mode() {
+		Mode::MasterToNToM =>
+			complex_mode::next::(&mut factory_state, &client, best_hash.into(), best_block_id),
+		_ =>
+			simple_modes::next::(&mut factory_state, &client, best_hash.into(), best_block_id)
+	} {
+		best_hash = block.header().hash();
+		import_block::(&client, block);
+
+		info!("Imported block at {}", factory_state.block_no());
+	}
+
+	Ok(())
+}
+
+/// Create a baked block from a transfer extrinsic and timestamp inherent.
+pub fn create_block(
+	client: &Arc>>,
+	transfer: ::Extrinsic,
+	inherent_extrinsics: Vec<::Extrinsic>,
+) -> ::Block
+where
+	F: ServiceFactory,
+	FullClient: ProvideRuntimeApi,
+	F::RuntimeApi: ConstructRuntimeApi, FullClient>,
+	 as ProvideRuntimeApi>::Api: BlockBuilder>,
+	RA: RuntimeAdapter,
+{
+	let mut block = client.new_block(Default::default()).expect("Failed to create new block");
+	block.push(
+		Decode::decode(&mut &transfer.encode()[..])
+			.expect("Failed to decode transfer extrinsic")
+	).expect("Failed to push transfer extrinsic into block");
+
+	for inherent in inherent_extrinsics {
+		block.push(inherent).expect("Failed ...");
+	}
+
+	block.bake().expect("Failed to bake block")
+}
+
+fn import_block(
+	client: &Arc>>,
+	block: ::Block
+) -> () where F: ServiceFactory
+{
+	let import = ImportBlock {
+		origin: BlockOrigin::File,
+		header: block.header().clone(),
+		post_digests: Vec::new(),
+		body: Some(block.extrinsics().to_vec()),
+		finalized: false,
+		justification: None,
+		auxiliary: Vec::new(),
+		fork_choice: ForkChoiceStrategy::LongestChain,
+	};
+	client.import_block(import, HashMap::new()).expect("Failed to import block");
+}
diff --git a/test-utils/transaction-factory/src/modes.rs b/test-utils/transaction-factory/src/modes.rs
new file mode 100644
index 0000000000000000000000000000000000000000..a212d6aed8c3193d526b6a741536104540f1ea18
--- /dev/null
+++ b/test-utils/transaction-factory/src/modes.rs
@@ -0,0 +1,40 @@
+// Copyright 2019 Parity Technologies (UK) Ltd.
+// This file is part of Substrate.
+
+// Substrate is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// Substrate is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with Substrate.  If not, see .
+
+//! The transaction factory can operate in different modes. See
+//! the `simple_mode` and `complex_mode` modules for details.
+
+use std::str::FromStr;
+
+/// Token distribution modes.
+#[derive(Debug, Clone, PartialEq)]
+pub enum Mode {
+	MasterToN,
+	MasterTo1,
+	MasterToNToM
+}
+
+impl FromStr for Mode {
+	type Err = String;
+	fn from_str(mode: &str) -> Result {
+		match mode {
+			"MasterToN" => Ok(Mode::MasterToN),
+			"MasterTo1" => Ok(Mode::MasterTo1),
+			"MasterToNToM" => Ok(Mode::MasterToNToM),
+			_ => Err(format!("Invalid mode: {}", mode)),
+		}
+	}
+}
diff --git a/test-utils/transaction-factory/src/simple_modes.rs b/test-utils/transaction-factory/src/simple_modes.rs
new file mode 100644
index 0000000000000000000000000000000000000000..4ce7b47e6fc52d2c887964d35150c09dd0fe267b
--- /dev/null
+++ b/test-utils/transaction-factory/src/simple_modes.rs
@@ -0,0 +1,106 @@
+// Copyright 2019 Parity Technologies (UK) Ltd.
+// This file is part of Substrate.
+
+// Substrate is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// Substrate is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with Substrate.  If not, see .
+
+/// This module implements two manufacturing modes:
+///
+/// # MasterToN
+/// Manufacture `num` transactions from the master account
+/// to `num` randomly created accounts, one each.
+///
+///   A -> B
+///   A -> C
+///   ... x `num`
+///
+///
+/// # MasterTo1
+/// Manufacture `num` transactions from the master account
+/// to exactly one other randomly created account.
+///
+///   A -> B
+///   A -> B
+///   ... x `num`
+
+use std::sync::Arc;
+
+use log::info;
+use client::block_builder::api::BlockBuilder;
+use client::runtime_api::ConstructRuntimeApi;
+use sr_primitives::traits::{Block as BlockT, ProvideRuntimeApi, One};
+use sr_primitives::generic::BlockId;
+use substrate_service::{
+	FactoryBlock, FullClient, ServiceFactory, ComponentClient, FullComponents
+};
+
+use crate::{Mode, RuntimeAdapter, create_block};
+
+pub fn next(
+	factory_state: &mut RA,
+	client: &Arc>>,
+	prior_block_hash: ::Hash,
+	prior_block_id: BlockId,
+) -> Option<::Block>
+where
+	F: ServiceFactory,
+	F::RuntimeApi: ConstructRuntimeApi, FullClient>,
+	FullClient: ProvideRuntimeApi,
+	 as ProvideRuntimeApi>::Api: BlockBuilder>,
+	RA: RuntimeAdapter,
+{
+	if factory_state.block_no() >= factory_state.num() {
+		return None;
+	}
+
+	let from = (RA::master_account_id(), RA::master_account_secret());
+
+	let seed = match factory_state.mode() {
+		// choose the same receiver for all transactions
+		Mode::MasterTo1 => factory_state.start_number(),
+
+		// different receiver for each transaction
+		Mode::MasterToN => factory_state.start_number() + factory_state.block_no(),
+		_ => unreachable!("Mode not covered!"),
+	};
+	let to = RA::gen_random_account_id(&seed);
+
+	let amount = RA::minimum_balance();
+
+	let transfer = factory_state.transfer_extrinsic(
+		&from.0,
+		&from.1,
+		&to,
+		&amount,
+		&prior_block_hash,
+	);
+
+	let inherents = RA::inherent_extrinsics(&factory_state);
+	let inherents = client.runtime_api().inherent_extrinsics(&prior_block_id, inherents)
+		.expect("Failed to create inherent extrinsics");
+
+	let block = create_block::(&client, transfer, inherents);
+
+	factory_state.set_block_no(factory_state.block_no() + RA::Number::one());
+
+	info!(
+		"Created block {} with hash {}. Transferring {} from {} to {}.",
+		factory_state.block_no(),
+		prior_block_hash,
+		amount,
+		from.0,
+		to
+	);
+
+	Some(block)
+}